ext-all-debug.js 2.8 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981
  1. /*
  2. Ext JS 4.1 - JavaScript Library
  3. Copyright (c) 2006-2012, Sencha Inc.
  4. All rights reserved.
  5. licensing@sencha.com
  6. http://www.sencha.com/license
  7. Commercial License
  8. ------------------------------------------------------------------------------------------
  9. This version of Ext JS is licensed commercially.
  10. This is the appropriate option if you are creating proprietary applications and you are
  11. not prepared to distribute and share the source code of your application under the
  12. GPL v3 license. Please visit http://www.sencha.com/license for more details.
  13. Open Source Licensing
  14. ------------------------------------------------------------------------------------------
  15. Open Source Licensing is available for an alternate download of Ext JS.
  16. For more details, please visit: http://www.sencha.com/license.
  17. --
  18. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT OF THIRD-PARTY INTELLECTUAL PROPERTY RIGHTS.
  19. */
  20. //@tag foundation,core
  21. var Ext = Ext || {};
  22. Ext._startTime = new Date().getTime();
  23. (function() {
  24. var global = this,
  25. objectPrototype = Object.prototype,
  26. toString = objectPrototype.toString,
  27. enumerables = true,
  28. enumerablesTest = { toString: 1 },
  29. emptyFn = function () {},
  30. callOverrideParent = function () {
  31. var method = callOverrideParent.caller.caller;
  32. return method.$owner.prototype[method.$name].apply(this, arguments);
  33. },
  34. i;
  35. Ext.global = global;
  36. for (i in enumerablesTest) {
  37. enumerables = null;
  38. }
  39. if (enumerables) {
  40. enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',
  41. 'toLocaleString', 'toString', 'constructor'];
  42. }
  43. Ext.enumerables = enumerables;
  44. Ext.apply = function(object, config, defaults) {
  45. if (defaults) {
  46. Ext.apply(object, defaults);
  47. }
  48. if (object && config && typeof config === 'object') {
  49. var i, j, k;
  50. for (i in config) {
  51. object[i] = config[i];
  52. }
  53. if (enumerables) {
  54. for (j = enumerables.length; j--;) {
  55. k = enumerables[j];
  56. if (config.hasOwnProperty(k)) {
  57. object[k] = config[k];
  58. }
  59. }
  60. }
  61. }
  62. return object;
  63. };
  64. Ext.buildSettings = Ext.apply({
  65. baseCSSPrefix: 'x-',
  66. scopeResetCSS: false
  67. }, Ext.buildSettings || {});
  68. Ext.apply(Ext, {
  69. name: Ext.sandboxName || 'Ext',
  70. emptyFn: emptyFn,
  71. emptyString: new String(),
  72. baseCSSPrefix: Ext.buildSettings.baseCSSPrefix,
  73. applyIf: function(object, config) {
  74. var property;
  75. if (object) {
  76. for (property in config) {
  77. if (object[property] === undefined) {
  78. object[property] = config[property];
  79. }
  80. }
  81. }
  82. return object;
  83. },
  84. iterate: function(object, fn, scope) {
  85. if (Ext.isEmpty(object)) {
  86. return;
  87. }
  88. if (scope === undefined) {
  89. scope = object;
  90. }
  91. if (Ext.isIterable(object)) {
  92. Ext.Array.each.call(Ext.Array, object, fn, scope);
  93. }
  94. else {
  95. Ext.Object.each.call(Ext.Object, object, fn, scope);
  96. }
  97. }
  98. });
  99. Ext.apply(Ext, {
  100. extend: (function() {
  101. var objectConstructor = objectPrototype.constructor,
  102. inlineOverrides = function(o) {
  103. for (var m in o) {
  104. if (!o.hasOwnProperty(m)) {
  105. continue;
  106. }
  107. this[m] = o[m];
  108. }
  109. };
  110. return function(subclass, superclass, overrides) {
  111. if (Ext.isObject(superclass)) {
  112. overrides = superclass;
  113. superclass = subclass;
  114. subclass = overrides.constructor !== objectConstructor ? overrides.constructor : function() {
  115. superclass.apply(this, arguments);
  116. };
  117. }
  118. var F = function() {},
  119. subclassProto, superclassProto = superclass.prototype;
  120. F.prototype = superclassProto;
  121. subclassProto = subclass.prototype = new F();
  122. subclassProto.constructor = subclass;
  123. subclass.superclass = superclassProto;
  124. if (superclassProto.constructor === objectConstructor) {
  125. superclassProto.constructor = superclass;
  126. }
  127. subclass.override = function(overrides) {
  128. Ext.override(subclass, overrides);
  129. };
  130. subclassProto.override = inlineOverrides;
  131. subclassProto.proto = subclassProto;
  132. subclass.override(overrides);
  133. subclass.extend = function(o) {
  134. return Ext.extend(subclass, o);
  135. };
  136. return subclass;
  137. };
  138. }()),
  139. override: function (target, overrides) {
  140. if (target.$isClass) {
  141. target.override(overrides);
  142. } else if (typeof target == 'function') {
  143. Ext.apply(target.prototype, overrides);
  144. } else {
  145. var owner = target.self,
  146. name, value;
  147. if (owner && owner.$isClass) {
  148. for (name in overrides) {
  149. if (overrides.hasOwnProperty(name)) {
  150. value = overrides[name];
  151. if (typeof value == 'function') {
  152. value.$name = name;
  153. value.$owner = owner;
  154. value.$previous = target.hasOwnProperty(name)
  155. ? target[name]
  156. : callOverrideParent;
  157. }
  158. target[name] = value;
  159. }
  160. }
  161. } else {
  162. Ext.apply(target, overrides);
  163. }
  164. }
  165. return target;
  166. }
  167. });
  168. Ext.apply(Ext, {
  169. valueFrom: function(value, defaultValue, allowBlank){
  170. return Ext.isEmpty(value, allowBlank) ? defaultValue : value;
  171. },
  172. typeOf: function(value) {
  173. var type,
  174. typeToString;
  175. if (value === null) {
  176. return 'null';
  177. }
  178. type = typeof value;
  179. if (type === 'undefined' || type === 'string' || type === 'number' || type === 'boolean') {
  180. return type;
  181. }
  182. typeToString = toString.call(value);
  183. switch(typeToString) {
  184. case '[object Array]':
  185. return 'array';
  186. case '[object Date]':
  187. return 'date';
  188. case '[object Boolean]':
  189. return 'boolean';
  190. case '[object Number]':
  191. return 'number';
  192. case '[object RegExp]':
  193. return 'regexp';
  194. }
  195. if (type === 'function') {
  196. return 'function';
  197. }
  198. if (type === 'object') {
  199. if (value.nodeType !== undefined) {
  200. if (value.nodeType === 3) {
  201. return (/\S/).test(value.nodeValue) ? 'textnode' : 'whitespace';
  202. }
  203. else {
  204. return 'element';
  205. }
  206. }
  207. return 'object';
  208. }
  209. },
  210. isEmpty: function(value, allowEmptyString) {
  211. return (value === null) || (value === undefined) || (!allowEmptyString ? value === '' : false) || (Ext.isArray(value) && value.length === 0);
  212. },
  213. isArray: ('isArray' in Array) ? Array.isArray : function(value) {
  214. return toString.call(value) === '[object Array]';
  215. },
  216. isDate: function(value) {
  217. return toString.call(value) === '[object Date]';
  218. },
  219. isObject: (toString.call(null) === '[object Object]') ?
  220. function(value) {
  221. return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined;
  222. } :
  223. function(value) {
  224. return toString.call(value) === '[object Object]';
  225. },
  226. isSimpleObject: function(value) {
  227. return value instanceof Object && value.constructor === Object;
  228. },
  229. isPrimitive: function(value) {
  230. var type = typeof value;
  231. return type === 'string' || type === 'number' || type === 'boolean';
  232. },
  233. isFunction:
  234. (typeof document !== 'undefined' && typeof document.getElementsByTagName('body') === 'function') ? function(value) {
  235. return toString.call(value) === '[object Function]';
  236. } : function(value) {
  237. return typeof value === 'function';
  238. },
  239. isNumber: function(value) {
  240. return typeof value === 'number' && isFinite(value);
  241. },
  242. isNumeric: function(value) {
  243. return !isNaN(parseFloat(value)) && isFinite(value);
  244. },
  245. isString: function(value) {
  246. return typeof value === 'string';
  247. },
  248. isBoolean: function(value) {
  249. return typeof value === 'boolean';
  250. },
  251. isElement: function(value) {
  252. return value ? value.nodeType === 1 : false;
  253. },
  254. isTextNode: function(value) {
  255. return value ? value.nodeName === "#text" : false;
  256. },
  257. isDefined: function(value) {
  258. return typeof value !== 'undefined';
  259. },
  260. isIterable: function(value) {
  261. var type = typeof value,
  262. checkLength = false;
  263. if (value && type != 'string') {
  264. if (type == 'function') {
  265. if (Ext.isSafari) {
  266. checkLength = value instanceof NodeList || value instanceof HTMLCollection;
  267. }
  268. } else {
  269. checkLength = true;
  270. }
  271. }
  272. return checkLength ? value.length !== undefined : false;
  273. }
  274. });
  275. Ext.apply(Ext, {
  276. clone: function(item) {
  277. var type,
  278. i,
  279. j,
  280. k,
  281. clone,
  282. key;
  283. if (item === null || item === undefined) {
  284. return item;
  285. }
  286. if (item.nodeType && item.cloneNode) {
  287. return item.cloneNode(true);
  288. }
  289. type = toString.call(item);
  290. if (type === '[object Date]') {
  291. return new Date(item.getTime());
  292. }
  293. if (type === '[object Array]') {
  294. i = item.length;
  295. clone = [];
  296. while (i--) {
  297. clone[i] = Ext.clone(item[i]);
  298. }
  299. }
  300. else if (type === '[object Object]' && item.constructor === Object) {
  301. clone = {};
  302. for (key in item) {
  303. clone[key] = Ext.clone(item[key]);
  304. }
  305. if (enumerables) {
  306. for (j = enumerables.length; j--;) {
  307. k = enumerables[j];
  308. clone[k] = item[k];
  309. }
  310. }
  311. }
  312. return clone || item;
  313. },
  314. getUniqueGlobalNamespace: function() {
  315. var uniqueGlobalNamespace = this.uniqueGlobalNamespace,
  316. i;
  317. if (uniqueGlobalNamespace === undefined) {
  318. i = 0;
  319. do {
  320. uniqueGlobalNamespace = 'ExtBox' + (++i);
  321. } while (Ext.global[uniqueGlobalNamespace] !== undefined);
  322. Ext.global[uniqueGlobalNamespace] = Ext;
  323. this.uniqueGlobalNamespace = uniqueGlobalNamespace;
  324. }
  325. return uniqueGlobalNamespace;
  326. },
  327. functionFactoryCache: {},
  328. cacheableFunctionFactory: function() {
  329. var me = this,
  330. args = Array.prototype.slice.call(arguments),
  331. cache = me.functionFactoryCache,
  332. idx, fn, ln;
  333. if (Ext.isSandboxed) {
  334. ln = args.length;
  335. if (ln > 0) {
  336. ln--;
  337. args[ln] = 'var Ext=window.' + Ext.name + ';' + args[ln];
  338. }
  339. }
  340. idx = args.join('');
  341. fn = cache[idx];
  342. if (!fn) {
  343. fn = Function.prototype.constructor.apply(Function.prototype, args);
  344. cache[idx] = fn;
  345. }
  346. return fn;
  347. },
  348. functionFactory: function() {
  349. var me = this,
  350. args = Array.prototype.slice.call(arguments),
  351. ln;
  352. if (Ext.isSandboxed) {
  353. ln = args.length;
  354. if (ln > 0) {
  355. ln--;
  356. args[ln] = 'var Ext=window.' + Ext.name + ';' + args[ln];
  357. }
  358. }
  359. return Function.prototype.constructor.apply(Function.prototype, args);
  360. },
  361. Logger: {
  362. verbose: emptyFn,
  363. log: emptyFn,
  364. info: emptyFn,
  365. warn: emptyFn,
  366. error: function(message) {
  367. throw new Error(message);
  368. },
  369. deprecate: emptyFn
  370. }
  371. });
  372. Ext.type = Ext.typeOf;
  373. }());
  374. Ext.globalEval = Ext.global.execScript
  375. ? function(code) {
  376. execScript(code);
  377. }
  378. : function($$code) {
  379. (function(){
  380. eval($$code);
  381. }());
  382. };
  383. //@tag foundation,core
  384. //@require ../Ext.js
  385. (function() {
  386. var version = '4.1.1.1', Version;
  387. Ext.Version = Version = Ext.extend(Object, {
  388. constructor: function(version) {
  389. var parts, releaseStartIndex;
  390. if (version instanceof Version) {
  391. return version;
  392. }
  393. this.version = this.shortVersion = String(version).toLowerCase().replace(/_/g, '.').replace(/[\-+]/g, '');
  394. releaseStartIndex = this.version.search(/([^\d\.])/);
  395. if (releaseStartIndex !== -1) {
  396. this.release = this.version.substr(releaseStartIndex, version.length);
  397. this.shortVersion = this.version.substr(0, releaseStartIndex);
  398. }
  399. this.shortVersion = this.shortVersion.replace(/[^\d]/g, '');
  400. parts = this.version.split('.');
  401. this.major = parseInt(parts.shift() || 0, 10);
  402. this.minor = parseInt(parts.shift() || 0, 10);
  403. this.patch = parseInt(parts.shift() || 0, 10);
  404. this.build = parseInt(parts.shift() || 0, 10);
  405. return this;
  406. },
  407. toString: function() {
  408. return this.version;
  409. },
  410. valueOf: function() {
  411. return this.version;
  412. },
  413. getMajor: function() {
  414. return this.major || 0;
  415. },
  416. getMinor: function() {
  417. return this.minor || 0;
  418. },
  419. getPatch: function() {
  420. return this.patch || 0;
  421. },
  422. getBuild: function() {
  423. return this.build || 0;
  424. },
  425. getRelease: function() {
  426. return this.release || '';
  427. },
  428. isGreaterThan: function(target) {
  429. return Version.compare(this.version, target) === 1;
  430. },
  431. isGreaterThanOrEqual: function(target) {
  432. return Version.compare(this.version, target) >= 0;
  433. },
  434. isLessThan: function(target) {
  435. return Version.compare(this.version, target) === -1;
  436. },
  437. isLessThanOrEqual: function(target) {
  438. return Version.compare(this.version, target) <= 0;
  439. },
  440. equals: function(target) {
  441. return Version.compare(this.version, target) === 0;
  442. },
  443. match: function(target) {
  444. target = String(target);
  445. return this.version.substr(0, target.length) === target;
  446. },
  447. toArray: function() {
  448. return [this.getMajor(), this.getMinor(), this.getPatch(), this.getBuild(), this.getRelease()];
  449. },
  450. getShortVersion: function() {
  451. return this.shortVersion;
  452. },
  453. gt: function() {
  454. return this.isGreaterThan.apply(this, arguments);
  455. },
  456. lt: function() {
  457. return this.isLessThan.apply(this, arguments);
  458. },
  459. gtEq: function() {
  460. return this.isGreaterThanOrEqual.apply(this, arguments);
  461. },
  462. ltEq: function() {
  463. return this.isLessThanOrEqual.apply(this, arguments);
  464. }
  465. });
  466. Ext.apply(Version, {
  467. releaseValueMap: {
  468. 'dev': -6,
  469. 'alpha': -5,
  470. 'a': -5,
  471. 'beta': -4,
  472. 'b': -4,
  473. 'rc': -3,
  474. '#': -2,
  475. 'p': -1,
  476. 'pl': -1
  477. },
  478. getComponentValue: function(value) {
  479. return !value ? 0 : (isNaN(value) ? this.releaseValueMap[value] || value : parseInt(value, 10));
  480. },
  481. compare: function(current, target) {
  482. var currentValue, targetValue, i;
  483. current = new Version(current).toArray();
  484. target = new Version(target).toArray();
  485. for (i = 0; i < Math.max(current.length, target.length); i++) {
  486. currentValue = this.getComponentValue(current[i]);
  487. targetValue = this.getComponentValue(target[i]);
  488. if (currentValue < targetValue) {
  489. return -1;
  490. } else if (currentValue > targetValue) {
  491. return 1;
  492. }
  493. }
  494. return 0;
  495. }
  496. });
  497. Ext.apply(Ext, {
  498. versions: {},
  499. lastRegisteredVersion: null,
  500. setVersion: function(packageName, version) {
  501. Ext.versions[packageName] = new Version(version);
  502. Ext.lastRegisteredVersion = Ext.versions[packageName];
  503. return this;
  504. },
  505. getVersion: function(packageName) {
  506. if (packageName === undefined) {
  507. return Ext.lastRegisteredVersion;
  508. }
  509. return Ext.versions[packageName];
  510. },
  511. deprecate: function(packageName, since, closure, scope) {
  512. if (Version.compare(Ext.getVersion(packageName), since) < 1) {
  513. closure.call(scope);
  514. }
  515. }
  516. });
  517. Ext.setVersion('core', version);
  518. }());
  519. //@tag foundation,core
  520. //@require ../version/Version.js
  521. Ext.String = (function() {
  522. var trimRegex = /^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,
  523. escapeRe = /('|\\)/g,
  524. formatRe = /\{(\d+)\}/g,
  525. escapeRegexRe = /([-.*+?\^${}()|\[\]\/\\])/g,
  526. basicTrimRe = /^\s+|\s+$/g,
  527. whitespaceRe = /\s+/,
  528. varReplace = /(^[^a-z]*|[^\w])/gi,
  529. charToEntity,
  530. entityToChar,
  531. charToEntityRegex,
  532. entityToCharRegex,
  533. htmlEncodeReplaceFn = function(match, capture) {
  534. return charToEntity[capture];
  535. },
  536. htmlDecodeReplaceFn = function(match, capture) {
  537. return (capture in entityToChar) ? entityToChar[capture] : String.fromCharCode(parseInt(capture.substr(2), 10));
  538. };
  539. return {
  540. createVarName: function(s) {
  541. return s.replace(varReplace, '');
  542. },
  543. htmlEncode: function(value) {
  544. return (!value) ? value : String(value).replace(charToEntityRegex, htmlEncodeReplaceFn);
  545. },
  546. htmlDecode: function(value) {
  547. return (!value) ? value : String(value).replace(entityToCharRegex, htmlDecodeReplaceFn);
  548. },
  549. addCharacterEntities: function(newEntities) {
  550. var charKeys = [],
  551. entityKeys = [],
  552. key, echar;
  553. for (key in newEntities) {
  554. echar = newEntities[key];
  555. entityToChar[key] = echar;
  556. charToEntity[echar] = key;
  557. charKeys.push(echar);
  558. entityKeys.push(key);
  559. }
  560. charToEntityRegex = new RegExp('(' + charKeys.join('|') + ')', 'g');
  561. entityToCharRegex = new RegExp('(' + entityKeys.join('|') + '|&#[0-9]{1,5};' + ')', 'g');
  562. },
  563. resetCharacterEntities: function() {
  564. charToEntity = {};
  565. entityToChar = {};
  566. this.addCharacterEntities({
  567. '&amp;' : '&',
  568. '&gt;' : '>',
  569. '&lt;' : '<',
  570. '&quot;' : '"',
  571. '&#39;' : "'"
  572. });
  573. },
  574. urlAppend : function(url, string) {
  575. if (!Ext.isEmpty(string)) {
  576. return url + (url.indexOf('?') === -1 ? '?' : '&') + string;
  577. }
  578. return url;
  579. },
  580. trim: function(string) {
  581. return string.replace(trimRegex, "");
  582. },
  583. capitalize: function(string) {
  584. return string.charAt(0).toUpperCase() + string.substr(1);
  585. },
  586. uncapitalize: function(string) {
  587. return string.charAt(0).toLowerCase() + string.substr(1);
  588. },
  589. ellipsis: function(value, len, word) {
  590. if (value && value.length > len) {
  591. if (word) {
  592. var vs = value.substr(0, len - 2),
  593. index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?'));
  594. if (index !== -1 && index >= (len - 15)) {
  595. return vs.substr(0, index) + "...";
  596. }
  597. }
  598. return value.substr(0, len - 3) + "...";
  599. }
  600. return value;
  601. },
  602. escapeRegex: function(string) {
  603. return string.replace(escapeRegexRe, "\\$1");
  604. },
  605. escape: function(string) {
  606. return string.replace(escapeRe, "\\$1");
  607. },
  608. toggle: function(string, value, other) {
  609. return string === value ? other : value;
  610. },
  611. leftPad: function(string, size, character) {
  612. var result = String(string);
  613. character = character || " ";
  614. while (result.length < size) {
  615. result = character + result;
  616. }
  617. return result;
  618. },
  619. format: function(format) {
  620. var args = Ext.Array.toArray(arguments, 1);
  621. return format.replace(formatRe, function(m, i) {
  622. return args[i];
  623. });
  624. },
  625. repeat: function(pattern, count, sep) {
  626. for (var buf = [], i = count; i--; ) {
  627. buf.push(pattern);
  628. }
  629. return buf.join(sep || '');
  630. },
  631. splitWords: function (words) {
  632. if (words && typeof words == 'string') {
  633. return words.replace(basicTrimRe, '').split(whitespaceRe);
  634. }
  635. return words || [];
  636. }
  637. };
  638. }());
  639. Ext.String.resetCharacterEntities();
  640. Ext.htmlEncode = Ext.String.htmlEncode;
  641. Ext.htmlDecode = Ext.String.htmlDecode;
  642. Ext.urlAppend = Ext.String.urlAppend;
  643. //@tag foundation,core
  644. //@require String.js
  645. //@define Ext.Number
  646. Ext.Number = new function() {
  647. var me = this,
  648. isToFixedBroken = (0.9).toFixed() !== '1',
  649. math = Math;
  650. Ext.apply(this, {
  651. constrain: function(number, min, max) {
  652. var x = parseFloat(number);
  653. return (x < min) ? min : ((x > max) ? max : x);
  654. },
  655. snap : function(value, increment, minValue, maxValue) {
  656. var m;
  657. if (value === undefined || value < minValue) {
  658. return minValue || 0;
  659. }
  660. if (increment) {
  661. m = value % increment;
  662. if (m !== 0) {
  663. value -= m;
  664. if (m * 2 >= increment) {
  665. value += increment;
  666. } else if (m * 2 < -increment) {
  667. value -= increment;
  668. }
  669. }
  670. }
  671. return me.constrain(value, minValue, maxValue);
  672. },
  673. snapInRange : function(value, increment, minValue, maxValue) {
  674. var tween;
  675. minValue = (minValue || 0);
  676. if (value === undefined || value < minValue) {
  677. return minValue;
  678. }
  679. if (increment && (tween = ((value - minValue) % increment))) {
  680. value -= tween;
  681. tween *= 2;
  682. if (tween >= increment) {
  683. value += increment;
  684. }
  685. }
  686. if (maxValue !== undefined) {
  687. if (value > (maxValue = me.snapInRange(maxValue, increment, minValue))) {
  688. value = maxValue;
  689. }
  690. }
  691. return value;
  692. },
  693. toFixed: isToFixedBroken ? function(value, precision) {
  694. precision = precision || 0;
  695. var pow = math.pow(10, precision);
  696. return (math.round(value * pow) / pow).toFixed(precision);
  697. } : function(value, precision) {
  698. return value.toFixed(precision);
  699. },
  700. from: function(value, defaultValue) {
  701. if (isFinite(value)) {
  702. value = parseFloat(value);
  703. }
  704. return !isNaN(value) ? value : defaultValue;
  705. },
  706. randomInt: function (from, to) {
  707. return math.floor(math.random() * (to - from + 1) + from);
  708. }
  709. });
  710. Ext.num = function() {
  711. return me.from.apply(this, arguments);
  712. };
  713. };
  714. //@tag foundation,core
  715. //@require Number.js
  716. (function() {
  717. var arrayPrototype = Array.prototype,
  718. slice = arrayPrototype.slice,
  719. supportsSplice = (function () {
  720. var array = [],
  721. lengthBefore,
  722. j = 20;
  723. if (!array.splice) {
  724. return false;
  725. }
  726. while (j--) {
  727. array.push("A");
  728. }
  729. array.splice(15, 0, "F", "F", "F", "F", "F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F");
  730. lengthBefore = array.length;
  731. array.splice(13, 0, "XXX");
  732. if (lengthBefore+1 != array.length) {
  733. return false;
  734. }
  735. return true;
  736. }()),
  737. supportsForEach = 'forEach' in arrayPrototype,
  738. supportsMap = 'map' in arrayPrototype,
  739. supportsIndexOf = 'indexOf' in arrayPrototype,
  740. supportsEvery = 'every' in arrayPrototype,
  741. supportsSome = 'some' in arrayPrototype,
  742. supportsFilter = 'filter' in arrayPrototype,
  743. supportsSort = (function() {
  744. var a = [1,2,3,4,5].sort(function(){ return 0; });
  745. return a[0] === 1 && a[1] === 2 && a[2] === 3 && a[3] === 4 && a[4] === 5;
  746. }()),
  747. supportsSliceOnNodeList = true,
  748. ExtArray,
  749. erase,
  750. replace,
  751. splice;
  752. try {
  753. if (typeof document !== 'undefined') {
  754. slice.call(document.getElementsByTagName('body'));
  755. }
  756. } catch (e) {
  757. supportsSliceOnNodeList = false;
  758. }
  759. function fixArrayIndex (array, index) {
  760. return (index < 0) ? Math.max(0, array.length + index)
  761. : Math.min(array.length, index);
  762. }
  763. function replaceSim (array, index, removeCount, insert) {
  764. var add = insert ? insert.length : 0,
  765. length = array.length,
  766. pos = fixArrayIndex(array, index),
  767. remove,
  768. tailOldPos,
  769. tailNewPos,
  770. tailCount,
  771. lengthAfterRemove,
  772. i;
  773. if (pos === length) {
  774. if (add) {
  775. array.push.apply(array, insert);
  776. }
  777. } else {
  778. remove = Math.min(removeCount, length - pos);
  779. tailOldPos = pos + remove;
  780. tailNewPos = tailOldPos + add - remove;
  781. tailCount = length - tailOldPos;
  782. lengthAfterRemove = length - remove;
  783. if (tailNewPos < tailOldPos) {
  784. for (i = 0; i < tailCount; ++i) {
  785. array[tailNewPos+i] = array[tailOldPos+i];
  786. }
  787. } else if (tailNewPos > tailOldPos) {
  788. for (i = tailCount; i--; ) {
  789. array[tailNewPos+i] = array[tailOldPos+i];
  790. }
  791. }
  792. if (add && pos === lengthAfterRemove) {
  793. array.length = lengthAfterRemove;
  794. array.push.apply(array, insert);
  795. } else {
  796. array.length = lengthAfterRemove + add;
  797. for (i = 0; i < add; ++i) {
  798. array[pos+i] = insert[i];
  799. }
  800. }
  801. }
  802. return array;
  803. }
  804. function replaceNative (array, index, removeCount, insert) {
  805. if (insert && insert.length) {
  806. if (index < array.length) {
  807. array.splice.apply(array, [index, removeCount].concat(insert));
  808. } else {
  809. array.push.apply(array, insert);
  810. }
  811. } else {
  812. array.splice(index, removeCount);
  813. }
  814. return array;
  815. }
  816. function eraseSim (array, index, removeCount) {
  817. return replaceSim(array, index, removeCount);
  818. }
  819. function eraseNative (array, index, removeCount) {
  820. array.splice(index, removeCount);
  821. return array;
  822. }
  823. function spliceSim (array, index, removeCount) {
  824. var pos = fixArrayIndex(array, index),
  825. removed = array.slice(index, fixArrayIndex(array, pos+removeCount));
  826. if (arguments.length < 4) {
  827. replaceSim(array, pos, removeCount);
  828. } else {
  829. replaceSim(array, pos, removeCount, slice.call(arguments, 3));
  830. }
  831. return removed;
  832. }
  833. function spliceNative (array) {
  834. return array.splice.apply(array, slice.call(arguments, 1));
  835. }
  836. erase = supportsSplice ? eraseNative : eraseSim;
  837. replace = supportsSplice ? replaceNative : replaceSim;
  838. splice = supportsSplice ? spliceNative : spliceSim;
  839. ExtArray = Ext.Array = {
  840. each: function(array, fn, scope, reverse) {
  841. array = ExtArray.from(array);
  842. var i,
  843. ln = array.length;
  844. if (reverse !== true) {
  845. for (i = 0; i < ln; i++) {
  846. if (fn.call(scope || array[i], array[i], i, array) === false) {
  847. return i;
  848. }
  849. }
  850. }
  851. else {
  852. for (i = ln - 1; i > -1; i--) {
  853. if (fn.call(scope || array[i], array[i], i, array) === false) {
  854. return i;
  855. }
  856. }
  857. }
  858. return true;
  859. },
  860. forEach: supportsForEach ? function(array, fn, scope) {
  861. return array.forEach(fn, scope);
  862. } : function(array, fn, scope) {
  863. var i = 0,
  864. ln = array.length;
  865. for (; i < ln; i++) {
  866. fn.call(scope, array[i], i, array);
  867. }
  868. },
  869. indexOf: supportsIndexOf ? function(array, item, from) {
  870. return array.indexOf(item, from);
  871. } : function(array, item, from) {
  872. var i, length = array.length;
  873. for (i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++) {
  874. if (array[i] === item) {
  875. return i;
  876. }
  877. }
  878. return -1;
  879. },
  880. contains: supportsIndexOf ? function(array, item) {
  881. return array.indexOf(item) !== -1;
  882. } : function(array, item) {
  883. var i, ln;
  884. for (i = 0, ln = array.length; i < ln; i++) {
  885. if (array[i] === item) {
  886. return true;
  887. }
  888. }
  889. return false;
  890. },
  891. toArray: function(iterable, start, end){
  892. if (!iterable || !iterable.length) {
  893. return [];
  894. }
  895. if (typeof iterable === 'string') {
  896. iterable = iterable.split('');
  897. }
  898. if (supportsSliceOnNodeList) {
  899. return slice.call(iterable, start || 0, end || iterable.length);
  900. }
  901. var array = [],
  902. i;
  903. start = start || 0;
  904. end = end ? ((end < 0) ? iterable.length + end : end) : iterable.length;
  905. for (i = start; i < end; i++) {
  906. array.push(iterable[i]);
  907. }
  908. return array;
  909. },
  910. pluck: function(array, propertyName) {
  911. var ret = [],
  912. i, ln, item;
  913. for (i = 0, ln = array.length; i < ln; i++) {
  914. item = array[i];
  915. ret.push(item[propertyName]);
  916. }
  917. return ret;
  918. },
  919. map: supportsMap ? function(array, fn, scope) {
  920. return array.map(fn, scope);
  921. } : function(array, fn, scope) {
  922. var results = [],
  923. i = 0,
  924. len = array.length;
  925. for (; i < len; i++) {
  926. results[i] = fn.call(scope, array[i], i, array);
  927. }
  928. return results;
  929. },
  930. every: supportsEvery ? function(array, fn, scope) {
  931. return array.every(fn, scope);
  932. } : function(array, fn, scope) {
  933. var i = 0,
  934. ln = array.length;
  935. for (; i < ln; ++i) {
  936. if (!fn.call(scope, array[i], i, array)) {
  937. return false;
  938. }
  939. }
  940. return true;
  941. },
  942. some: supportsSome ? function(array, fn, scope) {
  943. return array.some(fn, scope);
  944. } : function(array, fn, scope) {
  945. var i = 0,
  946. ln = array.length;
  947. for (; i < ln; ++i) {
  948. if (fn.call(scope, array[i], i, array)) {
  949. return true;
  950. }
  951. }
  952. return false;
  953. },
  954. clean: function(array) {
  955. var results = [],
  956. i = 0,
  957. ln = array.length,
  958. item;
  959. for (; i < ln; i++) {
  960. item = array[i];
  961. if (!Ext.isEmpty(item)) {
  962. results.push(item);
  963. }
  964. }
  965. return results;
  966. },
  967. unique: function(array) {
  968. var clone = [],
  969. i = 0,
  970. ln = array.length,
  971. item;
  972. for (; i < ln; i++) {
  973. item = array[i];
  974. if (ExtArray.indexOf(clone, item) === -1) {
  975. clone.push(item);
  976. }
  977. }
  978. return clone;
  979. },
  980. filter: supportsFilter ? function(array, fn, scope) {
  981. return array.filter(fn, scope);
  982. } : function(array, fn, scope) {
  983. var results = [],
  984. i = 0,
  985. ln = array.length;
  986. for (; i < ln; i++) {
  987. if (fn.call(scope, array[i], i, array)) {
  988. results.push(array[i]);
  989. }
  990. }
  991. return results;
  992. },
  993. from: function(value, newReference) {
  994. if (value === undefined || value === null) {
  995. return [];
  996. }
  997. if (Ext.isArray(value)) {
  998. return (newReference) ? slice.call(value) : value;
  999. }
  1000. var type = typeof value;
  1001. if (value && value.length !== undefined && type !== 'string' && (type !== 'function' || !value.apply)) {
  1002. return ExtArray.toArray(value);
  1003. }
  1004. return [value];
  1005. },
  1006. remove: function(array, item) {
  1007. var index = ExtArray.indexOf(array, item);
  1008. if (index !== -1) {
  1009. erase(array, index, 1);
  1010. }
  1011. return array;
  1012. },
  1013. include: function(array, item) {
  1014. if (!ExtArray.contains(array, item)) {
  1015. array.push(item);
  1016. }
  1017. },
  1018. clone: function(array) {
  1019. return slice.call(array);
  1020. },
  1021. merge: function() {
  1022. var args = slice.call(arguments),
  1023. array = [],
  1024. i, ln;
  1025. for (i = 0, ln = args.length; i < ln; i++) {
  1026. array = array.concat(args[i]);
  1027. }
  1028. return ExtArray.unique(array);
  1029. },
  1030. intersect: function() {
  1031. var intersection = [],
  1032. arrays = slice.call(arguments),
  1033. arraysLength,
  1034. array,
  1035. arrayLength,
  1036. minArray,
  1037. minArrayIndex,
  1038. minArrayCandidate,
  1039. minArrayLength,
  1040. element,
  1041. elementCandidate,
  1042. elementCount,
  1043. i, j, k;
  1044. if (!arrays.length) {
  1045. return intersection;
  1046. }
  1047. arraysLength = arrays.length;
  1048. for (i = minArrayIndex = 0; i < arraysLength; i++) {
  1049. minArrayCandidate = arrays[i];
  1050. if (!minArray || minArrayCandidate.length < minArray.length) {
  1051. minArray = minArrayCandidate;
  1052. minArrayIndex = i;
  1053. }
  1054. }
  1055. minArray = ExtArray.unique(minArray);
  1056. erase(arrays, minArrayIndex, 1);
  1057. minArrayLength = minArray.length;
  1058. arraysLength = arrays.length;
  1059. for (i = 0; i < minArrayLength; i++) {
  1060. element = minArray[i];
  1061. elementCount = 0;
  1062. for (j = 0; j < arraysLength; j++) {
  1063. array = arrays[j];
  1064. arrayLength = array.length;
  1065. for (k = 0; k < arrayLength; k++) {
  1066. elementCandidate = array[k];
  1067. if (element === elementCandidate) {
  1068. elementCount++;
  1069. break;
  1070. }
  1071. }
  1072. }
  1073. if (elementCount === arraysLength) {
  1074. intersection.push(element);
  1075. }
  1076. }
  1077. return intersection;
  1078. },
  1079. difference: function(arrayA, arrayB) {
  1080. var clone = slice.call(arrayA),
  1081. ln = clone.length,
  1082. i, j, lnB;
  1083. for (i = 0,lnB = arrayB.length; i < lnB; i++) {
  1084. for (j = 0; j < ln; j++) {
  1085. if (clone[j] === arrayB[i]) {
  1086. erase(clone, j, 1);
  1087. j--;
  1088. ln--;
  1089. }
  1090. }
  1091. }
  1092. return clone;
  1093. },
  1094. slice: ([1,2].slice(1, undefined).length ?
  1095. function (array, begin, end) {
  1096. return slice.call(array, begin, end);
  1097. } :
  1098. function (array, begin, end) {
  1099. if (typeof begin === 'undefined') {
  1100. return slice.call(array);
  1101. }
  1102. if (typeof end === 'undefined') {
  1103. return slice.call(array, begin);
  1104. }
  1105. return slice.call(array, begin, end);
  1106. }
  1107. ),
  1108. sort: supportsSort ? function(array, sortFn) {
  1109. if (sortFn) {
  1110. return array.sort(sortFn);
  1111. } else {
  1112. return array.sort();
  1113. }
  1114. } : function(array, sortFn) {
  1115. var length = array.length,
  1116. i = 0,
  1117. comparison,
  1118. j, min, tmp;
  1119. for (; i < length; i++) {
  1120. min = i;
  1121. for (j = i + 1; j < length; j++) {
  1122. if (sortFn) {
  1123. comparison = sortFn(array[j], array[min]);
  1124. if (comparison < 0) {
  1125. min = j;
  1126. }
  1127. } else if (array[j] < array[min]) {
  1128. min = j;
  1129. }
  1130. }
  1131. if (min !== i) {
  1132. tmp = array[i];
  1133. array[i] = array[min];
  1134. array[min] = tmp;
  1135. }
  1136. }
  1137. return array;
  1138. },
  1139. flatten: function(array) {
  1140. var worker = [];
  1141. function rFlatten(a) {
  1142. var i, ln, v;
  1143. for (i = 0, ln = a.length; i < ln; i++) {
  1144. v = a[i];
  1145. if (Ext.isArray(v)) {
  1146. rFlatten(v);
  1147. } else {
  1148. worker.push(v);
  1149. }
  1150. }
  1151. return worker;
  1152. }
  1153. return rFlatten(array);
  1154. },
  1155. min: function(array, comparisonFn) {
  1156. var min = array[0],
  1157. i, ln, item;
  1158. for (i = 0, ln = array.length; i < ln; i++) {
  1159. item = array[i];
  1160. if (comparisonFn) {
  1161. if (comparisonFn(min, item) === 1) {
  1162. min = item;
  1163. }
  1164. }
  1165. else {
  1166. if (item < min) {
  1167. min = item;
  1168. }
  1169. }
  1170. }
  1171. return min;
  1172. },
  1173. max: function(array, comparisonFn) {
  1174. var max = array[0],
  1175. i, ln, item;
  1176. for (i = 0, ln = array.length; i < ln; i++) {
  1177. item = array[i];
  1178. if (comparisonFn) {
  1179. if (comparisonFn(max, item) === -1) {
  1180. max = item;
  1181. }
  1182. }
  1183. else {
  1184. if (item > max) {
  1185. max = item;
  1186. }
  1187. }
  1188. }
  1189. return max;
  1190. },
  1191. mean: function(array) {
  1192. return array.length > 0 ? ExtArray.sum(array) / array.length : undefined;
  1193. },
  1194. sum: function(array) {
  1195. var sum = 0,
  1196. i, ln, item;
  1197. for (i = 0,ln = array.length; i < ln; i++) {
  1198. item = array[i];
  1199. sum += item;
  1200. }
  1201. return sum;
  1202. },
  1203. toMap: function(array, getKey, scope) {
  1204. var map = {},
  1205. i = array.length;
  1206. if (!getKey) {
  1207. while (i--) {
  1208. map[array[i]] = i+1;
  1209. }
  1210. } else if (typeof getKey == 'string') {
  1211. while (i--) {
  1212. map[array[i][getKey]] = i+1;
  1213. }
  1214. } else {
  1215. while (i--) {
  1216. map[getKey.call(scope, array[i])] = i+1;
  1217. }
  1218. }
  1219. return map;
  1220. },
  1221. erase: erase,
  1222. insert: function (array, index, items) {
  1223. return replace(array, index, 0, items);
  1224. },
  1225. replace: replace,
  1226. splice: splice,
  1227. push: function(array) {
  1228. var len = arguments.length,
  1229. i = 1,
  1230. newItem;
  1231. if (array === undefined) {
  1232. array = [];
  1233. } else if (!Ext.isArray(array)) {
  1234. array = [array];
  1235. }
  1236. for (; i < len; i++) {
  1237. newItem = arguments[i];
  1238. Array.prototype.push[Ext.isArray(newItem) ? 'apply' : 'call'](array, newItem);
  1239. }
  1240. return array;
  1241. }
  1242. };
  1243. Ext.each = ExtArray.each;
  1244. ExtArray.union = ExtArray.merge;
  1245. Ext.min = ExtArray.min;
  1246. Ext.max = ExtArray.max;
  1247. Ext.sum = ExtArray.sum;
  1248. Ext.mean = ExtArray.mean;
  1249. Ext.flatten = ExtArray.flatten;
  1250. Ext.clean = ExtArray.clean;
  1251. Ext.unique = ExtArray.unique;
  1252. Ext.pluck = ExtArray.pluck;
  1253. Ext.toArray = function() {
  1254. return ExtArray.toArray.apply(ExtArray, arguments);
  1255. };
  1256. }());
  1257. //@tag foundation,core
  1258. //@require Array.js
  1259. Ext.Function = {
  1260. flexSetter: function(fn) {
  1261. return function(a, b) {
  1262. var k, i;
  1263. if (a === null) {
  1264. return this;
  1265. }
  1266. if (typeof a !== 'string') {
  1267. for (k in a) {
  1268. if (a.hasOwnProperty(k)) {
  1269. fn.call(this, k, a[k]);
  1270. }
  1271. }
  1272. if (Ext.enumerables) {
  1273. for (i = Ext.enumerables.length; i--;) {
  1274. k = Ext.enumerables[i];
  1275. if (a.hasOwnProperty(k)) {
  1276. fn.call(this, k, a[k]);
  1277. }
  1278. }
  1279. }
  1280. } else {
  1281. fn.call(this, a, b);
  1282. }
  1283. return this;
  1284. };
  1285. },
  1286. bind: function(fn, scope, args, appendArgs) {
  1287. if (arguments.length === 2) {
  1288. return function() {
  1289. return fn.apply(scope, arguments);
  1290. };
  1291. }
  1292. var method = fn,
  1293. slice = Array.prototype.slice;
  1294. return function() {
  1295. var callArgs = args || arguments;
  1296. if (appendArgs === true) {
  1297. callArgs = slice.call(arguments, 0);
  1298. callArgs = callArgs.concat(args);
  1299. }
  1300. else if (typeof appendArgs == 'number') {
  1301. callArgs = slice.call(arguments, 0);
  1302. Ext.Array.insert(callArgs, appendArgs, args);
  1303. }
  1304. return method.apply(scope || Ext.global, callArgs);
  1305. };
  1306. },
  1307. pass: function(fn, args, scope) {
  1308. if (!Ext.isArray(args)) {
  1309. if (Ext.isIterable(args)) {
  1310. args = Ext.Array.clone(args);
  1311. } else {
  1312. args = args !== undefined ? [args] : [];
  1313. }
  1314. }
  1315. return function() {
  1316. var fnArgs = [].concat(args);
  1317. fnArgs.push.apply(fnArgs, arguments);
  1318. return fn.apply(scope || this, fnArgs);
  1319. };
  1320. },
  1321. alias: function(object, methodName) {
  1322. return function() {
  1323. return object[methodName].apply(object, arguments);
  1324. };
  1325. },
  1326. clone: function(method) {
  1327. return function() {
  1328. return method.apply(this, arguments);
  1329. };
  1330. },
  1331. createInterceptor: function(origFn, newFn, scope, returnValue) {
  1332. var method = origFn;
  1333. if (!Ext.isFunction(newFn)) {
  1334. return origFn;
  1335. }
  1336. else {
  1337. return function() {
  1338. var me = this,
  1339. args = arguments;
  1340. newFn.target = me;
  1341. newFn.method = origFn;
  1342. return (newFn.apply(scope || me || Ext.global, args) !== false) ? origFn.apply(me || Ext.global, args) : returnValue || null;
  1343. };
  1344. }
  1345. },
  1346. createDelayed: function(fn, delay, scope, args, appendArgs) {
  1347. if (scope || args) {
  1348. fn = Ext.Function.bind(fn, scope, args, appendArgs);
  1349. }
  1350. return function() {
  1351. var me = this,
  1352. args = Array.prototype.slice.call(arguments);
  1353. setTimeout(function() {
  1354. fn.apply(me, args);
  1355. }, delay);
  1356. };
  1357. },
  1358. defer: function(fn, millis, scope, args, appendArgs) {
  1359. fn = Ext.Function.bind(fn, scope, args, appendArgs);
  1360. if (millis > 0) {
  1361. return setTimeout(Ext.supports.TimeoutActualLateness ? function () {
  1362. fn();
  1363. } : fn, millis);
  1364. }
  1365. fn();
  1366. return 0;
  1367. },
  1368. createSequence: function(originalFn, newFn, scope) {
  1369. if (!newFn) {
  1370. return originalFn;
  1371. }
  1372. else {
  1373. return function() {
  1374. var result = originalFn.apply(this, arguments);
  1375. newFn.apply(scope || this, arguments);
  1376. return result;
  1377. };
  1378. }
  1379. },
  1380. createBuffered: function(fn, buffer, scope, args) {
  1381. var timerId;
  1382. return function() {
  1383. var callArgs = args || Array.prototype.slice.call(arguments, 0),
  1384. me = scope || this;
  1385. if (timerId) {
  1386. clearTimeout(timerId);
  1387. }
  1388. timerId = setTimeout(function(){
  1389. fn.apply(me, callArgs);
  1390. }, buffer);
  1391. };
  1392. },
  1393. createThrottled: function(fn, interval, scope) {
  1394. var lastCallTime, elapsed, lastArgs, timer, execute = function() {
  1395. fn.apply(scope || this, lastArgs);
  1396. lastCallTime = new Date().getTime();
  1397. };
  1398. return function() {
  1399. elapsed = new Date().getTime() - lastCallTime;
  1400. lastArgs = arguments;
  1401. clearTimeout(timer);
  1402. if (!lastCallTime || (elapsed >= interval)) {
  1403. execute();
  1404. } else {
  1405. timer = setTimeout(execute, interval - elapsed);
  1406. }
  1407. };
  1408. },
  1409. interceptBefore: function(object, methodName, fn, scope) {
  1410. var method = object[methodName] || Ext.emptyFn;
  1411. return (object[methodName] = function() {
  1412. var ret = fn.apply(scope || this, arguments);
  1413. method.apply(this, arguments);
  1414. return ret;
  1415. });
  1416. },
  1417. interceptAfter: function(object, methodName, fn, scope) {
  1418. var method = object[methodName] || Ext.emptyFn;
  1419. return (object[methodName] = function() {
  1420. method.apply(this, arguments);
  1421. return fn.apply(scope || this, arguments);
  1422. });
  1423. }
  1424. };
  1425. Ext.defer = Ext.Function.alias(Ext.Function, 'defer');
  1426. Ext.pass = Ext.Function.alias(Ext.Function, 'pass');
  1427. Ext.bind = Ext.Function.alias(Ext.Function, 'bind');
  1428. //@tag foundation,core
  1429. //@require Function.js
  1430. (function() {
  1431. var TemplateClass = function(){},
  1432. ExtObject = Ext.Object = {
  1433. chain: function (object) {
  1434. TemplateClass.prototype = object;
  1435. var result = new TemplateClass();
  1436. TemplateClass.prototype = null;
  1437. return result;
  1438. },
  1439. toQueryObjects: function(name, value, recursive) {
  1440. var self = ExtObject.toQueryObjects,
  1441. objects = [],
  1442. i, ln;
  1443. if (Ext.isArray(value)) {
  1444. for (i = 0, ln = value.length; i < ln; i++) {
  1445. if (recursive) {
  1446. objects = objects.concat(self(name + '[' + i + ']', value[i], true));
  1447. }
  1448. else {
  1449. objects.push({
  1450. name: name,
  1451. value: value[i]
  1452. });
  1453. }
  1454. }
  1455. }
  1456. else if (Ext.isObject(value)) {
  1457. for (i in value) {
  1458. if (value.hasOwnProperty(i)) {
  1459. if (recursive) {
  1460. objects = objects.concat(self(name + '[' + i + ']', value[i], true));
  1461. }
  1462. else {
  1463. objects.push({
  1464. name: name,
  1465. value: value[i]
  1466. });
  1467. }
  1468. }
  1469. }
  1470. }
  1471. else {
  1472. objects.push({
  1473. name: name,
  1474. value: value
  1475. });
  1476. }
  1477. return objects;
  1478. },
  1479. toQueryString: function(object, recursive) {
  1480. var paramObjects = [],
  1481. params = [],
  1482. i, j, ln, paramObject, value;
  1483. for (i in object) {
  1484. if (object.hasOwnProperty(i)) {
  1485. paramObjects = paramObjects.concat(ExtObject.toQueryObjects(i, object[i], recursive));
  1486. }
  1487. }
  1488. for (j = 0, ln = paramObjects.length; j < ln; j++) {
  1489. paramObject = paramObjects[j];
  1490. value = paramObject.value;
  1491. if (Ext.isEmpty(value)) {
  1492. value = '';
  1493. }
  1494. else if (Ext.isDate(value)) {
  1495. value = Ext.Date.toString(value);
  1496. }
  1497. params.push(encodeURIComponent(paramObject.name) + '=' + encodeURIComponent(String(value)));
  1498. }
  1499. return params.join('&');
  1500. },
  1501. fromQueryString: function(queryString, recursive) {
  1502. var parts = queryString.replace(/^\?/, '').split('&'),
  1503. object = {},
  1504. temp, components, name, value, i, ln,
  1505. part, j, subLn, matchedKeys, matchedName,
  1506. keys, key, nextKey;
  1507. for (i = 0, ln = parts.length; i < ln; i++) {
  1508. part = parts[i];
  1509. if (part.length > 0) {
  1510. components = part.split('=');
  1511. name = decodeURIComponent(components[0]);
  1512. value = (components[1] !== undefined) ? decodeURIComponent(components[1]) : '';
  1513. if (!recursive) {
  1514. if (object.hasOwnProperty(name)) {
  1515. if (!Ext.isArray(object[name])) {
  1516. object[name] = [object[name]];
  1517. }
  1518. object[name].push(value);
  1519. }
  1520. else {
  1521. object[name] = value;
  1522. }
  1523. }
  1524. else {
  1525. matchedKeys = name.match(/(\[):?([^\]]*)\]/g);
  1526. matchedName = name.match(/^([^\[]+)/);
  1527. name = matchedName[0];
  1528. keys = [];
  1529. if (matchedKeys === null) {
  1530. object[name] = value;
  1531. continue;
  1532. }
  1533. for (j = 0, subLn = matchedKeys.length; j < subLn; j++) {
  1534. key = matchedKeys[j];
  1535. key = (key.length === 2) ? '' : key.substring(1, key.length - 1);
  1536. keys.push(key);
  1537. }
  1538. keys.unshift(name);
  1539. temp = object;
  1540. for (j = 0, subLn = keys.length; j < subLn; j++) {
  1541. key = keys[j];
  1542. if (j === subLn - 1) {
  1543. if (Ext.isArray(temp) && key === '') {
  1544. temp.push(value);
  1545. }
  1546. else {
  1547. temp[key] = value;
  1548. }
  1549. }
  1550. else {
  1551. if (temp[key] === undefined || typeof temp[key] === 'string') {
  1552. nextKey = keys[j+1];
  1553. temp[key] = (Ext.isNumeric(nextKey) || nextKey === '') ? [] : {};
  1554. }
  1555. temp = temp[key];
  1556. }
  1557. }
  1558. }
  1559. }
  1560. }
  1561. return object;
  1562. },
  1563. each: function(object, fn, scope) {
  1564. for (var property in object) {
  1565. if (object.hasOwnProperty(property)) {
  1566. if (fn.call(scope || object, property, object[property], object) === false) {
  1567. return;
  1568. }
  1569. }
  1570. }
  1571. },
  1572. merge: function(destination) {
  1573. var i = 1,
  1574. ln = arguments.length,
  1575. mergeFn = ExtObject.merge,
  1576. cloneFn = Ext.clone,
  1577. object, key, value, sourceKey;
  1578. for (; i < ln; i++) {
  1579. object = arguments[i];
  1580. for (key in object) {
  1581. value = object[key];
  1582. if (value && value.constructor === Object) {
  1583. sourceKey = destination[key];
  1584. if (sourceKey && sourceKey.constructor === Object) {
  1585. mergeFn(sourceKey, value);
  1586. }
  1587. else {
  1588. destination[key] = cloneFn(value);
  1589. }
  1590. }
  1591. else {
  1592. destination[key] = value;
  1593. }
  1594. }
  1595. }
  1596. return destination;
  1597. },
  1598. mergeIf: function(destination) {
  1599. var i = 1,
  1600. ln = arguments.length,
  1601. cloneFn = Ext.clone,
  1602. object, key, value;
  1603. for (; i < ln; i++) {
  1604. object = arguments[i];
  1605. for (key in object) {
  1606. if (!(key in destination)) {
  1607. value = object[key];
  1608. if (value && value.constructor === Object) {
  1609. destination[key] = cloneFn(value);
  1610. }
  1611. else {
  1612. destination[key] = value;
  1613. }
  1614. }
  1615. }
  1616. }
  1617. return destination;
  1618. },
  1619. getKey: function(object, value) {
  1620. for (var property in object) {
  1621. if (object.hasOwnProperty(property) && object[property] === value) {
  1622. return property;
  1623. }
  1624. }
  1625. return null;
  1626. },
  1627. getValues: function(object) {
  1628. var values = [],
  1629. property;
  1630. for (property in object) {
  1631. if (object.hasOwnProperty(property)) {
  1632. values.push(object[property]);
  1633. }
  1634. }
  1635. return values;
  1636. },
  1637. getKeys: (typeof Object.keys == 'function')
  1638. ? function(object){
  1639. if (!object) {
  1640. return [];
  1641. }
  1642. return Object.keys(object);
  1643. }
  1644. : function(object) {
  1645. var keys = [],
  1646. property;
  1647. for (property in object) {
  1648. if (object.hasOwnProperty(property)) {
  1649. keys.push(property);
  1650. }
  1651. }
  1652. return keys;
  1653. },
  1654. getSize: function(object) {
  1655. var size = 0,
  1656. property;
  1657. for (property in object) {
  1658. if (object.hasOwnProperty(property)) {
  1659. size++;
  1660. }
  1661. }
  1662. return size;
  1663. },
  1664. classify: function(object) {
  1665. var prototype = object,
  1666. objectProperties = [],
  1667. propertyClassesMap = {},
  1668. objectClass = function() {
  1669. var i = 0,
  1670. ln = objectProperties.length,
  1671. property;
  1672. for (; i < ln; i++) {
  1673. property = objectProperties[i];
  1674. this[property] = new propertyClassesMap[property]();
  1675. }
  1676. },
  1677. key, value;
  1678. for (key in object) {
  1679. if (object.hasOwnProperty(key)) {
  1680. value = object[key];
  1681. if (value && value.constructor === Object) {
  1682. objectProperties.push(key);
  1683. propertyClassesMap[key] = ExtObject.classify(value);
  1684. }
  1685. }
  1686. }
  1687. objectClass.prototype = prototype;
  1688. return objectClass;
  1689. }
  1690. };
  1691. Ext.merge = Ext.Object.merge;
  1692. Ext.mergeIf = Ext.Object.mergeIf;
  1693. Ext.urlEncode = function() {
  1694. var args = Ext.Array.from(arguments),
  1695. prefix = '';
  1696. if ((typeof args[1] === 'string')) {
  1697. prefix = args[1] + '&';
  1698. args[1] = false;
  1699. }
  1700. return prefix + ExtObject.toQueryString.apply(ExtObject, args);
  1701. };
  1702. Ext.urlDecode = function() {
  1703. return ExtObject.fromQueryString.apply(ExtObject, arguments);
  1704. };
  1705. }());
  1706. //@tag foundation,core
  1707. //@require Object.js
  1708. //@define Ext.Date
  1709. (function() {
  1710. function xf(format) {
  1711. var args = Array.prototype.slice.call(arguments, 1);
  1712. return format.replace(/\{(\d+)\}/g, function(m, i) {
  1713. return args[i];
  1714. });
  1715. }
  1716. Ext.Date = {
  1717. now: Date.now || function() {
  1718. return +new Date();
  1719. },
  1720. toString: function(date) {
  1721. var pad = Ext.String.leftPad;
  1722. return date.getFullYear() + "-"
  1723. + pad(date.getMonth() + 1, 2, '0') + "-"
  1724. + pad(date.getDate(), 2, '0') + "T"
  1725. + pad(date.getHours(), 2, '0') + ":"
  1726. + pad(date.getMinutes(), 2, '0') + ":"
  1727. + pad(date.getSeconds(), 2, '0');
  1728. },
  1729. getElapsed: function(dateA, dateB) {
  1730. return Math.abs(dateA - (dateB || new Date()));
  1731. },
  1732. useStrict: false,
  1733. formatCodeToRegex: function(character, currentGroup) {
  1734. var p = utilDate.parseCodes[character];
  1735. if (p) {
  1736. p = typeof p == 'function'? p() : p;
  1737. utilDate.parseCodes[character] = p;
  1738. }
  1739. return p ? Ext.applyIf({
  1740. c: p.c ? xf(p.c, currentGroup || "{0}") : p.c
  1741. }, p) : {
  1742. g: 0,
  1743. c: null,
  1744. s: Ext.String.escapeRegex(character)
  1745. };
  1746. },
  1747. parseFunctions: {
  1748. "MS": function(input, strict) {
  1749. var re = new RegExp('\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/'),
  1750. r = (input || '').match(re);
  1751. return r? new Date(((r[1] || '') + r[2]) * 1) : null;
  1752. }
  1753. },
  1754. parseRegexes: [],
  1755. formatFunctions: {
  1756. "MS": function() {
  1757. return '\\/Date(' + this.getTime() + ')\\/';
  1758. }
  1759. },
  1760. y2kYear : 50,
  1761. MILLI : "ms",
  1762. SECOND : "s",
  1763. MINUTE : "mi",
  1764. HOUR : "h",
  1765. DAY : "d",
  1766. MONTH : "mo",
  1767. YEAR : "y",
  1768. defaults: {},
  1769. dayNames : [
  1770. "Sunday",
  1771. "Monday",
  1772. "Tuesday",
  1773. "Wednesday",
  1774. "Thursday",
  1775. "Friday",
  1776. "Saturday"
  1777. ],
  1778. monthNames : [
  1779. "January",
  1780. "February",
  1781. "March",
  1782. "April",
  1783. "May",
  1784. "June",
  1785. "July",
  1786. "August",
  1787. "September",
  1788. "October",
  1789. "November",
  1790. "December"
  1791. ],
  1792. monthNumbers : {
  1793. January: 0,
  1794. Jan: 0,
  1795. February: 1,
  1796. Feb: 1,
  1797. March: 2,
  1798. Mar: 2,
  1799. April: 3,
  1800. Apr: 3,
  1801. May: 4,
  1802. June: 5,
  1803. Jun: 5,
  1804. July: 6,
  1805. Jul: 6,
  1806. August: 7,
  1807. Aug: 7,
  1808. September: 8,
  1809. Sep: 8,
  1810. October: 9,
  1811. Oct: 9,
  1812. November: 10,
  1813. Nov: 10,
  1814. December: 11,
  1815. Dec: 11
  1816. },
  1817. defaultFormat : "m/d/Y",
  1818. getShortMonthName : function(month) {
  1819. return Ext.Date.monthNames[month].substring(0, 3);
  1820. },
  1821. getShortDayName : function(day) {
  1822. return Ext.Date.dayNames[day].substring(0, 3);
  1823. },
  1824. getMonthNumber : function(name) {
  1825. return Ext.Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
  1826. },
  1827. formatContainsHourInfo : (function(){
  1828. var stripEscapeRe = /(\\.)/g,
  1829. hourInfoRe = /([gGhHisucUOPZ]|MS)/;
  1830. return function(format){
  1831. return hourInfoRe.test(format.replace(stripEscapeRe, ''));
  1832. };
  1833. }()),
  1834. formatContainsDateInfo : (function(){
  1835. var stripEscapeRe = /(\\.)/g,
  1836. dateInfoRe = /([djzmnYycU]|MS)/;
  1837. return function(format){
  1838. return dateInfoRe.test(format.replace(stripEscapeRe, ''));
  1839. };
  1840. }()),
  1841. unescapeFormat: (function() {
  1842. var slashRe = /\\/gi;
  1843. return function(format) {
  1844. return format.replace(slashRe, '');
  1845. }
  1846. }()),
  1847. formatCodes : {
  1848. d: "Ext.String.leftPad(this.getDate(), 2, '0')",
  1849. D: "Ext.Date.getShortDayName(this.getDay())",
  1850. j: "this.getDate()",
  1851. l: "Ext.Date.dayNames[this.getDay()]",
  1852. N: "(this.getDay() ? this.getDay() : 7)",
  1853. S: "Ext.Date.getSuffix(this)",
  1854. w: "this.getDay()",
  1855. z: "Ext.Date.getDayOfYear(this)",
  1856. W: "Ext.String.leftPad(Ext.Date.getWeekOfYear(this), 2, '0')",
  1857. F: "Ext.Date.monthNames[this.getMonth()]",
  1858. m: "Ext.String.leftPad(this.getMonth() + 1, 2, '0')",
  1859. M: "Ext.Date.getShortMonthName(this.getMonth())",
  1860. n: "(this.getMonth() + 1)",
  1861. t: "Ext.Date.getDaysInMonth(this)",
  1862. L: "(Ext.Date.isLeapYear(this) ? 1 : 0)",
  1863. o: "(this.getFullYear() + (Ext.Date.getWeekOfYear(this) == 1 && this.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",
  1864. Y: "Ext.String.leftPad(this.getFullYear(), 4, '0')",
  1865. y: "('' + this.getFullYear()).substring(2, 4)",
  1866. a: "(this.getHours() < 12 ? 'am' : 'pm')",
  1867. A: "(this.getHours() < 12 ? 'AM' : 'PM')",
  1868. g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)",
  1869. G: "this.getHours()",
  1870. h: "Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",
  1871. H: "Ext.String.leftPad(this.getHours(), 2, '0')",
  1872. i: "Ext.String.leftPad(this.getMinutes(), 2, '0')",
  1873. s: "Ext.String.leftPad(this.getSeconds(), 2, '0')",
  1874. u: "Ext.String.leftPad(this.getMilliseconds(), 3, '0')",
  1875. O: "Ext.Date.getGMTOffset(this)",
  1876. P: "Ext.Date.getGMTOffset(this, true)",
  1877. T: "Ext.Date.getTimezone(this)",
  1878. Z: "(this.getTimezoneOffset() * -60)",
  1879. c: function() {
  1880. var c, code, i, l, e;
  1881. for (c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) {
  1882. e = c.charAt(i);
  1883. code.push(e == "T" ? "'T'" : utilDate.getFormatCode(e));
  1884. }
  1885. return code.join(" + ");
  1886. },
  1887. U: "Math.round(this.getTime() / 1000)"
  1888. },
  1889. isValid : function(y, m, d, h, i, s, ms) {
  1890. h = h || 0;
  1891. i = i || 0;
  1892. s = s || 0;
  1893. ms = ms || 0;
  1894. var dt = utilDate.add(new Date(y < 100 ? 100 : y, m - 1, d, h, i, s, ms), utilDate.YEAR, y < 100 ? y - 100 : 0);
  1895. return y == dt.getFullYear() &&
  1896. m == dt.getMonth() + 1 &&
  1897. d == dt.getDate() &&
  1898. h == dt.getHours() &&
  1899. i == dt.getMinutes() &&
  1900. s == dt.getSeconds() &&
  1901. ms == dt.getMilliseconds();
  1902. },
  1903. parse : function(input, format, strict) {
  1904. var p = utilDate.parseFunctions;
  1905. if (p[format] == null) {
  1906. utilDate.createParser(format);
  1907. }
  1908. return p[format](input, Ext.isDefined(strict) ? strict : utilDate.useStrict);
  1909. },
  1910. parseDate: function(input, format, strict){
  1911. return utilDate.parse(input, format, strict);
  1912. },
  1913. getFormatCode : function(character) {
  1914. var f = utilDate.formatCodes[character];
  1915. if (f) {
  1916. f = typeof f == 'function'? f() : f;
  1917. utilDate.formatCodes[character] = f;
  1918. }
  1919. return f || ("'" + Ext.String.escape(character) + "'");
  1920. },
  1921. createFormat : function(format) {
  1922. var code = [],
  1923. special = false,
  1924. ch = '',
  1925. i;
  1926. for (i = 0; i < format.length; ++i) {
  1927. ch = format.charAt(i);
  1928. if (!special && ch == "\\") {
  1929. special = true;
  1930. } else if (special) {
  1931. special = false;
  1932. code.push("'" + Ext.String.escape(ch) + "'");
  1933. } else {
  1934. code.push(utilDate.getFormatCode(ch));
  1935. }
  1936. }
  1937. utilDate.formatFunctions[format] = Ext.functionFactory("return " + code.join('+'));
  1938. },
  1939. createParser : (function() {
  1940. var code = [
  1941. "var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,",
  1942. "def = Ext.Date.defaults,",
  1943. "results = String(input).match(Ext.Date.parseRegexes[{0}]);",
  1944. "if(results){",
  1945. "{1}",
  1946. "if(u != null){",
  1947. "v = new Date(u * 1000);",
  1948. "}else{",
  1949. "dt = Ext.Date.clearTime(new Date);",
  1950. "y = Ext.Number.from(y, Ext.Number.from(def.y, dt.getFullYear()));",
  1951. "m = Ext.Number.from(m, Ext.Number.from(def.m - 1, dt.getMonth()));",
  1952. "d = Ext.Number.from(d, Ext.Number.from(def.d, dt.getDate()));",
  1953. "h = Ext.Number.from(h, Ext.Number.from(def.h, dt.getHours()));",
  1954. "i = Ext.Number.from(i, Ext.Number.from(def.i, dt.getMinutes()));",
  1955. "s = Ext.Number.from(s, Ext.Number.from(def.s, dt.getSeconds()));",
  1956. "ms = Ext.Number.from(ms, Ext.Number.from(def.ms, dt.getMilliseconds()));",
  1957. "if(z >= 0 && y >= 0){",
  1958. "v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);",
  1959. "v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);",
  1960. "}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){",
  1961. "v = null;",
  1962. "}else{",
  1963. "v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);",
  1964. "}",
  1965. "}",
  1966. "}",
  1967. "if(v){",
  1968. "if(zz != null){",
  1969. "v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);",
  1970. "}else if(o){",
  1971. "v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));",
  1972. "}",
  1973. "}",
  1974. "return v;"
  1975. ].join('\n');
  1976. return function(format) {
  1977. var regexNum = utilDate.parseRegexes.length,
  1978. currentGroup = 1,
  1979. calc = [],
  1980. regex = [],
  1981. special = false,
  1982. ch = "",
  1983. i = 0,
  1984. len = format.length,
  1985. atEnd = [],
  1986. obj;
  1987. for (; i < len; ++i) {
  1988. ch = format.charAt(i);
  1989. if (!special && ch == "\\") {
  1990. special = true;
  1991. } else if (special) {
  1992. special = false;
  1993. regex.push(Ext.String.escape(ch));
  1994. } else {
  1995. obj = utilDate.formatCodeToRegex(ch, currentGroup);
  1996. currentGroup += obj.g;
  1997. regex.push(obj.s);
  1998. if (obj.g && obj.c) {
  1999. if (obj.calcAtEnd) {
  2000. atEnd.push(obj.c);
  2001. } else {
  2002. calc.push(obj.c);
  2003. }
  2004. }
  2005. }
  2006. }
  2007. calc = calc.concat(atEnd);
  2008. utilDate.parseRegexes[regexNum] = new RegExp("^" + regex.join('') + "$", 'i');
  2009. utilDate.parseFunctions[format] = Ext.functionFactory("input", "strict", xf(code, regexNum, calc.join('')));
  2010. };
  2011. }()),
  2012. parseCodes : {
  2013. d: {
  2014. g:1,
  2015. c:"d = parseInt(results[{0}], 10);\n",
  2016. s:"(3[0-1]|[1-2][0-9]|0[1-9])"
  2017. },
  2018. j: {
  2019. g:1,
  2020. c:"d = parseInt(results[{0}], 10);\n",
  2021. s:"(3[0-1]|[1-2][0-9]|[1-9])"
  2022. },
  2023. D: function() {
  2024. for (var a = [], i = 0; i < 7; a.push(utilDate.getShortDayName(i)), ++i);
  2025. return {
  2026. g:0,
  2027. c:null,
  2028. s:"(?:" + a.join("|") +")"
  2029. };
  2030. },
  2031. l: function() {
  2032. return {
  2033. g:0,
  2034. c:null,
  2035. s:"(?:" + utilDate.dayNames.join("|") + ")"
  2036. };
  2037. },
  2038. N: {
  2039. g:0,
  2040. c:null,
  2041. s:"[1-7]"
  2042. },
  2043. S: {
  2044. g:0,
  2045. c:null,
  2046. s:"(?:st|nd|rd|th)"
  2047. },
  2048. w: {
  2049. g:0,
  2050. c:null,
  2051. s:"[0-6]"
  2052. },
  2053. z: {
  2054. g:1,
  2055. c:"z = parseInt(results[{0}], 10);\n",
  2056. s:"(\\d{1,3})"
  2057. },
  2058. W: {
  2059. g:0,
  2060. c:null,
  2061. s:"(?:\\d{2})"
  2062. },
  2063. F: function() {
  2064. return {
  2065. g:1,
  2066. c:"m = parseInt(Ext.Date.getMonthNumber(results[{0}]), 10);\n",
  2067. s:"(" + utilDate.monthNames.join("|") + ")"
  2068. };
  2069. },
  2070. M: function() {
  2071. for (var a = [], i = 0; i < 12; a.push(utilDate.getShortMonthName(i)), ++i);
  2072. return Ext.applyIf({
  2073. s:"(" + a.join("|") + ")"
  2074. }, utilDate.formatCodeToRegex("F"));
  2075. },
  2076. m: {
  2077. g:1,
  2078. c:"m = parseInt(results[{0}], 10) - 1;\n",
  2079. s:"(1[0-2]|0[1-9])"
  2080. },
  2081. n: {
  2082. g:1,
  2083. c:"m = parseInt(results[{0}], 10) - 1;\n",
  2084. s:"(1[0-2]|[1-9])"
  2085. },
  2086. t: {
  2087. g:0,
  2088. c:null,
  2089. s:"(?:\\d{2})"
  2090. },
  2091. L: {
  2092. g:0,
  2093. c:null,
  2094. s:"(?:1|0)"
  2095. },
  2096. o: function() {
  2097. return utilDate.formatCodeToRegex("Y");
  2098. },
  2099. Y: {
  2100. g:1,
  2101. c:"y = parseInt(results[{0}], 10);\n",
  2102. s:"(\\d{4})"
  2103. },
  2104. y: {
  2105. g:1,
  2106. c:"var ty = parseInt(results[{0}], 10);\n"
  2107. + "y = ty > Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
  2108. s:"(\\d{1,2})"
  2109. },
  2110. a: {
  2111. g:1,
  2112. c:"if (/(am)/i.test(results[{0}])) {\n"
  2113. + "if (!h || h == 12) { h = 0; }\n"
  2114. + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
  2115. s:"(am|pm|AM|PM)",
  2116. calcAtEnd: true
  2117. },
  2118. A: {
  2119. g:1,
  2120. c:"if (/(am)/i.test(results[{0}])) {\n"
  2121. + "if (!h || h == 12) { h = 0; }\n"
  2122. + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
  2123. s:"(AM|PM|am|pm)",
  2124. calcAtEnd: true
  2125. },
  2126. g: {
  2127. g:1,
  2128. c:"h = parseInt(results[{0}], 10);\n",
  2129. s:"(1[0-2]|[0-9])"
  2130. },
  2131. G: {
  2132. g:1,
  2133. c:"h = parseInt(results[{0}], 10);\n",
  2134. s:"(2[0-3]|1[0-9]|[0-9])"
  2135. },
  2136. h: {
  2137. g:1,
  2138. c:"h = parseInt(results[{0}], 10);\n",
  2139. s:"(1[0-2]|0[1-9])"
  2140. },
  2141. H: {
  2142. g:1,
  2143. c:"h = parseInt(results[{0}], 10);\n",
  2144. s:"(2[0-3]|[0-1][0-9])"
  2145. },
  2146. i: {
  2147. g:1,
  2148. c:"i = parseInt(results[{0}], 10);\n",
  2149. s:"([0-5][0-9])"
  2150. },
  2151. s: {
  2152. g:1,
  2153. c:"s = parseInt(results[{0}], 10);\n",
  2154. s:"([0-5][0-9])"
  2155. },
  2156. u: {
  2157. g:1,
  2158. c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",
  2159. s:"(\\d+)"
  2160. },
  2161. O: {
  2162. g:1,
  2163. c:[
  2164. "o = results[{0}];",
  2165. "var sn = o.substring(0,1),",
  2166. "hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),",
  2167. "mn = o.substring(3,5) % 60;",
  2168. "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"
  2169. ].join("\n"),
  2170. s: "([+-]\\d{4})"
  2171. },
  2172. P: {
  2173. g:1,
  2174. c:[
  2175. "o = results[{0}];",
  2176. "var sn = o.substring(0,1),",
  2177. "hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),",
  2178. "mn = o.substring(4,6) % 60;",
  2179. "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"
  2180. ].join("\n"),
  2181. s: "([+-]\\d{2}:\\d{2})"
  2182. },
  2183. T: {
  2184. g:0,
  2185. c:null,
  2186. s:"[A-Z]{1,4}"
  2187. },
  2188. Z: {
  2189. g:1,
  2190. c:"zz = results[{0}] * 1;\n"
  2191. + "zz = (-43200 <= zz && zz <= 50400)? zz : null;\n",
  2192. s:"([+-]?\\d{1,5})"
  2193. },
  2194. c: function() {
  2195. var calc = [],
  2196. arr = [
  2197. utilDate.formatCodeToRegex("Y", 1),
  2198. utilDate.formatCodeToRegex("m", 2),
  2199. utilDate.formatCodeToRegex("d", 3),
  2200. utilDate.formatCodeToRegex("H", 4),
  2201. utilDate.formatCodeToRegex("i", 5),
  2202. utilDate.formatCodeToRegex("s", 6),
  2203. {c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},
  2204. {c:[
  2205. "if(results[8]) {",
  2206. "if(results[8] == 'Z'){",
  2207. "zz = 0;",
  2208. "}else if (results[8].indexOf(':') > -1){",
  2209. utilDate.formatCodeToRegex("P", 8).c,
  2210. "}else{",
  2211. utilDate.formatCodeToRegex("O", 8).c,
  2212. "}",
  2213. "}"
  2214. ].join('\n')}
  2215. ],
  2216. i,
  2217. l;
  2218. for (i = 0, l = arr.length; i < l; ++i) {
  2219. calc.push(arr[i].c);
  2220. }
  2221. return {
  2222. g:1,
  2223. c:calc.join(""),
  2224. s:[
  2225. arr[0].s,
  2226. "(?:", "-", arr[1].s,
  2227. "(?:", "-", arr[2].s,
  2228. "(?:",
  2229. "(?:T| )?",
  2230. arr[3].s, ":", arr[4].s,
  2231. "(?::", arr[5].s, ")?",
  2232. "(?:(?:\\.|,)(\\d+))?",
  2233. "(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?",
  2234. ")?",
  2235. ")?",
  2236. ")?"
  2237. ].join("")
  2238. };
  2239. },
  2240. U: {
  2241. g:1,
  2242. c:"u = parseInt(results[{0}], 10);\n",
  2243. s:"(-?\\d+)"
  2244. }
  2245. },
  2246. dateFormat: function(date, format) {
  2247. return utilDate.format(date, format);
  2248. },
  2249. isEqual: function(date1, date2) {
  2250. if (date1 && date2) {
  2251. return (date1.getTime() === date2.getTime());
  2252. }
  2253. return !(date1 || date2);
  2254. },
  2255. format: function(date, format) {
  2256. var formatFunctions = utilDate.formatFunctions;
  2257. if (!Ext.isDate(date)) {
  2258. return '';
  2259. }
  2260. if (formatFunctions[format] == null) {
  2261. utilDate.createFormat(format);
  2262. }
  2263. return formatFunctions[format].call(date) + '';
  2264. },
  2265. getTimezone : function(date) {
  2266. return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
  2267. },
  2268. getGMTOffset : function(date, colon) {
  2269. var offset = date.getTimezoneOffset();
  2270. return (offset > 0 ? "-" : "+")
  2271. + Ext.String.leftPad(Math.floor(Math.abs(offset) / 60), 2, "0")
  2272. + (colon ? ":" : "")
  2273. + Ext.String.leftPad(Math.abs(offset % 60), 2, "0");
  2274. },
  2275. getDayOfYear: function(date) {
  2276. var num = 0,
  2277. d = Ext.Date.clone(date),
  2278. m = date.getMonth(),
  2279. i;
  2280. for (i = 0, d.setDate(1), d.setMonth(0); i < m; d.setMonth(++i)) {
  2281. num += utilDate.getDaysInMonth(d);
  2282. }
  2283. return num + date.getDate() - 1;
  2284. },
  2285. getWeekOfYear : (function() {
  2286. var ms1d = 864e5,
  2287. ms7d = 7 * ms1d;
  2288. return function(date) {
  2289. var DC3 = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate() + 3) / ms1d,
  2290. AWN = Math.floor(DC3 / 7),
  2291. Wyr = new Date(AWN * ms7d).getUTCFullYear();
  2292. return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
  2293. };
  2294. }()),
  2295. isLeapYear : function(date) {
  2296. var year = date.getFullYear();
  2297. return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
  2298. },
  2299. getFirstDayOfMonth : function(date) {
  2300. var day = (date.getDay() - (date.getDate() - 1)) % 7;
  2301. return (day < 0) ? (day + 7) : day;
  2302. },
  2303. getLastDayOfMonth : function(date) {
  2304. return utilDate.getLastDateOfMonth(date).getDay();
  2305. },
  2306. getFirstDateOfMonth : function(date) {
  2307. return new Date(date.getFullYear(), date.getMonth(), 1);
  2308. },
  2309. getLastDateOfMonth : function(date) {
  2310. return new Date(date.getFullYear(), date.getMonth(), utilDate.getDaysInMonth(date));
  2311. },
  2312. getDaysInMonth: (function() {
  2313. var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  2314. return function(date) {
  2315. var m = date.getMonth();
  2316. return m == 1 && utilDate.isLeapYear(date) ? 29 : daysInMonth[m];
  2317. };
  2318. }()),
  2319. getSuffix : function(date) {
  2320. switch (date.getDate()) {
  2321. case 1:
  2322. case 21:
  2323. case 31:
  2324. return "st";
  2325. case 2:
  2326. case 22:
  2327. return "nd";
  2328. case 3:
  2329. case 23:
  2330. return "rd";
  2331. default:
  2332. return "th";
  2333. }
  2334. },
  2335. clone : function(date) {
  2336. return new Date(date.getTime());
  2337. },
  2338. isDST : function(date) {
  2339. return new Date(date.getFullYear(), 0, 1).getTimezoneOffset() != date.getTimezoneOffset();
  2340. },
  2341. clearTime : function(date, clone) {
  2342. if (clone) {
  2343. return Ext.Date.clearTime(Ext.Date.clone(date));
  2344. }
  2345. var d = date.getDate(),
  2346. hr,
  2347. c;
  2348. date.setHours(0);
  2349. date.setMinutes(0);
  2350. date.setSeconds(0);
  2351. date.setMilliseconds(0);
  2352. if (date.getDate() != d) {
  2353. for (hr = 1, c = utilDate.add(date, Ext.Date.HOUR, hr); c.getDate() != d; hr++, c = utilDate.add(date, Ext.Date.HOUR, hr));
  2354. date.setDate(d);
  2355. date.setHours(c.getHours());
  2356. }
  2357. return date;
  2358. },
  2359. add : function(date, interval, value) {
  2360. var d = Ext.Date.clone(date),
  2361. Date = Ext.Date,
  2362. day;
  2363. if (!interval || value === 0) {
  2364. return d;
  2365. }
  2366. switch(interval.toLowerCase()) {
  2367. case Ext.Date.MILLI:
  2368. d.setMilliseconds(d.getMilliseconds() + value);
  2369. break;
  2370. case Ext.Date.SECOND:
  2371. d.setSeconds(d.getSeconds() + value);
  2372. break;
  2373. case Ext.Date.MINUTE:
  2374. d.setMinutes(d.getMinutes() + value);
  2375. break;
  2376. case Ext.Date.HOUR:
  2377. d.setHours(d.getHours() + value);
  2378. break;
  2379. case Ext.Date.DAY:
  2380. d.setDate(d.getDate() + value);
  2381. break;
  2382. case Ext.Date.MONTH:
  2383. day = date.getDate();
  2384. if (day > 28) {
  2385. day = Math.min(day, Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(date), Ext.Date.MONTH, value)).getDate());
  2386. }
  2387. d.setDate(day);
  2388. d.setMonth(date.getMonth() + value);
  2389. break;
  2390. case Ext.Date.YEAR:
  2391. day = date.getDate();
  2392. if (day > 28) {
  2393. day = Math.min(day, Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(date), Ext.Date.YEAR, value)).getDate());
  2394. }
  2395. d.setDate(day);
  2396. d.setFullYear(date.getFullYear() + value);
  2397. break;
  2398. }
  2399. return d;
  2400. },
  2401. between : function(date, start, end) {
  2402. var t = date.getTime();
  2403. return start.getTime() <= t && t <= end.getTime();
  2404. },
  2405. compat: function() {
  2406. var nativeDate = window.Date,
  2407. p, u,
  2408. statics = ['useStrict', 'formatCodeToRegex', 'parseFunctions', 'parseRegexes', 'formatFunctions', 'y2kYear', 'MILLI', 'SECOND', 'MINUTE', 'HOUR', 'DAY', 'MONTH', 'YEAR', 'defaults', 'dayNames', 'monthNames', 'monthNumbers', 'getShortMonthName', 'getShortDayName', 'getMonthNumber', 'formatCodes', 'isValid', 'parseDate', 'getFormatCode', 'createFormat', 'createParser', 'parseCodes'],
  2409. proto = ['dateFormat', 'format', 'getTimezone', 'getGMTOffset', 'getDayOfYear', 'getWeekOfYear', 'isLeapYear', 'getFirstDayOfMonth', 'getLastDayOfMonth', 'getDaysInMonth', 'getSuffix', 'clone', 'isDST', 'clearTime', 'add', 'between'],
  2410. sLen = statics.length,
  2411. pLen = proto.length,
  2412. stat, prot, s;
  2413. for (s = 0; s < sLen; s++) {
  2414. stat = statics[s];
  2415. nativeDate[stat] = utilDate[stat];
  2416. }
  2417. for (p = 0; p < pLen; p++) {
  2418. prot = proto[p];
  2419. nativeDate.prototype[prot] = function() {
  2420. var args = Array.prototype.slice.call(arguments);
  2421. args.unshift(this);
  2422. return utilDate[prot].apply(utilDate, args);
  2423. };
  2424. }
  2425. }
  2426. };
  2427. var utilDate = Ext.Date;
  2428. }());
  2429. //@tag foundation,core
  2430. //@require ../lang/Date.js
  2431. (function(flexSetter) {
  2432. var noArgs = [],
  2433. Base = function(){};
  2434. Ext.apply(Base, {
  2435. $className: 'Ext.Base',
  2436. $isClass: true,
  2437. create: function() {
  2438. return Ext.create.apply(Ext, [this].concat(Array.prototype.slice.call(arguments, 0)));
  2439. },
  2440. extend: function(parent) {
  2441. var parentPrototype = parent.prototype,
  2442. basePrototype, prototype, i, ln, name, statics;
  2443. prototype = this.prototype = Ext.Object.chain(parentPrototype);
  2444. prototype.self = this;
  2445. this.superclass = prototype.superclass = parentPrototype;
  2446. if (!parent.$isClass) {
  2447. basePrototype = Ext.Base.prototype;
  2448. for (i in basePrototype) {
  2449. if (i in prototype) {
  2450. prototype[i] = basePrototype[i];
  2451. }
  2452. }
  2453. }
  2454. statics = parentPrototype.$inheritableStatics;
  2455. if (statics) {
  2456. for (i = 0,ln = statics.length; i < ln; i++) {
  2457. name = statics[i];
  2458. if (!this.hasOwnProperty(name)) {
  2459. this[name] = parent[name];
  2460. }
  2461. }
  2462. }
  2463. if (parent.$onExtended) {
  2464. this.$onExtended = parent.$onExtended.slice();
  2465. }
  2466. prototype.config = new prototype.configClass();
  2467. prototype.initConfigList = prototype.initConfigList.slice();
  2468. prototype.initConfigMap = Ext.clone(prototype.initConfigMap);
  2469. prototype.configMap = Ext.Object.chain(prototype.configMap);
  2470. },
  2471. $onExtended: [],
  2472. triggerExtended: function() {
  2473. var callbacks = this.$onExtended,
  2474. ln = callbacks.length,
  2475. i, callback;
  2476. if (ln > 0) {
  2477. for (i = 0; i < ln; i++) {
  2478. callback = callbacks[i];
  2479. callback.fn.apply(callback.scope || this, arguments);
  2480. }
  2481. }
  2482. },
  2483. onExtended: function(fn, scope) {
  2484. this.$onExtended.push({
  2485. fn: fn,
  2486. scope: scope
  2487. });
  2488. return this;
  2489. },
  2490. addConfig: function(config, fullMerge) {
  2491. var prototype = this.prototype,
  2492. configNameCache = Ext.Class.configNameCache,
  2493. hasConfig = prototype.configMap,
  2494. initConfigList = prototype.initConfigList,
  2495. initConfigMap = prototype.initConfigMap,
  2496. defaultConfig = prototype.config,
  2497. initializedName, name, value;
  2498. for (name in config) {
  2499. if (config.hasOwnProperty(name)) {
  2500. if (!hasConfig[name]) {
  2501. hasConfig[name] = true;
  2502. }
  2503. value = config[name];
  2504. initializedName = configNameCache[name].initialized;
  2505. if (!initConfigMap[name] && value !== null && !prototype[initializedName]) {
  2506. initConfigMap[name] = true;
  2507. initConfigList.push(name);
  2508. }
  2509. }
  2510. }
  2511. if (fullMerge) {
  2512. Ext.merge(defaultConfig, config);
  2513. }
  2514. else {
  2515. Ext.mergeIf(defaultConfig, config);
  2516. }
  2517. prototype.configClass = Ext.Object.classify(defaultConfig);
  2518. },
  2519. addStatics: function(members) {
  2520. var member, name;
  2521. for (name in members) {
  2522. if (members.hasOwnProperty(name)) {
  2523. member = members[name];
  2524. if (typeof member == 'function' && !member.$isClass && member !== Ext.emptyFn && member !== Ext.identityFn) {
  2525. member.$owner = this;
  2526. member.$name = name;
  2527. }
  2528. this[name] = member;
  2529. }
  2530. }
  2531. return this;
  2532. },
  2533. addInheritableStatics: function(members) {
  2534. var inheritableStatics,
  2535. hasInheritableStatics,
  2536. prototype = this.prototype,
  2537. name, member;
  2538. inheritableStatics = prototype.$inheritableStatics;
  2539. hasInheritableStatics = prototype.$hasInheritableStatics;
  2540. if (!inheritableStatics) {
  2541. inheritableStatics = prototype.$inheritableStatics = [];
  2542. hasInheritableStatics = prototype.$hasInheritableStatics = {};
  2543. }
  2544. for (name in members) {
  2545. if (members.hasOwnProperty(name)) {
  2546. member = members[name];
  2547. this[name] = member;
  2548. if (!hasInheritableStatics[name]) {
  2549. hasInheritableStatics[name] = true;
  2550. inheritableStatics.push(name);
  2551. }
  2552. }
  2553. }
  2554. return this;
  2555. },
  2556. addMembers: function(members) {
  2557. var prototype = this.prototype,
  2558. enumerables = Ext.enumerables,
  2559. names = [],
  2560. i, ln, name, member;
  2561. for (name in members) {
  2562. names.push(name);
  2563. }
  2564. if (enumerables) {
  2565. names.push.apply(names, enumerables);
  2566. }
  2567. for (i = 0,ln = names.length; i < ln; i++) {
  2568. name = names[i];
  2569. if (members.hasOwnProperty(name)) {
  2570. member = members[name];
  2571. if (typeof member == 'function' && !member.$isClass && member !== Ext.emptyFn) {
  2572. member.$owner = this;
  2573. member.$name = name;
  2574. }
  2575. prototype[name] = member;
  2576. }
  2577. }
  2578. return this;
  2579. },
  2580. addMember: function(name, member) {
  2581. if (typeof member == 'function' && !member.$isClass && member !== Ext.emptyFn) {
  2582. member.$owner = this;
  2583. member.$name = name;
  2584. }
  2585. this.prototype[name] = member;
  2586. return this;
  2587. },
  2588. implement: function() {
  2589. this.addMembers.apply(this, arguments);
  2590. },
  2591. borrow: function(fromClass, members) {
  2592. var prototype = this.prototype,
  2593. fromPrototype = fromClass.prototype,
  2594. i, ln, name, fn, toBorrow;
  2595. members = Ext.Array.from(members);
  2596. for (i = 0,ln = members.length; i < ln; i++) {
  2597. name = members[i];
  2598. toBorrow = fromPrototype[name];
  2599. if (typeof toBorrow == 'function') {
  2600. fn = Ext.Function.clone(toBorrow);
  2601. fn.$owner = this;
  2602. fn.$name = name;
  2603. prototype[name] = fn;
  2604. }
  2605. else {
  2606. prototype[name] = toBorrow;
  2607. }
  2608. }
  2609. return this;
  2610. },
  2611. override: function(members) {
  2612. var me = this,
  2613. enumerables = Ext.enumerables,
  2614. target = me.prototype,
  2615. cloneFunction = Ext.Function.clone,
  2616. name, index, member, statics, names, previous;
  2617. if (arguments.length === 2) {
  2618. name = members;
  2619. members = {};
  2620. members[name] = arguments[1];
  2621. enumerables = null;
  2622. }
  2623. do {
  2624. names = [];
  2625. statics = null;
  2626. for (name in members) {
  2627. if (name == 'statics') {
  2628. statics = members[name];
  2629. } else if (name == 'config') {
  2630. me.addConfig(members[name], true);
  2631. } else {
  2632. names.push(name);
  2633. }
  2634. }
  2635. if (enumerables) {
  2636. names.push.apply(names, enumerables);
  2637. }
  2638. for (index = names.length; index--; ) {
  2639. name = names[index];
  2640. if (members.hasOwnProperty(name)) {
  2641. member = members[name];
  2642. if (typeof member == 'function' && !member.$className && member !== Ext.emptyFn) {
  2643. if (typeof member.$owner != 'undefined') {
  2644. member = cloneFunction(member);
  2645. }
  2646. member.$owner = me;
  2647. member.$name = name;
  2648. previous = target[name];
  2649. if (previous) {
  2650. member.$previous = previous;
  2651. }
  2652. }
  2653. target[name] = member;
  2654. }
  2655. }
  2656. target = me;
  2657. members = statics;
  2658. } while (members);
  2659. return this;
  2660. },
  2661. callParent: function(args) {
  2662. var method;
  2663. return (method = this.callParent.caller) && (method.$previous ||
  2664. ((method = method.$owner ? method : method.caller) &&
  2665. method.$owner.superclass.self[method.$name])).apply(this, args || noArgs);
  2666. },
  2667. callSuper: function(args) {
  2668. var method;
  2669. return (method = this.callSuper.caller) &&
  2670. ((method = method.$owner ? method : method.caller) &&
  2671. method.$owner.superclass.self[method.$name]).apply(this, args || noArgs);
  2672. },
  2673. mixin: function(name, mixinClass) {
  2674. var mixin = mixinClass.prototype,
  2675. prototype = this.prototype,
  2676. key;
  2677. if (typeof mixin.onClassMixedIn != 'undefined') {
  2678. mixin.onClassMixedIn.call(mixinClass, this);
  2679. }
  2680. if (!prototype.hasOwnProperty('mixins')) {
  2681. if ('mixins' in prototype) {
  2682. prototype.mixins = Ext.Object.chain(prototype.mixins);
  2683. }
  2684. else {
  2685. prototype.mixins = {};
  2686. }
  2687. }
  2688. for (key in mixin) {
  2689. if (key === 'mixins') {
  2690. Ext.merge(prototype.mixins, mixin[key]);
  2691. }
  2692. else if (typeof prototype[key] == 'undefined' && key != 'mixinId' && key != 'config') {
  2693. prototype[key] = mixin[key];
  2694. }
  2695. }
  2696. if ('config' in mixin) {
  2697. this.addConfig(mixin.config, false);
  2698. }
  2699. prototype.mixins[name] = mixin;
  2700. },
  2701. getName: function() {
  2702. return Ext.getClassName(this);
  2703. },
  2704. createAlias: flexSetter(function(alias, origin) {
  2705. this.override(alias, function() {
  2706. return this[origin].apply(this, arguments);
  2707. });
  2708. }),
  2709. addXtype: function(xtype) {
  2710. var prototype = this.prototype,
  2711. xtypesMap = prototype.xtypesMap,
  2712. xtypes = prototype.xtypes,
  2713. xtypesChain = prototype.xtypesChain;
  2714. if (!prototype.hasOwnProperty('xtypesMap')) {
  2715. xtypesMap = prototype.xtypesMap = Ext.merge({}, prototype.xtypesMap || {});
  2716. xtypes = prototype.xtypes = prototype.xtypes ? [].concat(prototype.xtypes) : [];
  2717. xtypesChain = prototype.xtypesChain = prototype.xtypesChain ? [].concat(prototype.xtypesChain) : [];
  2718. prototype.xtype = xtype;
  2719. }
  2720. if (!xtypesMap[xtype]) {
  2721. xtypesMap[xtype] = true;
  2722. xtypes.push(xtype);
  2723. xtypesChain.push(xtype);
  2724. Ext.ClassManager.setAlias(this, 'widget.' + xtype);
  2725. }
  2726. return this;
  2727. }
  2728. });
  2729. Base.implement({
  2730. isInstance: true,
  2731. $className: 'Ext.Base',
  2732. configClass: Ext.emptyFn,
  2733. initConfigList: [],
  2734. configMap: {},
  2735. initConfigMap: {},
  2736. statics: function() {
  2737. var method = this.statics.caller,
  2738. self = this.self;
  2739. if (!method) {
  2740. return self;
  2741. }
  2742. return method.$owner;
  2743. },
  2744. callParent: function(args) {
  2745. var method,
  2746. superMethod = (method = this.callParent.caller) && (method.$previous ||
  2747. ((method = method.$owner ? method : method.caller) &&
  2748. method.$owner.superclass[method.$name]));
  2749. return superMethod.apply(this, args || noArgs);
  2750. },
  2751. callSuper: function(args) {
  2752. var method,
  2753. superMethod = (method = this.callSuper.caller) &&
  2754. ((method = method.$owner ? method : method.caller) &&
  2755. method.$owner.superclass[method.$name]);
  2756. return superMethod.apply(this, args || noArgs);
  2757. },
  2758. self: Base,
  2759. constructor: function() {
  2760. return this;
  2761. },
  2762. initConfig: function(config) {
  2763. var instanceConfig = config,
  2764. configNameCache = Ext.Class.configNameCache,
  2765. defaultConfig = new this.configClass(),
  2766. defaultConfigList = this.initConfigList,
  2767. hasConfig = this.configMap,
  2768. nameMap, i, ln, name, initializedName;
  2769. this.initConfig = Ext.emptyFn;
  2770. this.initialConfig = instanceConfig || {};
  2771. this.config = config = (instanceConfig) ? Ext.merge(defaultConfig, config) : defaultConfig;
  2772. if (instanceConfig) {
  2773. defaultConfigList = defaultConfigList.slice();
  2774. for (name in instanceConfig) {
  2775. if (hasConfig[name]) {
  2776. if (instanceConfig[name] !== null) {
  2777. defaultConfigList.push(name);
  2778. this[configNameCache[name].initialized] = false;
  2779. }
  2780. }
  2781. }
  2782. }
  2783. for (i = 0,ln = defaultConfigList.length; i < ln; i++) {
  2784. name = defaultConfigList[i];
  2785. nameMap = configNameCache[name];
  2786. initializedName = nameMap.initialized;
  2787. if (!this[initializedName]) {
  2788. this[initializedName] = true;
  2789. this[nameMap.set].call(this, config[name]);
  2790. }
  2791. }
  2792. return this;
  2793. },
  2794. hasConfig: function(name) {
  2795. return Boolean(this.configMap[name]);
  2796. },
  2797. setConfig: function(config, applyIfNotSet) {
  2798. if (!config) {
  2799. return this;
  2800. }
  2801. var configNameCache = Ext.Class.configNameCache,
  2802. currentConfig = this.config,
  2803. hasConfig = this.configMap,
  2804. initialConfig = this.initialConfig,
  2805. name, value;
  2806. applyIfNotSet = Boolean(applyIfNotSet);
  2807. for (name in config) {
  2808. if (applyIfNotSet && initialConfig.hasOwnProperty(name)) {
  2809. continue;
  2810. }
  2811. value = config[name];
  2812. currentConfig[name] = value;
  2813. if (hasConfig[name]) {
  2814. this[configNameCache[name].set](value);
  2815. }
  2816. }
  2817. return this;
  2818. },
  2819. getConfig: function(name) {
  2820. var configNameCache = Ext.Class.configNameCache;
  2821. return this[configNameCache[name].get]();
  2822. },
  2823. getInitialConfig: function(name) {
  2824. var config = this.config;
  2825. if (!name) {
  2826. return config;
  2827. }
  2828. else {
  2829. return config[name];
  2830. }
  2831. },
  2832. onConfigUpdate: function(names, callback, scope) {
  2833. var self = this.self,
  2834. i, ln, name,
  2835. updaterName, updater, newUpdater;
  2836. names = Ext.Array.from(names);
  2837. scope = scope || this;
  2838. for (i = 0,ln = names.length; i < ln; i++) {
  2839. name = names[i];
  2840. updaterName = 'update' + Ext.String.capitalize(name);
  2841. updater = this[updaterName] || Ext.emptyFn;
  2842. newUpdater = function() {
  2843. updater.apply(this, arguments);
  2844. scope[callback].apply(scope, arguments);
  2845. };
  2846. newUpdater.$name = updaterName;
  2847. newUpdater.$owner = self;
  2848. this[updaterName] = newUpdater;
  2849. }
  2850. },
  2851. destroy: function() {
  2852. this.destroy = Ext.emptyFn;
  2853. }
  2854. });
  2855. Base.prototype.callOverridden = Base.prototype.callParent;
  2856. Ext.Base = Base;
  2857. }(Ext.Function.flexSetter));
  2858. //@tag foundation,core
  2859. //@require Base.js
  2860. (function() {
  2861. var ExtClass,
  2862. Base = Ext.Base,
  2863. baseStaticMembers = [],
  2864. baseStaticMember, baseStaticMemberLength;
  2865. for (baseStaticMember in Base) {
  2866. if (Base.hasOwnProperty(baseStaticMember)) {
  2867. baseStaticMembers.push(baseStaticMember);
  2868. }
  2869. }
  2870. baseStaticMemberLength = baseStaticMembers.length;
  2871. function makeCtor (className) {
  2872. function constructor () {
  2873. return this.constructor.apply(this, arguments) || null;
  2874. }
  2875. return constructor;
  2876. }
  2877. Ext.Class = ExtClass = function(Class, data, onCreated) {
  2878. if (typeof Class != 'function') {
  2879. onCreated = data;
  2880. data = Class;
  2881. Class = null;
  2882. }
  2883. if (!data) {
  2884. data = {};
  2885. }
  2886. Class = ExtClass.create(Class, data);
  2887. ExtClass.process(Class, data, onCreated);
  2888. return Class;
  2889. };
  2890. Ext.apply(ExtClass, {
  2891. onBeforeCreated: function(Class, data, hooks) {
  2892. Class.addMembers(data);
  2893. hooks.onCreated.call(Class, Class);
  2894. },
  2895. create: function(Class, data) {
  2896. var name, i;
  2897. if (!Class) {
  2898. Class = makeCtor(
  2899. );
  2900. }
  2901. for (i = 0; i < baseStaticMemberLength; i++) {
  2902. name = baseStaticMembers[i];
  2903. Class[name] = Base[name];
  2904. }
  2905. return Class;
  2906. },
  2907. process: function(Class, data, onCreated) {
  2908. var preprocessorStack = data.preprocessors || ExtClass.defaultPreprocessors,
  2909. registeredPreprocessors = this.preprocessors,
  2910. hooks = {
  2911. onBeforeCreated: this.onBeforeCreated
  2912. },
  2913. preprocessors = [],
  2914. preprocessor, preprocessorsProperties,
  2915. i, ln, j, subLn, preprocessorProperty, process;
  2916. delete data.preprocessors;
  2917. for (i = 0,ln = preprocessorStack.length; i < ln; i++) {
  2918. preprocessor = preprocessorStack[i];
  2919. if (typeof preprocessor == 'string') {
  2920. preprocessor = registeredPreprocessors[preprocessor];
  2921. preprocessorsProperties = preprocessor.properties;
  2922. if (preprocessorsProperties === true) {
  2923. preprocessors.push(preprocessor.fn);
  2924. }
  2925. else if (preprocessorsProperties) {
  2926. for (j = 0,subLn = preprocessorsProperties.length; j < subLn; j++) {
  2927. preprocessorProperty = preprocessorsProperties[j];
  2928. if (data.hasOwnProperty(preprocessorProperty)) {
  2929. preprocessors.push(preprocessor.fn);
  2930. break;
  2931. }
  2932. }
  2933. }
  2934. }
  2935. else {
  2936. preprocessors.push(preprocessor);
  2937. }
  2938. }
  2939. hooks.onCreated = onCreated ? onCreated : Ext.emptyFn;
  2940. hooks.preprocessors = preprocessors;
  2941. this.doProcess(Class, data, hooks);
  2942. },
  2943. doProcess: function(Class, data, hooks){
  2944. var me = this,
  2945. preprocessor = hooks.preprocessors.shift();
  2946. if (!preprocessor) {
  2947. hooks.onBeforeCreated.apply(me, arguments);
  2948. return;
  2949. }
  2950. if (preprocessor.call(me, Class, data, hooks, me.doProcess) !== false) {
  2951. me.doProcess(Class, data, hooks);
  2952. }
  2953. },
  2954. preprocessors: {},
  2955. registerPreprocessor: function(name, fn, properties, position, relativeTo) {
  2956. if (!position) {
  2957. position = 'last';
  2958. }
  2959. if (!properties) {
  2960. properties = [name];
  2961. }
  2962. this.preprocessors[name] = {
  2963. name: name,
  2964. properties: properties || false,
  2965. fn: fn
  2966. };
  2967. this.setDefaultPreprocessorPosition(name, position, relativeTo);
  2968. return this;
  2969. },
  2970. getPreprocessor: function(name) {
  2971. return this.preprocessors[name];
  2972. },
  2973. getPreprocessors: function() {
  2974. return this.preprocessors;
  2975. },
  2976. defaultPreprocessors: [],
  2977. getDefaultPreprocessors: function() {
  2978. return this.defaultPreprocessors;
  2979. },
  2980. setDefaultPreprocessors: function(preprocessors) {
  2981. this.defaultPreprocessors = Ext.Array.from(preprocessors);
  2982. return this;
  2983. },
  2984. setDefaultPreprocessorPosition: function(name, offset, relativeName) {
  2985. var defaultPreprocessors = this.defaultPreprocessors,
  2986. index;
  2987. if (typeof offset == 'string') {
  2988. if (offset === 'first') {
  2989. defaultPreprocessors.unshift(name);
  2990. return this;
  2991. }
  2992. else if (offset === 'last') {
  2993. defaultPreprocessors.push(name);
  2994. return this;
  2995. }
  2996. offset = (offset === 'after') ? 1 : -1;
  2997. }
  2998. index = Ext.Array.indexOf(defaultPreprocessors, relativeName);
  2999. if (index !== -1) {
  3000. Ext.Array.splice(defaultPreprocessors, Math.max(0, index + offset), 0, name);
  3001. }
  3002. return this;
  3003. },
  3004. configNameCache: {},
  3005. getConfigNameMap: function(name) {
  3006. var cache = this.configNameCache,
  3007. map = cache[name],
  3008. capitalizedName;
  3009. if (!map) {
  3010. capitalizedName = name.charAt(0).toUpperCase() + name.substr(1);
  3011. map = cache[name] = {
  3012. internal: name,
  3013. initialized: '_is' + capitalizedName + 'Initialized',
  3014. apply: 'apply' + capitalizedName,
  3015. update: 'update' + capitalizedName,
  3016. 'set': 'set' + capitalizedName,
  3017. 'get': 'get' + capitalizedName,
  3018. doSet : 'doSet' + capitalizedName,
  3019. changeEvent: name.toLowerCase() + 'change'
  3020. };
  3021. }
  3022. return map;
  3023. }
  3024. });
  3025. ExtClass.registerPreprocessor('extend', function(Class, data) {
  3026. var Base = Ext.Base,
  3027. basePrototype = Base.prototype,
  3028. extend = data.extend,
  3029. Parent, parentPrototype, i;
  3030. delete data.extend;
  3031. if (extend && extend !== Object) {
  3032. Parent = extend;
  3033. }
  3034. else {
  3035. Parent = Base;
  3036. }
  3037. parentPrototype = Parent.prototype;
  3038. if (!Parent.$isClass) {
  3039. for (i in basePrototype) {
  3040. if (!parentPrototype[i]) {
  3041. parentPrototype[i] = basePrototype[i];
  3042. }
  3043. }
  3044. }
  3045. Class.extend(Parent);
  3046. Class.triggerExtended.apply(Class, arguments);
  3047. if (data.onClassExtended) {
  3048. Class.onExtended(data.onClassExtended, Class);
  3049. delete data.onClassExtended;
  3050. }
  3051. }, true);
  3052. ExtClass.registerPreprocessor('statics', function(Class, data) {
  3053. Class.addStatics(data.statics);
  3054. delete data.statics;
  3055. });
  3056. ExtClass.registerPreprocessor('inheritableStatics', function(Class, data) {
  3057. Class.addInheritableStatics(data.inheritableStatics);
  3058. delete data.inheritableStatics;
  3059. });
  3060. ExtClass.registerPreprocessor('config', function(Class, data) {
  3061. var config = data.config,
  3062. prototype = Class.prototype;
  3063. delete data.config;
  3064. Ext.Object.each(config, function(name, value) {
  3065. var nameMap = ExtClass.getConfigNameMap(name),
  3066. internalName = nameMap.internal,
  3067. initializedName = nameMap.initialized,
  3068. applyName = nameMap.apply,
  3069. updateName = nameMap.update,
  3070. setName = nameMap.set,
  3071. getName = nameMap.get,
  3072. hasOwnSetter = (setName in prototype) || data.hasOwnProperty(setName),
  3073. hasOwnApplier = (applyName in prototype) || data.hasOwnProperty(applyName),
  3074. hasOwnUpdater = (updateName in prototype) || data.hasOwnProperty(updateName),
  3075. optimizedGetter, customGetter;
  3076. if (value === null || (!hasOwnSetter && !hasOwnApplier && !hasOwnUpdater)) {
  3077. prototype[internalName] = value;
  3078. prototype[initializedName] = true;
  3079. }
  3080. else {
  3081. prototype[initializedName] = false;
  3082. }
  3083. if (!hasOwnSetter) {
  3084. data[setName] = function(value) {
  3085. var oldValue = this[internalName],
  3086. applier = this[applyName],
  3087. updater = this[updateName];
  3088. if (!this[initializedName]) {
  3089. this[initializedName] = true;
  3090. }
  3091. if (applier) {
  3092. value = applier.call(this, value, oldValue);
  3093. }
  3094. if (typeof value != 'undefined') {
  3095. this[internalName] = value;
  3096. if (updater && value !== oldValue) {
  3097. updater.call(this, value, oldValue);
  3098. }
  3099. }
  3100. return this;
  3101. };
  3102. }
  3103. if (!(getName in prototype) || data.hasOwnProperty(getName)) {
  3104. customGetter = data[getName] || false;
  3105. if (customGetter) {
  3106. optimizedGetter = function() {
  3107. return customGetter.apply(this, arguments);
  3108. };
  3109. }
  3110. else {
  3111. optimizedGetter = function() {
  3112. return this[internalName];
  3113. };
  3114. }
  3115. data[getName] = function() {
  3116. var currentGetter;
  3117. if (!this[initializedName]) {
  3118. this[initializedName] = true;
  3119. this[setName](this.config[name]);
  3120. }
  3121. currentGetter = this[getName];
  3122. if ('$previous' in currentGetter) {
  3123. currentGetter.$previous = optimizedGetter;
  3124. }
  3125. else {
  3126. this[getName] = optimizedGetter;
  3127. }
  3128. return optimizedGetter.apply(this, arguments);
  3129. };
  3130. }
  3131. });
  3132. Class.addConfig(config, true);
  3133. });
  3134. ExtClass.registerPreprocessor('mixins', function(Class, data, hooks) {
  3135. var mixins = data.mixins,
  3136. name, mixin, i, ln;
  3137. delete data.mixins;
  3138. Ext.Function.interceptBefore(hooks, 'onCreated', function() {
  3139. if (mixins instanceof Array) {
  3140. for (i = 0,ln = mixins.length; i < ln; i++) {
  3141. mixin = mixins[i];
  3142. name = mixin.prototype.mixinId || mixin.$className;
  3143. Class.mixin(name, mixin);
  3144. }
  3145. }
  3146. else {
  3147. for (var mixinName in mixins) {
  3148. if (mixins.hasOwnProperty(mixinName)) {
  3149. Class.mixin(mixinName, mixins[mixinName]);
  3150. }
  3151. }
  3152. }
  3153. });
  3154. });
  3155. Ext.extend = function(Class, Parent, members) {
  3156. if (arguments.length === 2 && Ext.isObject(Parent)) {
  3157. members = Parent;
  3158. Parent = Class;
  3159. Class = null;
  3160. }
  3161. var cls;
  3162. if (!Parent) {
  3163. throw new Error("[Ext.extend] Attempting to extend from a class which has not been loaded on the page.");
  3164. }
  3165. members.extend = Parent;
  3166. members.preprocessors = [
  3167. 'extend'
  3168. ,'statics'
  3169. ,'inheritableStatics'
  3170. ,'mixins'
  3171. ,'config'
  3172. ];
  3173. if (Class) {
  3174. cls = new ExtClass(Class, members);
  3175. cls.prototype.constructor = Class;
  3176. } else {
  3177. cls = new ExtClass(members);
  3178. }
  3179. cls.prototype.override = function(o) {
  3180. for (var m in o) {
  3181. if (o.hasOwnProperty(m)) {
  3182. this[m] = o[m];
  3183. }
  3184. }
  3185. };
  3186. return cls;
  3187. };
  3188. }());
  3189. //@tag foundation,core
  3190. //@require Class.js
  3191. (function(Class, alias, arraySlice, arrayFrom, global) {
  3192. function makeCtor () {
  3193. function constructor () {
  3194. return this.constructor.apply(this, arguments) || null;
  3195. }
  3196. return constructor;
  3197. }
  3198. var Manager = Ext.ClassManager = {
  3199. classes: {},
  3200. existCache: {},
  3201. namespaceRewrites: [{
  3202. from: 'Ext.',
  3203. to: Ext
  3204. }],
  3205. maps: {
  3206. alternateToName: {},
  3207. aliasToName: {},
  3208. nameToAliases: {},
  3209. nameToAlternates: {}
  3210. },
  3211. enableNamespaceParseCache: true,
  3212. namespaceParseCache: {},
  3213. instantiators: [],
  3214. isCreated: function(className) {
  3215. var existCache = this.existCache,
  3216. i, ln, part, root, parts;
  3217. if (this.classes[className] || existCache[className]) {
  3218. return true;
  3219. }
  3220. root = global;
  3221. parts = this.parseNamespace(className);
  3222. for (i = 0, ln = parts.length; i < ln; i++) {
  3223. part = parts[i];
  3224. if (typeof part != 'string') {
  3225. root = part;
  3226. } else {
  3227. if (!root || !root[part]) {
  3228. return false;
  3229. }
  3230. root = root[part];
  3231. }
  3232. }
  3233. existCache[className] = true;
  3234. this.triggerCreated(className);
  3235. return true;
  3236. },
  3237. createdListeners: [],
  3238. nameCreatedListeners: {},
  3239. triggerCreated: function(className) {
  3240. var listeners = this.createdListeners,
  3241. nameListeners = this.nameCreatedListeners,
  3242. alternateNames = this.maps.nameToAlternates[className],
  3243. names = [className],
  3244. i, ln, j, subLn, listener, name;
  3245. for (i = 0,ln = listeners.length; i < ln; i++) {
  3246. listener = listeners[i];
  3247. listener.fn.call(listener.scope, className);
  3248. }
  3249. if (alternateNames) {
  3250. names.push.apply(names, alternateNames);
  3251. }
  3252. for (i = 0,ln = names.length; i < ln; i++) {
  3253. name = names[i];
  3254. listeners = nameListeners[name];
  3255. if (listeners) {
  3256. for (j = 0,subLn = listeners.length; j < subLn; j++) {
  3257. listener = listeners[j];
  3258. listener.fn.call(listener.scope, name);
  3259. }
  3260. delete nameListeners[name];
  3261. }
  3262. }
  3263. },
  3264. onCreated: function(fn, scope, className) {
  3265. var listeners = this.createdListeners,
  3266. nameListeners = this.nameCreatedListeners,
  3267. listener = {
  3268. fn: fn,
  3269. scope: scope
  3270. };
  3271. if (className) {
  3272. if (this.isCreated(className)) {
  3273. fn.call(scope, className);
  3274. return;
  3275. }
  3276. if (!nameListeners[className]) {
  3277. nameListeners[className] = [];
  3278. }
  3279. nameListeners[className].push(listener);
  3280. }
  3281. else {
  3282. listeners.push(listener);
  3283. }
  3284. },
  3285. parseNamespace: function(namespace) {
  3286. var cache = this.namespaceParseCache,
  3287. parts,
  3288. rewrites,
  3289. root,
  3290. name,
  3291. rewrite, from, to, i, ln;
  3292. if (this.enableNamespaceParseCache) {
  3293. if (cache.hasOwnProperty(namespace)) {
  3294. return cache[namespace];
  3295. }
  3296. }
  3297. parts = [];
  3298. rewrites = this.namespaceRewrites;
  3299. root = global;
  3300. name = namespace;
  3301. for (i = 0, ln = rewrites.length; i < ln; i++) {
  3302. rewrite = rewrites[i];
  3303. from = rewrite.from;
  3304. to = rewrite.to;
  3305. if (name === from || name.substring(0, from.length) === from) {
  3306. name = name.substring(from.length);
  3307. if (typeof to != 'string') {
  3308. root = to;
  3309. } else {
  3310. parts = parts.concat(to.split('.'));
  3311. }
  3312. break;
  3313. }
  3314. }
  3315. parts.push(root);
  3316. parts = parts.concat(name.split('.'));
  3317. if (this.enableNamespaceParseCache) {
  3318. cache[namespace] = parts;
  3319. }
  3320. return parts;
  3321. },
  3322. setNamespace: function(name, value) {
  3323. var root = global,
  3324. parts = this.parseNamespace(name),
  3325. ln = parts.length - 1,
  3326. leaf = parts[ln],
  3327. i, part;
  3328. for (i = 0; i < ln; i++) {
  3329. part = parts[i];
  3330. if (typeof part != 'string') {
  3331. root = part;
  3332. } else {
  3333. if (!root[part]) {
  3334. root[part] = {};
  3335. }
  3336. root = root[part];
  3337. }
  3338. }
  3339. root[leaf] = value;
  3340. return root[leaf];
  3341. },
  3342. createNamespaces: function() {
  3343. var root = global,
  3344. parts, part, i, j, ln, subLn;
  3345. for (i = 0, ln = arguments.length; i < ln; i++) {
  3346. parts = this.parseNamespace(arguments[i]);
  3347. for (j = 0, subLn = parts.length; j < subLn; j++) {
  3348. part = parts[j];
  3349. if (typeof part != 'string') {
  3350. root = part;
  3351. } else {
  3352. if (!root[part]) {
  3353. root[part] = {};
  3354. }
  3355. root = root[part];
  3356. }
  3357. }
  3358. }
  3359. return root;
  3360. },
  3361. set: function(name, value) {
  3362. var me = this,
  3363. maps = me.maps,
  3364. nameToAlternates = maps.nameToAlternates,
  3365. targetName = me.getName(value),
  3366. alternates;
  3367. me.classes[name] = me.setNamespace(name, value);
  3368. if (targetName && targetName !== name) {
  3369. maps.alternateToName[name] = targetName;
  3370. alternates = nameToAlternates[targetName] || (nameToAlternates[targetName] = []);
  3371. alternates.push(name);
  3372. }
  3373. return this;
  3374. },
  3375. get: function(name) {
  3376. var classes = this.classes,
  3377. root,
  3378. parts,
  3379. part, i, ln;
  3380. if (classes[name]) {
  3381. return classes[name];
  3382. }
  3383. root = global;
  3384. parts = this.parseNamespace(name);
  3385. for (i = 0, ln = parts.length; i < ln; i++) {
  3386. part = parts[i];
  3387. if (typeof part != 'string') {
  3388. root = part;
  3389. } else {
  3390. if (!root || !root[part]) {
  3391. return null;
  3392. }
  3393. root = root[part];
  3394. }
  3395. }
  3396. return root;
  3397. },
  3398. setAlias: function(cls, alias) {
  3399. var aliasToNameMap = this.maps.aliasToName,
  3400. nameToAliasesMap = this.maps.nameToAliases,
  3401. className;
  3402. if (typeof cls == 'string') {
  3403. className = cls;
  3404. } else {
  3405. className = this.getName(cls);
  3406. }
  3407. if (alias && aliasToNameMap[alias] !== className) {
  3408. aliasToNameMap[alias] = className;
  3409. }
  3410. if (!nameToAliasesMap[className]) {
  3411. nameToAliasesMap[className] = [];
  3412. }
  3413. if (alias) {
  3414. Ext.Array.include(nameToAliasesMap[className], alias);
  3415. }
  3416. return this;
  3417. },
  3418. addNameAliasMappings: function(aliases){
  3419. var aliasToNameMap = this.maps.aliasToName,
  3420. nameToAliasesMap = this.maps.nameToAliases,
  3421. className, aliasList, alias, i;
  3422. for (className in aliases) {
  3423. aliasList = nameToAliasesMap[className] ||
  3424. (nameToAliasesMap[className] = []);
  3425. for (i = 0; i < aliases[className].length; i++) {
  3426. alias = aliases[className][i];
  3427. if (!aliasToNameMap[alias]) {
  3428. aliasToNameMap[alias] = className;
  3429. aliasList.push(alias);
  3430. }
  3431. }
  3432. }
  3433. return this;
  3434. },
  3435. addNameAlternateMappings: function(alternates) {
  3436. var alternateToName = this.maps.alternateToName,
  3437. nameToAlternates = this.maps.nameToAlternates,
  3438. className, aliasList, alternate, i;
  3439. for (className in alternates) {
  3440. aliasList = nameToAlternates[className] ||
  3441. (nameToAlternates[className] = []);
  3442. for (i = 0; i < alternates[className].length; i++) {
  3443. alternate = alternates[className];
  3444. if (!alternateToName[alternate]) {
  3445. alternateToName[alternate] = className;
  3446. aliasList.push(alternate);
  3447. }
  3448. }
  3449. }
  3450. return this;
  3451. },
  3452. getByAlias: function(alias) {
  3453. return this.get(this.getNameByAlias(alias));
  3454. },
  3455. getNameByAlias: function(alias) {
  3456. return this.maps.aliasToName[alias] || '';
  3457. },
  3458. getNameByAlternate: function(alternate) {
  3459. return this.maps.alternateToName[alternate] || '';
  3460. },
  3461. getAliasesByName: function(name) {
  3462. return this.maps.nameToAliases[name] || [];
  3463. },
  3464. getName: function(object) {
  3465. return object && object.$className || '';
  3466. },
  3467. getClass: function(object) {
  3468. return object && object.self || null;
  3469. },
  3470. create: function(className, data, createdFn) {
  3471. var ctor = makeCtor();
  3472. if (typeof data == 'function') {
  3473. data = data(ctor);
  3474. }
  3475. data.$className = className;
  3476. return new Class(ctor, data, function() {
  3477. var postprocessorStack = data.postprocessors || Manager.defaultPostprocessors,
  3478. registeredPostprocessors = Manager.postprocessors,
  3479. postprocessors = [],
  3480. postprocessor, i, ln, j, subLn, postprocessorProperties, postprocessorProperty;
  3481. delete data.postprocessors;
  3482. for (i = 0,ln = postprocessorStack.length; i < ln; i++) {
  3483. postprocessor = postprocessorStack[i];
  3484. if (typeof postprocessor == 'string') {
  3485. postprocessor = registeredPostprocessors[postprocessor];
  3486. postprocessorProperties = postprocessor.properties;
  3487. if (postprocessorProperties === true) {
  3488. postprocessors.push(postprocessor.fn);
  3489. }
  3490. else if (postprocessorProperties) {
  3491. for (j = 0,subLn = postprocessorProperties.length; j < subLn; j++) {
  3492. postprocessorProperty = postprocessorProperties[j];
  3493. if (data.hasOwnProperty(postprocessorProperty)) {
  3494. postprocessors.push(postprocessor.fn);
  3495. break;
  3496. }
  3497. }
  3498. }
  3499. }
  3500. else {
  3501. postprocessors.push(postprocessor);
  3502. }
  3503. }
  3504. data.postprocessors = postprocessors;
  3505. data.createdFn = createdFn;
  3506. Manager.processCreate(className, this, data);
  3507. });
  3508. },
  3509. processCreate: function(className, cls, clsData){
  3510. var me = this,
  3511. postprocessor = clsData.postprocessors.shift(),
  3512. createdFn = clsData.createdFn;
  3513. if (!postprocessor) {
  3514. if (className) {
  3515. me.set(className, cls);
  3516. }
  3517. if (createdFn) {
  3518. createdFn.call(cls, cls);
  3519. }
  3520. if (className) {
  3521. me.triggerCreated(className);
  3522. }
  3523. return;
  3524. }
  3525. if (postprocessor.call(me, className, cls, clsData, me.processCreate) !== false) {
  3526. me.processCreate(className, cls, clsData);
  3527. }
  3528. },
  3529. createOverride: function (className, data, createdFn) {
  3530. var me = this,
  3531. overriddenClassName = data.override,
  3532. requires = data.requires,
  3533. uses = data.uses,
  3534. classReady = function () {
  3535. var cls, temp;
  3536. if (requires) {
  3537. temp = requires;
  3538. requires = null;
  3539. Ext.Loader.require(temp, classReady);
  3540. } else {
  3541. cls = me.get(overriddenClassName);
  3542. delete data.override;
  3543. delete data.requires;
  3544. delete data.uses;
  3545. Ext.override(cls, data);
  3546. me.triggerCreated(className);
  3547. if (uses) {
  3548. Ext.Loader.addUsedClasses(uses);
  3549. }
  3550. if (createdFn) {
  3551. createdFn.call(cls);
  3552. }
  3553. }
  3554. };
  3555. me.existCache[className] = true;
  3556. me.onCreated(classReady, me, overriddenClassName);
  3557. return me;
  3558. },
  3559. instantiateByAlias: function() {
  3560. var alias = arguments[0],
  3561. args = arraySlice.call(arguments),
  3562. className = this.getNameByAlias(alias);
  3563. if (!className) {
  3564. className = this.maps.aliasToName[alias];
  3565. Ext.syncRequire(className);
  3566. }
  3567. args[0] = className;
  3568. return this.instantiate.apply(this, args);
  3569. },
  3570. instantiate: function() {
  3571. var name = arguments[0],
  3572. nameType = typeof name,
  3573. args = arraySlice.call(arguments, 1),
  3574. alias = name,
  3575. possibleName, cls;
  3576. if (nameType != 'function') {
  3577. if (nameType != 'string' && args.length === 0) {
  3578. args = [name];
  3579. name = name.xclass;
  3580. }
  3581. cls = this.get(name);
  3582. }
  3583. else {
  3584. cls = name;
  3585. }
  3586. if (!cls) {
  3587. possibleName = this.getNameByAlias(name);
  3588. if (possibleName) {
  3589. name = possibleName;
  3590. cls = this.get(name);
  3591. }
  3592. }
  3593. if (!cls) {
  3594. possibleName = this.getNameByAlternate(name);
  3595. if (possibleName) {
  3596. name = possibleName;
  3597. cls = this.get(name);
  3598. }
  3599. }
  3600. if (!cls) {
  3601. Ext.syncRequire(name);
  3602. cls = this.get(name);
  3603. }
  3604. return this.getInstantiator(args.length)(cls, args);
  3605. },
  3606. dynInstantiate: function(name, args) {
  3607. args = arrayFrom(args, true);
  3608. args.unshift(name);
  3609. return this.instantiate.apply(this, args);
  3610. },
  3611. getInstantiator: function(length) {
  3612. var instantiators = this.instantiators,
  3613. instantiator,
  3614. i,
  3615. args;
  3616. instantiator = instantiators[length];
  3617. if (!instantiator) {
  3618. i = length;
  3619. args = [];
  3620. for (i = 0; i < length; i++) {
  3621. args.push('a[' + i + ']');
  3622. }
  3623. instantiator = instantiators[length] = new Function('c', 'a', 'return new c(' + args.join(',') + ')');
  3624. }
  3625. return instantiator;
  3626. },
  3627. postprocessors: {},
  3628. defaultPostprocessors: [],
  3629. registerPostprocessor: function(name, fn, properties, position, relativeTo) {
  3630. if (!position) {
  3631. position = 'last';
  3632. }
  3633. if (!properties) {
  3634. properties = [name];
  3635. }
  3636. this.postprocessors[name] = {
  3637. name: name,
  3638. properties: properties || false,
  3639. fn: fn
  3640. };
  3641. this.setDefaultPostprocessorPosition(name, position, relativeTo);
  3642. return this;
  3643. },
  3644. setDefaultPostprocessors: function(postprocessors) {
  3645. this.defaultPostprocessors = arrayFrom(postprocessors);
  3646. return this;
  3647. },
  3648. setDefaultPostprocessorPosition: function(name, offset, relativeName) {
  3649. var defaultPostprocessors = this.defaultPostprocessors,
  3650. index;
  3651. if (typeof offset == 'string') {
  3652. if (offset === 'first') {
  3653. defaultPostprocessors.unshift(name);
  3654. return this;
  3655. }
  3656. else if (offset === 'last') {
  3657. defaultPostprocessors.push(name);
  3658. return this;
  3659. }
  3660. offset = (offset === 'after') ? 1 : -1;
  3661. }
  3662. index = Ext.Array.indexOf(defaultPostprocessors, relativeName);
  3663. if (index !== -1) {
  3664. Ext.Array.splice(defaultPostprocessors, Math.max(0, index + offset), 0, name);
  3665. }
  3666. return this;
  3667. },
  3668. getNamesByExpression: function(expression) {
  3669. var nameToAliasesMap = this.maps.nameToAliases,
  3670. names = [],
  3671. name, alias, aliases, possibleName, regex, i, ln;
  3672. if (expression.indexOf('*') !== -1) {
  3673. expression = expression.replace(/\*/g, '(.*?)');
  3674. regex = new RegExp('^' + expression + '$');
  3675. for (name in nameToAliasesMap) {
  3676. if (nameToAliasesMap.hasOwnProperty(name)) {
  3677. aliases = nameToAliasesMap[name];
  3678. if (name.search(regex) !== -1) {
  3679. names.push(name);
  3680. }
  3681. else {
  3682. for (i = 0, ln = aliases.length; i < ln; i++) {
  3683. alias = aliases[i];
  3684. if (alias.search(regex) !== -1) {
  3685. names.push(name);
  3686. break;
  3687. }
  3688. }
  3689. }
  3690. }
  3691. }
  3692. } else {
  3693. possibleName = this.getNameByAlias(expression);
  3694. if (possibleName) {
  3695. names.push(possibleName);
  3696. } else {
  3697. possibleName = this.getNameByAlternate(expression);
  3698. if (possibleName) {
  3699. names.push(possibleName);
  3700. } else {
  3701. names.push(expression);
  3702. }
  3703. }
  3704. }
  3705. return names;
  3706. }
  3707. };
  3708. Manager.registerPostprocessor('alias', function(name, cls, data) {
  3709. var aliases = data.alias,
  3710. i, ln;
  3711. for (i = 0,ln = aliases.length; i < ln; i++) {
  3712. alias = aliases[i];
  3713. this.setAlias(cls, alias);
  3714. }
  3715. }, ['xtype', 'alias']);
  3716. Manager.registerPostprocessor('singleton', function(name, cls, data, fn) {
  3717. fn.call(this, name, new cls(), data);
  3718. return false;
  3719. });
  3720. Manager.registerPostprocessor('alternateClassName', function(name, cls, data) {
  3721. var alternates = data.alternateClassName,
  3722. i, ln, alternate;
  3723. if (!(alternates instanceof Array)) {
  3724. alternates = [alternates];
  3725. }
  3726. for (i = 0, ln = alternates.length; i < ln; i++) {
  3727. alternate = alternates[i];
  3728. this.set(alternate, cls);
  3729. }
  3730. });
  3731. Ext.apply(Ext, {
  3732. create: alias(Manager, 'instantiate'),
  3733. widget: function(name, config) {
  3734. var xtype = name,
  3735. alias, className, T, load;
  3736. if (typeof xtype != 'string') {
  3737. config = name;
  3738. xtype = config.xtype;
  3739. } else {
  3740. config = config || {};
  3741. }
  3742. if (config.isComponent) {
  3743. return config;
  3744. }
  3745. alias = 'widget.' + xtype;
  3746. className = Manager.getNameByAlias(alias);
  3747. if (!className) {
  3748. load = true;
  3749. }
  3750. T = Manager.get(className);
  3751. if (load || !T) {
  3752. return Manager.instantiateByAlias(alias, config);
  3753. }
  3754. return new T(config);
  3755. },
  3756. createByAlias: alias(Manager, 'instantiateByAlias'),
  3757. define: function (className, data, createdFn) {
  3758. if (data.override) {
  3759. return Manager.createOverride.apply(Manager, arguments);
  3760. }
  3761. return Manager.create.apply(Manager, arguments);
  3762. },
  3763. getClassName: alias(Manager, 'getName'),
  3764. getDisplayName: function(object) {
  3765. if (object) {
  3766. if (object.displayName) {
  3767. return object.displayName;
  3768. }
  3769. if (object.$name && object.$class) {
  3770. return Ext.getClassName(object.$class) + '#' + object.$name;
  3771. }
  3772. if (object.$className) {
  3773. return object.$className;
  3774. }
  3775. }
  3776. return 'Anonymous';
  3777. },
  3778. getClass: alias(Manager, 'getClass'),
  3779. namespace: alias(Manager, 'createNamespaces')
  3780. });
  3781. Ext.createWidget = Ext.widget;
  3782. Ext.ns = Ext.namespace;
  3783. Class.registerPreprocessor('className', function(cls, data) {
  3784. if (data.$className) {
  3785. cls.$className = data.$className;
  3786. }
  3787. }, true, 'first');
  3788. Class.registerPreprocessor('alias', function(cls, data) {
  3789. var prototype = cls.prototype,
  3790. xtypes = arrayFrom(data.xtype),
  3791. aliases = arrayFrom(data.alias),
  3792. widgetPrefix = 'widget.',
  3793. widgetPrefixLength = widgetPrefix.length,
  3794. xtypesChain = Array.prototype.slice.call(prototype.xtypesChain || []),
  3795. xtypesMap = Ext.merge({}, prototype.xtypesMap || {}),
  3796. i, ln, alias, xtype;
  3797. for (i = 0,ln = aliases.length; i < ln; i++) {
  3798. alias = aliases[i];
  3799. if (alias.substring(0, widgetPrefixLength) === widgetPrefix) {
  3800. xtype = alias.substring(widgetPrefixLength);
  3801. Ext.Array.include(xtypes, xtype);
  3802. }
  3803. }
  3804. cls.xtype = data.xtype = xtypes[0];
  3805. data.xtypes = xtypes;
  3806. for (i = 0,ln = xtypes.length; i < ln; i++) {
  3807. xtype = xtypes[i];
  3808. if (!xtypesMap[xtype]) {
  3809. xtypesMap[xtype] = true;
  3810. xtypesChain.push(xtype);
  3811. }
  3812. }
  3813. data.xtypesChain = xtypesChain;
  3814. data.xtypesMap = xtypesMap;
  3815. Ext.Function.interceptAfter(data, 'onClassCreated', function() {
  3816. var mixins = prototype.mixins,
  3817. key, mixin;
  3818. for (key in mixins) {
  3819. if (mixins.hasOwnProperty(key)) {
  3820. mixin = mixins[key];
  3821. xtypes = mixin.xtypes;
  3822. if (xtypes) {
  3823. for (i = 0,ln = xtypes.length; i < ln; i++) {
  3824. xtype = xtypes[i];
  3825. if (!xtypesMap[xtype]) {
  3826. xtypesMap[xtype] = true;
  3827. xtypesChain.push(xtype);
  3828. }
  3829. }
  3830. }
  3831. }
  3832. }
  3833. });
  3834. for (i = 0,ln = xtypes.length; i < ln; i++) {
  3835. xtype = xtypes[i];
  3836. Ext.Array.include(aliases, widgetPrefix + xtype);
  3837. }
  3838. data.alias = aliases;
  3839. }, ['xtype', 'alias']);
  3840. }(Ext.Class, Ext.Function.alias, Array.prototype.slice, Ext.Array.from, Ext.global));
  3841. //@tag foundation,core
  3842. //@require ClassManager.js
  3843. //@define Ext.Loader
  3844. Ext.Loader = new function() {
  3845. var Loader = this,
  3846. Manager = Ext.ClassManager,
  3847. Class = Ext.Class,
  3848. flexSetter = Ext.Function.flexSetter,
  3849. alias = Ext.Function.alias,
  3850. pass = Ext.Function.pass,
  3851. defer = Ext.Function.defer,
  3852. arrayErase = Ext.Array.erase,
  3853. dependencyProperties = ['extend', 'mixins', 'requires'],
  3854. isInHistory = {},
  3855. history = [],
  3856. slashDotSlashRe = /\/\.\//g,
  3857. dotRe = /\./g;
  3858. Ext.apply(Loader, {
  3859. isInHistory: isInHistory,
  3860. history: history,
  3861. config: {
  3862. enabled: false,
  3863. scriptChainDelay : false,
  3864. disableCaching: true,
  3865. disableCachingParam: '_dc',
  3866. garbageCollect : false,
  3867. paths: {
  3868. 'Ext': '.'
  3869. },
  3870. preserveScripts : true,
  3871. scriptCharset : undefined
  3872. },
  3873. setConfig: function(name, value) {
  3874. if (Ext.isObject(name) && arguments.length === 1) {
  3875. Ext.merge(Loader.config, name);
  3876. }
  3877. else {
  3878. Loader.config[name] = (Ext.isObject(value)) ? Ext.merge(Loader.config[name], value) : value;
  3879. }
  3880. return Loader;
  3881. },
  3882. getConfig: function(name) {
  3883. if (name) {
  3884. return Loader.config[name];
  3885. }
  3886. return Loader.config;
  3887. },
  3888. setPath: flexSetter(function(name, path) {
  3889. Loader.config.paths[name] = path;
  3890. return Loader;
  3891. }),
  3892. addClassPathMappings: function(paths) {
  3893. var name;
  3894. for(name in paths){
  3895. Loader.config.paths[name] = paths[name];
  3896. }
  3897. return Loader;
  3898. },
  3899. getPath: function(className) {
  3900. var path = '',
  3901. paths = Loader.config.paths,
  3902. prefix = Loader.getPrefix(className);
  3903. if (prefix.length > 0) {
  3904. if (prefix === className) {
  3905. return paths[prefix];
  3906. }
  3907. path = paths[prefix];
  3908. className = className.substring(prefix.length + 1);
  3909. }
  3910. if (path.length > 0) {
  3911. path += '/';
  3912. }
  3913. return path.replace(slashDotSlashRe, '/') + className.replace(dotRe, "/") + '.js';
  3914. },
  3915. getPrefix: function(className) {
  3916. var paths = Loader.config.paths,
  3917. prefix, deepestPrefix = '';
  3918. if (paths.hasOwnProperty(className)) {
  3919. return className;
  3920. }
  3921. for (prefix in paths) {
  3922. if (paths.hasOwnProperty(prefix) && prefix + '.' === className.substring(0, prefix.length + 1)) {
  3923. if (prefix.length > deepestPrefix.length) {
  3924. deepestPrefix = prefix;
  3925. }
  3926. }
  3927. }
  3928. return deepestPrefix;
  3929. },
  3930. isAClassNameWithAKnownPrefix: function(className) {
  3931. var prefix = Loader.getPrefix(className);
  3932. return prefix !== '' && prefix !== className;
  3933. },
  3934. require: function(expressions, fn, scope, excludes) {
  3935. if (fn) {
  3936. fn.call(scope);
  3937. }
  3938. },
  3939. syncRequire: function() {},
  3940. exclude: function(excludes) {
  3941. return {
  3942. require: function(expressions, fn, scope) {
  3943. return Loader.require(expressions, fn, scope, excludes);
  3944. },
  3945. syncRequire: function(expressions, fn, scope) {
  3946. return Loader.syncRequire(expressions, fn, scope, excludes);
  3947. }
  3948. };
  3949. },
  3950. onReady: function(fn, scope, withDomReady, options) {
  3951. var oldFn;
  3952. if (withDomReady !== false && Ext.onDocumentReady) {
  3953. oldFn = fn;
  3954. fn = function() {
  3955. Ext.onDocumentReady(oldFn, scope, options);
  3956. };
  3957. }
  3958. fn.call(scope);
  3959. }
  3960. });
  3961. var queue = [],
  3962. isClassFileLoaded = {},
  3963. isFileLoaded = {},
  3964. classNameToFilePathMap = {},
  3965. scriptElements = {},
  3966. readyListeners = [],
  3967. usedClasses = [],
  3968. requiresMap = {};
  3969. Ext.apply(Loader, {
  3970. documentHead: typeof document != 'undefined' && (document.head || document.getElementsByTagName('head')[0]),
  3971. isLoading: false,
  3972. queue: queue,
  3973. isClassFileLoaded: isClassFileLoaded,
  3974. isFileLoaded: isFileLoaded,
  3975. readyListeners: readyListeners,
  3976. optionalRequires: usedClasses,
  3977. requiresMap: requiresMap,
  3978. numPendingFiles: 0,
  3979. numLoadedFiles: 0,
  3980. hasFileLoadError: false,
  3981. classNameToFilePathMap: classNameToFilePathMap,
  3982. scriptsLoading: 0,
  3983. syncModeEnabled: false,
  3984. scriptElements: scriptElements,
  3985. refreshQueue: function() {
  3986. var ln = queue.length,
  3987. i, item, j, requires;
  3988. if (!ln && !Loader.scriptsLoading) {
  3989. return Loader.triggerReady();
  3990. }
  3991. for (i = 0; i < ln; i++) {
  3992. item = queue[i];
  3993. if (item) {
  3994. requires = item.requires;
  3995. if (requires.length > Loader.numLoadedFiles) {
  3996. continue;
  3997. }
  3998. for (j = 0; j < requires.length; ) {
  3999. if (Manager.isCreated(requires[j])) {
  4000. arrayErase(requires, j, 1);
  4001. }
  4002. else {
  4003. j++;
  4004. }
  4005. }
  4006. if (item.requires.length === 0) {
  4007. arrayErase(queue, i, 1);
  4008. item.callback.call(item.scope);
  4009. Loader.refreshQueue();
  4010. break;
  4011. }
  4012. }
  4013. }
  4014. return Loader;
  4015. },
  4016. injectScriptElement: function(url, onLoad, onError, scope, charset) {
  4017. var script = document.createElement('script'),
  4018. dispatched = false,
  4019. config = Loader.config,
  4020. onLoadFn = function() {
  4021. if(!dispatched) {
  4022. dispatched = true;
  4023. script.onload = script.onreadystatechange = script.onerror = null;
  4024. if (typeof config.scriptChainDelay == 'number') {
  4025. defer(onLoad, config.scriptChainDelay, scope);
  4026. } else {
  4027. onLoad.call(scope);
  4028. }
  4029. Loader.cleanupScriptElement(script, config.preserveScripts === false, config.garbageCollect);
  4030. }
  4031. },
  4032. onErrorFn = function(arg) {
  4033. defer(onError, 1, scope);
  4034. Loader.cleanupScriptElement(script, config.preserveScripts === false, config.garbageCollect);
  4035. };
  4036. script.type = 'text/javascript';
  4037. script.onerror = onErrorFn;
  4038. charset = charset || config.scriptCharset;
  4039. if (charset) {
  4040. script.charset = charset;
  4041. }
  4042. if ('addEventListener' in script ) {
  4043. script.onload = onLoadFn;
  4044. } else if ('readyState' in script) {
  4045. script.onreadystatechange = function() {
  4046. if ( this.readyState == 'loaded' || this.readyState == 'complete' ) {
  4047. onLoadFn();
  4048. }
  4049. };
  4050. } else {
  4051. script.onload = onLoadFn;
  4052. }
  4053. script.src = url;
  4054. (Loader.documentHead || document.getElementsByTagName('head')[0]).appendChild(script);
  4055. return script;
  4056. },
  4057. removeScriptElement: function(url) {
  4058. if (scriptElements[url]) {
  4059. Loader.cleanupScriptElement(scriptElements[url], true, !!Loader.getConfig('garbageCollect'));
  4060. delete scriptElements[url];
  4061. }
  4062. return Loader;
  4063. },
  4064. cleanupScriptElement: function(script, remove, collect) {
  4065. var prop;
  4066. script.onload = script.onreadystatechange = script.onerror = null;
  4067. if (remove) {
  4068. Ext.removeNode(script);
  4069. if (collect) {
  4070. for (prop in script) {
  4071. try {
  4072. script[prop] = null;
  4073. delete script[prop];
  4074. } catch (cleanEx) {
  4075. }
  4076. }
  4077. }
  4078. }
  4079. return Loader;
  4080. },
  4081. loadScript: function (options) {
  4082. var config = Loader.getConfig(),
  4083. isString = typeof options == 'string',
  4084. url = isString ? options : options.url,
  4085. onError = !isString && options.onError,
  4086. onLoad = !isString && options.onLoad,
  4087. scope = !isString && options.scope,
  4088. onScriptError = function() {
  4089. Loader.numPendingFiles--;
  4090. Loader.scriptsLoading--;
  4091. if (onError) {
  4092. onError.call(scope, "Failed loading '" + url + "', please verify that the file exists");
  4093. }
  4094. if (Loader.numPendingFiles + Loader.scriptsLoading === 0) {
  4095. Loader.refreshQueue();
  4096. }
  4097. },
  4098. onScriptLoad = function () {
  4099. Loader.numPendingFiles--;
  4100. Loader.scriptsLoading--;
  4101. if (onLoad) {
  4102. onLoad.call(scope);
  4103. }
  4104. if (Loader.numPendingFiles + Loader.scriptsLoading === 0) {
  4105. Loader.refreshQueue();
  4106. }
  4107. },
  4108. src;
  4109. Loader.isLoading = true;
  4110. Loader.numPendingFiles++;
  4111. Loader.scriptsLoading++;
  4112. src = config.disableCaching ?
  4113. (url + '?' + config.disableCachingParam + '=' + Ext.Date.now()) : url;
  4114. scriptElements[url] = Loader.injectScriptElement(src, onScriptLoad, onScriptError);
  4115. },
  4116. loadScriptFile: function(url, onLoad, onError, scope, synchronous) {
  4117. if (isFileLoaded[url]) {
  4118. return Loader;
  4119. }
  4120. var config = Loader.getConfig(),
  4121. noCacheUrl = url + (config.disableCaching ? ('?' + config.disableCachingParam + '=' + Ext.Date.now()) : ''),
  4122. isCrossOriginRestricted = false,
  4123. xhr, status, onScriptError,
  4124. debugSourceURL = "";
  4125. scope = scope || Loader;
  4126. Loader.isLoading = true;
  4127. if (!synchronous) {
  4128. onScriptError = function() {
  4129. };
  4130. scriptElements[url] = Loader.injectScriptElement(noCacheUrl, onLoad, onScriptError, scope);
  4131. } else {
  4132. if (typeof XMLHttpRequest != 'undefined') {
  4133. xhr = new XMLHttpRequest();
  4134. } else {
  4135. xhr = new ActiveXObject('Microsoft.XMLHTTP');
  4136. }
  4137. try {
  4138. xhr.open('GET', noCacheUrl, false);
  4139. xhr.send(null);
  4140. } catch (e) {
  4141. isCrossOriginRestricted = true;
  4142. }
  4143. status = (xhr.status === 1223) ? 204 :
  4144. (xhr.status === 0 && (self.location || {}).protocol == 'file:') ? 200 : xhr.status;
  4145. isCrossOriginRestricted = isCrossOriginRestricted || (status === 0);
  4146. if (isCrossOriginRestricted
  4147. ) {
  4148. }
  4149. else if ((status >= 200 && status < 300) || (status === 304)
  4150. ) {
  4151. if (!Ext.isIE) {
  4152. debugSourceURL = "\n//@ sourceURL=" + url;
  4153. }
  4154. Ext.globalEval(xhr.responseText + debugSourceURL);
  4155. onLoad.call(scope);
  4156. }
  4157. else {
  4158. }
  4159. xhr = null;
  4160. }
  4161. },
  4162. syncRequire: function() {
  4163. var syncModeEnabled = Loader.syncModeEnabled;
  4164. if (!syncModeEnabled) {
  4165. Loader.syncModeEnabled = true;
  4166. }
  4167. Loader.require.apply(Loader, arguments);
  4168. if (!syncModeEnabled) {
  4169. Loader.syncModeEnabled = false;
  4170. }
  4171. Loader.refreshQueue();
  4172. },
  4173. require: function(expressions, fn, fail,scope, excludes) {
  4174. var excluded = {},
  4175. included = {},
  4176. excludedClassNames = [],
  4177. possibleClassNames = [],
  4178. classNames = [],
  4179. references = [],
  4180. callback,
  4181. syncModeEnabled,
  4182. filePath, expression, exclude, className,
  4183. possibleClassName, i, j, ln, subLn;
  4184. if (excludes) {
  4185. excludes = (typeof excludes === 'string') ? [ excludes ] : excludes;
  4186. for (i = 0,ln = excludes.length; i < ln; i++) {
  4187. exclude = excludes[i];
  4188. if (typeof exclude == 'string' && exclude.length > 0) {
  4189. excludedClassNames = Manager.getNamesByExpression(exclude);
  4190. for (j = 0,subLn = excludedClassNames.length; j < subLn; j++) {
  4191. excluded[excludedClassNames[j]] = true;
  4192. }
  4193. }
  4194. }
  4195. }
  4196. expressions = (typeof expressions === 'string') ? [ expressions ] : (expressions ? expressions : []);
  4197. if (fn) {
  4198. if (fn.length > 0) {
  4199. callback = function() {
  4200. var classes = [],
  4201. i, ln;
  4202. for (i = 0,ln = references.length; i < ln; i++) {
  4203. classes.push(Manager.get(references[i]));
  4204. }
  4205. return fn.apply(this, classes);
  4206. };
  4207. }
  4208. else {
  4209. callback = fn;
  4210. }
  4211. }
  4212. else {
  4213. callback = Ext.emptyFn;
  4214. }
  4215. scope = scope || Ext.global;
  4216. for (i = 0,ln = expressions.length; i < ln; i++) {
  4217. expression = expressions[i];
  4218. if (typeof expression == 'string' && expression.length > 0) {
  4219. possibleClassNames = Manager.getNamesByExpression(expression);
  4220. subLn = possibleClassNames.length;
  4221. for (j = 0; j < subLn; j++) {
  4222. possibleClassName = possibleClassNames[j];
  4223. if (excluded[possibleClassName] !== true) {
  4224. references.push(possibleClassName);
  4225. if (!Manager.isCreated(possibleClassName) && !included[possibleClassName]) {
  4226. included[possibleClassName] = true;
  4227. classNames.push(possibleClassName);
  4228. }
  4229. }
  4230. }
  4231. }
  4232. }
  4233. if (classNames.length > 0) {
  4234. if (!Loader.config.enabled) {
  4235. throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. " +
  4236. "Missing required class" + ((classNames.length > 1) ? "es" : "") + ": " + classNames.join(', '));
  4237. }
  4238. }
  4239. else {
  4240. callback.call(scope);
  4241. return Loader;
  4242. }
  4243. syncModeEnabled = Loader.syncModeEnabled;
  4244. if (!syncModeEnabled) {
  4245. queue.push({
  4246. requires: classNames.slice(),
  4247. callback: callback,
  4248. scope: scope
  4249. });
  4250. }
  4251. ln = classNames.length;
  4252. for (i = 0; i < ln; i++) {
  4253. className = classNames[i];
  4254. filePath = Loader.getPath(className);
  4255. if (syncModeEnabled && isClassFileLoaded.hasOwnProperty(className)) {
  4256. Loader.numPendingFiles--;
  4257. Loader.removeScriptElement(filePath);
  4258. delete isClassFileLoaded[className];
  4259. }
  4260. if (!isClassFileLoaded.hasOwnProperty(className)) {
  4261. isClassFileLoaded[className] = false;
  4262. classNameToFilePathMap[className] = filePath;
  4263. Loader.numPendingFiles++;
  4264. Loader.loadScriptFile(
  4265. filePath,
  4266. pass(Loader.onFileLoaded, [className, filePath], Loader),
  4267. pass(Loader.onFileLoadError, [className, filePath,fail,scope], Loader),
  4268. Loader,
  4269. syncModeEnabled
  4270. );
  4271. }
  4272. }
  4273. if (syncModeEnabled) {
  4274. callback.call(scope);
  4275. if (ln === 1) {
  4276. return Manager.get(className);
  4277. }
  4278. }
  4279. return Loader;
  4280. },
  4281. onFileLoaded: function(className, filePath) {
  4282. Loader.numLoadedFiles++;
  4283. isClassFileLoaded[className] = true;
  4284. isFileLoaded[filePath] = true;
  4285. Loader.numPendingFiles--;
  4286. if (Loader.numPendingFiles === 0) {
  4287. Loader.refreshQueue();
  4288. }
  4289. },
  4290. onFileLoadError: function(className, filePath,fail,scope,errorMessage, isSynchronous) {
  4291. Loader.numPendingFiles--;
  4292. Loader.hasFileLoadError = true;
  4293. fail.call(scope,className,filePath);
  4294. },
  4295. addUsedClasses: function (classes) {
  4296. var cls, i, ln;
  4297. if (classes) {
  4298. classes = (typeof classes == 'string') ? [classes] : classes;
  4299. for (i = 0, ln = classes.length; i < ln; i++) {
  4300. cls = classes[i];
  4301. if (typeof cls == 'string' && !Ext.Array.contains(usedClasses, cls)) {
  4302. usedClasses.push(cls);
  4303. }
  4304. }
  4305. }
  4306. return Loader;
  4307. },
  4308. triggerReady: function() {
  4309. var listener,
  4310. i, refClasses = usedClasses;
  4311. if (Loader.isLoading) {
  4312. Loader.isLoading = false;
  4313. if (refClasses.length !== 0) {
  4314. refClasses = refClasses.slice();
  4315. usedClasses.length = 0;
  4316. Loader.require(refClasses, Loader.triggerReady, Loader);
  4317. return Loader;
  4318. }
  4319. }
  4320. while (readyListeners.length && !Loader.isLoading) {
  4321. listener = readyListeners.shift();
  4322. listener.fn.call(listener.scope);
  4323. }
  4324. return Loader;
  4325. },
  4326. onReady: function(fn, scope, withDomReady, options) {
  4327. var oldFn;
  4328. if (withDomReady !== false && Ext.onDocumentReady) {
  4329. oldFn = fn;
  4330. fn = function() {
  4331. Ext.onDocumentReady(oldFn, scope, options);
  4332. };
  4333. }
  4334. if (!Loader.isLoading) {
  4335. fn.call(scope);
  4336. }
  4337. else {
  4338. readyListeners.push({
  4339. fn: fn,
  4340. scope: scope
  4341. });
  4342. }
  4343. },
  4344. historyPush: function(className) {
  4345. if (className && isClassFileLoaded.hasOwnProperty(className) && !isInHistory[className]) {
  4346. isInHistory[className] = true;
  4347. history.push(className);
  4348. }
  4349. return Loader;
  4350. }
  4351. });
  4352. Ext.disableCacheBuster = function (disable, path) {
  4353. var date = new Date();
  4354. date.setTime(date.getTime() + (disable ? 10*365 : -1) * 24*60*60*1000);
  4355. date = date.toGMTString();
  4356. document.cookie = 'ext-cache=1; expires=' + date + '; path='+(path || '/');
  4357. };
  4358. Ext.require = alias(Loader, 'require');
  4359. Ext.syncRequire = alias(Loader, 'syncRequire');
  4360. Ext.exclude = alias(Loader, 'exclude');
  4361. Ext.onReady = function(fn, scope, options) {
  4362. Loader.onReady(fn, scope, true, options);
  4363. };
  4364. Class.registerPreprocessor('loader', function(cls, data, hooks, continueFn) {
  4365. var me = this,
  4366. dependencies = [],
  4367. dependency,
  4368. className = Manager.getName(cls),
  4369. i, j, ln, subLn, value, propertyName, propertyValue,
  4370. requiredMap, requiredDep;
  4371. for (i = 0,ln = dependencyProperties.length; i < ln; i++) {
  4372. propertyName = dependencyProperties[i];
  4373. if (data.hasOwnProperty(propertyName)) {
  4374. propertyValue = data[propertyName];
  4375. if (typeof propertyValue == 'string') {
  4376. dependencies.push(propertyValue);
  4377. }
  4378. else if (propertyValue instanceof Array) {
  4379. for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
  4380. value = propertyValue[j];
  4381. if (typeof value == 'string') {
  4382. dependencies.push(value);
  4383. }
  4384. }
  4385. }
  4386. else if (typeof propertyValue != 'function') {
  4387. for (j in propertyValue) {
  4388. if (propertyValue.hasOwnProperty(j)) {
  4389. value = propertyValue[j];
  4390. if (typeof value == 'string') {
  4391. dependencies.push(value);
  4392. }
  4393. }
  4394. }
  4395. }
  4396. }
  4397. }
  4398. if (dependencies.length === 0) {
  4399. return;
  4400. }
  4401. Loader.require(dependencies, function() {
  4402. for (i = 0,ln = dependencyProperties.length; i < ln; i++) {
  4403. propertyName = dependencyProperties[i];
  4404. if (data.hasOwnProperty(propertyName)) {
  4405. propertyValue = data[propertyName];
  4406. if (typeof propertyValue == 'string') {
  4407. data[propertyName] = Manager.get(propertyValue);
  4408. }
  4409. else if (propertyValue instanceof Array) {
  4410. for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
  4411. value = propertyValue[j];
  4412. if (typeof value == 'string') {
  4413. data[propertyName][j] = Manager.get(value);
  4414. }
  4415. }
  4416. }
  4417. else if (typeof propertyValue != 'function') {
  4418. for (var k in propertyValue) {
  4419. if (propertyValue.hasOwnProperty(k)) {
  4420. value = propertyValue[k];
  4421. if (typeof value == 'string') {
  4422. data[propertyName][k] = Manager.get(value);
  4423. }
  4424. }
  4425. }
  4426. }
  4427. }
  4428. }
  4429. continueFn.call(me, cls, data, hooks);
  4430. });
  4431. return false;
  4432. }, true, 'after', 'className');
  4433. Manager.registerPostprocessor('uses', function(name, cls, data) {
  4434. var uses = data.uses;
  4435. if (uses) {
  4436. Loader.addUsedClasses(uses);
  4437. }
  4438. });
  4439. Manager.onCreated(Loader.historyPush);
  4440. };
  4441. if (Ext._classPathMetadata) {
  4442. Ext.Loader.addClassPathMappings(Ext._classPathMetadata);
  4443. Ext._classPathMetadata = null;
  4444. }
  4445. (function() {
  4446. var scripts = document.getElementsByTagName('script'),
  4447. currentScript = scripts[scripts.length - 1],
  4448. src = currentScript.src,
  4449. path = src.substring(0, src.lastIndexOf('/') + 1),
  4450. Loader = Ext.Loader;
  4451. Loader.setConfig({
  4452. enabled: true,
  4453. disableCaching: true,
  4454. paths: {
  4455. 'Ext': path + 'src'
  4456. }
  4457. });
  4458. })();
  4459. Ext._endTime = new Date().getTime();
  4460. if (Ext._beforereadyhandler){
  4461. Ext._beforereadyhandler();
  4462. }
  4463. //@tag foundation,core
  4464. //@require ../class/Loader.js
  4465. Ext.Error = Ext.extend(Error, {
  4466. statics: {
  4467. ignore: false,
  4468. raise: function(err){
  4469. err = err || {};
  4470. if (Ext.isString(err)) {
  4471. err = { msg: err };
  4472. }
  4473. var method = this.raise.caller,
  4474. msg;
  4475. if (method) {
  4476. if (method.$name) {
  4477. err.sourceMethod = method.$name;
  4478. }
  4479. if (method.$owner) {
  4480. err.sourceClass = method.$owner.$className;
  4481. }
  4482. }
  4483. if (Ext.Error.handle(err) !== true) {
  4484. msg = Ext.Error.prototype.toString.call(err);
  4485. Ext.log({
  4486. msg: msg,
  4487. level: 'error',
  4488. dump: err,
  4489. stack: true
  4490. });
  4491. throw new Ext.Error(err);
  4492. }
  4493. },
  4494. handle: function(){
  4495. return Ext.Error.ignore;
  4496. }
  4497. },
  4498. name: 'Ext.Error',
  4499. constructor: function(config){
  4500. if (Ext.isString(config)) {
  4501. config = { msg: config };
  4502. }
  4503. var me = this;
  4504. Ext.apply(me, config);
  4505. me.message = me.message || me.msg;
  4506. },
  4507. toString: function(){
  4508. var me = this,
  4509. className = me.sourceClass ? me.sourceClass : '',
  4510. methodName = me.sourceMethod ? '.' + me.sourceMethod + '(): ' : '',
  4511. msg = me.msg || '(No description provided)';
  4512. return className + methodName + msg;
  4513. }
  4514. });
  4515. Ext.deprecated = function (suggestion) {
  4516. return Ext.emptyFn;
  4517. };
  4518. //@tag extras,core
  4519. //@require ../lang/Error.js
  4520. Ext.JSON = (new(function() {
  4521. var me = this,
  4522. encodingFunction,
  4523. decodingFunction,
  4524. useNative = null,
  4525. useHasOwn = !! {}.hasOwnProperty,
  4526. isNative = function() {
  4527. if (useNative === null) {
  4528. useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
  4529. }
  4530. return useNative;
  4531. },
  4532. pad = function(n) {
  4533. return n < 10 ? "0" + n : n;
  4534. },
  4535. doDecode = function(json) {
  4536. return eval("(" + json + ')');
  4537. },
  4538. doEncode = function(o, newline) {
  4539. if (o === null || o === undefined) {
  4540. return "null";
  4541. } else if (Ext.isDate(o)) {
  4542. return Ext.JSON.encodeDate(o);
  4543. } else if (Ext.isString(o)) {
  4544. return Ext.JSON.encodeString(o);
  4545. } else if (typeof o == "number") {
  4546. return isFinite(o) ? String(o) : "null";
  4547. } else if (Ext.isBoolean(o)) {
  4548. return String(o);
  4549. }
  4550. else if (o.toJSON) {
  4551. return o.toJSON();
  4552. } else if (Ext.isArray(o)) {
  4553. return encodeArray(o, newline);
  4554. } else if (Ext.isObject(o)) {
  4555. return encodeObject(o, newline);
  4556. } else if (typeof o === "function") {
  4557. return "null";
  4558. }
  4559. return 'undefined';
  4560. },
  4561. m = {
  4562. "\b": '\\b',
  4563. "\t": '\\t',
  4564. "\n": '\\n',
  4565. "\f": '\\f',
  4566. "\r": '\\r',
  4567. '"': '\\"',
  4568. "\\": '\\\\',
  4569. '\x0b': '\\u000b'
  4570. },
  4571. charToReplace = /[\\\"\x00-\x1f\x7f-\uffff]/g,
  4572. encodeString = function(s) {
  4573. return '"' + s.replace(charToReplace, function(a) {
  4574. var c = m[a];
  4575. return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  4576. }) + '"';
  4577. },
  4578. encodeArray = function(o, newline) {
  4579. var a = ["[", ""],
  4580. len = o.length,
  4581. i;
  4582. for (i = 0; i < len; i += 1) {
  4583. a.push(Ext.JSON.encodeValue(o[i]), ',');
  4584. }
  4585. a[a.length - 1] = ']';
  4586. return a.join("");
  4587. },
  4588. encodeObject = function(o, newline) {
  4589. var a = ["{", ""],
  4590. i;
  4591. for (i in o) {
  4592. if (!useHasOwn || o.hasOwnProperty(i)) {
  4593. a.push(Ext.JSON.encodeValue(i), ":", Ext.JSON.encodeValue(o[i]), ',');
  4594. }
  4595. }
  4596. a[a.length - 1] = '}';
  4597. return a.join("");
  4598. };
  4599. me.encodeString = encodeString;
  4600. me.encodeValue = doEncode;
  4601. me.encodeDate = function(o) {
  4602. return '"' + o.getFullYear() + "-"
  4603. + pad(o.getMonth() + 1) + "-"
  4604. + pad(o.getDate()) + "T"
  4605. + pad(o.getHours()) + ":"
  4606. + pad(o.getMinutes()) + ":"
  4607. + pad(o.getSeconds()) + '"';
  4608. };
  4609. me.encode = function(o) {
  4610. if (!encodingFunction) {
  4611. encodingFunction = isNative() ? JSON.stringify : me.encodeValue;
  4612. }
  4613. return encodingFunction(o);
  4614. };
  4615. me.decode = function(json, safe) {
  4616. if (!decodingFunction) {
  4617. decodingFunction = isNative() ? JSON.parse : doDecode;
  4618. }
  4619. try {
  4620. return decodingFunction(json);
  4621. } catch (e) {
  4622. if (safe === true) {
  4623. return null;
  4624. }
  4625. Ext.Error.raise({
  4626. sourceClass: "Ext.JSON",
  4627. sourceMethod: "decode",
  4628. msg: "You're trying to decode an invalid JSON String: " + json
  4629. });
  4630. }
  4631. };
  4632. })());
  4633. Ext.encode = Ext.JSON.encode;
  4634. Ext.decode = Ext.JSON.decode;
  4635. //@tag extras,core
  4636. //@require misc/JSON.js
  4637. Ext.apply(Ext, {
  4638. userAgent: navigator.userAgent.toLowerCase(),
  4639. cache: {},
  4640. idSeed: 1000,
  4641. windowId: 'ext-window',
  4642. documentId: 'ext-document',
  4643. isReady: false,
  4644. enableGarbageCollector: true,
  4645. enableListenerCollection: true,
  4646. addCacheEntry: function(id, el, dom) {
  4647. dom = dom || el.dom;
  4648. var key = id || (el && el.id) || dom.id,
  4649. entry = Ext.cache[key] || (Ext.cache[key] = {
  4650. data: {},
  4651. events: {},
  4652. dom: dom,
  4653. skipGarbageCollection: !!(dom.getElementById || dom.navigator)
  4654. });
  4655. if (el) {
  4656. el.$cache = entry;
  4657. entry.el = el;
  4658. }
  4659. return entry;
  4660. },
  4661. updateCacheEntry: function(cacheItem, dom){
  4662. cacheItem.dom = dom;
  4663. if (cacheItem.el) {
  4664. cacheItem.el.dom = dom;
  4665. }
  4666. return cacheItem;
  4667. },
  4668. id: function(el, prefix) {
  4669. var me = this,
  4670. sandboxPrefix = '';
  4671. el = Ext.getDom(el, true) || {};
  4672. if (el === document) {
  4673. el.id = me.documentId;
  4674. }
  4675. else if (el === window) {
  4676. el.id = me.windowId;
  4677. }
  4678. if (!el.id) {
  4679. if (me.isSandboxed) {
  4680. sandboxPrefix = Ext.sandboxName.toLowerCase() + '-';
  4681. }
  4682. el.id = sandboxPrefix + (prefix || "ext-gen") + (++Ext.idSeed);
  4683. }
  4684. return el.id;
  4685. },
  4686. escapeId: (function(){
  4687. var validIdRe = /^[a-zA-Z_][a-zA-Z0-9_\-]*$/i,
  4688. escapeRx = /([\W]{1})/g,
  4689. leadingNumRx = /^(\d)/g,
  4690. escapeFn = function(match, capture){
  4691. return "\\" + capture;
  4692. },
  4693. numEscapeFn = function(match, capture){
  4694. return '\\00' + capture.charCodeAt(0).toString(16) + ' ';
  4695. };
  4696. return function(id) {
  4697. return validIdRe.test(id)
  4698. ? id
  4699. : id.replace(escapeRx, escapeFn)
  4700. .replace(leadingNumRx, numEscapeFn);
  4701. };
  4702. }()),
  4703. getBody: (function() {
  4704. var body;
  4705. return function() {
  4706. return body || (body = Ext.get(document.body));
  4707. };
  4708. }()),
  4709. getHead: (function() {
  4710. var head;
  4711. return function() {
  4712. return head || (head = Ext.get(document.getElementsByTagName("head")[0]));
  4713. };
  4714. }()),
  4715. getDoc: (function() {
  4716. var doc;
  4717. return function() {
  4718. return doc || (doc = Ext.get(document));
  4719. };
  4720. }()),
  4721. getCmp: function(id) {
  4722. return Ext.ComponentManager.get(id);
  4723. },
  4724. getOrientation: function() {
  4725. return window.innerHeight > window.innerWidth ? 'portrait' : 'landscape';
  4726. },
  4727. destroy: function() {
  4728. var ln = arguments.length,
  4729. i, arg;
  4730. for (i = 0; i < ln; i++) {
  4731. arg = arguments[i];
  4732. if (arg) {
  4733. if (Ext.isArray(arg)) {
  4734. this.destroy.apply(this, arg);
  4735. }
  4736. else if (Ext.isFunction(arg.destroy)) {
  4737. arg.destroy();
  4738. }
  4739. else if (arg.dom) {
  4740. arg.remove();
  4741. }
  4742. }
  4743. }
  4744. },
  4745. callback: function(callback, scope, args, delay){
  4746. if(Ext.isFunction(callback)){
  4747. args = args || [];
  4748. scope = scope || window;
  4749. if (delay) {
  4750. Ext.defer(callback, delay, scope, args);
  4751. } else {
  4752. callback.apply(scope, args);
  4753. }
  4754. }
  4755. },
  4756. htmlEncode : function(value) {
  4757. return Ext.String.htmlEncode(value);
  4758. },
  4759. htmlDecode : function(value) {
  4760. return Ext.String.htmlDecode(value);
  4761. },
  4762. urlAppend : function(url, s) {
  4763. return Ext.String.urlAppend(url, s);
  4764. }
  4765. });
  4766. Ext.ns = Ext.namespace;
  4767. window.undefined = window.undefined;
  4768. (function(){
  4769. var check = function(regex){
  4770. return regex.test(Ext.userAgent);
  4771. },
  4772. isStrict = document.compatMode == "CSS1Compat",
  4773. version = function (is, regex) {
  4774. var m;
  4775. return (is && (m = regex.exec(Ext.userAgent))) ? parseFloat(m[1]) : 0;
  4776. },
  4777. docMode = document.documentMode,
  4778. isOpera = check(/opera/),
  4779. isOpera10_5 = isOpera && check(/version\/10\.5/),
  4780. isChrome = check(/\bchrome\b/),
  4781. isWebKit = check(/webkit/),
  4782. isSafari = !isChrome && check(/safari/),
  4783. isSafari2 = isSafari && check(/applewebkit\/4/),
  4784. isSafari3 = isSafari && check(/version\/3/),
  4785. isSafari4 = isSafari && check(/version\/4/),
  4786. isSafari5_0 = isSafari && check(/version\/5\.0/),
  4787. isSafari5 = isSafari && check(/version\/5/),
  4788. isIE = !isOpera && check(/msie/),
  4789. isIE7 = isIE && ((check(/msie 7/) && docMode != 8 && docMode != 9) || docMode == 7),
  4790. isIE8 = isIE && ((check(/msie 8/) && docMode != 7 && docMode != 9) || docMode == 8),
  4791. isIE9 = isIE && ((check(/msie 9/) && docMode != 7 && docMode != 8) || docMode == 9),
  4792. isIE6 = isIE && check(/msie 6/),
  4793. isGecko = !isWebKit && check(/gecko/),
  4794. isGecko3 = isGecko && check(/rv:1\.9/),
  4795. isGecko4 = isGecko && check(/rv:2\.0/),
  4796. isGecko5 = isGecko && check(/rv:5\./),
  4797. isGecko10 = isGecko && check(/rv:10\./),
  4798. isFF3_0 = isGecko3 && check(/rv:1\.9\.0/),
  4799. isFF3_5 = isGecko3 && check(/rv:1\.9\.1/),
  4800. isFF3_6 = isGecko3 && check(/rv:1\.9\.2/),
  4801. isWindows = check(/windows|win32/),
  4802. isMac = check(/macintosh|mac os x/),
  4803. isLinux = check(/linux/),
  4804. scrollbarSize = null,
  4805. chromeVersion = version(true, /\bchrome\/(\d+\.\d+)/),
  4806. firefoxVersion = version(true, /\bfirefox\/(\d+\.\d+)/),
  4807. ieVersion = version(isIE, /msie (\d+\.\d+)/),
  4808. operaVersion = version(isOpera, /version\/(\d+\.\d+)/),
  4809. safariVersion = version(isSafari, /version\/(\d+\.\d+)/),
  4810. webKitVersion = version(isWebKit, /webkit\/(\d+\.\d+)/),
  4811. isSecure = /^https/i.test(window.location.protocol),
  4812. nullLog;
  4813. try {
  4814. document.execCommand("BackgroundImageCache", false, true);
  4815. } catch(e) {}
  4816. nullLog = function () {};
  4817. nullLog.info = nullLog.warn = nullLog.error = Ext.emptyFn;
  4818. Ext.setVersion('extjs', '4.1.1.1');
  4819. Ext.apply(Ext, {
  4820. SSL_SECURE_URL : isSecure && isIE ? 'javascript:\'\'' : 'about:blank',
  4821. scopeResetCSS : Ext.buildSettings.scopeResetCSS,
  4822. resetCls: Ext.buildSettings.baseCSSPrefix + 'reset',
  4823. enableNestedListenerRemoval : false,
  4824. USE_NATIVE_JSON : false,
  4825. getDom : function(el, strict) {
  4826. if (!el || !document) {
  4827. return null;
  4828. }
  4829. if (el.dom) {
  4830. return el.dom;
  4831. } else {
  4832. if (typeof el == 'string') {
  4833. var e = Ext.getElementById(el);
  4834. if (e && isIE && strict) {
  4835. if (el == e.getAttribute('id')) {
  4836. return e;
  4837. } else {
  4838. return null;
  4839. }
  4840. }
  4841. return e;
  4842. } else {
  4843. return el;
  4844. }
  4845. }
  4846. },
  4847. removeNode : isIE6 || isIE7 || isIE8
  4848. ? (function() {
  4849. var d;
  4850. return function(n){
  4851. if(n && n.tagName.toUpperCase() != 'BODY'){
  4852. (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n) : Ext.EventManager.removeAll(n);
  4853. var cache = Ext.cache,
  4854. id = n.id;
  4855. if (cache[id]) {
  4856. delete cache[id].dom;
  4857. delete cache[id];
  4858. }
  4859. if (isIE8 && n.parentNode) {
  4860. n.parentNode.removeChild(n);
  4861. }
  4862. d = d || document.createElement('div');
  4863. d.appendChild(n);
  4864. d.innerHTML = '';
  4865. }
  4866. };
  4867. }())
  4868. : function(n) {
  4869. if (n && n.parentNode && n.tagName.toUpperCase() != 'BODY') {
  4870. (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n) : Ext.EventManager.removeAll(n);
  4871. var cache = Ext.cache,
  4872. id = n.id;
  4873. if (cache[id]) {
  4874. delete cache[id].dom;
  4875. delete cache[id];
  4876. }
  4877. n.parentNode.removeChild(n);
  4878. }
  4879. },
  4880. isStrict: isStrict,
  4881. isIEQuirks: isIE && !isStrict,
  4882. isOpera : isOpera,
  4883. isOpera10_5 : isOpera10_5,
  4884. isWebKit : isWebKit,
  4885. isChrome : isChrome,
  4886. isSafari : isSafari,
  4887. isSafari3 : isSafari3,
  4888. isSafari4 : isSafari4,
  4889. isSafari5 : isSafari5,
  4890. isSafari5_0 : isSafari5_0,
  4891. isSafari2 : isSafari2,
  4892. isIE : isIE,
  4893. isIE6 : isIE6,
  4894. isIE7 : isIE7,
  4895. isIE8 : isIE8,
  4896. isIE9 : isIE9,
  4897. isGecko : isGecko,
  4898. isGecko3 : isGecko3,
  4899. isGecko4 : isGecko4,
  4900. isGecko5 : isGecko5,
  4901. isGecko10 : isGecko10,
  4902. isFF3_0 : isFF3_0,
  4903. isFF3_5 : isFF3_5,
  4904. isFF3_6 : isFF3_6,
  4905. isFF4 : 4 <= firefoxVersion && firefoxVersion < 5,
  4906. isFF5 : 5 <= firefoxVersion && firefoxVersion < 6,
  4907. isFF10 : 10 <= firefoxVersion && firefoxVersion < 11,
  4908. isLinux : isLinux,
  4909. isWindows : isWindows,
  4910. isMac : isMac,
  4911. chromeVersion: chromeVersion,
  4912. firefoxVersion: firefoxVersion,
  4913. ieVersion: ieVersion,
  4914. operaVersion: operaVersion,
  4915. safariVersion: safariVersion,
  4916. webKitVersion: webKitVersion,
  4917. isSecure: isSecure,
  4918. BLANK_IMAGE_URL : (isIE6 || isIE7) ? '/' + '/www.sencha.com/s.gif' : 'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',
  4919. value : function(v, defaultValue, allowBlank){
  4920. return Ext.isEmpty(v, allowBlank) ? defaultValue : v;
  4921. },
  4922. escapeRe : function(s) {
  4923. return s.replace(/([-.*+?\^${}()|\[\]\/\\])/g, "\\$1");
  4924. },
  4925. addBehaviors : function(o){
  4926. if(!Ext.isReady){
  4927. Ext.onReady(function(){
  4928. Ext.addBehaviors(o);
  4929. });
  4930. } else {
  4931. var cache = {},
  4932. parts,
  4933. b,
  4934. s;
  4935. for (b in o) {
  4936. if ((parts = b.split('@'))[1]) {
  4937. s = parts[0];
  4938. if(!cache[s]){
  4939. cache[s] = Ext.select(s);
  4940. }
  4941. cache[s].on(parts[1], o[b]);
  4942. }
  4943. }
  4944. cache = null;
  4945. }
  4946. },
  4947. getScrollbarSize: function (force) {
  4948. if (!Ext.isReady) {
  4949. return {};
  4950. }
  4951. if (force || !scrollbarSize) {
  4952. var db = document.body,
  4953. div = document.createElement('div');
  4954. div.style.width = div.style.height = '100px';
  4955. div.style.overflow = 'scroll';
  4956. div.style.position = 'absolute';
  4957. db.appendChild(div);
  4958. scrollbarSize = {
  4959. width: div.offsetWidth - div.clientWidth,
  4960. height: div.offsetHeight - div.clientHeight
  4961. };
  4962. db.removeChild(div);
  4963. }
  4964. return scrollbarSize;
  4965. },
  4966. getScrollBarWidth: function(force){
  4967. var size = Ext.getScrollbarSize(force);
  4968. return size.width + 2;
  4969. },
  4970. copyTo : function(dest, source, names, usePrototypeKeys){
  4971. if(typeof names == 'string'){
  4972. names = names.split(/[,;\s]/);
  4973. }
  4974. var n,
  4975. nLen = names.length,
  4976. name;
  4977. for(n = 0; n < nLen; n++) {
  4978. name = names[n];
  4979. if(usePrototypeKeys || source.hasOwnProperty(name)){
  4980. dest[name] = source[name];
  4981. }
  4982. }
  4983. return dest;
  4984. },
  4985. destroyMembers : function(o){
  4986. for (var i = 1, a = arguments, len = a.length; i < len; i++) {
  4987. Ext.destroy(o[a[i]]);
  4988. delete o[a[i]];
  4989. }
  4990. },
  4991. log :
  4992. nullLog,
  4993. partition : function(arr, truth){
  4994. var ret = [[],[]],
  4995. a, v,
  4996. aLen = arr.length;
  4997. for (a = 0; a < aLen; a++) {
  4998. v = arr[a];
  4999. ret[ (truth && truth(v, a, arr)) || (!truth && v) ? 0 : 1].push(v);
  5000. }
  5001. return ret;
  5002. },
  5003. invoke : function(arr, methodName){
  5004. var ret = [],
  5005. args = Array.prototype.slice.call(arguments, 2),
  5006. a, v,
  5007. aLen = arr.length;
  5008. for (a = 0; a < aLen; a++) {
  5009. v = arr[a];
  5010. if (v && typeof v[methodName] == 'function') {
  5011. ret.push(v[methodName].apply(v, args));
  5012. } else {
  5013. ret.push(undefined);
  5014. }
  5015. }
  5016. return ret;
  5017. },
  5018. zip : function(){
  5019. var parts = Ext.partition(arguments, function( val ){ return typeof val != 'function'; }),
  5020. arrs = parts[0],
  5021. fn = parts[1][0],
  5022. len = Ext.max(Ext.pluck(arrs, "length")),
  5023. ret = [],
  5024. i,
  5025. j,
  5026. aLen;
  5027. for (i = 0; i < len; i++) {
  5028. ret[i] = [];
  5029. if(fn){
  5030. ret[i] = fn.apply(fn, Ext.pluck(arrs, i));
  5031. }else{
  5032. for (j = 0, aLen = arrs.length; j < aLen; j++){
  5033. ret[i].push( arrs[j][i] );
  5034. }
  5035. }
  5036. }
  5037. return ret;
  5038. },
  5039. toSentence: function(items, connector) {
  5040. var length = items.length,
  5041. head,
  5042. tail;
  5043. if (length <= 1) {
  5044. return items[0];
  5045. } else {
  5046. head = items.slice(0, length - 1);
  5047. tail = items[length - 1];
  5048. return Ext.util.Format.format("{0} {1} {2}", head.join(", "), connector || 'and', tail);
  5049. }
  5050. },
  5051. useShims: isIE6
  5052. });
  5053. }());
  5054. Ext.application = function(config) {
  5055. Ext.require('Ext.app.Application');
  5056. Ext.onReady(function() {
  5057. new Ext.app.Application(config);
  5058. });
  5059. };
  5060. //@tag extras,core
  5061. //@require ../Ext-more.js
  5062. //@define Ext.util.Format
  5063. (function() {
  5064. Ext.ns('Ext.util');
  5065. Ext.util.Format = {};
  5066. var UtilFormat = Ext.util.Format,
  5067. stripTagsRE = /<\/?[^>]+>/gi,
  5068. stripScriptsRe = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
  5069. nl2brRe = /\r?\n/g,
  5070. formatCleanRe = /[^\d\.]/g,
  5071. I18NFormatCleanRe;
  5072. Ext.apply(UtilFormat, {
  5073. thousandSeparator: ',',
  5074. decimalSeparator: '.',
  5075. currencyPrecision: 2,
  5076. currencySign: '$',
  5077. currencyAtEnd: false,
  5078. undef : function(value) {
  5079. return value !== undefined ? value : "";
  5080. },
  5081. defaultValue : function(value, defaultValue) {
  5082. return value !== undefined && value !== '' ? value : defaultValue;
  5083. },
  5084. substr : 'ab'.substr(-1) != 'b'
  5085. ? function (value, start, length) {
  5086. var str = String(value);
  5087. return (start < 0)
  5088. ? str.substr(Math.max(str.length + start, 0), length)
  5089. : str.substr(start, length);
  5090. }
  5091. : function(value, start, length) {
  5092. return String(value).substr(start, length);
  5093. },
  5094. lowercase : function(value) {
  5095. return String(value).toLowerCase();
  5096. },
  5097. uppercase : function(value) {
  5098. return String(value).toUpperCase();
  5099. },
  5100. usMoney : function(v) {
  5101. return UtilFormat.currency(v, '$', 2);
  5102. },
  5103. currency: function(v, currencySign, decimals, end) {
  5104. var negativeSign = '',
  5105. format = ",0",
  5106. i = 0;
  5107. v = v - 0;
  5108. if (v < 0) {
  5109. v = -v;
  5110. negativeSign = '-';
  5111. }
  5112. decimals = Ext.isDefined(decimals) ? decimals : UtilFormat.currencyPrecision;
  5113. format += format + (decimals > 0 ? '.' : '');
  5114. for (; i < decimals; i++) {
  5115. format += '0';
  5116. }
  5117. v = UtilFormat.number(v, format);
  5118. if ((end || UtilFormat.currencyAtEnd) === true) {
  5119. return Ext.String.format("{0}{1}{2}", negativeSign, v, currencySign || UtilFormat.currencySign);
  5120. } else {
  5121. return Ext.String.format("{0}{1}{2}", negativeSign, currencySign || UtilFormat.currencySign, v);
  5122. }
  5123. },
  5124. date: function(v, format) {
  5125. if (!v) {
  5126. return "";
  5127. }
  5128. if (!Ext.isDate(v)) {
  5129. v = new Date(Date.parse(v));
  5130. }
  5131. return Ext.Date.dateFormat(v, format || Ext.Date.defaultFormat);
  5132. },
  5133. dateRenderer : function(format) {
  5134. return function(v) {
  5135. return UtilFormat.date(v, format);
  5136. };
  5137. },
  5138. stripTags : function(v) {
  5139. return !v ? v : String(v).replace(stripTagsRE, "");
  5140. },
  5141. stripScripts : function(v) {
  5142. return !v ? v : String(v).replace(stripScriptsRe, "");
  5143. },
  5144. fileSize : function(size) {
  5145. if (size < 1024) {
  5146. return size + " bytes";
  5147. } else if (size < 1048576) {
  5148. return (Math.round(((size*10) / 1024))/10) + " KB";
  5149. } else {
  5150. return (Math.round(((size*10) / 1048576))/10) + " MB";
  5151. }
  5152. },
  5153. math : (function(){
  5154. var fns = {};
  5155. return function(v, a){
  5156. if (!fns[a]) {
  5157. fns[a] = Ext.functionFactory('v', 'return v ' + a + ';');
  5158. }
  5159. return fns[a](v);
  5160. };
  5161. }()),
  5162. round : function(value, precision) {
  5163. var result = Number(value);
  5164. if (typeof precision == 'number') {
  5165. precision = Math.pow(10, precision);
  5166. result = Math.round(value * precision) / precision;
  5167. }
  5168. return result;
  5169. },
  5170. number : function(v, formatString) {
  5171. if (!formatString) {
  5172. return v;
  5173. }
  5174. v = Ext.Number.from(v, NaN);
  5175. if (isNaN(v)) {
  5176. return '';
  5177. }
  5178. var comma = UtilFormat.thousandSeparator,
  5179. dec = UtilFormat.decimalSeparator,
  5180. i18n = false,
  5181. neg = v < 0,
  5182. hasComma,
  5183. psplit,
  5184. fnum,
  5185. cnum,
  5186. parr,
  5187. j,
  5188. m,
  5189. n,
  5190. i;
  5191. v = Math.abs(v);
  5192. if (formatString.substr(formatString.length - 2) == '/i') {
  5193. if (!I18NFormatCleanRe) {
  5194. I18NFormatCleanRe = new RegExp('[^\\d\\' + UtilFormat.decimalSeparator + ']','g');
  5195. }
  5196. formatString = formatString.substr(0, formatString.length - 2);
  5197. i18n = true;
  5198. hasComma = formatString.indexOf(comma) != -1;
  5199. psplit = formatString.replace(I18NFormatCleanRe, '').split(dec);
  5200. } else {
  5201. hasComma = formatString.indexOf(',') != -1;
  5202. psplit = formatString.replace(formatCleanRe, '').split('.');
  5203. }
  5204. if (psplit.length > 2) {
  5205. } else if (psplit.length > 1) {
  5206. v = Ext.Number.toFixed(v, psplit[1].length);
  5207. } else {
  5208. v = Ext.Number.toFixed(v, 0);
  5209. }
  5210. fnum = v.toString();
  5211. psplit = fnum.split('.');
  5212. if (hasComma) {
  5213. cnum = psplit[0];
  5214. parr = [];
  5215. j = cnum.length;
  5216. m = Math.floor(j / 3);
  5217. n = cnum.length % 3 || 3;
  5218. for (i = 0; i < j; i += n) {
  5219. if (i !== 0) {
  5220. n = 3;
  5221. }
  5222. parr[parr.length] = cnum.substr(i, n);
  5223. m -= 1;
  5224. }
  5225. fnum = parr.join(comma);
  5226. if (psplit[1]) {
  5227. fnum += dec + psplit[1];
  5228. }
  5229. } else {
  5230. if (psplit[1]) {
  5231. fnum = psplit[0] + dec + psplit[1];
  5232. }
  5233. }
  5234. if (neg) {
  5235. neg = fnum.replace(/[^1-9]/g, '') !== '';
  5236. }
  5237. return (neg ? '-' : '') + formatString.replace(/[\d,?\.?]+/, fnum);
  5238. },
  5239. numberRenderer : function(format) {
  5240. return function(v) {
  5241. return UtilFormat.number(v, format);
  5242. };
  5243. },
  5244. plural : function(v, s, p) {
  5245. return v +' ' + (v == 1 ? s : (p ? p : s+'s'));
  5246. },
  5247. nl2br : function(v) {
  5248. return Ext.isEmpty(v) ? '' : v.replace(nl2brRe, '<br/>');
  5249. },
  5250. capitalize: Ext.String.capitalize,
  5251. ellipsis: Ext.String.ellipsis,
  5252. format: Ext.String.format,
  5253. htmlDecode: Ext.String.htmlDecode,
  5254. htmlEncode: Ext.String.htmlEncode,
  5255. leftPad: Ext.String.leftPad,
  5256. trim : Ext.String.trim,
  5257. parseBox : function(box) {
  5258. box = Ext.isEmpty(box) ? '' : box;
  5259. if (Ext.isNumber(box)) {
  5260. box = box.toString();
  5261. }
  5262. var parts = box.split(' '),
  5263. ln = parts.length;
  5264. if (ln == 1) {
  5265. parts[1] = parts[2] = parts[3] = parts[0];
  5266. }
  5267. else if (ln == 2) {
  5268. parts[2] = parts[0];
  5269. parts[3] = parts[1];
  5270. }
  5271. else if (ln == 3) {
  5272. parts[3] = parts[1];
  5273. }
  5274. return {
  5275. top :parseInt(parts[0], 10) || 0,
  5276. right :parseInt(parts[1], 10) || 0,
  5277. bottom:parseInt(parts[2], 10) || 0,
  5278. left :parseInt(parts[3], 10) || 0
  5279. };
  5280. },
  5281. escapeRegex : function(s) {
  5282. return s.replace(/([\-.*+?\^${}()|\[\]\/\\])/g, "\\$1");
  5283. }
  5284. });
  5285. }());
  5286. //@tag extras,core
  5287. //@require Format.js
  5288. //@define Ext.util.TaskManager
  5289. //@define Ext.TaskManager
  5290. Ext.define('Ext.util.TaskRunner', {
  5291. interval: 10,
  5292. timerId: null,
  5293. constructor: function (interval) {
  5294. var me = this;
  5295. if (typeof interval == 'number') {
  5296. me.interval = interval;
  5297. } else if (interval) {
  5298. Ext.apply(me, interval);
  5299. }
  5300. me.tasks = [];
  5301. me.timerFn = Ext.Function.bind(me.onTick, me);
  5302. },
  5303. newTask: function (config) {
  5304. var task = new Ext.util.TaskRunner.Task(config);
  5305. task.manager = this;
  5306. return task;
  5307. },
  5308. start: function(task) {
  5309. var me = this,
  5310. now = new Date().getTime();
  5311. if (!task.pending) {
  5312. me.tasks.push(task);
  5313. task.pending = true;
  5314. }
  5315. task.stopped = false;
  5316. task.taskStartTime = now;
  5317. task.taskRunTime = task.fireOnStart !== false ? 0 : task.taskStartTime;
  5318. task.taskRunCount = 0;
  5319. if (!me.firing) {
  5320. if (task.fireOnStart !== false) {
  5321. me.startTimer(0, now);
  5322. } else {
  5323. me.startTimer(task.interval, now);
  5324. }
  5325. }
  5326. return task;
  5327. },
  5328. stop: function(task) {
  5329. if (!task.stopped) {
  5330. task.stopped = true;
  5331. if (task.onStop) {
  5332. task.onStop.call(task.scope || task, task);
  5333. }
  5334. }
  5335. return task;
  5336. },
  5337. stopAll: function() {
  5338. Ext.each(this.tasks, this.stop, this);
  5339. },
  5340. firing: false,
  5341. nextExpires: 1e99,
  5342. onTick: function () {
  5343. var me = this,
  5344. tasks = me.tasks,
  5345. now = new Date().getTime(),
  5346. nextExpires = 1e99,
  5347. len = tasks.length,
  5348. expires, newTasks, i, task, rt, remove;
  5349. me.timerId = null;
  5350. me.firing = true;
  5351. for (i = 0; i < len || i < (len = tasks.length); ++i) {
  5352. task = tasks[i];
  5353. if (!(remove = task.stopped)) {
  5354. expires = task.taskRunTime + task.interval;
  5355. if (expires <= now) {
  5356. rt = 1;
  5357. try {
  5358. rt = task.run.apply(task.scope || task, task.args || [++task.taskRunCount]);
  5359. } catch (taskError) {
  5360. try {
  5361. if (task.onError) {
  5362. rt = task.onError.call(task.scope || task, task, taskError);
  5363. }
  5364. } catch (ignore) { }
  5365. }
  5366. task.taskRunTime = now;
  5367. if (rt === false || task.taskRunCount === task.repeat) {
  5368. me.stop(task);
  5369. remove = true;
  5370. } else {
  5371. remove = task.stopped;
  5372. expires = now + task.interval;
  5373. }
  5374. }
  5375. if (!remove && task.duration && task.duration <= (now - task.taskStartTime)) {
  5376. me.stop(task);
  5377. remove = true;
  5378. }
  5379. }
  5380. if (remove) {
  5381. task.pending = false;
  5382. if (!newTasks) {
  5383. newTasks = tasks.slice(0, i);
  5384. }
  5385. } else {
  5386. if (newTasks) {
  5387. newTasks.push(task);
  5388. }
  5389. if (nextExpires > expires) {
  5390. nextExpires = expires;
  5391. }
  5392. }
  5393. }
  5394. if (newTasks) {
  5395. me.tasks = newTasks;
  5396. }
  5397. me.firing = false;
  5398. if (me.tasks.length) {
  5399. me.startTimer(nextExpires - now, new Date().getTime());
  5400. }
  5401. },
  5402. startTimer: function (timeout, now) {
  5403. var me = this,
  5404. expires = now + timeout,
  5405. timerId = me.timerId;
  5406. if (timerId && me.nextExpires - expires > me.interval) {
  5407. clearTimeout(timerId);
  5408. timerId = null;
  5409. }
  5410. if (!timerId) {
  5411. if (timeout < me.interval) {
  5412. timeout = me.interval;
  5413. }
  5414. me.timerId = setTimeout(me.timerFn, timeout);
  5415. me.nextExpires = expires;
  5416. }
  5417. }
  5418. },
  5419. function () {
  5420. var me = this,
  5421. proto = me.prototype;
  5422. proto.destroy = proto.stopAll;
  5423. Ext.util.TaskManager = Ext.TaskManager = new me();
  5424. me.Task = new Ext.Class({
  5425. isTask: true,
  5426. stopped: true,
  5427. fireOnStart: false,
  5428. constructor: function (config) {
  5429. Ext.apply(this, config);
  5430. },
  5431. restart: function (interval) {
  5432. if (interval !== undefined) {
  5433. this.interval = interval;
  5434. }
  5435. this.manager.start(this);
  5436. },
  5437. start: function (interval) {
  5438. if (this.stopped) {
  5439. this.restart(interval);
  5440. }
  5441. },
  5442. stop: function () {
  5443. this.manager.stop(this);
  5444. }
  5445. });
  5446. proto = me.Task.prototype;
  5447. proto.destroy = proto.stop;
  5448. });
  5449. //@tag extras,core
  5450. //@require ../util/TaskManager.js
  5451. Ext.define('Ext.perf.Accumulator', (function () {
  5452. var currentFrame = null,
  5453. khrome = Ext.global['chrome'],
  5454. formatTpl,
  5455. getTimestamp = function () {
  5456. getTimestamp = function () {
  5457. return new Date().getTime();
  5458. };
  5459. var interval, toolbox;
  5460. if (Ext.isChrome && khrome && khrome.Interval) {
  5461. interval = new khrome.Interval();
  5462. interval.start();
  5463. getTimestamp = function () {
  5464. return interval.microseconds() / 1000;
  5465. };
  5466. } else if (window.ActiveXObject) {
  5467. try {
  5468. toolbox = new ActiveXObject('SenchaToolbox.Toolbox');
  5469. Ext.senchaToolbox = toolbox;
  5470. getTimestamp = function () {
  5471. return toolbox.milliseconds;
  5472. };
  5473. } catch (e) {
  5474. }
  5475. } else if (Date.now) {
  5476. getTimestamp = Date.now;
  5477. }
  5478. Ext.perf.getTimestamp = Ext.perf.Accumulator.getTimestamp = getTimestamp;
  5479. return getTimestamp();
  5480. };
  5481. function adjustSet (set, time) {
  5482. set.sum += time;
  5483. set.min = Math.min(set.min, time);
  5484. set.max = Math.max(set.max, time);
  5485. }
  5486. function leaveFrame (time) {
  5487. var totalTime = time ? time : (getTimestamp() - this.time),
  5488. me = this,
  5489. accum = me.accum;
  5490. ++accum.count;
  5491. if (! --accum.depth) {
  5492. adjustSet(accum.total, totalTime);
  5493. }
  5494. adjustSet(accum.pure, totalTime - me.childTime);
  5495. currentFrame = me.parent;
  5496. if (currentFrame) {
  5497. ++currentFrame.accum.childCount;
  5498. currentFrame.childTime += totalTime;
  5499. }
  5500. }
  5501. function makeSet () {
  5502. return {
  5503. min: Number.MAX_VALUE,
  5504. max: 0,
  5505. sum: 0
  5506. };
  5507. }
  5508. function makeTap (me, fn) {
  5509. return function () {
  5510. var frame = me.enter(),
  5511. ret = fn.apply(this, arguments);
  5512. frame.leave();
  5513. return ret;
  5514. };
  5515. }
  5516. function round (x) {
  5517. return Math.round(x * 100) / 100;
  5518. }
  5519. function setToJSON (count, childCount, calibration, set) {
  5520. var data = {
  5521. avg: 0,
  5522. min: set.min,
  5523. max: set.max,
  5524. sum: 0
  5525. };
  5526. if (count) {
  5527. calibration = calibration || 0;
  5528. data.sum = set.sum - childCount * calibration;
  5529. data.avg = data.sum / count;
  5530. }
  5531. return data;
  5532. }
  5533. return {
  5534. constructor: function (name) {
  5535. var me = this;
  5536. me.count = me.childCount = me.depth = me.maxDepth = 0;
  5537. me.pure = makeSet();
  5538. me.total = makeSet();
  5539. me.name = name;
  5540. },
  5541. statics: {
  5542. getTimestamp: getTimestamp
  5543. },
  5544. format: function (calibration) {
  5545. if (!formatTpl) {
  5546. formatTpl = new Ext.XTemplate([
  5547. '{name} - {count} call(s)',
  5548. '<tpl if="count">',
  5549. '<tpl if="childCount">',
  5550. ' ({childCount} children)',
  5551. '</tpl>',
  5552. '<tpl if="depth - 1">',
  5553. ' ({depth} deep)',
  5554. '</tpl>',
  5555. '<tpl for="times">',
  5556. ', {type}: {[this.time(values.sum)]} msec (',
  5557. 'avg={[this.time(values.sum / parent.count)]}',
  5558. ')',
  5559. '</tpl>',
  5560. '</tpl>'
  5561. ].join(''), {
  5562. time: function (t) {
  5563. return Math.round(t * 100) / 100;
  5564. }
  5565. });
  5566. }
  5567. var data = this.getData(calibration);
  5568. data.name = this.name;
  5569. data.pure.type = 'Pure';
  5570. data.total.type = 'Total';
  5571. data.times = [data.pure, data.total];
  5572. return formatTpl.apply(data);
  5573. },
  5574. getData: function (calibration) {
  5575. var me = this;
  5576. return {
  5577. count: me.count,
  5578. childCount: me.childCount,
  5579. depth: me.maxDepth,
  5580. pure: setToJSON(me.count, me.childCount, calibration, me.pure),
  5581. total: setToJSON(me.count, me.childCount, calibration, me.total)
  5582. };
  5583. },
  5584. enter: function () {
  5585. var me = this,
  5586. frame = {
  5587. accum: me,
  5588. leave: leaveFrame,
  5589. childTime: 0,
  5590. parent: currentFrame
  5591. };
  5592. ++me.depth;
  5593. if (me.maxDepth < me.depth) {
  5594. me.maxDepth = me.depth;
  5595. }
  5596. currentFrame = frame;
  5597. frame.time = getTimestamp();
  5598. return frame;
  5599. },
  5600. monitor: function (fn, scope, args) {
  5601. var frame = this.enter();
  5602. if (args) {
  5603. fn.apply(scope, args);
  5604. } else {
  5605. fn.call(scope);
  5606. }
  5607. frame.leave();
  5608. },
  5609. report: function () {
  5610. Ext.log(this.format());
  5611. },
  5612. tap: function (className, methodName) {
  5613. var me = this,
  5614. methods = typeof methodName == 'string' ? [methodName] : methodName,
  5615. klass, statik, i, parts, length, name, src,
  5616. tapFunc;
  5617. tapFunc = function(){
  5618. if (typeof className == 'string') {
  5619. klass = Ext.global;
  5620. parts = className.split('.');
  5621. for (i = 0, length = parts.length; i < length; ++i) {
  5622. klass = klass[parts[i]];
  5623. }
  5624. } else {
  5625. klass = className;
  5626. }
  5627. for (i = 0, length = methods.length; i < length; ++i) {
  5628. name = methods[i];
  5629. statik = name.charAt(0) == '!';
  5630. if (statik) {
  5631. name = name.substring(1);
  5632. } else {
  5633. statik = !(name in klass.prototype);
  5634. }
  5635. src = statik ? klass : klass.prototype;
  5636. src[name] = makeTap(me, src[name]);
  5637. }
  5638. };
  5639. Ext.ClassManager.onCreated(tapFunc, me, className);
  5640. return me;
  5641. }
  5642. };
  5643. }()),
  5644. function () {
  5645. Ext.perf.getTimestamp = this.getTimestamp;
  5646. });
  5647. //@tag extras,core
  5648. //@require Accumulator.js
  5649. Ext.define('Ext.perf.Monitor', {
  5650. singleton: true,
  5651. alternateClassName: 'Ext.Perf',
  5652. requires: [
  5653. 'Ext.perf.Accumulator'
  5654. ],
  5655. constructor: function () {
  5656. this.accumulators = [];
  5657. this.accumulatorsByName = {};
  5658. },
  5659. calibrate: function () {
  5660. var accum = new Ext.perf.Accumulator('$'),
  5661. total = accum.total,
  5662. getTimestamp = Ext.perf.Accumulator.getTimestamp,
  5663. count = 0,
  5664. frame,
  5665. endTime,
  5666. startTime;
  5667. startTime = getTimestamp();
  5668. do {
  5669. frame = accum.enter();
  5670. frame.leave();
  5671. ++count;
  5672. } while (total.sum < 100);
  5673. endTime = getTimestamp();
  5674. return (endTime - startTime) / count;
  5675. },
  5676. get: function (name) {
  5677. var me = this,
  5678. accum = me.accumulatorsByName[name];
  5679. if (!accum) {
  5680. me.accumulatorsByName[name] = accum = new Ext.perf.Accumulator(name);
  5681. me.accumulators.push(accum);
  5682. }
  5683. return accum;
  5684. },
  5685. enter: function (name) {
  5686. return this.get(name).enter();
  5687. },
  5688. monitor: function (name, fn, scope) {
  5689. this.get(name).monitor(fn, scope);
  5690. },
  5691. report: function () {
  5692. var me = this,
  5693. accumulators = me.accumulators,
  5694. calibration = me.calibrate();
  5695. accumulators.sort(function (a, b) {
  5696. return (a.name < b.name) ? -1 : ((b.name < a.name) ? 1 : 0);
  5697. });
  5698. me.updateGC();
  5699. Ext.log('Calibration: ' + Math.round(calibration * 100) / 100 + ' msec/sample');
  5700. Ext.each(accumulators, function (accum) {
  5701. Ext.log(accum.format(calibration));
  5702. });
  5703. },
  5704. getData: function (all) {
  5705. var ret = {},
  5706. accumulators = this.accumulators;
  5707. Ext.each(accumulators, function (accum) {
  5708. if (all || accum.count) {
  5709. ret[accum.name] = accum.getData();
  5710. }
  5711. });
  5712. return ret;
  5713. },
  5714. reset: function(){
  5715. Ext.each(this.accumulators, function(accum){
  5716. var me = accum;
  5717. me.count = me.childCount = me.depth = me.maxDepth = 0;
  5718. me.pure = {
  5719. min: Number.MAX_VALUE,
  5720. max: 0,
  5721. sum: 0
  5722. };
  5723. me.total = {
  5724. min: Number.MAX_VALUE,
  5725. max: 0,
  5726. sum: 0
  5727. };
  5728. });
  5729. },
  5730. updateGC: function () {
  5731. var accumGC = this.accumulatorsByName.GC,
  5732. toolbox = Ext.senchaToolbox,
  5733. bucket;
  5734. if (accumGC) {
  5735. accumGC.count = toolbox.garbageCollectionCounter || 0;
  5736. if (accumGC.count) {
  5737. bucket = accumGC.pure;
  5738. accumGC.total.sum = bucket.sum = toolbox.garbageCollectionMilliseconds;
  5739. bucket.min = bucket.max = bucket.sum / accumGC.count;
  5740. bucket = accumGC.total;
  5741. bucket.min = bucket.max = bucket.sum / accumGC.count;
  5742. }
  5743. }
  5744. },
  5745. watchGC: function () {
  5746. Ext.perf.getTimestamp();
  5747. var toolbox = Ext.senchaToolbox;
  5748. if (toolbox) {
  5749. this.get("GC");
  5750. toolbox.watchGarbageCollector(false);
  5751. }
  5752. },
  5753. setup: function (config) {
  5754. if (!config) {
  5755. config = {
  5756. render: {
  5757. 'Ext.AbstractComponent': 'render'
  5758. },
  5759. layout: {
  5760. 'Ext.layout.Context': 'run'
  5761. }
  5762. };
  5763. }
  5764. this.currentConfig = config;
  5765. var key, prop,
  5766. accum, className, methods;
  5767. for (key in config) {
  5768. if (config.hasOwnProperty(key)) {
  5769. prop = config[key];
  5770. accum = Ext.Perf.get(key);
  5771. for (className in prop) {
  5772. if (prop.hasOwnProperty(className)) {
  5773. methods = prop[className];
  5774. accum.tap(className, methods);
  5775. }
  5776. }
  5777. }
  5778. }
  5779. this.watchGC();
  5780. }
  5781. });
  5782. //@tag extras,core
  5783. //@require perf/Monitor.js
  5784. //@define Ext.Supports
  5785. Ext.is = {
  5786. init : function(navigator) {
  5787. var platforms = this.platforms,
  5788. ln = platforms.length,
  5789. i, platform;
  5790. navigator = navigator || window.navigator;
  5791. for (i = 0; i < ln; i++) {
  5792. platform = platforms[i];
  5793. this[platform.identity] = platform.regex.test(navigator[platform.property]);
  5794. }
  5795. this.Desktop = this.Mac || this.Windows || (this.Linux && !this.Android);
  5796. this.Tablet = this.iPad;
  5797. this.Phone = !this.Desktop && !this.Tablet;
  5798. this.iOS = this.iPhone || this.iPad || this.iPod;
  5799. this.Standalone = !!window.navigator.standalone;
  5800. },
  5801. platforms: [{
  5802. property: 'platform',
  5803. regex: /iPhone/i,
  5804. identity: 'iPhone'
  5805. },
  5806. {
  5807. property: 'platform',
  5808. regex: /iPod/i,
  5809. identity: 'iPod'
  5810. },
  5811. {
  5812. property: 'userAgent',
  5813. regex: /iPad/i,
  5814. identity: 'iPad'
  5815. },
  5816. {
  5817. property: 'userAgent',
  5818. regex: /Blackberry/i,
  5819. identity: 'Blackberry'
  5820. },
  5821. {
  5822. property: 'userAgent',
  5823. regex: /Android/i,
  5824. identity: 'Android'
  5825. },
  5826. {
  5827. property: 'platform',
  5828. regex: /Mac/i,
  5829. identity: 'Mac'
  5830. },
  5831. {
  5832. property: 'platform',
  5833. regex: /Win/i,
  5834. identity: 'Windows'
  5835. },
  5836. {
  5837. property: 'platform',
  5838. regex: /Linux/i,
  5839. identity: 'Linux'
  5840. }]
  5841. };
  5842. Ext.is.init();
  5843. (function(){
  5844. var getStyle = function(element, styleName){
  5845. var view = element.ownerDocument.defaultView,
  5846. style = (view ? view.getComputedStyle(element, null) : element.currentStyle) || element.style;
  5847. return style[styleName];
  5848. };
  5849. Ext.supports = {
  5850. init : function() {
  5851. var me = this,
  5852. doc = document,
  5853. tests = me.tests,
  5854. n = tests.length,
  5855. div = n && Ext.isReady && doc.createElement('div'),
  5856. test, notRun = [];
  5857. if (div) {
  5858. div.innerHTML = [
  5859. '<div style="height:30px;width:50px;">',
  5860. '<div style="height:20px;width:20px;"></div>',
  5861. '</div>',
  5862. '<div style="width: 200px; height: 200px; position: relative; padding: 5px;">',
  5863. '<div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"></div>',
  5864. '</div>',
  5865. '<div style="position: absolute; left: 10%; top: 10%;"></div>',
  5866. '<div style="float:left; background-color:transparent;"></div>'
  5867. ].join('');
  5868. doc.body.appendChild(div);
  5869. }
  5870. while (n--) {
  5871. test = tests[n];
  5872. if (div || test.early) {
  5873. me[test.identity] = test.fn.call(me, doc, div);
  5874. } else {
  5875. notRun.push(test);
  5876. }
  5877. }
  5878. if (div) {
  5879. doc.body.removeChild(div);
  5880. }
  5881. me.tests = notRun;
  5882. },
  5883. PointerEvents: 'pointerEvents' in document.documentElement.style,
  5884. CSS3BoxShadow: 'boxShadow' in document.documentElement.style || 'WebkitBoxShadow' in document.documentElement.style || 'MozBoxShadow' in document.documentElement.style,
  5885. ClassList: !!document.documentElement.classList,
  5886. OrientationChange: ((typeof window.orientation != 'undefined') && ('onorientationchange' in window)),
  5887. DeviceMotion: ('ondevicemotion' in window),
  5888. Touch: ('ontouchstart' in window) && (!Ext.is.Desktop),
  5889. TimeoutActualLateness: (function(){
  5890. setTimeout(function(){
  5891. Ext.supports.TimeoutActualLateness = arguments.length !== 0;
  5892. }, 0);
  5893. }()),
  5894. tests: [
  5895. {
  5896. identity: 'Transitions',
  5897. fn: function(doc, div) {
  5898. var prefix = [
  5899. 'webkit',
  5900. 'Moz',
  5901. 'o',
  5902. 'ms',
  5903. 'khtml'
  5904. ],
  5905. TE = 'TransitionEnd',
  5906. transitionEndName = [
  5907. prefix[0] + TE,
  5908. 'transitionend',
  5909. prefix[2] + TE,
  5910. prefix[3] + TE,
  5911. prefix[4] + TE
  5912. ],
  5913. ln = prefix.length,
  5914. i = 0,
  5915. out = false;
  5916. for (; i < ln; i++) {
  5917. if (getStyle(div, prefix[i] + "TransitionProperty")) {
  5918. Ext.supports.CSS3Prefix = prefix[i];
  5919. Ext.supports.CSS3TransitionEnd = transitionEndName[i];
  5920. out = true;
  5921. break;
  5922. }
  5923. }
  5924. return out;
  5925. }
  5926. },
  5927. {
  5928. identity: 'RightMargin',
  5929. fn: function(doc, div) {
  5930. var view = doc.defaultView;
  5931. return !(view && view.getComputedStyle(div.firstChild.firstChild, null).marginRight != '0px');
  5932. }
  5933. },
  5934. {
  5935. identity: 'DisplayChangeInputSelectionBug',
  5936. early: true,
  5937. fn: function() {
  5938. var webKitVersion = Ext.webKitVersion;
  5939. return 0 < webKitVersion && webKitVersion < 533;
  5940. }
  5941. },
  5942. {
  5943. identity: 'DisplayChangeTextAreaSelectionBug',
  5944. early: true,
  5945. fn: function() {
  5946. var webKitVersion = Ext.webKitVersion;
  5947. return 0 < webKitVersion && webKitVersion < 534.24;
  5948. }
  5949. },
  5950. {
  5951. identity: 'TransparentColor',
  5952. fn: function(doc, div, view) {
  5953. view = doc.defaultView;
  5954. return !(view && view.getComputedStyle(div.lastChild, null).backgroundColor != 'transparent');
  5955. }
  5956. },
  5957. {
  5958. identity: 'ComputedStyle',
  5959. fn: function(doc, div, view) {
  5960. view = doc.defaultView;
  5961. return view && view.getComputedStyle;
  5962. }
  5963. },
  5964. {
  5965. identity: 'Svg',
  5966. fn: function(doc) {
  5967. return !!doc.createElementNS && !!doc.createElementNS( "http:/" + "/www.w3.org/2000/svg", "svg").createSVGRect;
  5968. }
  5969. },
  5970. {
  5971. identity: 'Canvas',
  5972. fn: function(doc) {
  5973. return !!doc.createElement('canvas').getContext;
  5974. }
  5975. },
  5976. {
  5977. identity: 'Vml',
  5978. fn: function(doc) {
  5979. var d = doc.createElement("div");
  5980. d.innerHTML = "<!--[if vml]><br/><br/><![endif]-->";
  5981. return (d.childNodes.length == 2);
  5982. }
  5983. },
  5984. {
  5985. identity: 'Float',
  5986. fn: function(doc, div) {
  5987. return !!div.lastChild.style.cssFloat;
  5988. }
  5989. },
  5990. {
  5991. identity: 'AudioTag',
  5992. fn: function(doc) {
  5993. return !!doc.createElement('audio').canPlayType;
  5994. }
  5995. },
  5996. {
  5997. identity: 'History',
  5998. fn: function() {
  5999. var history = window.history;
  6000. return !!(history && history.pushState);
  6001. }
  6002. },
  6003. {
  6004. identity: 'CSS3DTransform',
  6005. fn: function() {
  6006. return (typeof WebKitCSSMatrix != 'undefined' && new WebKitCSSMatrix().hasOwnProperty('m41'));
  6007. }
  6008. },
  6009. {
  6010. identity: 'CSS3LinearGradient',
  6011. fn: function(doc, div) {
  6012. var property = 'background-image:',
  6013. webkit = '-webkit-gradient(linear, left top, right bottom, from(black), to(white))',
  6014. w3c = 'linear-gradient(left top, black, white)',
  6015. moz = '-moz-' + w3c,
  6016. opera = '-o-' + w3c,
  6017. options = [property + webkit, property + w3c, property + moz, property + opera];
  6018. div.style.cssText = options.join(';');
  6019. return ("" + div.style.backgroundImage).indexOf('gradient') !== -1;
  6020. }
  6021. },
  6022. {
  6023. identity: 'CSS3BorderRadius',
  6024. fn: function(doc, div) {
  6025. var domPrefixes = ['borderRadius', 'BorderRadius', 'MozBorderRadius', 'WebkitBorderRadius', 'OBorderRadius', 'KhtmlBorderRadius'],
  6026. pass = false,
  6027. i;
  6028. for (i = 0; i < domPrefixes.length; i++) {
  6029. if (document.body.style[domPrefixes[i]] !== undefined) {
  6030. return true;
  6031. }
  6032. }
  6033. return pass;
  6034. }
  6035. },
  6036. {
  6037. identity: 'GeoLocation',
  6038. fn: function() {
  6039. return (typeof navigator != 'undefined' && typeof navigator.geolocation != 'undefined') || (typeof google != 'undefined' && typeof google.gears != 'undefined');
  6040. }
  6041. },
  6042. {
  6043. identity: 'MouseEnterLeave',
  6044. fn: function(doc, div){
  6045. return ('onmouseenter' in div && 'onmouseleave' in div);
  6046. }
  6047. },
  6048. {
  6049. identity: 'MouseWheel',
  6050. fn: function(doc, div) {
  6051. return ('onmousewheel' in div);
  6052. }
  6053. },
  6054. {
  6055. identity: 'Opacity',
  6056. fn: function(doc, div){
  6057. if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8) {
  6058. return false;
  6059. }
  6060. div.firstChild.style.cssText = 'opacity:0.73';
  6061. return div.firstChild.style.opacity == '0.73';
  6062. }
  6063. },
  6064. {
  6065. identity: 'Placeholder',
  6066. fn: function(doc) {
  6067. return 'placeholder' in doc.createElement('input');
  6068. }
  6069. },
  6070. {
  6071. identity: 'Direct2DBug',
  6072. fn: function() {
  6073. return Ext.isString(document.body.style.msTransformOrigin);
  6074. }
  6075. },
  6076. {
  6077. identity: 'BoundingClientRect',
  6078. fn: function(doc, div) {
  6079. return Ext.isFunction(div.getBoundingClientRect);
  6080. }
  6081. },
  6082. {
  6083. identity: 'IncludePaddingInWidthCalculation',
  6084. fn: function(doc, div){
  6085. return div.childNodes[1].firstChild.offsetWidth == 210;
  6086. }
  6087. },
  6088. {
  6089. identity: 'IncludePaddingInHeightCalculation',
  6090. fn: function(doc, div){
  6091. return div.childNodes[1].firstChild.offsetHeight == 210;
  6092. }
  6093. },
  6094. {
  6095. identity: 'ArraySort',
  6096. fn: function() {
  6097. var a = [1,2,3,4,5].sort(function(){ return 0; });
  6098. return a[0] === 1 && a[1] === 2 && a[2] === 3 && a[3] === 4 && a[4] === 5;
  6099. }
  6100. },
  6101. {
  6102. identity: 'Range',
  6103. fn: function() {
  6104. return !!document.createRange;
  6105. }
  6106. },
  6107. {
  6108. identity: 'CreateContextualFragment',
  6109. fn: function() {
  6110. var range = Ext.supports.Range ? document.createRange() : false;
  6111. return range && !!range.createContextualFragment;
  6112. }
  6113. },
  6114. {
  6115. identity: 'WindowOnError',
  6116. fn: function () {
  6117. return Ext.isIE || Ext.isGecko || Ext.webKitVersion >= 534.16;
  6118. }
  6119. },
  6120. {
  6121. identity: 'TextAreaMaxLength',
  6122. fn: function(){
  6123. var el = document.createElement('textarea');
  6124. return ('maxlength' in el);
  6125. }
  6126. },
  6127. {
  6128. identity: 'GetPositionPercentage',
  6129. fn: function(doc, div){
  6130. return getStyle(div.childNodes[2], 'left') == '10%';
  6131. }
  6132. }
  6133. ]
  6134. };
  6135. }());
  6136. Ext.supports.init();
  6137. //@tag dom,core
  6138. //@require ../Support.js
  6139. //@define Ext.util.DelayedTask
  6140. Ext.util.DelayedTask = function(fn, scope, args) {
  6141. var me = this,
  6142. id,
  6143. call = function() {
  6144. clearInterval(id);
  6145. id = null;
  6146. fn.apply(scope, args || []);
  6147. };
  6148. this.delay = function(delay, newFn, newScope, newArgs) {
  6149. me.cancel();
  6150. fn = newFn || fn;
  6151. scope = newScope || scope;
  6152. args = newArgs || args;
  6153. id = setInterval(call, delay);
  6154. };
  6155. this.cancel = function(){
  6156. if (id) {
  6157. clearInterval(id);
  6158. id = null;
  6159. }
  6160. };
  6161. };
  6162. //@tag dom,core
  6163. //@define Ext.util.Event
  6164. //@require Ext.util.DelayedTask
  6165. Ext.require('Ext.util.DelayedTask', function() {
  6166. Ext.util.Event = Ext.extend(Object, (function() {
  6167. var noOptions = {};
  6168. function createTargeted(handler, listener, o, scope){
  6169. return function(){
  6170. if (o.target === arguments[0]){
  6171. handler.apply(scope, arguments);
  6172. }
  6173. };
  6174. }
  6175. function createBuffered(handler, listener, o, scope) {
  6176. listener.task = new Ext.util.DelayedTask();
  6177. return function() {
  6178. listener.task.delay(o.buffer, handler, scope, Ext.Array.toArray(arguments));
  6179. };
  6180. }
  6181. function createDelayed(handler, listener, o, scope) {
  6182. return function() {
  6183. var task = new Ext.util.DelayedTask();
  6184. if (!listener.tasks) {
  6185. listener.tasks = [];
  6186. }
  6187. listener.tasks.push(task);
  6188. task.delay(o.delay || 10, handler, scope, Ext.Array.toArray(arguments));
  6189. };
  6190. }
  6191. function createSingle(handler, listener, o, scope) {
  6192. return function() {
  6193. var event = listener.ev;
  6194. if (event.removeListener(listener.fn, scope) && event.observable) {
  6195. event.observable.hasListeners[event.name]--;
  6196. }
  6197. return handler.apply(scope, arguments);
  6198. };
  6199. }
  6200. return {
  6201. isEvent: true,
  6202. constructor: function(observable, name) {
  6203. this.name = name;
  6204. this.observable = observable;
  6205. this.listeners = [];
  6206. },
  6207. addListener: function(fn, scope, options) {
  6208. var me = this,
  6209. listener;
  6210. scope = scope || me.observable;
  6211. if (!me.isListening(fn, scope)) {
  6212. listener = me.createListener(fn, scope, options);
  6213. if (me.firing) {
  6214. me.listeners = me.listeners.slice(0);
  6215. }
  6216. me.listeners.push(listener);
  6217. }
  6218. },
  6219. createListener: function(fn, scope, options) {
  6220. options = options || noOptions;
  6221. scope = scope || this.observable;
  6222. var listener = {
  6223. fn: fn,
  6224. scope: scope,
  6225. o: options,
  6226. ev: this
  6227. },
  6228. handler = fn;
  6229. if (options.single) {
  6230. handler = createSingle(handler, listener, options, scope);
  6231. }
  6232. if (options.target) {
  6233. handler = createTargeted(handler, listener, options, scope);
  6234. }
  6235. if (options.delay) {
  6236. handler = createDelayed(handler, listener, options, scope);
  6237. }
  6238. if (options.buffer) {
  6239. handler = createBuffered(handler, listener, options, scope);
  6240. }
  6241. listener.fireFn = handler;
  6242. return listener;
  6243. },
  6244. findListener: function(fn, scope) {
  6245. var listeners = this.listeners,
  6246. i = listeners.length,
  6247. listener,
  6248. s;
  6249. while (i--) {
  6250. listener = listeners[i];
  6251. if (listener) {
  6252. s = listener.scope;
  6253. if (listener.fn == fn && (s == (scope || this.observable))) {
  6254. return i;
  6255. }
  6256. }
  6257. }
  6258. return - 1;
  6259. },
  6260. isListening: function(fn, scope) {
  6261. return this.findListener(fn, scope) !== -1;
  6262. },
  6263. removeListener: function(fn, scope) {
  6264. var me = this,
  6265. index,
  6266. listener,
  6267. k;
  6268. index = me.findListener(fn, scope);
  6269. if (index != -1) {
  6270. listener = me.listeners[index];
  6271. if (me.firing) {
  6272. me.listeners = me.listeners.slice(0);
  6273. }
  6274. if (listener.task) {
  6275. listener.task.cancel();
  6276. delete listener.task;
  6277. }
  6278. k = listener.tasks && listener.tasks.length;
  6279. if (k) {
  6280. while (k--) {
  6281. listener.tasks[k].cancel();
  6282. }
  6283. delete listener.tasks;
  6284. }
  6285. Ext.Array.erase(me.listeners, index, 1);
  6286. return true;
  6287. }
  6288. return false;
  6289. },
  6290. clearListeners: function() {
  6291. var listeners = this.listeners,
  6292. i = listeners.length;
  6293. while (i--) {
  6294. this.removeListener(listeners[i].fn, listeners[i].scope);
  6295. }
  6296. },
  6297. fire: function() {
  6298. var me = this,
  6299. listeners = me.listeners,
  6300. count = listeners.length,
  6301. i,
  6302. args,
  6303. listener;
  6304. if (count > 0) {
  6305. me.firing = true;
  6306. for (i = 0; i < count; i++) {
  6307. listener = listeners[i];
  6308. args = arguments.length ? Array.prototype.slice.call(arguments, 0) : [];
  6309. if (listener.o) {
  6310. args.push(listener.o);
  6311. }
  6312. if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) {
  6313. return (me.firing = false);
  6314. }
  6315. }
  6316. }
  6317. me.firing = false;
  6318. return true;
  6319. }
  6320. };
  6321. }()));
  6322. });
  6323. Ext.define('Ext.util.Observable', {
  6324. requires: ['Ext.util.Event'],
  6325. statics: {
  6326. releaseCapture: function(o) {
  6327. o.fireEvent = this.prototype.fireEvent;
  6328. },
  6329. capture: function(o, fn, scope) {
  6330. o.fireEvent = Ext.Function.createInterceptor(o.fireEvent, fn, scope);
  6331. },
  6332. observe: function(cls, listeners) {
  6333. if (cls) {
  6334. if (!cls.isObservable) {
  6335. Ext.applyIf(cls, new this());
  6336. this.capture(cls.prototype, cls.fireEvent, cls);
  6337. }
  6338. if (Ext.isObject(listeners)) {
  6339. cls.on(listeners);
  6340. }
  6341. }
  6342. return cls;
  6343. },
  6344. prepareClass: function (T, mixin) {
  6345. if (!T.HasListeners) {
  6346. var Observable = Ext.util.Observable,
  6347. HasListeners = function () {},
  6348. SuperHL = T.superclass.HasListeners || (mixin && mixin.HasListeners) ||
  6349. Observable.HasListeners;
  6350. T.prototype.HasListeners = T.HasListeners = HasListeners;
  6351. HasListeners.prototype = T.hasListeners = new SuperHL();
  6352. }
  6353. }
  6354. },
  6355. isObservable: true,
  6356. eventsSuspended: 0,
  6357. constructor: function(config) {
  6358. var me = this;
  6359. Ext.apply(me, config);
  6360. if (!me.hasListeners) {
  6361. me.hasListeners = new me.HasListeners();
  6362. }
  6363. me.events = me.events || {};
  6364. if (me.listeners) {
  6365. me.on(me.listeners);
  6366. me.listeners = null;
  6367. }
  6368. if (me.bubbleEvents) {
  6369. me.enableBubble(me.bubbleEvents);
  6370. }
  6371. },
  6372. onClassExtended: function (T) {
  6373. if (!T.HasListeners) {
  6374. Ext.util.Observable.prepareClass(T);
  6375. }
  6376. },
  6377. eventOptionsRe : /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate|element|vertical|horizontal|freezeEvent)$/,
  6378. addManagedListener : function(item, ename, fn, scope, options) {
  6379. var me = this,
  6380. managedListeners = me.managedListeners = me.managedListeners || [],
  6381. config;
  6382. if (typeof ename !== 'string') {
  6383. options = ename;
  6384. for (ename in options) {
  6385. if (options.hasOwnProperty(ename)) {
  6386. config = options[ename];
  6387. if (!me.eventOptionsRe.test(ename)) {
  6388. me.addManagedListener(item, ename, config.fn || config, config.scope || options.scope, config.fn ? config : options);
  6389. }
  6390. }
  6391. }
  6392. }
  6393. else {
  6394. managedListeners.push({
  6395. item: item,
  6396. ename: ename,
  6397. fn: fn,
  6398. scope: scope,
  6399. options: options
  6400. });
  6401. item.on(ename, fn, scope, options);
  6402. }
  6403. },
  6404. removeManagedListener : function(item, ename, fn, scope) {
  6405. var me = this,
  6406. options,
  6407. config,
  6408. managedListeners,
  6409. length,
  6410. i;
  6411. if (typeof ename !== 'string') {
  6412. options = ename;
  6413. for (ename in options) {
  6414. if (options.hasOwnProperty(ename)) {
  6415. config = options[ename];
  6416. if (!me.eventOptionsRe.test(ename)) {
  6417. me.removeManagedListener(item, ename, config.fn || config, config.scope || options.scope);
  6418. }
  6419. }
  6420. }
  6421. }
  6422. managedListeners = me.managedListeners ? me.managedListeners.slice() : [];
  6423. for (i = 0, length = managedListeners.length; i < length; i++) {
  6424. me.removeManagedListenerItem(false, managedListeners[i], item, ename, fn, scope);
  6425. }
  6426. },
  6427. fireEvent: function(eventName) {
  6428. eventName = eventName.toLowerCase();
  6429. var me = this,
  6430. events = me.events,
  6431. event = events && events[eventName],
  6432. ret = true;
  6433. if (event && me.hasListeners[eventName]) {
  6434. ret = me.continueFireEvent(eventName, Ext.Array.slice(arguments, 1), event.bubble);
  6435. }
  6436. return ret;
  6437. },
  6438. continueFireEvent: function(eventName, args, bubbles) {
  6439. var target = this,
  6440. queue, event,
  6441. ret = true;
  6442. do {
  6443. if (target.eventsSuspended) {
  6444. if ((queue = target.eventQueue)) {
  6445. queue.push([eventName, args, bubbles]);
  6446. }
  6447. return ret;
  6448. } else {
  6449. event = target.events[eventName];
  6450. if (event && event != true) {
  6451. if ((ret = event.fire.apply(event, args)) === false) {
  6452. break;
  6453. }
  6454. }
  6455. }
  6456. } while (bubbles && (target = target.getBubbleParent()));
  6457. return ret;
  6458. },
  6459. getBubbleParent: function(){
  6460. var me = this, parent = me.getBubbleTarget && me.getBubbleTarget();
  6461. if (parent && parent.isObservable) {
  6462. return parent;
  6463. }
  6464. return null;
  6465. },
  6466. addListener: function(ename, fn, scope, options) {
  6467. var me = this,
  6468. config, event, hasListeners,
  6469. prevListenerCount = 0;
  6470. if (typeof ename !== 'string') {
  6471. options = ename;
  6472. for (ename in options) {
  6473. if (options.hasOwnProperty(ename)) {
  6474. config = options[ename];
  6475. if (!me.eventOptionsRe.test(ename)) {
  6476. me.addListener(ename, config.fn || config, config.scope || options.scope, config.fn ? config : options);
  6477. }
  6478. }
  6479. }
  6480. } else {
  6481. ename = ename.toLowerCase();
  6482. event = me.events[ename];
  6483. if (event && event.isEvent) {
  6484. prevListenerCount = event.listeners.length;
  6485. } else {
  6486. me.events[ename] = event = new Ext.util.Event(me, ename);
  6487. }
  6488. if (typeof fn === 'string') {
  6489. fn = scope[fn] || me[fn];
  6490. }
  6491. event.addListener(fn, scope, options);
  6492. if (event.listeners.length !== prevListenerCount) {
  6493. hasListeners = me.hasListeners;
  6494. if (hasListeners.hasOwnProperty(ename)) {
  6495. ++hasListeners[ename];
  6496. } else {
  6497. hasListeners[ename] = 1;
  6498. }
  6499. }
  6500. }
  6501. },
  6502. removeListener: function(ename, fn, scope) {
  6503. var me = this,
  6504. config,
  6505. event,
  6506. options;
  6507. if (typeof ename !== 'string') {
  6508. options = ename;
  6509. for (ename in options) {
  6510. if (options.hasOwnProperty(ename)) {
  6511. config = options[ename];
  6512. if (!me.eventOptionsRe.test(ename)) {
  6513. me.removeListener(ename, config.fn || config, config.scope || options.scope);
  6514. }
  6515. }
  6516. }
  6517. } else {
  6518. ename = ename.toLowerCase();
  6519. event = me.events[ename];
  6520. if (event && event.isEvent) {
  6521. if (event.removeListener(fn, scope) && !--me.hasListeners[ename]) {
  6522. delete me.hasListeners[ename];
  6523. }
  6524. }
  6525. }
  6526. },
  6527. clearListeners: function() {
  6528. var events = this.events,
  6529. event,
  6530. key;
  6531. for (key in events) {
  6532. if (events.hasOwnProperty(key)) {
  6533. event = events[key];
  6534. if (event.isEvent) {
  6535. event.clearListeners();
  6536. }
  6537. }
  6538. }
  6539. this.clearManagedListeners();
  6540. },
  6541. clearManagedListeners : function() {
  6542. var managedListeners = this.managedListeners || [],
  6543. i = 0,
  6544. len = managedListeners.length;
  6545. for (; i < len; i++) {
  6546. this.removeManagedListenerItem(true, managedListeners[i]);
  6547. }
  6548. this.managedListeners = [];
  6549. },
  6550. removeManagedListenerItem: function(isClear, managedListener, item, ename, fn, scope){
  6551. if (isClear || (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope))) {
  6552. managedListener.item.un(managedListener.ename, managedListener.fn, managedListener.scope);
  6553. if (!isClear) {
  6554. Ext.Array.remove(this.managedListeners, managedListener);
  6555. }
  6556. }
  6557. },
  6558. addEvents: function(o) {
  6559. var me = this,
  6560. events = me.events || (me.events = {}),
  6561. arg, args, i;
  6562. if (typeof o == 'string') {
  6563. for (args = arguments, i = args.length; i--; ) {
  6564. arg = args[i];
  6565. if (!events[arg]) {
  6566. events[arg] = true;
  6567. }
  6568. }
  6569. } else {
  6570. Ext.applyIf(me.events, o);
  6571. }
  6572. },
  6573. hasListener: function(ename) {
  6574. return !!this.hasListeners[ename.toLowerCase()];
  6575. },
  6576. suspendEvents: function(queueSuspended) {
  6577. this.eventsSuspended += 1;
  6578. if (queueSuspended && !this.eventQueue) {
  6579. this.eventQueue = [];
  6580. }
  6581. },
  6582. resumeEvents: function() {
  6583. var me = this,
  6584. queued = me.eventQueue,
  6585. qLen, q;
  6586. if (me.eventsSuspended && ! --me.eventsSuspended) {
  6587. delete me.eventQueue;
  6588. if (queued) {
  6589. qLen = queued.length;
  6590. for (q = 0; q < qLen; q++) {
  6591. me.continueFireEvent.apply(me, queued[q]);
  6592. }
  6593. }
  6594. }
  6595. },
  6596. relayEvents : function(origin, events, prefix) {
  6597. var me = this,
  6598. len = events.length,
  6599. i = 0,
  6600. oldName,
  6601. newName;
  6602. for (; i < len; i++) {
  6603. oldName = events[i];
  6604. newName = prefix ? prefix + oldName : oldName;
  6605. me.mon(origin, oldName, me.createRelayer(newName));
  6606. }
  6607. },
  6608. createRelayer: function(newName, beginEnd){
  6609. var me = this;
  6610. return function() {
  6611. return me.fireEvent.apply(me, [newName].concat(Array.prototype.slice.apply(arguments, beginEnd || [0, -1])));
  6612. };
  6613. },
  6614. enableBubble: function(eventNames) {
  6615. if (eventNames) {
  6616. var me = this,
  6617. names = (typeof eventNames == 'string') ? arguments : eventNames,
  6618. length = names.length,
  6619. events = me.events,
  6620. ename, event, i;
  6621. for (i = 0; i < length; ++i) {
  6622. ename = names[i].toLowerCase();
  6623. event = events[ename];
  6624. if (!event || typeof event == 'boolean') {
  6625. events[ename] = event = new Ext.util.Event(me, ename);
  6626. }
  6627. me.hasListeners[ename] = (me.hasListeners[ename]||0) + 1;
  6628. event.bubble = true;
  6629. }
  6630. }
  6631. }
  6632. }, function() {
  6633. var Observable = this,
  6634. proto = Observable.prototype,
  6635. HasListeners = function () {},
  6636. prepareMixin = function (T) {
  6637. if (!T.HasListeners) {
  6638. var proto = T.prototype;
  6639. Observable.prepareClass(T, this);
  6640. T.onExtended(function (U) {
  6641. Observable.prepareClass(U);
  6642. });
  6643. if (proto.onClassMixedIn) {
  6644. Ext.override(T, {
  6645. onClassMixedIn: function (U) {
  6646. prepareMixin.call(this, U);
  6647. this.callParent(arguments);
  6648. }
  6649. });
  6650. } else {
  6651. proto.onClassMixedIn = function (U) {
  6652. prepareMixin.call(this, U);
  6653. };
  6654. }
  6655. }
  6656. };
  6657. HasListeners.prototype = {
  6658. };
  6659. proto.HasListeners = Observable.HasListeners = HasListeners;
  6660. Observable.createAlias({
  6661. on: 'addListener',
  6662. un: 'removeListener',
  6663. mon: 'addManagedListener',
  6664. mun: 'removeManagedListener'
  6665. });
  6666. Observable.observeClass = Observable.observe;
  6667. function getMethodEvent(method){
  6668. var e = (this.methodEvents = this.methodEvents || {})[method],
  6669. returnValue,
  6670. v,
  6671. cancel,
  6672. obj = this,
  6673. makeCall;
  6674. if (!e) {
  6675. this.methodEvents[method] = e = {};
  6676. e.originalFn = this[method];
  6677. e.methodName = method;
  6678. e.before = [];
  6679. e.after = [];
  6680. makeCall = function(fn, scope, args){
  6681. if((v = fn.apply(scope || obj, args)) !== undefined){
  6682. if (typeof v == 'object') {
  6683. if(v.returnValue !== undefined){
  6684. returnValue = v.returnValue;
  6685. }else{
  6686. returnValue = v;
  6687. }
  6688. cancel = !!v.cancel;
  6689. }
  6690. else
  6691. if (v === false) {
  6692. cancel = true;
  6693. }
  6694. else {
  6695. returnValue = v;
  6696. }
  6697. }
  6698. };
  6699. this[method] = function(){
  6700. var args = Array.prototype.slice.call(arguments, 0),
  6701. b, i, len;
  6702. returnValue = v = undefined;
  6703. cancel = false;
  6704. for(i = 0, len = e.before.length; i < len; i++){
  6705. b = e.before[i];
  6706. makeCall(b.fn, b.scope, args);
  6707. if (cancel) {
  6708. return returnValue;
  6709. }
  6710. }
  6711. if((v = e.originalFn.apply(obj, args)) !== undefined){
  6712. returnValue = v;
  6713. }
  6714. for(i = 0, len = e.after.length; i < len; i++){
  6715. b = e.after[i];
  6716. makeCall(b.fn, b.scope, args);
  6717. if (cancel) {
  6718. return returnValue;
  6719. }
  6720. }
  6721. return returnValue;
  6722. };
  6723. }
  6724. return e;
  6725. }
  6726. Ext.apply(proto, {
  6727. onClassMixedIn: prepareMixin,
  6728. beforeMethod : function(method, fn, scope){
  6729. getMethodEvent.call(this, method).before.push({
  6730. fn: fn,
  6731. scope: scope
  6732. });
  6733. },
  6734. afterMethod : function(method, fn, scope){
  6735. getMethodEvent.call(this, method).after.push({
  6736. fn: fn,
  6737. scope: scope
  6738. });
  6739. },
  6740. removeMethodListener: function(method, fn, scope){
  6741. var e = this.getMethodEvent(method),
  6742. i, len;
  6743. for(i = 0, len = e.before.length; i < len; i++){
  6744. if(e.before[i].fn == fn && e.before[i].scope == scope){
  6745. Ext.Array.erase(e.before, i, 1);
  6746. return;
  6747. }
  6748. }
  6749. for(i = 0, len = e.after.length; i < len; i++){
  6750. if(e.after[i].fn == fn && e.after[i].scope == scope){
  6751. Ext.Array.erase(e.after, i, 1);
  6752. return;
  6753. }
  6754. }
  6755. },
  6756. toggleEventLogging: function(toggle) {
  6757. Ext.util.Observable[toggle ? 'capture' : 'releaseCapture'](this, function(en) {
  6758. if (Ext.isDefined(Ext.global.console)) {
  6759. Ext.global.console.log(en, arguments);
  6760. }
  6761. });
  6762. }
  6763. });
  6764. });
  6765. Ext.define('Ext.util.HashMap', {
  6766. mixins: {
  6767. observable: 'Ext.util.Observable'
  6768. },
  6769. constructor: function(config) {
  6770. config = config || {};
  6771. var me = this,
  6772. keyFn = config.keyFn;
  6773. me.addEvents(
  6774. 'add',
  6775. 'clear',
  6776. 'remove',
  6777. 'replace'
  6778. );
  6779. me.mixins.observable.constructor.call(me, config);
  6780. me.clear(true);
  6781. if (keyFn) {
  6782. me.getKey = keyFn;
  6783. }
  6784. },
  6785. getCount: function() {
  6786. return this.length;
  6787. },
  6788. getData: function(key, value) {
  6789. if (value === undefined) {
  6790. value = key;
  6791. key = this.getKey(value);
  6792. }
  6793. return [key, value];
  6794. },
  6795. getKey: function(o) {
  6796. return o.id;
  6797. },
  6798. add: function(key, value) {
  6799. var me = this;
  6800. if (value === undefined) {
  6801. value = key;
  6802. key = me.getKey(value);
  6803. }
  6804. if (me.containsKey(key)) {
  6805. return me.replace(key, value);
  6806. }
  6807. me.map[key] = value;
  6808. ++me.length;
  6809. if (me.hasListeners.add) {
  6810. me.fireEvent('add', me, key, value);
  6811. }
  6812. return value;
  6813. },
  6814. replace: function(key, value) {
  6815. var me = this,
  6816. map = me.map,
  6817. old;
  6818. if (value === undefined) {
  6819. value = key;
  6820. key = me.getKey(value);
  6821. }
  6822. if (!me.containsKey(key)) {
  6823. me.add(key, value);
  6824. }
  6825. old = map[key];
  6826. map[key] = value;
  6827. if (me.hasListeners.replace) {
  6828. me.fireEvent('replace', me, key, value, old);
  6829. }
  6830. return value;
  6831. },
  6832. remove: function(o) {
  6833. var key = this.findKey(o);
  6834. if (key !== undefined) {
  6835. return this.removeAtKey(key);
  6836. }
  6837. return false;
  6838. },
  6839. removeAtKey: function(key) {
  6840. var me = this,
  6841. value;
  6842. if (me.containsKey(key)) {
  6843. value = me.map[key];
  6844. delete me.map[key];
  6845. --me.length;
  6846. if (me.hasListeners.remove) {
  6847. me.fireEvent('remove', me, key, value);
  6848. }
  6849. return true;
  6850. }
  6851. return false;
  6852. },
  6853. get: function(key) {
  6854. return this.map[key];
  6855. },
  6856. clear: function( initial) {
  6857. var me = this;
  6858. me.map = {};
  6859. me.length = 0;
  6860. if (initial !== true && me.hasListeners.clear) {
  6861. me.fireEvent('clear', me);
  6862. }
  6863. return me;
  6864. },
  6865. containsKey: function(key) {
  6866. return this.map[key] !== undefined;
  6867. },
  6868. contains: function(value) {
  6869. return this.containsKey(this.findKey(value));
  6870. },
  6871. getKeys: function() {
  6872. return this.getArray(true);
  6873. },
  6874. getValues: function() {
  6875. return this.getArray(false);
  6876. },
  6877. getArray: function(isKey) {
  6878. var arr = [],
  6879. key,
  6880. map = this.map;
  6881. for (key in map) {
  6882. if (map.hasOwnProperty(key)) {
  6883. arr.push(isKey ? key: map[key]);
  6884. }
  6885. }
  6886. return arr;
  6887. },
  6888. each: function(fn, scope) {
  6889. var items = Ext.apply({}, this.map),
  6890. key,
  6891. length = this.length;
  6892. scope = scope || this;
  6893. for (key in items) {
  6894. if (items.hasOwnProperty(key)) {
  6895. if (fn.call(scope, key, items[key], length) === false) {
  6896. break;
  6897. }
  6898. }
  6899. }
  6900. return this;
  6901. },
  6902. clone: function() {
  6903. var hash = new this.self(),
  6904. map = this.map,
  6905. key;
  6906. hash.suspendEvents();
  6907. for (key in map) {
  6908. if (map.hasOwnProperty(key)) {
  6909. hash.add(key, map[key]);
  6910. }
  6911. }
  6912. hash.resumeEvents();
  6913. return hash;
  6914. },
  6915. findKey: function(value) {
  6916. var key,
  6917. map = this.map;
  6918. for (key in map) {
  6919. if (map.hasOwnProperty(key) && map[key] === value) {
  6920. return key;
  6921. }
  6922. }
  6923. return undefined;
  6924. }
  6925. });
  6926. Ext.define('Ext.AbstractManager', {
  6927. requires: ['Ext.util.HashMap'],
  6928. typeName: 'type',
  6929. constructor: function(config) {
  6930. Ext.apply(this, config || {});
  6931. this.all = new Ext.util.HashMap();
  6932. this.types = {};
  6933. },
  6934. get : function(id) {
  6935. return this.all.get(id);
  6936. },
  6937. register: function(item) {
  6938. this.all.add(item);
  6939. },
  6940. unregister: function(item) {
  6941. this.all.remove(item);
  6942. },
  6943. registerType : function(type, cls) {
  6944. this.types[type] = cls;
  6945. cls[this.typeName] = type;
  6946. },
  6947. isRegistered : function(type){
  6948. return this.types[type] !== undefined;
  6949. },
  6950. create: function(config, defaultType) {
  6951. var type = config[this.typeName] || config.type || defaultType,
  6952. Constructor = this.types[type];
  6953. return new Constructor(config);
  6954. },
  6955. onAvailable : function(id, fn, scope){
  6956. var all = this.all,
  6957. item,
  6958. callback;
  6959. if (all.containsKey(id)) {
  6960. item = all.get(id);
  6961. fn.call(scope || item, item);
  6962. } else {
  6963. callback = function(map, key, item){
  6964. if (key == id) {
  6965. fn.call(scope || item, item);
  6966. all.un('add', callback);
  6967. }
  6968. };
  6969. all.on('add', callback);
  6970. }
  6971. },
  6972. each: function(fn, scope){
  6973. this.all.each(fn, scope || this);
  6974. },
  6975. getCount: function(){
  6976. return this.all.getCount();
  6977. }
  6978. });
  6979. Ext.define('Ext.ComponentManager', {
  6980. extend: 'Ext.AbstractManager',
  6981. alternateClassName: 'Ext.ComponentMgr',
  6982. singleton: true,
  6983. typeName: 'xtype',
  6984. create: function(component, defaultType){
  6985. if (typeof component == 'string') {
  6986. return Ext.widget(component);
  6987. }
  6988. if (component.isComponent) {
  6989. return component;
  6990. }
  6991. return Ext.widget(component.xtype || defaultType, component);
  6992. },
  6993. registerType: function(type, cls) {
  6994. this.types[type] = cls;
  6995. cls[this.typeName] = type;
  6996. cls.prototype[this.typeName] = type;
  6997. }
  6998. });
  6999. Ext.define('Ext.ComponentQuery', {
  7000. singleton: true,
  7001. requires: ['Ext.ComponentManager']
  7002. }, function() {
  7003. var cq = this,
  7004. filterFnPattern = [
  7005. 'var r = [],',
  7006. 'i = 0,',
  7007. 'it = items,',
  7008. 'l = it.length,',
  7009. 'c;',
  7010. 'for (; i < l; i++) {',
  7011. 'c = it[i];',
  7012. 'if (c.{0}) {',
  7013. 'r.push(c);',
  7014. '}',
  7015. '}',
  7016. 'return r;'
  7017. ].join(''),
  7018. filterItems = function(items, operation) {
  7019. return operation.method.apply(this, [ items ].concat(operation.args));
  7020. },
  7021. getItems = function(items, mode) {
  7022. var result = [],
  7023. i = 0,
  7024. length = items.length,
  7025. candidate,
  7026. deep = mode !== '>';
  7027. for (; i < length; i++) {
  7028. candidate = items[i];
  7029. if (candidate.getRefItems) {
  7030. result = result.concat(candidate.getRefItems(deep));
  7031. }
  7032. }
  7033. return result;
  7034. },
  7035. getAncestors = function(items) {
  7036. var result = [],
  7037. i = 0,
  7038. length = items.length,
  7039. candidate;
  7040. for (; i < length; i++) {
  7041. candidate = items[i];
  7042. while (!!(candidate = (candidate.ownerCt || candidate.floatParent))) {
  7043. result.push(candidate);
  7044. }
  7045. }
  7046. return result;
  7047. },
  7048. filterByXType = function(items, xtype, shallow) {
  7049. if (xtype === '*') {
  7050. return items.slice();
  7051. }
  7052. else {
  7053. var result = [],
  7054. i = 0,
  7055. length = items.length,
  7056. candidate;
  7057. for (; i < length; i++) {
  7058. candidate = items[i];
  7059. if (candidate.isXType(xtype, shallow)) {
  7060. result.push(candidate);
  7061. }
  7062. }
  7063. return result;
  7064. }
  7065. },
  7066. filterByClassName = function(items, className) {
  7067. var EA = Ext.Array,
  7068. result = [],
  7069. i = 0,
  7070. length = items.length,
  7071. candidate;
  7072. for (; i < length; i++) {
  7073. candidate = items[i];
  7074. if (candidate.hasCls(className)) {
  7075. result.push(candidate);
  7076. }
  7077. }
  7078. return result;
  7079. },
  7080. filterByAttribute = function(items, property, operator, value) {
  7081. var result = [],
  7082. i = 0,
  7083. length = items.length,
  7084. candidate;
  7085. for (; i < length; i++) {
  7086. candidate = items[i];
  7087. if (!value ? !!candidate[property] : (String(candidate[property]) === value)) {
  7088. result.push(candidate);
  7089. }
  7090. }
  7091. return result;
  7092. },
  7093. filterById = function(items, id) {
  7094. var result = [],
  7095. i = 0,
  7096. length = items.length,
  7097. candidate;
  7098. for (; i < length; i++) {
  7099. candidate = items[i];
  7100. if (candidate.getItemId() === id) {
  7101. result.push(candidate);
  7102. }
  7103. }
  7104. return result;
  7105. },
  7106. filterByPseudo = function(items, name, value) {
  7107. return cq.pseudos[name](items, value);
  7108. },
  7109. modeRe = /^(\s?([>\^])\s?|\s|$)/,
  7110. tokenRe = /^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,
  7111. matchers = [{
  7112. re: /^\.([\w\-]+)(?:\((true|false)\))?/,
  7113. method: filterByXType
  7114. },{
  7115. re: /^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,
  7116. method: filterByAttribute
  7117. }, {
  7118. re: /^#([\w\-]+)/,
  7119. method: filterById
  7120. }, {
  7121. re: /^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,
  7122. method: filterByPseudo
  7123. }, {
  7124. re: /^(?:\{([^\}]+)\})/,
  7125. method: filterFnPattern
  7126. }];
  7127. cq.Query = Ext.extend(Object, {
  7128. constructor: function(cfg) {
  7129. cfg = cfg || {};
  7130. Ext.apply(this, cfg);
  7131. },
  7132. execute : function(root) {
  7133. var operations = this.operations,
  7134. i = 0,
  7135. length = operations.length,
  7136. operation,
  7137. workingItems;
  7138. if (!root) {
  7139. workingItems = Ext.ComponentManager.all.getArray();
  7140. }
  7141. else if (Ext.isArray(root)) {
  7142. workingItems = root;
  7143. }
  7144. else if (root.isMixedCollection) {
  7145. workingItems = root.items;
  7146. }
  7147. for (; i < length; i++) {
  7148. operation = operations[i];
  7149. if (operation.mode === '^') {
  7150. workingItems = getAncestors(workingItems || [root]);
  7151. }
  7152. else if (operation.mode) {
  7153. workingItems = getItems(workingItems || [root], operation.mode);
  7154. }
  7155. else {
  7156. workingItems = filterItems(workingItems || getItems([root]), operation);
  7157. }
  7158. if (i === length -1) {
  7159. return workingItems;
  7160. }
  7161. }
  7162. return [];
  7163. },
  7164. is: function(component) {
  7165. var operations = this.operations,
  7166. components = Ext.isArray(component) ? component : [component],
  7167. originalLength = components.length,
  7168. lastOperation = operations[operations.length-1],
  7169. ln, i;
  7170. components = filterItems(components, lastOperation);
  7171. if (components.length === originalLength) {
  7172. if (operations.length > 1) {
  7173. for (i = 0, ln = components.length; i < ln; i++) {
  7174. if (Ext.Array.indexOf(this.execute(), components[i]) === -1) {
  7175. return false;
  7176. }
  7177. }
  7178. }
  7179. return true;
  7180. }
  7181. return false;
  7182. }
  7183. });
  7184. Ext.apply(this, {
  7185. cache: {},
  7186. pseudos: {
  7187. not: function(components, selector){
  7188. var CQ = Ext.ComponentQuery,
  7189. i = 0,
  7190. length = components.length,
  7191. results = [],
  7192. index = -1,
  7193. component;
  7194. for(; i < length; ++i) {
  7195. component = components[i];
  7196. if (!CQ.is(component, selector)) {
  7197. results[++index] = component;
  7198. }
  7199. }
  7200. return results;
  7201. },
  7202. first: function(components) {
  7203. var ret = [];
  7204. if (components.length > 0) {
  7205. ret.push(components[0]);
  7206. }
  7207. return ret;
  7208. },
  7209. last: function(components) {
  7210. var len = components.length,
  7211. ret = [];
  7212. if (len > 0) {
  7213. ret.push(components[len - 1]);
  7214. }
  7215. return ret;
  7216. }
  7217. },
  7218. query: function(selector, root) {
  7219. var selectors = selector.split(','),
  7220. length = selectors.length,
  7221. i = 0,
  7222. results = [],
  7223. noDupResults = [],
  7224. dupMatcher = {},
  7225. query, resultsLn, cmp;
  7226. for (; i < length; i++) {
  7227. selector = Ext.String.trim(selectors[i]);
  7228. query = this.cache[selector] || (this.cache[selector] = this.parse(selector));
  7229. results = results.concat(query.execute(root));
  7230. }
  7231. if (length > 1) {
  7232. resultsLn = results.length;
  7233. for (i = 0; i < resultsLn; i++) {
  7234. cmp = results[i];
  7235. if (!dupMatcher[cmp.id]) {
  7236. noDupResults.push(cmp);
  7237. dupMatcher[cmp.id] = true;
  7238. }
  7239. }
  7240. results = noDupResults;
  7241. }
  7242. return results;
  7243. },
  7244. is: function(component, selector) {
  7245. if (!selector) {
  7246. return true;
  7247. }
  7248. var selectors = selector.split(','),
  7249. length = selectors.length,
  7250. i = 0,
  7251. query;
  7252. for (; i < length; i++) {
  7253. selector = Ext.String.trim(selectors[i]);
  7254. query = this.cache[selector] || (this.cache[selector] = this.parse(selector));
  7255. if (query.is(component)) {
  7256. return true;
  7257. }
  7258. }
  7259. return false;
  7260. },
  7261. parse: function(selector) {
  7262. var operations = [],
  7263. length = matchers.length,
  7264. lastSelector,
  7265. tokenMatch,
  7266. matchedChar,
  7267. modeMatch,
  7268. selectorMatch,
  7269. i, matcher, method;
  7270. while (selector && lastSelector !== selector) {
  7271. lastSelector = selector;
  7272. tokenMatch = selector.match(tokenRe);
  7273. if (tokenMatch) {
  7274. matchedChar = tokenMatch[1];
  7275. if (matchedChar === '#') {
  7276. operations.push({
  7277. method: filterById,
  7278. args: [Ext.String.trim(tokenMatch[2])]
  7279. });
  7280. }
  7281. else if (matchedChar === '.') {
  7282. operations.push({
  7283. method: filterByClassName,
  7284. args: [Ext.String.trim(tokenMatch[2])]
  7285. });
  7286. }
  7287. else {
  7288. operations.push({
  7289. method: filterByXType,
  7290. args: [Ext.String.trim(tokenMatch[2]), Boolean(tokenMatch[3])]
  7291. });
  7292. }
  7293. selector = selector.replace(tokenMatch[0], '');
  7294. }
  7295. while (!(modeMatch = selector.match(modeRe))) {
  7296. for (i = 0; selector && i < length; i++) {
  7297. matcher = matchers[i];
  7298. selectorMatch = selector.match(matcher.re);
  7299. method = matcher.method;
  7300. if (selectorMatch) {
  7301. operations.push({
  7302. method: Ext.isString(matcher.method)
  7303. ? Ext.functionFactory('items', Ext.String.format.apply(Ext.String, [method].concat(selectorMatch.slice(1))))
  7304. : matcher.method,
  7305. args: selectorMatch.slice(1)
  7306. });
  7307. selector = selector.replace(selectorMatch[0], '');
  7308. break;
  7309. }
  7310. if (i === (length - 1)) {
  7311. Ext.Error.raise('Invalid ComponentQuery selector: "' + arguments[0] + '"');
  7312. }
  7313. }
  7314. }
  7315. if (modeMatch[1]) {
  7316. operations.push({
  7317. mode: modeMatch[2]||modeMatch[1]
  7318. });
  7319. selector = selector.replace(modeMatch[0], '');
  7320. }
  7321. }
  7322. return new cq.Query({
  7323. operations: operations
  7324. });
  7325. }
  7326. });
  7327. });
  7328. Ext.define('Ext.util.ProtoElement', (function () {
  7329. var splitWords = Ext.String.splitWords,
  7330. toMap = Ext.Array.toMap;
  7331. return {
  7332. isProtoEl: true,
  7333. clsProp: 'cls',
  7334. styleProp: 'style',
  7335. removedProp: 'removed',
  7336. styleIsText: false,
  7337. constructor: function (config) {
  7338. var me = this;
  7339. Ext.apply(me, config);
  7340. me.classList = splitWords(me.cls);
  7341. me.classMap = toMap(me.classList);
  7342. delete me.cls;
  7343. if (Ext.isFunction(me.style)) {
  7344. me.styleFn = me.style;
  7345. delete me.style;
  7346. } else if (typeof me.style == 'string') {
  7347. me.style = Ext.Element.parseStyles(me.style);
  7348. } else if (me.style) {
  7349. me.style = Ext.apply({}, me.style);
  7350. }
  7351. },
  7352. flush: function(){
  7353. this.flushClassList = [];
  7354. this.removedClasses = {};
  7355. delete this.style;
  7356. },
  7357. addCls: function (cls) {
  7358. var me = this,
  7359. add = splitWords(cls),
  7360. length = add.length,
  7361. list = me.classList,
  7362. map = me.classMap,
  7363. flushList = me.flushClassList,
  7364. i = 0,
  7365. c;
  7366. for (; i < length; ++i) {
  7367. c = add[i];
  7368. if (!map[c]) {
  7369. map[c] = true;
  7370. list.push(c);
  7371. if (flushList) {
  7372. flushList.push(c);
  7373. delete me.removedClasses[c];
  7374. }
  7375. }
  7376. }
  7377. return me;
  7378. },
  7379. hasCls: function (cls) {
  7380. return cls in this.classMap;
  7381. },
  7382. removeCls: function (cls) {
  7383. var me = this,
  7384. list = me.classList,
  7385. newList = (me.classList = []),
  7386. remove = toMap(splitWords(cls)),
  7387. length = list.length,
  7388. map = me.classMap,
  7389. removedClasses = me.removedClasses,
  7390. i, c;
  7391. for (i = 0; i < length; ++i) {
  7392. c = list[i];
  7393. if (remove[c]) {
  7394. if (removedClasses) {
  7395. if (map[c]) {
  7396. removedClasses[c] = true;
  7397. Ext.Array.remove(me.flushClassList, c);
  7398. }
  7399. }
  7400. delete map[c];
  7401. } else {
  7402. newList.push(c);
  7403. }
  7404. }
  7405. return me;
  7406. },
  7407. setStyle: function (prop, value) {
  7408. var me = this,
  7409. style = me.style || (me.style = {});
  7410. if (typeof prop == 'string') {
  7411. if (arguments.length === 1) {
  7412. me.setStyle(Ext.Element.parseStyles(prop));
  7413. } else {
  7414. style[prop] = value;
  7415. }
  7416. } else {
  7417. Ext.apply(style, prop);
  7418. }
  7419. return me;
  7420. },
  7421. writeTo: function (to) {
  7422. var me = this,
  7423. classList = me.flushClassList || me.classList,
  7424. removedClasses = me.removedClasses,
  7425. style;
  7426. if (me.styleFn) {
  7427. style = Ext.apply({}, me.styleFn());
  7428. Ext.apply(style, me.style);
  7429. } else {
  7430. style = me.style;
  7431. }
  7432. to[me.clsProp] = classList.join(' ');
  7433. if (style) {
  7434. to[me.styleProp] = me.styleIsText ? Ext.DomHelper.generateStyles(style) : style;
  7435. }
  7436. if (removedClasses) {
  7437. removedClasses = Ext.Object.getKeys(removedClasses);
  7438. if (removedClasses.length) {
  7439. to[me.removedProp] = removedClasses.join(' ');
  7440. }
  7441. }
  7442. return to;
  7443. }
  7444. };
  7445. }()));
  7446. //@tag dom,core
  7447. //@require util/Event.js
  7448. //@define Ext.EventManager
  7449. Ext.EventManager = new function() {
  7450. var EventManager = this,
  7451. doc = document,
  7452. win = window,
  7453. initExtCss = function() {
  7454. var bd = doc.body || doc.getElementsByTagName('body')[0],
  7455. baseCSSPrefix = Ext.baseCSSPrefix,
  7456. cls = [baseCSSPrefix + 'body'],
  7457. htmlCls = [],
  7458. supportsLG = Ext.supports.CSS3LinearGradient,
  7459. supportsBR = Ext.supports.CSS3BorderRadius,
  7460. resetCls = [],
  7461. html,
  7462. resetElementSpec;
  7463. if (!bd) {
  7464. return false;
  7465. }
  7466. html = bd.parentNode;
  7467. function add (c) {
  7468. cls.push(baseCSSPrefix + c);
  7469. }
  7470. if (Ext.isIE) {
  7471. add('ie');
  7472. if (Ext.isIE6) {
  7473. add('ie6');
  7474. } else {
  7475. add('ie7p');
  7476. if (Ext.isIE7) {
  7477. add('ie7');
  7478. } else {
  7479. add('ie8p');
  7480. if (Ext.isIE8) {
  7481. add('ie8');
  7482. } else {
  7483. add('ie9p');
  7484. if (Ext.isIE9) {
  7485. add('ie9');
  7486. }
  7487. }
  7488. }
  7489. }
  7490. if (Ext.isIE6 || Ext.isIE7) {
  7491. add('ie7m');
  7492. }
  7493. if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8) {
  7494. add('ie8m');
  7495. }
  7496. if (Ext.isIE7 || Ext.isIE8) {
  7497. add('ie78');
  7498. }
  7499. }
  7500. if (Ext.isGecko) {
  7501. add('gecko');
  7502. if (Ext.isGecko3) {
  7503. add('gecko3');
  7504. }
  7505. if (Ext.isGecko4) {
  7506. add('gecko4');
  7507. }
  7508. if (Ext.isGecko5) {
  7509. add('gecko5');
  7510. }
  7511. }
  7512. if (Ext.isOpera) {
  7513. add('opera');
  7514. }
  7515. if (Ext.isWebKit) {
  7516. add('webkit');
  7517. }
  7518. if (Ext.isSafari) {
  7519. add('safari');
  7520. if (Ext.isSafari2) {
  7521. add('safari2');
  7522. }
  7523. if (Ext.isSafari3) {
  7524. add('safari3');
  7525. }
  7526. if (Ext.isSafari4) {
  7527. add('safari4');
  7528. }
  7529. if (Ext.isSafari5) {
  7530. add('safari5');
  7531. }
  7532. if (Ext.isSafari5_0) {
  7533. add('safari5_0')
  7534. }
  7535. }
  7536. if (Ext.isChrome) {
  7537. add('chrome');
  7538. }
  7539. if (Ext.isMac) {
  7540. add('mac');
  7541. }
  7542. if (Ext.isLinux) {
  7543. add('linux');
  7544. }
  7545. if (!supportsBR) {
  7546. add('nbr');
  7547. }
  7548. if (!supportsLG) {
  7549. add('nlg');
  7550. }
  7551. if (Ext.scopeResetCSS) {
  7552. resetElementSpec = Ext.resetElementSpec = {
  7553. cls: baseCSSPrefix + 'reset'
  7554. };
  7555. if (!supportsLG) {
  7556. resetCls.push(baseCSSPrefix + 'nlg');
  7557. }
  7558. if (!supportsBR) {
  7559. resetCls.push(baseCSSPrefix + 'nbr');
  7560. }
  7561. if (resetCls.length) {
  7562. resetElementSpec.cn = {
  7563. cls: resetCls.join(' ')
  7564. };
  7565. }
  7566. Ext.resetElement = Ext.getBody().createChild(resetElementSpec);
  7567. if (resetCls.length) {
  7568. Ext.resetElement = Ext.get(Ext.resetElement.dom.firstChild);
  7569. }
  7570. }
  7571. else {
  7572. Ext.resetElement = Ext.getBody();
  7573. add('reset');
  7574. }
  7575. if (html) {
  7576. if (Ext.isStrict && (Ext.isIE6 || Ext.isIE7)) {
  7577. Ext.isBorderBox = false;
  7578. }
  7579. else {
  7580. Ext.isBorderBox = true;
  7581. }
  7582. if(Ext.isBorderBox) {
  7583. htmlCls.push(baseCSSPrefix + 'border-box');
  7584. }
  7585. if (Ext.isStrict) {
  7586. htmlCls.push(baseCSSPrefix + 'strict');
  7587. } else {
  7588. htmlCls.push(baseCSSPrefix + 'quirks');
  7589. }
  7590. Ext.fly(html, '_internal').addCls(htmlCls);
  7591. }
  7592. Ext.fly(bd, '_internal').addCls(cls);
  7593. return true;
  7594. };
  7595. Ext.apply(EventManager, {
  7596. hasBoundOnReady: false,
  7597. hasFiredReady: false,
  7598. deferReadyEvent : 1,
  7599. onReadyChain : [],
  7600. readyEvent:
  7601. (function () {
  7602. var event = new Ext.util.Event();
  7603. event.fire = function () {
  7604. Ext._beforeReadyTime = Ext._beforeReadyTime || new Date().getTime();
  7605. event.self.prototype.fire.apply(event, arguments);
  7606. Ext._afterReadytime = new Date().getTime();
  7607. };
  7608. return event;
  7609. }()),
  7610. idleEvent: new Ext.util.Event(),
  7611. isReadyPaused: function(){
  7612. return (/[?&]ext-pauseReadyFire\b/i.test(location.search) && !Ext._continueFireReady);
  7613. },
  7614. bindReadyEvent: function() {
  7615. if (EventManager.hasBoundOnReady) {
  7616. return;
  7617. }
  7618. if ( doc.readyState == 'complete' ) {
  7619. EventManager.onReadyEvent({
  7620. type: doc.readyState || 'body'
  7621. });
  7622. } else {
  7623. document.addEventListener('DOMContentLoaded', EventManager.onReadyEvent, false);
  7624. window.addEventListener('load', EventManager.onReadyEvent, false);
  7625. EventManager.hasBoundOnReady = true;
  7626. }
  7627. },
  7628. onReadyEvent : function(e) {
  7629. if (e && e.type) {
  7630. EventManager.onReadyChain.push(e.type);
  7631. }
  7632. if (EventManager.hasBoundOnReady) {
  7633. document.removeEventListener('DOMContentLoaded', EventManager.onReadyEvent, false);
  7634. window.removeEventListener('load', EventManager.onReadyEvent, false);
  7635. }
  7636. if (!Ext.isReady) {
  7637. EventManager.fireDocReady();
  7638. }
  7639. },
  7640. fireDocReady: function() {
  7641. if (!Ext.isReady) {
  7642. Ext._readyTime = new Date().getTime();
  7643. Ext.isReady = true;
  7644. Ext.supports.init();
  7645. EventManager.onWindowUnload();
  7646. EventManager.readyEvent.onReadyChain = EventManager.onReadyChain;
  7647. if (Ext.isNumber(EventManager.deferReadyEvent)) {
  7648. Ext.Function.defer(EventManager.fireReadyEvent, EventManager.deferReadyEvent);
  7649. EventManager.hasDocReadyTimer = true;
  7650. } else {
  7651. EventManager.fireReadyEvent();
  7652. }
  7653. }
  7654. },
  7655. fireReadyEvent: function(){
  7656. var readyEvent = EventManager.readyEvent;
  7657. EventManager.hasDocReadyTimer = false;
  7658. EventManager.isFiring = true;
  7659. while (readyEvent.listeners.length && !EventManager.isReadyPaused()) {
  7660. readyEvent.fire();
  7661. }
  7662. EventManager.isFiring = false;
  7663. EventManager.hasFiredReady = true;
  7664. },
  7665. onDocumentReady: function(fn, scope, options) {
  7666. options = options || {};
  7667. options.single = true;
  7668. EventManager.readyEvent.addListener(fn, scope, options);
  7669. if (!(EventManager.isFiring || EventManager.hasDocReadyTimer)) {
  7670. if (Ext.isReady) {
  7671. EventManager.fireReadyEvent();
  7672. } else {
  7673. EventManager.bindReadyEvent();
  7674. }
  7675. }
  7676. },
  7677. stoppedMouseDownEvent: new Ext.util.Event(),
  7678. propRe: /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate|freezeEvent)$/,
  7679. getId : function(element) {
  7680. var id;
  7681. element = Ext.getDom(element);
  7682. if (element === doc || element === win) {
  7683. id = element === doc ? Ext.documentId : Ext.windowId;
  7684. }
  7685. else {
  7686. id = Ext.id(element);
  7687. }
  7688. if (!Ext.cache[id]) {
  7689. Ext.addCacheEntry(id, null, element);
  7690. }
  7691. return id;
  7692. },
  7693. prepareListenerConfig: function(element, config, isRemove) {
  7694. var propRe = EventManager.propRe,
  7695. key, value, args;
  7696. for (key in config) {
  7697. if (config.hasOwnProperty(key)) {
  7698. if (!propRe.test(key)) {
  7699. value = config[key];
  7700. if (typeof value == 'function') {
  7701. args = [element, key, value, config.scope, config];
  7702. } else {
  7703. args = [element, key, value.fn, value.scope, value];
  7704. }
  7705. if (isRemove) {
  7706. EventManager.removeListener.apply(EventManager, args);
  7707. } else {
  7708. EventManager.addListener.apply(EventManager, args);
  7709. }
  7710. }
  7711. }
  7712. }
  7713. },
  7714. mouseEnterLeaveRe: /mouseenter|mouseleave/,
  7715. normalizeEvent: function(eventName, fn) {
  7716. if (EventManager.mouseEnterLeaveRe.test(eventName) && !Ext.supports.MouseEnterLeave) {
  7717. if (fn) {
  7718. fn = Ext.Function.createInterceptor(fn, EventManager.contains);
  7719. }
  7720. eventName = eventName == 'mouseenter' ? 'mouseover' : 'mouseout';
  7721. } else if (eventName == 'mousewheel' && !Ext.supports.MouseWheel && !Ext.isOpera) {
  7722. eventName = 'DOMMouseScroll';
  7723. }
  7724. return {
  7725. eventName: eventName,
  7726. fn: fn
  7727. };
  7728. },
  7729. contains: function(event) {
  7730. var parent = event.browserEvent.currentTarget,
  7731. child = EventManager.getRelatedTarget(event);
  7732. if (parent && parent.firstChild) {
  7733. while (child) {
  7734. if (child === parent) {
  7735. return false;
  7736. }
  7737. child = child.parentNode;
  7738. if (child && (child.nodeType != 1)) {
  7739. child = null;
  7740. }
  7741. }
  7742. }
  7743. return true;
  7744. },
  7745. addListener: function(element, eventName, fn, scope, options) {
  7746. if (typeof eventName !== 'string') {
  7747. EventManager.prepareListenerConfig(element, eventName);
  7748. return;
  7749. }
  7750. var dom = element.dom || Ext.getDom(element),
  7751. bind, wrap;
  7752. options = options || {};
  7753. bind = EventManager.normalizeEvent(eventName, fn);
  7754. wrap = EventManager.createListenerWrap(dom, eventName, bind.fn, scope, options);
  7755. if (dom.attachEvent) {
  7756. dom.attachEvent('on' + bind.eventName, wrap);
  7757. } else {
  7758. dom.addEventListener(bind.eventName, wrap, options.capture || false);
  7759. }
  7760. if (dom == doc && eventName == 'mousedown') {
  7761. EventManager.stoppedMouseDownEvent.addListener(wrap);
  7762. }
  7763. EventManager.getEventListenerCache(element.dom ? element : dom, eventName).push({
  7764. fn: fn,
  7765. wrap: wrap,
  7766. scope: scope
  7767. });
  7768. },
  7769. removeListener : function(element, eventName, fn, scope) {
  7770. if (typeof eventName !== 'string') {
  7771. EventManager.prepareListenerConfig(element, eventName, true);
  7772. return;
  7773. }
  7774. var dom = Ext.getDom(element),
  7775. el = element.dom ? element : Ext.get(dom),
  7776. cache = EventManager.getEventListenerCache(el, eventName),
  7777. bindName = EventManager.normalizeEvent(eventName).eventName,
  7778. i = cache.length, j,
  7779. listener, wrap, tasks;
  7780. while (i--) {
  7781. listener = cache[i];
  7782. if (listener && (!fn || listener.fn == fn) && (!scope || listener.scope === scope)) {
  7783. wrap = listener.wrap;
  7784. if (wrap.task) {
  7785. clearTimeout(wrap.task);
  7786. delete wrap.task;
  7787. }
  7788. j = wrap.tasks && wrap.tasks.length;
  7789. if (j) {
  7790. while (j--) {
  7791. clearTimeout(wrap.tasks[j]);
  7792. }
  7793. delete wrap.tasks;
  7794. }
  7795. if (dom.detachEvent) {
  7796. dom.detachEvent('on' + bindName, wrap);
  7797. } else {
  7798. dom.removeEventListener(bindName, wrap, false);
  7799. }
  7800. if (wrap && dom == doc && eventName == 'mousedown') {
  7801. EventManager.stoppedMouseDownEvent.removeListener(wrap);
  7802. }
  7803. Ext.Array.erase(cache, i, 1);
  7804. }
  7805. }
  7806. },
  7807. removeAll : function(element) {
  7808. var el = element.dom ? element : Ext.get(element),
  7809. cache, events, eventName;
  7810. if (!el) {
  7811. return;
  7812. }
  7813. cache = (el.$cache || el.getCache());
  7814. events = cache.events;
  7815. for (eventName in events) {
  7816. if (events.hasOwnProperty(eventName)) {
  7817. EventManager.removeListener(el, eventName);
  7818. }
  7819. }
  7820. cache.events = {};
  7821. },
  7822. purgeElement : function(element, eventName) {
  7823. var dom = Ext.getDom(element),
  7824. i = 0, len;
  7825. if (eventName) {
  7826. EventManager.removeListener(element, eventName);
  7827. }
  7828. else {
  7829. EventManager.removeAll(element);
  7830. }
  7831. if (dom && dom.childNodes) {
  7832. for (len = element.childNodes.length; i < len; i++) {
  7833. EventManager.purgeElement(element.childNodes[i], eventName);
  7834. }
  7835. }
  7836. },
  7837. createListenerWrap : function(dom, ename, fn, scope, options) {
  7838. options = options || {};
  7839. var f, gen, escapeRx = /\\/g, wrap = function(e, args) {
  7840. if (!gen) {
  7841. f = ['if(!' + Ext.name + ') {return;}'];
  7842. if(options.buffer || options.delay || options.freezeEvent) {
  7843. f.push('e = new X.EventObjectImpl(e, ' + (options.freezeEvent ? 'true' : 'false' ) + ');');
  7844. } else {
  7845. f.push('e = X.EventObject.setEvent(e);');
  7846. }
  7847. if (options.delegate) {
  7848. f.push('var result, t = e.getTarget("' + (options.delegate + '').replace(escapeRx, '\\\\') + '", this);');
  7849. f.push('if(!t) {return;}');
  7850. } else {
  7851. f.push('var t = e.target, result;');
  7852. }
  7853. if (options.target) {
  7854. f.push('if(e.target !== options.target) {return;}');
  7855. }
  7856. if(options.stopEvent) {
  7857. f.push('e.stopEvent();');
  7858. } else {
  7859. if(options.preventDefault) {
  7860. f.push('e.preventDefault();');
  7861. }
  7862. if(options.stopPropagation) {
  7863. f.push('e.stopPropagation();');
  7864. }
  7865. }
  7866. if(options.normalized === false) {
  7867. f.push('e = e.browserEvent;');
  7868. }
  7869. if(options.buffer) {
  7870. f.push('(wrap.task && clearTimeout(wrap.task));');
  7871. f.push('wrap.task = setTimeout(function() {');
  7872. }
  7873. if(options.delay) {
  7874. f.push('wrap.tasks = wrap.tasks || [];');
  7875. f.push('wrap.tasks.push(setTimeout(function() {');
  7876. }
  7877. f.push('result = fn.call(scope || dom, e, t, options);');
  7878. if(options.single) {
  7879. f.push('evtMgr.removeListener(dom, ename, fn, scope);');
  7880. }
  7881. if (ename !== 'mousemove') {
  7882. f.push('if (evtMgr.idleEvent.listeners.length) {');
  7883. f.push('evtMgr.idleEvent.fire();');
  7884. f.push('}');
  7885. }
  7886. if(options.delay) {
  7887. f.push('}, ' + options.delay + '));');
  7888. }
  7889. if(options.buffer) {
  7890. f.push('}, ' + options.buffer + ');');
  7891. }
  7892. f.push('return result;')
  7893. gen = Ext.cacheableFunctionFactory('e', 'options', 'fn', 'scope', 'ename', 'dom', 'wrap', 'args', 'X', 'evtMgr', f.join('\n'));
  7894. }
  7895. return gen.call(dom, e, options, fn, scope, ename, dom, wrap, args, Ext, EventManager);
  7896. };
  7897. return wrap;
  7898. },
  7899. getEventListenerCache : function(element, eventName) {
  7900. var elementCache, eventCache;
  7901. if (!element) {
  7902. return [];
  7903. }
  7904. if (element.$cache) {
  7905. elementCache = element.$cache;
  7906. } else {
  7907. elementCache = Ext.cache[EventManager.getId(element)];
  7908. }
  7909. eventCache = elementCache.events || (elementCache.events = {});
  7910. return eventCache[eventName] || (eventCache[eventName] = []);
  7911. },
  7912. mouseLeaveRe: /(mouseout|mouseleave)/,
  7913. mouseEnterRe: /(mouseover|mouseenter)/,
  7914. stopEvent: function(event) {
  7915. EventManager.stopPropagation(event);
  7916. EventManager.preventDefault(event);
  7917. },
  7918. stopPropagation: function(event) {
  7919. event = event.browserEvent || event;
  7920. if (event.stopPropagation) {
  7921. event.stopPropagation();
  7922. } else {
  7923. event.cancelBubble = true;
  7924. }
  7925. },
  7926. preventDefault: function(event) {
  7927. event = event.browserEvent || event;
  7928. if (event.preventDefault) {
  7929. event.preventDefault();
  7930. } else {
  7931. event.returnValue = false;
  7932. try {
  7933. if (event.ctrlKey || event.keyCode > 111 && event.keyCode < 124) {
  7934. event.keyCode = -1;
  7935. }
  7936. } catch (e) {
  7937. }
  7938. }
  7939. },
  7940. getRelatedTarget: function(event) {
  7941. event = event.browserEvent || event;
  7942. var target = event.relatedTarget;
  7943. if (!target) {
  7944. if (EventManager.mouseLeaveRe.test(event.type)) {
  7945. target = event.toElement;
  7946. } else if (EventManager.mouseEnterRe.test(event.type)) {
  7947. target = event.fromElement;
  7948. }
  7949. }
  7950. return EventManager.resolveTextNode(target);
  7951. },
  7952. getPageX: function(event) {
  7953. return EventManager.getPageXY(event)[0];
  7954. },
  7955. getPageY: function(event) {
  7956. return EventManager.getPageXY(event)[1];
  7957. },
  7958. getPageXY: function(event) {
  7959. event = event.browserEvent || event;
  7960. var x = event.pageX,
  7961. y = event.pageY,
  7962. docEl = doc.documentElement,
  7963. body = doc.body;
  7964. if (!x && x !== 0) {
  7965. x = event.clientX + (docEl && docEl.scrollLeft || body && body.scrollLeft || 0) - (docEl && docEl.clientLeft || body && body.clientLeft || 0);
  7966. y = event.clientY + (docEl && docEl.scrollTop || body && body.scrollTop || 0) - (docEl && docEl.clientTop || body && body.clientTop || 0);
  7967. }
  7968. return [x, y];
  7969. },
  7970. getTarget: function(event) {
  7971. event = event.browserEvent || event;
  7972. return EventManager.resolveTextNode(event.target || event.srcElement);
  7973. },
  7974. resolveTextNode: Ext.isGecko ?
  7975. function(node) {
  7976. if (!node) {
  7977. return;
  7978. }
  7979. var s = HTMLElement.prototype.toString.call(node);
  7980. if (s == '[xpconnect wrapped native prototype]' || s == '[object XULElement]') {
  7981. return;
  7982. }
  7983. return node.nodeType == 3 ? node.parentNode: node;
  7984. }: function(node) {
  7985. return node && node.nodeType == 3 ? node.parentNode: node;
  7986. },
  7987. curWidth: 0,
  7988. curHeight: 0,
  7989. onWindowResize: function(fn, scope, options) {
  7990. var resize = EventManager.resizeEvent;
  7991. if (!resize) {
  7992. EventManager.resizeEvent = resize = new Ext.util.Event();
  7993. EventManager.on(win, 'resize', EventManager.fireResize, null, {buffer: 100});
  7994. }
  7995. resize.addListener(fn, scope, options);
  7996. },
  7997. fireResize: function() {
  7998. var w = Ext.Element.getViewWidth(),
  7999. h = Ext.Element.getViewHeight();
  8000. if (EventManager.curHeight != h || EventManager.curWidth != w) {
  8001. EventManager.curHeight = h;
  8002. EventManager.curWidth = w;
  8003. EventManager.resizeEvent.fire(w, h);
  8004. }
  8005. },
  8006. removeResizeListener: function(fn, scope) {
  8007. var resize = EventManager.resizeEvent;
  8008. if (resize) {
  8009. resize.removeListener(fn, scope);
  8010. }
  8011. },
  8012. onWindowUnload: function(fn, scope, options) {
  8013. var unload = EventManager.unloadEvent;
  8014. if (!unload) {
  8015. EventManager.unloadEvent = unload = new Ext.util.Event();
  8016. EventManager.addListener(win, 'unload', EventManager.fireUnload);
  8017. }
  8018. if (fn) {
  8019. unload.addListener(fn, scope, options);
  8020. }
  8021. },
  8022. fireUnload: function() {
  8023. try {
  8024. doc = win = undefined;
  8025. var gridviews, i, ln,
  8026. el, cache;
  8027. EventManager.unloadEvent.fire();
  8028. if (Ext.isGecko3) {
  8029. gridviews = Ext.ComponentQuery.query('gridview');
  8030. i = 0;
  8031. ln = gridviews.length;
  8032. for (; i < ln; i++) {
  8033. gridviews[i].scrollToTop();
  8034. }
  8035. }
  8036. cache = Ext.cache;
  8037. for (el in cache) {
  8038. if (cache.hasOwnProperty(el)) {
  8039. EventManager.removeAll(el);
  8040. }
  8041. }
  8042. } catch(e) {
  8043. }
  8044. },
  8045. removeUnloadListener: function(fn, scope) {
  8046. var unload = EventManager.unloadEvent;
  8047. if (unload) {
  8048. unload.removeListener(fn, scope);
  8049. }
  8050. },
  8051. useKeyDown: Ext.isWebKit ?
  8052. parseInt(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1], 10) >= 525 :
  8053. !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera),
  8054. getKeyEvent: function() {
  8055. return EventManager.useKeyDown ? 'keydown' : 'keypress';
  8056. }
  8057. });
  8058. if(!('addEventListener' in document) && document.attachEvent) {
  8059. Ext.apply( EventManager, {
  8060. pollScroll : function() {
  8061. var scrollable = true;
  8062. try {
  8063. document.documentElement.doScroll('left');
  8064. } catch(e) {
  8065. scrollable = false;
  8066. }
  8067. if (scrollable && document.body) {
  8068. EventManager.onReadyEvent({
  8069. type:'doScroll'
  8070. });
  8071. } else {
  8072. EventManager.scrollTimeout = setTimeout(EventManager.pollScroll, 20);
  8073. }
  8074. return scrollable;
  8075. },
  8076. scrollTimeout: null,
  8077. readyStatesRe : /complete/i,
  8078. checkReadyState: function() {
  8079. var state = document.readyState;
  8080. if (EventManager.readyStatesRe.test(state)) {
  8081. EventManager.onReadyEvent({
  8082. type: state
  8083. });
  8084. }
  8085. },
  8086. bindReadyEvent: function() {
  8087. var topContext = true;
  8088. if (EventManager.hasBoundOnReady) {
  8089. return;
  8090. }
  8091. try {
  8092. topContext = window.frameElement === undefined;
  8093. } catch(e) {
  8094. topContext = false;
  8095. }
  8096. if (!topContext || !doc.documentElement.doScroll) {
  8097. EventManager.pollScroll = Ext.emptyFn;
  8098. }
  8099. if (EventManager.pollScroll() === true) {
  8100. return;
  8101. }
  8102. if (doc.readyState == 'complete' ) {
  8103. EventManager.onReadyEvent({type: 'already ' + (doc.readyState || 'body') });
  8104. } else {
  8105. doc.attachEvent('onreadystatechange', EventManager.checkReadyState);
  8106. window.attachEvent('onload', EventManager.onReadyEvent);
  8107. EventManager.hasBoundOnReady = true;
  8108. }
  8109. },
  8110. onReadyEvent : function(e) {
  8111. if (e && e.type) {
  8112. EventManager.onReadyChain.push(e.type);
  8113. }
  8114. if (EventManager.hasBoundOnReady) {
  8115. document.detachEvent('onreadystatechange', EventManager.checkReadyState);
  8116. window.detachEvent('onload', EventManager.onReadyEvent);
  8117. }
  8118. if (Ext.isNumber(EventManager.scrollTimeout)) {
  8119. clearTimeout(EventManager.scrollTimeout);
  8120. delete EventManager.scrollTimeout;
  8121. }
  8122. if (!Ext.isReady) {
  8123. EventManager.fireDocReady();
  8124. }
  8125. },
  8126. onReadyChain : []
  8127. });
  8128. }
  8129. Ext.onReady = function(fn, scope, options) {
  8130. Ext.Loader.onReady(fn, scope, true, options);
  8131. };
  8132. Ext.onDocumentReady = EventManager.onDocumentReady;
  8133. EventManager.on = EventManager.addListener;
  8134. EventManager.un = EventManager.removeListener;
  8135. Ext.onReady(initExtCss);
  8136. };
  8137. //@tag dom,core
  8138. //@require EventManager.js
  8139. //@define Ext.EventObject
  8140. Ext.define('Ext.EventObjectImpl', {
  8141. uses: ['Ext.util.Point'],
  8142. BACKSPACE: 8,
  8143. TAB: 9,
  8144. NUM_CENTER: 12,
  8145. ENTER: 13,
  8146. RETURN: 13,
  8147. SHIFT: 16,
  8148. CTRL: 17,
  8149. ALT: 18,
  8150. PAUSE: 19,
  8151. CAPS_LOCK: 20,
  8152. ESC: 27,
  8153. SPACE: 32,
  8154. PAGE_UP: 33,
  8155. PAGE_DOWN: 34,
  8156. END: 35,
  8157. HOME: 36,
  8158. LEFT: 37,
  8159. UP: 38,
  8160. RIGHT: 39,
  8161. DOWN: 40,
  8162. PRINT_SCREEN: 44,
  8163. INSERT: 45,
  8164. DELETE: 46,
  8165. ZERO: 48,
  8166. ONE: 49,
  8167. TWO: 50,
  8168. THREE: 51,
  8169. FOUR: 52,
  8170. FIVE: 53,
  8171. SIX: 54,
  8172. SEVEN: 55,
  8173. EIGHT: 56,
  8174. NINE: 57,
  8175. A: 65,
  8176. B: 66,
  8177. C: 67,
  8178. D: 68,
  8179. E: 69,
  8180. F: 70,
  8181. G: 71,
  8182. H: 72,
  8183. I: 73,
  8184. J: 74,
  8185. K: 75,
  8186. L: 76,
  8187. M: 77,
  8188. N: 78,
  8189. O: 79,
  8190. P: 80,
  8191. Q: 81,
  8192. R: 82,
  8193. S: 83,
  8194. T: 84,
  8195. U: 85,
  8196. V: 86,
  8197. W: 87,
  8198. X: 88,
  8199. Y: 89,
  8200. Z: 90,
  8201. CONTEXT_MENU: 93,
  8202. NUM_ZERO: 96,
  8203. NUM_ONE: 97,
  8204. NUM_TWO: 98,
  8205. NUM_THREE: 99,
  8206. NUM_FOUR: 100,
  8207. NUM_FIVE: 101,
  8208. NUM_SIX: 102,
  8209. NUM_SEVEN: 103,
  8210. NUM_EIGHT: 104,
  8211. NUM_NINE: 105,
  8212. NUM_MULTIPLY: 106,
  8213. NUM_PLUS: 107,
  8214. NUM_MINUS: 109,
  8215. NUM_PERIOD: 110,
  8216. NUM_DIVISION: 111,
  8217. F1: 112,
  8218. F2: 113,
  8219. F3: 114,
  8220. F4: 115,
  8221. F5: 116,
  8222. F6: 117,
  8223. F7: 118,
  8224. F8: 119,
  8225. F9: 120,
  8226. F10: 121,
  8227. F11: 122,
  8228. F12: 123,
  8229. WHEEL_SCALE: (function () {
  8230. var scale;
  8231. if (Ext.isGecko) {
  8232. scale = 3;
  8233. } else if (Ext.isMac) {
  8234. if (Ext.isSafari && Ext.webKitVersion >= 532.0) {
  8235. scale = 120;
  8236. } else {
  8237. scale = 12;
  8238. }
  8239. scale *= 3;
  8240. } else {
  8241. scale = 120;
  8242. }
  8243. return scale;
  8244. }()),
  8245. clickRe: /(dbl)?click/,
  8246. safariKeys: {
  8247. 3: 13,
  8248. 63234: 37,
  8249. 63235: 39,
  8250. 63232: 38,
  8251. 63233: 40,
  8252. 63276: 33,
  8253. 63277: 34,
  8254. 63272: 46,
  8255. 63273: 36,
  8256. 63275: 35
  8257. },
  8258. btnMap: Ext.isIE ? {
  8259. 1: 0,
  8260. 4: 1,
  8261. 2: 2
  8262. } : {
  8263. 0: 0,
  8264. 1: 1,
  8265. 2: 2
  8266. },
  8267. constructor: function(event, freezeEvent){
  8268. if (event) {
  8269. this.setEvent(event.browserEvent || event, freezeEvent);
  8270. }
  8271. },
  8272. setEvent: function(event, freezeEvent){
  8273. var me = this, button, options;
  8274. if (event == me || (event && event.browserEvent)) {
  8275. return event;
  8276. }
  8277. me.browserEvent = event;
  8278. if (event) {
  8279. button = event.button ? me.btnMap[event.button] : (event.which ? event.which - 1 : -1);
  8280. if (me.clickRe.test(event.type) && button == -1) {
  8281. button = 0;
  8282. }
  8283. options = {
  8284. type: event.type,
  8285. button: button,
  8286. shiftKey: event.shiftKey,
  8287. ctrlKey: event.ctrlKey || event.metaKey || false,
  8288. altKey: event.altKey,
  8289. keyCode: event.keyCode,
  8290. charCode: event.charCode,
  8291. target: Ext.EventManager.getTarget(event),
  8292. relatedTarget: Ext.EventManager.getRelatedTarget(event),
  8293. currentTarget: event.currentTarget,
  8294. xy: (freezeEvent ? me.getXY() : null)
  8295. };
  8296. } else {
  8297. options = {
  8298. button: -1,
  8299. shiftKey: false,
  8300. ctrlKey: false,
  8301. altKey: false,
  8302. keyCode: 0,
  8303. charCode: 0,
  8304. target: null,
  8305. xy: [0, 0]
  8306. };
  8307. }
  8308. Ext.apply(me, options);
  8309. return me;
  8310. },
  8311. stopEvent: function(){
  8312. this.stopPropagation();
  8313. this.preventDefault();
  8314. },
  8315. preventDefault: function(){
  8316. if (this.browserEvent) {
  8317. Ext.EventManager.preventDefault(this.browserEvent);
  8318. }
  8319. },
  8320. stopPropagation: function(){
  8321. var browserEvent = this.browserEvent;
  8322. if (browserEvent) {
  8323. if (browserEvent.type == 'mousedown') {
  8324. Ext.EventManager.stoppedMouseDownEvent.fire(this);
  8325. }
  8326. Ext.EventManager.stopPropagation(browserEvent);
  8327. }
  8328. },
  8329. getCharCode: function(){
  8330. return this.charCode || this.keyCode;
  8331. },
  8332. getKey: function(){
  8333. return this.normalizeKey(this.keyCode || this.charCode);
  8334. },
  8335. normalizeKey: function(key){
  8336. return Ext.isWebKit ? (this.safariKeys[key] || key) : key;
  8337. },
  8338. getPageX: function(){
  8339. return this.getX();
  8340. },
  8341. getPageY: function(){
  8342. return this.getY();
  8343. },
  8344. getX: function() {
  8345. return this.getXY()[0];
  8346. },
  8347. getY: function() {
  8348. return this.getXY()[1];
  8349. },
  8350. getXY: function() {
  8351. if (!this.xy) {
  8352. this.xy = Ext.EventManager.getPageXY(this.browserEvent);
  8353. }
  8354. return this.xy;
  8355. },
  8356. getTarget : function(selector, maxDepth, returnEl){
  8357. if (selector) {
  8358. return Ext.fly(this.target).findParent(selector, maxDepth, returnEl);
  8359. }
  8360. return returnEl ? Ext.get(this.target) : this.target;
  8361. },
  8362. getRelatedTarget : function(selector, maxDepth, returnEl){
  8363. if (selector) {
  8364. return Ext.fly(this.relatedTarget).findParent(selector, maxDepth, returnEl);
  8365. }
  8366. return returnEl ? Ext.get(this.relatedTarget) : this.relatedTarget;
  8367. },
  8368. correctWheelDelta : function (delta) {
  8369. var scale = this.WHEEL_SCALE,
  8370. ret = Math.round(delta / scale);
  8371. if (!ret && delta) {
  8372. ret = (delta < 0) ? -1 : 1;
  8373. }
  8374. return ret;
  8375. },
  8376. getWheelDeltas : function () {
  8377. var me = this,
  8378. event = me.browserEvent,
  8379. dx = 0, dy = 0;
  8380. if (Ext.isDefined(event.wheelDeltaX)) {
  8381. dx = event.wheelDeltaX;
  8382. dy = event.wheelDeltaY;
  8383. } else if (event.wheelDelta) {
  8384. dy = event.wheelDelta;
  8385. } else if (event.detail) {
  8386. dy = -event.detail;
  8387. if (dy > 100) {
  8388. dy = 3;
  8389. } else if (dy < -100) {
  8390. dy = -3;
  8391. }
  8392. if (Ext.isDefined(event.axis) && event.axis === event.HORIZONTAL_AXIS) {
  8393. dx = dy;
  8394. dy = 0;
  8395. }
  8396. }
  8397. return {
  8398. x: me.correctWheelDelta(dx),
  8399. y: me.correctWheelDelta(dy)
  8400. };
  8401. },
  8402. getWheelDelta : function(){
  8403. var deltas = this.getWheelDeltas();
  8404. return deltas.y;
  8405. },
  8406. within : function(el, related, allowEl){
  8407. if(el){
  8408. var t = related ? this.getRelatedTarget() : this.getTarget(),
  8409. result;
  8410. if (t) {
  8411. result = Ext.fly(el).contains(t);
  8412. if (!result && allowEl) {
  8413. result = t == Ext.getDom(el);
  8414. }
  8415. return result;
  8416. }
  8417. }
  8418. return false;
  8419. },
  8420. isNavKeyPress : function(){
  8421. var me = this,
  8422. k = this.normalizeKey(me.keyCode);
  8423. return (k >= 33 && k <= 40) ||
  8424. k == me.RETURN ||
  8425. k == me.TAB ||
  8426. k == me.ESC;
  8427. },
  8428. isSpecialKey : function(){
  8429. var k = this.normalizeKey(this.keyCode);
  8430. return (this.type == 'keypress' && this.ctrlKey) ||
  8431. this.isNavKeyPress() ||
  8432. (k == this.BACKSPACE) ||
  8433. (k >= 16 && k <= 20) ||
  8434. (k >= 44 && k <= 46);
  8435. },
  8436. getPoint : function(){
  8437. var xy = this.getXY();
  8438. return new Ext.util.Point(xy[0], xy[1]);
  8439. },
  8440. hasModifier : function(){
  8441. return this.ctrlKey || this.altKey || this.shiftKey || this.metaKey;
  8442. },
  8443. injectEvent: (function () {
  8444. var API,
  8445. dispatchers = {},
  8446. crazyIEButtons;
  8447. if (!Ext.isIE && document.createEvent) {
  8448. API = {
  8449. createHtmlEvent: function (doc, type, bubbles, cancelable) {
  8450. var event = doc.createEvent('HTMLEvents');
  8451. event.initEvent(type, bubbles, cancelable);
  8452. return event;
  8453. },
  8454. createMouseEvent: function (doc, type, bubbles, cancelable, detail,
  8455. clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
  8456. button, relatedTarget) {
  8457. var event = doc.createEvent('MouseEvents'),
  8458. view = doc.defaultView || window;
  8459. if (event.initMouseEvent) {
  8460. event.initMouseEvent(type, bubbles, cancelable, view, detail,
  8461. clientX, clientY, clientX, clientY, ctrlKey, altKey,
  8462. shiftKey, metaKey, button, relatedTarget);
  8463. } else {
  8464. event = doc.createEvent('UIEvents');
  8465. event.initEvent(type, bubbles, cancelable);
  8466. event.view = view;
  8467. event.detail = detail;
  8468. event.screenX = clientX;
  8469. event.screenY = clientY;
  8470. event.clientX = clientX;
  8471. event.clientY = clientY;
  8472. event.ctrlKey = ctrlKey;
  8473. event.altKey = altKey;
  8474. event.metaKey = metaKey;
  8475. event.shiftKey = shiftKey;
  8476. event.button = button;
  8477. event.relatedTarget = relatedTarget;
  8478. }
  8479. return event;
  8480. },
  8481. createUIEvent: function (doc, type, bubbles, cancelable, detail) {
  8482. var event = doc.createEvent('UIEvents'),
  8483. view = doc.defaultView || window;
  8484. event.initUIEvent(type, bubbles, cancelable, view, detail);
  8485. return event;
  8486. },
  8487. fireEvent: function (target, type, event) {
  8488. target.dispatchEvent(event);
  8489. },
  8490. fixTarget: function (target) {
  8491. if (target == window && !target.dispatchEvent) {
  8492. return document;
  8493. }
  8494. return target;
  8495. }
  8496. };
  8497. } else if (document.createEventObject) {
  8498. crazyIEButtons = { 0: 1, 1: 4, 2: 2 };
  8499. API = {
  8500. createHtmlEvent: function (doc, type, bubbles, cancelable) {
  8501. var event = doc.createEventObject();
  8502. event.bubbles = bubbles;
  8503. event.cancelable = cancelable;
  8504. return event;
  8505. },
  8506. createMouseEvent: function (doc, type, bubbles, cancelable, detail,
  8507. clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
  8508. button, relatedTarget) {
  8509. var event = doc.createEventObject();
  8510. event.bubbles = bubbles;
  8511. event.cancelable = cancelable;
  8512. event.detail = detail;
  8513. event.screenX = clientX;
  8514. event.screenY = clientY;
  8515. event.clientX = clientX;
  8516. event.clientY = clientY;
  8517. event.ctrlKey = ctrlKey;
  8518. event.altKey = altKey;
  8519. event.shiftKey = shiftKey;
  8520. event.metaKey = metaKey;
  8521. event.button = crazyIEButtons[button] || button;
  8522. event.relatedTarget = relatedTarget;
  8523. return event;
  8524. },
  8525. createUIEvent: function (doc, type, bubbles, cancelable, detail) {
  8526. var event = doc.createEventObject();
  8527. event.bubbles = bubbles;
  8528. event.cancelable = cancelable;
  8529. return event;
  8530. },
  8531. fireEvent: function (target, type, event) {
  8532. target.fireEvent('on' + type, event);
  8533. },
  8534. fixTarget: function (target) {
  8535. if (target == document) {
  8536. return document.documentElement;
  8537. }
  8538. return target;
  8539. }
  8540. };
  8541. }
  8542. Ext.Object.each({
  8543. load: [false, false],
  8544. unload: [false, false],
  8545. select: [true, false],
  8546. change: [true, false],
  8547. submit: [true, true],
  8548. reset: [true, false],
  8549. resize: [true, false],
  8550. scroll: [true, false]
  8551. },
  8552. function (name, value) {
  8553. var bubbles = value[0], cancelable = value[1];
  8554. dispatchers[name] = function (targetEl, srcEvent) {
  8555. var e = API.createHtmlEvent(name, bubbles, cancelable);
  8556. API.fireEvent(targetEl, name, e);
  8557. };
  8558. });
  8559. function createMouseEventDispatcher (type, detail) {
  8560. var cancelable = (type != 'mousemove');
  8561. return function (targetEl, srcEvent) {
  8562. var xy = srcEvent.getXY(),
  8563. e = API.createMouseEvent(targetEl.ownerDocument, type, true, cancelable,
  8564. detail, xy[0], xy[1], srcEvent.ctrlKey, srcEvent.altKey,
  8565. srcEvent.shiftKey, srcEvent.metaKey, srcEvent.button,
  8566. srcEvent.relatedTarget);
  8567. API.fireEvent(targetEl, type, e);
  8568. };
  8569. }
  8570. Ext.each(['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mousemove', 'mouseout'],
  8571. function (eventName) {
  8572. dispatchers[eventName] = createMouseEventDispatcher(eventName, 1);
  8573. });
  8574. Ext.Object.each({
  8575. focusin: [true, false],
  8576. focusout: [true, false],
  8577. activate: [true, true],
  8578. focus: [false, false],
  8579. blur: [false, false]
  8580. },
  8581. function (name, value) {
  8582. var bubbles = value[0], cancelable = value[1];
  8583. dispatchers[name] = function (targetEl, srcEvent) {
  8584. var e = API.createUIEvent(targetEl.ownerDocument, name, bubbles, cancelable, 1);
  8585. API.fireEvent(targetEl, name, e);
  8586. };
  8587. });
  8588. if (!API) {
  8589. dispatchers = {};
  8590. API = {
  8591. fixTarget: function (t) {
  8592. return t;
  8593. }
  8594. };
  8595. }
  8596. function cannotInject (target, srcEvent) {
  8597. }
  8598. return function (target) {
  8599. var me = this,
  8600. dispatcher = dispatchers[me.type] || cannotInject,
  8601. t = target ? (target.dom || target) : me.getTarget();
  8602. t = API.fixTarget(t);
  8603. dispatcher(t, me);
  8604. };
  8605. }())
  8606. }, function() {
  8607. Ext.EventObject = new Ext.EventObjectImpl();
  8608. });
  8609. //@tag dom,core
  8610. //@require ../EventObject.js
  8611. Ext.define('Ext.dom.AbstractQuery', {
  8612. select: function(q, root) {
  8613. var results = [],
  8614. nodes,
  8615. i,
  8616. j,
  8617. qlen,
  8618. nlen;
  8619. root = root || document;
  8620. if (typeof root == 'string') {
  8621. root = document.getElementById(root);
  8622. }
  8623. q = q.split(",");
  8624. for (i = 0,qlen = q.length; i < qlen; i++) {
  8625. if (typeof q[i] == 'string') {
  8626. if (typeof q[i][0] == '@') {
  8627. nodes = root.getAttributeNode(q[i].substring(1));
  8628. results.push(nodes);
  8629. } else {
  8630. nodes = root.querySelectorAll(q[i]);
  8631. for (j = 0,nlen = nodes.length; j < nlen; j++) {
  8632. results.push(nodes[j]);
  8633. }
  8634. }
  8635. }
  8636. }
  8637. return results;
  8638. },
  8639. selectNode: function(q, root) {
  8640. return this.select(q, root)[0];
  8641. },
  8642. is: function(el, q) {
  8643. if (typeof el == "string") {
  8644. el = document.getElementById(el);
  8645. }
  8646. return this.select(q).indexOf(el) !== -1;
  8647. }
  8648. });
  8649. //@tag dom,core
  8650. //@require AbstractQuery.js
  8651. Ext.define('Ext.dom.AbstractHelper', {
  8652. emptyTags : /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,
  8653. confRe : /(?:tag|children|cn|html|tpl|tplData)$/i,
  8654. endRe : /end/i,
  8655. attributeTransform: { cls : 'class', htmlFor : 'for' },
  8656. closeTags: {},
  8657. decamelizeName : (function () {
  8658. var camelCaseRe = /([a-z])([A-Z])/g,
  8659. cache = {};
  8660. function decamel (match, p1, p2) {
  8661. return p1 + '-' + p2.toLowerCase();
  8662. }
  8663. return function (s) {
  8664. return cache[s] || (cache[s] = s.replace(camelCaseRe, decamel));
  8665. };
  8666. }()),
  8667. generateMarkup: function(spec, buffer) {
  8668. var me = this,
  8669. attr, val, tag, i, closeTags;
  8670. if (typeof spec == "string") {
  8671. buffer.push(spec);
  8672. } else if (Ext.isArray(spec)) {
  8673. for (i = 0; i < spec.length; i++) {
  8674. if (spec[i]) {
  8675. me.generateMarkup(spec[i], buffer);
  8676. }
  8677. }
  8678. } else {
  8679. tag = spec.tag || 'div';
  8680. buffer.push('<', tag);
  8681. for (attr in spec) {
  8682. if (spec.hasOwnProperty(attr)) {
  8683. val = spec[attr];
  8684. if (!me.confRe.test(attr)) {
  8685. if (typeof val == "object") {
  8686. buffer.push(' ', attr, '="');
  8687. me.generateStyles(val, buffer).push('"');
  8688. } else {
  8689. buffer.push(' ', me.attributeTransform[attr] || attr, '="', val, '"');
  8690. }
  8691. }
  8692. }
  8693. }
  8694. if (me.emptyTags.test(tag)) {
  8695. buffer.push('/>');
  8696. } else {
  8697. buffer.push('>');
  8698. if ((val = spec.tpl)) {
  8699. val.applyOut(spec.tplData, buffer);
  8700. }
  8701. if ((val = spec.html)) {
  8702. buffer.push(val);
  8703. }
  8704. if ((val = spec.cn || spec.children)) {
  8705. me.generateMarkup(val, buffer);
  8706. }
  8707. closeTags = me.closeTags;
  8708. buffer.push(closeTags[tag] || (closeTags[tag] = '</' + tag + '>'));
  8709. }
  8710. }
  8711. return buffer;
  8712. },
  8713. generateStyles: function (styles, buffer) {
  8714. var a = buffer || [],
  8715. name;
  8716. for (name in styles) {
  8717. if (styles.hasOwnProperty(name)) {
  8718. a.push(this.decamelizeName(name), ':', styles[name], ';');
  8719. }
  8720. }
  8721. return buffer || a.join('');
  8722. },
  8723. markup: function(spec) {
  8724. if (typeof spec == "string") {
  8725. return spec;
  8726. }
  8727. var buf = this.generateMarkup(spec, []);
  8728. return buf.join('');
  8729. },
  8730. applyStyles: function(el, styles) {
  8731. if (styles) {
  8732. var i = 0,
  8733. len,
  8734. style;
  8735. el = Ext.fly(el);
  8736. if (typeof styles == 'function') {
  8737. styles = styles.call();
  8738. }
  8739. if (typeof styles == 'string'){
  8740. styles = Ext.util.Format.trim(styles).split(/\s*(?::|;)\s*/);
  8741. for(len = styles.length; i < len;){
  8742. el.setStyle(styles[i++], styles[i++]);
  8743. }
  8744. } else if (Ext.isObject(styles)) {
  8745. el.setStyle(styles);
  8746. }
  8747. }
  8748. },
  8749. insertHtml: function(where, el, html) {
  8750. var hash = {},
  8751. hashVal,
  8752. setStart,
  8753. range,
  8754. frag,
  8755. rangeEl,
  8756. rs;
  8757. where = where.toLowerCase();
  8758. hash['beforebegin'] = ['BeforeBegin', 'previousSibling'];
  8759. hash['afterend'] = ['AfterEnd', 'nextSibling'];
  8760. range = el.ownerDocument.createRange();
  8761. setStart = 'setStart' + (this.endRe.test(where) ? 'After' : 'Before');
  8762. if (hash[where]) {
  8763. range[setStart](el);
  8764. frag = range.createContextualFragment(html);
  8765. el.parentNode.insertBefore(frag, where == 'beforebegin' ? el : el.nextSibling);
  8766. return el[(where == 'beforebegin' ? 'previous' : 'next') + 'Sibling'];
  8767. }
  8768. else {
  8769. rangeEl = (where == 'afterbegin' ? 'first' : 'last') + 'Child';
  8770. if (el.firstChild) {
  8771. range[setStart](el[rangeEl]);
  8772. frag = range.createContextualFragment(html);
  8773. if (where == 'afterbegin') {
  8774. el.insertBefore(frag, el.firstChild);
  8775. }
  8776. else {
  8777. el.appendChild(frag);
  8778. }
  8779. }
  8780. else {
  8781. el.innerHTML = html;
  8782. }
  8783. return el[rangeEl];
  8784. }
  8785. throw 'Illegal insertion point -> "' + where + '"';
  8786. },
  8787. insertBefore: function(el, o, returnElement) {
  8788. return this.doInsert(el, o, returnElement, 'beforebegin');
  8789. },
  8790. insertAfter: function(el, o, returnElement) {
  8791. return this.doInsert(el, o, returnElement, 'afterend', 'nextSibling');
  8792. },
  8793. insertFirst: function(el, o, returnElement) {
  8794. return this.doInsert(el, o, returnElement, 'afterbegin', 'firstChild');
  8795. },
  8796. append: function(el, o, returnElement) {
  8797. return this.doInsert(el, o, returnElement, 'beforeend', '', true);
  8798. },
  8799. overwrite: function(el, o, returnElement) {
  8800. el = Ext.getDom(el);
  8801. el.innerHTML = this.markup(o);
  8802. return returnElement ? Ext.get(el.firstChild) : el.firstChild;
  8803. },
  8804. doInsert: function(el, o, returnElement, pos, sibling, append) {
  8805. var newNode = this.insertHtml(pos, Ext.getDom(el), this.markup(o));
  8806. return returnElement ? Ext.get(newNode, true) : newNode;
  8807. }
  8808. });
  8809. //@tag dom,core
  8810. //@require AbstractHelper.js
  8811. //@require Ext.Supports
  8812. //@require Ext.EventManager
  8813. //@define Ext.dom.AbstractElement
  8814. (function() {
  8815. var document = window.document,
  8816. trimRe = /^\s+|\s+$/g,
  8817. whitespaceRe = /\s/;
  8818. if (!Ext.cache){
  8819. Ext.cache = {};
  8820. }
  8821. Ext.define('Ext.dom.AbstractElement', {
  8822. inheritableStatics: {
  8823. get: function(el) {
  8824. var me = this,
  8825. El = Ext.dom.Element,
  8826. cacheItem,
  8827. extEl,
  8828. dom,
  8829. id;
  8830. if (!el) {
  8831. return null;
  8832. }
  8833. if (typeof el == "string") {
  8834. if (el == Ext.windowId) {
  8835. return El.get(window);
  8836. } else if (el == Ext.documentId) {
  8837. return El.get(document);
  8838. }
  8839. cacheItem = Ext.cache[el];
  8840. if (cacheItem && cacheItem.skipGarbageCollection) {
  8841. extEl = cacheItem.el;
  8842. return extEl;
  8843. }
  8844. if (!(dom = document.getElementById(el))) {
  8845. return null;
  8846. }
  8847. if (cacheItem && cacheItem.el) {
  8848. extEl = Ext.updateCacheEntry(cacheItem, dom).el;
  8849. } else {
  8850. extEl = new El(dom, !!cacheItem);
  8851. }
  8852. return extEl;
  8853. } else if (el.tagName) {
  8854. if (!(id = el.id)) {
  8855. id = Ext.id(el);
  8856. }
  8857. cacheItem = Ext.cache[id];
  8858. if (cacheItem && cacheItem.el) {
  8859. extEl = Ext.updateCacheEntry(cacheItem, el).el;
  8860. } else {
  8861. extEl = new El(el, !!cacheItem);
  8862. }
  8863. return extEl;
  8864. } else if (el instanceof me) {
  8865. if (el != me.docEl && el != me.winEl) {
  8866. id = el.id;
  8867. cacheItem = Ext.cache[id];
  8868. if (cacheItem) {
  8869. Ext.updateCacheEntry(cacheItem, document.getElementById(id) || el.dom);
  8870. }
  8871. }
  8872. return el;
  8873. } else if (el.isComposite) {
  8874. return el;
  8875. } else if (Ext.isArray(el)) {
  8876. return me.select(el);
  8877. } else if (el === document) {
  8878. if (!me.docEl) {
  8879. me.docEl = Ext.Object.chain(El.prototype);
  8880. me.docEl.dom = document;
  8881. me.docEl.id = Ext.id(document);
  8882. me.addToCache(me.docEl);
  8883. }
  8884. return me.docEl;
  8885. } else if (el === window) {
  8886. if (!me.winEl) {
  8887. me.winEl = Ext.Object.chain(El.prototype);
  8888. me.winEl.dom = window;
  8889. me.winEl.id = Ext.id(window);
  8890. me.addToCache(me.winEl);
  8891. }
  8892. return me.winEl;
  8893. }
  8894. return null;
  8895. },
  8896. addToCache: function(el, id) {
  8897. if (el) {
  8898. Ext.addCacheEntry(id, el);
  8899. }
  8900. return el;
  8901. },
  8902. addMethods: function() {
  8903. this.override.apply(this, arguments);
  8904. },
  8905. mergeClsList: function() {
  8906. var clsList, clsHash = {},
  8907. i, length, j, listLength, clsName, result = [],
  8908. changed = false;
  8909. for (i = 0, length = arguments.length; i < length; i++) {
  8910. clsList = arguments[i];
  8911. if (Ext.isString(clsList)) {
  8912. clsList = clsList.replace(trimRe, '').split(whitespaceRe);
  8913. }
  8914. if (clsList) {
  8915. for (j = 0, listLength = clsList.length; j < listLength; j++) {
  8916. clsName = clsList[j];
  8917. if (!clsHash[clsName]) {
  8918. if (i) {
  8919. changed = true;
  8920. }
  8921. clsHash[clsName] = true;
  8922. }
  8923. }
  8924. }
  8925. }
  8926. for (clsName in clsHash) {
  8927. result.push(clsName);
  8928. }
  8929. result.changed = changed;
  8930. return result;
  8931. },
  8932. removeCls: function(existingClsList, removeClsList) {
  8933. var clsHash = {},
  8934. i, length, clsName, result = [],
  8935. changed = false;
  8936. if (existingClsList) {
  8937. if (Ext.isString(existingClsList)) {
  8938. existingClsList = existingClsList.replace(trimRe, '').split(whitespaceRe);
  8939. }
  8940. for (i = 0, length = existingClsList.length; i < length; i++) {
  8941. clsHash[existingClsList[i]] = true;
  8942. }
  8943. }
  8944. if (removeClsList) {
  8945. if (Ext.isString(removeClsList)) {
  8946. removeClsList = removeClsList.split(whitespaceRe);
  8947. }
  8948. for (i = 0, length = removeClsList.length; i < length; i++) {
  8949. clsName = removeClsList[i];
  8950. if (clsHash[clsName]) {
  8951. changed = true;
  8952. delete clsHash[clsName];
  8953. }
  8954. }
  8955. }
  8956. for (clsName in clsHash) {
  8957. result.push(clsName);
  8958. }
  8959. result.changed = changed;
  8960. return result;
  8961. },
  8962. VISIBILITY: 1,
  8963. DISPLAY: 2,
  8964. OFFSETS: 3,
  8965. ASCLASS: 4
  8966. },
  8967. constructor: function(element, forceNew) {
  8968. var me = this,
  8969. dom = typeof element == 'string'
  8970. ? document.getElementById(element)
  8971. : element,
  8972. id;
  8973. if (!dom) {
  8974. return null;
  8975. }
  8976. id = dom.id;
  8977. if (!forceNew && id && Ext.cache[id]) {
  8978. return Ext.cache[id].el;
  8979. }
  8980. me.dom = dom;
  8981. me.id = id || Ext.id(dom);
  8982. me.self.addToCache(me);
  8983. },
  8984. set: function(o, useSet) {
  8985. var el = this.dom,
  8986. attr,
  8987. value;
  8988. for (attr in o) {
  8989. if (o.hasOwnProperty(attr)) {
  8990. value = o[attr];
  8991. if (attr == 'style') {
  8992. this.applyStyles(value);
  8993. }
  8994. else if (attr == 'cls') {
  8995. el.className = value;
  8996. }
  8997. else if (useSet !== false) {
  8998. if (value === undefined) {
  8999. el.removeAttribute(attr);
  9000. } else {
  9001. el.setAttribute(attr, value);
  9002. }
  9003. }
  9004. else {
  9005. el[attr] = value;
  9006. }
  9007. }
  9008. }
  9009. return this;
  9010. },
  9011. defaultUnit: "px",
  9012. is: function(simpleSelector) {
  9013. return Ext.DomQuery.is(this.dom, simpleSelector);
  9014. },
  9015. getValue: function(asNumber) {
  9016. var val = this.dom.value;
  9017. return asNumber ? parseInt(val, 10) : val;
  9018. },
  9019. remove: function() {
  9020. var me = this,
  9021. dom = me.dom;
  9022. if (dom) {
  9023. Ext.removeNode(dom);
  9024. delete me.dom;
  9025. }
  9026. },
  9027. contains: function(el) {
  9028. if (!el) {
  9029. return false;
  9030. }
  9031. var me = this,
  9032. dom = el.dom || el;
  9033. return (dom === me.dom) || Ext.dom.AbstractElement.isAncestor(me.dom, dom);
  9034. },
  9035. getAttribute: function(name, ns) {
  9036. var dom = this.dom;
  9037. return dom.getAttributeNS(ns, name) || dom.getAttribute(ns + ":" + name) || dom.getAttribute(name) || dom[name];
  9038. },
  9039. update: function(html) {
  9040. if (this.dom) {
  9041. this.dom.innerHTML = html;
  9042. }
  9043. return this;
  9044. },
  9045. setHTML: function(html) {
  9046. if(this.dom) {
  9047. this.dom.innerHTML = html;
  9048. }
  9049. return this;
  9050. },
  9051. getHTML: function() {
  9052. return this.dom ? this.dom.innerHTML : '';
  9053. },
  9054. hide: function() {
  9055. this.setVisible(false);
  9056. return this;
  9057. },
  9058. show: function() {
  9059. this.setVisible(true);
  9060. return this;
  9061. },
  9062. setVisible: function(visible, animate) {
  9063. var me = this,
  9064. statics = me.self,
  9065. mode = me.getVisibilityMode(),
  9066. prefix = Ext.baseCSSPrefix;
  9067. switch (mode) {
  9068. case statics.VISIBILITY:
  9069. me.removeCls([prefix + 'hidden-display', prefix + 'hidden-offsets']);
  9070. me[visible ? 'removeCls' : 'addCls'](prefix + 'hidden-visibility');
  9071. break;
  9072. case statics.DISPLAY:
  9073. me.removeCls([prefix + 'hidden-visibility', prefix + 'hidden-offsets']);
  9074. me[visible ? 'removeCls' : 'addCls'](prefix + 'hidden-display');
  9075. break;
  9076. case statics.OFFSETS:
  9077. me.removeCls([prefix + 'hidden-visibility', prefix + 'hidden-display']);
  9078. me[visible ? 'removeCls' : 'addCls'](prefix + 'hidden-offsets');
  9079. break;
  9080. }
  9081. return me;
  9082. },
  9083. getVisibilityMode: function() {
  9084. var data = (this.$cache || this.getCache()).data,
  9085. visMode = data.visibilityMode;
  9086. if (visMode === undefined) {
  9087. data.visibilityMode = visMode = this.self.DISPLAY;
  9088. }
  9089. return visMode;
  9090. },
  9091. setVisibilityMode: function(mode) {
  9092. (this.$cache || this.getCache()).data.visibilityMode = mode;
  9093. return this;
  9094. },
  9095. getCache: function() {
  9096. var me = this,
  9097. id = me.dom.id || Ext.id(me.dom);
  9098. me.$cache = Ext.cache[id] || Ext.addCacheEntry(id, null, me.dom);
  9099. return me.$cache;
  9100. }
  9101. }, function() {
  9102. var AbstractElement = this;
  9103. Ext.getDetachedBody = function () {
  9104. var detachedEl = AbstractElement.detachedBodyEl;
  9105. if (!detachedEl) {
  9106. detachedEl = document.createElement('div');
  9107. AbstractElement.detachedBodyEl = detachedEl = new AbstractElement.Fly(detachedEl);
  9108. detachedEl.isDetachedBody = true;
  9109. }
  9110. return detachedEl;
  9111. };
  9112. Ext.getElementById = function (id) {
  9113. var el = document.getElementById(id),
  9114. detachedBodyEl;
  9115. if (!el && (detachedBodyEl = AbstractElement.detachedBodyEl)) {
  9116. el = detachedBodyEl.dom.querySelector('#' + Ext.escapeId(id));
  9117. }
  9118. return el;
  9119. };
  9120. Ext.get = function(el) {
  9121. return Ext.dom.Element.get(el);
  9122. };
  9123. this.addStatics({
  9124. Fly: new Ext.Class({
  9125. extend: AbstractElement,
  9126. isFly: true,
  9127. constructor: function(dom) {
  9128. this.dom = dom;
  9129. },
  9130. attach: function (dom) {
  9131. this.dom = dom;
  9132. this.$cache = dom.id ? Ext.cache[dom.id] : null;
  9133. return this;
  9134. }
  9135. }),
  9136. _flyweights: {},
  9137. fly: function(dom, named) {
  9138. var fly = null,
  9139. _flyweights = AbstractElement._flyweights;
  9140. named = named || '_global';
  9141. dom = Ext.getDom(dom);
  9142. if (dom) {
  9143. fly = _flyweights[named] || (_flyweights[named] = new AbstractElement.Fly());
  9144. fly.dom = dom;
  9145. fly.$cache = dom.id ? Ext.cache[dom.id] : null;
  9146. }
  9147. return fly;
  9148. }
  9149. });
  9150. Ext.fly = function() {
  9151. return AbstractElement.fly.apply(AbstractElement, arguments);
  9152. };
  9153. (function (proto) {
  9154. proto.destroy = proto.remove;
  9155. if (document.querySelector) {
  9156. proto.getById = function (id, asDom) {
  9157. var dom = document.getElementById(id) ||
  9158. this.dom.querySelector('#'+Ext.escapeId(id));
  9159. return asDom ? dom : (dom ? Ext.get(dom) : null);
  9160. };
  9161. } else {
  9162. proto.getById = function (id, asDom) {
  9163. var dom = document.getElementById(id);
  9164. return asDom ? dom : (dom ? Ext.get(dom) : null);
  9165. };
  9166. }
  9167. }(this.prototype));
  9168. });
  9169. }());
  9170. //@tag dom,core
  9171. //@require AbstractElement.js
  9172. //@define Ext.dom.AbstractElement-static
  9173. //@define Ext.dom.AbstractElement
  9174. Ext.dom.AbstractElement.addInheritableStatics({
  9175. unitRe: /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
  9176. camelRe: /(-[a-z])/gi,
  9177. cssRe: /([a-z0-9\-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,
  9178. opacityRe: /alpha\(opacity=(.*)\)/i,
  9179. propertyCache: {},
  9180. defaultUnit : "px",
  9181. borders: {l: 'border-left-width', r: 'border-right-width', t: 'border-top-width', b: 'border-bottom-width'},
  9182. paddings: {l: 'padding-left', r: 'padding-right', t: 'padding-top', b: 'padding-bottom'},
  9183. margins: {l: 'margin-left', r: 'margin-right', t: 'margin-top', b: 'margin-bottom'},
  9184. addUnits: function(size, units) {
  9185. if (typeof size == 'number') {
  9186. return size + (units || this.defaultUnit || 'px');
  9187. }
  9188. if (size === "" || size == "auto" || size === undefined || size === null) {
  9189. return size || '';
  9190. }
  9191. if (!this.unitRe.test(size)) {
  9192. return size || '';
  9193. }
  9194. return size;
  9195. },
  9196. isAncestor: function(p, c) {
  9197. var ret = false;
  9198. p = Ext.getDom(p);
  9199. c = Ext.getDom(c);
  9200. if (p && c) {
  9201. if (p.contains) {
  9202. return p.contains(c);
  9203. } else if (p.compareDocumentPosition) {
  9204. return !!(p.compareDocumentPosition(c) & 16);
  9205. } else {
  9206. while ((c = c.parentNode)) {
  9207. ret = c == p || ret;
  9208. }
  9209. }
  9210. }
  9211. return ret;
  9212. },
  9213. parseBox: function(box) {
  9214. if (typeof box != 'string') {
  9215. box = box.toString();
  9216. }
  9217. var parts = box.split(' '),
  9218. ln = parts.length;
  9219. if (ln == 1) {
  9220. parts[1] = parts[2] = parts[3] = parts[0];
  9221. }
  9222. else if (ln == 2) {
  9223. parts[2] = parts[0];
  9224. parts[3] = parts[1];
  9225. }
  9226. else if (ln == 3) {
  9227. parts[3] = parts[1];
  9228. }
  9229. return {
  9230. top :parseFloat(parts[0]) || 0,
  9231. right :parseFloat(parts[1]) || 0,
  9232. bottom:parseFloat(parts[2]) || 0,
  9233. left :parseFloat(parts[3]) || 0
  9234. };
  9235. },
  9236. unitizeBox: function(box, units) {
  9237. var a = this.addUnits,
  9238. b = this.parseBox(box);
  9239. return a(b.top, units) + ' ' +
  9240. a(b.right, units) + ' ' +
  9241. a(b.bottom, units) + ' ' +
  9242. a(b.left, units);
  9243. },
  9244. camelReplaceFn: function(m, a) {
  9245. return a.charAt(1).toUpperCase();
  9246. },
  9247. normalize: function(prop) {
  9248. if (prop == 'float') {
  9249. prop = Ext.supports.Float ? 'cssFloat' : 'styleFloat';
  9250. }
  9251. return this.propertyCache[prop] || (this.propertyCache[prop] = prop.replace(this.camelRe, this.camelReplaceFn));
  9252. },
  9253. getDocumentHeight: function() {
  9254. return Math.max(!Ext.isStrict ? document.body.scrollHeight : document.documentElement.scrollHeight, this.getViewportHeight());
  9255. },
  9256. getDocumentWidth: function() {
  9257. return Math.max(!Ext.isStrict ? document.body.scrollWidth : document.documentElement.scrollWidth, this.getViewportWidth());
  9258. },
  9259. getViewportHeight: function(){
  9260. return window.innerHeight;
  9261. },
  9262. getViewportWidth: function() {
  9263. return window.innerWidth;
  9264. },
  9265. getViewSize: function() {
  9266. return {
  9267. width: window.innerWidth,
  9268. height: window.innerHeight
  9269. };
  9270. },
  9271. getOrientation: function() {
  9272. if (Ext.supports.OrientationChange) {
  9273. return (window.orientation == 0) ? 'portrait' : 'landscape';
  9274. }
  9275. return (window.innerHeight > window.innerWidth) ? 'portrait' : 'landscape';
  9276. },
  9277. fromPoint: function(x, y) {
  9278. return Ext.get(document.elementFromPoint(x, y));
  9279. },
  9280. parseStyles: function(styles){
  9281. var out = {},
  9282. cssRe = this.cssRe,
  9283. matches;
  9284. if (styles) {
  9285. cssRe.lastIndex = 0;
  9286. while ((matches = cssRe.exec(styles))) {
  9287. out[matches[1]] = matches[2];
  9288. }
  9289. }
  9290. return out;
  9291. }
  9292. });
  9293. (function(){
  9294. var doc = document,
  9295. AbstractElement = Ext.dom.AbstractElement,
  9296. activeElement = null,
  9297. isCSS1 = doc.compatMode == "CSS1Compat",
  9298. flyInstance,
  9299. fly = function (el) {
  9300. if (!flyInstance) {
  9301. flyInstance = new AbstractElement.Fly();
  9302. }
  9303. flyInstance.attach(el);
  9304. return flyInstance;
  9305. };
  9306. if (!('activeElement' in doc) && doc.addEventListener) {
  9307. doc.addEventListener('focus',
  9308. function (ev) {
  9309. if (ev && ev.target) {
  9310. activeElement = (ev.target == doc) ? null : ev.target;
  9311. }
  9312. }, true);
  9313. }
  9314. function makeSelectionRestoreFn (activeEl, start, end) {
  9315. return function () {
  9316. activeEl.selectionStart = start;
  9317. activeEl.selectionEnd = end;
  9318. };
  9319. }
  9320. AbstractElement.addInheritableStatics({
  9321. getActiveElement: function () {
  9322. return doc.activeElement || activeElement;
  9323. },
  9324. getRightMarginFixCleaner: function (target) {
  9325. var supports = Ext.supports,
  9326. hasInputBug = supports.DisplayChangeInputSelectionBug,
  9327. hasTextAreaBug = supports.DisplayChangeTextAreaSelectionBug,
  9328. activeEl,
  9329. tag,
  9330. start,
  9331. end;
  9332. if (hasInputBug || hasTextAreaBug) {
  9333. activeEl = doc.activeElement || activeElement;
  9334. tag = activeEl && activeEl.tagName;
  9335. if ((hasTextAreaBug && tag == 'TEXTAREA') ||
  9336. (hasInputBug && tag == 'INPUT' && activeEl.type == 'text')) {
  9337. if (Ext.dom.Element.isAncestor(target, activeEl)) {
  9338. start = activeEl.selectionStart;
  9339. end = activeEl.selectionEnd;
  9340. if (Ext.isNumber(start) && Ext.isNumber(end)) {
  9341. return makeSelectionRestoreFn(activeEl, start, end);
  9342. }
  9343. }
  9344. }
  9345. }
  9346. return Ext.emptyFn;
  9347. },
  9348. getViewWidth: function(full) {
  9349. return full ? Ext.dom.Element.getDocumentWidth() : Ext.dom.Element.getViewportWidth();
  9350. },
  9351. getViewHeight: function(full) {
  9352. return full ? Ext.dom.Element.getDocumentHeight() : Ext.dom.Element.getViewportHeight();
  9353. },
  9354. getDocumentHeight: function() {
  9355. return Math.max(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, Ext.dom.Element.getViewportHeight());
  9356. },
  9357. getDocumentWidth: function() {
  9358. return Math.max(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, Ext.dom.Element.getViewportWidth());
  9359. },
  9360. getViewportHeight: function(){
  9361. return Ext.isIE ?
  9362. (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) :
  9363. self.innerHeight;
  9364. },
  9365. getViewportWidth: function() {
  9366. return (!Ext.isStrict && !Ext.isOpera) ? doc.body.clientWidth :
  9367. Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth;
  9368. },
  9369. getY: function(el) {
  9370. return Ext.dom.Element.getXY(el)[1];
  9371. },
  9372. getX: function(el) {
  9373. return Ext.dom.Element.getXY(el)[0];
  9374. },
  9375. getXY: function(el) {
  9376. var bd = doc.body,
  9377. docEl = doc.documentElement,
  9378. leftBorder = 0,
  9379. topBorder = 0,
  9380. ret = [0,0],
  9381. round = Math.round,
  9382. box,
  9383. scroll;
  9384. el = Ext.getDom(el);
  9385. if(el != doc && el != bd){
  9386. if (Ext.isIE) {
  9387. try {
  9388. box = el.getBoundingClientRect();
  9389. topBorder = docEl.clientTop || bd.clientTop;
  9390. leftBorder = docEl.clientLeft || bd.clientLeft;
  9391. } catch (ex) {
  9392. box = { left: 0, top: 0 };
  9393. }
  9394. } else {
  9395. box = el.getBoundingClientRect();
  9396. }
  9397. scroll = fly(document).getScroll();
  9398. ret = [round(box.left + scroll.left - leftBorder), round(box.top + scroll.top - topBorder)];
  9399. }
  9400. return ret;
  9401. },
  9402. setXY: function(el, xy) {
  9403. (el = Ext.fly(el, '_setXY')).position();
  9404. var pts = el.translatePoints(xy),
  9405. style = el.dom.style,
  9406. pos;
  9407. for (pos in pts) {
  9408. if (!isNaN(pts[pos])) {
  9409. style[pos] = pts[pos] + "px";
  9410. }
  9411. }
  9412. },
  9413. setX: function(el, x) {
  9414. Ext.dom.Element.setXY(el, [x, false]);
  9415. },
  9416. setY: function(el, y) {
  9417. Ext.dom.Element.setXY(el, [false, y]);
  9418. },
  9419. serializeForm: function(form) {
  9420. var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,
  9421. hasSubmit = false,
  9422. encoder = encodeURIComponent,
  9423. data = '',
  9424. eLen = fElements.length,
  9425. element, name, type, options, hasValue, e,
  9426. o, oLen, opt;
  9427. for (e = 0; e < eLen; e++) {
  9428. element = fElements[e];
  9429. name = element.name;
  9430. type = element.type;
  9431. options = element.options;
  9432. if (!element.disabled && name) {
  9433. if (/select-(one|multiple)/i.test(type)) {
  9434. oLen = options.length;
  9435. for (o = 0; o < oLen; o++) {
  9436. opt = options[o];
  9437. if (opt.selected) {
  9438. hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified;
  9439. data += Ext.String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text));
  9440. }
  9441. }
  9442. } else if (!(/file|undefined|reset|button/i.test(type))) {
  9443. if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) {
  9444. data += encoder(name) + '=' + encoder(element.value) + '&';
  9445. hasSubmit = /submit/i.test(type);
  9446. }
  9447. }
  9448. }
  9449. }
  9450. return data.substr(0, data.length - 1);
  9451. }
  9452. });
  9453. }());
  9454. //@tag dom,core
  9455. //@require Ext.dom.AbstractElement-static
  9456. //@define Ext.dom.AbstractElement-alignment
  9457. Ext.dom.AbstractElement.override({
  9458. getAnchorXY: function(anchor, local, size) {
  9459. anchor = (anchor || "tl").toLowerCase();
  9460. size = size || {};
  9461. var me = this,
  9462. vp = me.dom == document.body || me.dom == document,
  9463. width = size.width || vp ? window.innerWidth: me.getWidth(),
  9464. height = size.height || vp ? window.innerHeight: me.getHeight(),
  9465. xy,
  9466. rnd = Math.round,
  9467. myXY = me.getXY(),
  9468. extraX = vp ? 0: !local ? myXY[0] : 0,
  9469. extraY = vp ? 0: !local ? myXY[1] : 0,
  9470. hash = {
  9471. c: [rnd(width * 0.5), rnd(height * 0.5)],
  9472. t: [rnd(width * 0.5), 0],
  9473. l: [0, rnd(height * 0.5)],
  9474. r: [width, rnd(height * 0.5)],
  9475. b: [rnd(width * 0.5), height],
  9476. tl: [0, 0],
  9477. bl: [0, height],
  9478. br: [width, height],
  9479. tr: [width, 0]
  9480. };
  9481. xy = hash[anchor];
  9482. return [xy[0] + extraX, xy[1] + extraY];
  9483. },
  9484. alignToRe: /^([a-z]+)-([a-z]+)(\?)?$/,
  9485. getAlignToXY: function(el, position, offsets, local) {
  9486. local = !!local;
  9487. el = Ext.get(el);
  9488. offsets = offsets || [0, 0];
  9489. if (!position || position == '?') {
  9490. position = 'tl-bl?';
  9491. }
  9492. else if (! (/-/).test(position) && position !== "") {
  9493. position = 'tl-' + position;
  9494. }
  9495. position = position.toLowerCase();
  9496. var me = this,
  9497. matches = position.match(this.alignToRe),
  9498. dw = window.innerWidth,
  9499. dh = window.innerHeight,
  9500. p1 = "",
  9501. p2 = "",
  9502. a1,
  9503. a2,
  9504. x,
  9505. y,
  9506. swapX,
  9507. swapY,
  9508. p1x,
  9509. p1y,
  9510. p2x,
  9511. p2y,
  9512. width,
  9513. height,
  9514. region,
  9515. constrain;
  9516. if (!matches) {
  9517. throw "Element.alignTo with an invalid alignment " + position;
  9518. }
  9519. p1 = matches[1];
  9520. p2 = matches[2];
  9521. constrain = !!matches[3];
  9522. a1 = me.getAnchorXY(p1, true);
  9523. a2 = el.getAnchorXY(p2, local);
  9524. x = a2[0] - a1[0] + offsets[0];
  9525. y = a2[1] - a1[1] + offsets[1];
  9526. if (constrain) {
  9527. width = me.getWidth();
  9528. height = me.getHeight();
  9529. region = el.getPageBox();
  9530. p1y = p1.charAt(0);
  9531. p1x = p1.charAt(p1.length - 1);
  9532. p2y = p2.charAt(0);
  9533. p2x = p2.charAt(p2.length - 1);
  9534. swapY = ((p1y == "t" && p2y == "b") || (p1y == "b" && p2y == "t"));
  9535. swapX = ((p1x == "r" && p2x == "l") || (p1x == "l" && p2x == "r"));
  9536. if (x + width > dw) {
  9537. x = swapX ? region.left - width: dw - width;
  9538. }
  9539. if (x < 0) {
  9540. x = swapX ? region.right: 0;
  9541. }
  9542. if (y + height > dh) {
  9543. y = swapY ? region.top - height: dh - height;
  9544. }
  9545. if (y < 0) {
  9546. y = swapY ? region.bottom: 0;
  9547. }
  9548. }
  9549. return [x, y];
  9550. },
  9551. getAnchor: function(){
  9552. var data = (this.$cache || this.getCache()).data,
  9553. anchor;
  9554. if (!this.dom) {
  9555. return;
  9556. }
  9557. anchor = data._anchor;
  9558. if(!anchor){
  9559. anchor = data._anchor = {};
  9560. }
  9561. return anchor;
  9562. },
  9563. adjustForConstraints: function(xy, parent) {
  9564. var vector = this.getConstrainVector(parent, xy);
  9565. if (vector) {
  9566. xy[0] += vector[0];
  9567. xy[1] += vector[1];
  9568. }
  9569. return xy;
  9570. }
  9571. });
  9572. //@tag dom,core
  9573. //@require Ext.dom.AbstractElement-alignment
  9574. //@define Ext.dom.AbstractElement-insertion
  9575. //@define Ext.dom.AbstractElement
  9576. Ext.dom.AbstractElement.addMethods({
  9577. appendChild: function(el) {
  9578. return Ext.get(el).appendTo(this);
  9579. },
  9580. appendTo: function(el) {
  9581. Ext.getDom(el).appendChild(this.dom);
  9582. return this;
  9583. },
  9584. insertBefore: function(el) {
  9585. el = Ext.getDom(el);
  9586. el.parentNode.insertBefore(this.dom, el);
  9587. return this;
  9588. },
  9589. insertAfter: function(el) {
  9590. el = Ext.getDom(el);
  9591. el.parentNode.insertBefore(this.dom, el.nextSibling);
  9592. return this;
  9593. },
  9594. insertFirst: function(el, returnDom) {
  9595. el = el || {};
  9596. if (el.nodeType || el.dom || typeof el == 'string') {
  9597. el = Ext.getDom(el);
  9598. this.dom.insertBefore(el, this.dom.firstChild);
  9599. return !returnDom ? Ext.get(el) : el;
  9600. }
  9601. else {
  9602. return this.createChild(el, this.dom.firstChild, returnDom);
  9603. }
  9604. },
  9605. insertSibling: function(el, where, returnDom){
  9606. var me = this,
  9607. isAfter = (where || 'before').toLowerCase() == 'after',
  9608. rt, insertEl, eLen, e;
  9609. if (Ext.isArray(el)) {
  9610. insertEl = me;
  9611. eLen = el.length;
  9612. for (e = 0; e < eLen; e++) {
  9613. rt = Ext.fly(insertEl, '_internal').insertSibling(el[e], where, returnDom);
  9614. if (isAfter) {
  9615. insertEl = rt;
  9616. }
  9617. }
  9618. return rt;
  9619. }
  9620. el = el || {};
  9621. if(el.nodeType || el.dom){
  9622. rt = me.dom.parentNode.insertBefore(Ext.getDom(el), isAfter ? me.dom.nextSibling : me.dom);
  9623. if (!returnDom) {
  9624. rt = Ext.get(rt);
  9625. }
  9626. }else{
  9627. if (isAfter && !me.dom.nextSibling) {
  9628. rt = Ext.core.DomHelper.append(me.dom.parentNode, el, !returnDom);
  9629. } else {
  9630. rt = Ext.core.DomHelper[isAfter ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom);
  9631. }
  9632. }
  9633. return rt;
  9634. },
  9635. replace: function(el) {
  9636. el = Ext.get(el);
  9637. this.insertBefore(el);
  9638. el.remove();
  9639. return this;
  9640. },
  9641. replaceWith: function(el){
  9642. var me = this;
  9643. if(el.nodeType || el.dom || typeof el == 'string'){
  9644. el = Ext.get(el);
  9645. me.dom.parentNode.insertBefore(el, me.dom);
  9646. }else{
  9647. el = Ext.core.DomHelper.insertBefore(me.dom, el);
  9648. }
  9649. delete Ext.cache[me.id];
  9650. Ext.removeNode(me.dom);
  9651. me.id = Ext.id(me.dom = el);
  9652. Ext.dom.AbstractElement.addToCache(me.isFlyweight ? new Ext.dom.AbstractElement(me.dom) : me);
  9653. return me;
  9654. },
  9655. createChild: function(config, insertBefore, returnDom) {
  9656. config = config || {tag:'div'};
  9657. if (insertBefore) {
  9658. return Ext.core.DomHelper.insertBefore(insertBefore, config, returnDom !== true);
  9659. }
  9660. else {
  9661. return Ext.core.DomHelper[!this.dom.firstChild ? 'insertFirst' : 'append'](this.dom, config, returnDom !== true);
  9662. }
  9663. },
  9664. wrap: function(config, returnDom, selector) {
  9665. var newEl = Ext.core.DomHelper.insertBefore(this.dom, config || {tag: "div"}, true),
  9666. target = newEl;
  9667. if (selector) {
  9668. target = Ext.DomQuery.selectNode(selector, newEl.dom);
  9669. }
  9670. target.appendChild(this.dom);
  9671. return returnDom ? newEl.dom : newEl;
  9672. },
  9673. insertHtml: function(where, html, returnEl) {
  9674. var el = Ext.core.DomHelper.insertHtml(where, this.dom, html);
  9675. return returnEl ? Ext.get(el) : el;
  9676. }
  9677. });
  9678. //@tag dom,core
  9679. //@require Ext.dom.AbstractElement-insertion
  9680. //@define Ext.dom.AbstractElement-position
  9681. //@define Ext.dom.AbstractElement
  9682. (function(){
  9683. var Element = Ext.dom.AbstractElement;
  9684. Element.override({
  9685. getX: function(el) {
  9686. return this.getXY(el)[0];
  9687. },
  9688. getY: function(el) {
  9689. return this.getXY(el)[1];
  9690. },
  9691. getXY: function() {
  9692. var point = window.webkitConvertPointFromNodeToPage(this.dom, new WebKitPoint(0, 0));
  9693. return [point.x, point.y];
  9694. },
  9695. getOffsetsTo: function(el){
  9696. var o = this.getXY(),
  9697. e = Ext.fly(el, '_internal').getXY();
  9698. return [o[0]-e[0],o[1]-e[1]];
  9699. },
  9700. setX: function(x){
  9701. return this.setXY([x, this.getY()]);
  9702. },
  9703. setY: function(y) {
  9704. return this.setXY([this.getX(), y]);
  9705. },
  9706. setLeft: function(left) {
  9707. this.setStyle('left', Element.addUnits(left));
  9708. return this;
  9709. },
  9710. setTop: function(top) {
  9711. this.setStyle('top', Element.addUnits(top));
  9712. return this;
  9713. },
  9714. setRight: function(right) {
  9715. this.setStyle('right', Element.addUnits(right));
  9716. return this;
  9717. },
  9718. setBottom: function(bottom) {
  9719. this.setStyle('bottom', Element.addUnits(bottom));
  9720. return this;
  9721. },
  9722. setXY: function(pos) {
  9723. var me = this,
  9724. pts,
  9725. style,
  9726. pt;
  9727. if (arguments.length > 1) {
  9728. pos = [pos, arguments[1]];
  9729. }
  9730. pts = me.translatePoints(pos);
  9731. style = me.dom.style;
  9732. for (pt in pts) {
  9733. if (!pts.hasOwnProperty(pt)) {
  9734. continue;
  9735. }
  9736. if (!isNaN(pts[pt])) {
  9737. style[pt] = pts[pt] + "px";
  9738. }
  9739. }
  9740. return me;
  9741. },
  9742. getLeft: function(local) {
  9743. return parseInt(this.getStyle('left'), 10) || 0;
  9744. },
  9745. getRight: function(local) {
  9746. return parseInt(this.getStyle('right'), 10) || 0;
  9747. },
  9748. getTop: function(local) {
  9749. return parseInt(this.getStyle('top'), 10) || 0;
  9750. },
  9751. getBottom: function(local) {
  9752. return parseInt(this.getStyle('bottom'), 10) || 0;
  9753. },
  9754. translatePoints: function(x, y) {
  9755. y = isNaN(x[1]) ? y : x[1];
  9756. x = isNaN(x[0]) ? x : x[0];
  9757. var me = this,
  9758. relative = me.isStyle('position', 'relative'),
  9759. o = me.getXY(),
  9760. l = parseInt(me.getStyle('left'), 10),
  9761. t = parseInt(me.getStyle('top'), 10);
  9762. l = !isNaN(l) ? l : (relative ? 0 : me.dom.offsetLeft);
  9763. t = !isNaN(t) ? t : (relative ? 0 : me.dom.offsetTop);
  9764. return {left: (x - o[0] + l), top: (y - o[1] + t)};
  9765. },
  9766. setBox: function(box) {
  9767. var me = this,
  9768. width = box.width,
  9769. height = box.height,
  9770. top = box.top,
  9771. left = box.left;
  9772. if (left !== undefined) {
  9773. me.setLeft(left);
  9774. }
  9775. if (top !== undefined) {
  9776. me.setTop(top);
  9777. }
  9778. if (width !== undefined) {
  9779. me.setWidth(width);
  9780. }
  9781. if (height !== undefined) {
  9782. me.setHeight(height);
  9783. }
  9784. return this;
  9785. },
  9786. getBox: function(contentBox, local) {
  9787. var me = this,
  9788. dom = me.dom,
  9789. width = dom.offsetWidth,
  9790. height = dom.offsetHeight,
  9791. xy, box, l, r, t, b;
  9792. if (!local) {
  9793. xy = me.getXY();
  9794. }
  9795. else if (contentBox) {
  9796. xy = [0,0];
  9797. }
  9798. else {
  9799. xy = [parseInt(me.getStyle("left"), 10) || 0, parseInt(me.getStyle("top"), 10) || 0];
  9800. }
  9801. if (!contentBox) {
  9802. box = {
  9803. x: xy[0],
  9804. y: xy[1],
  9805. 0: xy[0],
  9806. 1: xy[1],
  9807. width: width,
  9808. height: height
  9809. };
  9810. }
  9811. else {
  9812. l = me.getBorderWidth.call(me, "l") + me.getPadding.call(me, "l");
  9813. r = me.getBorderWidth.call(me, "r") + me.getPadding.call(me, "r");
  9814. t = me.getBorderWidth.call(me, "t") + me.getPadding.call(me, "t");
  9815. b = me.getBorderWidth.call(me, "b") + me.getPadding.call(me, "b");
  9816. box = {
  9817. x: xy[0] + l,
  9818. y: xy[1] + t,
  9819. 0: xy[0] + l,
  9820. 1: xy[1] + t,
  9821. width: width - (l + r),
  9822. height: height - (t + b)
  9823. };
  9824. }
  9825. box.left = box.x;
  9826. box.top = box.y;
  9827. box.right = box.x + box.width;
  9828. box.bottom = box.y + box.height;
  9829. return box;
  9830. },
  9831. getPageBox: function(getRegion) {
  9832. var me = this,
  9833. el = me.dom,
  9834. w = el.offsetWidth,
  9835. h = el.offsetHeight,
  9836. xy = me.getXY(),
  9837. t = xy[1],
  9838. r = xy[0] + w,
  9839. b = xy[1] + h,
  9840. l = xy[0];
  9841. if (!el) {
  9842. return new Ext.util.Region();
  9843. }
  9844. if (getRegion) {
  9845. return new Ext.util.Region(t, r, b, l);
  9846. }
  9847. else {
  9848. return {
  9849. left: l,
  9850. top: t,
  9851. width: w,
  9852. height: h,
  9853. right: r,
  9854. bottom: b
  9855. };
  9856. }
  9857. }
  9858. });
  9859. }());
  9860. //@tag dom,core
  9861. //@require Ext.dom.AbstractElement-position
  9862. //@define Ext.dom.AbstractElement-style
  9863. //@define Ext.dom.AbstractElement
  9864. (function(){
  9865. var Element = Ext.dom.AbstractElement,
  9866. view = document.defaultView,
  9867. array = Ext.Array,
  9868. trimRe = /^\s+|\s+$/g,
  9869. wordsRe = /\w/g,
  9870. spacesRe = /\s+/,
  9871. transparentRe = /^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,
  9872. hasClassList = Ext.supports.ClassList,
  9873. PADDING = 'padding',
  9874. MARGIN = 'margin',
  9875. BORDER = 'border',
  9876. LEFT_SUFFIX = '-left',
  9877. RIGHT_SUFFIX = '-right',
  9878. TOP_SUFFIX = '-top',
  9879. BOTTOM_SUFFIX = '-bottom',
  9880. WIDTH = '-width',
  9881. borders = {l: BORDER + LEFT_SUFFIX + WIDTH, r: BORDER + RIGHT_SUFFIX + WIDTH, t: BORDER + TOP_SUFFIX + WIDTH, b: BORDER + BOTTOM_SUFFIX + WIDTH},
  9882. paddings = {l: PADDING + LEFT_SUFFIX, r: PADDING + RIGHT_SUFFIX, t: PADDING + TOP_SUFFIX, b: PADDING + BOTTOM_SUFFIX},
  9883. margins = {l: MARGIN + LEFT_SUFFIX, r: MARGIN + RIGHT_SUFFIX, t: MARGIN + TOP_SUFFIX, b: MARGIN + BOTTOM_SUFFIX};
  9884. Element.override({
  9885. styleHooks: {},
  9886. addStyles : function(sides, styles){
  9887. var totalSize = 0,
  9888. sidesArr = (sides || '').match(wordsRe),
  9889. i,
  9890. len = sidesArr.length,
  9891. side,
  9892. styleSides = [];
  9893. if (len == 1) {
  9894. totalSize = Math.abs(parseFloat(this.getStyle(styles[sidesArr[0]])) || 0);
  9895. } else if (len) {
  9896. for (i = 0; i < len; i++) {
  9897. side = sidesArr[i];
  9898. styleSides.push(styles[side]);
  9899. }
  9900. styleSides = this.getStyle(styleSides);
  9901. for (i=0; i < len; i++) {
  9902. side = sidesArr[i];
  9903. totalSize += Math.abs(parseFloat(styleSides[styles[side]]) || 0);
  9904. }
  9905. }
  9906. return totalSize;
  9907. },
  9908. addCls: hasClassList ?
  9909. function (className) {
  9910. var me = this,
  9911. dom = me.dom,
  9912. classList,
  9913. newCls,
  9914. i,
  9915. len,
  9916. cls;
  9917. if (typeof(className) == 'string') {
  9918. className = className.replace(trimRe, '').split(spacesRe);
  9919. }
  9920. if (dom && className && !!(len = className.length)) {
  9921. if (!dom.className) {
  9922. dom.className = className.join(' ');
  9923. } else {
  9924. classList = dom.classList;
  9925. for (i = 0; i < len; ++i) {
  9926. cls = className[i];
  9927. if (cls) {
  9928. if (!classList.contains(cls)) {
  9929. if (newCls) {
  9930. newCls.push(cls);
  9931. } else {
  9932. newCls = dom.className.replace(trimRe, '');
  9933. newCls = newCls ? [newCls, cls] : [cls];
  9934. }
  9935. }
  9936. }
  9937. }
  9938. if (newCls) {
  9939. dom.className = newCls.join(' ');
  9940. }
  9941. }
  9942. }
  9943. return me;
  9944. } :
  9945. function(className) {
  9946. var me = this,
  9947. dom = me.dom,
  9948. changed,
  9949. elClasses;
  9950. if (dom && className && className.length) {
  9951. elClasses = Ext.Element.mergeClsList(dom.className, className);
  9952. if (elClasses.changed) {
  9953. dom.className = elClasses.join(' ');
  9954. }
  9955. }
  9956. return me;
  9957. },
  9958. removeCls: function(className) {
  9959. var me = this,
  9960. dom = me.dom,
  9961. len,
  9962. elClasses;
  9963. if (typeof(className) == 'string') {
  9964. className = className.replace(trimRe, '').split(spacesRe);
  9965. }
  9966. if (dom && dom.className && className && !!(len = className.length)) {
  9967. if (len == 1 && hasClassList) {
  9968. if (className[0]) {
  9969. dom.classList.remove(className[0]);
  9970. }
  9971. } else {
  9972. elClasses = Ext.Element.removeCls(dom.className, className);
  9973. if (elClasses.changed) {
  9974. dom.className = elClasses.join(' ');
  9975. }
  9976. }
  9977. }
  9978. return me;
  9979. },
  9980. radioCls: function(className) {
  9981. var cn = this.dom.parentNode.childNodes,
  9982. v,
  9983. i, len;
  9984. className = Ext.isArray(className) ? className: [className];
  9985. for (i = 0, len = cn.length; i < len; i++) {
  9986. v = cn[i];
  9987. if (v && v.nodeType == 1) {
  9988. Ext.fly(v, '_internal').removeCls(className);
  9989. }
  9990. }
  9991. return this.addCls(className);
  9992. },
  9993. toggleCls: hasClassList ?
  9994. function (className) {
  9995. var me = this,
  9996. dom = me.dom;
  9997. if (dom) {
  9998. className = className.replace(trimRe, '');
  9999. if (className) {
  10000. dom.classList.toggle(className);
  10001. }
  10002. }
  10003. return me;
  10004. } :
  10005. function(className) {
  10006. var me = this;
  10007. return me.hasCls(className) ? me.removeCls(className) : me.addCls(className);
  10008. },
  10009. hasCls: hasClassList ?
  10010. function (className) {
  10011. var dom = this.dom;
  10012. return (dom && className) ? dom.classList.contains(className) : false;
  10013. } :
  10014. function(className) {
  10015. var dom = this.dom;
  10016. return dom ? className && (' '+dom.className+' ').indexOf(' '+className+' ') != -1 : false;
  10017. },
  10018. replaceCls: function(oldClassName, newClassName){
  10019. return this.removeCls(oldClassName).addCls(newClassName);
  10020. },
  10021. isStyle: function(style, val) {
  10022. return this.getStyle(style) == val;
  10023. },
  10024. getStyle: function (property, inline) {
  10025. var me = this,
  10026. dom = me.dom,
  10027. multiple = typeof property != 'string',
  10028. hooks = me.styleHooks,
  10029. prop = property,
  10030. props = prop,
  10031. len = 1,
  10032. domStyle, camel, values, hook, out, style, i;
  10033. if (multiple) {
  10034. values = {};
  10035. prop = props[0];
  10036. i = 0;
  10037. if (!(len = props.length)) {
  10038. return values;
  10039. }
  10040. }
  10041. if (!dom || dom.documentElement) {
  10042. return values || '';
  10043. }
  10044. domStyle = dom.style;
  10045. if (inline) {
  10046. style = domStyle;
  10047. } else {
  10048. style = dom.ownerDocument.defaultView.getComputedStyle(dom, null);
  10049. if (!style) {
  10050. inline = true;
  10051. style = domStyle;
  10052. }
  10053. }
  10054. do {
  10055. hook = hooks[prop];
  10056. if (!hook) {
  10057. hooks[prop] = hook = { name: Element.normalize(prop) };
  10058. }
  10059. if (hook.get) {
  10060. out = hook.get(dom, me, inline, style);
  10061. } else {
  10062. camel = hook.name;
  10063. out = style[camel];
  10064. }
  10065. if (!multiple) {
  10066. return out;
  10067. }
  10068. values[prop] = out;
  10069. prop = props[++i];
  10070. } while (i < len);
  10071. return values;
  10072. },
  10073. getStyles: function () {
  10074. var props = Ext.Array.slice(arguments),
  10075. len = props.length,
  10076. inline;
  10077. if (len && typeof props[len-1] == 'boolean') {
  10078. inline = props.pop();
  10079. }
  10080. return this.getStyle(props, inline);
  10081. },
  10082. isTransparent: function (prop) {
  10083. var value = this.getStyle(prop);
  10084. return value ? transparentRe.test(value) : false;
  10085. },
  10086. setStyle: function(prop, value) {
  10087. var me = this,
  10088. dom = me.dom,
  10089. hooks = me.styleHooks,
  10090. style = dom.style,
  10091. name = prop,
  10092. hook;
  10093. if (typeof name == 'string') {
  10094. hook = hooks[name];
  10095. if (!hook) {
  10096. hooks[name] = hook = { name: Element.normalize(name) };
  10097. }
  10098. value = (value == null) ? '' : value;
  10099. if (hook.set) {
  10100. hook.set(dom, value, me);
  10101. } else {
  10102. style[hook.name] = value;
  10103. }
  10104. if (hook.afterSet) {
  10105. hook.afterSet(dom, value, me);
  10106. }
  10107. } else {
  10108. for (name in prop) {
  10109. if (prop.hasOwnProperty(name)) {
  10110. hook = hooks[name];
  10111. if (!hook) {
  10112. hooks[name] = hook = { name: Element.normalize(name) };
  10113. }
  10114. value = prop[name];
  10115. value = (value == null) ? '' : value;
  10116. if (hook.set) {
  10117. hook.set(dom, value, me);
  10118. } else {
  10119. style[hook.name] = value;
  10120. }
  10121. if (hook.afterSet) {
  10122. hook.afterSet(dom, value, me);
  10123. }
  10124. }
  10125. }
  10126. }
  10127. return me;
  10128. },
  10129. getHeight: function(contentHeight) {
  10130. var dom = this.dom,
  10131. height = contentHeight ? (dom.clientHeight - this.getPadding("tb")) : dom.offsetHeight;
  10132. return height > 0 ? height: 0;
  10133. },
  10134. getWidth: function(contentWidth) {
  10135. var dom = this.dom,
  10136. width = contentWidth ? (dom.clientWidth - this.getPadding("lr")) : dom.offsetWidth;
  10137. return width > 0 ? width: 0;
  10138. },
  10139. setWidth: function(width) {
  10140. var me = this;
  10141. me.dom.style.width = Element.addUnits(width);
  10142. return me;
  10143. },
  10144. setHeight: function(height) {
  10145. var me = this;
  10146. me.dom.style.height = Element.addUnits(height);
  10147. return me;
  10148. },
  10149. getBorderWidth: function(side){
  10150. return this.addStyles(side, borders);
  10151. },
  10152. getPadding: function(side){
  10153. return this.addStyles(side, paddings);
  10154. },
  10155. margins : margins,
  10156. applyStyles: function(styles) {
  10157. if (styles) {
  10158. var i,
  10159. len,
  10160. dom = this.dom;
  10161. if (typeof styles == 'function') {
  10162. styles = styles.call();
  10163. }
  10164. if (typeof styles == 'string') {
  10165. styles = Ext.util.Format.trim(styles).split(/\s*(?::|;)\s*/);
  10166. for (i = 0, len = styles.length; i < len;) {
  10167. dom.style[Element.normalize(styles[i++])] = styles[i++];
  10168. }
  10169. }
  10170. else if (typeof styles == 'object') {
  10171. this.setStyle(styles);
  10172. }
  10173. }
  10174. },
  10175. setSize: function(width, height) {
  10176. var me = this,
  10177. style = me.dom.style;
  10178. if (Ext.isObject(width)) {
  10179. height = width.height;
  10180. width = width.width;
  10181. }
  10182. style.width = Element.addUnits(width);
  10183. style.height = Element.addUnits(height);
  10184. return me;
  10185. },
  10186. getViewSize: function() {
  10187. var doc = document,
  10188. dom = this.dom;
  10189. if (dom == doc || dom == doc.body) {
  10190. return {
  10191. width: Element.getViewportWidth(),
  10192. height: Element.getViewportHeight()
  10193. };
  10194. }
  10195. else {
  10196. return {
  10197. width: dom.clientWidth,
  10198. height: dom.clientHeight
  10199. };
  10200. }
  10201. },
  10202. getSize: function(contentSize) {
  10203. var dom = this.dom;
  10204. return {
  10205. width: Math.max(0, contentSize ? (dom.clientWidth - this.getPadding("lr")) : dom.offsetWidth),
  10206. height: Math.max(0, contentSize ? (dom.clientHeight - this.getPadding("tb")) : dom.offsetHeight)
  10207. };
  10208. },
  10209. repaint: function(){
  10210. var dom = this.dom;
  10211. this.addCls(Ext.baseCSSPrefix + 'repaint');
  10212. setTimeout(function(){
  10213. Ext.fly(dom).removeCls(Ext.baseCSSPrefix + 'repaint');
  10214. }, 1);
  10215. return this;
  10216. },
  10217. getMargin: function(side){
  10218. var me = this,
  10219. hash = {t:"top", l:"left", r:"right", b: "bottom"},
  10220. key,
  10221. o,
  10222. margins;
  10223. if (!side) {
  10224. margins = [];
  10225. for (key in me.margins) {
  10226. if(me.margins.hasOwnProperty(key)) {
  10227. margins.push(me.margins[key]);
  10228. }
  10229. }
  10230. o = me.getStyle(margins);
  10231. if(o && typeof o == 'object') {
  10232. for (key in me.margins) {
  10233. if(me.margins.hasOwnProperty(key)) {
  10234. o[hash[key]] = parseFloat(o[me.margins[key]]) || 0;
  10235. }
  10236. }
  10237. }
  10238. return o;
  10239. } else {
  10240. return me.addStyles.call(me, side, me.margins);
  10241. }
  10242. },
  10243. mask: function(msg, msgCls, transparent) {
  10244. var me = this,
  10245. dom = me.dom,
  10246. data = (me.$cache || me.getCache()).data,
  10247. el = data.mask,
  10248. mask,
  10249. size,
  10250. cls = '',
  10251. prefix = Ext.baseCSSPrefix;
  10252. me.addCls(prefix + 'masked');
  10253. if (me.getStyle("position") == "static") {
  10254. me.addCls(prefix + 'masked-relative');
  10255. }
  10256. if (el) {
  10257. el.remove();
  10258. }
  10259. if (msgCls && typeof msgCls == 'string' ) {
  10260. cls = ' ' + msgCls;
  10261. }
  10262. else {
  10263. cls = ' ' + prefix + 'mask-gray';
  10264. }
  10265. mask = me.createChild({
  10266. cls: prefix + 'mask' + ((transparent !== false) ? '' : (' ' + prefix + 'mask-gray')),
  10267. html: msg ? ('<div class="' + (msgCls || (prefix + 'mask-message')) + '">' + msg + '</div>') : ''
  10268. });
  10269. size = me.getSize();
  10270. data.mask = mask;
  10271. if (dom === document.body) {
  10272. size.height = window.innerHeight;
  10273. if (me.orientationHandler) {
  10274. Ext.EventManager.unOrientationChange(me.orientationHandler, me);
  10275. }
  10276. me.orientationHandler = function() {
  10277. size = me.getSize();
  10278. size.height = window.innerHeight;
  10279. mask.setSize(size);
  10280. };
  10281. Ext.EventManager.onOrientationChange(me.orientationHandler, me);
  10282. }
  10283. mask.setSize(size);
  10284. if (Ext.is.iPad) {
  10285. Ext.repaint();
  10286. }
  10287. },
  10288. unmask: function() {
  10289. var me = this,
  10290. data = (me.$cache || me.getCache()).data,
  10291. mask = data.mask,
  10292. prefix = Ext.baseCSSPrefix;
  10293. if (mask) {
  10294. mask.remove();
  10295. delete data.mask;
  10296. }
  10297. me.removeCls([prefix + 'masked', prefix + 'masked-relative']);
  10298. if (me.dom === document.body) {
  10299. Ext.EventManager.unOrientationChange(me.orientationHandler, me);
  10300. delete me.orientationHandler;
  10301. }
  10302. }
  10303. });
  10304. Element.populateStyleMap = function (map, order) {
  10305. var baseStyles = ['margin-', 'padding-', 'border-width-'],
  10306. beforeAfter = ['before', 'after'],
  10307. index, style, name, i;
  10308. for (index = baseStyles.length; index--; ) {
  10309. for (i = 2; i--; ) {
  10310. style = baseStyles[index] + beforeAfter[i];
  10311. map[Element.normalize(style)] = map[style] = {
  10312. name: Element.normalize(baseStyles[index] + order[i])
  10313. };
  10314. }
  10315. }
  10316. };
  10317. Ext.onReady(function () {
  10318. var supports = Ext.supports,
  10319. styleHooks,
  10320. colorStyles, i, name, camel;
  10321. function fixTransparent (dom, el, inline, style) {
  10322. var value = style[this.name] || '';
  10323. return transparentRe.test(value) ? 'transparent' : value;
  10324. }
  10325. function fixRightMargin (dom, el, inline, style) {
  10326. var result = style.marginRight,
  10327. domStyle, display;
  10328. if (result != '0px') {
  10329. domStyle = dom.style;
  10330. display = domStyle.display;
  10331. domStyle.display = 'inline-block';
  10332. result = (inline ? style : dom.ownerDocument.defaultView.getComputedStyle(dom, null)).marginRight;
  10333. domStyle.display = display;
  10334. }
  10335. return result;
  10336. }
  10337. function fixRightMarginAndInputFocus (dom, el, inline, style) {
  10338. var result = style.marginRight,
  10339. domStyle, cleaner, display;
  10340. if (result != '0px') {
  10341. domStyle = dom.style;
  10342. cleaner = Element.getRightMarginFixCleaner(dom);
  10343. display = domStyle.display;
  10344. domStyle.display = 'inline-block';
  10345. result = (inline ? style : dom.ownerDocument.defaultView.getComputedStyle(dom, '')).marginRight;
  10346. domStyle.display = display;
  10347. cleaner();
  10348. }
  10349. return result;
  10350. }
  10351. styleHooks = Element.prototype.styleHooks;
  10352. Element.populateStyleMap(styleHooks, ['left', 'right']);
  10353. if (supports.init) {
  10354. supports.init();
  10355. }
  10356. if (!supports.RightMargin) {
  10357. styleHooks.marginRight = styleHooks['margin-right'] = {
  10358. name: 'marginRight',
  10359. get: (supports.DisplayChangeInputSelectionBug || supports.DisplayChangeTextAreaSelectionBug) ?
  10360. fixRightMarginAndInputFocus : fixRightMargin
  10361. };
  10362. }
  10363. if (!supports.TransparentColor) {
  10364. colorStyles = ['background-color', 'border-color', 'color', 'outline-color'];
  10365. for (i = colorStyles.length; i--; ) {
  10366. name = colorStyles[i];
  10367. camel = Element.normalize(name);
  10368. styleHooks[name] = styleHooks[camel] = {
  10369. name: camel,
  10370. get: fixTransparent
  10371. };
  10372. }
  10373. }
  10374. });
  10375. }());
  10376. //@tag dom,core
  10377. //@require Ext.dom.AbstractElement-style
  10378. //@define Ext.dom.AbstractElement-traversal
  10379. //@define Ext.dom.AbstractElement
  10380. Ext.dom.AbstractElement.override({
  10381. findParent: function(simpleSelector, limit, returnEl) {
  10382. var target = this.dom,
  10383. topmost = document.documentElement,
  10384. depth = 0,
  10385. stopEl;
  10386. limit = limit || 50;
  10387. if (isNaN(limit)) {
  10388. stopEl = Ext.getDom(limit);
  10389. limit = Number.MAX_VALUE;
  10390. }
  10391. while (target && target.nodeType == 1 && depth < limit && target != topmost && target != stopEl) {
  10392. if (Ext.DomQuery.is(target, simpleSelector)) {
  10393. return returnEl ? Ext.get(target) : target;
  10394. }
  10395. depth++;
  10396. target = target.parentNode;
  10397. }
  10398. return null;
  10399. },
  10400. findParentNode: function(simpleSelector, limit, returnEl) {
  10401. var p = Ext.fly(this.dom.parentNode, '_internal');
  10402. return p ? p.findParent(simpleSelector, limit, returnEl) : null;
  10403. },
  10404. up: function(simpleSelector, limit) {
  10405. return this.findParentNode(simpleSelector, limit, true);
  10406. },
  10407. select: function(selector, composite) {
  10408. return Ext.dom.Element.select(selector, this.dom, composite);
  10409. },
  10410. query: function(selector) {
  10411. return Ext.DomQuery.select(selector, this.dom);
  10412. },
  10413. down: function(selector, returnDom) {
  10414. var n = Ext.DomQuery.selectNode(selector, this.dom);
  10415. return returnDom ? n : Ext.get(n);
  10416. },
  10417. child: function(selector, returnDom) {
  10418. var node,
  10419. me = this,
  10420. id;
  10421. id = Ext.id(me.dom);
  10422. id = Ext.escapeId(id);
  10423. node = Ext.DomQuery.selectNode('#' + id + " > " + selector, me.dom);
  10424. return returnDom ? node : Ext.get(node);
  10425. },
  10426. parent: function(selector, returnDom) {
  10427. return this.matchNode('parentNode', 'parentNode', selector, returnDom);
  10428. },
  10429. next: function(selector, returnDom) {
  10430. return this.matchNode('nextSibling', 'nextSibling', selector, returnDom);
  10431. },
  10432. prev: function(selector, returnDom) {
  10433. return this.matchNode('previousSibling', 'previousSibling', selector, returnDom);
  10434. },
  10435. first: function(selector, returnDom) {
  10436. return this.matchNode('nextSibling', 'firstChild', selector, returnDom);
  10437. },
  10438. last: function(selector, returnDom) {
  10439. return this.matchNode('previousSibling', 'lastChild', selector, returnDom);
  10440. },
  10441. matchNode: function(dir, start, selector, returnDom) {
  10442. if (!this.dom) {
  10443. return null;
  10444. }
  10445. var n = this.dom[start];
  10446. while (n) {
  10447. if (n.nodeType == 1 && (!selector || Ext.DomQuery.is(n, selector))) {
  10448. return !returnDom ? Ext.get(n) : n;
  10449. }
  10450. n = n[dir];
  10451. }
  10452. return null;
  10453. },
  10454. isAncestor: function(element) {
  10455. return this.self.isAncestor.call(this.self, this.dom, element);
  10456. }
  10457. });
  10458. //@tag dom,core
  10459. //@define Ext.DomHelper
  10460. //@define Ext.core.DomHelper
  10461. //@require Ext.dom.AbstractElement-traversal
  10462. (function() {
  10463. var afterbegin = 'afterbegin',
  10464. afterend = 'afterend',
  10465. beforebegin = 'beforebegin',
  10466. beforeend = 'beforeend',
  10467. ts = '<table>',
  10468. te = '</table>',
  10469. tbs = ts+'<tbody>',
  10470. tbe = '</tbody>'+te,
  10471. trs = tbs + '<tr>',
  10472. tre = '</tr>'+tbe,
  10473. detachedDiv = document.createElement('div'),
  10474. bbValues = ['BeforeBegin', 'previousSibling'],
  10475. aeValues = ['AfterEnd', 'nextSibling'],
  10476. bb_ae_PositionHash = {
  10477. beforebegin: bbValues,
  10478. afterend: aeValues
  10479. },
  10480. fullPositionHash = {
  10481. beforebegin: bbValues,
  10482. afterend: aeValues,
  10483. afterbegin: ['AfterBegin', 'firstChild'],
  10484. beforeend: ['BeforeEnd', 'lastChild']
  10485. };
  10486. Ext.define('Ext.dom.Helper', {
  10487. extend: 'Ext.dom.AbstractHelper',
  10488. requires:['Ext.dom.AbstractElement'],
  10489. tableRe: /^table|tbody|tr|td$/i,
  10490. tableElRe: /td|tr|tbody/i,
  10491. useDom : false,
  10492. createDom: function(o, parentNode){
  10493. var el,
  10494. doc = document,
  10495. useSet,
  10496. attr,
  10497. val,
  10498. cn,
  10499. i, l;
  10500. if (Ext.isArray(o)) {
  10501. el = doc.createDocumentFragment();
  10502. for (i = 0, l = o.length; i < l; i++) {
  10503. this.createDom(o[i], el);
  10504. }
  10505. } else if (typeof o == 'string') {
  10506. el = doc.createTextNode(o);
  10507. } else {
  10508. el = doc.createElement(o.tag || 'div');
  10509. useSet = !!el.setAttribute;
  10510. for (attr in o) {
  10511. if (!this.confRe.test(attr)) {
  10512. val = o[attr];
  10513. if (attr == 'cls') {
  10514. el.className = val;
  10515. } else {
  10516. if (useSet) {
  10517. el.setAttribute(attr, val);
  10518. } else {
  10519. el[attr] = val;
  10520. }
  10521. }
  10522. }
  10523. }
  10524. Ext.DomHelper.applyStyles(el, o.style);
  10525. if ((cn = o.children || o.cn)) {
  10526. this.createDom(cn, el);
  10527. } else if (o.html) {
  10528. el.innerHTML = o.html;
  10529. }
  10530. }
  10531. if (parentNode) {
  10532. parentNode.appendChild(el);
  10533. }
  10534. return el;
  10535. },
  10536. ieTable: function(depth, openingTags, htmlContent, closingTags){
  10537. detachedDiv.innerHTML = [openingTags, htmlContent, closingTags].join('');
  10538. var i = -1,
  10539. el = detachedDiv,
  10540. ns;
  10541. while (++i < depth) {
  10542. el = el.firstChild;
  10543. }
  10544. ns = el.nextSibling;
  10545. if (ns) {
  10546. el = document.createDocumentFragment();
  10547. while (ns) {
  10548. el.appendChild(ns);
  10549. ns = ns.nextSibling;
  10550. }
  10551. }
  10552. return el;
  10553. },
  10554. insertIntoTable: function(tag, where, destinationEl, html) {
  10555. var node,
  10556. before,
  10557. bb = where == beforebegin,
  10558. ab = where == afterbegin,
  10559. be = where == beforeend,
  10560. ae = where == afterend;
  10561. if (tag == 'td' && (ab || be) || !this.tableElRe.test(tag) && (bb || ae)) {
  10562. return null;
  10563. }
  10564. before = bb ? destinationEl :
  10565. ae ? destinationEl.nextSibling :
  10566. ab ? destinationEl.firstChild : null;
  10567. if (bb || ae) {
  10568. destinationEl = destinationEl.parentNode;
  10569. }
  10570. if (tag == 'td' || (tag == 'tr' && (be || ab))) {
  10571. node = this.ieTable(4, trs, html, tre);
  10572. } else if ((tag == 'tbody' && (be || ab)) ||
  10573. (tag == 'tr' && (bb || ae))) {
  10574. node = this.ieTable(3, tbs, html, tbe);
  10575. } else {
  10576. node = this.ieTable(2, ts, html, te);
  10577. }
  10578. destinationEl.insertBefore(node, before);
  10579. return node;
  10580. },
  10581. createContextualFragment: function(html) {
  10582. var fragment = document.createDocumentFragment(),
  10583. length, childNodes;
  10584. detachedDiv.innerHTML = html;
  10585. childNodes = detachedDiv.childNodes;
  10586. length = childNodes.length;
  10587. while (length--) {
  10588. fragment.appendChild(childNodes[0]);
  10589. }
  10590. return fragment;
  10591. },
  10592. applyStyles: function(el, styles) {
  10593. if (styles) {
  10594. el = Ext.fly(el);
  10595. if (typeof styles == "function") {
  10596. styles = styles.call();
  10597. }
  10598. if (typeof styles == "string") {
  10599. styles = Ext.dom.Element.parseStyles(styles);
  10600. }
  10601. if (typeof styles == "object") {
  10602. el.setStyle(styles);
  10603. }
  10604. }
  10605. },
  10606. createHtml: function(spec) {
  10607. return this.markup(spec);
  10608. },
  10609. doInsert: function(el, o, returnElement, pos, sibling, append) {
  10610. el = el.dom || Ext.getDom(el);
  10611. var newNode;
  10612. if (this.useDom) {
  10613. newNode = this.createDom(o, null);
  10614. if (append) {
  10615. el.appendChild(newNode);
  10616. }
  10617. else {
  10618. (sibling == 'firstChild' ? el : el.parentNode).insertBefore(newNode, el[sibling] || el);
  10619. }
  10620. } else {
  10621. newNode = this.insertHtml(pos, el, this.markup(o));
  10622. }
  10623. return returnElement ? Ext.get(newNode, true) : newNode;
  10624. },
  10625. overwrite: function(el, html, returnElement) {
  10626. var newNode;
  10627. el = Ext.getDom(el);
  10628. html = this.markup(html);
  10629. if (Ext.isIE && this.tableRe.test(el.tagName)) {
  10630. while (el.firstChild) {
  10631. el.removeChild(el.firstChild);
  10632. }
  10633. if (html) {
  10634. newNode = this.insertHtml('afterbegin', el, html);
  10635. return returnElement ? Ext.get(newNode) : newNode;
  10636. }
  10637. return null;
  10638. }
  10639. el.innerHTML = html;
  10640. return returnElement ? Ext.get(el.firstChild) : el.firstChild;
  10641. },
  10642. insertHtml: function(where, el, html) {
  10643. var hashVal,
  10644. range,
  10645. rangeEl,
  10646. setStart,
  10647. frag;
  10648. where = where.toLowerCase();
  10649. if (el.insertAdjacentHTML) {
  10650. if (Ext.isIE && this.tableRe.test(el.tagName) && (frag = this.insertIntoTable(el.tagName.toLowerCase(), where, el, html))) {
  10651. return frag;
  10652. }
  10653. if ((hashVal = fullPositionHash[where])) {
  10654. el.insertAdjacentHTML(hashVal[0], html);
  10655. return el[hashVal[1]];
  10656. }
  10657. } else {
  10658. if (el.nodeType === 3) {
  10659. where = where === 'afterbegin' ? 'beforebegin' : where;
  10660. where = where === 'beforeend' ? 'afterend' : where;
  10661. }
  10662. range = Ext.supports.CreateContextualFragment ? el.ownerDocument.createRange() : undefined;
  10663. setStart = 'setStart' + (this.endRe.test(where) ? 'After' : 'Before');
  10664. if (bb_ae_PositionHash[where]) {
  10665. if (range) {
  10666. range[setStart](el);
  10667. frag = range.createContextualFragment(html);
  10668. } else {
  10669. frag = this.createContextualFragment(html);
  10670. }
  10671. el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling);
  10672. return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling'];
  10673. } else {
  10674. rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child';
  10675. if (el.firstChild) {
  10676. if (range) {
  10677. range[setStart](el[rangeEl]);
  10678. frag = range.createContextualFragment(html);
  10679. } else {
  10680. frag = this.createContextualFragment(html);
  10681. }
  10682. if (where == afterbegin) {
  10683. el.insertBefore(frag, el.firstChild);
  10684. } else {
  10685. el.appendChild(frag);
  10686. }
  10687. } else {
  10688. el.innerHTML = html;
  10689. }
  10690. return el[rangeEl];
  10691. }
  10692. }
  10693. },
  10694. createTemplate: function(o) {
  10695. var html = this.markup(o);
  10696. return new Ext.Template(html);
  10697. }
  10698. }, function() {
  10699. Ext.ns('Ext.core');
  10700. Ext.DomHelper = Ext.core.DomHelper = new this;
  10701. });
  10702. }());
  10703. //@tag dom,core
  10704. //@require Helper.js
  10705. //@define Ext.dom.Query
  10706. //@define Ext.core.Query
  10707. //@define Ext.DomQuery
  10708. Ext.ns('Ext.core');
  10709. Ext.dom.Query = Ext.core.DomQuery = Ext.DomQuery = (function(){
  10710. var cache = {},
  10711. simpleCache = {},
  10712. valueCache = {},
  10713. nonSpace = /\S/,
  10714. trimRe = /^\s+|\s+$/g,
  10715. tplRe = /\{(\d+)\}/g,
  10716. modeRe = /^(\s?[\/>+~]\s?|\s|$)/,
  10717. tagTokenRe = /^(#)?([\w\-\*\\]+)/,
  10718. nthRe = /(\d*)n\+?(\d*)/,
  10719. nthRe2 = /\D/,
  10720. startIdRe = /^\s*\#/,
  10721. isIE = window.ActiveXObject ? true : false,
  10722. key = 30803,
  10723. longHex = /\\([0-9a-fA-F]{6})/g,
  10724. shortHex = /\\([0-9a-fA-F]{1,6})\s{0,1}/g,
  10725. nonHex = /\\([^0-9a-fA-F]{1})/g,
  10726. escapes = /\\/g,
  10727. num, hasEscapes,
  10728. longHexToChar = function($0, $1) {
  10729. return String.fromCharCode(parseInt($1, 16));
  10730. },
  10731. shortToLongHex = function($0, $1) {
  10732. while ($1.length < 6) {
  10733. $1 = '0' + $1;
  10734. }
  10735. return '\\' + $1;
  10736. },
  10737. charToLongHex = function($0, $1) {
  10738. num = $1.charCodeAt(0).toString(16);
  10739. if (num.length === 1) {
  10740. num = '0' + num;
  10741. }
  10742. return '\\0000' + num;
  10743. },
  10744. unescapeCssSelector = function (selector) {
  10745. return (hasEscapes)
  10746. ? selector.replace(longHex, longHexToChar)
  10747. : selector;
  10748. },
  10749. setupEscapes = function(path){
  10750. hasEscapes = (path.indexOf('\\') > -1);
  10751. if (hasEscapes) {
  10752. path = path
  10753. .replace(shortHex, shortToLongHex)
  10754. .replace(nonHex, charToLongHex)
  10755. .replace(escapes, '\\\\');
  10756. }
  10757. return path;
  10758. };
  10759. eval("var batch = 30803;");
  10760. function child(parent, index){
  10761. var i = 0,
  10762. n = parent.firstChild;
  10763. while(n){
  10764. if(n.nodeType == 1){
  10765. if(++i == index){
  10766. return n;
  10767. }
  10768. }
  10769. n = n.nextSibling;
  10770. }
  10771. return null;
  10772. }
  10773. function next(n){
  10774. while((n = n.nextSibling) && n.nodeType != 1);
  10775. return n;
  10776. }
  10777. function prev(n){
  10778. while((n = n.previousSibling) && n.nodeType != 1);
  10779. return n;
  10780. }
  10781. function children(parent){
  10782. var n = parent.firstChild,
  10783. nodeIndex = -1,
  10784. nextNode;
  10785. while(n){
  10786. nextNode = n.nextSibling;
  10787. if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
  10788. parent.removeChild(n);
  10789. }else{
  10790. n.nodeIndex = ++nodeIndex;
  10791. }
  10792. n = nextNode;
  10793. }
  10794. return this;
  10795. }
  10796. function byClassName(nodeSet, cls){
  10797. cls = unescapeCssSelector(cls);
  10798. if(!cls){
  10799. return nodeSet;
  10800. }
  10801. var result = [], ri = -1,
  10802. i, ci;
  10803. for(i = 0, ci; ci = nodeSet[i]; i++){
  10804. if((' '+ci.className+' ').indexOf(cls) != -1){
  10805. result[++ri] = ci;
  10806. }
  10807. }
  10808. return result;
  10809. }
  10810. function attrValue(n, attr){
  10811. if(!n.tagName && typeof n.length != "undefined"){
  10812. n = n[0];
  10813. }
  10814. if(!n){
  10815. return null;
  10816. }
  10817. if(attr == "for"){
  10818. return n.htmlFor;
  10819. }
  10820. if(attr == "class" || attr == "className"){
  10821. return n.className;
  10822. }
  10823. return n.getAttribute(attr) || n[attr];
  10824. }
  10825. function getNodes(ns, mode, tagName){
  10826. var result = [], ri = -1, cs,
  10827. i, ni, j, ci, cn, utag, n, cj;
  10828. if(!ns){
  10829. return result;
  10830. }
  10831. tagName = tagName || "*";
  10832. if(typeof ns.getElementsByTagName != "undefined"){
  10833. ns = [ns];
  10834. }
  10835. if(!mode){
  10836. for(i = 0, ni; ni = ns[i]; i++){
  10837. cs = ni.getElementsByTagName(tagName);
  10838. for(j = 0, ci; ci = cs[j]; j++){
  10839. result[++ri] = ci;
  10840. }
  10841. }
  10842. } else if(mode == "/" || mode == ">"){
  10843. utag = tagName.toUpperCase();
  10844. for(i = 0, ni, cn; ni = ns[i]; i++){
  10845. cn = ni.childNodes;
  10846. for(j = 0, cj; cj = cn[j]; j++){
  10847. if(cj.nodeName == utag || cj.nodeName == tagName || tagName == '*'){
  10848. result[++ri] = cj;
  10849. }
  10850. }
  10851. }
  10852. }else if(mode == "+"){
  10853. utag = tagName.toUpperCase();
  10854. for(i = 0, n; n = ns[i]; i++){
  10855. while((n = n.nextSibling) && n.nodeType != 1);
  10856. if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){
  10857. result[++ri] = n;
  10858. }
  10859. }
  10860. }else if(mode == "~"){
  10861. utag = tagName.toUpperCase();
  10862. for(i = 0, n; n = ns[i]; i++){
  10863. while((n = n.nextSibling)){
  10864. if (n.nodeName == utag || n.nodeName == tagName || tagName == '*'){
  10865. result[++ri] = n;
  10866. }
  10867. }
  10868. }
  10869. }
  10870. return result;
  10871. }
  10872. function concat(a, b){
  10873. if(b.slice){
  10874. return a.concat(b);
  10875. }
  10876. for(var i = 0, l = b.length; i < l; i++){
  10877. a[a.length] = b[i];
  10878. }
  10879. return a;
  10880. }
  10881. function byTag(cs, tagName){
  10882. if(cs.tagName || cs == document){
  10883. cs = [cs];
  10884. }
  10885. if(!tagName){
  10886. return cs;
  10887. }
  10888. var result = [], ri = -1,
  10889. i, ci;
  10890. tagName = tagName.toLowerCase();
  10891. for(i = 0, ci; ci = cs[i]; i++){
  10892. if(ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName){
  10893. result[++ri] = ci;
  10894. }
  10895. }
  10896. return result;
  10897. }
  10898. function byId(cs, id){
  10899. id = unescapeCssSelector(id);
  10900. if(cs.tagName || cs == document){
  10901. cs = [cs];
  10902. }
  10903. if(!id){
  10904. return cs;
  10905. }
  10906. var result = [], ri = -1,
  10907. i, ci;
  10908. for(i = 0, ci; ci = cs[i]; i++){
  10909. if(ci && ci.id == id){
  10910. result[++ri] = ci;
  10911. return result;
  10912. }
  10913. }
  10914. return result;
  10915. }
  10916. function byAttribute(cs, attr, value, op, custom){
  10917. var result = [],
  10918. ri = -1,
  10919. useGetStyle = custom == "{",
  10920. fn = Ext.DomQuery.operators[op],
  10921. a,
  10922. xml,
  10923. hasXml,
  10924. i, ci;
  10925. value = unescapeCssSelector(value);
  10926. for(i = 0, ci; ci = cs[i]; i++){
  10927. if(ci.nodeType != 1){
  10928. continue;
  10929. }
  10930. if(!hasXml){
  10931. xml = Ext.DomQuery.isXml(ci);
  10932. hasXml = true;
  10933. }
  10934. if(!xml){
  10935. if(useGetStyle){
  10936. a = Ext.DomQuery.getStyle(ci, attr);
  10937. } else if (attr == "class" || attr == "className"){
  10938. a = ci.className;
  10939. } else if (attr == "for"){
  10940. a = ci.htmlFor;
  10941. } else if (attr == "href"){
  10942. a = ci.getAttribute("href", 2);
  10943. } else{
  10944. a = ci.getAttribute(attr);
  10945. }
  10946. }else{
  10947. a = ci.getAttribute(attr);
  10948. }
  10949. if((fn && fn(a, value)) || (!fn && a)){
  10950. result[++ri] = ci;
  10951. }
  10952. }
  10953. return result;
  10954. }
  10955. function byPseudo(cs, name, value){
  10956. value = unescapeCssSelector(value);
  10957. return Ext.DomQuery.pseudos[name](cs, value);
  10958. }
  10959. function nodupIEXml(cs){
  10960. var d = ++key,
  10961. r,
  10962. i, len, c;
  10963. cs[0].setAttribute("_nodup", d);
  10964. r = [cs[0]];
  10965. for(i = 1, len = cs.length; i < len; i++){
  10966. c = cs[i];
  10967. if(!c.getAttribute("_nodup") != d){
  10968. c.setAttribute("_nodup", d);
  10969. r[r.length] = c;
  10970. }
  10971. }
  10972. for(i = 0, len = cs.length; i < len; i++){
  10973. cs[i].removeAttribute("_nodup");
  10974. }
  10975. return r;
  10976. }
  10977. function nodup(cs){
  10978. if(!cs){
  10979. return [];
  10980. }
  10981. var len = cs.length, c, i, r = cs, cj, ri = -1, d, j;
  10982. if(!len || typeof cs.nodeType != "undefined" || len == 1){
  10983. return cs;
  10984. }
  10985. if(isIE && typeof cs[0].selectSingleNode != "undefined"){
  10986. return nodupIEXml(cs);
  10987. }
  10988. d = ++key;
  10989. cs[0]._nodup = d;
  10990. for(i = 1; c = cs[i]; i++){
  10991. if(c._nodup != d){
  10992. c._nodup = d;
  10993. }else{
  10994. r = [];
  10995. for(j = 0; j < i; j++){
  10996. r[++ri] = cs[j];
  10997. }
  10998. for(j = i+1; cj = cs[j]; j++){
  10999. if(cj._nodup != d){
  11000. cj._nodup = d;
  11001. r[++ri] = cj;
  11002. }
  11003. }
  11004. return r;
  11005. }
  11006. }
  11007. return r;
  11008. }
  11009. function quickDiffIEXml(c1, c2){
  11010. var d = ++key,
  11011. r = [],
  11012. i, len;
  11013. for(i = 0, len = c1.length; i < len; i++){
  11014. c1[i].setAttribute("_qdiff", d);
  11015. }
  11016. for(i = 0, len = c2.length; i < len; i++){
  11017. if(c2[i].getAttribute("_qdiff") != d){
  11018. r[r.length] = c2[i];
  11019. }
  11020. }
  11021. for(i = 0, len = c1.length; i < len; i++){
  11022. c1[i].removeAttribute("_qdiff");
  11023. }
  11024. return r;
  11025. }
  11026. function quickDiff(c1, c2){
  11027. var len1 = c1.length,
  11028. d = ++key,
  11029. r = [],
  11030. i, len;
  11031. if(!len1){
  11032. return c2;
  11033. }
  11034. if(isIE && typeof c1[0].selectSingleNode != "undefined"){
  11035. return quickDiffIEXml(c1, c2);
  11036. }
  11037. for(i = 0; i < len1; i++){
  11038. c1[i]._qdiff = d;
  11039. }
  11040. for(i = 0, len = c2.length; i < len; i++){
  11041. if(c2[i]._qdiff != d){
  11042. r[r.length] = c2[i];
  11043. }
  11044. }
  11045. return r;
  11046. }
  11047. function quickId(ns, mode, root, id){
  11048. if(ns == root){
  11049. id = unescapeCssSelector(id);
  11050. var d = root.ownerDocument || root;
  11051. return d.getElementById(id);
  11052. }
  11053. ns = getNodes(ns, mode, "*");
  11054. return byId(ns, id);
  11055. }
  11056. return {
  11057. getStyle : function(el, name){
  11058. return Ext.fly(el).getStyle(name);
  11059. },
  11060. compile : function(path, type){
  11061. type = type || "select";
  11062. var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],
  11063. mode,
  11064. lastPath,
  11065. matchers = Ext.DomQuery.matchers,
  11066. matchersLn = matchers.length,
  11067. modeMatch,
  11068. lmode = path.match(modeRe),
  11069. tokenMatch, matched, j, t, m;
  11070. path = setupEscapes(path);
  11071. if(lmode && lmode[1]){
  11072. fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';
  11073. path = path.replace(lmode[1], "");
  11074. }
  11075. while(path.substr(0, 1)=="/"){
  11076. path = path.substr(1);
  11077. }
  11078. while(path && lastPath != path){
  11079. lastPath = path;
  11080. tokenMatch = path.match(tagTokenRe);
  11081. if(type == "select"){
  11082. if(tokenMatch){
  11083. if(tokenMatch[1] == "#"){
  11084. fn[fn.length] = 'n = quickId(n, mode, root, "'+tokenMatch[2]+'");';
  11085. }else{
  11086. fn[fn.length] = 'n = getNodes(n, mode, "'+tokenMatch[2]+'");';
  11087. }
  11088. path = path.replace(tokenMatch[0], "");
  11089. }else if(path.substr(0, 1) != '@'){
  11090. fn[fn.length] = 'n = getNodes(n, mode, "*");';
  11091. }
  11092. }else{
  11093. if(tokenMatch){
  11094. if(tokenMatch[1] == "#"){
  11095. fn[fn.length] = 'n = byId(n, "'+tokenMatch[2]+'");';
  11096. }else{
  11097. fn[fn.length] = 'n = byTag(n, "'+tokenMatch[2]+'");';
  11098. }
  11099. path = path.replace(tokenMatch[0], "");
  11100. }
  11101. }
  11102. while(!(modeMatch = path.match(modeRe))){
  11103. matched = false;
  11104. for(j = 0; j < matchersLn; j++){
  11105. t = matchers[j];
  11106. m = path.match(t.re);
  11107. if(m){
  11108. fn[fn.length] = t.select.replace(tplRe, function(x, i){
  11109. return m[i];
  11110. });
  11111. path = path.replace(m[0], "");
  11112. matched = true;
  11113. break;
  11114. }
  11115. }
  11116. if(!matched){
  11117. Ext.Error.raise({
  11118. sourceClass: 'Ext.DomQuery',
  11119. sourceMethod: 'compile',
  11120. msg: 'Error parsing selector. Parsing failed at "' + path + '"'
  11121. });
  11122. }
  11123. }
  11124. if(modeMatch[1]){
  11125. fn[fn.length] = 'mode="'+modeMatch[1].replace(trimRe, "")+'";';
  11126. path = path.replace(modeMatch[1], "");
  11127. }
  11128. }
  11129. fn[fn.length] = "return nodup(n);\n}";
  11130. eval(fn.join(""));
  11131. return f;
  11132. },
  11133. jsSelect: function(path, root, type){
  11134. root = root || document;
  11135. if(typeof root == "string"){
  11136. root = document.getElementById(root);
  11137. }
  11138. var paths = path.split(","),
  11139. results = [],
  11140. i, len, subPath, result;
  11141. for(i = 0, len = paths.length; i < len; i++){
  11142. subPath = paths[i].replace(trimRe, "");
  11143. if(!cache[subPath]){
  11144. cache[subPath] = Ext.DomQuery.compile(subPath, type);
  11145. if(!cache[subPath]){
  11146. Ext.Error.raise({
  11147. sourceClass: 'Ext.DomQuery',
  11148. sourceMethod: 'jsSelect',
  11149. msg: subPath + ' is not a valid selector'
  11150. });
  11151. }
  11152. } else {
  11153. setupEscapes(subPath);
  11154. }
  11155. result = cache[subPath](root);
  11156. if(result && result != document){
  11157. results = results.concat(result);
  11158. }
  11159. }
  11160. if(paths.length > 1){
  11161. return nodup(results);
  11162. }
  11163. return results;
  11164. },
  11165. isXml: function(el) {
  11166. var docEl = (el ? el.ownerDocument || el : 0).documentElement;
  11167. return docEl ? docEl.nodeName !== "HTML" : false;
  11168. },
  11169. select : document.querySelectorAll ? function(path, root, type) {
  11170. root = root || document;
  11171. if (!Ext.DomQuery.isXml(root)) {
  11172. try {
  11173. if (root.parentNode && (root.nodeType !== 9) && path.indexOf(',') === -1 && !startIdRe.test(path)) {
  11174. path = '#' + Ext.escapeId(Ext.id(root)) + ' ' + path;
  11175. root = root.parentNode;
  11176. }
  11177. return Ext.Array.toArray(root.querySelectorAll(path));
  11178. }
  11179. catch (e) {
  11180. }
  11181. }
  11182. return Ext.DomQuery.jsSelect.call(this, path, root, type);
  11183. } : function(path, root, type) {
  11184. return Ext.DomQuery.jsSelect.call(this, path, root, type);
  11185. },
  11186. selectNode : function(path, root){
  11187. return Ext.DomQuery.select(path, root)[0];
  11188. },
  11189. selectValue : function(path, root, defaultValue){
  11190. path = path.replace(trimRe, "");
  11191. if (!valueCache[path]) {
  11192. valueCache[path] = Ext.DomQuery.compile(path, "select");
  11193. } else {
  11194. setupEscapes(path);
  11195. }
  11196. var n = valueCache[path](root),
  11197. v;
  11198. n = n[0] ? n[0] : n;
  11199. if (typeof n.normalize == 'function') {
  11200. n.normalize();
  11201. }
  11202. v = (n && n.firstChild ? n.firstChild.nodeValue : null);
  11203. return ((v === null||v === undefined||v==='') ? defaultValue : v);
  11204. },
  11205. selectNumber : function(path, root, defaultValue){
  11206. var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
  11207. return parseFloat(v);
  11208. },
  11209. is : function(el, ss){
  11210. if(typeof el == "string"){
  11211. el = document.getElementById(el);
  11212. }
  11213. var isArray = Ext.isArray(el),
  11214. result = Ext.DomQuery.filter(isArray ? el : [el], ss);
  11215. return isArray ? (result.length == el.length) : (result.length > 0);
  11216. },
  11217. filter : function(els, ss, nonMatches){
  11218. ss = ss.replace(trimRe, "");
  11219. if (!simpleCache[ss]) {
  11220. simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");
  11221. } else {
  11222. setupEscapes(ss);
  11223. }
  11224. var result = simpleCache[ss](els);
  11225. return nonMatches ? quickDiff(result, els) : result;
  11226. },
  11227. matchers : [{
  11228. re: /^\.([\w\-\\]+)/,
  11229. select: 'n = byClassName(n, " {1} ");'
  11230. }, {
  11231. re: /^\:([\w\-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
  11232. select: 'n = byPseudo(n, "{1}", "{2}");'
  11233. },{
  11234. re: /^(?:([\[\{])(?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
  11235. select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
  11236. }, {
  11237. re: /^#([\w\-\\]+)/,
  11238. select: 'n = byId(n, "{1}");'
  11239. },{
  11240. re: /^@([\w\-]+)/,
  11241. select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
  11242. }
  11243. ],
  11244. operators : {
  11245. "=" : function(a, v){
  11246. return a == v;
  11247. },
  11248. "!=" : function(a, v){
  11249. return a != v;
  11250. },
  11251. "^=" : function(a, v){
  11252. return a && a.substr(0, v.length) == v;
  11253. },
  11254. "$=" : function(a, v){
  11255. return a && a.substr(a.length-v.length) == v;
  11256. },
  11257. "*=" : function(a, v){
  11258. return a && a.indexOf(v) !== -1;
  11259. },
  11260. "%=" : function(a, v){
  11261. return (a % v) == 0;
  11262. },
  11263. "|=" : function(a, v){
  11264. return a && (a == v || a.substr(0, v.length+1) == v+'-');
  11265. },
  11266. "~=" : function(a, v){
  11267. return a && (' '+a+' ').indexOf(' '+v+' ') != -1;
  11268. }
  11269. },
  11270. pseudos : {
  11271. "first-child" : function(c){
  11272. var r = [], ri = -1, n,
  11273. i, ci;
  11274. for(i = 0; (ci = n = c[i]); i++){
  11275. while((n = n.previousSibling) && n.nodeType != 1);
  11276. if(!n){
  11277. r[++ri] = ci;
  11278. }
  11279. }
  11280. return r;
  11281. },
  11282. "last-child" : function(c){
  11283. var r = [], ri = -1, n,
  11284. i, ci;
  11285. for(i = 0; (ci = n = c[i]); i++){
  11286. while((n = n.nextSibling) && n.nodeType != 1);
  11287. if(!n){
  11288. r[++ri] = ci;
  11289. }
  11290. }
  11291. return r;
  11292. },
  11293. "nth-child" : function(c, a) {
  11294. var r = [], ri = -1,
  11295. m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a),
  11296. f = (m[1] || 1) - 0, l = m[2] - 0,
  11297. i, n, j, cn, pn;
  11298. for(i = 0; n = c[i]; i++){
  11299. pn = n.parentNode;
  11300. if (batch != pn._batch) {
  11301. j = 0;
  11302. for(cn = pn.firstChild; cn; cn = cn.nextSibling){
  11303. if(cn.nodeType == 1){
  11304. cn.nodeIndex = ++j;
  11305. }
  11306. }
  11307. pn._batch = batch;
  11308. }
  11309. if (f == 1) {
  11310. if (l == 0 || n.nodeIndex == l){
  11311. r[++ri] = n;
  11312. }
  11313. } else if ((n.nodeIndex + l) % f == 0){
  11314. r[++ri] = n;
  11315. }
  11316. }
  11317. return r;
  11318. },
  11319. "only-child" : function(c){
  11320. var r = [], ri = -1,
  11321. i, ci;
  11322. for(i = 0; ci = c[i]; i++){
  11323. if(!prev(ci) && !next(ci)){
  11324. r[++ri] = ci;
  11325. }
  11326. }
  11327. return r;
  11328. },
  11329. "empty" : function(c){
  11330. var r = [], ri = -1,
  11331. i, ci, cns, j, cn, empty;
  11332. for(i = 0, ci; ci = c[i]; i++){
  11333. cns = ci.childNodes;
  11334. j = 0;
  11335. empty = true;
  11336. while(cn = cns[j]){
  11337. ++j;
  11338. if(cn.nodeType == 1 || cn.nodeType == 3){
  11339. empty = false;
  11340. break;
  11341. }
  11342. }
  11343. if(empty){
  11344. r[++ri] = ci;
  11345. }
  11346. }
  11347. return r;
  11348. },
  11349. "contains" : function(c, v){
  11350. var r = [], ri = -1,
  11351. i, ci;
  11352. for(i = 0; ci = c[i]; i++){
  11353. if((ci.textContent||ci.innerText||ci.text||'').indexOf(v) != -1){
  11354. r[++ri] = ci;
  11355. }
  11356. }
  11357. return r;
  11358. },
  11359. "nodeValue" : function(c, v){
  11360. var r = [], ri = -1,
  11361. i, ci;
  11362. for(i = 0; ci = c[i]; i++){
  11363. if(ci.firstChild && ci.firstChild.nodeValue == v){
  11364. r[++ri] = ci;
  11365. }
  11366. }
  11367. return r;
  11368. },
  11369. "checked" : function(c){
  11370. var r = [], ri = -1,
  11371. i, ci;
  11372. for(i = 0; ci = c[i]; i++){
  11373. if(ci.checked == true){
  11374. r[++ri] = ci;
  11375. }
  11376. }
  11377. return r;
  11378. },
  11379. "not" : function(c, ss){
  11380. return Ext.DomQuery.filter(c, ss, true);
  11381. },
  11382. "any" : function(c, selectors){
  11383. var ss = selectors.split('|'),
  11384. r = [], ri = -1, s,
  11385. i, ci, j;
  11386. for(i = 0; ci = c[i]; i++){
  11387. for(j = 0; s = ss[j]; j++){
  11388. if(Ext.DomQuery.is(ci, s)){
  11389. r[++ri] = ci;
  11390. break;
  11391. }
  11392. }
  11393. }
  11394. return r;
  11395. },
  11396. "odd" : function(c){
  11397. return this["nth-child"](c, "odd");
  11398. },
  11399. "even" : function(c){
  11400. return this["nth-child"](c, "even");
  11401. },
  11402. "nth" : function(c, a){
  11403. return c[a-1] || [];
  11404. },
  11405. "first" : function(c){
  11406. return c[0] || [];
  11407. },
  11408. "last" : function(c){
  11409. return c[c.length-1] || [];
  11410. },
  11411. "has" : function(c, ss){
  11412. var s = Ext.DomQuery.select,
  11413. r = [], ri = -1,
  11414. i, ci;
  11415. for(i = 0; ci = c[i]; i++){
  11416. if(s(ss, ci).length > 0){
  11417. r[++ri] = ci;
  11418. }
  11419. }
  11420. return r;
  11421. },
  11422. "next" : function(c, ss){
  11423. var is = Ext.DomQuery.is,
  11424. r = [], ri = -1,
  11425. i, ci, n;
  11426. for(i = 0; ci = c[i]; i++){
  11427. n = next(ci);
  11428. if(n && is(n, ss)){
  11429. r[++ri] = ci;
  11430. }
  11431. }
  11432. return r;
  11433. },
  11434. "prev" : function(c, ss){
  11435. var is = Ext.DomQuery.is,
  11436. r = [], ri = -1,
  11437. i, ci, n;
  11438. for(i = 0; ci = c[i]; i++){
  11439. n = prev(ci);
  11440. if(n && is(n, ss)){
  11441. r[++ri] = ci;
  11442. }
  11443. }
  11444. return r;
  11445. }
  11446. }
  11447. };
  11448. }());
  11449. Ext.query = Ext.DomQuery.select;
  11450. //@tag dom,core
  11451. //@require Query.js
  11452. //@define Ext.dom.Element
  11453. //@require Ext.dom.AbstractElement
  11454. (function() {
  11455. var HIDDEN = 'hidden',
  11456. DOC = document,
  11457. VISIBILITY = "visibility",
  11458. DISPLAY = "display",
  11459. NONE = "none",
  11460. XMASKED = Ext.baseCSSPrefix + "masked",
  11461. XMASKEDRELATIVE = Ext.baseCSSPrefix + "masked-relative",
  11462. EXTELMASKMSG = Ext.baseCSSPrefix + "mask-msg",
  11463. bodyRe = /^body/i,
  11464. visFly,
  11465. noBoxAdjust = Ext.isStrict ? {
  11466. select: 1
  11467. }: {
  11468. input: 1,
  11469. select: 1,
  11470. textarea: 1
  11471. },
  11472. isScrolled = function(c) {
  11473. var r = [], ri = -1,
  11474. i, ci;
  11475. for (i = 0; ci = c[i]; i++) {
  11476. if (ci.scrollTop > 0 || ci.scrollLeft > 0) {
  11477. r[++ri] = ci;
  11478. }
  11479. }
  11480. return r;
  11481. },
  11482. Element = Ext.define('Ext.dom.Element', {
  11483. extend: 'Ext.dom.AbstractElement',
  11484. alternateClassName: ['Ext.Element', 'Ext.core.Element'],
  11485. addUnits: function() {
  11486. return this.self.addUnits.apply(this.self, arguments);
  11487. },
  11488. focus: function(defer, dom) {
  11489. var me = this,
  11490. scrollTop,
  11491. body;
  11492. dom = dom || me.dom;
  11493. body = (dom.ownerDocument || DOC).body || DOC.body;
  11494. try {
  11495. if (Number(defer)) {
  11496. Ext.defer(me.focus, defer, me, [null, dom]);
  11497. } else {
  11498. if (dom.offsetHeight > Element.getViewHeight()) {
  11499. scrollTop = body.scrollTop;
  11500. }
  11501. dom.focus();
  11502. if (scrollTop !== undefined) {
  11503. body.scrollTop = scrollTop;
  11504. }
  11505. }
  11506. } catch(e) {
  11507. }
  11508. return me;
  11509. },
  11510. blur: function() {
  11511. try {
  11512. this.dom.blur();
  11513. } catch(e) {
  11514. }
  11515. return this;
  11516. },
  11517. isBorderBox: function() {
  11518. var box = Ext.isBorderBox;
  11519. if (box) {
  11520. box = !((this.dom.tagName || "").toLowerCase() in noBoxAdjust);
  11521. }
  11522. return box;
  11523. },
  11524. hover: function(overFn, outFn, scope, options) {
  11525. var me = this;
  11526. me.on('mouseenter', overFn, scope || me.dom, options);
  11527. me.on('mouseleave', outFn, scope || me.dom, options);
  11528. return me;
  11529. },
  11530. getAttributeNS: function(ns, name) {
  11531. return this.getAttribute(name, ns);
  11532. },
  11533. getAttribute: (Ext.isIE && !(Ext.isIE9 && DOC.documentMode === 9)) ?
  11534. function(name, ns) {
  11535. var d = this.dom,
  11536. type;
  11537. if (ns) {
  11538. type = typeof d[ns + ":" + name];
  11539. if (type != 'undefined' && type != 'unknown') {
  11540. return d[ns + ":" + name] || null;
  11541. }
  11542. return null;
  11543. }
  11544. if (name === "for") {
  11545. name = "htmlFor";
  11546. }
  11547. return d[name] || null;
  11548. } : function(name, ns) {
  11549. var d = this.dom;
  11550. if (ns) {
  11551. return d.getAttributeNS(ns, name) || d.getAttribute(ns + ":" + name);
  11552. }
  11553. return d.getAttribute(name) || d[name] || null;
  11554. },
  11555. cacheScrollValues: function() {
  11556. var me = this,
  11557. scrolledDescendants,
  11558. el, i,
  11559. scrollValues = [],
  11560. result = function() {
  11561. for (i = 0; i < scrolledDescendants.length; i++) {
  11562. el = scrolledDescendants[i];
  11563. el.scrollLeft = scrollValues[i][0];
  11564. el.scrollTop = scrollValues[i][1];
  11565. }
  11566. };
  11567. if (!Ext.DomQuery.pseudos.isScrolled) {
  11568. Ext.DomQuery.pseudos.isScrolled = isScrolled;
  11569. }
  11570. scrolledDescendants = me.query(':isScrolled');
  11571. for (i = 0; i < scrolledDescendants.length; i++) {
  11572. el = scrolledDescendants[i];
  11573. scrollValues[i] = [el.scrollLeft, el.scrollTop];
  11574. }
  11575. return result;
  11576. },
  11577. autoBoxAdjust: true,
  11578. isVisible : function(deep) {
  11579. var me = this,
  11580. dom = me.dom,
  11581. stopNode = dom.ownerDocument.documentElement;
  11582. if (!visFly) {
  11583. visFly = new Element.Fly();
  11584. }
  11585. while (dom !== stopNode) {
  11586. if (!dom || dom.nodeType === 11 || (visFly.attach(dom)).isStyle(VISIBILITY, HIDDEN) || visFly.isStyle(DISPLAY, NONE)) {
  11587. return false;
  11588. }
  11589. if (!deep) {
  11590. break;
  11591. }
  11592. dom = dom.parentNode;
  11593. }
  11594. return true;
  11595. },
  11596. isDisplayed : function() {
  11597. return !this.isStyle(DISPLAY, NONE);
  11598. },
  11599. enableDisplayMode : function(display) {
  11600. var me = this;
  11601. me.setVisibilityMode(Element.DISPLAY);
  11602. if (!Ext.isEmpty(display)) {
  11603. (me.$cache || me.getCache()).data.originalDisplay = display;
  11604. }
  11605. return me;
  11606. },
  11607. mask : function(msg, msgCls , elHeight) {
  11608. var me = this,
  11609. dom = me.dom,
  11610. setExpression = dom.style.setExpression,
  11611. data = (me.$cache || me.getCache()).data,
  11612. maskEl = data.maskEl,
  11613. maskMsg = data.maskMsg;
  11614. if (!(bodyRe.test(dom.tagName) && me.getStyle('position') == 'static')) {
  11615. me.addCls(XMASKEDRELATIVE);
  11616. }
  11617. if (maskEl) {
  11618. maskEl.remove();
  11619. }
  11620. if (maskMsg) {
  11621. maskMsg.remove();
  11622. }
  11623. Ext.DomHelper.append(dom, [{
  11624. cls : Ext.baseCSSPrefix + "mask"
  11625. }, {
  11626. cls : msgCls ? EXTELMASKMSG + " " + msgCls : EXTELMASKMSG,
  11627. cn : {
  11628. tag: 'div',
  11629. html: msg || ''
  11630. }
  11631. }]);
  11632. maskMsg = Ext.get(dom.lastChild);
  11633. maskEl = Ext.get(maskMsg.dom.previousSibling);
  11634. data.maskMsg = maskMsg;
  11635. data.maskEl = maskEl;
  11636. me.addCls(XMASKED);
  11637. maskEl.setDisplayed(true);
  11638. if (typeof msg == 'string') {
  11639. maskMsg.setDisplayed(true);
  11640. maskMsg.center(me);
  11641. } else {
  11642. maskMsg.setDisplayed(false);
  11643. }
  11644. if (!Ext.supports.IncludePaddingInWidthCalculation && setExpression) {
  11645. try {
  11646. maskEl.dom.style.setExpression('width', 'this.parentNode.clientWidth + "px"');
  11647. } catch (e) {}
  11648. }
  11649. if (!Ext.supports.IncludePaddingInHeightCalculation && setExpression) {
  11650. try {
  11651. maskEl.dom.style.setExpression('height', 'this.parentNode.' + (dom == DOC.body ? 'scrollHeight' : 'offsetHeight') + ' + "px"');
  11652. } catch (e) {}
  11653. }
  11654. else if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && me.getStyle('height') == 'auto') {
  11655. maskEl.setSize(undefined, elHeight || me.getHeight());
  11656. }
  11657. return maskEl;
  11658. },
  11659. unmask : function() {
  11660. var me = this,
  11661. data = (me.$cache || me.getCache()).data,
  11662. maskEl = data.maskEl,
  11663. maskMsg = data.maskMsg,
  11664. style;
  11665. if (maskEl) {
  11666. style = maskEl.dom.style;
  11667. if (style.clearExpression) {
  11668. style.clearExpression('width');
  11669. style.clearExpression('height');
  11670. }
  11671. if (maskEl) {
  11672. maskEl.remove();
  11673. delete data.maskEl;
  11674. }
  11675. if (maskMsg) {
  11676. maskMsg.remove();
  11677. delete data.maskMsg;
  11678. }
  11679. me.removeCls([XMASKED, XMASKEDRELATIVE]);
  11680. }
  11681. },
  11682. isMasked : function() {
  11683. var me = this,
  11684. data = (me.$cache || me.getCache()).data,
  11685. maskEl = data.maskEl,
  11686. maskMsg = data.maskMsg,
  11687. hasMask = false;
  11688. if (maskEl && maskEl.isVisible()) {
  11689. if (maskMsg) {
  11690. maskMsg.center(me);
  11691. }
  11692. hasMask = true;
  11693. }
  11694. return hasMask;
  11695. },
  11696. createShim : function() {
  11697. var el = DOC.createElement('iframe'),
  11698. shim;
  11699. el.frameBorder = '0';
  11700. el.className = Ext.baseCSSPrefix + 'shim';
  11701. el.src = Ext.SSL_SECURE_URL;
  11702. shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
  11703. shim.autoBoxAdjust = false;
  11704. return shim;
  11705. },
  11706. addKeyListener : function(key, fn, scope){
  11707. var config;
  11708. if(typeof key != 'object' || Ext.isArray(key)){
  11709. config = {
  11710. target: this,
  11711. key: key,
  11712. fn: fn,
  11713. scope: scope
  11714. };
  11715. }else{
  11716. config = {
  11717. target: this,
  11718. key : key.key,
  11719. shift : key.shift,
  11720. ctrl : key.ctrl,
  11721. alt : key.alt,
  11722. fn: fn,
  11723. scope: scope
  11724. };
  11725. }
  11726. return new Ext.util.KeyMap(config);
  11727. },
  11728. addKeyMap : function(config) {
  11729. return new Ext.util.KeyMap(Ext.apply({
  11730. target: this
  11731. }, config));
  11732. },
  11733. on: function(eventName, fn, scope, options) {
  11734. Ext.EventManager.on(this, eventName, fn, scope || this, options);
  11735. return this;
  11736. },
  11737. un: function(eventName, fn, scope) {
  11738. Ext.EventManager.un(this, eventName, fn, scope || this);
  11739. return this;
  11740. },
  11741. removeAllListeners: function() {
  11742. Ext.EventManager.removeAll(this);
  11743. return this;
  11744. },
  11745. purgeAllListeners: function() {
  11746. Ext.EventManager.purgeElement(this);
  11747. return this;
  11748. }
  11749. }, function() {
  11750. var EC = Ext.cache,
  11751. El = this,
  11752. AbstractElement = Ext.dom.AbstractElement,
  11753. focusRe = /a|button|embed|iframe|img|input|object|select|textarea/i,
  11754. nonSpaceRe = /\S/,
  11755. scriptTagRe = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,
  11756. replaceScriptTagRe = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
  11757. srcRe = /\ssrc=([\'\"])(.*?)\1/i,
  11758. typeRe = /\stype=([\'\"])(.*?)\1/i,
  11759. useDocForId = !(Ext.isIE6 || Ext.isIE7 || Ext.isIE8);
  11760. El.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
  11761. function garbageCollect() {
  11762. if (!Ext.enableGarbageCollector) {
  11763. clearInterval(El.collectorThreadId);
  11764. } else {
  11765. var eid,
  11766. d,
  11767. o,
  11768. t;
  11769. for (eid in EC) {
  11770. if (!EC.hasOwnProperty(eid)) {
  11771. continue;
  11772. }
  11773. o = EC[eid];
  11774. if (o.skipGarbageCollection) {
  11775. continue;
  11776. }
  11777. d = o.dom;
  11778. if (!d.parentNode || (!d.offsetParent && !Ext.getElementById(eid))) {
  11779. if (d && Ext.enableListenerCollection) {
  11780. Ext.EventManager.removeAll(d);
  11781. }
  11782. delete EC[eid];
  11783. }
  11784. }
  11785. if (Ext.isIE) {
  11786. t = {};
  11787. for (eid in EC) {
  11788. if (!EC.hasOwnProperty(eid)) {
  11789. continue;
  11790. }
  11791. t[eid] = EC[eid];
  11792. }
  11793. EC = Ext.cache = t;
  11794. }
  11795. }
  11796. }
  11797. El.collectorThreadId = setInterval(garbageCollect, 30000);
  11798. El.addMethods({
  11799. monitorMouseLeave: function(delay, handler, scope) {
  11800. var me = this,
  11801. timer,
  11802. listeners = {
  11803. mouseleave: function(e) {
  11804. timer = setTimeout(Ext.Function.bind(handler, scope||me, [e]), delay);
  11805. },
  11806. mouseenter: function() {
  11807. clearTimeout(timer);
  11808. },
  11809. freezeEvent: true
  11810. };
  11811. me.on(listeners);
  11812. return listeners;
  11813. },
  11814. swallowEvent : function(eventName, preventDefault) {
  11815. var me = this,
  11816. e, eLen;
  11817. function fn(e) {
  11818. e.stopPropagation();
  11819. if (preventDefault) {
  11820. e.preventDefault();
  11821. }
  11822. }
  11823. if (Ext.isArray(eventName)) {
  11824. eLen = eventName.length;
  11825. for (e = 0; e < eLen; e++) {
  11826. me.on(eventName[e], fn);
  11827. }
  11828. return me;
  11829. }
  11830. me.on(eventName, fn);
  11831. return me;
  11832. },
  11833. relayEvent : function(eventName, observable) {
  11834. this.on(eventName, function(e) {
  11835. observable.fireEvent(eventName, e);
  11836. });
  11837. },
  11838. clean : function(forceReclean) {
  11839. var me = this,
  11840. dom = me.dom,
  11841. data = (me.$cache || me.getCache()).data,
  11842. n = dom.firstChild,
  11843. ni = -1,
  11844. nx;
  11845. if (data.isCleaned && forceReclean !== true) {
  11846. return me;
  11847. }
  11848. while (n) {
  11849. nx = n.nextSibling;
  11850. if (n.nodeType == 3) {
  11851. if (!(nonSpaceRe.test(n.nodeValue))) {
  11852. dom.removeChild(n);
  11853. } else if (nx && nx.nodeType == 3) {
  11854. n.appendData(Ext.String.trim(nx.data));
  11855. dom.removeChild(nx);
  11856. nx = n.nextSibling;
  11857. n.nodeIndex = ++ni;
  11858. }
  11859. } else {
  11860. Ext.fly(n).clean();
  11861. n.nodeIndex = ++ni;
  11862. }
  11863. n = nx;
  11864. }
  11865. data.isCleaned = true;
  11866. return me;
  11867. },
  11868. load : function(options) {
  11869. this.getLoader().load(options);
  11870. return this;
  11871. },
  11872. getLoader : function() {
  11873. var me = this,
  11874. data = (me.$cache || me.getCache()).data,
  11875. loader = data.loader;
  11876. if (!loader) {
  11877. data.loader = loader = new Ext.ElementLoader({
  11878. target: me
  11879. });
  11880. }
  11881. return loader;
  11882. },
  11883. syncContent: function(source) {
  11884. source = Ext.getDom(source);
  11885. var me = this,
  11886. sourceNodes = source.childNodes,
  11887. sourceLen = sourceNodes.length,
  11888. dest = me.dom,
  11889. destNodes = dest.childNodes,
  11890. destLen = destNodes.length,
  11891. i, destNode, sourceNode,
  11892. nodeType;
  11893. dest.style.cssText = source.style.cssText;
  11894. dest.className = source.className;
  11895. if (sourceLen !== destLen) {
  11896. source.innerHTML = dest.innerHTML;
  11897. return;
  11898. }
  11899. for (i = 0; i < sourceLen; i++) {
  11900. sourceNode = sourceNodes[i];
  11901. destNode = destNodes[i];
  11902. nodeType = sourceNode.nodeType;
  11903. if (nodeType !== destNode.nodeType || (nodeType === 1 && sourceNode.tagName !== destNode.tagName)) {
  11904. dest.innerHTML = source.innerHTML;
  11905. return;
  11906. }
  11907. if (nodeType === 3) {
  11908. destNode.data = sourceNode.data;
  11909. }
  11910. else {
  11911. if (sourceNode.id && destNode.id !== sourceNode.id) {
  11912. destNode.id = sourceNode.id;
  11913. }
  11914. destNode.style.cssText = sourceNode.style.cssText;
  11915. destNode.className = sourceNode.className;
  11916. Ext.fly(destNode).syncContent(sourceNode);
  11917. }
  11918. }
  11919. },
  11920. update : function(html, loadScripts, callback) {
  11921. var me = this,
  11922. id,
  11923. dom,
  11924. interval;
  11925. if (!me.dom) {
  11926. return me;
  11927. }
  11928. html = html || '';
  11929. dom = me.dom;
  11930. if (loadScripts !== true) {
  11931. dom.innerHTML = html;
  11932. Ext.callback(callback, me);
  11933. return me;
  11934. }
  11935. id = Ext.id();
  11936. html += '<span id="' + id + '"></span>';
  11937. interval = setInterval(function() {
  11938. var hd,
  11939. match,
  11940. attrs,
  11941. srcMatch,
  11942. typeMatch,
  11943. el,
  11944. s;
  11945. if (!(el = DOC.getElementById(id))) {
  11946. return false;
  11947. }
  11948. clearInterval(interval);
  11949. Ext.removeNode(el);
  11950. hd = Ext.getHead().dom;
  11951. while ((match = scriptTagRe.exec(html))) {
  11952. attrs = match[1];
  11953. srcMatch = attrs ? attrs.match(srcRe) : false;
  11954. if (srcMatch && srcMatch[2]) {
  11955. s = DOC.createElement("script");
  11956. s.src = srcMatch[2];
  11957. typeMatch = attrs.match(typeRe);
  11958. if (typeMatch && typeMatch[2]) {
  11959. s.type = typeMatch[2];
  11960. }
  11961. hd.appendChild(s);
  11962. } else if (match[2] && match[2].length > 0) {
  11963. if (window.execScript) {
  11964. window.execScript(match[2]);
  11965. } else {
  11966. window.eval(match[2]);
  11967. }
  11968. }
  11969. }
  11970. Ext.callback(callback, me);
  11971. }, 20);
  11972. dom.innerHTML = html.replace(replaceScriptTagRe, '');
  11973. return me;
  11974. },
  11975. removeAllListeners : function() {
  11976. this.removeAnchor();
  11977. Ext.EventManager.removeAll(this.dom);
  11978. return this;
  11979. },
  11980. createProxy : function(config, renderTo, matchBox) {
  11981. config = (typeof config == 'object') ? config : {tag : "div", cls: config};
  11982. var me = this,
  11983. proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) :
  11984. Ext.DomHelper.insertBefore(me.dom, config, true);
  11985. proxy.setVisibilityMode(Element.DISPLAY);
  11986. proxy.hide();
  11987. if (matchBox && me.setBox && me.getBox) {
  11988. proxy.setBox(me.getBox());
  11989. }
  11990. return proxy;
  11991. },
  11992. getScopeParent: function() {
  11993. var parent = this.dom.parentNode;
  11994. if (Ext.scopeResetCSS) {
  11995. parent = parent.parentNode;
  11996. if (!Ext.supports.CSS3LinearGradient || !Ext.supports.CSS3BorderRadius) {
  11997. parent = parent.parentNode;
  11998. }
  11999. }
  12000. return parent;
  12001. },
  12002. needsTabIndex: function() {
  12003. if (this.dom) {
  12004. if ((this.dom.nodeName === 'a') && (!this.dom.href)) {
  12005. return true;
  12006. }
  12007. return !focusRe.test(this.dom.nodeName);
  12008. }
  12009. },
  12010. focusable: function () {
  12011. var dom = this.dom,
  12012. nodeName = dom.nodeName,
  12013. canFocus = false;
  12014. if (!dom.disabled) {
  12015. if (focusRe.test(nodeName)) {
  12016. if ((nodeName !== 'a') || dom.href) {
  12017. canFocus = true;
  12018. }
  12019. } else {
  12020. canFocus = !isNaN(dom.tabIndex);
  12021. }
  12022. }
  12023. return canFocus && this.isVisible(true);
  12024. }
  12025. });
  12026. if (Ext.isIE) {
  12027. El.prototype.getById = function (id, asDom) {
  12028. var dom = this.dom,
  12029. cacheItem, el, ret;
  12030. if (dom) {
  12031. el = (useDocForId && DOC.getElementById(id)) || dom.all[id];
  12032. if (el) {
  12033. if (asDom) {
  12034. ret = el;
  12035. } else {
  12036. cacheItem = EC[id];
  12037. if (cacheItem && cacheItem.el) {
  12038. ret = Ext.updateCacheEntry(cacheItem, el).el;
  12039. } else {
  12040. ret = new Element(el);
  12041. }
  12042. }
  12043. return ret;
  12044. }
  12045. }
  12046. return asDom ? Ext.getDom(id) : El.get(id);
  12047. };
  12048. }
  12049. El.createAlias({
  12050. addListener: 'on',
  12051. removeListener: 'un',
  12052. clearListeners: 'removeAllListeners'
  12053. });
  12054. El.Fly = AbstractElement.Fly = new Ext.Class({
  12055. extend: El,
  12056. constructor: function(dom) {
  12057. this.dom = dom;
  12058. },
  12059. attach: AbstractElement.Fly.prototype.attach
  12060. });
  12061. if (Ext.isIE) {
  12062. Ext.getElementById = function (id) {
  12063. var el = DOC.getElementById(id),
  12064. detachedBodyEl;
  12065. if (!el && (detachedBodyEl = AbstractElement.detachedBodyEl)) {
  12066. el = detachedBodyEl.dom.all[id];
  12067. }
  12068. return el;
  12069. };
  12070. } else if (!DOC.querySelector) {
  12071. Ext.getDetachedBody = Ext.getBody;
  12072. Ext.getElementById = function (id) {
  12073. return DOC.getElementById(id);
  12074. };
  12075. }
  12076. });
  12077. }());
  12078. //@tag dom,core
  12079. //@require Element.js
  12080. //@define Ext.dom.Element-alignment
  12081. //@define Ext.dom.Element
  12082. Ext.dom.Element.override((function() {
  12083. var doc = document,
  12084. win = window,
  12085. alignRe = /^([a-z]+)-([a-z]+)(\?)?$/,
  12086. round = Math.round;
  12087. return {
  12088. getAnchorXY: function(anchor, local, mySize) {
  12089. anchor = (anchor || "tl").toLowerCase();
  12090. mySize = mySize || {};
  12091. var me = this,
  12092. isViewport = me.dom == doc.body || me.dom == doc,
  12093. myWidth = mySize.width || isViewport ? Ext.dom.Element.getViewWidth() : me.getWidth(),
  12094. myHeight = mySize.height || isViewport ? Ext.dom.Element.getViewHeight() : me.getHeight(),
  12095. xy,
  12096. myPos = me.getXY(),
  12097. scroll = me.getScroll(),
  12098. extraX = isViewport ? scroll.left : !local ? myPos[0] : 0,
  12099. extraY = isViewport ? scroll.top : !local ? myPos[1] : 0;
  12100. switch (anchor) {
  12101. case 'tl' : xy = [ 0, 0];
  12102. break;
  12103. case 'bl' : xy = [ 0, myHeight];
  12104. break;
  12105. case 'tr' : xy = [ myWidth, 0];
  12106. break;
  12107. case 'c' : xy = [ round(myWidth * 0.5), round(myHeight * 0.5)];
  12108. break;
  12109. case 't' : xy = [ round(myWidth * 0.5), 0];
  12110. break;
  12111. case 'l' : xy = [ 0, round(myHeight * 0.5)];
  12112. break;
  12113. case 'r' : xy = [ myWidth, round(myHeight * 0.5)];
  12114. break;
  12115. case 'b' : xy = [ round(myWidth * 0.5), myHeight];
  12116. break;
  12117. case 'br' : xy = [ myWidth, myHeight];
  12118. }
  12119. return [xy[0] + extraX, xy[1] + extraY];
  12120. },
  12121. getAlignToXY : function(alignToEl, posSpec, offset) {
  12122. alignToEl = Ext.get(alignToEl);
  12123. if (!alignToEl || !alignToEl.dom) {
  12124. }
  12125. offset = offset || [0,0];
  12126. posSpec = (!posSpec || posSpec == "?" ? "tl-bl?" : (!(/-/).test(posSpec) && posSpec !== "" ? "tl-" + posSpec : posSpec || "tl-bl")).toLowerCase();
  12127. var me = this,
  12128. myPosition,
  12129. alignToElPosition,
  12130. x,
  12131. y,
  12132. myWidth,
  12133. myHeight,
  12134. alignToElRegion,
  12135. viewportWidth = Ext.dom.Element.getViewWidth() - 10,
  12136. viewportHeight = Ext.dom.Element.getViewHeight() - 10,
  12137. p1y,
  12138. p1x,
  12139. p2y,
  12140. p2x,
  12141. swapY,
  12142. swapX,
  12143. docElement = doc.documentElement,
  12144. docBody = doc.body,
  12145. scrollX = (docElement.scrollLeft || docBody.scrollLeft || 0),
  12146. scrollY = (docElement.scrollTop || docBody.scrollTop || 0),
  12147. constrain,
  12148. align1,
  12149. align2,
  12150. alignMatch = posSpec.match(alignRe);
  12151. align1 = alignMatch[1];
  12152. align2 = alignMatch[2];
  12153. constrain = !!alignMatch[3];
  12154. myPosition = me.getAnchorXY(align1, true);
  12155. alignToElPosition = alignToEl.getAnchorXY(align2, false);
  12156. x = alignToElPosition[0] - myPosition[0] + offset[0];
  12157. y = alignToElPosition[1] - myPosition[1] + offset[1];
  12158. if (constrain) {
  12159. myWidth = me.getWidth();
  12160. myHeight = me.getHeight();
  12161. alignToElRegion = alignToEl.getRegion();
  12162. p1y = align1.charAt(0);
  12163. p1x = align1.charAt(align1.length - 1);
  12164. p2y = align2.charAt(0);
  12165. p2x = align2.charAt(align2.length - 1);
  12166. swapY = ((p1y == "t" && p2y == "b") || (p1y == "b" && p2y == "t"));
  12167. swapX = ((p1x == "r" && p2x == "l") || (p1x == "l" && p2x == "r"));
  12168. if (x + myWidth > viewportWidth + scrollX) {
  12169. x = swapX ? alignToElRegion.left - myWidth : viewportWidth + scrollX - myWidth;
  12170. }
  12171. if (x < scrollX) {
  12172. x = swapX ? alignToElRegion.right : scrollX;
  12173. }
  12174. if (y + myHeight > viewportHeight + scrollY) {
  12175. y = swapY ? alignToElRegion.top - myHeight : viewportHeight + scrollY - myHeight;
  12176. }
  12177. if (y < scrollY) {
  12178. y = swapY ? alignToElRegion.bottom : scrollY;
  12179. }
  12180. }
  12181. return [x,y];
  12182. },
  12183. anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback) {
  12184. var me = this,
  12185. dom = me.dom,
  12186. scroll = !Ext.isEmpty(monitorScroll),
  12187. action = function() {
  12188. Ext.fly(dom).alignTo(el, alignment, offsets, animate);
  12189. Ext.callback(callback, Ext.fly(dom));
  12190. },
  12191. anchor = this.getAnchor();
  12192. this.removeAnchor();
  12193. Ext.apply(anchor, {
  12194. fn: action,
  12195. scroll: scroll
  12196. });
  12197. Ext.EventManager.onWindowResize(action, null);
  12198. if (scroll) {
  12199. Ext.EventManager.on(win, 'scroll', action, null,
  12200. {buffer: !isNaN(monitorScroll) ? monitorScroll : 50});
  12201. }
  12202. action.call(me);
  12203. return me;
  12204. },
  12205. removeAnchor : function() {
  12206. var me = this,
  12207. anchor = this.getAnchor();
  12208. if (anchor && anchor.fn) {
  12209. Ext.EventManager.removeResizeListener(anchor.fn);
  12210. if (anchor.scroll) {
  12211. Ext.EventManager.un(win, 'scroll', anchor.fn);
  12212. }
  12213. delete anchor.fn;
  12214. }
  12215. return me;
  12216. },
  12217. getAlignVector: function(el, spec, offset) {
  12218. var me = this,
  12219. myPos = me.getXY(),
  12220. alignedPos = me.getAlignToXY(el, spec, offset);
  12221. el = Ext.get(el);
  12222. alignedPos[0] -= myPos[0];
  12223. alignedPos[1] -= myPos[1];
  12224. return alignedPos;
  12225. },
  12226. alignTo: function(element, position, offsets, animate) {
  12227. var me = this;
  12228. return me.setXY(me.getAlignToXY(element, position, offsets),
  12229. me.anim && !!animate ? me.anim(animate) : false);
  12230. },
  12231. getConstrainVector: function(constrainTo, proposedPosition) {
  12232. if (!(constrainTo instanceof Ext.util.Region)) {
  12233. constrainTo = Ext.get(constrainTo).getViewRegion();
  12234. }
  12235. var thisRegion = this.getRegion(),
  12236. vector = [0, 0],
  12237. shadowSize = (this.shadow && !this.shadowDisabled) ? this.shadow.getShadowSize() : undefined,
  12238. overflowed = false;
  12239. if (proposedPosition) {
  12240. thisRegion.translateBy(proposedPosition[0] - thisRegion.x, proposedPosition[1] - thisRegion.y);
  12241. }
  12242. if (shadowSize) {
  12243. constrainTo.adjust(shadowSize[0], -shadowSize[1], -shadowSize[2], shadowSize[3]);
  12244. }
  12245. if (thisRegion.right > constrainTo.right) {
  12246. overflowed = true;
  12247. vector[0] = (constrainTo.right - thisRegion.right);
  12248. }
  12249. if (thisRegion.left + vector[0] < constrainTo.left) {
  12250. overflowed = true;
  12251. vector[0] = (constrainTo.left - thisRegion.left);
  12252. }
  12253. if (thisRegion.bottom > constrainTo.bottom) {
  12254. overflowed = true;
  12255. vector[1] = (constrainTo.bottom - thisRegion.bottom);
  12256. }
  12257. if (thisRegion.top + vector[1] < constrainTo.top) {
  12258. overflowed = true;
  12259. vector[1] = (constrainTo.top - thisRegion.top);
  12260. }
  12261. return overflowed ? vector : false;
  12262. },
  12263. getCenterXY : function(){
  12264. return this.getAlignToXY(doc, 'c-c');
  12265. },
  12266. center : function(centerIn){
  12267. return this.alignTo(centerIn || doc, 'c-c');
  12268. }
  12269. };
  12270. }()));
  12271. //@tag dom,core
  12272. //@require Ext.dom.Element-alignment
  12273. //@define Ext.dom.Element-anim
  12274. //@define Ext.dom.Element
  12275. Ext.dom.Element.override({
  12276. animate: function(config) {
  12277. var me = this,
  12278. listeners,
  12279. anim,
  12280. animId = me.dom.id || Ext.id(me.dom);
  12281. if (!Ext.fx.Manager.hasFxBlock(animId)) {
  12282. if (config.listeners) {
  12283. listeners = config.listeners;
  12284. delete config.listeners;
  12285. }
  12286. if (config.internalListeners) {
  12287. config.listeners = config.internalListeners;
  12288. delete config.internalListeners;
  12289. }
  12290. anim = new Ext.fx.Anim(me.anim(config));
  12291. if (listeners) {
  12292. anim.on(listeners);
  12293. }
  12294. Ext.fx.Manager.queueFx(anim);
  12295. }
  12296. return me;
  12297. },
  12298. anim: function(config) {
  12299. if (!Ext.isObject(config)) {
  12300. return (config) ? {} : false;
  12301. }
  12302. var me = this,
  12303. duration = config.duration || Ext.fx.Anim.prototype.duration,
  12304. easing = config.easing || 'ease',
  12305. animConfig;
  12306. if (config.stopAnimation) {
  12307. me.stopAnimation();
  12308. }
  12309. Ext.applyIf(config, Ext.fx.Manager.getFxDefaults(me.id));
  12310. Ext.fx.Manager.setFxDefaults(me.id, {
  12311. delay: 0
  12312. });
  12313. animConfig = {
  12314. target: me.dom,
  12315. remove: config.remove,
  12316. alternate: config.alternate || false,
  12317. duration: duration,
  12318. easing: easing,
  12319. callback: config.callback,
  12320. listeners: config.listeners,
  12321. iterations: config.iterations || 1,
  12322. scope: config.scope,
  12323. block: config.block,
  12324. concurrent: config.concurrent,
  12325. delay: config.delay || 0,
  12326. paused: true,
  12327. keyframes: config.keyframes,
  12328. from: config.from || {},
  12329. to: Ext.apply({}, config)
  12330. };
  12331. Ext.apply(animConfig.to, config.to);
  12332. delete animConfig.to.to;
  12333. delete animConfig.to.from;
  12334. delete animConfig.to.remove;
  12335. delete animConfig.to.alternate;
  12336. delete animConfig.to.keyframes;
  12337. delete animConfig.to.iterations;
  12338. delete animConfig.to.listeners;
  12339. delete animConfig.to.target;
  12340. delete animConfig.to.paused;
  12341. delete animConfig.to.callback;
  12342. delete animConfig.to.scope;
  12343. delete animConfig.to.duration;
  12344. delete animConfig.to.easing;
  12345. delete animConfig.to.concurrent;
  12346. delete animConfig.to.block;
  12347. delete animConfig.to.stopAnimation;
  12348. delete animConfig.to.delay;
  12349. return animConfig;
  12350. },
  12351. slideIn: function(anchor, obj, slideOut) {
  12352. var me = this,
  12353. elStyle = me.dom.style,
  12354. beforeAnim,
  12355. wrapAnim,
  12356. restoreScroll,
  12357. wrapDomParentNode;
  12358. anchor = anchor || "t";
  12359. obj = obj || {};
  12360. beforeAnim = function() {
  12361. var animScope = this,
  12362. listeners = obj.listeners,
  12363. box, originalStyles, anim, wrap;
  12364. if (!slideOut) {
  12365. me.fixDisplay();
  12366. }
  12367. box = me.getBox();
  12368. if ((anchor == 't' || anchor == 'b') && box.height === 0) {
  12369. box.height = me.dom.scrollHeight;
  12370. }
  12371. else if ((anchor == 'l' || anchor == 'r') && box.width === 0) {
  12372. box.width = me.dom.scrollWidth;
  12373. }
  12374. originalStyles = me.getStyles('width', 'height', 'left', 'right', 'top', 'bottom', 'position', 'z-index', true);
  12375. me.setSize(box.width, box.height);
  12376. if (obj.preserveScroll) {
  12377. restoreScroll = me.cacheScrollValues();
  12378. }
  12379. wrap = me.wrap({
  12380. id: Ext.id() + '-anim-wrap-for-' + me.id,
  12381. style: {
  12382. visibility: slideOut ? 'visible' : 'hidden'
  12383. }
  12384. });
  12385. wrapDomParentNode = wrap.dom.parentNode;
  12386. wrap.setPositioning(me.getPositioning());
  12387. if (wrap.isStyle('position', 'static')) {
  12388. wrap.position('relative');
  12389. }
  12390. me.clearPositioning('auto');
  12391. wrap.clip();
  12392. if (restoreScroll) {
  12393. restoreScroll();
  12394. }
  12395. me.setStyle({
  12396. visibility: '',
  12397. position: 'absolute'
  12398. });
  12399. if (slideOut) {
  12400. wrap.setSize(box.width, box.height);
  12401. }
  12402. switch (anchor) {
  12403. case 't':
  12404. anim = {
  12405. from: {
  12406. width: box.width + 'px',
  12407. height: '0px'
  12408. },
  12409. to: {
  12410. width: box.width + 'px',
  12411. height: box.height + 'px'
  12412. }
  12413. };
  12414. elStyle.bottom = '0px';
  12415. break;
  12416. case 'l':
  12417. anim = {
  12418. from: {
  12419. width: '0px',
  12420. height: box.height + 'px'
  12421. },
  12422. to: {
  12423. width: box.width + 'px',
  12424. height: box.height + 'px'
  12425. }
  12426. };
  12427. elStyle.right = '0px';
  12428. break;
  12429. case 'r':
  12430. anim = {
  12431. from: {
  12432. x: box.x + box.width,
  12433. width: '0px',
  12434. height: box.height + 'px'
  12435. },
  12436. to: {
  12437. x: box.x,
  12438. width: box.width + 'px',
  12439. height: box.height + 'px'
  12440. }
  12441. };
  12442. break;
  12443. case 'b':
  12444. anim = {
  12445. from: {
  12446. y: box.y + box.height,
  12447. width: box.width + 'px',
  12448. height: '0px'
  12449. },
  12450. to: {
  12451. y: box.y,
  12452. width: box.width + 'px',
  12453. height: box.height + 'px'
  12454. }
  12455. };
  12456. break;
  12457. case 'tl':
  12458. anim = {
  12459. from: {
  12460. x: box.x,
  12461. y: box.y,
  12462. width: '0px',
  12463. height: '0px'
  12464. },
  12465. to: {
  12466. width: box.width + 'px',
  12467. height: box.height + 'px'
  12468. }
  12469. };
  12470. elStyle.bottom = '0px';
  12471. elStyle.right = '0px';
  12472. break;
  12473. case 'bl':
  12474. anim = {
  12475. from: {
  12476. y: box.y + box.height,
  12477. width: '0px',
  12478. height: '0px'
  12479. },
  12480. to: {
  12481. y: box.y,
  12482. width: box.width + 'px',
  12483. height: box.height + 'px'
  12484. }
  12485. };
  12486. elStyle.bottom = '0px';
  12487. break;
  12488. case 'br':
  12489. anim = {
  12490. from: {
  12491. x: box.x + box.width,
  12492. y: box.y + box.height,
  12493. width: '0px',
  12494. height: '0px'
  12495. },
  12496. to: {
  12497. x: box.x,
  12498. y: box.y,
  12499. width: box.width + 'px',
  12500. height: box.height + 'px'
  12501. }
  12502. };
  12503. break;
  12504. case 'tr':
  12505. anim = {
  12506. from: {
  12507. x: box.x + box.width,
  12508. width: '0px',
  12509. height: '0px'
  12510. },
  12511. to: {
  12512. x: box.x,
  12513. width: box.width + 'px',
  12514. height: box.height + 'px'
  12515. }
  12516. };
  12517. elStyle.right = '0px';
  12518. break;
  12519. }
  12520. wrap.show();
  12521. wrapAnim = Ext.apply({}, obj);
  12522. delete wrapAnim.listeners;
  12523. wrapAnim = new Ext.fx.Anim(Ext.applyIf(wrapAnim, {
  12524. target: wrap,
  12525. duration: 500,
  12526. easing: 'ease-out',
  12527. from: slideOut ? anim.to : anim.from,
  12528. to: slideOut ? anim.from : anim.to
  12529. }));
  12530. wrapAnim.on('afteranimate', function() {
  12531. me.setStyle(originalStyles);
  12532. if (slideOut) {
  12533. if (obj.useDisplay) {
  12534. me.setDisplayed(false);
  12535. } else {
  12536. me.hide();
  12537. }
  12538. }
  12539. if (wrap.dom) {
  12540. if (wrap.dom.parentNode) {
  12541. wrap.dom.parentNode.insertBefore(me.dom, wrap.dom);
  12542. } else {
  12543. wrapDomParentNode.appendChild(me.dom);
  12544. }
  12545. wrap.remove();
  12546. }
  12547. if (restoreScroll) {
  12548. restoreScroll();
  12549. }
  12550. animScope.end();
  12551. });
  12552. if (listeners) {
  12553. wrapAnim.on(listeners);
  12554. }
  12555. };
  12556. me.animate({
  12557. duration: obj.duration ? Math.max(obj.duration, 500) * 2 : 1000,
  12558. listeners: {
  12559. beforeanimate: beforeAnim
  12560. }
  12561. });
  12562. return me;
  12563. },
  12564. slideOut: function(anchor, o) {
  12565. return this.slideIn(anchor, o, true);
  12566. },
  12567. puff: function(obj) {
  12568. var me = this,
  12569. beforeAnim,
  12570. box = me.getBox(),
  12571. originalStyles = me.getStyles('width', 'height', 'left', 'right', 'top', 'bottom', 'position', 'z-index', 'font-size', 'opacity', true);
  12572. obj = Ext.applyIf(obj || {}, {
  12573. easing: 'ease-out',
  12574. duration: 500,
  12575. useDisplay: false
  12576. });
  12577. beforeAnim = function() {
  12578. me.clearOpacity();
  12579. me.show();
  12580. this.to = {
  12581. width: box.width * 2,
  12582. height: box.height * 2,
  12583. x: box.x - (box.width / 2),
  12584. y: box.y - (box.height /2),
  12585. opacity: 0,
  12586. fontSize: '200%'
  12587. };
  12588. this.on('afteranimate',function() {
  12589. if (me.dom) {
  12590. if (obj.useDisplay) {
  12591. me.setDisplayed(false);
  12592. } else {
  12593. me.hide();
  12594. }
  12595. me.setStyle(originalStyles);
  12596. obj.callback.call(obj.scope);
  12597. }
  12598. });
  12599. };
  12600. me.animate({
  12601. duration: obj.duration,
  12602. easing: obj.easing,
  12603. listeners: {
  12604. beforeanimate: {
  12605. fn: beforeAnim
  12606. }
  12607. }
  12608. });
  12609. return me;
  12610. },
  12611. switchOff: function(obj) {
  12612. var me = this,
  12613. beforeAnim;
  12614. obj = Ext.applyIf(obj || {}, {
  12615. easing: 'ease-in',
  12616. duration: 500,
  12617. remove: false,
  12618. useDisplay: false
  12619. });
  12620. beforeAnim = function() {
  12621. var animScope = this,
  12622. size = me.getSize(),
  12623. xy = me.getXY(),
  12624. keyframe, position;
  12625. me.clearOpacity();
  12626. me.clip();
  12627. position = me.getPositioning();
  12628. keyframe = new Ext.fx.Animator({
  12629. target: me,
  12630. duration: obj.duration,
  12631. easing: obj.easing,
  12632. keyframes: {
  12633. 33: {
  12634. opacity: 0.3
  12635. },
  12636. 66: {
  12637. height: 1,
  12638. y: xy[1] + size.height / 2
  12639. },
  12640. 100: {
  12641. width: 1,
  12642. x: xy[0] + size.width / 2
  12643. }
  12644. }
  12645. });
  12646. keyframe.on('afteranimate', function() {
  12647. if (obj.useDisplay) {
  12648. me.setDisplayed(false);
  12649. } else {
  12650. me.hide();
  12651. }
  12652. me.clearOpacity();
  12653. me.setPositioning(position);
  12654. me.setSize(size);
  12655. animScope.end();
  12656. });
  12657. };
  12658. me.animate({
  12659. duration: (Math.max(obj.duration, 500) * 2),
  12660. listeners: {
  12661. beforeanimate: {
  12662. fn: beforeAnim
  12663. }
  12664. }
  12665. });
  12666. return me;
  12667. },
  12668. frame : function(color, count, obj){
  12669. var me = this,
  12670. beforeAnim;
  12671. color = color || '#C3DAF9';
  12672. count = count || 1;
  12673. obj = obj || {};
  12674. beforeAnim = function() {
  12675. me.show();
  12676. var animScope = this,
  12677. box = me.getBox(),
  12678. proxy = Ext.getBody().createChild({
  12679. id: me.id + '-anim-proxy',
  12680. style: {
  12681. position : 'absolute',
  12682. 'pointer-events': 'none',
  12683. 'z-index': 35000,
  12684. border : '0px solid ' + color
  12685. }
  12686. }),
  12687. proxyAnim;
  12688. proxyAnim = new Ext.fx.Anim({
  12689. target: proxy,
  12690. duration: obj.duration || 1000,
  12691. iterations: count,
  12692. from: {
  12693. top: box.y,
  12694. left: box.x,
  12695. borderWidth: 0,
  12696. opacity: 1,
  12697. height: box.height,
  12698. width: box.width
  12699. },
  12700. to: {
  12701. top: box.y - 20,
  12702. left: box.x - 20,
  12703. borderWidth: 10,
  12704. opacity: 0,
  12705. height: box.height + 40,
  12706. width: box.width + 40
  12707. }
  12708. });
  12709. proxyAnim.on('afteranimate', function() {
  12710. proxy.remove();
  12711. animScope.end();
  12712. });
  12713. };
  12714. me.animate({
  12715. duration: (Math.max(obj.duration, 500) * 2) || 2000,
  12716. listeners: {
  12717. beforeanimate: {
  12718. fn: beforeAnim
  12719. }
  12720. }
  12721. });
  12722. return me;
  12723. },
  12724. ghost: function(anchor, obj) {
  12725. var me = this,
  12726. beforeAnim;
  12727. anchor = anchor || "b";
  12728. beforeAnim = function() {
  12729. var width = me.getWidth(),
  12730. height = me.getHeight(),
  12731. xy = me.getXY(),
  12732. position = me.getPositioning(),
  12733. to = {
  12734. opacity: 0
  12735. };
  12736. switch (anchor) {
  12737. case 't':
  12738. to.y = xy[1] - height;
  12739. break;
  12740. case 'l':
  12741. to.x = xy[0] - width;
  12742. break;
  12743. case 'r':
  12744. to.x = xy[0] + width;
  12745. break;
  12746. case 'b':
  12747. to.y = xy[1] + height;
  12748. break;
  12749. case 'tl':
  12750. to.x = xy[0] - width;
  12751. to.y = xy[1] - height;
  12752. break;
  12753. case 'bl':
  12754. to.x = xy[0] - width;
  12755. to.y = xy[1] + height;
  12756. break;
  12757. case 'br':
  12758. to.x = xy[0] + width;
  12759. to.y = xy[1] + height;
  12760. break;
  12761. case 'tr':
  12762. to.x = xy[0] + width;
  12763. to.y = xy[1] - height;
  12764. break;
  12765. }
  12766. this.to = to;
  12767. this.on('afteranimate', function () {
  12768. if (me.dom) {
  12769. me.hide();
  12770. me.clearOpacity();
  12771. me.setPositioning(position);
  12772. }
  12773. });
  12774. };
  12775. me.animate(Ext.applyIf(obj || {}, {
  12776. duration: 500,
  12777. easing: 'ease-out',
  12778. listeners: {
  12779. beforeanimate: {
  12780. fn: beforeAnim
  12781. }
  12782. }
  12783. }));
  12784. return me;
  12785. },
  12786. highlight: function(color, o) {
  12787. var me = this,
  12788. dom = me.dom,
  12789. from = {},
  12790. restore, to, attr, lns, event, fn;
  12791. o = o || {};
  12792. lns = o.listeners || {};
  12793. attr = o.attr || 'backgroundColor';
  12794. from[attr] = color || 'ffff9c';
  12795. if (!o.to) {
  12796. to = {};
  12797. to[attr] = o.endColor || me.getColor(attr, 'ffffff', '');
  12798. }
  12799. else {
  12800. to = o.to;
  12801. }
  12802. o.listeners = Ext.apply(Ext.apply({}, lns), {
  12803. beforeanimate: function() {
  12804. restore = dom.style[attr];
  12805. me.clearOpacity();
  12806. me.show();
  12807. event = lns.beforeanimate;
  12808. if (event) {
  12809. fn = event.fn || event;
  12810. return fn.apply(event.scope || lns.scope || window, arguments);
  12811. }
  12812. },
  12813. afteranimate: function() {
  12814. if (dom) {
  12815. dom.style[attr] = restore;
  12816. }
  12817. event = lns.afteranimate;
  12818. if (event) {
  12819. fn = event.fn || event;
  12820. fn.apply(event.scope || lns.scope || window, arguments);
  12821. }
  12822. }
  12823. });
  12824. me.animate(Ext.apply({}, o, {
  12825. duration: 1000,
  12826. easing: 'ease-in',
  12827. from: from,
  12828. to: to
  12829. }));
  12830. return me;
  12831. },
  12832. pause: function(ms) {
  12833. var me = this;
  12834. Ext.fx.Manager.setFxDefaults(me.id, {
  12835. delay: ms
  12836. });
  12837. return me;
  12838. },
  12839. fadeIn: function(o) {
  12840. var me = this;
  12841. me.animate(Ext.apply({}, o, {
  12842. opacity: 1,
  12843. internalListeners: {
  12844. beforeanimate: function(anim){
  12845. if (me.isStyle('display', 'none')) {
  12846. me.setDisplayed('');
  12847. } else {
  12848. me.show();
  12849. }
  12850. }
  12851. }
  12852. }));
  12853. return this;
  12854. },
  12855. fadeOut: function(o) {
  12856. var me = this;
  12857. o = Ext.apply({
  12858. opacity: 0,
  12859. internalListeners: {
  12860. afteranimate: function(anim){
  12861. var dom = me.dom;
  12862. if (dom && anim.to.opacity === 0) {
  12863. if (o.useDisplay) {
  12864. me.setDisplayed(false);
  12865. } else {
  12866. me.hide();
  12867. }
  12868. }
  12869. }
  12870. }
  12871. }, o);
  12872. me.animate(o);
  12873. return me;
  12874. },
  12875. scale: function(w, h, o) {
  12876. this.animate(Ext.apply({}, o, {
  12877. width: w,
  12878. height: h
  12879. }));
  12880. return this;
  12881. },
  12882. shift: function(config) {
  12883. this.animate(config);
  12884. return this;
  12885. }
  12886. });
  12887. //@tag dom,core
  12888. //@require Ext.dom.Element-anim
  12889. //@define Ext.dom.Element-dd
  12890. //@define Ext.dom.Element
  12891. Ext.dom.Element.override({
  12892. initDD : function(group, config, overrides){
  12893. var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);
  12894. return Ext.apply(dd, overrides);
  12895. },
  12896. initDDProxy : function(group, config, overrides){
  12897. var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);
  12898. return Ext.apply(dd, overrides);
  12899. },
  12900. initDDTarget : function(group, config, overrides){
  12901. var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);
  12902. return Ext.apply(dd, overrides);
  12903. }
  12904. });
  12905. //@tag dom,core
  12906. //@require Ext.dom.Element-dd
  12907. //@define Ext.dom.Element-fx
  12908. //@define Ext.dom.Element
  12909. (function() {
  12910. var Element = Ext.dom.Element,
  12911. VISIBILITY = "visibility",
  12912. DISPLAY = "display",
  12913. NONE = "none",
  12914. HIDDEN = 'hidden',
  12915. VISIBLE = 'visible',
  12916. OFFSETS = "offsets",
  12917. ASCLASS = "asclass",
  12918. NOSIZE = 'nosize',
  12919. ORIGINALDISPLAY = 'originalDisplay',
  12920. VISMODE = 'visibilityMode',
  12921. ISVISIBLE = 'isVisible',
  12922. OFFSETCLASS = Ext.baseCSSPrefix + 'hide-offsets',
  12923. getDisplay = function(el) {
  12924. var data = (el.$cache || el.getCache()).data,
  12925. display = data[ORIGINALDISPLAY];
  12926. if (display === undefined) {
  12927. data[ORIGINALDISPLAY] = display = '';
  12928. }
  12929. return display;
  12930. },
  12931. getVisMode = function(el){
  12932. var data = (el.$cache || el.getCache()).data,
  12933. visMode = data[VISMODE];
  12934. if (visMode === undefined) {
  12935. data[VISMODE] = visMode = Element.VISIBILITY;
  12936. }
  12937. return visMode;
  12938. };
  12939. Element.override({
  12940. originalDisplay : "",
  12941. visibilityMode : 1,
  12942. setVisible : function(visible, animate) {
  12943. var me = this,
  12944. dom = me.dom,
  12945. visMode = getVisMode(me);
  12946. if (typeof animate == 'string') {
  12947. switch (animate) {
  12948. case DISPLAY:
  12949. visMode = Element.DISPLAY;
  12950. break;
  12951. case VISIBILITY:
  12952. visMode = Element.VISIBILITY;
  12953. break;
  12954. case OFFSETS:
  12955. visMode = Element.OFFSETS;
  12956. break;
  12957. case NOSIZE:
  12958. case ASCLASS:
  12959. visMode = Element.ASCLASS;
  12960. break;
  12961. }
  12962. me.setVisibilityMode(visMode);
  12963. animate = false;
  12964. }
  12965. if (!animate || !me.anim) {
  12966. if (visMode == Element.DISPLAY) {
  12967. return me.setDisplayed(visible);
  12968. } else if (visMode == Element.OFFSETS) {
  12969. me[visible?'removeCls':'addCls'](OFFSETCLASS);
  12970. } else if (visMode == Element.VISIBILITY) {
  12971. me.fixDisplay();
  12972. dom.style.visibility = visible ? '' : HIDDEN;
  12973. } else if (visMode == Element.ASCLASS) {
  12974. me[visible?'removeCls':'addCls'](me.visibilityCls || Element.visibilityCls);
  12975. }
  12976. } else {
  12977. if (visible) {
  12978. me.setOpacity(0.01);
  12979. me.setVisible(true);
  12980. }
  12981. if (!Ext.isObject(animate)) {
  12982. animate = {
  12983. duration: 350,
  12984. easing: 'ease-in'
  12985. };
  12986. }
  12987. me.animate(Ext.applyIf({
  12988. callback: function() {
  12989. if (!visible) {
  12990. me.setVisible(false).setOpacity(1);
  12991. }
  12992. },
  12993. to: {
  12994. opacity: (visible) ? 1 : 0
  12995. }
  12996. }, animate));
  12997. }
  12998. (me.$cache || me.getCache()).data[ISVISIBLE] = visible;
  12999. return me;
  13000. },
  13001. hasMetrics : function(){
  13002. var visMode = getVisMode(this);
  13003. return this.isVisible() || (visMode == Element.OFFSETS) || (visMode == Element.VISIBILITY);
  13004. },
  13005. toggle : function(animate){
  13006. var me = this;
  13007. me.setVisible(!me.isVisible(), me.anim(animate));
  13008. return me;
  13009. },
  13010. setDisplayed : function(value) {
  13011. if(typeof value == "boolean"){
  13012. value = value ? getDisplay(this) : NONE;
  13013. }
  13014. this.setStyle(DISPLAY, value);
  13015. return this;
  13016. },
  13017. fixDisplay : function(){
  13018. var me = this;
  13019. if (me.isStyle(DISPLAY, NONE)) {
  13020. me.setStyle(VISIBILITY, HIDDEN);
  13021. me.setStyle(DISPLAY, getDisplay(me));
  13022. if (me.isStyle(DISPLAY, NONE)) {
  13023. me.setStyle(DISPLAY, "block");
  13024. }
  13025. }
  13026. },
  13027. hide : function(animate){
  13028. if (typeof animate == 'string'){
  13029. this.setVisible(false, animate);
  13030. return this;
  13031. }
  13032. this.setVisible(false, this.anim(animate));
  13033. return this;
  13034. },
  13035. show : function(animate){
  13036. if (typeof animate == 'string'){
  13037. this.setVisible(true, animate);
  13038. return this;
  13039. }
  13040. this.setVisible(true, this.anim(animate));
  13041. return this;
  13042. }
  13043. });
  13044. }());
  13045. //@tag dom,core
  13046. //@require Ext.dom.Element-fx
  13047. //@define Ext.dom.Element-position
  13048. //@define Ext.dom.Element
  13049. (function() {
  13050. var Element = Ext.dom.Element,
  13051. LEFT = "left",
  13052. RIGHT = "right",
  13053. TOP = "top",
  13054. BOTTOM = "bottom",
  13055. POSITION = "position",
  13056. STATIC = "static",
  13057. RELATIVE = "relative",
  13058. AUTO = "auto",
  13059. ZINDEX = "z-index",
  13060. BODY = 'BODY',
  13061. PADDING = 'padding',
  13062. BORDER = 'border',
  13063. SLEFT = '-left',
  13064. SRIGHT = '-right',
  13065. STOP = '-top',
  13066. SBOTTOM = '-bottom',
  13067. SWIDTH = '-width',
  13068. borders = {l: BORDER + SLEFT + SWIDTH, r: BORDER + SRIGHT + SWIDTH, t: BORDER + STOP + SWIDTH, b: BORDER + SBOTTOM + SWIDTH},
  13069. paddings = {l: PADDING + SLEFT, r: PADDING + SRIGHT, t: PADDING + STOP, b: PADDING + SBOTTOM},
  13070. paddingsTLRB = [paddings.l, paddings.r, paddings.t, paddings.b],
  13071. bordersTLRB = [borders.l, borders.r, borders.t, borders.b],
  13072. positionTopLeft = ['position', 'top', 'left'];
  13073. Element.override({
  13074. getX: function() {
  13075. return Element.getX(this.dom);
  13076. },
  13077. getY: function() {
  13078. return Element.getY(this.dom);
  13079. },
  13080. getXY: function() {
  13081. return Element.getXY(this.dom);
  13082. },
  13083. getOffsetsTo : function(el){
  13084. var o = this.getXY(),
  13085. e = Ext.fly(el, '_internal').getXY();
  13086. return [o[0] - e[0],o[1] - e[1]];
  13087. },
  13088. setX: function(x, animate) {
  13089. return this.setXY([x, this.getY()], animate);
  13090. },
  13091. setY: function(y, animate) {
  13092. return this.setXY([this.getX(), y], animate);
  13093. },
  13094. setLeft: function(left) {
  13095. this.setStyle(LEFT, this.addUnits(left));
  13096. return this;
  13097. },
  13098. setTop: function(top) {
  13099. this.setStyle(TOP, this.addUnits(top));
  13100. return this;
  13101. },
  13102. setRight: function(right) {
  13103. this.setStyle(RIGHT, this.addUnits(right));
  13104. return this;
  13105. },
  13106. setBottom: function(bottom) {
  13107. this.setStyle(BOTTOM, this.addUnits(bottom));
  13108. return this;
  13109. },
  13110. setXY: function(pos, animate) {
  13111. var me = this;
  13112. if (!animate || !me.anim) {
  13113. Element.setXY(me.dom, pos);
  13114. }
  13115. else {
  13116. if (!Ext.isObject(animate)) {
  13117. animate = {};
  13118. }
  13119. me.animate(Ext.applyIf({ to: { x: pos[0], y: pos[1] } }, animate));
  13120. }
  13121. return me;
  13122. },
  13123. pxRe: /^\d+(?:\.\d*)?px$/i,
  13124. getLocalX: function() {
  13125. var me = this,
  13126. offsetParent,
  13127. x = me.getStyle(LEFT);
  13128. if (!x || x === AUTO) {
  13129. return 0;
  13130. }
  13131. if (x && me.pxRe.test(x)) {
  13132. return parseFloat(x);
  13133. }
  13134. x = me.getX();
  13135. offsetParent = me.dom.offsetParent;
  13136. if (offsetParent) {
  13137. x -= Ext.fly(offsetParent).getX();
  13138. }
  13139. return x;
  13140. },
  13141. getLocalY: function() {
  13142. var me = this,
  13143. offsetParent,
  13144. y = me.getStyle(TOP);
  13145. if (!y || y === AUTO) {
  13146. return 0;
  13147. }
  13148. if (y && me.pxRe.test(y)) {
  13149. return parseFloat(y);
  13150. }
  13151. y = me.getY();
  13152. offsetParent = me.dom.offsetParent;
  13153. if (offsetParent) {
  13154. y -= Ext.fly(offsetParent).getY();
  13155. }
  13156. return y;
  13157. },
  13158. getLeft: function(local) {
  13159. return local ? this.getLocalX() : this.getX();
  13160. },
  13161. getRight: function(local) {
  13162. return (local ? this.getLocalX() : this.getX()) + this.getWidth();
  13163. },
  13164. getTop: function(local) {
  13165. return local ? this.getLocalY() : this.getY();
  13166. },
  13167. getBottom: function(local) {
  13168. return (local ? this.getLocalY() : this.getY()) + this.getHeight();
  13169. },
  13170. translatePoints: function(x, y) {
  13171. var me = this,
  13172. styles = me.getStyle(positionTopLeft),
  13173. relative = styles.position == 'relative',
  13174. left = parseFloat(styles.left),
  13175. top = parseFloat(styles.top),
  13176. xy = me.getXY();
  13177. if (Ext.isArray(x)) {
  13178. y = x[1];
  13179. x = x[0];
  13180. }
  13181. if (isNaN(left)) {
  13182. left = relative ? 0 : me.dom.offsetLeft;
  13183. }
  13184. if (isNaN(top)) {
  13185. top = relative ? 0 : me.dom.offsetTop;
  13186. }
  13187. left = (typeof x == 'number') ? x - xy[0] + left : undefined;
  13188. top = (typeof y == 'number') ? y - xy[1] + top : undefined;
  13189. return {
  13190. left: left,
  13191. top: top
  13192. };
  13193. },
  13194. setBox: function(box, adjust, animate) {
  13195. var me = this,
  13196. w = box.width,
  13197. h = box.height;
  13198. if ((adjust && !me.autoBoxAdjust) && !me.isBorderBox()) {
  13199. w -= (me.getBorderWidth("lr") + me.getPadding("lr"));
  13200. h -= (me.getBorderWidth("tb") + me.getPadding("tb"));
  13201. }
  13202. me.setBounds(box.x, box.y, w, h, animate);
  13203. return me;
  13204. },
  13205. getBox: function(contentBox, local) {
  13206. var me = this,
  13207. xy,
  13208. left,
  13209. top,
  13210. paddingWidth,
  13211. bordersWidth,
  13212. l, r, t, b, w, h, bx;
  13213. if (!local) {
  13214. xy = me.getXY();
  13215. } else {
  13216. xy = me.getStyle([LEFT, TOP]);
  13217. xy = [ parseFloat(xy.left) || 0, parseFloat(xy.top) || 0];
  13218. }
  13219. w = me.getWidth();
  13220. h = me.getHeight();
  13221. if (!contentBox) {
  13222. bx = {
  13223. x: xy[0],
  13224. y: xy[1],
  13225. 0: xy[0],
  13226. 1: xy[1],
  13227. width: w,
  13228. height: h
  13229. };
  13230. } else {
  13231. paddingWidth = me.getStyle(paddingsTLRB);
  13232. bordersWidth = me.getStyle(bordersTLRB);
  13233. l = (parseFloat(bordersWidth[borders.l]) || 0) + (parseFloat(paddingWidth[paddings.l]) || 0);
  13234. r = (parseFloat(bordersWidth[borders.r]) || 0) + (parseFloat(paddingWidth[paddings.r]) || 0);
  13235. t = (parseFloat(bordersWidth[borders.t]) || 0) + (parseFloat(paddingWidth[paddings.t]) || 0);
  13236. b = (parseFloat(bordersWidth[borders.b]) || 0) + (parseFloat(paddingWidth[paddings.b]) || 0);
  13237. bx = {
  13238. x: xy[0] + l,
  13239. y: xy[1] + t,
  13240. 0: xy[0] + l,
  13241. 1: xy[1] + t,
  13242. width: w - (l + r),
  13243. height: h - (t + b)
  13244. };
  13245. }
  13246. bx.right = bx.x + bx.width;
  13247. bx.bottom = bx.y + bx.height;
  13248. return bx;
  13249. },
  13250. getPageBox: function(getRegion) {
  13251. var me = this,
  13252. el = me.dom,
  13253. isDoc = el.nodeName == BODY,
  13254. w = isDoc ? Ext.dom.AbstractElement.getViewWidth() : el.offsetWidth,
  13255. h = isDoc ? Ext.dom.AbstractElement.getViewHeight() : el.offsetHeight,
  13256. xy = me.getXY(),
  13257. t = xy[1],
  13258. r = xy[0] + w,
  13259. b = xy[1] + h,
  13260. l = xy[0];
  13261. if (getRegion) {
  13262. return new Ext.util.Region(t, r, b, l);
  13263. }
  13264. else {
  13265. return {
  13266. left: l,
  13267. top: t,
  13268. width: w,
  13269. height: h,
  13270. right: r,
  13271. bottom: b
  13272. };
  13273. }
  13274. },
  13275. setLocation : function(x, y, animate) {
  13276. return this.setXY([x, y], animate);
  13277. },
  13278. moveTo : function(x, y, animate) {
  13279. return this.setXY([x, y], animate);
  13280. },
  13281. position : function(pos, zIndex, x, y) {
  13282. var me = this;
  13283. if (!pos && me.isStyle(POSITION, STATIC)) {
  13284. me.setStyle(POSITION, RELATIVE);
  13285. } else if (pos) {
  13286. me.setStyle(POSITION, pos);
  13287. }
  13288. if (zIndex) {
  13289. me.setStyle(ZINDEX, zIndex);
  13290. }
  13291. if (x || y) {
  13292. me.setXY([x || false, y || false]);
  13293. }
  13294. },
  13295. clearPositioning : function(value) {
  13296. value = value || '';
  13297. this.setStyle({
  13298. left : value,
  13299. right : value,
  13300. top : value,
  13301. bottom : value,
  13302. "z-index" : "",
  13303. position : STATIC
  13304. });
  13305. return this;
  13306. },
  13307. getPositioning : function(){
  13308. var styles = this.getStyle([LEFT, TOP, POSITION, RIGHT, BOTTOM, ZINDEX]);
  13309. styles[RIGHT] = styles[LEFT] ? '' : styles[RIGHT];
  13310. styles[BOTTOM] = styles[TOP] ? '' : styles[BOTTOM];
  13311. return styles;
  13312. },
  13313. setPositioning : function(pc) {
  13314. var me = this,
  13315. style = me.dom.style;
  13316. me.setStyle(pc);
  13317. if (pc.right == AUTO) {
  13318. style.right = "";
  13319. }
  13320. if (pc.bottom == AUTO) {
  13321. style.bottom = "";
  13322. }
  13323. return me;
  13324. },
  13325. move: function(direction, distance, animate) {
  13326. var me = this,
  13327. xy = me.getXY(),
  13328. x = xy[0],
  13329. y = xy[1],
  13330. left = [x - distance, y],
  13331. right = [x + distance, y],
  13332. top = [x, y - distance],
  13333. bottom = [x, y + distance],
  13334. hash = {
  13335. l: left,
  13336. left: left,
  13337. r: right,
  13338. right: right,
  13339. t: top,
  13340. top: top,
  13341. up: top,
  13342. b: bottom,
  13343. bottom: bottom,
  13344. down: bottom
  13345. };
  13346. direction = direction.toLowerCase();
  13347. me.moveTo(hash[direction][0], hash[direction][1], animate);
  13348. },
  13349. setLeftTop: function(left, top) {
  13350. var style = this.dom.style;
  13351. style.left = Element.addUnits(left);
  13352. style.top = Element.addUnits(top);
  13353. return this;
  13354. },
  13355. getRegion: function() {
  13356. return this.getPageBox(true);
  13357. },
  13358. getViewRegion: function() {
  13359. var me = this,
  13360. isBody = me.dom.nodeName == BODY,
  13361. scroll, pos, top, left, width, height;
  13362. if (isBody) {
  13363. scroll = me.getScroll();
  13364. left = scroll.left;
  13365. top = scroll.top;
  13366. width = Ext.dom.AbstractElement.getViewportWidth();
  13367. height = Ext.dom.AbstractElement.getViewportHeight();
  13368. }
  13369. else {
  13370. pos = me.getXY();
  13371. left = pos[0] + me.getBorderWidth('l') + me.getPadding('l');
  13372. top = pos[1] + me.getBorderWidth('t') + me.getPadding('t');
  13373. width = me.getWidth(true);
  13374. height = me.getHeight(true);
  13375. }
  13376. return new Ext.util.Region(top, left + width - 1, top + height - 1, left);
  13377. },
  13378. setBounds: function(x, y, width, height, animate) {
  13379. var me = this;
  13380. if (!animate || !me.anim) {
  13381. me.setSize(width, height);
  13382. me.setLocation(x, y);
  13383. } else {
  13384. if (!Ext.isObject(animate)) {
  13385. animate = {};
  13386. }
  13387. me.animate(Ext.applyIf({
  13388. to: {
  13389. x: x,
  13390. y: y,
  13391. width: me.adjustWidth(width),
  13392. height: me.adjustHeight(height)
  13393. }
  13394. }, animate));
  13395. }
  13396. return me;
  13397. },
  13398. setRegion: function(region, animate) {
  13399. return this.setBounds(region.left, region.top, region.right - region.left, region.bottom - region.top, animate);
  13400. }
  13401. });
  13402. }());
  13403. //@tag dom,core
  13404. //@require Ext.dom.Element-position
  13405. //@define Ext.dom.Element-scroll
  13406. //@define Ext.dom.Element
  13407. Ext.dom.Element.override({
  13408. isScrollable: function() {
  13409. var dom = this.dom;
  13410. return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
  13411. },
  13412. getScroll: function() {
  13413. var d = this.dom,
  13414. doc = document,
  13415. body = doc.body,
  13416. docElement = doc.documentElement,
  13417. l,
  13418. t,
  13419. ret;
  13420. if (d == doc || d == body) {
  13421. if (Ext.isIE && Ext.isStrict) {
  13422. l = docElement.scrollLeft;
  13423. t = docElement.scrollTop;
  13424. } else {
  13425. l = window.pageXOffset;
  13426. t = window.pageYOffset;
  13427. }
  13428. ret = {
  13429. left: l || (body ? body.scrollLeft : 0),
  13430. top : t || (body ? body.scrollTop : 0)
  13431. };
  13432. } else {
  13433. ret = {
  13434. left: d.scrollLeft,
  13435. top : d.scrollTop
  13436. };
  13437. }
  13438. return ret;
  13439. },
  13440. scrollBy: function(deltaX, deltaY, animate) {
  13441. var me = this,
  13442. dom = me.dom;
  13443. if (deltaX.length) {
  13444. animate = deltaY;
  13445. deltaY = deltaX[1];
  13446. deltaX = deltaX[0];
  13447. } else if (typeof deltaX != 'number') {
  13448. animate = deltaY;
  13449. deltaY = deltaX.y;
  13450. deltaX = deltaX.x;
  13451. }
  13452. if (deltaX) {
  13453. me.scrollTo('left', Math.max(Math.min(dom.scrollLeft + deltaX, dom.scrollWidth - dom.clientWidth), 0), animate);
  13454. }
  13455. if (deltaY) {
  13456. me.scrollTo('top', Math.max(Math.min(dom.scrollTop + deltaY, dom.scrollHeight - dom.clientHeight), 0), animate);
  13457. }
  13458. return me;
  13459. },
  13460. scrollTo: function(side, value, animate) {
  13461. var top = /top/i.test(side),
  13462. me = this,
  13463. dom = me.dom,
  13464. animCfg,
  13465. prop;
  13466. if (!animate || !me.anim) {
  13467. prop = 'scroll' + (top ? 'Top' : 'Left');
  13468. dom[prop] = value;
  13469. dom[prop] = value;
  13470. }
  13471. else {
  13472. animCfg = {
  13473. to: {}
  13474. };
  13475. animCfg.to['scroll' + (top ? 'Top' : 'Left')] = value;
  13476. if (Ext.isObject(animate)) {
  13477. Ext.applyIf(animCfg, animate);
  13478. }
  13479. me.animate(animCfg);
  13480. }
  13481. return me;
  13482. },
  13483. scrollIntoView: function(container, hscroll, animate) {
  13484. container = Ext.getDom(container) || Ext.getBody().dom;
  13485. var el = this.dom,
  13486. offsets = this.getOffsetsTo(container),
  13487. left = offsets[0] + container.scrollLeft,
  13488. top = offsets[1] + container.scrollTop,
  13489. bottom = top + el.offsetHeight,
  13490. right = left + el.offsetWidth,
  13491. ctClientHeight = container.clientHeight,
  13492. ctScrollTop = parseInt(container.scrollTop, 10),
  13493. ctScrollLeft = parseInt(container.scrollLeft, 10),
  13494. ctBottom = ctScrollTop + ctClientHeight,
  13495. ctRight = ctScrollLeft + container.clientWidth,
  13496. newPos;
  13497. if (el.offsetHeight > ctClientHeight || top < ctScrollTop) {
  13498. newPos = top;
  13499. } else if (bottom > ctBottom) {
  13500. newPos = bottom - ctClientHeight;
  13501. }
  13502. if (newPos != null) {
  13503. Ext.get(container).scrollTo('top', newPos, animate);
  13504. }
  13505. if (hscroll !== false) {
  13506. newPos = null;
  13507. if (el.offsetWidth > container.clientWidth || left < ctScrollLeft) {
  13508. newPos = left;
  13509. } else if (right > ctRight) {
  13510. newPos = right - container.clientWidth;
  13511. }
  13512. if (newPos != null) {
  13513. Ext.get(container).scrollTo('left', newPos, animate);
  13514. }
  13515. }
  13516. return this;
  13517. },
  13518. scrollChildIntoView: function(child, hscroll) {
  13519. Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
  13520. },
  13521. scroll: function(direction, distance, animate) {
  13522. if (!this.isScrollable()) {
  13523. return false;
  13524. }
  13525. var el = this.dom,
  13526. l = el.scrollLeft, t = el.scrollTop,
  13527. w = el.scrollWidth, h = el.scrollHeight,
  13528. cw = el.clientWidth, ch = el.clientHeight,
  13529. scrolled = false, v,
  13530. hash = {
  13531. l: Math.min(l + distance, w - cw),
  13532. r: v = Math.max(l - distance, 0),
  13533. t: Math.max(t - distance, 0),
  13534. b: Math.min(t + distance, h - ch)
  13535. };
  13536. hash.d = hash.b;
  13537. hash.u = hash.t;
  13538. direction = direction.substr(0, 1);
  13539. if ((v = hash[direction]) > -1) {
  13540. scrolled = true;
  13541. this.scrollTo(direction == 'l' || direction == 'r' ? 'left' : 'top', v, this.anim(animate));
  13542. }
  13543. return scrolled;
  13544. }
  13545. });
  13546. //@tag dom,core
  13547. //@require Ext.dom.Element-scroll
  13548. //@define Ext.dom.Element-style
  13549. //@define Ext.dom.Element
  13550. (function() {
  13551. var Element = Ext.dom.Element,
  13552. view = document.defaultView,
  13553. adjustDirect2DTableRe = /table-row|table-.*-group/,
  13554. INTERNAL = '_internal',
  13555. HIDDEN = 'hidden',
  13556. HEIGHT = 'height',
  13557. WIDTH = 'width',
  13558. ISCLIPPED = 'isClipped',
  13559. OVERFLOW = 'overflow',
  13560. OVERFLOWX = 'overflow-x',
  13561. OVERFLOWY = 'overflow-y',
  13562. ORIGINALCLIP = 'originalClip',
  13563. DOCORBODYRE = /#document|body/i,
  13564. styleHooks,
  13565. edges, k, edge, borderWidth;
  13566. if (!view || !view.getComputedStyle) {
  13567. Element.prototype.getStyle = function (property, inline) {
  13568. var me = this,
  13569. dom = me.dom,
  13570. multiple = typeof property != 'string',
  13571. hooks = me.styleHooks,
  13572. prop = property,
  13573. props = prop,
  13574. len = 1,
  13575. isInline = inline,
  13576. camel, domStyle, values, hook, out, style, i;
  13577. if (multiple) {
  13578. values = {};
  13579. prop = props[0];
  13580. i = 0;
  13581. if (!(len = props.length)) {
  13582. return values;
  13583. }
  13584. }
  13585. if (!dom || dom.documentElement) {
  13586. return values || '';
  13587. }
  13588. domStyle = dom.style;
  13589. if (inline) {
  13590. style = domStyle;
  13591. } else {
  13592. style = dom.currentStyle;
  13593. if (!style) {
  13594. isInline = true;
  13595. style = domStyle;
  13596. }
  13597. }
  13598. do {
  13599. hook = hooks[prop];
  13600. if (!hook) {
  13601. hooks[prop] = hook = { name: Element.normalize(prop) };
  13602. }
  13603. if (hook.get) {
  13604. out = hook.get(dom, me, isInline, style);
  13605. } else {
  13606. camel = hook.name;
  13607. if (hook.canThrow) {
  13608. try {
  13609. out = style[camel];
  13610. } catch (e) {
  13611. out = '';
  13612. }
  13613. } else {
  13614. out = style ? style[camel] : '';
  13615. }
  13616. }
  13617. if (!multiple) {
  13618. return out;
  13619. }
  13620. values[prop] = out;
  13621. prop = props[++i];
  13622. } while (i < len);
  13623. return values;
  13624. };
  13625. }
  13626. Element.override({
  13627. getHeight: function(contentHeight, preciseHeight) {
  13628. var me = this,
  13629. dom = me.dom,
  13630. hidden = me.isStyle('display', 'none'),
  13631. height,
  13632. floating;
  13633. if (hidden) {
  13634. return 0;
  13635. }
  13636. height = Math.max(dom.offsetHeight, dom.clientHeight) || 0;
  13637. if (Ext.supports.Direct2DBug) {
  13638. floating = me.adjustDirect2DDimension(HEIGHT);
  13639. if (preciseHeight) {
  13640. height += floating;
  13641. }
  13642. else if (floating > 0 && floating < 0.5) {
  13643. height++;
  13644. }
  13645. }
  13646. if (contentHeight) {
  13647. height -= me.getBorderWidth("tb") + me.getPadding("tb");
  13648. }
  13649. return (height < 0) ? 0 : height;
  13650. },
  13651. getWidth: function(contentWidth, preciseWidth) {
  13652. var me = this,
  13653. dom = me.dom,
  13654. hidden = me.isStyle('display', 'none'),
  13655. rect, width, floating;
  13656. if (hidden) {
  13657. return 0;
  13658. }
  13659. if (Ext.supports.BoundingClientRect) {
  13660. rect = dom.getBoundingClientRect();
  13661. width = rect.right - rect.left;
  13662. width = preciseWidth ? width : Math.ceil(width);
  13663. } else {
  13664. width = dom.offsetWidth;
  13665. }
  13666. width = Math.max(width, dom.clientWidth) || 0;
  13667. if (Ext.supports.Direct2DBug) {
  13668. floating = me.adjustDirect2DDimension(WIDTH);
  13669. if (preciseWidth) {
  13670. width += floating;
  13671. }
  13672. else if (floating > 0 && floating < 0.5) {
  13673. width++;
  13674. }
  13675. }
  13676. if (contentWidth) {
  13677. width -= me.getBorderWidth("lr") + me.getPadding("lr");
  13678. }
  13679. return (width < 0) ? 0 : width;
  13680. },
  13681. setWidth: function(width, animate) {
  13682. var me = this;
  13683. width = me.adjustWidth(width);
  13684. if (!animate || !me.anim) {
  13685. me.dom.style.width = me.addUnits(width);
  13686. }
  13687. else {
  13688. if (!Ext.isObject(animate)) {
  13689. animate = {};
  13690. }
  13691. me.animate(Ext.applyIf({
  13692. to: {
  13693. width: width
  13694. }
  13695. }, animate));
  13696. }
  13697. return me;
  13698. },
  13699. setHeight : function(height, animate) {
  13700. var me = this;
  13701. height = me.adjustHeight(height);
  13702. if (!animate || !me.anim) {
  13703. me.dom.style.height = me.addUnits(height);
  13704. }
  13705. else {
  13706. if (!Ext.isObject(animate)) {
  13707. animate = {};
  13708. }
  13709. me.animate(Ext.applyIf({
  13710. to: {
  13711. height: height
  13712. }
  13713. }, animate));
  13714. }
  13715. return me;
  13716. },
  13717. applyStyles: function(style) {
  13718. Ext.DomHelper.applyStyles(this.dom, style);
  13719. return this;
  13720. },
  13721. setSize: function(width, height, animate) {
  13722. var me = this;
  13723. if (Ext.isObject(width)) {
  13724. animate = height;
  13725. height = width.height;
  13726. width = width.width;
  13727. }
  13728. width = me.adjustWidth(width);
  13729. height = me.adjustHeight(height);
  13730. if (!animate || !me.anim) {
  13731. me.dom.style.width = me.addUnits(width);
  13732. me.dom.style.height = me.addUnits(height);
  13733. }
  13734. else {
  13735. if (animate === true) {
  13736. animate = {};
  13737. }
  13738. me.animate(Ext.applyIf({
  13739. to: {
  13740. width: width,
  13741. height: height
  13742. }
  13743. }, animate));
  13744. }
  13745. return me;
  13746. },
  13747. getViewSize : function() {
  13748. var me = this,
  13749. dom = me.dom,
  13750. isDoc = DOCORBODYRE.test(dom.nodeName),
  13751. ret;
  13752. if (isDoc) {
  13753. ret = {
  13754. width : Element.getViewWidth(),
  13755. height : Element.getViewHeight()
  13756. };
  13757. } else {
  13758. ret = {
  13759. width : dom.clientWidth,
  13760. height : dom.clientHeight
  13761. };
  13762. }
  13763. return ret;
  13764. },
  13765. getSize: function(contentSize) {
  13766. return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
  13767. },
  13768. adjustWidth : function(width) {
  13769. var me = this,
  13770. isNum = (typeof width == 'number');
  13771. if (isNum && me.autoBoxAdjust && !me.isBorderBox()) {
  13772. width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
  13773. }
  13774. return (isNum && width < 0) ? 0 : width;
  13775. },
  13776. adjustHeight : function(height) {
  13777. var me = this,
  13778. isNum = (typeof height == "number");
  13779. if (isNum && me.autoBoxAdjust && !me.isBorderBox()) {
  13780. height -= (me.getBorderWidth("tb") + me.getPadding("tb"));
  13781. }
  13782. return (isNum && height < 0) ? 0 : height;
  13783. },
  13784. getColor : function(attr, defaultValue, prefix) {
  13785. var v = this.getStyle(attr),
  13786. color = prefix || prefix === '' ? prefix : '#',
  13787. h, len, i=0;
  13788. if (!v || (/transparent|inherit/.test(v))) {
  13789. return defaultValue;
  13790. }
  13791. if (/^r/.test(v)) {
  13792. v = v.slice(4, v.length - 1).split(',');
  13793. len = v.length;
  13794. for (; i<len; i++) {
  13795. h = parseInt(v[i], 10);
  13796. color += (h < 16 ? '0' : '') + h.toString(16);
  13797. }
  13798. } else {
  13799. v = v.replace('#', '');
  13800. color += v.length == 3 ? v.replace(/^(\w)(\w)(\w)$/, '$1$1$2$2$3$3') : v;
  13801. }
  13802. return(color.length > 5 ? color.toLowerCase() : defaultValue);
  13803. },
  13804. setOpacity: function(opacity, animate) {
  13805. var me = this;
  13806. if (!me.dom) {
  13807. return me;
  13808. }
  13809. if (!animate || !me.anim) {
  13810. me.setStyle('opacity', opacity);
  13811. }
  13812. else {
  13813. if (typeof animate != 'object') {
  13814. animate = {
  13815. duration: 350,
  13816. easing: 'ease-in'
  13817. };
  13818. }
  13819. me.animate(Ext.applyIf({
  13820. to: {
  13821. opacity: opacity
  13822. }
  13823. }, animate));
  13824. }
  13825. return me;
  13826. },
  13827. clearOpacity : function() {
  13828. return this.setOpacity('');
  13829. },
  13830. adjustDirect2DDimension: function(dimension) {
  13831. var me = this,
  13832. dom = me.dom,
  13833. display = me.getStyle('display'),
  13834. inlineDisplay = dom.style.display,
  13835. inlinePosition = dom.style.position,
  13836. originIndex = dimension === WIDTH ? 0 : 1,
  13837. currentStyle = dom.currentStyle,
  13838. floating;
  13839. if (display === 'inline') {
  13840. dom.style.display = 'inline-block';
  13841. }
  13842. dom.style.position = display.match(adjustDirect2DTableRe) ? 'absolute' : 'static';
  13843. floating = (parseFloat(currentStyle[dimension]) || parseFloat(currentStyle.msTransformOrigin.split(' ')[originIndex]) * 2) % 1;
  13844. dom.style.position = inlinePosition;
  13845. if (display === 'inline') {
  13846. dom.style.display = inlineDisplay;
  13847. }
  13848. return floating;
  13849. },
  13850. clip : function() {
  13851. var me = this,
  13852. data = (me.$cache || me.getCache()).data,
  13853. style;
  13854. if (!data[ISCLIPPED]) {
  13855. data[ISCLIPPED] = true;
  13856. style = me.getStyle([OVERFLOW, OVERFLOWX, OVERFLOWY]);
  13857. data[ORIGINALCLIP] = {
  13858. o: style[OVERFLOW],
  13859. x: style[OVERFLOWX],
  13860. y: style[OVERFLOWY]
  13861. };
  13862. me.setStyle(OVERFLOW, HIDDEN);
  13863. me.setStyle(OVERFLOWX, HIDDEN);
  13864. me.setStyle(OVERFLOWY, HIDDEN);
  13865. }
  13866. return me;
  13867. },
  13868. unclip : function() {
  13869. var me = this,
  13870. data = (me.$cache || me.getCache()).data,
  13871. clip;
  13872. if (data[ISCLIPPED]) {
  13873. data[ISCLIPPED] = false;
  13874. clip = data[ORIGINALCLIP];
  13875. if (clip.o) {
  13876. me.setStyle(OVERFLOW, clip.o);
  13877. }
  13878. if (clip.x) {
  13879. me.setStyle(OVERFLOWX, clip.x);
  13880. }
  13881. if (clip.y) {
  13882. me.setStyle(OVERFLOWY, clip.y);
  13883. }
  13884. }
  13885. return me;
  13886. },
  13887. boxWrap : function(cls) {
  13888. cls = cls || Ext.baseCSSPrefix + 'box';
  13889. var el = Ext.get(this.insertHtml("beforeBegin", "<div class='" + cls + "'>" + Ext.String.format(Element.boxMarkup, cls) + "</div>"));
  13890. Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
  13891. return el;
  13892. },
  13893. getComputedHeight : function() {
  13894. var me = this,
  13895. h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
  13896. if (!h) {
  13897. h = parseFloat(me.getStyle(HEIGHT)) || 0;
  13898. if (!me.isBorderBox()) {
  13899. h += me.getFrameWidth('tb');
  13900. }
  13901. }
  13902. return h;
  13903. },
  13904. getComputedWidth : function() {
  13905. var me = this,
  13906. w = Math.max(me.dom.offsetWidth, me.dom.clientWidth);
  13907. if (!w) {
  13908. w = parseFloat(me.getStyle(WIDTH)) || 0;
  13909. if (!me.isBorderBox()) {
  13910. w += me.getFrameWidth('lr');
  13911. }
  13912. }
  13913. return w;
  13914. },
  13915. getFrameWidth : function(sides, onlyContentBox) {
  13916. return (onlyContentBox && this.isBorderBox()) ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
  13917. },
  13918. addClsOnOver : function(className, testFn, scope) {
  13919. var me = this,
  13920. dom = me.dom,
  13921. hasTest = Ext.isFunction(testFn);
  13922. me.hover(
  13923. function() {
  13924. if (hasTest && testFn.call(scope || me, me) === false) {
  13925. return;
  13926. }
  13927. Ext.fly(dom, INTERNAL).addCls(className);
  13928. },
  13929. function() {
  13930. Ext.fly(dom, INTERNAL).removeCls(className);
  13931. }
  13932. );
  13933. return me;
  13934. },
  13935. addClsOnFocus : function(className, testFn, scope) {
  13936. var me = this,
  13937. dom = me.dom,
  13938. hasTest = Ext.isFunction(testFn);
  13939. me.on("focus", function() {
  13940. if (hasTest && testFn.call(scope || me, me) === false) {
  13941. return false;
  13942. }
  13943. Ext.fly(dom, INTERNAL).addCls(className);
  13944. });
  13945. me.on("blur", function() {
  13946. Ext.fly(dom, INTERNAL).removeCls(className);
  13947. });
  13948. return me;
  13949. },
  13950. addClsOnClick : function(className, testFn, scope) {
  13951. var me = this,
  13952. dom = me.dom,
  13953. hasTest = Ext.isFunction(testFn);
  13954. me.on("mousedown", function() {
  13955. if (hasTest && testFn.call(scope || me, me) === false) {
  13956. return false;
  13957. }
  13958. Ext.fly(dom, INTERNAL).addCls(className);
  13959. var d = Ext.getDoc(),
  13960. fn = function() {
  13961. Ext.fly(dom, INTERNAL).removeCls(className);
  13962. d.removeListener("mouseup", fn);
  13963. };
  13964. d.on("mouseup", fn);
  13965. });
  13966. return me;
  13967. },
  13968. getStyleSize : function() {
  13969. var me = this,
  13970. d = this.dom,
  13971. isDoc = DOCORBODYRE.test(d.nodeName),
  13972. s ,
  13973. w, h;
  13974. if (isDoc) {
  13975. return {
  13976. width : Element.getViewWidth(),
  13977. height : Element.getViewHeight()
  13978. };
  13979. }
  13980. s = me.getStyle([HEIGHT, WIDTH], true);
  13981. if (s.width && s.width != 'auto') {
  13982. w = parseFloat(s.width);
  13983. if (me.isBorderBox()) {
  13984. w -= me.getFrameWidth('lr');
  13985. }
  13986. }
  13987. if (s.height && s.height != 'auto') {
  13988. h = parseFloat(s.height);
  13989. if (me.isBorderBox()) {
  13990. h -= me.getFrameWidth('tb');
  13991. }
  13992. }
  13993. return {width: w || me.getWidth(true), height: h || me.getHeight(true)};
  13994. },
  13995. selectable : function() {
  13996. var me = this;
  13997. me.dom.unselectable = "off";
  13998. me.on('selectstart', function (e) {
  13999. e.stopPropagation();
  14000. return true;
  14001. });
  14002. me.applyStyles("-moz-user-select: text; -khtml-user-select: text;");
  14003. me.removeCls(Ext.baseCSSPrefix + 'unselectable');
  14004. return me;
  14005. },
  14006. unselectable : function() {
  14007. var me = this;
  14008. me.dom.unselectable = "on";
  14009. me.swallowEvent("selectstart", true);
  14010. me.applyStyles("-moz-user-select:-moz-none;-khtml-user-select:none;");
  14011. me.addCls(Ext.baseCSSPrefix + 'unselectable');
  14012. return me;
  14013. }
  14014. });
  14015. Element.prototype.styleHooks = styleHooks = Ext.dom.AbstractElement.prototype.styleHooks;
  14016. if (Ext.isIE6 || Ext.isIE7) {
  14017. styleHooks.fontSize = styleHooks['font-size'] = {
  14018. name: 'fontSize',
  14019. canThrow: true
  14020. };
  14021. styleHooks.fontStyle = styleHooks['font-style'] = {
  14022. name: 'fontStyle',
  14023. canThrow: true
  14024. };
  14025. styleHooks.fontFamily = styleHooks['font-family'] = {
  14026. name: 'fontFamily',
  14027. canThrow: true
  14028. };
  14029. }
  14030. if (Ext.isIEQuirks || Ext.isIE && Ext.ieVersion <= 8) {
  14031. function getBorderWidth (dom, el, inline, style) {
  14032. if (style[this.styleName] == 'none') {
  14033. return '0px';
  14034. }
  14035. return style[this.name];
  14036. }
  14037. edges = ['Top','Right','Bottom','Left'];
  14038. k = edges.length;
  14039. while (k--) {
  14040. edge = edges[k];
  14041. borderWidth = 'border' + edge + 'Width';
  14042. styleHooks['border-'+edge.toLowerCase()+'-width'] = styleHooks[borderWidth] = {
  14043. name: borderWidth,
  14044. styleName: 'border' + edge + 'Style',
  14045. get: getBorderWidth
  14046. };
  14047. }
  14048. }
  14049. }());
  14050. Ext.onReady(function () {
  14051. var opacityRe = /alpha\(opacity=(.*)\)/i,
  14052. trimRe = /^\s+|\s+$/g,
  14053. hooks = Ext.dom.Element.prototype.styleHooks;
  14054. hooks.opacity = {
  14055. name: 'opacity',
  14056. afterSet: function(dom, value, el) {
  14057. if (el.isLayer) {
  14058. el.onOpacitySet(value);
  14059. }
  14060. }
  14061. };
  14062. if (!Ext.supports.Opacity && Ext.isIE) {
  14063. Ext.apply(hooks.opacity, {
  14064. get: function (dom) {
  14065. var filter = dom.style.filter,
  14066. match, opacity;
  14067. if (filter.match) {
  14068. match = filter.match(opacityRe);
  14069. if (match) {
  14070. opacity = parseFloat(match[1]);
  14071. if (!isNaN(opacity)) {
  14072. return opacity ? opacity / 100 : 0;
  14073. }
  14074. }
  14075. }
  14076. return 1;
  14077. },
  14078. set: function (dom, value) {
  14079. var style = dom.style,
  14080. val = style.filter.replace(opacityRe, '').replace(trimRe, '');
  14081. style.zoom = 1;
  14082. if (typeof(value) == 'number' && value >= 0 && value < 1) {
  14083. value *= 100;
  14084. style.filter = val + (val.length ? ' ' : '') + 'alpha(opacity='+value+')';
  14085. } else {
  14086. style.filter = val;
  14087. }
  14088. }
  14089. });
  14090. }
  14091. });
  14092. //@tag dom,core
  14093. //@require Ext.dom.Element-style
  14094. //@define Ext.dom.Element-traversal
  14095. //@define Ext.dom.Element
  14096. Ext.dom.Element.override({
  14097. select: function(selector) {
  14098. return Ext.dom.Element.select(selector, false, this.dom);
  14099. }
  14100. });
  14101. //@tag dom,core
  14102. //@require Ext.dom.Element-traversal
  14103. Ext.define('Ext.dom.CompositeElementLite', {
  14104. alternateClassName: 'Ext.CompositeElementLite',
  14105. requires: ['Ext.dom.Element', 'Ext.dom.Query'],
  14106. statics: {
  14107. importElementMethods: function() {
  14108. var name,
  14109. elementPrototype = Ext.dom.Element.prototype,
  14110. prototype = this.prototype;
  14111. for (name in elementPrototype) {
  14112. if (typeof elementPrototype[name] == 'function'){
  14113. (function(key) {
  14114. prototype[key] = prototype[key] || function() {
  14115. return this.invoke(key, arguments);
  14116. };
  14117. }).call(prototype, name);
  14118. }
  14119. }
  14120. }
  14121. },
  14122. constructor: function(elements, root) {
  14123. this.elements = [];
  14124. this.add(elements, root);
  14125. this.el = new Ext.dom.AbstractElement.Fly();
  14126. },
  14127. isComposite: true,
  14128. getElement: function(el) {
  14129. return this.el.attach(el);
  14130. },
  14131. transformElement: function(el) {
  14132. return Ext.getDom(el);
  14133. },
  14134. getCount: function() {
  14135. return this.elements.length;
  14136. },
  14137. add: function(els, root) {
  14138. var elements = this.elements,
  14139. i, ln;
  14140. if (!els) {
  14141. return this;
  14142. }
  14143. if (typeof els == "string") {
  14144. els = Ext.dom.Element.selectorFunction(els, root);
  14145. }
  14146. else if (els.isComposite) {
  14147. els = els.elements;
  14148. }
  14149. else if (!Ext.isIterable(els)) {
  14150. els = [els];
  14151. }
  14152. for (i = 0, ln = els.length; i < ln; ++i) {
  14153. elements.push(this.transformElement(els[i]));
  14154. }
  14155. return this;
  14156. },
  14157. invoke: function(fn, args) {
  14158. var elements = this.elements,
  14159. ln = elements.length,
  14160. element,
  14161. i;
  14162. fn = Ext.dom.Element.prototype[fn];
  14163. for (i = 0; i < ln; i++) {
  14164. element = elements[i];
  14165. if (element) {
  14166. fn.apply(this.getElement(element), args);
  14167. }
  14168. }
  14169. return this;
  14170. },
  14171. item: function(index) {
  14172. var el = this.elements[index],
  14173. out = null;
  14174. if (el) {
  14175. out = this.getElement(el);
  14176. }
  14177. return out;
  14178. },
  14179. addListener: function(eventName, handler, scope, opt) {
  14180. var els = this.elements,
  14181. len = els.length,
  14182. i, e;
  14183. for (i = 0; i < len; i++) {
  14184. e = els[i];
  14185. if (e) {
  14186. Ext.EventManager.on(e, eventName, handler, scope || e, opt);
  14187. }
  14188. }
  14189. return this;
  14190. },
  14191. each: function(fn, scope) {
  14192. var me = this,
  14193. els = me.elements,
  14194. len = els.length,
  14195. i, e;
  14196. for (i = 0; i < len; i++) {
  14197. e = els[i];
  14198. if (e) {
  14199. e = this.getElement(e);
  14200. if (fn.call(scope || e, e, me, i) === false) {
  14201. break;
  14202. }
  14203. }
  14204. }
  14205. return me;
  14206. },
  14207. fill: function(els) {
  14208. var me = this;
  14209. me.elements = [];
  14210. me.add(els);
  14211. return me;
  14212. },
  14213. filter: function(selector) {
  14214. var me = this,
  14215. els = me.elements,
  14216. len = els.length,
  14217. out = [],
  14218. i = 0,
  14219. isFunc = typeof selector == 'function',
  14220. add,
  14221. el;
  14222. for (; i < len; i++) {
  14223. el = els[i];
  14224. add = false;
  14225. if (el) {
  14226. el = me.getElement(el);
  14227. if (isFunc) {
  14228. add = selector.call(el, el, me, i) !== false;
  14229. } else {
  14230. add = el.is(selector);
  14231. }
  14232. if (add) {
  14233. out.push(me.transformElement(el));
  14234. }
  14235. }
  14236. }
  14237. me.elements = out;
  14238. return me;
  14239. },
  14240. indexOf: function(el) {
  14241. return Ext.Array.indexOf(this.elements, this.transformElement(el));
  14242. },
  14243. replaceElement: function(el, replacement, domReplace) {
  14244. var index = !isNaN(el) ? el : this.indexOf(el),
  14245. d;
  14246. if (index > -1) {
  14247. replacement = Ext.getDom(replacement);
  14248. if (domReplace) {
  14249. d = this.elements[index];
  14250. d.parentNode.insertBefore(replacement, d);
  14251. Ext.removeNode(d);
  14252. }
  14253. Ext.Array.splice(this.elements, index, 1, replacement);
  14254. }
  14255. return this;
  14256. },
  14257. clear: function() {
  14258. this.elements = [];
  14259. },
  14260. addElements: function(els, root) {
  14261. if (!els) {
  14262. return this;
  14263. }
  14264. if (typeof els == "string") {
  14265. els = Ext.dom.Element.selectorFunction(els, root);
  14266. }
  14267. var yels = this.elements,
  14268. eLen = els.length,
  14269. e;
  14270. for (e = 0; e < eLen; e++) {
  14271. yels.push(Ext.get(els[e]));
  14272. }
  14273. return this;
  14274. },
  14275. first: function() {
  14276. return this.item(0);
  14277. },
  14278. last: function() {
  14279. return this.item(this.getCount() - 1);
  14280. },
  14281. contains: function(el) {
  14282. return this.indexOf(el) != -1;
  14283. },
  14284. removeElement: function(keys, removeDom) {
  14285. keys = [].concat(keys);
  14286. var me = this,
  14287. elements = me.elements,
  14288. kLen = keys.length,
  14289. val, el, k;
  14290. for (k = 0; k < kLen; k++) {
  14291. val = keys[k];
  14292. if ((el = (elements[val] || elements[val = me.indexOf(val)]))) {
  14293. if (removeDom) {
  14294. if (el.dom) {
  14295. el.remove();
  14296. } else {
  14297. Ext.removeNode(el);
  14298. }
  14299. }
  14300. Ext.Array.erase(elements, val, 1);
  14301. }
  14302. }
  14303. return me;
  14304. }
  14305. }, function() {
  14306. this.importElementMethods();
  14307. this.prototype.on = this.prototype.addListener;
  14308. if (Ext.DomQuery){
  14309. Ext.dom.Element.selectorFunction = Ext.DomQuery.select;
  14310. }
  14311. Ext.dom.Element.select = function(selector, root) {
  14312. var elements;
  14313. if (typeof selector == "string") {
  14314. elements = Ext.dom.Element.selectorFunction(selector, root);
  14315. }
  14316. else if (selector.length !== undefined) {
  14317. elements = selector;
  14318. }
  14319. else {
  14320. }
  14321. return new Ext.CompositeElementLite(elements);
  14322. };
  14323. Ext.select = function() {
  14324. return Ext.dom.Element.select.apply(Ext.dom.Element, arguments);
  14325. };
  14326. });
  14327. Ext.define('Ext.util.Animate', {
  14328. requires: ['Ext.Element', 'Ext.CompositeElementLite'],
  14329. uses: ['Ext.fx.Manager', 'Ext.fx.Anim'],
  14330. animate: function(animObj) {
  14331. var me = this;
  14332. if (Ext.fx.Manager.hasFxBlock(me.id)) {
  14333. return me;
  14334. }
  14335. Ext.fx.Manager.queueFx(new Ext.fx.Anim(me.anim(animObj)));
  14336. return this;
  14337. },
  14338. anim: function(config) {
  14339. if (!Ext.isObject(config)) {
  14340. return (config) ? {} : false;
  14341. }
  14342. var me = this;
  14343. if (config.stopAnimation) {
  14344. me.stopAnimation();
  14345. }
  14346. Ext.applyIf(config, Ext.fx.Manager.getFxDefaults(me.id));
  14347. return Ext.apply({
  14348. target: me,
  14349. paused: true
  14350. }, config);
  14351. },
  14352. stopFx: Ext.Function.alias(Ext.util.Animate, 'stopAnimation'),
  14353. stopAnimation: function() {
  14354. Ext.fx.Manager.stopAnimation(this.id);
  14355. return this;
  14356. },
  14357. syncFx: function() {
  14358. Ext.fx.Manager.setFxDefaults(this.id, {
  14359. concurrent: true
  14360. });
  14361. return this;
  14362. },
  14363. sequenceFx: function() {
  14364. Ext.fx.Manager.setFxDefaults(this.id, {
  14365. concurrent: false
  14366. });
  14367. return this;
  14368. },
  14369. hasActiveFx: Ext.Function.alias(Ext.util.Animate, 'getActiveAnimation'),
  14370. getActiveAnimation: function() {
  14371. return Ext.fx.Manager.getActiveAnimation(this.id);
  14372. }
  14373. }, function(){
  14374. Ext.applyIf(Ext.Element.prototype, this.prototype);
  14375. Ext.CompositeElementLite.importElementMethods();
  14376. });
  14377. Ext.define('Ext.util.ElementContainer', {
  14378. childEls: [
  14379. ],
  14380. constructor: function () {
  14381. var me = this,
  14382. childEls;
  14383. if (me.hasOwnProperty('childEls')) {
  14384. childEls = me.childEls;
  14385. delete me.childEls;
  14386. me.addChildEls.apply(me, childEls);
  14387. }
  14388. },
  14389. destroy: function () {
  14390. var me = this,
  14391. childEls = me.getChildEls(),
  14392. child, childName, i, k;
  14393. for (i = childEls.length; i--; ) {
  14394. childName = childEls[i];
  14395. if (typeof childName != 'string') {
  14396. childName = childName.name;
  14397. }
  14398. child = me[childName];
  14399. if (child) {
  14400. me[childName] = null;
  14401. child.remove();
  14402. }
  14403. }
  14404. },
  14405. addChildEls: function () {
  14406. var me = this,
  14407. args = arguments;
  14408. if (me.hasOwnProperty('childEls')) {
  14409. me.childEls.push.apply(me.childEls, args);
  14410. } else {
  14411. me.childEls = me.getChildEls().concat(Array.prototype.slice.call(args));
  14412. }
  14413. me.prune(me.childEls, false);
  14414. },
  14415. applyChildEls: function(el, id) {
  14416. var me = this,
  14417. childEls = me.getChildEls(),
  14418. baseId, childName, i, selector, value;
  14419. baseId = (id || me.id) + '-';
  14420. for (i = childEls.length; i--; ) {
  14421. childName = childEls[i];
  14422. if (typeof childName == 'string') {
  14423. value = el.getById(baseId + childName);
  14424. } else {
  14425. if ((selector = childName.select)) {
  14426. value = Ext.select(selector, true, el.dom);
  14427. } else if ((selector = childName.selectNode)) {
  14428. value = Ext.get(Ext.DomQuery.selectNode(selector, el.dom));
  14429. } else {
  14430. value = el.getById(childName.id || (baseId + childName.itemId));
  14431. }
  14432. childName = childName.name;
  14433. }
  14434. me[childName] = value;
  14435. }
  14436. },
  14437. getChildEls: function () {
  14438. var me = this,
  14439. self;
  14440. if (me.hasOwnProperty('childEls')) {
  14441. return me.childEls;
  14442. }
  14443. self = me.self;
  14444. return self.$childEls || me.getClassChildEls(self);
  14445. },
  14446. getClassChildEls: function (cls) {
  14447. var me = this,
  14448. result = cls.$childEls,
  14449. childEls, i, length, forked, mixin, mixins, name, parts, proto, supr, superMixins;
  14450. if (!result) {
  14451. supr = cls.superclass;
  14452. if (supr) {
  14453. supr = supr.self;
  14454. parts = [supr.$childEls || me.getClassChildEls(supr)];
  14455. superMixins = supr.prototype.mixins || {};
  14456. } else {
  14457. parts = [];
  14458. superMixins = {};
  14459. }
  14460. proto = cls.prototype;
  14461. mixins = proto.mixins;
  14462. for (name in mixins) {
  14463. if (mixins.hasOwnProperty(name) && !superMixins.hasOwnProperty(name)) {
  14464. mixin = mixins[name].self;
  14465. parts.push(mixin.$childEls || me.getClassChildEls(mixin));
  14466. }
  14467. }
  14468. parts.push(proto.hasOwnProperty('childEls') && proto.childEls);
  14469. for (i = 0, length = parts.length; i < length; ++i) {
  14470. childEls = parts[i];
  14471. if (childEls && childEls.length) {
  14472. if (!result) {
  14473. result = childEls;
  14474. } else {
  14475. if (!forked) {
  14476. forked = true;
  14477. result = result.slice(0);
  14478. }
  14479. result.push.apply(result, childEls);
  14480. }
  14481. }
  14482. }
  14483. cls.$childEls = result = (result ? me.prune(result, !forked) : []);
  14484. }
  14485. return result;
  14486. },
  14487. prune: function (childEls, shared) {
  14488. var index = childEls.length,
  14489. map = {},
  14490. name;
  14491. while (index--) {
  14492. name = childEls[index];
  14493. if (typeof name != 'string') {
  14494. name = name.name;
  14495. }
  14496. if (!map[name]) {
  14497. map[name] = 1;
  14498. } else {
  14499. if (shared) {
  14500. shared = false;
  14501. childEls = childEls.slice(0);
  14502. }
  14503. Ext.Array.erase(childEls, index, 1);
  14504. }
  14505. }
  14506. return childEls;
  14507. },
  14508. removeChildEls: function (testFn) {
  14509. var me = this,
  14510. old = me.getChildEls(),
  14511. keepers = (me.childEls = []),
  14512. n, i, cel;
  14513. for (i = 0, n = old.length; i < n; ++i) {
  14514. cel = old[i];
  14515. if (!testFn(cel)) {
  14516. keepers.push(cel);
  14517. }
  14518. }
  14519. }
  14520. });
  14521. Ext.define('Ext.util.Renderable', {
  14522. requires: [
  14523. 'Ext.dom.Element'
  14524. ],
  14525. frameCls: Ext.baseCSSPrefix + 'frame',
  14526. frameIdRegex: /[\-]frame\d+[TMB][LCR]$/,
  14527. frameElementCls: {
  14528. tl: [],
  14529. tc: [],
  14530. tr: [],
  14531. ml: [],
  14532. mc: [],
  14533. mr: [],
  14534. bl: [],
  14535. bc: [],
  14536. br: []
  14537. },
  14538. frameElNames: ['TL','TC','TR','ML','MC','MR','BL','BC','BR'],
  14539. frameTpl: [
  14540. '{%this.renderDockedItems(out,values,0);%}',
  14541. '<tpl if="top">',
  14542. '<tpl if="left"><div id="{fgid}TL" class="{frameCls}-tl {baseCls}-tl {baseCls}-{ui}-tl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tl</tpl>" style="background-position: {tl}; padding-left: {frameWidth}px" role="presentation"></tpl>',
  14543. '<tpl if="right"><div id="{fgid}TR" class="{frameCls}-tr {baseCls}-tr {baseCls}-{ui}-tr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tr</tpl>" style="background-position: {tr}; padding-right: {frameWidth}px" role="presentation"></tpl>',
  14544. '<div id="{fgid}TC" class="{frameCls}-tc {baseCls}-tc {baseCls}-{ui}-tc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tc</tpl>" style="background-position: {tc}; height: {frameWidth}px" role="presentation"></div>',
  14545. '<tpl if="right"></div></tpl>',
  14546. '<tpl if="left"></div></tpl>',
  14547. '</tpl>',
  14548. '<tpl if="left"><div id="{fgid}ML" class="{frameCls}-ml {baseCls}-ml {baseCls}-{ui}-ml<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-ml</tpl>" style="background-position: {ml}; padding-left: {frameWidth}px" role="presentation"></tpl>',
  14549. '<tpl if="right"><div id="{fgid}MR" class="{frameCls}-mr {baseCls}-mr {baseCls}-{ui}-mr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mr</tpl>" style="background-position: {mr}; padding-right: {frameWidth}px" role="presentation"></tpl>',
  14550. '<div id="{fgid}MC" class="{frameCls}-mc {baseCls}-mc {baseCls}-{ui}-mc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mc</tpl>" role="presentation">',
  14551. '{%this.applyRenderTpl(out, values)%}',
  14552. '</div>',
  14553. '<tpl if="right"></div></tpl>',
  14554. '<tpl if="left"></div></tpl>',
  14555. '<tpl if="bottom">',
  14556. '<tpl if="left"><div id="{fgid}BL" class="{frameCls}-bl {baseCls}-bl {baseCls}-{ui}-bl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bl</tpl>" style="background-position: {bl}; padding-left: {frameWidth}px" role="presentation"></tpl>',
  14557. '<tpl if="right"><div id="{fgid}BR" class="{frameCls}-br {baseCls}-br {baseCls}-{ui}-br<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-br</tpl>" style="background-position: {br}; padding-right: {frameWidth}px" role="presentation"></tpl>',
  14558. '<div id="{fgid}BC" class="{frameCls}-bc {baseCls}-bc {baseCls}-{ui}-bc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bc</tpl>" style="background-position: {bc}; height: {frameWidth}px" role="presentation"></div>',
  14559. '<tpl if="right"></div></tpl>',
  14560. '<tpl if="left"></div></tpl>',
  14561. '</tpl>',
  14562. '{%this.renderDockedItems(out,values,1);%}'
  14563. ],
  14564. frameTableTpl: [
  14565. '{%this.renderDockedItems(out,values,0);%}',
  14566. '<table><tbody>',
  14567. '<tpl if="top">',
  14568. '<tr>',
  14569. '<tpl if="left"><td id="{fgid}TL" class="{frameCls}-tl {baseCls}-tl {baseCls}-{ui}-tl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tl</tpl>" style="background-position: {tl}; padding-left:{frameWidth}px" role="presentation"></td></tpl>',
  14570. '<td id="{fgid}TC" class="{frameCls}-tc {baseCls}-tc {baseCls}-{ui}-tc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tc</tpl>" style="background-position: {tc}; height: {frameWidth}px" role="presentation"></td>',
  14571. '<tpl if="right"><td id="{fgid}TR" class="{frameCls}-tr {baseCls}-tr {baseCls}-{ui}-tr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tr</tpl>" style="background-position: {tr}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
  14572. '</tr>',
  14573. '</tpl>',
  14574. '<tr>',
  14575. '<tpl if="left"><td id="{fgid}ML" class="{frameCls}-ml {baseCls}-ml {baseCls}-{ui}-ml<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-ml</tpl>" style="background-position: {ml}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
  14576. '<td id="{fgid}MC" class="{frameCls}-mc {baseCls}-mc {baseCls}-{ui}-mc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mc</tpl>" style="background-position: 0 0;" role="presentation">',
  14577. '{%this.applyRenderTpl(out, values)%}',
  14578. '</td>',
  14579. '<tpl if="right"><td id="{fgid}MR" class="{frameCls}-mr {baseCls}-mr {baseCls}-{ui}-mr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mr</tpl>" style="background-position: {mr}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
  14580. '</tr>',
  14581. '<tpl if="bottom">',
  14582. '<tr>',
  14583. '<tpl if="left"><td id="{fgid}BL" class="{frameCls}-bl {baseCls}-bl {baseCls}-{ui}-bl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bl</tpl>" style="background-position: {bl}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
  14584. '<td id="{fgid}BC" class="{frameCls}-bc {baseCls}-bc {baseCls}-{ui}-bc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bc</tpl>" style="background-position: {bc}; height: {frameWidth}px" role="presentation"></td>',
  14585. '<tpl if="right"><td id="{fgid}BR" class="{frameCls}-br {baseCls}-br {baseCls}-{ui}-br<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-br</tpl>" style="background-position: {br}; padding-left: {frameWidth}px" role="presentation"></td></tpl>',
  14586. '</tr>',
  14587. '</tpl>',
  14588. '</tbody></table>',
  14589. '{%this.renderDockedItems(out,values,1);%}'
  14590. ],
  14591. afterRender : function() {
  14592. var me = this,
  14593. data = {},
  14594. protoEl = me.protoEl,
  14595. target = me.getTargetEl(),
  14596. item;
  14597. me.finishRenderChildren();
  14598. if (me.styleHtmlContent) {
  14599. target.addCls(me.styleHtmlCls);
  14600. }
  14601. protoEl.writeTo(data);
  14602. item = data.removed;
  14603. if (item) {
  14604. target.removeCls(item);
  14605. }
  14606. item = data.cls;
  14607. if (item.length) {
  14608. target.addCls(item);
  14609. }
  14610. item = data.style;
  14611. if (data.style) {
  14612. target.setStyle(item);
  14613. }
  14614. me.protoEl = null;
  14615. if (!me.ownerCt) {
  14616. me.updateLayout();
  14617. }
  14618. },
  14619. afterFirstLayout : function(width, height) {
  14620. var me = this,
  14621. hasX = Ext.isDefined(me.x),
  14622. hasY = Ext.isDefined(me.y),
  14623. pos, xy;
  14624. if (me.floating && (!hasX || !hasY)) {
  14625. if (me.floatParent) {
  14626. pos = me.floatParent.getTargetEl().getViewRegion();
  14627. xy = me.el.getAlignToXY(me.floatParent.getTargetEl(), 'c-c');
  14628. pos.left = xy[0] - pos.left;
  14629. pos.top = xy[1] - pos.top;
  14630. } else {
  14631. xy = me.el.getAlignToXY(me.container, 'c-c');
  14632. pos = me.container.translatePoints(xy[0], xy[1]);
  14633. }
  14634. me.x = hasX ? me.x : pos.left;
  14635. me.y = hasY ? me.y : pos.top;
  14636. hasX = hasY = true;
  14637. }
  14638. if (hasX || hasY) {
  14639. me.setPosition(me.x, me.y);
  14640. }
  14641. me.onBoxReady(width, height);
  14642. if (me.hasListeners.boxready) {
  14643. me.fireEvent('boxready', me, width, height);
  14644. }
  14645. },
  14646. onBoxReady: Ext.emptyFn,
  14647. applyRenderSelectors: function() {
  14648. var me = this,
  14649. selectors = me.renderSelectors,
  14650. el = me.el,
  14651. dom = el.dom,
  14652. selector;
  14653. me.applyChildEls(el);
  14654. if (selectors) {
  14655. for (selector in selectors) {
  14656. if (selectors.hasOwnProperty(selector) && selectors[selector]) {
  14657. me[selector] = Ext.get(Ext.DomQuery.selectNode(selectors[selector], dom));
  14658. }
  14659. }
  14660. }
  14661. },
  14662. beforeRender: function () {
  14663. var me = this,
  14664. target = me.getTargetEl(),
  14665. layout = me.getComponentLayout();
  14666. me.frame = me.frame || me.alwaysFramed;
  14667. if (!layout.initialized) {
  14668. layout.initLayout();
  14669. }
  14670. if (target) {
  14671. target.setStyle(me.getOverflowStyle());
  14672. me.overflowStyleSet = true;
  14673. }
  14674. me.setUI(me.ui);
  14675. if (me.disabled) {
  14676. me.disable(true);
  14677. }
  14678. },
  14679. doApplyRenderTpl: function(out, values) {
  14680. var me = values.$comp,
  14681. tpl;
  14682. if (!me.rendered) {
  14683. tpl = me.initRenderTpl();
  14684. tpl.applyOut(values.renderData, out);
  14685. }
  14686. },
  14687. doAutoRender: function() {
  14688. var me = this;
  14689. if (!me.rendered) {
  14690. if (me.floating) {
  14691. me.render(document.body);
  14692. } else {
  14693. me.render(Ext.isBoolean(me.autoRender) ? Ext.getBody() : me.autoRender);
  14694. }
  14695. }
  14696. },
  14697. doRenderContent: function (out, renderData) {
  14698. var me = renderData.$comp;
  14699. if (me.html) {
  14700. Ext.DomHelper.generateMarkup(me.html, out);
  14701. delete me.html;
  14702. }
  14703. if (me.tpl) {
  14704. if (!me.tpl.isTemplate) {
  14705. me.tpl = new Ext.XTemplate(me.tpl);
  14706. }
  14707. if (me.data) {
  14708. me.tpl.applyOut(me.data, out);
  14709. delete me.data;
  14710. }
  14711. }
  14712. },
  14713. doRenderFramingDockedItems: function (out, renderData, after) {
  14714. var me = renderData.$comp;
  14715. if (!me.rendered && me.doRenderDockedItems) {
  14716. renderData.renderData.$skipDockedItems = true;
  14717. me.doRenderDockedItems.call(this, out, renderData, after);
  14718. }
  14719. },
  14720. finishRender: function(containerIdx) {
  14721. var me = this,
  14722. tpl, data, contentEl, el, pre, hide;
  14723. if (!me.el || me.$pid) {
  14724. if (me.container) {
  14725. el = me.container.getById(me.id, true);
  14726. } else {
  14727. el = Ext.getDom(me.id);
  14728. }
  14729. if (!me.el) {
  14730. me.wrapPrimaryEl(el);
  14731. } else {
  14732. delete me.$pid;
  14733. if (!me.el.dom) {
  14734. me.wrapPrimaryEl(me.el);
  14735. }
  14736. el.parentNode.insertBefore(me.el.dom, el);
  14737. Ext.removeNode(el);
  14738. }
  14739. } else if (!me.rendering) {
  14740. tpl = me.initRenderTpl();
  14741. if (tpl) {
  14742. data = me.initRenderData();
  14743. tpl.insertFirst(me.getTargetEl(), data);
  14744. }
  14745. }
  14746. if (!me.container) {
  14747. me.container = Ext.get(me.el.dom.parentNode);
  14748. }
  14749. if (me.ctCls) {
  14750. me.container.addCls(me.ctCls);
  14751. }
  14752. me.onRender(me.container, containerIdx);
  14753. if (!me.overflowStyleSet) {
  14754. me.getTargetEl().setStyle(me.getOverflowStyle());
  14755. }
  14756. me.el.setVisibilityMode(Ext.Element[me.hideMode.toUpperCase()]);
  14757. if (me.overCls) {
  14758. me.el.hover(me.addOverCls, me.removeOverCls, me);
  14759. }
  14760. if (me.hasListeners.render) {
  14761. me.fireEvent('render', me);
  14762. }
  14763. if (me.contentEl) {
  14764. pre = Ext.baseCSSPrefix;
  14765. hide = pre + 'hide-';
  14766. contentEl = Ext.get(me.contentEl);
  14767. contentEl.removeCls([pre+'hidden', hide+'display', hide+'offsets', hide+'nosize']);
  14768. me.getTargetEl().appendChild(contentEl.dom);
  14769. }
  14770. me.afterRender();
  14771. if (me.hasListeners.afterrender) {
  14772. me.fireEvent('afterrender', me);
  14773. }
  14774. me.initEvents();
  14775. if (me.hidden) {
  14776. me.el.hide();
  14777. }
  14778. },
  14779. finishRenderChildren: function () {
  14780. var layout = this.getComponentLayout();
  14781. layout.finishRender();
  14782. },
  14783. getElConfig : function() {
  14784. var me = this,
  14785. autoEl = me.autoEl,
  14786. frameInfo = me.getFrameInfo(),
  14787. config = {
  14788. tag: 'div',
  14789. tpl: frameInfo ? me.initFramingTpl(frameInfo.table) : me.initRenderTpl()
  14790. },
  14791. i, frameElNames, len, suffix, frameGenId;
  14792. me.initStyles(me.protoEl);
  14793. me.protoEl.writeTo(config);
  14794. me.protoEl.flush();
  14795. if (Ext.isString(autoEl)) {
  14796. config.tag = autoEl;
  14797. } else {
  14798. Ext.apply(config, autoEl);
  14799. }
  14800. config.id = me.id;
  14801. if (config.tpl) {
  14802. if (frameInfo) {
  14803. frameElNames = me.frameElNames;
  14804. len = frameElNames.length;
  14805. frameGenId = me.id + '-frame1';
  14806. me.frameGenId = 1;
  14807. config.tplData = Ext.apply({}, {
  14808. $comp: me,
  14809. fgid: frameGenId,
  14810. ui: me.ui,
  14811. uiCls: me.uiCls,
  14812. frameCls: me.frameCls,
  14813. baseCls: me.baseCls,
  14814. frameWidth: frameInfo.maxWidth,
  14815. top: !!frameInfo.top,
  14816. left: !!frameInfo.left,
  14817. right: !!frameInfo.right,
  14818. bottom: !!frameInfo.bottom,
  14819. renderData: me.initRenderData()
  14820. }, me.getFramePositions(frameInfo));
  14821. for (i = 0; i < len; i++) {
  14822. suffix = frameElNames[i];
  14823. me.addChildEls({ name: 'frame' + suffix, id: frameGenId + suffix });
  14824. }
  14825. me.addChildEls({
  14826. name: 'frameBody',
  14827. id: frameGenId + 'MC'
  14828. });
  14829. } else {
  14830. config.tplData = me.initRenderData();
  14831. }
  14832. }
  14833. return config;
  14834. },
  14835. initFramingTpl: function(table) {
  14836. var tpl = table ? this.getTpl('frameTableTpl') : this.getTpl('frameTpl');
  14837. if (tpl && !tpl.applyRenderTpl) {
  14838. this.setupFramingTpl(tpl);
  14839. }
  14840. return tpl;
  14841. },
  14842. setupFramingTpl: function(frameTpl) {
  14843. frameTpl.applyRenderTpl = this.doApplyRenderTpl;
  14844. frameTpl.renderDockedItems = this.doRenderFramingDockedItems;
  14845. },
  14846. getInsertPosition: function(position) {
  14847. if (position !== undefined) {
  14848. if (Ext.isNumber(position)) {
  14849. position = this.container.dom.childNodes[position];
  14850. }
  14851. else {
  14852. position = Ext.getDom(position);
  14853. }
  14854. }
  14855. return position;
  14856. },
  14857. getRenderTree: function() {
  14858. var me = this;
  14859. if (!me.hasListeners.beforerender || me.fireEvent('beforerender', me) !== false) {
  14860. me.beforeRender();
  14861. me.rendering = true;
  14862. if (me.el) {
  14863. return {
  14864. tag: 'div',
  14865. id: (me.$pid = Ext.id())
  14866. };
  14867. }
  14868. return me.getElConfig();
  14869. }
  14870. return null;
  14871. },
  14872. initContainer: function(container) {
  14873. var me = this;
  14874. if (!container && me.el) {
  14875. container = me.el.dom.parentNode;
  14876. me.allowDomMove = false;
  14877. }
  14878. me.container = container.dom ? container : Ext.get(container);
  14879. return me.container;
  14880. },
  14881. initRenderData: function() {
  14882. var me = this;
  14883. return Ext.apply({
  14884. $comp: me,
  14885. id: me.id,
  14886. ui: me.ui,
  14887. uiCls: me.uiCls,
  14888. baseCls: me.baseCls,
  14889. componentCls: me.componentCls,
  14890. frame: me.frame
  14891. }, me.renderData);
  14892. },
  14893. initRenderTpl: function() {
  14894. var tpl = this.getTpl('renderTpl');
  14895. if (tpl && !tpl.renderContent) {
  14896. this.setupRenderTpl(tpl);
  14897. }
  14898. return tpl;
  14899. },
  14900. onRender: function(parentNode, containerIdx) {
  14901. var me = this,
  14902. x = me.x,
  14903. y = me.y,
  14904. lastBox, width, height,
  14905. el = me.el,
  14906. body = Ext.getBody().dom;
  14907. if (Ext.scopeResetCSS && !me.ownerCt) {
  14908. if (el.dom === body) {
  14909. el.parent().addCls(Ext.resetCls);
  14910. }
  14911. else {
  14912. if (me.floating && me.el.dom.parentNode === body) {
  14913. Ext.resetElement.appendChild(me.el);
  14914. }
  14915. else {
  14916. me.resetEl = el.wrap(Ext.resetElementSpec, false, Ext.supports.CSS3LinearGradient ? undefined : '*');
  14917. }
  14918. }
  14919. }
  14920. me.applyRenderSelectors();
  14921. delete me.rendering;
  14922. me.rendered = true;
  14923. lastBox = null;
  14924. if (x !== undefined) {
  14925. lastBox = lastBox || {};
  14926. lastBox.x = x;
  14927. }
  14928. if (y !== undefined) {
  14929. lastBox = lastBox || {};
  14930. lastBox.y = y;
  14931. }
  14932. if (!me.getFrameInfo() && Ext.isBorderBox) {
  14933. width = me.width;
  14934. height = me.height;
  14935. if (typeof width == 'number') {
  14936. lastBox = lastBox || {};
  14937. lastBox.width = width;
  14938. }
  14939. if (typeof height == 'number') {
  14940. lastBox = lastBox || {};
  14941. lastBox.height = height;
  14942. }
  14943. }
  14944. me.lastBox = me.el.lastBox = lastBox;
  14945. },
  14946. render: function(container, position) {
  14947. var me = this,
  14948. el = me.el && (me.el = Ext.get(me.el)),
  14949. vetoed,
  14950. tree,
  14951. nextSibling;
  14952. Ext.suspendLayouts();
  14953. container = me.initContainer(container);
  14954. nextSibling = me.getInsertPosition(position);
  14955. if (!el) {
  14956. tree = me.getRenderTree();
  14957. if (me.ownerLayout && me.ownerLayout.transformItemRenderTree) {
  14958. tree = me.ownerLayout.transformItemRenderTree(tree);
  14959. }
  14960. if (tree) {
  14961. if (nextSibling) {
  14962. el = Ext.DomHelper.insertBefore(nextSibling, tree);
  14963. } else {
  14964. el = Ext.DomHelper.append(container, tree);
  14965. }
  14966. me.wrapPrimaryEl(el);
  14967. }
  14968. } else {
  14969. if (!me.hasListeners.beforerender || me.fireEvent('beforerender', me) !== false) {
  14970. me.initStyles(el);
  14971. if (me.allowDomMove !== false) {
  14972. if (nextSibling) {
  14973. container.dom.insertBefore(el.dom, nextSibling);
  14974. } else {
  14975. container.dom.appendChild(el.dom);
  14976. }
  14977. }
  14978. } else {
  14979. vetoed = true;
  14980. }
  14981. }
  14982. if (el && !vetoed) {
  14983. me.finishRender(position);
  14984. }
  14985. Ext.resumeLayouts(!container.isDetachedBody);
  14986. },
  14987. ensureAttachedToBody: function (runLayout) {
  14988. var comp = this,
  14989. body;
  14990. while (comp.ownerCt) {
  14991. comp = comp.ownerCt;
  14992. }
  14993. if (comp.container.isDetachedBody) {
  14994. comp.container = body = Ext.resetElement;
  14995. body.appendChild(comp.el.dom);
  14996. if (runLayout) {
  14997. comp.updateLayout();
  14998. }
  14999. if (typeof comp.x == 'number' || typeof comp.y == 'number') {
  15000. comp.setPosition(comp.x, comp.y);
  15001. }
  15002. }
  15003. },
  15004. setupRenderTpl: function (renderTpl) {
  15005. renderTpl.renderBody = renderTpl.renderContent = this.doRenderContent;
  15006. },
  15007. wrapPrimaryEl: function (dom) {
  15008. this.el = Ext.get(dom, true);
  15009. },
  15010. initFrame : function() {
  15011. if (Ext.supports.CSS3BorderRadius || !this.frame) {
  15012. return;
  15013. }
  15014. var me = this,
  15015. frameInfo = me.getFrameInfo(),
  15016. frameWidth, frameTpl, frameGenId,
  15017. i,
  15018. frameElNames = me.frameElNames,
  15019. len = frameElNames.length,
  15020. suffix;
  15021. if (frameInfo) {
  15022. frameWidth = frameInfo.maxWidth;
  15023. frameTpl = me.getFrameTpl(frameInfo.table);
  15024. me.frameGenId = frameGenId = (me.frameGenId || 0) + 1;
  15025. frameGenId = me.id + '-frame' + frameGenId;
  15026. frameTpl.insertFirst(me.el, Ext.apply({
  15027. $comp: me,
  15028. fgid: frameGenId,
  15029. ui: me.ui,
  15030. uiCls: me.uiCls,
  15031. frameCls: me.frameCls,
  15032. baseCls: me.baseCls,
  15033. frameWidth: frameWidth,
  15034. top: !!frameInfo.top,
  15035. left: !!frameInfo.left,
  15036. right: !!frameInfo.right,
  15037. bottom: !!frameInfo.bottom
  15038. }, me.getFramePositions(frameInfo)));
  15039. me.frameBody = me.el.down('.' + me.frameCls + '-mc');
  15040. me.removeChildEls(function (c) {
  15041. return c.id && me.frameIdRegex.test(c.id);
  15042. });
  15043. for (i = 0; i < len; i++) {
  15044. suffix = frameElNames[i];
  15045. me['frame' + suffix] = me.el.getById(frameGenId + suffix);
  15046. }
  15047. }
  15048. },
  15049. updateFrame: function() {
  15050. if (Ext.supports.CSS3BorderRadius || !this.frame) {
  15051. return;
  15052. }
  15053. var me = this,
  15054. wasTable = this.frameSize && this.frameSize.table,
  15055. oldFrameTL = this.frameTL,
  15056. oldFrameBL = this.frameBL,
  15057. oldFrameML = this.frameML,
  15058. oldFrameMC = this.frameMC,
  15059. newMCClassName;
  15060. this.initFrame();
  15061. if (oldFrameMC) {
  15062. if (me.frame) {
  15063. newMCClassName = this.frameMC.dom.className;
  15064. oldFrameMC.insertAfter(this.frameMC);
  15065. this.frameMC.remove();
  15066. this.frameBody = this.frameMC = oldFrameMC;
  15067. oldFrameMC.dom.className = newMCClassName;
  15068. if (wasTable) {
  15069. me.el.query('> table')[1].remove();
  15070. }
  15071. else {
  15072. if (oldFrameTL) {
  15073. oldFrameTL.remove();
  15074. }
  15075. if (oldFrameBL) {
  15076. oldFrameBL.remove();
  15077. }
  15078. if (oldFrameML) {
  15079. oldFrameML.remove();
  15080. }
  15081. }
  15082. }
  15083. }
  15084. else if (me.frame) {
  15085. this.applyRenderSelectors();
  15086. }
  15087. },
  15088. getFrameInfo: function() {
  15089. if (Ext.supports.CSS3BorderRadius || !this.frame) {
  15090. return false;
  15091. }
  15092. var me = this,
  15093. frameInfoCache = me.frameInfoCache,
  15094. el = me.el || me.protoEl,
  15095. cls = el.dom ? el.dom.className : el.classList.join(' '),
  15096. frameInfo = frameInfoCache[cls],
  15097. styleEl, left, top, info;
  15098. if (frameInfo == null) {
  15099. styleEl = Ext.fly(me.getStyleProxy(cls), 'frame-style-el');
  15100. left = styleEl.getStyle('background-position-x');
  15101. top = styleEl.getStyle('background-position-y');
  15102. if (!left && !top) {
  15103. info = styleEl.getStyle('background-position').split(' ');
  15104. left = info[0];
  15105. top = info[1];
  15106. }
  15107. frameInfo = me.calculateFrame(left, top);
  15108. if (frameInfo) {
  15109. el.setStyle('background-image', 'none');
  15110. }
  15111. frameInfoCache[cls] = frameInfo;
  15112. }
  15113. me.frame = !!frameInfo;
  15114. me.frameSize = frameInfo;
  15115. return frameInfo;
  15116. },
  15117. calculateFrame: function(left, top){
  15118. if (!(parseInt(left, 10) >= 1000000 && parseInt(top, 10) >= 1000000)) {
  15119. return false;
  15120. }
  15121. var max = Math.max,
  15122. tl = parseInt(left.substr(3, 2), 10),
  15123. tr = parseInt(left.substr(5, 2), 10),
  15124. br = parseInt(top.substr(3, 2), 10),
  15125. bl = parseInt(top.substr(5, 2), 10),
  15126. frameInfo = {
  15127. table: left.substr(0, 3) == '110',
  15128. vertical: top.substr(0, 3) == '110',
  15129. top: max(tl, tr),
  15130. right: max(tr, br),
  15131. bottom: max(bl, br),
  15132. left: max(tl, bl)
  15133. };
  15134. frameInfo.maxWidth = max(frameInfo.top, frameInfo.right, frameInfo.bottom, frameInfo.left);
  15135. frameInfo.width = frameInfo.left + frameInfo.right;
  15136. frameInfo.height = frameInfo.top + frameInfo.bottom;
  15137. return frameInfo;
  15138. },
  15139. getStyleProxy: function(cls) {
  15140. var result = this.styleProxyEl || (Ext.AbstractComponent.prototype.styleProxyEl = Ext.resetElement.createChild({
  15141. style: {
  15142. position: 'absolute',
  15143. top: '-10000px'
  15144. }
  15145. }, null, true));
  15146. result.className = cls;
  15147. return result;
  15148. },
  15149. getFramePositions: function(frameInfo) {
  15150. var me = this,
  15151. frameWidth = frameInfo.maxWidth,
  15152. dock = me.dock,
  15153. positions, tc, bc, ml, mr;
  15154. if (frameInfo.vertical) {
  15155. tc = '0 -' + (frameWidth * 0) + 'px';
  15156. bc = '0 -' + (frameWidth * 1) + 'px';
  15157. if (dock && dock == "right") {
  15158. tc = 'right -' + (frameWidth * 0) + 'px';
  15159. bc = 'right -' + (frameWidth * 1) + 'px';
  15160. }
  15161. positions = {
  15162. tl: '0 -' + (frameWidth * 0) + 'px',
  15163. tr: '0 -' + (frameWidth * 1) + 'px',
  15164. bl: '0 -' + (frameWidth * 2) + 'px',
  15165. br: '0 -' + (frameWidth * 3) + 'px',
  15166. ml: '-' + (frameWidth * 1) + 'px 0',
  15167. mr: 'right 0',
  15168. tc: tc,
  15169. bc: bc
  15170. };
  15171. } else {
  15172. ml = '-' + (frameWidth * 0) + 'px 0';
  15173. mr = 'right 0';
  15174. if (dock && dock == "bottom") {
  15175. ml = 'left bottom';
  15176. mr = 'right bottom';
  15177. }
  15178. positions = {
  15179. tl: '0 -' + (frameWidth * 2) + 'px',
  15180. tr: 'right -' + (frameWidth * 3) + 'px',
  15181. bl: '0 -' + (frameWidth * 4) + 'px',
  15182. br: 'right -' + (frameWidth * 5) + 'px',
  15183. ml: ml,
  15184. mr: mr,
  15185. tc: '0 -' + (frameWidth * 0) + 'px',
  15186. bc: '0 -' + (frameWidth * 1) + 'px'
  15187. };
  15188. }
  15189. return positions;
  15190. },
  15191. getFrameTpl : function(table) {
  15192. return this.getTpl(table ? 'frameTableTpl' : 'frameTpl');
  15193. },
  15194. frameInfoCache: {}
  15195. });
  15196. Ext.define('Ext.state.Provider', {
  15197. mixins: {
  15198. observable: 'Ext.util.Observable'
  15199. },
  15200. prefix: 'ext-',
  15201. constructor : function(config){
  15202. config = config || {};
  15203. var me = this;
  15204. Ext.apply(me, config);
  15205. me.addEvents("statechange");
  15206. me.state = {};
  15207. me.mixins.observable.constructor.call(me);
  15208. },
  15209. get : function(name, defaultValue){
  15210. return typeof this.state[name] == "undefined" ?
  15211. defaultValue : this.state[name];
  15212. },
  15213. clear : function(name){
  15214. var me = this;
  15215. delete me.state[name];
  15216. me.fireEvent("statechange", me, name, null);
  15217. },
  15218. set : function(name, value){
  15219. var me = this;
  15220. me.state[name] = value;
  15221. me.fireEvent("statechange", me, name, value);
  15222. },
  15223. decodeValue : function(value){
  15224. var me = this,
  15225. re = /^(a|n|d|b|s|o|e)\:(.*)$/,
  15226. matches = re.exec(unescape(value)),
  15227. all,
  15228. type,
  15229. keyValue,
  15230. values,
  15231. vLen,
  15232. v;
  15233. if(!matches || !matches[1]){
  15234. return;
  15235. }
  15236. type = matches[1];
  15237. value = matches[2];
  15238. switch (type) {
  15239. case 'e':
  15240. return null;
  15241. case 'n':
  15242. return parseFloat(value);
  15243. case 'd':
  15244. return new Date(Date.parse(value));
  15245. case 'b':
  15246. return (value == '1');
  15247. case 'a':
  15248. all = [];
  15249. if(value != ''){
  15250. values = value.split('^');
  15251. vLen = values.length;
  15252. for (v = 0; v < vLen; v++) {
  15253. value = values[v];
  15254. all.push(me.decodeValue(value));
  15255. }
  15256. }
  15257. return all;
  15258. case 'o':
  15259. all = {};
  15260. if(value != ''){
  15261. values = value.split('^');
  15262. vLen = values.length;
  15263. for (v = 0; v < vLen; v++) {
  15264. value = values[v];
  15265. keyValue = value.split('=');
  15266. all[keyValue[0]] = me.decodeValue(keyValue[1]);
  15267. }
  15268. }
  15269. return all;
  15270. default:
  15271. return value;
  15272. }
  15273. },
  15274. encodeValue : function(value){
  15275. var flat = '',
  15276. i = 0,
  15277. enc,
  15278. len,
  15279. key;
  15280. if (value == null) {
  15281. return 'e:1';
  15282. } else if(typeof value == 'number') {
  15283. enc = 'n:' + value;
  15284. } else if(typeof value == 'boolean') {
  15285. enc = 'b:' + (value ? '1' : '0');
  15286. } else if(Ext.isDate(value)) {
  15287. enc = 'd:' + value.toGMTString();
  15288. } else if(Ext.isArray(value)) {
  15289. for (len = value.length; i < len; i++) {
  15290. flat += this.encodeValue(value[i]);
  15291. if (i != len - 1) {
  15292. flat += '^';
  15293. }
  15294. }
  15295. enc = 'a:' + flat;
  15296. } else if (typeof value == 'object') {
  15297. for (key in value) {
  15298. if (typeof value[key] != 'function' && value[key] !== undefined) {
  15299. flat += key + '=' + this.encodeValue(value[key]) + '^';
  15300. }
  15301. }
  15302. enc = 'o:' + flat.substring(0, flat.length-1);
  15303. } else {
  15304. enc = 's:' + value;
  15305. }
  15306. return escape(enc);
  15307. }
  15308. });
  15309. Ext.define('Ext.state.Manager', {
  15310. singleton: true,
  15311. requires: ['Ext.state.Provider'],
  15312. constructor: function() {
  15313. this.provider = new Ext.state.Provider();
  15314. },
  15315. setProvider : function(stateProvider){
  15316. this.provider = stateProvider;
  15317. },
  15318. get : function(key, defaultValue){
  15319. return this.provider.get(key, defaultValue);
  15320. },
  15321. set : function(key, value){
  15322. this.provider.set(key, value);
  15323. },
  15324. clear : function(key){
  15325. this.provider.clear(key);
  15326. },
  15327. getProvider : function(){
  15328. return this.provider;
  15329. }
  15330. });
  15331. Ext.define('Ext.state.Stateful', {
  15332. mixins: {
  15333. observable: 'Ext.util.Observable'
  15334. },
  15335. requires: ['Ext.state.Manager'],
  15336. stateful: false,
  15337. saveDelay: 100,
  15338. constructor: function(config) {
  15339. var me = this;
  15340. config = config || {};
  15341. if (config.stateful !== undefined) {
  15342. me.stateful = config.stateful;
  15343. }
  15344. if (config.saveDelay !== undefined) {
  15345. me.saveDelay = config.saveDelay;
  15346. }
  15347. me.stateId = me.stateId || config.stateId;
  15348. if (!me.stateEvents) {
  15349. me.stateEvents = [];
  15350. }
  15351. if (config.stateEvents) {
  15352. me.stateEvents.concat(config.stateEvents);
  15353. }
  15354. this.addEvents(
  15355. 'beforestaterestore',
  15356. 'staterestore',
  15357. 'beforestatesave',
  15358. 'statesave'
  15359. );
  15360. me.mixins.observable.constructor.call(me);
  15361. if (me.stateful !== false) {
  15362. me.addStateEvents(me.stateEvents);
  15363. me.initState();
  15364. }
  15365. },
  15366. addStateEvents: function (events) {
  15367. var me = this,
  15368. i, event, stateEventsByName;
  15369. if (me.stateful && me.getStateId()) {
  15370. if (typeof events == 'string') {
  15371. events = Array.prototype.slice.call(arguments, 0);
  15372. }
  15373. stateEventsByName = me.stateEventsByName || (me.stateEventsByName = {});
  15374. for (i = events.length; i--; ) {
  15375. event = events[i];
  15376. if (!stateEventsByName[event]) {
  15377. stateEventsByName[event] = 1;
  15378. me.on(event, me.onStateChange, me);
  15379. }
  15380. }
  15381. }
  15382. },
  15383. onStateChange: function(){
  15384. var me = this,
  15385. delay = me.saveDelay,
  15386. statics, runner;
  15387. if (!me.stateful) {
  15388. return;
  15389. }
  15390. if (delay) {
  15391. if (!me.stateTask) {
  15392. statics = Ext.state.Stateful;
  15393. runner = statics.runner || (statics.runner = new Ext.util.TaskRunner());
  15394. me.stateTask = runner.newTask({
  15395. run: me.saveState,
  15396. scope: me,
  15397. interval: delay,
  15398. repeat: 1
  15399. });
  15400. }
  15401. me.stateTask.start();
  15402. } else {
  15403. me.saveState();
  15404. }
  15405. },
  15406. saveState: function() {
  15407. var me = this,
  15408. id = me.stateful && me.getStateId(),
  15409. hasListeners = me.hasListeners,
  15410. state;
  15411. if (id) {
  15412. state = me.getState() || {};
  15413. if (!hasListeners.beforestatesave || me.fireEvent('beforestatesave', me, state) !== false) {
  15414. Ext.state.Manager.set(id, state);
  15415. if (hasListeners.statesave) {
  15416. me.fireEvent('statesave', me, state);
  15417. }
  15418. }
  15419. }
  15420. },
  15421. getState: function(){
  15422. return null;
  15423. },
  15424. applyState: function(state) {
  15425. if (state) {
  15426. Ext.apply(this, state);
  15427. }
  15428. },
  15429. getStateId: function() {
  15430. var me = this;
  15431. return me.stateId || (me.autoGenId ? null : me.id);
  15432. },
  15433. initState: function(){
  15434. var me = this,
  15435. id = me.stateful && me.getStateId(),
  15436. hasListeners = me.hasListeners,
  15437. state;
  15438. if (id) {
  15439. state = Ext.state.Manager.get(id);
  15440. if (state) {
  15441. state = Ext.apply({}, state);
  15442. if (!hasListeners.beforestaterestore || me.fireEvent('beforestaterestore', me, state) !== false) {
  15443. me.applyState(state);
  15444. if (hasListeners.staterestore) {
  15445. me.fireEvent('staterestore', me, state);
  15446. }
  15447. }
  15448. }
  15449. }
  15450. },
  15451. savePropToState: function (propName, state, stateName) {
  15452. var me = this,
  15453. value = me[propName],
  15454. config = me.initialConfig;
  15455. if (me.hasOwnProperty(propName)) {
  15456. if (!config || config[propName] !== value) {
  15457. if (state) {
  15458. state[stateName || propName] = value;
  15459. }
  15460. return true;
  15461. }
  15462. }
  15463. return false;
  15464. },
  15465. savePropsToState: function (propNames, state) {
  15466. var me = this,
  15467. i, n;
  15468. if (typeof propNames == 'string') {
  15469. me.savePropToState(propNames, state);
  15470. } else {
  15471. for (i = 0, n = propNames.length; i < n; ++i) {
  15472. me.savePropToState(propNames[i], state);
  15473. }
  15474. }
  15475. return state;
  15476. },
  15477. destroy: function(){
  15478. var me = this,
  15479. task = me.stateTask;
  15480. if (task) {
  15481. task.destroy();
  15482. me.stateTask = null;
  15483. }
  15484. me.clearListeners();
  15485. }
  15486. });
  15487. Ext.define('Ext.AbstractComponent', {
  15488. requires: [
  15489. 'Ext.ComponentQuery',
  15490. 'Ext.ComponentManager',
  15491. 'Ext.util.ProtoElement'
  15492. ],
  15493. mixins: {
  15494. observable: 'Ext.util.Observable',
  15495. animate: 'Ext.util.Animate',
  15496. elementCt: 'Ext.util.ElementContainer',
  15497. renderable: 'Ext.util.Renderable',
  15498. state: 'Ext.state.Stateful'
  15499. },
  15500. uses: [
  15501. 'Ext.PluginManager',
  15502. 'Ext.Element',
  15503. 'Ext.DomHelper',
  15504. 'Ext.XTemplate',
  15505. 'Ext.ComponentQuery',
  15506. 'Ext.ComponentLoader',
  15507. 'Ext.EventManager',
  15508. 'Ext.layout.Context',
  15509. 'Ext.layout.Layout',
  15510. 'Ext.layout.component.Auto',
  15511. 'Ext.LoadMask',
  15512. 'Ext.ZIndexManager'
  15513. ],
  15514. statics: {
  15515. AUTO_ID: 1000,
  15516. pendingLayouts: null,
  15517. layoutSuspendCount: 0,
  15518. cancelLayout: function(comp, isDestroying) {
  15519. var context = this.runningLayoutContext || this.pendingLayouts;
  15520. if (context) {
  15521. context.cancelComponent(comp, false, isDestroying);
  15522. }
  15523. },
  15524. flushLayouts: function () {
  15525. var me = this,
  15526. context = me.pendingLayouts;
  15527. if (context && context.invalidQueue.length) {
  15528. me.pendingLayouts = null;
  15529. me.runningLayoutContext = context;
  15530. Ext.override(context, {
  15531. runComplete: function () {
  15532. me.runningLayoutContext = null;
  15533. return this.callParent();
  15534. }
  15535. });
  15536. context.run();
  15537. }
  15538. },
  15539. resumeLayouts: function (flush) {
  15540. if (this.layoutSuspendCount && ! --this.layoutSuspendCount) {
  15541. if (flush) {
  15542. this.flushLayouts();
  15543. }
  15544. }
  15545. },
  15546. suspendLayouts: function () {
  15547. ++this.layoutSuspendCount;
  15548. },
  15549. updateLayout: function (comp, defer) {
  15550. var me = this,
  15551. running = me.runningLayoutContext,
  15552. pending;
  15553. if (running) {
  15554. running.queueInvalidate(comp);
  15555. } else {
  15556. pending = me.pendingLayouts || (me.pendingLayouts = new Ext.layout.Context());
  15557. pending.queueInvalidate(comp);
  15558. if (!defer && !me.layoutSuspendCount && !comp.isLayoutSuspended()) {
  15559. me.flushLayouts();
  15560. }
  15561. }
  15562. }
  15563. },
  15564. isComponent: true,
  15565. getAutoId: function() {
  15566. this.autoGenId = true;
  15567. return ++Ext.AbstractComponent.AUTO_ID;
  15568. },
  15569. deferLayouts: false,
  15570. autoGenId: false,
  15571. renderTpl: '{%this.renderContent(out,values)%}',
  15572. frameSize: { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0 },
  15573. tplWriteMode: 'overwrite',
  15574. baseCls: Ext.baseCSSPrefix + 'component',
  15575. disabledCls: Ext.baseCSSPrefix + 'item-disabled',
  15576. ui: 'default',
  15577. uiCls: [],
  15578. hidden: false,
  15579. disabled: false,
  15580. draggable: false,
  15581. floating: false,
  15582. hideMode: 'display',
  15583. styleHtmlContent: false,
  15584. styleHtmlCls: Ext.baseCSSPrefix + 'html',
  15585. autoShow: false,
  15586. autoRender: false,
  15587. allowDomMove: true,
  15588. rendered: false,
  15589. componentLayoutCounter: 0,
  15590. shrinkWrap: 2,
  15591. weight: 0,
  15592. maskOnDisable: true,
  15593. _isLayoutRoot: false,
  15594. constructor : function(config) {
  15595. var me = this,
  15596. i, len, xhooks;
  15597. if (config) {
  15598. Ext.apply(me, config);
  15599. xhooks = me.xhooks;
  15600. if (xhooks) {
  15601. delete me.xhooks;
  15602. Ext.override(me, xhooks);
  15603. }
  15604. } else {
  15605. config = {};
  15606. }
  15607. me.initialConfig = config;
  15608. me.mixins.elementCt.constructor.call(me);
  15609. me.addEvents(
  15610. 'beforeactivate',
  15611. 'activate',
  15612. 'beforedeactivate',
  15613. 'deactivate',
  15614. 'added',
  15615. 'disable',
  15616. 'enable',
  15617. 'beforeshow',
  15618. 'show',
  15619. 'beforehide',
  15620. 'hide',
  15621. 'removed',
  15622. 'beforerender',
  15623. 'render',
  15624. 'afterrender',
  15625. 'boxready',
  15626. 'beforedestroy',
  15627. 'destroy',
  15628. 'resize',
  15629. 'move',
  15630. 'focus',
  15631. 'blur'
  15632. );
  15633. me.getId();
  15634. me.setupProtoEl();
  15635. if (me.cls) {
  15636. me.initialCls = me.cls;
  15637. me.protoEl.addCls(me.cls);
  15638. }
  15639. if (me.style) {
  15640. me.initialStyle = me.style;
  15641. me.protoEl.setStyle(me.style);
  15642. }
  15643. me.mons = [];
  15644. me.renderData = me.renderData || {};
  15645. me.renderSelectors = me.renderSelectors || {};
  15646. if (me.plugins) {
  15647. me.plugins = me.constructPlugins();
  15648. }
  15649. if (!me.hasListeners) {
  15650. me.hasListeners = new me.HasListeners();
  15651. }
  15652. me.initComponent();
  15653. Ext.ComponentManager.register(me);
  15654. me.mixins.observable.constructor.call(me);
  15655. me.mixins.state.constructor.call(me, config);
  15656. this.addStateEvents('resize');
  15657. if (me.plugins) {
  15658. for (i = 0, len = me.plugins.length; i < len; i++) {
  15659. me.plugins[i] = me.initPlugin(me.plugins[i]);
  15660. }
  15661. }
  15662. me.loader = me.getLoader();
  15663. if (me.renderTo) {
  15664. me.render(me.renderTo);
  15665. }
  15666. if (me.autoShow && !me.isContained) {
  15667. me.show();
  15668. }
  15669. },
  15670. initComponent: function () {
  15671. this.plugins = this.constructPlugins();
  15672. this.setSize(this.width, this.height);
  15673. },
  15674. getState: function() {
  15675. var me = this,
  15676. state = null,
  15677. sizeModel = me.getSizeModel();
  15678. if (sizeModel.width.configured) {
  15679. state = me.addPropertyToState(state, 'width');
  15680. }
  15681. if (sizeModel.height.configured) {
  15682. state = me.addPropertyToState(state, 'height');
  15683. }
  15684. return state;
  15685. },
  15686. addPropertyToState: function (state, propName, value) {
  15687. var me = this,
  15688. len = arguments.length;
  15689. if (len == 3 || me.hasOwnProperty(propName)) {
  15690. if (len < 3) {
  15691. value = me[propName];
  15692. }
  15693. if (value !== me.initialConfig[propName]) {
  15694. (state || (state = {}))[propName] = value;
  15695. }
  15696. }
  15697. return state;
  15698. },
  15699. show: Ext.emptyFn,
  15700. animate: function(animObj) {
  15701. var me = this,
  15702. hasToWidth,
  15703. hasToHeight,
  15704. toHeight,
  15705. toWidth,
  15706. to,
  15707. clearWidth,
  15708. clearHeight,
  15709. curWidth, w, curHeight, h, needsResize;
  15710. animObj = animObj || {};
  15711. to = animObj.to || {};
  15712. if (Ext.fx.Manager.hasFxBlock(me.id)) {
  15713. return me;
  15714. }
  15715. hasToWidth = Ext.isDefined(to.width);
  15716. if (hasToWidth) {
  15717. toWidth = Ext.Number.constrain(to.width, me.minWidth, me.maxWidth);
  15718. }
  15719. hasToHeight = Ext.isDefined(to.height);
  15720. if (hasToHeight) {
  15721. toHeight = Ext.Number.constrain(to.height, me.minHeight, me.maxHeight);
  15722. }
  15723. if (!animObj.dynamic && (hasToWidth || hasToHeight)) {
  15724. curWidth = (animObj.from ? animObj.from.width : undefined) || me.getWidth();
  15725. w = curWidth;
  15726. curHeight = (animObj.from ? animObj.from.height : undefined) || me.getHeight();
  15727. h = curHeight;
  15728. needsResize = false;
  15729. if (hasToHeight && toHeight > curHeight) {
  15730. h = toHeight;
  15731. needsResize = true;
  15732. }
  15733. if (hasToWidth && toWidth > curWidth) {
  15734. w = toWidth;
  15735. needsResize = true;
  15736. }
  15737. if (needsResize) {
  15738. clearWidth = !Ext.isNumber(me.width);
  15739. clearHeight = !Ext.isNumber(me.height);
  15740. me.setSize(w, h);
  15741. me.el.setSize(curWidth, curHeight);
  15742. if (clearWidth) {
  15743. delete me.width;
  15744. }
  15745. if (clearHeight) {
  15746. delete me.height;
  15747. }
  15748. }
  15749. if (hasToWidth) {
  15750. to.width = toWidth;
  15751. }
  15752. if (hasToHeight) {
  15753. to.height = toHeight;
  15754. }
  15755. }
  15756. return me.mixins.animate.animate.apply(me, arguments);
  15757. },
  15758. onHide: function() {
  15759. this.updateLayout({ isRoot: false });
  15760. },
  15761. onShow : function() {
  15762. this.updateLayout({ isRoot: false });
  15763. },
  15764. constructPlugin: function(plugin) {
  15765. if (plugin.ptype && typeof plugin.init != 'function') {
  15766. plugin.cmp = this;
  15767. plugin = Ext.PluginManager.create(plugin);
  15768. }
  15769. else if (typeof plugin == 'string') {
  15770. plugin = Ext.PluginManager.create({
  15771. ptype: plugin,
  15772. cmp: this
  15773. });
  15774. }
  15775. return plugin;
  15776. },
  15777. constructPlugins: function() {
  15778. var me = this,
  15779. plugins,
  15780. result = [],
  15781. i, len;
  15782. if (me.plugins) {
  15783. plugins = Ext.isArray(me.plugins) ? me.plugins : [ me.plugins ];
  15784. for (i = 0, len = plugins.length; i < len; i++) {
  15785. result[i] = me.constructPlugin(plugins[i]);
  15786. }
  15787. return result;
  15788. }
  15789. },
  15790. initPlugin : function(plugin) {
  15791. plugin.init(this);
  15792. return plugin;
  15793. },
  15794. updateAria: Ext.emptyFn,
  15795. registerFloatingItem: function(cmp) {
  15796. var me = this;
  15797. if (!me.floatingDescendants) {
  15798. me.floatingDescendants = new Ext.ZIndexManager(me);
  15799. }
  15800. me.floatingDescendants.register(cmp);
  15801. },
  15802. unregisterFloatingItem: function(cmp) {
  15803. var me = this;
  15804. if (me.floatingDescendants) {
  15805. me.floatingDescendants.unregister(cmp);
  15806. }
  15807. },
  15808. layoutSuspendCount: 0,
  15809. suspendLayouts: function () {
  15810. var me = this;
  15811. if (!me.rendered) {
  15812. return;
  15813. }
  15814. if (++me.layoutSuspendCount == 1) {
  15815. me.suspendLayout = true;
  15816. }
  15817. },
  15818. resumeLayouts: function (flushOptions) {
  15819. var me = this;
  15820. if (!me.rendered) {
  15821. return;
  15822. }
  15823. if (! --me.layoutSuspendCount) {
  15824. me.suspendLayout = false;
  15825. if (flushOptions && !me.isLayoutSuspended()) {
  15826. me.updateLayout(flushOptions);
  15827. }
  15828. }
  15829. },
  15830. setupProtoEl: function() {
  15831. var me = this,
  15832. cls = [ me.baseCls, me.getComponentLayout().targetCls ];
  15833. if (Ext.isDefined(me.cmpCls)) {
  15834. if (Ext.isDefined(Ext.global.console)) {
  15835. Ext.global.console.warn('Ext.Component: cmpCls has been deprecated. Please use componentCls.');
  15836. }
  15837. me.componentCls = me.cmpCls;
  15838. delete me.cmpCls;
  15839. }
  15840. if (me.componentCls) {
  15841. cls.push(me.componentCls);
  15842. } else {
  15843. me.componentCls = me.baseCls;
  15844. }
  15845. me.protoEl = new Ext.util.ProtoElement({
  15846. cls: cls.join(' ')
  15847. });
  15848. },
  15849. setUI: function(ui) {
  15850. var me = this,
  15851. oldUICls = Ext.Array.clone(me.uiCls),
  15852. newUICls = [],
  15853. classes = [],
  15854. cls,
  15855. i;
  15856. for (i = 0; i < oldUICls.length; i++) {
  15857. cls = oldUICls[i];
  15858. classes = classes.concat(me.removeClsWithUI(cls, true));
  15859. newUICls.push(cls);
  15860. }
  15861. if (classes.length) {
  15862. me.removeCls(classes);
  15863. }
  15864. me.removeUIFromElement();
  15865. me.ui = ui;
  15866. me.addUIToElement();
  15867. classes = [];
  15868. for (i = 0; i < newUICls.length; i++) {
  15869. cls = newUICls[i];
  15870. classes = classes.concat(me.addClsWithUI(cls, true));
  15871. }
  15872. if (classes.length) {
  15873. me.addCls(classes);
  15874. }
  15875. if (me.rendered) {
  15876. me.updateLayout();
  15877. }
  15878. },
  15879. addClsWithUI: function(classes, skip) {
  15880. var me = this,
  15881. clsArray = [],
  15882. length,
  15883. i = 0,
  15884. cls;
  15885. if (typeof classes === "string") {
  15886. classes = (classes.indexOf(' ') < 0) ? [classes] : Ext.String.splitWords(classes);
  15887. }
  15888. length = classes.length;
  15889. me.uiCls = Ext.Array.clone(me.uiCls);
  15890. for (; i < length; i++) {
  15891. cls = classes[i];
  15892. if (cls && !me.hasUICls(cls)) {
  15893. me.uiCls.push(cls);
  15894. clsArray = clsArray.concat(me.addUIClsToElement(cls));
  15895. }
  15896. }
  15897. if (skip !== true) {
  15898. me.addCls(clsArray);
  15899. }
  15900. return clsArray;
  15901. },
  15902. removeClsWithUI: function(classes, skip) {
  15903. var me = this,
  15904. clsArray = [],
  15905. i = 0,
  15906. length, cls;
  15907. if (typeof classes === "string") {
  15908. classes = (classes.indexOf(' ') < 0) ? [classes] : Ext.String.splitWords(classes);
  15909. }
  15910. length = classes.length;
  15911. for (i = 0; i < length; i++) {
  15912. cls = classes[i];
  15913. if (cls && me.hasUICls(cls)) {
  15914. me.uiCls = Ext.Array.remove(me.uiCls, cls);
  15915. clsArray = clsArray.concat(me.removeUIClsFromElement(cls));
  15916. }
  15917. }
  15918. if (skip !== true) {
  15919. me.removeCls(clsArray);
  15920. }
  15921. return clsArray;
  15922. },
  15923. hasUICls: function(cls) {
  15924. var me = this,
  15925. uiCls = me.uiCls || [];
  15926. return Ext.Array.contains(uiCls, cls);
  15927. },
  15928. frameElementsArray: ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'],
  15929. addUIClsToElement: function(cls) {
  15930. var me = this,
  15931. baseClsUi = me.baseCls + '-' + me.ui + '-' + cls,
  15932. result = [Ext.baseCSSPrefix + cls, me.baseCls + '-' + cls, baseClsUi],
  15933. frameElementCls = me.frameElementCls,
  15934. frameElementsArray, frameElementsLength, i, el, frameElement, c;
  15935. if (me.frame && !Ext.supports.CSS3BorderRadius) {
  15936. frameElementsArray = me.frameElementsArray;
  15937. frameElementsLength = frameElementsArray.length;
  15938. i = 0;
  15939. for (; i < frameElementsLength; i++) {
  15940. frameElement = frameElementsArray[i];
  15941. el = me['frame' + frameElement.toUpperCase()];
  15942. c = baseClsUi + '-' + frameElement;
  15943. if (el && el.dom) {
  15944. el.addCls(c);
  15945. } else if (Ext.Array.indexOf(frameElementCls[frameElement], c) == -1) {
  15946. frameElementCls[frameElement].push(c);
  15947. }
  15948. }
  15949. }
  15950. me.frameElementCls = frameElementCls;
  15951. return result;
  15952. },
  15953. removeUIClsFromElement: function(cls) {
  15954. var me = this,
  15955. baseClsUi = me.baseCls + '-' + me.ui + '-' + cls,
  15956. result = [Ext.baseCSSPrefix + cls, me.baseCls + '-' + cls, baseClsUi],
  15957. frameElementCls = me.frameElementCls,
  15958. frameElementsArray, frameElementsLength, i, el, frameElement, c;
  15959. if (me.frame && !Ext.supports.CSS3BorderRadius) {
  15960. frameElementsArray = me.frameElementsArray;
  15961. frameElementsLength = frameElementsArray.length;
  15962. i = 0;
  15963. for (; i < frameElementsLength; i++) {
  15964. frameElement = frameElementsArray[i];
  15965. el = me['frame' + frameElement.toUpperCase()];
  15966. c = baseClsUi + '-' + frameElement;
  15967. if (el && el.dom) {
  15968. el.addCls(c);
  15969. } else {
  15970. Ext.Array.remove(frameElementCls[frameElement], c);
  15971. }
  15972. }
  15973. }
  15974. me.frameElementCls = frameElementCls;
  15975. return result;
  15976. },
  15977. addUIToElement: function() {
  15978. var me = this,
  15979. baseClsUI = me.baseCls + '-' + me.ui,
  15980. frameElementCls = me.frameElementCls,
  15981. frameElementsArray, frameElementsLength, i, el, frameElement, c;
  15982. me.addCls(baseClsUI);
  15983. if (me.frame && !Ext.supports.CSS3BorderRadius) {
  15984. frameElementsArray = me.frameElementsArray;
  15985. frameElementsLength = frameElementsArray.length;
  15986. i = 0;
  15987. for (; i < frameElementsLength; i++) {
  15988. frameElement = frameElementsArray[i];
  15989. el = me['frame' + frameElement.toUpperCase()];
  15990. c = baseClsUI + '-' + frameElement;
  15991. if (el) {
  15992. el.addCls(c);
  15993. } else {
  15994. if (!Ext.Array.contains(frameElementCls[frameElement], c)) {
  15995. frameElementCls[frameElement].push(c);
  15996. }
  15997. }
  15998. }
  15999. }
  16000. },
  16001. removeUIFromElement: function() {
  16002. var me = this,
  16003. baseClsUI = me.baseCls + '-' + me.ui,
  16004. frameElementCls = me.frameElementCls,
  16005. frameElementsArray, frameElementsLength, i, el, frameElement, c;
  16006. me.removeCls(baseClsUI);
  16007. if (me.frame && !Ext.supports.CSS3BorderRadius) {
  16008. frameElementsArray = me.frameElementsArray;
  16009. frameElementsLength = frameElementsArray.length;
  16010. i = 0;
  16011. for (; i < frameElementsLength; i++) {
  16012. frameElement = frameElementsArray[i];
  16013. el = me['frame' + frameElement.toUpperCase()];
  16014. c = baseClsUI + '-' + frameElement;
  16015. if (el) {
  16016. el.removeCls(c);
  16017. } else {
  16018. Ext.Array.remove(frameElementCls[frameElement], c);
  16019. }
  16020. }
  16021. }
  16022. },
  16023. getTpl: function(name) {
  16024. return Ext.XTemplate.getTpl(this, name);
  16025. },
  16026. initStyles: function(targetEl) {
  16027. var me = this,
  16028. Element = Ext.Element,
  16029. padding = me.padding,
  16030. margin = me.margin,
  16031. x = me.x,
  16032. y = me.y,
  16033. width, height;
  16034. if (padding !== undefined) {
  16035. targetEl.setStyle('padding', Element.unitizeBox((padding === true) ? 5 : padding));
  16036. }
  16037. if (margin !== undefined) {
  16038. targetEl.setStyle('margin', Element.unitizeBox((margin === true) ? 5 : margin));
  16039. }
  16040. if (me.border !== undefined) {
  16041. me.setBorder(me.border, targetEl);
  16042. }
  16043. if (me.cls && me.cls != me.initialCls) {
  16044. targetEl.addCls(me.cls);
  16045. delete me.cls;
  16046. delete me.initialCls;
  16047. }
  16048. if (me.style && me.style != me.initialStyle) {
  16049. targetEl.setStyle(me.style);
  16050. delete me.style;
  16051. delete me.initialStyle;
  16052. }
  16053. if (x !== undefined) {
  16054. targetEl.setStyle('left', (typeof x == 'number') ? (x + 'px') : x);
  16055. }
  16056. if (y !== undefined) {
  16057. targetEl.setStyle('top', (typeof y == 'number') ? (y + 'px') : y);
  16058. }
  16059. if (!me.getFrameInfo()) {
  16060. width = me.width;
  16061. height = me.height;
  16062. if (width !== undefined) {
  16063. if (typeof width === 'number') {
  16064. if (Ext.isBorderBox) {
  16065. targetEl.setStyle('width', width + 'px');
  16066. }
  16067. } else {
  16068. targetEl.setStyle('width', width);
  16069. }
  16070. }
  16071. if (height !== undefined) {
  16072. if (typeof height === 'number') {
  16073. if (Ext.isBorderBox) {
  16074. targetEl.setStyle('height', height + 'px');
  16075. }
  16076. } else {
  16077. targetEl.setStyle('height', height);
  16078. }
  16079. }
  16080. }
  16081. },
  16082. initEvents : function() {
  16083. var me = this,
  16084. afterRenderEvents = me.afterRenderEvents,
  16085. el,
  16086. property,
  16087. fn = function(listeners){
  16088. me.mon(el, listeners);
  16089. };
  16090. if (afterRenderEvents) {
  16091. for (property in afterRenderEvents) {
  16092. if (afterRenderEvents.hasOwnProperty(property)) {
  16093. el = me[property];
  16094. if (el && el.on) {
  16095. Ext.each(afterRenderEvents[property], fn);
  16096. }
  16097. }
  16098. }
  16099. }
  16100. me.addFocusListener();
  16101. },
  16102. addFocusListener: function() {
  16103. var me = this,
  16104. focusEl = me.getFocusEl(),
  16105. needsTabIndex;
  16106. if (focusEl) {
  16107. if (focusEl.isComponent) {
  16108. return focusEl.addFocusListener();
  16109. }
  16110. needsTabIndex = focusEl.needsTabIndex();
  16111. if (!me.focusListenerAdded && (!needsTabIndex || Ext.FocusManager.enabled)) {
  16112. if (needsTabIndex) {
  16113. focusEl.dom.tabIndex = -1;
  16114. }
  16115. focusEl.on({
  16116. focus: me.onFocus,
  16117. blur: me.onBlur,
  16118. scope: me
  16119. });
  16120. me.focusListenerAdded = true;
  16121. }
  16122. }
  16123. },
  16124. getFocusEl: Ext.emptyFn,
  16125. isFocusable: function(c) {
  16126. var me = this,
  16127. focusEl;
  16128. if ((me.focusable !== false) && (focusEl = me.getFocusEl()) && me.rendered && !me.destroying && !me.isDestroyed && !me.disabled && me.isVisible(true)) {
  16129. if (focusEl.isComponent) {
  16130. return focusEl.isFocusable();
  16131. }
  16132. return focusEl && focusEl.dom && focusEl.isVisible();
  16133. }
  16134. },
  16135. preFocus: Ext.emptyFn,
  16136. onFocus: function(e) {
  16137. var me = this,
  16138. focusCls = me.focusCls,
  16139. focusEl = me.getFocusEl();
  16140. if (!me.disabled) {
  16141. me.preFocus(e);
  16142. if (focusCls && focusEl) {
  16143. focusEl.addCls(me.addClsWithUI(focusCls, true));
  16144. }
  16145. if (!me.hasFocus) {
  16146. me.hasFocus = true;
  16147. me.fireEvent('focus', me, e);
  16148. }
  16149. }
  16150. },
  16151. beforeBlur : Ext.emptyFn,
  16152. onBlur : function(e) {
  16153. var me = this,
  16154. focusCls = me.focusCls,
  16155. focusEl = me.getFocusEl();
  16156. if (me.destroying) {
  16157. return;
  16158. }
  16159. me.beforeBlur(e);
  16160. if (focusCls && focusEl) {
  16161. focusEl.removeCls(me.removeClsWithUI(focusCls, true));
  16162. }
  16163. if (me.validateOnBlur) {
  16164. me.validate();
  16165. }
  16166. me.hasFocus = false;
  16167. me.fireEvent('blur', me, e);
  16168. me.postBlur(e);
  16169. },
  16170. postBlur : Ext.emptyFn,
  16171. is: function(selector) {
  16172. return Ext.ComponentQuery.is(this, selector);
  16173. },
  16174. up: function(selector) {
  16175. var result = this.getBubbleTarget();
  16176. if (selector) {
  16177. for (; result; result = result.getBubbleTarget()) {
  16178. if (Ext.ComponentQuery.is(result, selector)) {
  16179. return result;
  16180. }
  16181. }
  16182. }
  16183. return result;
  16184. },
  16185. nextSibling: function(selector) {
  16186. var o = this.ownerCt, it, last, idx, c;
  16187. if (o) {
  16188. it = o.items;
  16189. idx = it.indexOf(this) + 1;
  16190. if (idx) {
  16191. if (selector) {
  16192. for (last = it.getCount(); idx < last; idx++) {
  16193. if ((c = it.getAt(idx)).is(selector)) {
  16194. return c;
  16195. }
  16196. }
  16197. } else {
  16198. if (idx < it.getCount()) {
  16199. return it.getAt(idx);
  16200. }
  16201. }
  16202. }
  16203. }
  16204. return null;
  16205. },
  16206. previousSibling: function(selector) {
  16207. var o = this.ownerCt, it, idx, c;
  16208. if (o) {
  16209. it = o.items;
  16210. idx = it.indexOf(this);
  16211. if (idx != -1) {
  16212. if (selector) {
  16213. for (--idx; idx >= 0; idx--) {
  16214. if ((c = it.getAt(idx)).is(selector)) {
  16215. return c;
  16216. }
  16217. }
  16218. } else {
  16219. if (idx) {
  16220. return it.getAt(--idx);
  16221. }
  16222. }
  16223. }
  16224. }
  16225. return null;
  16226. },
  16227. previousNode: function(selector, includeSelf) {
  16228. var node = this,
  16229. ownerCt = node.ownerCt,
  16230. result,
  16231. it, i, sib;
  16232. if (includeSelf && node.is(selector)) {
  16233. return node;
  16234. }
  16235. if (ownerCt) {
  16236. for (it = ownerCt.items.items, i = Ext.Array.indexOf(it, node) - 1; i > -1; i--) {
  16237. sib = it[i];
  16238. if (sib.query) {
  16239. result = sib.query(selector);
  16240. result = result[result.length - 1];
  16241. if (result) {
  16242. return result;
  16243. }
  16244. }
  16245. if (sib.is(selector)) {
  16246. return sib;
  16247. }
  16248. }
  16249. return ownerCt.previousNode(selector, true);
  16250. }
  16251. return null;
  16252. },
  16253. nextNode: function(selector, includeSelf) {
  16254. var node = this,
  16255. ownerCt = node.ownerCt,
  16256. result,
  16257. it, len, i, sib;
  16258. if (includeSelf && node.is(selector)) {
  16259. return node;
  16260. }
  16261. if (ownerCt) {
  16262. for (it = ownerCt.items.items, i = Ext.Array.indexOf(it, node) + 1, len = it.length; i < len; i++) {
  16263. sib = it[i];
  16264. if (sib.is(selector)) {
  16265. return sib;
  16266. }
  16267. if (sib.down) {
  16268. result = sib.down(selector);
  16269. if (result) {
  16270. return result;
  16271. }
  16272. }
  16273. }
  16274. return ownerCt.nextNode(selector);
  16275. }
  16276. return null;
  16277. },
  16278. getId : function() {
  16279. return this.id || (this.id = 'ext-comp-' + (this.getAutoId()));
  16280. },
  16281. getItemId : function() {
  16282. return this.itemId || this.id;
  16283. },
  16284. getEl : function() {
  16285. return this.el;
  16286. },
  16287. getTargetEl: function() {
  16288. return this.frameBody || this.el;
  16289. },
  16290. getOverflowStyle: function() {
  16291. var me = this,
  16292. result = null;
  16293. if (typeof me.autoScroll == 'boolean') {
  16294. result = {
  16295. overflow: me.autoScroll ? 'auto' : ''
  16296. };
  16297. } else if (me.overflowX !== undefined || me.overflowY !== undefined) {
  16298. result = {
  16299. 'overflow-x': (me.overflowX||''),
  16300. 'overflow-y': (me.overflowY||'')
  16301. };
  16302. }
  16303. if (result && (Ext.isIE6 || Ext.isIE7)) {
  16304. result.position = 'relative';
  16305. }
  16306. return result;
  16307. },
  16308. isXType: function(xtype, shallow) {
  16309. if (shallow) {
  16310. return this.xtype === xtype;
  16311. }
  16312. else {
  16313. return this.xtypesMap[xtype];
  16314. }
  16315. },
  16316. getXTypes: function() {
  16317. var self = this.self,
  16318. xtypes, parentPrototype, parentXtypes;
  16319. if (!self.xtypes) {
  16320. xtypes = [];
  16321. parentPrototype = this;
  16322. while (parentPrototype) {
  16323. parentXtypes = parentPrototype.xtypes;
  16324. if (parentXtypes !== undefined) {
  16325. xtypes.unshift.apply(xtypes, parentXtypes);
  16326. }
  16327. parentPrototype = parentPrototype.superclass;
  16328. }
  16329. self.xtypeChain = xtypes;
  16330. self.xtypes = xtypes.join('/');
  16331. }
  16332. return self.xtypes;
  16333. },
  16334. update : function(htmlOrData, loadScripts, cb) {
  16335. var me = this;
  16336. if (me.tpl && !Ext.isString(htmlOrData)) {
  16337. me.data = htmlOrData;
  16338. if (me.rendered) {
  16339. me.tpl[me.tplWriteMode](me.getTargetEl(), htmlOrData || {});
  16340. }
  16341. } else {
  16342. me.html = Ext.isObject(htmlOrData) ? Ext.DomHelper.markup(htmlOrData) : htmlOrData;
  16343. if (me.rendered) {
  16344. me.getTargetEl().update(me.html, loadScripts, cb);
  16345. }
  16346. }
  16347. if (me.rendered) {
  16348. me.updateLayout();
  16349. }
  16350. },
  16351. setVisible : function(visible) {
  16352. return this[visible ? 'show': 'hide']();
  16353. },
  16354. isVisible: function(deep) {
  16355. var me = this,
  16356. child = me,
  16357. visible = me.rendered && !me.hidden,
  16358. ancestor = me.ownerCt;
  16359. me.hiddenAncestor = false;
  16360. if (me.destroyed) {
  16361. return false;
  16362. }
  16363. if (deep && visible && ancestor) {
  16364. while (ancestor) {
  16365. if (ancestor.hidden || (ancestor.collapsed &&
  16366. !(ancestor.getDockedItems && Ext.Array.contains(ancestor.getDockedItems(), child)))) {
  16367. me.hiddenAncestor = ancestor;
  16368. visible = false;
  16369. break;
  16370. }
  16371. child = ancestor;
  16372. ancestor = ancestor.ownerCt;
  16373. }
  16374. }
  16375. return visible;
  16376. },
  16377. onBoxReady: function(){
  16378. var me = this;
  16379. if (me.disableOnBoxReady) {
  16380. me.onDisable();
  16381. } else if (me.enableOnBoxReady) {
  16382. me.onEnable();
  16383. }
  16384. if (me.resizable) {
  16385. me.initResizable(me.resizable);
  16386. }
  16387. if (me.draggable) {
  16388. me.initDraggable();
  16389. }
  16390. },
  16391. enable: function(silent) {
  16392. var me = this;
  16393. delete me.disableOnBoxReady;
  16394. me.removeCls(me.disabledCls);
  16395. if (me.rendered) {
  16396. me.onEnable();
  16397. } else {
  16398. me.enableOnBoxReady = true;
  16399. }
  16400. me.disabled = false;
  16401. delete me.resetDisable;
  16402. if (silent !== true) {
  16403. me.fireEvent('enable', me);
  16404. }
  16405. return me;
  16406. },
  16407. disable: function(silent) {
  16408. var me = this;
  16409. delete me.enableOnBoxReady;
  16410. me.addCls(me.disabledCls);
  16411. if (me.rendered) {
  16412. me.onDisable();
  16413. } else {
  16414. me.disableOnBoxReady = true;
  16415. }
  16416. me.disabled = true;
  16417. if (silent !== true) {
  16418. delete me.resetDisable;
  16419. me.fireEvent('disable', me);
  16420. }
  16421. return me;
  16422. },
  16423. onEnable: function() {
  16424. if (this.maskOnDisable) {
  16425. this.el.dom.disabled = false;
  16426. this.unmask();
  16427. }
  16428. },
  16429. onDisable : function() {
  16430. var me = this,
  16431. focusCls = me.focusCls,
  16432. focusEl = me.getFocusEl();
  16433. if (focusCls && focusEl) {
  16434. focusEl.removeCls(me.removeClsWithUI(focusCls, true));
  16435. }
  16436. if (me.maskOnDisable) {
  16437. me.el.dom.disabled = true;
  16438. me.mask();
  16439. }
  16440. },
  16441. mask: function() {
  16442. var box = this.lastBox,
  16443. target = this.getMaskTarget(),
  16444. args = [];
  16445. if (box) {
  16446. args[2] = box.height;
  16447. }
  16448. target.mask.apply(target, args);
  16449. },
  16450. unmask: function() {
  16451. this.getMaskTarget().unmask();
  16452. },
  16453. getMaskTarget: function(){
  16454. return this.el;
  16455. },
  16456. isDisabled : function() {
  16457. return this.disabled;
  16458. },
  16459. setDisabled : function(disabled) {
  16460. return this[disabled ? 'disable': 'enable']();
  16461. },
  16462. isHidden : function() {
  16463. return this.hidden;
  16464. },
  16465. addCls : function(cls) {
  16466. var me = this,
  16467. el = me.rendered ? me.el : me.protoEl;
  16468. el.addCls.apply(el, arguments);
  16469. return me;
  16470. },
  16471. addClass : function() {
  16472. return this.addCls.apply(this, arguments);
  16473. },
  16474. hasCls: function (cls) {
  16475. var me = this,
  16476. el = me.rendered ? me.el : me.protoEl;
  16477. return el.hasCls.apply(el, arguments);
  16478. },
  16479. removeCls : function(cls) {
  16480. var me = this,
  16481. el = me.rendered ? me.el : me.protoEl;
  16482. el.removeCls.apply(el, arguments);
  16483. return me;
  16484. },
  16485. addOverCls: function() {
  16486. var me = this;
  16487. if (!me.disabled) {
  16488. me.el.addCls(me.overCls);
  16489. }
  16490. },
  16491. removeOverCls: function() {
  16492. this.el.removeCls(this.overCls);
  16493. },
  16494. addListener : function(element, listeners, scope, options) {
  16495. var me = this,
  16496. fn,
  16497. option;
  16498. if (Ext.isString(element) && (Ext.isObject(listeners) || options && options.element)) {
  16499. if (options.element) {
  16500. fn = listeners;
  16501. listeners = {};
  16502. listeners[element] = fn;
  16503. element = options.element;
  16504. if (scope) {
  16505. listeners.scope = scope;
  16506. }
  16507. for (option in options) {
  16508. if (options.hasOwnProperty(option)) {
  16509. if (me.eventOptionsRe.test(option)) {
  16510. listeners[option] = options[option];
  16511. }
  16512. }
  16513. }
  16514. }
  16515. if (me[element] && me[element].on) {
  16516. me.mon(me[element], listeners);
  16517. } else {
  16518. me.afterRenderEvents = me.afterRenderEvents || {};
  16519. if (!me.afterRenderEvents[element]) {
  16520. me.afterRenderEvents[element] = [];
  16521. }
  16522. me.afterRenderEvents[element].push(listeners);
  16523. }
  16524. }
  16525. return me.mixins.observable.addListener.apply(me, arguments);
  16526. },
  16527. removeManagedListenerItem: function(isClear, managedListener, item, ename, fn, scope){
  16528. var me = this,
  16529. element = managedListener.options ? managedListener.options.element : null;
  16530. if (element) {
  16531. element = me[element];
  16532. if (element && element.un) {
  16533. if (isClear || (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope))) {
  16534. element.un(managedListener.ename, managedListener.fn, managedListener.scope);
  16535. if (!isClear) {
  16536. Ext.Array.remove(me.managedListeners, managedListener);
  16537. }
  16538. }
  16539. }
  16540. } else {
  16541. return me.mixins.observable.removeManagedListenerItem.apply(me, arguments);
  16542. }
  16543. },
  16544. getBubbleTarget : function() {
  16545. return this.ownerCt;
  16546. },
  16547. isFloating : function() {
  16548. return this.floating;
  16549. },
  16550. isDraggable : function() {
  16551. return !!this.draggable;
  16552. },
  16553. isDroppable : function() {
  16554. return !!this.droppable;
  16555. },
  16556. onAdded : function(container, pos) {
  16557. var me = this;
  16558. me.ownerCt = container;
  16559. if (me.hasListeners.added) {
  16560. me.fireEvent('added', me, container, pos);
  16561. }
  16562. },
  16563. onRemoved : function(destroying) {
  16564. var me = this;
  16565. if (me.hasListeners.removed) {
  16566. me.fireEvent('removed', me, me.ownerCt);
  16567. }
  16568. delete me.ownerCt;
  16569. delete me.ownerLayout;
  16570. },
  16571. beforeDestroy : Ext.emptyFn,
  16572. onResize : Ext.emptyFn,
  16573. setSize : function(width, height) {
  16574. var me = this;
  16575. if (width && typeof width == 'object') {
  16576. height = width.height;
  16577. width = width.width;
  16578. }
  16579. if (typeof width == 'number') {
  16580. me.width = Ext.Number.constrain(width, me.minWidth, me.maxWidth);
  16581. } else if (width === null) {
  16582. delete me.width;
  16583. }
  16584. if (typeof height == 'number') {
  16585. me.height = Ext.Number.constrain(height, me.minHeight, me.maxHeight);
  16586. } else if (height === null) {
  16587. delete me.height;
  16588. }
  16589. if (me.rendered && me.isVisible()) {
  16590. me.updateLayout({
  16591. isRoot: false
  16592. });
  16593. }
  16594. return me;
  16595. },
  16596. isLayoutRoot: function() {
  16597. var me = this,
  16598. ownerLayout = me.ownerLayout;
  16599. if (!ownerLayout || me._isLayoutRoot || me.floating) {
  16600. return true;
  16601. }
  16602. return ownerLayout.isItemLayoutRoot(me);
  16603. },
  16604. isLayoutSuspended: function () {
  16605. var comp = this,
  16606. ownerLayout;
  16607. while (comp) {
  16608. if (comp.layoutSuspendCount || comp.suspendLayout) {
  16609. return true;
  16610. }
  16611. ownerLayout = comp.ownerLayout;
  16612. if (!ownerLayout) {
  16613. break;
  16614. }
  16615. comp = ownerLayout.owner;
  16616. }
  16617. return false;
  16618. },
  16619. updateLayout: function (options) {
  16620. var me = this,
  16621. defer,
  16622. isRoot = options && options.isRoot;
  16623. if (!me.rendered || me.layoutSuspendCount || me.suspendLayout) {
  16624. return;
  16625. }
  16626. if (me.hidden) {
  16627. Ext.AbstractComponent.cancelLayout(me);
  16628. } else if (typeof isRoot != 'boolean') {
  16629. isRoot = me.isLayoutRoot();
  16630. }
  16631. if (isRoot || !me.ownerLayout || !me.ownerLayout.onContentChange(me)) {
  16632. if (!me.isLayoutSuspended()) {
  16633. defer = (options && options.hasOwnProperty('defer')) ? options.defer : me.deferLayouts;
  16634. Ext.AbstractComponent.updateLayout(me, defer);
  16635. }
  16636. }
  16637. },
  16638. getSizeModel: function (ownerCtSizeModel) {
  16639. var me = this,
  16640. models = Ext.layout.SizeModel,
  16641. ownerContext = me.componentLayout.ownerContext,
  16642. width = me.width,
  16643. height = me.height,
  16644. typeofWidth, typeofHeight,
  16645. hasPixelWidth, hasPixelHeight,
  16646. heightModel, ownerLayout, policy, shrinkWrap, topLevel, widthModel;
  16647. if (ownerContext) {
  16648. widthModel = ownerContext.widthModel;
  16649. heightModel = ownerContext.heightModel;
  16650. }
  16651. if (!widthModel || !heightModel) {
  16652. hasPixelWidth = ((typeofWidth = typeof width) == 'number');
  16653. hasPixelHeight = ((typeofHeight = typeof height) == 'number');
  16654. topLevel = me.floating || !(ownerLayout = me.ownerLayout);
  16655. if (topLevel) {
  16656. policy = Ext.layout.Layout.prototype.autoSizePolicy;
  16657. shrinkWrap = me.floating ? 3 : me.shrinkWrap;
  16658. if (hasPixelWidth) {
  16659. widthModel = models.configured;
  16660. }
  16661. if (hasPixelHeight) {
  16662. heightModel = models.configured;
  16663. }
  16664. } else {
  16665. policy = ownerLayout.getItemSizePolicy(me, ownerCtSizeModel);
  16666. shrinkWrap = ownerLayout.isItemShrinkWrap(me);
  16667. }
  16668. shrinkWrap = (shrinkWrap === true) ? 3 : (shrinkWrap || 0);
  16669. if (topLevel && shrinkWrap) {
  16670. if (width && typeofWidth == 'string') {
  16671. shrinkWrap &= 2;
  16672. }
  16673. if (height && typeofHeight == 'string') {
  16674. shrinkWrap &= 1;
  16675. }
  16676. }
  16677. if (shrinkWrap !== 3) {
  16678. if (!ownerCtSizeModel) {
  16679. ownerCtSizeModel = me.ownerCt && me.ownerCt.getSizeModel();
  16680. }
  16681. if (ownerCtSizeModel) {
  16682. shrinkWrap |= (ownerCtSizeModel.width.shrinkWrap ? 1 : 0) | (ownerCtSizeModel.height.shrinkWrap ? 2 : 0);
  16683. }
  16684. }
  16685. if (!widthModel) {
  16686. if (!policy.setsWidth) {
  16687. if (hasPixelWidth) {
  16688. widthModel = models.configured;
  16689. } else {
  16690. widthModel = (shrinkWrap & 1) ? models.shrinkWrap : models.natural;
  16691. }
  16692. } else if (policy.readsWidth) {
  16693. if (hasPixelWidth) {
  16694. widthModel = models.calculatedFromConfigured;
  16695. } else {
  16696. widthModel = (shrinkWrap & 1) ? models.calculatedFromShrinkWrap :
  16697. models.calculatedFromNatural;
  16698. }
  16699. } else {
  16700. widthModel = models.calculated;
  16701. }
  16702. }
  16703. if (!heightModel) {
  16704. if (!policy.setsHeight) {
  16705. if (hasPixelHeight) {
  16706. heightModel = models.configured;
  16707. } else {
  16708. heightModel = (shrinkWrap & 2) ? models.shrinkWrap : models.natural;
  16709. }
  16710. } else if (policy.readsHeight) {
  16711. if (hasPixelHeight) {
  16712. heightModel = models.calculatedFromConfigured;
  16713. } else {
  16714. heightModel = (shrinkWrap & 2) ? models.calculatedFromShrinkWrap :
  16715. models.calculatedFromNatural;
  16716. }
  16717. } else {
  16718. heightModel = models.calculated;
  16719. }
  16720. }
  16721. }
  16722. return widthModel.pairsByHeightOrdinal[heightModel.ordinal];
  16723. },
  16724. isDescendant: function(ancestor) {
  16725. if (ancestor.isContainer) {
  16726. for (var c = this.ownerCt; c; c = c.ownerCt) {
  16727. if (c === ancestor) {
  16728. return true;
  16729. }
  16730. }
  16731. }
  16732. return false;
  16733. },
  16734. doComponentLayout : function() {
  16735. this.updateLayout();
  16736. return this;
  16737. },
  16738. forceComponentLayout: function () {
  16739. this.updateLayout();
  16740. },
  16741. setComponentLayout : function(layout) {
  16742. var currentLayout = this.componentLayout;
  16743. if (currentLayout && currentLayout.isLayout && currentLayout != layout) {
  16744. currentLayout.setOwner(null);
  16745. }
  16746. this.componentLayout = layout;
  16747. layout.setOwner(this);
  16748. },
  16749. getComponentLayout : function() {
  16750. var me = this;
  16751. if (!me.componentLayout || !me.componentLayout.isLayout) {
  16752. me.setComponentLayout(Ext.layout.Layout.create(me.componentLayout, 'autocomponent'));
  16753. }
  16754. return me.componentLayout;
  16755. },
  16756. afterComponentLayout: function(width, height, oldWidth, oldHeight) {
  16757. var me = this,
  16758. floaters, len, i, floater;
  16759. if (++me.componentLayoutCounter === 1) {
  16760. me.afterFirstLayout(width, height);
  16761. }
  16762. if (me.floatingItems) {
  16763. floaters = me.floatingItems.items;
  16764. len = floaters.length;
  16765. for (i = 0; i < len; i++) {
  16766. floater = floaters[i];
  16767. if (!floater.rendered && floater.autoShow) {
  16768. floater.show();
  16769. }
  16770. }
  16771. }
  16772. if (me.hasListeners.resize && (width !== oldWidth || height !== oldHeight)) {
  16773. me.fireEvent('resize', me, width, height, oldWidth, oldHeight);
  16774. }
  16775. },
  16776. beforeComponentLayout: function(width, height) {
  16777. return true;
  16778. },
  16779. setPosition : function(x, y, animate) {
  16780. var me = this,
  16781. pos = me.beforeSetPosition.apply(me, arguments);
  16782. if (pos && me.rendered) {
  16783. pos = me.convertPosition(pos);
  16784. if (pos.left !== me.el.getLeft() || pos.top !== me.el.getTop()) {
  16785. if (animate) {
  16786. me.stopAnimation();
  16787. me.animate(Ext.apply({
  16788. duration: 1000,
  16789. listeners: {
  16790. afteranimate: Ext.Function.bind(me.afterSetPosition, me, [pos.left, pos.top])
  16791. },
  16792. to: pos
  16793. }, animate));
  16794. } else {
  16795. if (pos.left !== undefined && pos.top !== undefined) {
  16796. me.el.setLeftTop(pos.left, pos.top);
  16797. } else if (pos.left !== undefined) {
  16798. me.el.setLeft(pos.left);
  16799. } else if (pos.top !==undefined) {
  16800. me.el.setTop(pos.top);
  16801. }
  16802. me.afterSetPosition(pos.left, pos.top);
  16803. }
  16804. }
  16805. }
  16806. return me;
  16807. },
  16808. beforeSetPosition: function (x, y, animate) {
  16809. var pos, x0;
  16810. if (!x || Ext.isNumber(x)) {
  16811. pos = { x: x, y : y, anim: animate };
  16812. } else if (Ext.isNumber(x0 = x[0])) {
  16813. pos = { x : x0, y : x[1], anim: y };
  16814. } else {
  16815. pos = { x: x.x, y: x.y, anim: y };
  16816. }
  16817. pos.hasX = Ext.isNumber(pos.x);
  16818. pos.hasY = Ext.isNumber(pos.y);
  16819. this.x = pos.x;
  16820. this.y = pos.y;
  16821. return (pos.hasX || pos.hasY) ? pos : null;
  16822. },
  16823. afterSetPosition: function(x, y) {
  16824. var me = this;
  16825. me.onPosition(x, y);
  16826. if (me.hasListeners.move) {
  16827. me.fireEvent('move', me, x, y);
  16828. }
  16829. },
  16830. convertPosition: function (pos, withUnits) {
  16831. var ret = {},
  16832. El = Ext.Element;
  16833. if (pos.hasX) {
  16834. ret.left = withUnits ? El.addUnits(pos.x) : pos.x;
  16835. }
  16836. if (pos.hasY) {
  16837. ret.top = withUnits ? El.addUnits(pos.y) : pos.y;
  16838. }
  16839. return ret;
  16840. },
  16841. onPosition: Ext.emptyFn,
  16842. setWidth : function(width) {
  16843. return this.setSize(width);
  16844. },
  16845. setHeight : function(height) {
  16846. return this.setSize(undefined, height);
  16847. },
  16848. getSize : function() {
  16849. return this.el.getSize();
  16850. },
  16851. getWidth : function() {
  16852. return this.el.getWidth();
  16853. },
  16854. getHeight : function() {
  16855. return this.el.getHeight();
  16856. },
  16857. getLoader: function(){
  16858. var me = this,
  16859. autoLoad = me.autoLoad ? (Ext.isObject(me.autoLoad) ? me.autoLoad : {url: me.autoLoad}) : null,
  16860. loader = me.loader || autoLoad;
  16861. if (loader) {
  16862. if (!loader.isLoader) {
  16863. me.loader = new Ext.ComponentLoader(Ext.apply({
  16864. target: me,
  16865. autoLoad: autoLoad
  16866. }, loader));
  16867. } else {
  16868. loader.setTarget(me);
  16869. }
  16870. return me.loader;
  16871. }
  16872. return null;
  16873. },
  16874. setDocked : function(dock, layoutParent) {
  16875. var me = this;
  16876. me.dock = dock;
  16877. if (layoutParent && me.ownerCt && me.rendered) {
  16878. me.ownerCt.updateLayout();
  16879. }
  16880. return me;
  16881. },
  16882. setBorder: function(border, targetEl) {
  16883. var me = this,
  16884. initial = !!targetEl;
  16885. if (me.rendered || initial) {
  16886. if (!initial) {
  16887. targetEl = me.el;
  16888. }
  16889. if (!border) {
  16890. border = 0;
  16891. } else {
  16892. border = Ext.Element.unitizeBox((border === true) ? 1 : border);
  16893. }
  16894. targetEl.setStyle('border-width', border);
  16895. if (!initial) {
  16896. me.updateLayout();
  16897. }
  16898. }
  16899. me.border = border;
  16900. },
  16901. onDestroy : function() {
  16902. var me = this;
  16903. if (me.monitorResize && Ext.EventManager.resizeEvent) {
  16904. Ext.EventManager.resizeEvent.removeListener(me.setSize, me);
  16905. }
  16906. Ext.destroy(
  16907. me.componentLayout,
  16908. me.loadMask,
  16909. me.floatingDescendants
  16910. );
  16911. },
  16912. destroy : function() {
  16913. var me = this,
  16914. selectors = me.renderSelectors,
  16915. selector,
  16916. el;
  16917. if (!me.isDestroyed) {
  16918. if (!me.hasListeners.beforedestroy || me.fireEvent('beforedestroy', me) !== false) {
  16919. me.destroying = true;
  16920. me.beforeDestroy();
  16921. if (me.floating) {
  16922. delete me.floatParent;
  16923. if (me.zIndexManager) {
  16924. me.zIndexManager.unregister(me);
  16925. }
  16926. } else if (me.ownerCt && me.ownerCt.remove) {
  16927. me.ownerCt.remove(me, false);
  16928. }
  16929. me.onDestroy();
  16930. Ext.destroy(me.plugins);
  16931. if (me.hasListeners.destroy) {
  16932. me.fireEvent('destroy', me);
  16933. }
  16934. Ext.ComponentManager.unregister(me);
  16935. me.mixins.state.destroy.call(me);
  16936. me.clearListeners();
  16937. if (me.rendered) {
  16938. if (!me.preserveElOnDestroy) {
  16939. me.el.remove();
  16940. }
  16941. me.mixins.elementCt.destroy.call(me);
  16942. if (selectors) {
  16943. for (selector in selectors) {
  16944. if (selectors.hasOwnProperty(selector)) {
  16945. el = me[selector];
  16946. if (el) {
  16947. delete me[selector];
  16948. el.remove();
  16949. }
  16950. }
  16951. }
  16952. }
  16953. delete me.el;
  16954. delete me.frameBody;
  16955. delete me.rendered;
  16956. }
  16957. me.destroying = false;
  16958. me.isDestroyed = true;
  16959. }
  16960. }
  16961. },
  16962. getPlugin: function(pluginId) {
  16963. var i = 0,
  16964. plugins = this.plugins,
  16965. ln = plugins.length;
  16966. for (; i < ln; i++) {
  16967. if (plugins[i].pluginId === pluginId) {
  16968. return plugins[i];
  16969. }
  16970. }
  16971. },
  16972. isDescendantOf: function(container) {
  16973. return !!this.findParentBy(function(p){
  16974. return p === container;
  16975. });
  16976. }
  16977. }, function() {
  16978. var AbstractComponent = this;
  16979. AbstractComponent.createAlias({
  16980. on: 'addListener',
  16981. prev: 'previousSibling',
  16982. next: 'nextSibling'
  16983. });
  16984. Ext.resumeLayouts = function (flush) {
  16985. AbstractComponent.resumeLayouts(flush);
  16986. };
  16987. Ext.suspendLayouts = function () {
  16988. AbstractComponent.suspendLayouts();
  16989. };
  16990. Ext.batchLayouts = function(fn, scope) {
  16991. AbstractComponent.suspendLayouts();
  16992. fn.call(scope);
  16993. AbstractComponent.resumeLayouts(true);
  16994. };
  16995. });
  16996. Ext.define('Ext.AbstractPlugin', {
  16997. disabled: false,
  16998. constructor: function(config) {
  16999. this.initialConfig = config;
  17000. Ext.apply(this, config);
  17001. },
  17002. clone: function() {
  17003. return new this.self(this.initialConfig);
  17004. },
  17005. getCmp: function() {
  17006. return this.cmp;
  17007. },
  17008. init: Ext.emptyFn,
  17009. destroy: Ext.emptyFn,
  17010. enable: function() {
  17011. this.disabled = false;
  17012. },
  17013. disable: function() {
  17014. this.disabled = true;
  17015. }
  17016. });
  17017. Ext.define('Ext.Action', {
  17018. constructor : function(config){
  17019. this.initialConfig = config;
  17020. this.itemId = config.itemId = (config.itemId || config.id || Ext.id());
  17021. this.items = [];
  17022. },
  17023. isAction : true,
  17024. setText : function(text){
  17025. this.initialConfig.text = text;
  17026. this.callEach('setText', [text]);
  17027. },
  17028. getText : function(){
  17029. return this.initialConfig.text;
  17030. },
  17031. setIconCls : function(cls){
  17032. this.initialConfig.iconCls = cls;
  17033. this.callEach('setIconCls', [cls]);
  17034. },
  17035. getIconCls : function(){
  17036. return this.initialConfig.iconCls;
  17037. },
  17038. setDisabled : function(v){
  17039. this.initialConfig.disabled = v;
  17040. this.callEach('setDisabled', [v]);
  17041. },
  17042. enable : function(){
  17043. this.setDisabled(false);
  17044. },
  17045. disable : function(){
  17046. this.setDisabled(true);
  17047. },
  17048. isDisabled : function(){
  17049. return this.initialConfig.disabled;
  17050. },
  17051. setHidden : function(v){
  17052. this.initialConfig.hidden = v;
  17053. this.callEach('setVisible', [!v]);
  17054. },
  17055. show : function(){
  17056. this.setHidden(false);
  17057. },
  17058. hide : function(){
  17059. this.setHidden(true);
  17060. },
  17061. isHidden : function(){
  17062. return this.initialConfig.hidden;
  17063. },
  17064. setHandler : function(fn, scope){
  17065. this.initialConfig.handler = fn;
  17066. this.initialConfig.scope = scope;
  17067. this.callEach('setHandler', [fn, scope]);
  17068. },
  17069. each : function(fn, scope){
  17070. Ext.each(this.items, fn, scope);
  17071. },
  17072. callEach : function(fnName, args){
  17073. var items = this.items,
  17074. i = 0,
  17075. len = items.length,
  17076. item;
  17077. Ext.suspendLayouts();
  17078. for(; i < len; i++){
  17079. item = items[i];
  17080. item[fnName].apply(item, args);
  17081. }
  17082. Ext.resumeLayouts(true);
  17083. },
  17084. addComponent : function(comp){
  17085. this.items.push(comp);
  17086. comp.on('destroy', this.removeComponent, this);
  17087. },
  17088. removeComponent : function(comp){
  17089. Ext.Array.remove(this.items, comp);
  17090. },
  17091. execute : function(){
  17092. this.initialConfig.handler.apply(this.initialConfig.scope || Ext.global, arguments);
  17093. }
  17094. });
  17095. Ext.define('Ext.data.Connection', {
  17096. mixins: {
  17097. observable: 'Ext.util.Observable'
  17098. },
  17099. statics: {
  17100. requestId: 0
  17101. },
  17102. url: null,
  17103. async: true,
  17104. method: null,
  17105. username: '',
  17106. password: '',
  17107. disableCaching: true,
  17108. withCredentials: false,
  17109. cors: false,
  17110. disableCachingParam: '_dc',
  17111. timeout : 30000,
  17112. useDefaultHeader : true,
  17113. defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',
  17114. useDefaultXhrHeader : true,
  17115. defaultXhrHeader : 'XMLHttpRequest',
  17116. constructor : function(config) {
  17117. config = config || {};
  17118. Ext.apply(this, config);
  17119. this.requests = {};
  17120. this.mixins.observable.constructor.call(this);
  17121. },
  17122. request : function(options) {
  17123. options = options || {};
  17124. var me = this,
  17125. scope = options.scope || window,
  17126. username = options.username || me.username,
  17127. password = options.password || me.password || '',
  17128. async,
  17129. requestOptions,
  17130. request,
  17131. headers,
  17132. xhr;
  17133. if (me.fireEvent('beforerequest', me, options) !== false) {
  17134. requestOptions = me.setOptions(options, scope);
  17135. if (me.isFormUpload(options)) {
  17136. me.upload(options.form, requestOptions.url, requestOptions.data, options);
  17137. return null;
  17138. }
  17139. if (options.autoAbort || me.autoAbort) {
  17140. me.abort();
  17141. }
  17142. async = options.async !== false ? (options.async || me.async) : false;
  17143. xhr = me.openRequest(options, requestOptions, async, username, password);
  17144. headers = me.setupHeaders(xhr, options, requestOptions.data, requestOptions.params);
  17145. request = {
  17146. id: ++Ext.data.Connection.requestId,
  17147. xhr: xhr,
  17148. headers: headers,
  17149. options: options,
  17150. async: async,
  17151. timeout: setTimeout(function() {
  17152. request.timedout = true;
  17153. me.abort(request);
  17154. }, options.timeout || me.timeout)
  17155. };
  17156. me.requests[request.id] = request;
  17157. me.latestId = request.id;
  17158. if (async) {
  17159. xhr.onreadystatechange = Ext.Function.bind(me.onStateChange, me, [request]);
  17160. }
  17161. xhr.send(requestOptions.data);
  17162. if (!async) {
  17163. return me.onComplete(request);
  17164. }
  17165. return request;
  17166. } else {
  17167. Ext.callback(options.callback, options.scope, [options, undefined, undefined]);
  17168. return null;
  17169. }
  17170. },
  17171. upload: function(form, url, params, options) {
  17172. form = Ext.getDom(form);
  17173. options = options || {};
  17174. var id = Ext.id(),
  17175. frame = document.createElement('iframe'),
  17176. hiddens = [],
  17177. encoding = 'multipart/form-data',
  17178. buf = {
  17179. target: form.target,
  17180. method: form.method,
  17181. encoding: form.encoding,
  17182. enctype: form.enctype,
  17183. action: form.action
  17184. },
  17185. addField = function(name, value) {
  17186. hiddenItem = document.createElement('input');
  17187. Ext.fly(hiddenItem).set({
  17188. type: 'hidden',
  17189. value: value,
  17190. name: name
  17191. });
  17192. form.appendChild(hiddenItem);
  17193. hiddens.push(hiddenItem);
  17194. },
  17195. hiddenItem, obj, value, name, vLen, v, hLen, h;
  17196. Ext.fly(frame).set({
  17197. id: id,
  17198. name: id,
  17199. cls: Ext.baseCSSPrefix + 'hide-display',
  17200. src: Ext.SSL_SECURE_URL
  17201. });
  17202. document.body.appendChild(frame);
  17203. if (document.frames) {
  17204. document.frames[id].name = id;
  17205. }
  17206. Ext.fly(form).set({
  17207. target: id,
  17208. method: 'POST',
  17209. enctype: encoding,
  17210. encoding: encoding,
  17211. action: url || buf.action
  17212. });
  17213. if (params) {
  17214. obj = Ext.Object.fromQueryString(params) || {};
  17215. for (name in obj) {
  17216. if (obj.hasOwnProperty(name)) {
  17217. value = obj[name];
  17218. if (Ext.isArray(value)) {
  17219. vLen = value.length;
  17220. for (v = 0; v < vLen; v++) {
  17221. addField(name, value[v]);
  17222. }
  17223. } else {
  17224. addField(name, value);
  17225. }
  17226. }
  17227. }
  17228. }
  17229. Ext.fly(frame).on('load', Ext.Function.bind(this.onUploadComplete, this, [frame, options]), null, {single: true});
  17230. form.submit();
  17231. Ext.fly(form).set(buf);
  17232. hLen = hiddens.length;
  17233. for (h = 0; h < hLen; h++) {
  17234. Ext.removeNode(hiddens[h]);
  17235. }
  17236. },
  17237. onUploadComplete: function(frame, options) {
  17238. var me = this,
  17239. response = {
  17240. responseText: '',
  17241. responseXML: null
  17242. }, doc, contentNode;
  17243. try {
  17244. doc = frame.contentWindow.document || frame.contentDocument || window.frames[frame.id].document;
  17245. if (doc) {
  17246. if (doc.body) {
  17247. if ((contentNode = doc.body.firstChild) && /pre/i.test(contentNode.tagName)) {
  17248. response.responseText = contentNode.innerText;
  17249. }
  17250. else if (contentNode = doc.getElementsByTagName('textarea')[0]) {
  17251. response.responseText = contentNode.value;
  17252. }
  17253. else {
  17254. response.responseText = doc.body.textContent || doc.body.innerText;
  17255. }
  17256. }
  17257. response.responseXML = doc.XMLDocument || doc;
  17258. }
  17259. } catch (e) {
  17260. }
  17261. me.fireEvent('requestcomplete', me, response, options);
  17262. Ext.callback(options.success, options.scope, [response, options]);
  17263. Ext.callback(options.callback, options.scope, [options, true, response]);
  17264. setTimeout(function() {
  17265. Ext.removeNode(frame);
  17266. }, 100);
  17267. },
  17268. isFormUpload: function(options) {
  17269. var form = this.getForm(options);
  17270. if (form) {
  17271. return (options.isUpload || (/multipart\/form-data/i).test(form.getAttribute('enctype')));
  17272. }
  17273. return false;
  17274. },
  17275. getForm: function(options) {
  17276. return Ext.getDom(options.form) || null;
  17277. },
  17278. setOptions: function(options, scope) {
  17279. var me = this,
  17280. params = options.params || {},
  17281. extraParams = me.extraParams,
  17282. urlParams = options.urlParams,
  17283. url = options.url || me.url,
  17284. jsonData = options.jsonData,
  17285. method,
  17286. disableCache,
  17287. data;
  17288. if (Ext.isFunction(params)) {
  17289. params = params.call(scope, options);
  17290. }
  17291. if (Ext.isFunction(url)) {
  17292. url = url.call(scope, options);
  17293. }
  17294. url = this.setupUrl(options, url);
  17295. data = options.rawData || options.xmlData || jsonData || null;
  17296. if (jsonData && !Ext.isPrimitive(jsonData)) {
  17297. data = Ext.encode(data);
  17298. }
  17299. if (Ext.isObject(params)) {
  17300. params = Ext.Object.toQueryString(params);
  17301. }
  17302. if (Ext.isObject(extraParams)) {
  17303. extraParams = Ext.Object.toQueryString(extraParams);
  17304. }
  17305. params = params + ((extraParams) ? ((params) ? '&' : '') + extraParams : '');
  17306. urlParams = Ext.isObject(urlParams) ? Ext.Object.toQueryString(urlParams) : urlParams;
  17307. params = this.setupParams(options, params);
  17308. method = (options.method || me.method || ((params || data) ? 'POST' : 'GET')).toUpperCase();
  17309. this.setupMethod(options, method);
  17310. disableCache = options.disableCaching !== false ? (options.disableCaching || me.disableCaching) : false;
  17311. if (method === 'GET' && disableCache) {
  17312. url = Ext.urlAppend(url, (options.disableCachingParam || me.disableCachingParam) + '=' + (new Date().getTime()));
  17313. }
  17314. if ((method == 'GET' || data) && params) {
  17315. url = Ext.urlAppend(url, params);
  17316. params = null;
  17317. }
  17318. if (urlParams) {
  17319. url = Ext.urlAppend(url, urlParams);
  17320. }
  17321. return {
  17322. url: url,
  17323. method: method,
  17324. data: data || params || null
  17325. };
  17326. },
  17327. setupUrl: function(options, url) {
  17328. var form = this.getForm(options);
  17329. if (form) {
  17330. url = url || form.action;
  17331. }
  17332. return url;
  17333. },
  17334. setupParams: function(options, params) {
  17335. var form = this.getForm(options),
  17336. serializedForm;
  17337. if (form && !this.isFormUpload(options)) {
  17338. serializedForm = Ext.Element.serializeForm(form);
  17339. params = params ? (params + '&' + serializedForm) : serializedForm;
  17340. }
  17341. return params;
  17342. },
  17343. setupMethod: function(options, method) {
  17344. if (this.isFormUpload(options)) {
  17345. return 'POST';
  17346. }
  17347. return method;
  17348. },
  17349. setupHeaders: function(xhr, options, data, params) {
  17350. var me = this,
  17351. headers = Ext.apply({}, options.headers || {}, me.defaultHeaders || {}),
  17352. contentType = me.defaultPostHeader,
  17353. jsonData = options.jsonData,
  17354. xmlData = options.xmlData,
  17355. key,
  17356. header;
  17357. if (!headers['Content-Type'] && (data || params)) {
  17358. if (data) {
  17359. if (options.rawData) {
  17360. contentType = 'text/plain';
  17361. } else {
  17362. if (xmlData && Ext.isDefined(xmlData)) {
  17363. contentType = 'text/xml';
  17364. } else if (jsonData && Ext.isDefined(jsonData)) {
  17365. contentType = 'application/json';
  17366. }
  17367. }
  17368. }
  17369. headers['Content-Type'] = contentType;
  17370. }
  17371. if (me.useDefaultXhrHeader && !headers['X-Requested-With']) {
  17372. headers['X-Requested-With'] = me.defaultXhrHeader;
  17373. }
  17374. try {
  17375. for (key in headers) {
  17376. if (headers.hasOwnProperty(key)) {
  17377. header = headers[key];
  17378. xhr.setRequestHeader(key, header);
  17379. }
  17380. }
  17381. } catch(e) {
  17382. me.fireEvent('exception', key, header);
  17383. }
  17384. return headers;
  17385. },
  17386. newRequest: function (options) {
  17387. var xhr;
  17388. if ((options.cors || this.cors) && Ext.isIE && Ext.ieVersion >= 8) {
  17389. xhr = new XDomainRequest();
  17390. } else {
  17391. xhr = this.getXhrInstance();
  17392. }
  17393. return xhr;
  17394. },
  17395. openRequest: function (options, requestOptions, async, username, password) {
  17396. var xhr = this.newRequest(options);
  17397. if (username) {
  17398. xhr.open(requestOptions.method, requestOptions.url, async, username, password);
  17399. } else {
  17400. xhr.open(requestOptions.method, requestOptions.url, async);
  17401. }
  17402. if (options.withCredentials || this.withCredentials) {
  17403. xhr.withCredentials = true;
  17404. }
  17405. return xhr;
  17406. },
  17407. getXhrInstance: (function() {
  17408. var options = [function() {
  17409. return new XMLHttpRequest();
  17410. }, function() {
  17411. return new ActiveXObject('MSXML2.XMLHTTP.3.0');
  17412. }, function() {
  17413. return new ActiveXObject('MSXML2.XMLHTTP');
  17414. }, function() {
  17415. return new ActiveXObject('Microsoft.XMLHTTP');
  17416. }], i = 0,
  17417. len = options.length,
  17418. xhr;
  17419. for (; i < len; ++i) {
  17420. try {
  17421. xhr = options[i];
  17422. xhr();
  17423. break;
  17424. } catch(e) {
  17425. }
  17426. }
  17427. return xhr;
  17428. }()),
  17429. isLoading : function(request) {
  17430. if (!request) {
  17431. request = this.getLatest();
  17432. }
  17433. if (!(request && request.xhr)) {
  17434. return false;
  17435. }
  17436. var state = request.xhr.readyState;
  17437. return !(state === 0 || state == 4);
  17438. },
  17439. abort : function(request) {
  17440. var me = this,
  17441. xhr;
  17442. if (!request) {
  17443. request = me.getLatest();
  17444. }
  17445. if (request && me.isLoading(request)) {
  17446. xhr = request.xhr;
  17447. try {
  17448. xhr.onreadystatechange = null;
  17449. } catch (e) {
  17450. xhr = Ext.emptyFn;
  17451. }
  17452. xhr.abort();
  17453. me.clearTimeout(request);
  17454. if (!request.timedout) {
  17455. request.aborted = true;
  17456. }
  17457. me.onComplete(request);
  17458. me.cleanup(request);
  17459. }
  17460. },
  17461. abortAll: function(){
  17462. var requests = this.requests,
  17463. id;
  17464. for (id in requests) {
  17465. if (requests.hasOwnProperty(id)) {
  17466. this.abort(requests[id]);
  17467. }
  17468. }
  17469. },
  17470. getLatest: function(){
  17471. var id = this.latestId,
  17472. request;
  17473. if (id) {
  17474. request = this.requests[id];
  17475. }
  17476. return request || null;
  17477. },
  17478. onStateChange : function(request) {
  17479. if (request.xhr.readyState == 4) {
  17480. this.clearTimeout(request);
  17481. this.onComplete(request);
  17482. this.cleanup(request);
  17483. }
  17484. },
  17485. clearTimeout: function(request) {
  17486. clearTimeout(request.timeout);
  17487. delete request.timeout;
  17488. },
  17489. cleanup: function(request) {
  17490. request.xhr = null;
  17491. delete request.xhr;
  17492. },
  17493. onComplete : function(request) {
  17494. var me = this,
  17495. options = request.options,
  17496. result,
  17497. success,
  17498. response;
  17499. try {
  17500. result = me.parseStatus(request.xhr.status);
  17501. } catch (e) {
  17502. result = {
  17503. success : false,
  17504. isException : false
  17505. };
  17506. }
  17507. success = result.success;
  17508. if (success) {
  17509. response = me.createResponse(request);
  17510. me.fireEvent('requestcomplete', me, response, options);
  17511. Ext.callback(options.success, options.scope, [response, options]);
  17512. } else {
  17513. if (result.isException || request.aborted || request.timedout) {
  17514. response = me.createException(request);
  17515. } else {
  17516. response = me.createResponse(request);
  17517. }
  17518. me.fireEvent('requestexception', me, response, options);
  17519. Ext.callback(options.failure, options.scope, [response, options]);
  17520. }
  17521. Ext.callback(options.callback, options.scope, [options, success, response]);
  17522. delete me.requests[request.id];
  17523. return response;
  17524. },
  17525. parseStatus: function(status) {
  17526. status = status == 1223 ? 204 : status;
  17527. var success = (status >= 200 && status < 300) || status == 304,
  17528. isException = false;
  17529. if (!success) {
  17530. switch (status) {
  17531. case 12002:
  17532. case 12029:
  17533. case 12030:
  17534. case 12031:
  17535. case 12152:
  17536. case 13030:
  17537. isException = true;
  17538. break;
  17539. }
  17540. }
  17541. return {
  17542. success: success,
  17543. isException: isException
  17544. };
  17545. },
  17546. createResponse : function(request) {
  17547. var xhr = request.xhr,
  17548. headers = {},
  17549. lines = xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
  17550. count = lines.length,
  17551. line, index, key, value, response;
  17552. while (count--) {
  17553. line = lines[count];
  17554. index = line.indexOf(':');
  17555. if (index >= 0) {
  17556. key = line.substr(0, index).toLowerCase();
  17557. if (line.charAt(index + 1) == ' ') {
  17558. ++index;
  17559. }
  17560. headers[key] = line.substr(index + 1);
  17561. }
  17562. }
  17563. request.xhr = null;
  17564. delete request.xhr;
  17565. response = {
  17566. request: request,
  17567. requestId : request.id,
  17568. status : xhr.status,
  17569. statusText : xhr.statusText,
  17570. getResponseHeader : function(header) {
  17571. return headers[header.toLowerCase()];
  17572. },
  17573. getAllResponseHeaders : function() {
  17574. return headers;
  17575. },
  17576. responseText : xhr.responseText,
  17577. responseXML : xhr.responseXML
  17578. };
  17579. xhr = null;
  17580. return response;
  17581. },
  17582. createException : function(request) {
  17583. return {
  17584. request : request,
  17585. requestId : request.id,
  17586. status : request.aborted ? -1 : 0,
  17587. statusText : request.aborted ? 'transaction aborted' : 'communication failure',
  17588. aborted: request.aborted,
  17589. timedout: request.timedout
  17590. };
  17591. }
  17592. });
  17593. Ext.define('Ext.Ajax', {
  17594. extend: 'Ext.data.Connection',
  17595. singleton: true,
  17596. autoAbort : false
  17597. });
  17598. Ext.define('Ext.util.Floating', {
  17599. uses: ['Ext.Layer', 'Ext.window.Window'],
  17600. focusOnToFront: true,
  17601. shadow: 'sides',
  17602. constructor: function (dom) {
  17603. var me = this;
  17604. me.el = new Ext.Layer(Ext.apply({
  17605. hideMode : me.hideMode,
  17606. hidden : me.hidden,
  17607. shadow : (typeof me.shadow != 'undefined') ? me.shadow : 'sides',
  17608. shadowOffset : me.shadowOffset,
  17609. constrain : false,
  17610. shim : (me.shim === false) ? false : undefined
  17611. }, me.floating), dom);
  17612. me.floating = true;
  17613. me.registerWithOwnerCt();
  17614. },
  17615. registerWithOwnerCt: function() {
  17616. var me = this;
  17617. if (me.zIndexParent) {
  17618. me.zIndexParent.unregisterFloatingItem(me);
  17619. }
  17620. me.zIndexParent = me.up('[floating]');
  17621. me.setFloatParent(me.ownerCt);
  17622. delete me.ownerCt;
  17623. if (me.zIndexParent) {
  17624. me.zIndexParent.registerFloatingItem(me);
  17625. } else {
  17626. Ext.WindowManager.register(me);
  17627. }
  17628. },
  17629. setFloatParent: function(floatParent) {
  17630. var me = this;
  17631. if (me.floatParent) {
  17632. me.mun(me.floatParent, {
  17633. hide: me.onFloatParentHide,
  17634. show: me.onFloatParentShow,
  17635. scope: me
  17636. });
  17637. }
  17638. me.floatParent = floatParent;
  17639. if (floatParent) {
  17640. me.mon(me.floatParent, {
  17641. hide: me.onFloatParentHide,
  17642. show: me.onFloatParentShow,
  17643. scope: me
  17644. });
  17645. }
  17646. if ((me.constrain || me.constrainHeader) && !me.constrainTo) {
  17647. me.constrainTo = floatParent ? floatParent.getTargetEl() : me.container;
  17648. }
  17649. },
  17650. onAfterFloatLayout: function(){
  17651. this.syncShadow();
  17652. },
  17653. onFloatParentHide: function() {
  17654. var me = this;
  17655. if (me.hideOnParentHide !== false && me.isVisible()) {
  17656. me.hide();
  17657. me.showOnParentShow = true;
  17658. }
  17659. },
  17660. onFloatParentShow: function() {
  17661. if (this.showOnParentShow) {
  17662. delete this.showOnParentShow;
  17663. this.show();
  17664. }
  17665. },
  17666. setZIndex: function(index) {
  17667. var me = this;
  17668. me.el.setZIndex(index);
  17669. index += 10;
  17670. if (me.floatingDescendants) {
  17671. index = Math.floor(me.floatingDescendants.setBase(index) / 100) * 100 + 10000;
  17672. }
  17673. return index;
  17674. },
  17675. doConstrain: function(constrainTo) {
  17676. var me = this,
  17677. vector = me.getConstrainVector(constrainTo),
  17678. xy;
  17679. if (vector) {
  17680. xy = me.getPosition(!!me.floatParent);
  17681. xy[0] += vector[0];
  17682. xy[1] += vector[1];
  17683. me.setPosition(xy);
  17684. }
  17685. },
  17686. getConstrainVector: function(constrainTo){
  17687. var me = this;
  17688. if (me.constrain || me.constrainHeader) {
  17689. constrainTo = constrainTo || (me.floatParent && me.floatParent.getTargetEl()) || me.container || me.el.getScopeParent();
  17690. return (me.constrainHeader ? me.header.el : me.el).getConstrainVector(constrainTo);
  17691. }
  17692. },
  17693. alignTo: function(element, position, offsets) {
  17694. this.setPagePosition(this.el.getAlignToXY(element.el || element, position, offsets));
  17695. return this;
  17696. },
  17697. toFront: function(preventFocus) {
  17698. var me = this;
  17699. if (me.zIndexParent && me.bringParentToFront !== false) {
  17700. me.zIndexParent.toFront(true);
  17701. }
  17702. if (!Ext.isDefined(preventFocus)) {
  17703. preventFocus = !me.focusOnToFront;
  17704. }
  17705. if (preventFocus) {
  17706. me.preventFocusOnActivate = true;
  17707. }
  17708. if (me.zIndexManager.bringToFront(me)) {
  17709. if (!preventFocus) {
  17710. me.focus(false, true);
  17711. }
  17712. }
  17713. delete me.preventFocusOnActivate;
  17714. return me;
  17715. },
  17716. setActive: function(active, newActive) {
  17717. var me = this;
  17718. if (active) {
  17719. if (me.el.shadow && !me.maximized) {
  17720. me.el.enableShadow(true);
  17721. }
  17722. if (me.modal && !me.preventFocusOnActivate) {
  17723. me.focus(false, true);
  17724. }
  17725. me.fireEvent('activate', me);
  17726. } else {
  17727. if (me.isWindow && (newActive && newActive.isWindow)) {
  17728. me.el.disableShadow();
  17729. }
  17730. me.fireEvent('deactivate', me);
  17731. }
  17732. },
  17733. toBack: function() {
  17734. this.zIndexManager.sendToBack(this);
  17735. return this;
  17736. },
  17737. center: function() {
  17738. var me = this,
  17739. xy;
  17740. if (me.isVisible()) {
  17741. xy = me.el.getAlignToXY(me.container, 'c-c');
  17742. me.setPagePosition(xy);
  17743. } else {
  17744. me.needsCenter = true;
  17745. }
  17746. return me;
  17747. },
  17748. onFloatShow: function() {
  17749. if (this.needsCenter) {
  17750. this.center();
  17751. }
  17752. delete this.needsCenter;
  17753. },
  17754. syncShadow : function() {
  17755. if (this.floating) {
  17756. this.el.sync(true);
  17757. }
  17758. },
  17759. fitContainer: function() {
  17760. var me = this,
  17761. parent = me.floatParent,
  17762. container = parent ? parent.getTargetEl() : me.container;
  17763. me.setSize(container.getViewSize(false));
  17764. me.setPosition.apply(me, parent ? [0, 0] : container.getXY());
  17765. }
  17766. });
  17767. Ext.define('Ext.Component', {
  17768. alias: ['widget.component', 'widget.box'],
  17769. extend: 'Ext.AbstractComponent',
  17770. requires: [
  17771. 'Ext.util.DelayedTask'
  17772. ],
  17773. uses: [
  17774. 'Ext.Layer',
  17775. 'Ext.resizer.Resizer',
  17776. 'Ext.util.ComponentDragger'
  17777. ],
  17778. mixins: {
  17779. floating: 'Ext.util.Floating'
  17780. },
  17781. statics: {
  17782. DIRECTION_TOP: 'top',
  17783. DIRECTION_RIGHT: 'right',
  17784. DIRECTION_BOTTOM: 'bottom',
  17785. DIRECTION_LEFT: 'left',
  17786. VERTICAL_DIRECTION_Re: /^(?:top|bottom)$/,
  17787. INVALID_ID_CHARS_Re: /[\.,\s]/g
  17788. },
  17789. resizeHandles: 'all',
  17790. floating: false,
  17791. toFrontOnShow: true,
  17792. hideMode: 'display',
  17793. bubbleEvents: [],
  17794. monPropRe: /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
  17795. defaultComponentLayoutType: 'autocomponent',
  17796. constructor: function(config) {
  17797. var me = this;
  17798. config = config || {};
  17799. if (config.initialConfig) {
  17800. if (config.isAction) {
  17801. me.baseAction = config;
  17802. }
  17803. config = config.initialConfig;
  17804. }
  17805. else if (config.tagName || config.dom || Ext.isString(config)) {
  17806. config = {
  17807. applyTo: config,
  17808. id: config.id || config
  17809. };
  17810. }
  17811. me.callParent([config]);
  17812. if (me.baseAction){
  17813. me.baseAction.addComponent(me);
  17814. }
  17815. },
  17816. initComponent: function() {
  17817. var me = this;
  17818. me.callParent();
  17819. if (me.listeners) {
  17820. me.on(me.listeners);
  17821. me.listeners = null;
  17822. }
  17823. me.enableBubble(me.bubbleEvents);
  17824. me.mons = [];
  17825. },
  17826. afterRender: function() {
  17827. var me = this;
  17828. me.callParent();
  17829. if (!(me.x && me.y) && (me.pageX || me.pageY)) {
  17830. me.setPagePosition(me.pageX, me.pageY);
  17831. }
  17832. },
  17833. setAutoScroll : function(scroll) {
  17834. var me = this;
  17835. me.autoScroll = !!scroll;
  17836. if (me.rendered) {
  17837. me.getTargetEl().setStyle(me.getOverflowStyle());
  17838. }
  17839. me.updateLayout();
  17840. return me;
  17841. },
  17842. setOverflowXY: function(overflowX, overflowY) {
  17843. var me = this,
  17844. argCount = arguments.length;
  17845. if (argCount) {
  17846. me.overflowX = overflowX || '';
  17847. if (argCount > 1) {
  17848. me.overflowY = overflowY || '';
  17849. }
  17850. }
  17851. if (me.rendered) {
  17852. me.getTargetEl().setStyle(me.getOverflowStyle());
  17853. }
  17854. me.updateLayout();
  17855. return me;
  17856. },
  17857. beforeRender: function () {
  17858. var me = this,
  17859. floating = me.floating,
  17860. cls;
  17861. if (floating) {
  17862. me.addCls(Ext.baseCSSPrefix + 'layer');
  17863. cls = floating.cls;
  17864. if (cls) {
  17865. me.addCls(cls);
  17866. }
  17867. }
  17868. return me.callParent();
  17869. },
  17870. afterComponentLayout: function(){
  17871. this.callParent(arguments);
  17872. if (this.floating) {
  17873. this.onAfterFloatLayout();
  17874. }
  17875. },
  17876. makeFloating : function (dom) {
  17877. this.mixins.floating.constructor.call(this, dom);
  17878. },
  17879. wrapPrimaryEl: function (dom) {
  17880. if (this.floating) {
  17881. this.makeFloating(dom);
  17882. } else {
  17883. this.callParent(arguments);
  17884. }
  17885. },
  17886. initResizable: function(resizable) {
  17887. var me = this;
  17888. resizable = Ext.apply({
  17889. target: me,
  17890. dynamic: false,
  17891. constrainTo: me.constrainTo || (me.floatParent ? me.floatParent.getTargetEl() : null),
  17892. handles: me.resizeHandles
  17893. }, resizable);
  17894. resizable.target = me;
  17895. me.resizer = new Ext.resizer.Resizer(resizable);
  17896. },
  17897. getDragEl: function() {
  17898. return this.el;
  17899. },
  17900. initDraggable: function() {
  17901. var me = this,
  17902. dragTarget = (me.resizer && me.resizer.el !== me.el) ? me.resizerComponent = new Ext.Component({
  17903. el: me.resizer.el,
  17904. rendered: true,
  17905. container: me.container
  17906. }) : me,
  17907. ddConfig = Ext.applyIf({
  17908. el: dragTarget.getDragEl(),
  17909. constrainTo: me.constrain ? (me.constrainTo || (me.floatParent ? me.floatParent.getTargetEl() : me.el.getScopeParent())) : undefined
  17910. }, me.draggable);
  17911. if (me.constrain || me.constrainDelegate) {
  17912. ddConfig.constrain = me.constrain;
  17913. ddConfig.constrainDelegate = me.constrainDelegate;
  17914. }
  17915. me.dd = new Ext.util.ComponentDragger(dragTarget, ddConfig);
  17916. },
  17917. scrollBy: function(deltaX, deltaY, animate) {
  17918. var el;
  17919. if ((el = this.getTargetEl()) && el.dom) {
  17920. el.scrollBy.apply(el, arguments);
  17921. }
  17922. },
  17923. setLoading : function(load, targetEl) {
  17924. var me = this,
  17925. config;
  17926. if (me.rendered) {
  17927. Ext.destroy(me.loadMask);
  17928. me.loadMask = null;
  17929. if (load !== false && !me.collapsed) {
  17930. if (Ext.isObject(load)) {
  17931. config = Ext.apply({}, load);
  17932. } else if (Ext.isString(load)) {
  17933. config = {msg: load};
  17934. } else {
  17935. config = {};
  17936. }
  17937. if (targetEl) {
  17938. Ext.applyIf(config, {
  17939. useTargetEl: true
  17940. });
  17941. }
  17942. me.loadMask = new Ext.LoadMask(me, config);
  17943. me.loadMask.show();
  17944. }
  17945. }
  17946. return me.loadMask;
  17947. },
  17948. beforeSetPosition: function () {
  17949. var me = this,
  17950. pos = me.callParent(arguments),
  17951. adj;
  17952. if (pos) {
  17953. adj = me.adjustPosition(pos.x, pos.y);
  17954. pos.x = adj.x;
  17955. pos.y = adj.y;
  17956. }
  17957. return pos || null;
  17958. },
  17959. afterSetPosition: function(ax, ay) {
  17960. this.onPosition(ax, ay);
  17961. this.fireEvent('move', this, ax, ay);
  17962. },
  17963. showAt: function(x, y, animate) {
  17964. var me = this;
  17965. if (!me.rendered && (me.autoRender || me.floating)) {
  17966. me.doAutoRender();
  17967. me.hidden = true;
  17968. }
  17969. if (me.floating) {
  17970. me.setPosition(x, y, animate);
  17971. } else {
  17972. me.setPagePosition(x, y, animate);
  17973. }
  17974. me.show();
  17975. },
  17976. setPagePosition: function(x, y, animate) {
  17977. var me = this,
  17978. p,
  17979. floatParentBox;
  17980. if (Ext.isArray(x)) {
  17981. y = x[1];
  17982. x = x[0];
  17983. }
  17984. me.pageX = x;
  17985. me.pageY = y;
  17986. if (me.floating) {
  17987. if (me.isContainedFloater()) {
  17988. floatParentBox = me.floatParent.getTargetEl().getViewRegion();
  17989. if (Ext.isNumber(x) && Ext.isNumber(floatParentBox.left)) {
  17990. x -= floatParentBox.left;
  17991. }
  17992. if (Ext.isNumber(y) && Ext.isNumber(floatParentBox.top)) {
  17993. y -= floatParentBox.top;
  17994. }
  17995. } else {
  17996. p = me.el.translatePoints(x, y);
  17997. x = p.left;
  17998. y = p.top;
  17999. }
  18000. me.setPosition(x, y, animate);
  18001. } else {
  18002. p = me.el.translatePoints(x, y);
  18003. me.setPosition(p.left, p.top, animate);
  18004. }
  18005. return me;
  18006. },
  18007. isContainedFloater: function() {
  18008. return (this.floating && this.floatParent);
  18009. },
  18010. getBox : function(local){
  18011. var pos = local ? this.getPosition(local) : this.el.getXY(),
  18012. size = this.getSize();
  18013. size.x = pos[0];
  18014. size.y = pos[1];
  18015. return size;
  18016. },
  18017. updateBox : function(box){
  18018. this.setSize(box.width, box.height);
  18019. this.setPagePosition(box.x, box.y);
  18020. return this;
  18021. },
  18022. getOuterSize: function() {
  18023. var el = this.el;
  18024. return {
  18025. width: el.getWidth() + el.getMargin('lr'),
  18026. height: el.getHeight() + el.getMargin('tb')
  18027. };
  18028. },
  18029. adjustPosition: function(x, y) {
  18030. var me = this,
  18031. floatParentBox;
  18032. if (me.isContainedFloater()) {
  18033. floatParentBox = me.floatParent.getTargetEl().getViewRegion();
  18034. x += floatParentBox.left;
  18035. y += floatParentBox.top;
  18036. }
  18037. return {
  18038. x: x,
  18039. y: y
  18040. };
  18041. },
  18042. getPosition: function(local) {
  18043. var me = this,
  18044. el = me.el,
  18045. xy,
  18046. isContainedFloater = me.isContainedFloater(),
  18047. floatParentBox;
  18048. if ((local === true) && !isContainedFloater) {
  18049. return [el.getLocalX(), el.getLocalY()];
  18050. }
  18051. xy = me.el.getXY();
  18052. if ((local === true) && isContainedFloater) {
  18053. floatParentBox = me.floatParent.getTargetEl().getViewRegion();
  18054. xy[0] -= floatParentBox.left;
  18055. xy[1] -= floatParentBox.top;
  18056. }
  18057. return xy;
  18058. },
  18059. getId: function() {
  18060. var me = this,
  18061. xtype;
  18062. if (!me.id) {
  18063. xtype = me.getXType();
  18064. if (xtype) {
  18065. xtype = xtype.replace(Ext.Component.INVALID_ID_CHARS_Re, '-');
  18066. } else {
  18067. xtype = Ext.name.toLowerCase() + '-comp';
  18068. }
  18069. me.id = xtype + '-' + me.getAutoId();
  18070. }
  18071. return me.id;
  18072. },
  18073. show: function(animateTarget, cb, scope) {
  18074. var me = this,
  18075. rendered = me.rendered;
  18076. if (rendered && me.isVisible()) {
  18077. if (me.toFrontOnShow && me.floating) {
  18078. me.toFront();
  18079. }
  18080. } else {
  18081. if (me.fireEvent('beforeshow', me) !== false) {
  18082. me.hidden = false;
  18083. if (!rendered && (me.autoRender || me.floating)) {
  18084. me.doAutoRender();
  18085. rendered = me.rendered;
  18086. }
  18087. if (rendered) {
  18088. me.beforeShow();
  18089. me.onShow.apply(me, arguments);
  18090. me.afterShow.apply(me, arguments);
  18091. }
  18092. } else {
  18093. me.onShowVeto();
  18094. }
  18095. }
  18096. return me;
  18097. },
  18098. onShowVeto: Ext.emptyFn,
  18099. beforeShow: Ext.emptyFn,
  18100. onShow: function() {
  18101. var me = this;
  18102. me.el.show();
  18103. me.callParent(arguments);
  18104. if (me.floating) {
  18105. if (me.maximized) {
  18106. me.fitContainer();
  18107. }
  18108. else if (me.constrain) {
  18109. me.doConstrain();
  18110. }
  18111. }
  18112. },
  18113. afterShow: function(animateTarget, cb, scope) {
  18114. var me = this,
  18115. fromBox,
  18116. toBox,
  18117. ghostPanel;
  18118. animateTarget = animateTarget || me.animateTarget;
  18119. if (!me.ghost) {
  18120. animateTarget = null;
  18121. }
  18122. if (animateTarget) {
  18123. animateTarget = animateTarget.el ? animateTarget.el : Ext.get(animateTarget);
  18124. toBox = me.el.getBox();
  18125. fromBox = animateTarget.getBox();
  18126. me.el.addCls(Ext.baseCSSPrefix + 'hide-offsets');
  18127. ghostPanel = me.ghost();
  18128. ghostPanel.el.stopAnimation();
  18129. ghostPanel.el.setX(-10000);
  18130. ghostPanel.el.animate({
  18131. from: fromBox,
  18132. to: toBox,
  18133. listeners: {
  18134. afteranimate: function() {
  18135. delete ghostPanel.componentLayout.lastComponentSize;
  18136. me.unghost();
  18137. me.el.removeCls(Ext.baseCSSPrefix + 'hide-offsets');
  18138. me.onShowComplete(cb, scope);
  18139. }
  18140. }
  18141. });
  18142. }
  18143. else {
  18144. me.onShowComplete(cb, scope);
  18145. }
  18146. },
  18147. onShowComplete: function(cb, scope) {
  18148. var me = this;
  18149. if (me.floating) {
  18150. me.toFront();
  18151. me.onFloatShow();
  18152. }
  18153. Ext.callback(cb, scope || me);
  18154. me.fireEvent('show', me);
  18155. delete me.hiddenByLayout;
  18156. },
  18157. hide: function() {
  18158. var me = this;
  18159. me.showOnParentShow = false;
  18160. if (!(me.rendered && !me.isVisible()) && me.fireEvent('beforehide', me) !== false) {
  18161. me.hidden = true;
  18162. if (me.rendered) {
  18163. me.onHide.apply(me, arguments);
  18164. }
  18165. }
  18166. return me;
  18167. },
  18168. onHide: function(animateTarget, cb, scope) {
  18169. var me = this,
  18170. ghostPanel,
  18171. toBox;
  18172. animateTarget = animateTarget || me.animateTarget;
  18173. if (!me.ghost) {
  18174. animateTarget = null;
  18175. }
  18176. if (animateTarget) {
  18177. animateTarget = animateTarget.el ? animateTarget.el : Ext.get(animateTarget);
  18178. ghostPanel = me.ghost();
  18179. ghostPanel.el.stopAnimation();
  18180. toBox = animateTarget.getBox();
  18181. toBox.width += 'px';
  18182. toBox.height += 'px';
  18183. ghostPanel.el.animate({
  18184. to: toBox,
  18185. listeners: {
  18186. afteranimate: function() {
  18187. delete ghostPanel.componentLayout.lastComponentSize;
  18188. ghostPanel.el.hide();
  18189. me.afterHide(cb, scope);
  18190. }
  18191. }
  18192. });
  18193. }
  18194. me.el.hide();
  18195. if (!animateTarget) {
  18196. me.afterHide(cb, scope);
  18197. }
  18198. },
  18199. afterHide: function(cb, scope) {
  18200. var me = this;
  18201. delete me.hiddenByLayout;
  18202. Ext.AbstractComponent.prototype.onHide.call(this);
  18203. Ext.callback(cb, scope || me);
  18204. me.fireEvent('hide', me);
  18205. },
  18206. onDestroy: function() {
  18207. var me = this;
  18208. if (me.rendered) {
  18209. Ext.destroy(
  18210. me.proxy,
  18211. me.proxyWrap,
  18212. me.resizer,
  18213. me.resizerComponent
  18214. );
  18215. }
  18216. delete me.focusTask;
  18217. me.callParent();
  18218. },
  18219. deleteMembers: function() {
  18220. var args = arguments,
  18221. len = args.length,
  18222. i = 0;
  18223. for (; i < len; ++i) {
  18224. delete this[args[i]];
  18225. }
  18226. },
  18227. focus: function(selectText, delay) {
  18228. var me = this,
  18229. focusEl,
  18230. focusElDom,
  18231. containerScrollTop;
  18232. if (delay) {
  18233. if (!me.focusTask) {
  18234. me.focusTask = new Ext.util.DelayedTask(me.focus);
  18235. }
  18236. me.focusTask.delay(Ext.isNumber(delay) ? delay : 10, null, me, [selectText, false]);
  18237. return me;
  18238. }
  18239. if (me.rendered && !me.isDestroyed && me.isVisible(true) && (focusEl = me.getFocusEl())) {
  18240. if (focusEl.isComponent) {
  18241. return focusEl.focus(selectText, delay);
  18242. }
  18243. if ((focusElDom = focusEl.dom)) {
  18244. if (focusEl.needsTabIndex()) {
  18245. focusElDom.tabIndex = -1;
  18246. }
  18247. if (me.floating) {
  18248. containerScrollTop = me.container.dom.scrollTop;
  18249. }
  18250. focusEl.focus();
  18251. if (selectText === true) {
  18252. focusElDom.select();
  18253. }
  18254. }
  18255. if (me.floating) {
  18256. me.toFront(true);
  18257. if (containerScrollTop !== undefined) {
  18258. me.container.dom.scrollTop = containerScrollTop;
  18259. }
  18260. }
  18261. }
  18262. return me;
  18263. },
  18264. cancelFocus: function() {
  18265. var task = this.focusTask;
  18266. if (task) {
  18267. task.cancel();
  18268. }
  18269. },
  18270. blur: function() {
  18271. var focusEl;
  18272. if (this.rendered && (focusEl = this.getFocusEl())) {
  18273. focusEl.blur();
  18274. }
  18275. return this;
  18276. },
  18277. getEl: function() {
  18278. return this.el;
  18279. },
  18280. getResizeEl: function() {
  18281. return this.el;
  18282. },
  18283. getPositionEl: function() {
  18284. return this.el;
  18285. },
  18286. getActionEl: function() {
  18287. return this.el;
  18288. },
  18289. getVisibilityEl: function() {
  18290. return this.el;
  18291. },
  18292. onResize: Ext.emptyFn,
  18293. getBubbleTarget: function() {
  18294. return this.ownerCt || this.floatParent;
  18295. },
  18296. getContentTarget: function() {
  18297. return this.el;
  18298. },
  18299. cloneConfig: function(overrides) {
  18300. overrides = overrides || {};
  18301. var id = overrides.id || Ext.id(),
  18302. cfg = Ext.applyIf(overrides, this.initialConfig),
  18303. self;
  18304. cfg.id = id;
  18305. self = Ext.getClass(this);
  18306. return new self(cfg);
  18307. },
  18308. getXType: function() {
  18309. return this.self.xtype;
  18310. },
  18311. findParentBy: function(fn) {
  18312. var p;
  18313. for (p = this.getBubbleTarget(); p && !fn(p, this); p = p.getBubbleTarget()) {
  18314. }
  18315. return p || null;
  18316. },
  18317. findParentByType: function(xtype) {
  18318. return Ext.isFunction(xtype) ?
  18319. this.findParentBy(function(p) {
  18320. return p.constructor === xtype;
  18321. })
  18322. :
  18323. this.up(xtype);
  18324. },
  18325. bubble: function(fn, scope, args) {
  18326. var p = this;
  18327. while (p) {
  18328. if (fn.apply(scope || p, args || [p]) === false) {
  18329. break;
  18330. }
  18331. p = p.getBubbleTarget();
  18332. }
  18333. return this;
  18334. },
  18335. getProxy: function() {
  18336. var me = this,
  18337. target;
  18338. if (!me.proxy) {
  18339. target = Ext.getBody();
  18340. if (Ext.scopeResetCSS) {
  18341. me.proxyWrap = target = Ext.getBody().createChild({
  18342. cls: Ext.resetCls
  18343. });
  18344. }
  18345. me.proxy = me.el.createProxy(Ext.baseCSSPrefix + 'proxy-el', target, true);
  18346. }
  18347. return me.proxy;
  18348. }
  18349. });
  18350. Ext.define('Ext.ElementLoader', {
  18351. mixins: {
  18352. observable: 'Ext.util.Observable'
  18353. },
  18354. uses: [
  18355. 'Ext.data.Connection',
  18356. 'Ext.Ajax'
  18357. ],
  18358. statics: {
  18359. Renderer: {
  18360. Html: function(loader, response, active){
  18361. loader.getTarget().update(response.responseText, active.scripts === true);
  18362. return true;
  18363. }
  18364. }
  18365. },
  18366. url: null,
  18367. params: null,
  18368. baseParams: null,
  18369. autoLoad: false,
  18370. target: null,
  18371. loadMask: false,
  18372. ajaxOptions: null,
  18373. scripts: false,
  18374. isLoader: true,
  18375. constructor: function(config) {
  18376. var me = this,
  18377. autoLoad;
  18378. config = config || {};
  18379. Ext.apply(me, config);
  18380. me.setTarget(me.target);
  18381. me.addEvents(
  18382. 'beforeload',
  18383. 'exception',
  18384. 'load'
  18385. );
  18386. me.mixins.observable.constructor.call(me);
  18387. if (me.autoLoad) {
  18388. autoLoad = me.autoLoad;
  18389. if (autoLoad === true) {
  18390. autoLoad = {};
  18391. }
  18392. me.load(autoLoad);
  18393. }
  18394. },
  18395. setTarget: function(target){
  18396. var me = this;
  18397. target = Ext.get(target);
  18398. if (me.target && me.target != target) {
  18399. me.abort();
  18400. }
  18401. me.target = target;
  18402. },
  18403. getTarget: function(){
  18404. return this.target || null;
  18405. },
  18406. abort: function(){
  18407. var active = this.active;
  18408. if (active !== undefined) {
  18409. Ext.Ajax.abort(active.request);
  18410. if (active.mask) {
  18411. this.removeMask();
  18412. }
  18413. delete this.active;
  18414. }
  18415. },
  18416. removeMask: function(){
  18417. this.target.unmask();
  18418. },
  18419. addMask: function(mask){
  18420. this.target.mask(mask === true ? null : mask);
  18421. },
  18422. load: function(options) {
  18423. options = Ext.apply({}, options);
  18424. var me = this,
  18425. target = me.target,
  18426. mask = Ext.isDefined(options.loadMask) ? options.loadMask : me.loadMask,
  18427. params = Ext.apply({}, options.params),
  18428. ajaxOptions = Ext.apply({}, options.ajaxOptions),
  18429. callback = options.callback || me.callback,
  18430. scope = options.scope || me.scope || me,
  18431. request;
  18432. Ext.applyIf(ajaxOptions, me.ajaxOptions);
  18433. Ext.applyIf(options, ajaxOptions);
  18434. Ext.applyIf(params, me.params);
  18435. Ext.apply(params, me.baseParams);
  18436. Ext.applyIf(options, {
  18437. url: me.url
  18438. });
  18439. Ext.apply(options, {
  18440. scope: me,
  18441. params: params,
  18442. callback: me.onComplete
  18443. });
  18444. if (me.fireEvent('beforeload', me, options) === false) {
  18445. return;
  18446. }
  18447. if (mask) {
  18448. me.addMask(mask);
  18449. }
  18450. request = Ext.Ajax.request(options);
  18451. me.active = {
  18452. request: request,
  18453. options: options,
  18454. mask: mask,
  18455. scope: scope,
  18456. callback: callback,
  18457. success: options.success || me.success,
  18458. failure: options.failure || me.failure,
  18459. renderer: options.renderer || me.renderer,
  18460. scripts: Ext.isDefined(options.scripts) ? options.scripts : me.scripts
  18461. };
  18462. me.setOptions(me.active, options);
  18463. },
  18464. setOptions: Ext.emptyFn,
  18465. onComplete: function(options, success, response) {
  18466. var me = this,
  18467. active = me.active,
  18468. scope = active.scope,
  18469. renderer = me.getRenderer(active.renderer);
  18470. if (success) {
  18471. success = renderer.call(me, me, response, active) !== false;
  18472. }
  18473. if (success) {
  18474. Ext.callback(active.success, scope, [me, response, options]);
  18475. me.fireEvent('load', me, response, options);
  18476. } else {
  18477. Ext.callback(active.failure, scope, [me, response, options]);
  18478. me.fireEvent('exception', me, response, options);
  18479. }
  18480. Ext.callback(active.callback, scope, [me, success, response, options]);
  18481. if (active.mask) {
  18482. me.removeMask();
  18483. }
  18484. delete me.active;
  18485. },
  18486. getRenderer: function(renderer){
  18487. if (Ext.isFunction(renderer)) {
  18488. return renderer;
  18489. }
  18490. return this.statics().Renderer.Html;
  18491. },
  18492. startAutoRefresh: function(interval, options){
  18493. var me = this;
  18494. me.stopAutoRefresh();
  18495. me.autoRefresh = setInterval(function(){
  18496. me.load(options);
  18497. }, interval);
  18498. },
  18499. stopAutoRefresh: function(){
  18500. clearInterval(this.autoRefresh);
  18501. delete this.autoRefresh;
  18502. },
  18503. isAutoRefreshing: function(){
  18504. return Ext.isDefined(this.autoRefresh);
  18505. },
  18506. destroy: function(){
  18507. var me = this;
  18508. me.stopAutoRefresh();
  18509. delete me.target;
  18510. me.abort();
  18511. me.clearListeners();
  18512. }
  18513. });
  18514. Ext.define('Ext.ComponentLoader', {
  18515. extend: 'Ext.ElementLoader',
  18516. statics: {
  18517. Renderer: {
  18518. Data: function(loader, response, active){
  18519. var success = true;
  18520. try {
  18521. loader.getTarget().update(Ext.decode(response.responseText));
  18522. } catch (e) {
  18523. success = false;
  18524. }
  18525. return success;
  18526. },
  18527. Component: function(loader, response, active){
  18528. var success = true,
  18529. target = loader.getTarget(),
  18530. items = [];
  18531. try {
  18532. items = Ext.decode(response.responseText);
  18533. } catch (e) {
  18534. success = false;
  18535. }
  18536. if (success) {
  18537. target.suspendLayouts();
  18538. if (active.removeAll) {
  18539. target.removeAll();
  18540. }
  18541. target.add(items);
  18542. target.resumeLayouts(true);
  18543. }
  18544. return success;
  18545. }
  18546. }
  18547. },
  18548. target: null,
  18549. loadMask: false,
  18550. renderer: 'html',
  18551. setTarget: function(target){
  18552. var me = this;
  18553. if (Ext.isString(target)) {
  18554. target = Ext.getCmp(target);
  18555. }
  18556. if (me.target && me.target != target) {
  18557. me.abort();
  18558. }
  18559. me.target = target;
  18560. },
  18561. removeMask: function(){
  18562. this.target.setLoading(false);
  18563. },
  18564. addMask: function(mask){
  18565. this.target.setLoading(mask);
  18566. },
  18567. setOptions: function(active, options){
  18568. active.removeAll = Ext.isDefined(options.removeAll) ? options.removeAll : this.removeAll;
  18569. },
  18570. getRenderer: function(renderer){
  18571. if (Ext.isFunction(renderer)) {
  18572. return renderer;
  18573. }
  18574. var renderers = this.statics().Renderer;
  18575. switch (renderer) {
  18576. case 'component':
  18577. return renderers.Component;
  18578. case 'data':
  18579. return renderers.Data;
  18580. default:
  18581. return Ext.ElementLoader.Renderer.Html;
  18582. }
  18583. }
  18584. });
  18585. Ext.define('Ext.Template', {
  18586. requires: ['Ext.dom.Helper', 'Ext.util.Format'],
  18587. inheritableStatics: {
  18588. from: function(el, config) {
  18589. el = Ext.getDom(el);
  18590. return new this(el.value || el.innerHTML, config || '');
  18591. }
  18592. },
  18593. constructor: function(html) {
  18594. var me = this,
  18595. args = arguments,
  18596. buffer = [],
  18597. i = 0,
  18598. length = args.length,
  18599. value;
  18600. me.initialConfig = {};
  18601. if (length === 1 && Ext.isArray(html)) {
  18602. args = html;
  18603. length = args.length;
  18604. }
  18605. if (length > 1) {
  18606. for (; i < length; i++) {
  18607. value = args[i];
  18608. if (typeof value == 'object') {
  18609. Ext.apply(me.initialConfig, value);
  18610. Ext.apply(me, value);
  18611. } else {
  18612. buffer.push(value);
  18613. }
  18614. }
  18615. } else {
  18616. buffer.push(html);
  18617. }
  18618. me.html = buffer.join('');
  18619. if (me.compiled) {
  18620. me.compile();
  18621. }
  18622. },
  18623. isTemplate: true,
  18624. disableFormats: false,
  18625. re: /\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
  18626. apply: function(values) {
  18627. var me = this,
  18628. useFormat = me.disableFormats !== true,
  18629. fm = Ext.util.Format,
  18630. tpl = me,
  18631. ret;
  18632. if (me.compiled) {
  18633. return me.compiled(values).join('');
  18634. }
  18635. function fn(m, name, format, args) {
  18636. if (format && useFormat) {
  18637. if (args) {
  18638. args = [values[name]].concat(Ext.functionFactory('return ['+ args +'];')());
  18639. } else {
  18640. args = [values[name]];
  18641. }
  18642. if (format.substr(0, 5) == "this.") {
  18643. return tpl[format.substr(5)].apply(tpl, args);
  18644. }
  18645. else {
  18646. return fm[format].apply(fm, args);
  18647. }
  18648. }
  18649. else {
  18650. return values[name] !== undefined ? values[name] : "";
  18651. }
  18652. }
  18653. ret = me.html.replace(me.re, fn);
  18654. return ret;
  18655. },
  18656. applyOut: function(values, out) {
  18657. var me = this;
  18658. if (me.compiled) {
  18659. out.push.apply(out, me.compiled(values));
  18660. } else {
  18661. out.push(me.apply(values));
  18662. }
  18663. return out;
  18664. },
  18665. applyTemplate: function () {
  18666. return this.apply.apply(this, arguments);
  18667. },
  18668. set: function(html, compile) {
  18669. var me = this;
  18670. me.html = html;
  18671. me.compiled = null;
  18672. return compile ? me.compile() : me;
  18673. },
  18674. compileARe: /\\/g,
  18675. compileBRe: /(\r\n|\n)/g,
  18676. compileCRe: /'/g,
  18677. /**
  18678. * Compiles the template into an internal function, eliminating the RegEx overhead.
  18679. * @return {Ext.Template} this
  18680. */
  18681. compile: function() {
  18682. var me = this,
  18683. fm = Ext.util.Format,
  18684. useFormat = me.disableFormats !== true,
  18685. body, bodyReturn;
  18686. function fn(m, name, format, args) {
  18687. if (format && useFormat) {
  18688. args = args ? ',' + args: "";
  18689. if (format.substr(0, 5) != "this.") {
  18690. format = "fm." + format + '(';
  18691. }
  18692. else {
  18693. format = 'this.' + format.substr(5) + '(';
  18694. }
  18695. }
  18696. else {
  18697. args = '';
  18698. format = "(values['" + name + "'] == undefined ? '' : ";
  18699. }
  18700. return "'," + format + "values['" + name + "']" + args + ") ,'";
  18701. }
  18702. bodyReturn = me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn);
  18703. body = "this.compiled = function(values){ return ['" + bodyReturn + "'];};";
  18704. eval(body);
  18705. return me;
  18706. },
  18707. /**
  18708. * Applies the supplied values to the template and inserts the new node(s) as the first child of el.
  18709. *
  18710. * @param {String/HTMLElement/Ext.Element} el The context element
  18711. * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
  18712. * @param {Boolean} returnElement (optional) true to return a Ext.Element.
  18713. * @return {HTMLElement/Ext.Element} The new node or Element
  18714. */
  18715. insertFirst: function(el, values, returnElement) {
  18716. return this.doInsert('afterBegin', el, values, returnElement);
  18717. },
  18718. /**
  18719. * Applies the supplied values to the template and inserts the new node(s) before el.
  18720. *
  18721. * @param {String/HTMLElement/Ext.Element} el The context element
  18722. * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
  18723. * @param {Boolean} returnElement (optional) true to return a Ext.Element.
  18724. * @return {HTMLElement/Ext.Element} The new node or Element
  18725. */
  18726. insertBefore: function(el, values, returnElement) {
  18727. return this.doInsert('beforeBegin', el, values, returnElement);
  18728. },
  18729. /**
  18730. * Applies the supplied values to the template and inserts the new node(s) after el.
  18731. *
  18732. * @param {String/HTMLElement/Ext.Element} el The context element
  18733. * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
  18734. * @param {Boolean} returnElement (optional) true to return a Ext.Element.
  18735. * @return {HTMLElement/Ext.Element} The new node or Element
  18736. */
  18737. insertAfter: function(el, values, returnElement) {
  18738. return this.doInsert('afterEnd', el, values, returnElement);
  18739. },
  18740. /**
  18741. * Applies the supplied `values` to the template and appends the new node(s) to the specified `el`.
  18742. *
  18743. * For example usage see {@link Ext.Template Ext.Template class docs}.
  18744. *
  18745. * @param {String/HTMLElement/Ext.Element} el The context element
  18746. * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
  18747. * @param {Boolean} returnElement (optional) true to return an Ext.Element.
  18748. * @return {HTMLElement/Ext.Element} The new node or Element
  18749. */
  18750. append: function(el, values, returnElement) {
  18751. return this.doInsert('beforeEnd', el, values, returnElement);
  18752. },
  18753. doInsert: function(where, el, values, returnElement) {
  18754. var newNode = Ext.DomHelper.insertHtml(where, Ext.getDom(el), this.apply(values));
  18755. return returnElement ? Ext.get(newNode) : newNode;
  18756. },
  18757. /**
  18758. * Applies the supplied values to the template and overwrites the content of el with the new node(s).
  18759. *
  18760. * @param {String/HTMLElement/Ext.Element} el The context element
  18761. * @param {Object/Array} values The template values. See {@link #applyTemplate} for details.
  18762. * @param {Boolean} returnElement (optional) true to return a Ext.Element.
  18763. * @return {HTMLElement/Ext.Element} The new node or Element
  18764. */
  18765. overwrite: function(el, values, returnElement) {
  18766. var newNode = Ext.DomHelper.overwrite(Ext.getDom(el), this.apply(values));
  18767. return returnElement ? Ext.get(newNode) : newNode;
  18768. }
  18769. });
  18770. /**
  18771. * This class parses the XTemplate syntax and calls abstract methods to process the parts.
  18772. * @private
  18773. */
  18774. Ext.define('Ext.XTemplateParser', {
  18775. constructor: function (config) {
  18776. Ext.apply(this, config);
  18777. },
  18778. /**
  18779. * @property {Number} level The 'for' loop context level. This is adjusted up by one
  18780. * prior to calling {@link #doFor} and down by one after calling the corresponding
  18781. * {@link #doEnd} that closes the loop. This will be 1 on the first {@link #doFor}
  18782. * call.
  18783. */
  18784. /**
  18785. * This method is called to process a piece of raw text from the tpl.
  18786. * @param {String} text
  18787. * @method doText
  18788. */
  18789. // doText: function (text)
  18790. /**
  18791. * This method is called to process expressions (like `{[expr]}`).
  18792. * @param {String} expr The body of the expression (inside "{[" and "]}").
  18793. * @method doExpr
  18794. */
  18795. // doExpr: function (expr)
  18796. /**
  18797. * This method is called to process simple tags (like `{tag}`).
  18798. * @method doTag
  18799. */
  18800. // doTag: function (tag)
  18801. /**
  18802. * This method is called to process `<tpl else>`.
  18803. * @method doElse
  18804. */
  18805. // doElse: function ()
  18806. /**
  18807. * This method is called to process `{% text %}`.
  18808. * @param {String} text
  18809. * @method doEval
  18810. */
  18811. // doEval: function (text)
  18812. /**
  18813. * This method is called to process `<tpl if="action">`. If there are other attributes,
  18814. * these are passed in the actions object.
  18815. * @param {String} action
  18816. * @param {Object} actions Other actions keyed by the attribute name (such as 'exec').
  18817. * @method doIf
  18818. */
  18819. // doIf: function (action, actions)
  18820. /**
  18821. * This method is called to process `<tpl elseif="action">`. If there are other attributes,
  18822. * these are passed in the actions object.
  18823. * @param {String} action
  18824. * @param {Object} actions Other actions keyed by the attribute name (such as 'exec').
  18825. * @method doElseIf
  18826. */
  18827. // doElseIf: function (action, actions)
  18828. /**
  18829. * This method is called to process `<tpl switch="action">`. If there are other attributes,
  18830. * these are passed in the actions object.
  18831. * @param {String} action
  18832. * @param {Object} actions Other actions keyed by the attribute name (such as 'exec').
  18833. * @method doSwitch
  18834. */
  18835. // doSwitch: function (action, actions)
  18836. /**
  18837. * This method is called to process `<tpl case="action">`. If there are other attributes,
  18838. * these are passed in the actions object.
  18839. * @param {String} action
  18840. * @param {Object} actions Other actions keyed by the attribute name (such as 'exec').
  18841. * @method doCase
  18842. */
  18843. // doCase: function (action, actions)
  18844. /**
  18845. * This method is called to process `<tpl default>`.
  18846. * @method doDefault
  18847. */
  18848. // doDefault: function ()
  18849. /**
  18850. * This method is called to process `</tpl>`. It is given the action type that started
  18851. * the tpl and the set of additional actions.
  18852. * @param {String} type The type of action that is being ended.
  18853. * @param {Object} actions The other actions keyed by the attribute name (such as 'exec').
  18854. * @method doEnd
  18855. */
  18856. // doEnd: function (type, actions)
  18857. /**
  18858. * This method is called to process `<tpl for="action">`. If there are other attributes,
  18859. * these are passed in the actions object.
  18860. * @param {String} action
  18861. * @param {Object} actions Other actions keyed by the attribute name (such as 'exec').
  18862. * @method doFor
  18863. */
  18864. // doFor: function (action, actions)
  18865. /**
  18866. * This method is called to process `<tpl exec="action">`. If there are other attributes,
  18867. * these are passed in the actions object.
  18868. * @param {String} action
  18869. * @param {Object} actions Other actions keyed by the attribute name.
  18870. * @method doExec
  18871. */
  18872. // doExec: function (action, actions)
  18873. /**
  18874. * This method is called to process an empty `<tpl>`. This is unlikely to need to be
  18875. * implemented, so a default (do nothing) version is provided.
  18876. * @method
  18877. */
  18878. doTpl: Ext.emptyFn,
  18879. parse: function (str) {
  18880. var me = this,
  18881. len = str.length,
  18882. aliases = { elseif: 'elif' },
  18883. topRe = me.topRe,
  18884. actionsRe = me.actionsRe,
  18885. index, stack, s, m, t, prev, frame, subMatch, begin, end, actions,
  18886. prop;
  18887. me.level = 0;
  18888. me.stack = stack = [];
  18889. for (index = 0; index < len; index = end) {
  18890. topRe.lastIndex = index;
  18891. m = topRe.exec(str);
  18892. if (!m) {
  18893. me.doText(str.substring(index, len));
  18894. break;
  18895. }
  18896. begin = m.index;
  18897. end = topRe.lastIndex;
  18898. if (index < begin) {
  18899. me.doText(str.substring(index, begin));
  18900. }
  18901. if (m[1]) {
  18902. end = str.indexOf('%}', begin+2);
  18903. me.doEval(str.substring(begin+2, end));
  18904. end += 2;
  18905. } else if (m[2]) {
  18906. end = str.indexOf(']}', begin+2);
  18907. me.doExpr(str.substring(begin+2, end));
  18908. end += 2;
  18909. } else if (m[3]) { // if ('{' token)
  18910. me.doTag(m[3]);
  18911. } else if (m[4]) { // content of a <tpl xxxxxx xxx> tag
  18912. actions = null;
  18913. while ((subMatch = actionsRe.exec(m[4])) !== null) {
  18914. s = subMatch[2] || subMatch[3];
  18915. if (s) {
  18916. s = Ext.String.htmlDecode(s); // decode attr value
  18917. t = subMatch[1];
  18918. t = aliases[t] || t;
  18919. actions = actions || {};
  18920. prev = actions[t];
  18921. if (typeof prev == 'string') {
  18922. actions[t] = [prev, s];
  18923. } else if (prev) {
  18924. actions[t].push(s);
  18925. } else {
  18926. actions[t] = s;
  18927. }
  18928. }
  18929. }
  18930. if (!actions) {
  18931. if (me.elseRe.test(m[4])) {
  18932. me.doElse();
  18933. } else if (me.defaultRe.test(m[4])) {
  18934. me.doDefault();
  18935. } else {
  18936. me.doTpl();
  18937. stack.push({ type: 'tpl' });
  18938. }
  18939. }
  18940. else if (actions['if']) {
  18941. me.doIf(actions['if'], actions);
  18942. stack.push({ type: 'if' });
  18943. }
  18944. else if (actions['switch']) {
  18945. me.doSwitch(actions['switch'], actions);
  18946. stack.push({ type: 'switch' });
  18947. }
  18948. else if (actions['case']) {
  18949. me.doCase(actions['case'], actions);
  18950. }
  18951. else if (actions['elif']) {
  18952. me.doElseIf(actions['elif'], actions);
  18953. }
  18954. else if (actions['for']) {
  18955. ++me.level;
  18956. // Extract property name to use from indexed item
  18957. if (prop = me.propRe.exec(m[4])) {
  18958. actions.propName = prop[1] || prop[2];
  18959. }
  18960. me.doFor(actions['for'], actions);
  18961. stack.push({ type: 'for', actions: actions });
  18962. }
  18963. else if (actions.exec) {
  18964. me.doExec(actions.exec, actions);
  18965. stack.push({ type: 'exec', actions: actions });
  18966. }
  18967. /*
  18968. else {
  18969. // todo - error
  18970. }
  18971. */
  18972. } else if (m[0].length === 5) {
  18973. // if the length of m[0] is 5, assume that we're dealing with an opening tpl tag with no attributes (e.g. <tpl>...</tpl>)
  18974. // in this case no action is needed other than pushing it on to the stack
  18975. stack.push({ type: 'tpl' });
  18976. } else {
  18977. frame = stack.pop();
  18978. me.doEnd(frame.type, frame.actions);
  18979. if (frame.type == 'for') {
  18980. --me.level;
  18981. }
  18982. }
  18983. }
  18984. },
  18985. // Internal regexes
  18986. topRe: /(?:(\{\%)|(\{\[)|\{([^{}]*)\})|(?:<tpl([^>]*)\>)|(?:<\/tpl>)/g,
  18987. actionsRe: /\s*(elif|elseif|if|for|exec|switch|case|eval)\s*\=\s*(?:(?:"([^"]*)")|(?:'([^']*)'))\s*/g,
  18988. propRe: /prop=(?:(?:"([^"]*)")|(?:'([^']*)'))/,
  18989. defaultRe: /^\s*default\s*$/,
  18990. elseRe: /^\s*else\s*$/
  18991. });
  18992. Ext.define('Ext.XTemplateCompiler', {
  18993. extend: 'Ext.XTemplateParser',
  18994. useEval: Ext.isGecko,
  18995. useIndex: Ext.isIE6 || Ext.isIE7,
  18996. useFormat: true,
  18997. propNameRe: /^[\w\d\$]*$/,
  18998. compile: function (tpl) {
  18999. var me = this,
  19000. code = me.generate(tpl);
  19001. return me.useEval ? me.evalTpl(code) : (new Function('Ext', code))(Ext);
  19002. },
  19003. generate: function (tpl) {
  19004. var me = this,
  19005. definitions = 'var fm=Ext.util.Format,ts=Object.prototype.toString;',
  19006. code;
  19007. me.maxLevel = 0;
  19008. me.body = [
  19009. 'var c0=values, a0=' + me.createArrayTest(0) + ', p0=parent, n0=xcount, i0=xindex, v;\n'
  19010. ];
  19011. if (me.definitions) {
  19012. if (typeof me.definitions === 'string') {
  19013. me.definitions = [me.definitions, definitions ];
  19014. } else {
  19015. me.definitions.push(definitions);
  19016. }
  19017. } else {
  19018. me.definitions = [ definitions ];
  19019. }
  19020. me.switches = [];
  19021. me.parse(tpl);
  19022. me.definitions.push(
  19023. (me.useEval ? '$=' : 'return') + ' function (' + me.fnArgs + ') {',
  19024. me.body.join(''),
  19025. '}'
  19026. );
  19027. code = me.definitions.join('\n');
  19028. me.definitions.length = me.body.length = me.switches.length = 0;
  19029. delete me.definitions;
  19030. delete me.body;
  19031. delete me.switches;
  19032. return code;
  19033. },
  19034. doText: function (text) {
  19035. var me = this,
  19036. out = me.body;
  19037. text = text.replace(me.aposRe, "\\'").replace(me.newLineRe, '\\n');
  19038. if (me.useIndex) {
  19039. out.push('out[out.length]=\'', text, '\'\n');
  19040. } else {
  19041. out.push('out.push(\'', text, '\')\n');
  19042. }
  19043. },
  19044. doExpr: function (expr) {
  19045. var out = this.body;
  19046. out.push('if ((v=' + expr + ')!==undefined) out');
  19047. if (this.useIndex) {
  19048. out.push('[out.length]=v+\'\'\n');
  19049. } else {
  19050. out.push('.push(v+\'\')\n');
  19051. }
  19052. },
  19053. doTag: function (tag) {
  19054. this.doExpr(this.parseTag(tag));
  19055. },
  19056. doElse: function () {
  19057. this.body.push('} else {\n');
  19058. },
  19059. doEval: function (text) {
  19060. this.body.push(text, '\n');
  19061. },
  19062. doIf: function (action, actions) {
  19063. var me = this;
  19064. if (action === '.') {
  19065. me.body.push('if (values) {\n');
  19066. } else if (me.propNameRe.test(action)) {
  19067. me.body.push('if (', me.parseTag(action), ') {\n');
  19068. }
  19069. else {
  19070. me.body.push('if (', me.addFn(action), me.callFn, ') {\n');
  19071. }
  19072. if (actions.exec) {
  19073. me.doExec(actions.exec);
  19074. }
  19075. },
  19076. doElseIf: function (action, actions) {
  19077. var me = this;
  19078. if (action === '.') {
  19079. me.body.push('else if (values) {\n');
  19080. } else if (me.propNameRe.test(action)) {
  19081. me.body.push('} else if (', me.parseTag(action), ') {\n');
  19082. }
  19083. else {
  19084. me.body.push('} else if (', me.addFn(action), me.callFn, ') {\n');
  19085. }
  19086. if (actions.exec) {
  19087. me.doExec(actions.exec);
  19088. }
  19089. },
  19090. doSwitch: function (action) {
  19091. var me = this;
  19092. if (action === '.') {
  19093. me.body.push('switch (values) {\n');
  19094. } else if (me.propNameRe.test(action)) {
  19095. me.body.push('switch (', me.parseTag(action), ') {\n');
  19096. }
  19097. else {
  19098. me.body.push('switch (', me.addFn(action), me.callFn, ') {\n');
  19099. }
  19100. me.switches.push(0);
  19101. },
  19102. doCase: function (action) {
  19103. var me = this,
  19104. cases = Ext.isArray(action) ? action : [action],
  19105. n = me.switches.length - 1,
  19106. match, i;
  19107. if (me.switches[n]) {
  19108. me.body.push('break;\n');
  19109. } else {
  19110. me.switches[n]++;
  19111. }
  19112. for (i = 0, n = cases.length; i < n; ++i) {
  19113. match = me.intRe.exec(cases[i]);
  19114. cases[i] = match ? match[1] : ("'" + cases[i].replace(me.aposRe,"\\'") + "'");
  19115. }
  19116. me.body.push('case ', cases.join(': case '), ':\n');
  19117. },
  19118. doDefault: function () {
  19119. var me = this,
  19120. n = me.switches.length - 1;
  19121. if (me.switches[n]) {
  19122. me.body.push('break;\n');
  19123. } else {
  19124. me.switches[n]++;
  19125. }
  19126. me.body.push('default:\n');
  19127. },
  19128. doEnd: function (type, actions) {
  19129. var me = this,
  19130. L = me.level-1;
  19131. if (type == 'for') {
  19132. if (actions.exec) {
  19133. me.doExec(actions.exec);
  19134. }
  19135. me.body.push('}\n');
  19136. me.body.push('parent=p',L,';values=r',L+1,';xcount=n',L,';xindex=i',L,'\n');
  19137. } else if (type == 'if' || type == 'switch') {
  19138. me.body.push('}\n');
  19139. }
  19140. },
  19141. doFor: function (action, actions) {
  19142. var me = this,
  19143. s,
  19144. L = me.level,
  19145. up = L-1,
  19146. pL = 'p' + L,
  19147. parentAssignment;
  19148. if (action === '.') {
  19149. s = 'values';
  19150. } else if (me.propNameRe.test(action)) {
  19151. s = me.parseTag(action);
  19152. }
  19153. else {
  19154. s = me.addFn(action) + me.callFn;
  19155. }
  19156. if (me.maxLevel < L) {
  19157. me.maxLevel = L;
  19158. me.body.push('var ');
  19159. }
  19160. if (action == '.') {
  19161. parentAssignment = 'c' + L;
  19162. } else {
  19163. parentAssignment = 'a' + up + '?c' + up + '[i' + up + ']:p' + L;
  19164. }
  19165. me.body.push('i',L,'=0,n', L, '=0,c',L,'=',s,',a',L,'=', me.createArrayTest(L), ',p',L,'=c',up,',r',L,'=values;\n',
  19166. 'parent=',parentAssignment,'\n',
  19167. 'if (c',L,'){if(a',L,'){n', L,'=c', L, '.length;}else if (c', L, '.isMixedCollection){c',L,'=c',L,'.items;n',L,'=c',L,'.length;}else if(c',L,'.isStore){c',L,'=c',L,'.data.items;n',L,'=c',L,'.length;}else{c',L,'=[c',L,'];n',L,'=1;}}\n',
  19168. 'for (xcount=n',L,';i',L,'<n'+L+';++i',L,'){\n',
  19169. 'values=c',L,'[i',L,']');
  19170. if (actions.propName) {
  19171. me.body.push('.', actions.propName);
  19172. }
  19173. me.body.push('\n',
  19174. 'xindex=i',L,'+1\n');
  19175. },
  19176. createArrayTest: ('isArray' in Array) ? function(L) {
  19177. return 'Array.isArray(c' + L + ')';
  19178. } : function(L) {
  19179. return 'ts.call(c' + L + ')==="[object Array]"';
  19180. },
  19181. doExec: function (action, actions) {
  19182. var me = this,
  19183. name = 'f' + me.definitions.length;
  19184. me.definitions.push('function ' + name + '(' + me.fnArgs + ') {',
  19185. ' try { with(values) {',
  19186. ' ' + action,
  19187. ' }} catch(e) {',
  19188. '}',
  19189. '}');
  19190. me.body.push(name + me.callFn + '\n');
  19191. },
  19192. addFn: function (body) {
  19193. var me = this,
  19194. name = 'f' + me.definitions.length;
  19195. if (body === '.') {
  19196. me.definitions.push('function ' + name + '(' + me.fnArgs + ') {',
  19197. ' return values',
  19198. '}');
  19199. } else if (body === '..') {
  19200. me.definitions.push('function ' + name + '(' + me.fnArgs + ') {',
  19201. ' return parent',
  19202. '}');
  19203. } else {
  19204. me.definitions.push('function ' + name + '(' + me.fnArgs + ') {',
  19205. ' try { with(values) {',
  19206. ' return(' + body + ')',
  19207. ' }} catch(e) {',
  19208. '}',
  19209. '}');
  19210. }
  19211. return name;
  19212. },
  19213. parseTag: function (tag) {
  19214. var me = this,
  19215. m = me.tagRe.exec(tag),
  19216. name = m[1],
  19217. format = m[2],
  19218. args = m[3],
  19219. math = m[4],
  19220. v;
  19221. if (name == '.') {
  19222. if (!me.validTypes) {
  19223. me.definitions.push('var validTypes={string:1,number:1,boolean:1};');
  19224. me.validTypes = true;
  19225. }
  19226. v = 'validTypes[typeof values] || ts.call(values) === "[object Date]" ? values : ""';
  19227. }
  19228. else if (name == '#') {
  19229. v = 'xindex';
  19230. }
  19231. else if (name.substr(0, 7) == "parent.") {
  19232. v = name;
  19233. }
  19234. else if (isNaN(name) && name.indexOf('-') == -1 && name.indexOf('.') != -1) {
  19235. v = "values." + name;
  19236. }
  19237. else {
  19238. v = "values['" + name + "']";
  19239. }
  19240. if (math) {
  19241. v = '(' + v + math + ')';
  19242. }
  19243. if (format && me.useFormat) {
  19244. args = args ? ',' + args : "";
  19245. if (format.substr(0, 5) != "this.") {
  19246. format = "fm." + format + '(';
  19247. } else {
  19248. format += '(';
  19249. }
  19250. } else {
  19251. return v;
  19252. }
  19253. return format + v + args + ')';
  19254. },
  19255. evalTpl: function ($) {
  19256. eval($);
  19257. return $;
  19258. },
  19259. newLineRe: /\r\n|\r|\n/g,
  19260. aposRe: /[']/g,
  19261. intRe: /^\s*(\d+)\s*$/,
  19262. tagRe: /([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?/
  19263. }, function () {
  19264. var proto = this.prototype;
  19265. proto.fnArgs = 'out,values,parent,xindex,xcount';
  19266. proto.callFn = '.call(this,' + proto.fnArgs + ')';
  19267. });
  19268. /**
  19269. * A template class that supports advanced functionality like:
  19270. *
  19271. * - Autofilling arrays using templates and sub-templates
  19272. * - Conditional processing with basic comparison operators
  19273. * - Basic math function support
  19274. * - Execute arbitrary inline code with special built-in template variables
  19275. * - Custom member functions
  19276. * - Many special tags and built-in operators that aren't defined as part of the API, but are supported in the templates that can be created
  19277. *
  19278. * XTemplate provides the templating mechanism built into {@link Ext.view.View}.
  19279. *
  19280. * The {@link Ext.Template} describes the acceptable parameters to pass to the constructor. The following examples
  19281. * demonstrate all of the supported features.
  19282. *
  19283. * # Sample Data
  19284. *
  19285. * This is the data object used for reference in each code example:
  19286. *
  19287. * var data = {
  19288. * name: 'Don Griffin',
  19289. * title: 'Senior Technomage',
  19290. * company: 'Sencha Inc.',
  19291. * drinks: ['Coffee', 'Water', 'More Coffee'],
  19292. * kids: [
  19293. * { name: 'Aubrey', age: 17 },
  19294. * { name: 'Joshua', age: 13 },
  19295. * { name: 'Cale', age: 10 },
  19296. * { name: 'Nikol', age: 5 },
  19297. * { name: 'Solomon', age: 0 }
  19298. * ]
  19299. * };
  19300. *
  19301. * # Auto filling of arrays
  19302. *
  19303. * The **tpl** tag and the **for** operator are used to process the provided data object:
  19304. *
  19305. * - If the value specified in for is an array, it will auto-fill, repeating the template block inside the tpl
  19306. * tag for each item in the array.
  19307. * - If for="." is specified, the data object provided is examined.
  19308. * - While processing an array, the special variable {#} will provide the current array index + 1 (starts at 1, not 0).
  19309. *
  19310. * Examples:
  19311. *
  19312. * <tpl for=".">...</tpl>
  19313. * <tpl for="foo">...</tpl>
  19314. * <tpl for="foo.bar">...</tpl>
  19315. *
  19316. * Using the sample data above:
  19317. *
  19318. * var tpl = new Ext.XTemplate(
  19319. * '<p>Kids: ',
  19320. * '<tpl for=".">',
  19321. * '<p>{#}. {name}</p>',
  19322. * '</tpl></p>'
  19323. * );
  19324. * tpl.overwrite(panel.body, data.kids);
  19325. *
  19326. * An example illustrating how the **for** property can be leveraged to access specified members of the provided data
  19327. * object to populate the template:
  19328. *
  19329. * var tpl = new Ext.XTemplate(
  19330. * '<p>Name: {name}</p>',
  19331. * '<p>Title: {title}</p>',
  19332. * '<p>Company: {company}</p>',
  19333. * '<p>Kids: ',
  19334. * '<tpl for="kids">',
  19335. * '<p>{name}</p>',
  19336. * '</tpl></p>'
  19337. * );
  19338. * tpl.overwrite(panel.body, data);
  19339. *
  19340. * Flat arrays that contain values (and not objects) can be auto-rendered using the special **`{.}`** variable inside a
  19341. * loop. This variable will represent the value of the array at the current index:
  19342. *
  19343. * var tpl = new Ext.XTemplate(
  19344. * '<p>{name}\'s favorite beverages:</p>',
  19345. * '<tpl for="drinks">',
  19346. * '<div> - {.}</div>',
  19347. * '</tpl>'
  19348. * );
  19349. * tpl.overwrite(panel.body, data);
  19350. *
  19351. * When processing a sub-template, for example while looping through a child array, you can access the parent object's
  19352. * members via the **parent** object:
  19353. *
  19354. * var tpl = new Ext.XTemplate(
  19355. * '<p>Name: {name}</p>',
  19356. * '<p>Kids: ',
  19357. * '<tpl for="kids">',
  19358. * '<tpl if="age &gt; 1">',
  19359. * '<p>{name}</p>',
  19360. * '<p>Dad: {parent.name}</p>',
  19361. * '</tpl>',
  19362. * '</tpl></p>'
  19363. * );
  19364. * tpl.overwrite(panel.body, data);
  19365. *
  19366. * # Conditional processing with basic comparison operators
  19367. *
  19368. * The **tpl** tag and the **if** operator are used to provide conditional checks for deciding whether or not to render
  19369. * specific parts of the template.
  19370. *
  19371. * Using the sample data above:
  19372. *
  19373. * var tpl = new Ext.XTemplate(
  19374. * '<p>Name: {name}</p>',
  19375. * '<p>Kids: ',
  19376. * '<tpl for="kids">',
  19377. * '<tpl if="age &gt; 1">',
  19378. * '<p>{name}</p>',
  19379. * '</tpl>',
  19380. * '</tpl></p>'
  19381. * );
  19382. * tpl.overwrite(panel.body, data);
  19383. *
  19384. * More advanced conditionals are also supported:
  19385. *
  19386. * var tpl = new Ext.XTemplate(
  19387. * '<p>Name: {name}</p>',
  19388. * '<p>Kids: ',
  19389. * '<tpl for="kids">',
  19390. * '<p>{name} is a ',
  19391. * '<tpl if="age &gt;= 13">',
  19392. * '<p>teenager</p>',
  19393. * '<tpl elseif="age &gt;= 2">',
  19394. * '<p>kid</p>',
  19395. * '<tpl else>',
  19396. * '<p>baby</p>',
  19397. * '</tpl>',
  19398. * '</tpl></p>'
  19399. * );
  19400. *
  19401. * var tpl = new Ext.XTemplate(
  19402. * '<p>Name: {name}</p>',
  19403. * '<p>Kids: ',
  19404. * '<tpl for="kids">',
  19405. * '<p>{name} is a ',
  19406. * '<tpl switch="name">',
  19407. * '<tpl case="Aubrey" case="Nikol">',
  19408. * '<p>girl</p>',
  19409. * '<tpl default>',
  19410. * '<p>boy</p>',
  19411. * '</tpl>',
  19412. * '</tpl></p>'
  19413. * );
  19414. *
  19415. * A `break` is implied between each case and default, however, multiple cases can be listed
  19416. * in a single &lt;tpl&gt; tag.
  19417. *
  19418. * # Using double quotes
  19419. *
  19420. * Examples:
  19421. *
  19422. * var tpl = new Ext.XTemplate(
  19423. * "<tpl if='age &gt; 1 && age &lt; 10'>Child</tpl>",
  19424. * "<tpl if='age &gt;= 10 && age &lt; 18'>Teenager</tpl>",
  19425. * "<tpl if='this.isGirl(name)'>...</tpl>",
  19426. * '<tpl if="id == \'download\'">...</tpl>',
  19427. * "<tpl if='needsIcon'><img src='{icon}' class='{iconCls}'/></tpl>",
  19428. * "<tpl if='name == \"Don\"'>Hello</tpl>"
  19429. * );
  19430. *
  19431. * # Basic math support
  19432. *
  19433. * The following basic math operators may be applied directly on numeric data values:
  19434. *
  19435. * + - * /
  19436. *
  19437. * For example:
  19438. *
  19439. * var tpl = new Ext.XTemplate(
  19440. * '<p>Name: {name}</p>',
  19441. * '<p>Kids: ',
  19442. * '<tpl for="kids">',
  19443. * '<tpl if="age &gt; 1">',
  19444. * '<p>{#}: {name}</p>',
  19445. * '<p>In 5 Years: {age+5}</p>',
  19446. * '<p>Dad: {parent.name}</p>',
  19447. * '</tpl>',
  19448. * '</tpl></p>'
  19449. * );
  19450. * tpl.overwrite(panel.body, data);
  19451. *
  19452. * # Execute arbitrary inline code with special built-in template variables
  19453. *
  19454. * Anything between `{[ ... ]}` is considered code to be executed in the scope of the template.
  19455. * The expression is evaluated and the result is included in the generated result. There are
  19456. * some special variables available in that code:
  19457. *
  19458. * - **out**: The output array into which the template is being appended (using `push` to later
  19459. * `join`).
  19460. * - **values**: The values in the current scope. If you are using scope changing sub-templates,
  19461. * you can change what values is.
  19462. * - **parent**: The scope (values) of the ancestor template.
  19463. * - **xindex**: If you are in a looping template, the index of the loop you are in (1-based).
  19464. * - **xcount**: If you are in a looping template, the total length of the array you are looping.
  19465. *
  19466. * This example demonstrates basic row striping using an inline code block and the xindex variable:
  19467. *
  19468. * var tpl = new Ext.XTemplate(
  19469. * '<p>Name: {name}</p>',
  19470. * '<p>Company: {[values.company.toUpperCase() + ", " + values.title]}</p>',
  19471. * '<p>Kids: ',
  19472. * '<tpl for="kids">',
  19473. * '<div class="{[xindex % 2 === 0 ? "even" : "odd"]}">',
  19474. * '{name}',
  19475. * '</div>',
  19476. * '</tpl></p>'
  19477. * );
  19478. *
  19479. * Any code contained in "verbatim" blocks (using "{% ... %}") will be inserted directly in
  19480. * the generated code for the template. These blocks are not included in the output. This
  19481. * can be used for simple things like break/continue in a loop, or control structures or
  19482. * method calls (when they don't produce output). The `this` references the template instance.
  19483. *
  19484. * var tpl = new Ext.XTemplate(
  19485. * '<p>Name: {name}</p>',
  19486. * '<p>Company: {[values.company.toUpperCase() + ", " + values.title]}</p>',
  19487. * '<p>Kids: ',
  19488. * '<tpl for="kids">',
  19489. * '{% if (xindex % 2 === 0) continue; %}',
  19490. * '{name}',
  19491. * '{% if (xindex > 100) break; %}',
  19492. * '</div>',
  19493. * '</tpl></p>'
  19494. * );
  19495. *
  19496. * # Template member functions
  19497. *
  19498. * One or more member functions can be specified in a configuration object passed into the XTemplate constructor for
  19499. * more complex processing:
  19500. *
  19501. * var tpl = new Ext.XTemplate(
  19502. * '<p>Name: {name}</p>',
  19503. * '<p>Kids: ',
  19504. * '<tpl for="kids">',
  19505. * '<tpl if="this.isGirl(name)">',
  19506. * '<p>Girl: {name} - {age}</p>',
  19507. * '<tpl else>',
  19508. * '<p>Boy: {name} - {age}</p>',
  19509. * '</tpl>',
  19510. * '<tpl if="this.isBaby(age)">',
  19511. * '<p>{name} is a baby!</p>',
  19512. * '</tpl>',
  19513. * '</tpl></p>',
  19514. * {
  19515. * // XTemplate configuration:
  19516. * disableFormats: true,
  19517. * // member functions:
  19518. * isGirl: function(name){
  19519. * return name == 'Aubrey' || name == 'Nikol';
  19520. * },
  19521. * isBaby: function(age){
  19522. * return age < 1;
  19523. * }
  19524. * }
  19525. * );
  19526. * tpl.overwrite(panel.body, data);
  19527. */
  19528. Ext.define('Ext.XTemplate', {
  19529. extend: 'Ext.Template',
  19530. requires: 'Ext.XTemplateCompiler',
  19531. /**
  19532. * @private
  19533. */
  19534. emptyObj: {},
  19535. /**
  19536. * @cfg {Boolean} compiled
  19537. * Only applies to {@link Ext.Template}, XTemplates are compiled automatically on the
  19538. * first call to {@link #apply} or {@link #applyOut}.
  19539. */
  19540. /**
  19541. * @cfg {String/Array} definitions
  19542. * Optional. A statement, or array of statements which set up `var`s which may then
  19543. * be accessed within the scope of the generated function.
  19544. */
  19545. apply: function(values, parent) {
  19546. return this.applyOut(values, [], parent).join('');
  19547. },
  19548. applyOut: function(values, out, parent) {
  19549. var me = this,
  19550. compiler;
  19551. if (!me.fn) {
  19552. compiler = new Ext.XTemplateCompiler({
  19553. useFormat: me.disableFormats !== true,
  19554. definitions: me.definitions
  19555. });
  19556. me.fn = compiler.compile(me.html);
  19557. }
  19558. try {
  19559. me.fn.call(me, out, values, parent || me.emptyObj, 1, 1);
  19560. } catch (e) {
  19561. }
  19562. return out;
  19563. },
  19564. /**
  19565. * Does nothing. XTemplates are compiled automatically, so this function simply returns this.
  19566. * @return {Ext.XTemplate} this
  19567. */
  19568. compile: function() {
  19569. return this;
  19570. },
  19571. statics: {
  19572. /**
  19573. * Gets an `XTemplate` from an object (an instance of an {@link Ext#define}'d class).
  19574. * Many times, templates are configured high in the class hierarchy and are to be
  19575. * shared by all classes that derive from that base. To further complicate matters,
  19576. * these templates are seldom actual instances but are rather configurations. For
  19577. * example:
  19578. *
  19579. * Ext.define('MyApp.Class', {
  19580. * someTpl: [
  19581. * 'tpl text here'
  19582. * ]
  19583. * });
  19584. *
  19585. * The goal being to share that template definition with all instances and even
  19586. * instances of derived classes, until `someTpl` is overridden. This method will
  19587. * "upgrade" these configurations to be real `XTemplate` instances *in place* (to
  19588. * avoid creating one instance per object).
  19589. *
  19590. * @param {Object} instance The object from which to get the `XTemplate` (must be
  19591. * an instance of an {@link Ext#define}'d class).
  19592. * @param {String} name The name of the property by which to get the `XTemplate`.
  19593. * @return {Ext.XTemplate} The `XTemplate` instance or null if not found.
  19594. * @protected
  19595. */
  19596. getTpl: function (instance, name) {
  19597. var tpl = instance[name], // go for it! 99% of the time we will get it!
  19598. proto;
  19599. if (tpl && !tpl.isTemplate) { // tpl is just a configuration (not an instance)
  19600. // create the template instance from the configuration:
  19601. tpl = Ext.ClassManager.dynInstantiate('Ext.XTemplate', tpl);
  19602. // and replace the reference with the new instance:
  19603. if (instance.hasOwnProperty(name)) { // the tpl is on the instance
  19604. instance[name] = tpl;
  19605. } else { // must be somewhere in the prototype chain
  19606. for (proto = instance.self.prototype; proto; proto = proto.superclass) {
  19607. if (proto.hasOwnProperty(name)) {
  19608. proto[name] = tpl;
  19609. break;
  19610. }
  19611. }
  19612. }
  19613. }
  19614. // else !tpl (no such tpl) or the tpl is an instance already... either way, tpl
  19615. // is ready to return
  19616. return tpl || null;
  19617. }
  19618. }
  19619. });
  19620. /**
  19621. * Base Layout class - extended by ComponentLayout and ContainerLayout
  19622. */
  19623. Ext.define('Ext.layout.Layout', {
  19624. requires: [
  19625. 'Ext.XTemplate'
  19626. ],
  19627. uses: [ 'Ext.layout.Context' ],
  19628. /**
  19629. * @property {Boolean} isLayout
  19630. * `true` in this class to identify an object as an instantiated Layout, or subclass thereof.
  19631. */
  19632. isLayout: true,
  19633. initialized: false,
  19634. running: false,
  19635. autoSizePolicy: {
  19636. setsWidth: 0,
  19637. setsHeight: 0
  19638. },
  19639. statics: {
  19640. layoutsByType: {},
  19641. create: function(layout, defaultType) {
  19642. var ClassManager = Ext.ClassManager,
  19643. layoutsByType = this.layoutsByType,
  19644. alias, className, config, layoutClass, type, load;
  19645. if (!layout || typeof layout === 'string') {
  19646. type = layout || defaultType;
  19647. config = {};
  19648. } else if (layout.isLayout) {
  19649. return layout;
  19650. } else {
  19651. config = layout;
  19652. type = layout.type || defaultType;
  19653. }
  19654. if (!(layoutClass = layoutsByType[type])) {
  19655. alias = 'layout.' + type;
  19656. className = ClassManager.getNameByAlias(alias);
  19657. // this is needed to support demand loading of the class
  19658. if (!className) {
  19659. load = true;
  19660. }
  19661. layoutClass = ClassManager.get(className);
  19662. if (load || !layoutClass) {
  19663. return ClassManager.instantiateByAlias(alias, config || {});
  19664. }
  19665. layoutsByType[type] = layoutClass;
  19666. }
  19667. return new layoutClass(config);
  19668. }
  19669. },
  19670. constructor : function(config) {
  19671. var me = this;
  19672. me.id = Ext.id(null, me.type + '-');
  19673. Ext.apply(me, config);
  19674. me.layoutCount = 0;
  19675. },
  19676. /**
  19677. * @property {Boolean} done Used only during a layout run, this value indicates that a
  19678. * layout has finished its calculations. This flag is set to true prior to the call to
  19679. * {@link #calculate} and should be set to false if this layout has more work to do.
  19680. */
  19681. /**
  19682. * Called before any calculation cycles to prepare for layout.
  19683. *
  19684. * This is a write phase and DOM reads should be strictly avoided when overridding
  19685. * this method.
  19686. *
  19687. * @param {Ext.layout.ContextItem} ownerContext The context item for the layout's owner
  19688. * component.
  19689. * @method beginLayout
  19690. */
  19691. beginLayout: Ext.emptyFn,
  19692. beginLayoutCycle: function (ownerContext) {
  19693. var me = this,
  19694. context = me.context,
  19695. changed;
  19696. if (me.lastWidthModel != ownerContext.widthModel) {
  19697. if (me.lastWidthModel) {
  19698. changed = true;
  19699. }
  19700. me.lastWidthModel = ownerContext.widthModel;
  19701. }
  19702. if (me.lastHeightModel != ownerContext.heightModel) {
  19703. if (me.lastWidthModel) {
  19704. changed = true;
  19705. }
  19706. me.lastHeightModel = ownerContext.heightModel;
  19707. }
  19708. if (changed) {
  19709. (context = ownerContext.context).clearTriggers(me, false);
  19710. context.clearTriggers(me, true);
  19711. me.triggerCount = 0;
  19712. }
  19713. },
  19714. finishedLayout: function () {
  19715. this.ownerContext = null;
  19716. },
  19717. redoLayout: Ext.emptyFn,
  19718. undoLayout: Ext.emptyFn,
  19719. getAnimatePolicy: function() {
  19720. return this.animatePolicy;
  19721. },
  19722. getItemSizePolicy: function (item) {
  19723. return this.autoSizePolicy;
  19724. },
  19725. isItemBoxParent: function (itemContext) {
  19726. return false;
  19727. },
  19728. isItemLayoutRoot: function (item) {
  19729. var sizeModel = item.getSizeModel(),
  19730. width = sizeModel.width,
  19731. height = sizeModel.height;
  19732. if (!item.componentLayout.lastComponentSize && (width.calculated || height.calculated)) {
  19733. return false;
  19734. }
  19735. return !width.shrinkWrap && !height.shrinkWrap;
  19736. },
  19737. isItemShrinkWrap: function (item) {
  19738. return item.shrinkWrap;
  19739. },
  19740. isRunning: function () {
  19741. return !!this.ownerContext;
  19742. },
  19743. getItemsRenderTree: function (items, renderCfgs) {
  19744. var length = items.length,
  19745. i, item, itemConfig, result;
  19746. if (length) {
  19747. result = [];
  19748. for (i = 0; i < length; ++i) {
  19749. item = items[i];
  19750. if (!item.rendered) {
  19751. if (renderCfgs && (renderCfgs[item.id] !== undefined)) {
  19752. itemConfig = renderCfgs[item.id];
  19753. } else {
  19754. this.configureItem(item);
  19755. itemConfig = item.getRenderTree();
  19756. if (renderCfgs) {
  19757. renderCfgs[item.id] = itemConfig;
  19758. }
  19759. }
  19760. if (itemConfig) {
  19761. result.push(itemConfig);
  19762. }
  19763. }
  19764. }
  19765. }
  19766. return result;
  19767. },
  19768. finishRender: Ext.emptyFn,
  19769. finishRenderItems: function (target, items) {
  19770. var length = items.length,
  19771. i, item;
  19772. for (i = 0; i < length; i++) {
  19773. item = items[i];
  19774. if (item.rendering) {
  19775. item.finishRender(i);
  19776. this.afterRenderItem(item);
  19777. }
  19778. }
  19779. },
  19780. renderChildren: function () {
  19781. var me = this,
  19782. items = me.getLayoutItems(),
  19783. target = me.getRenderTarget();
  19784. me.renderItems(items, target);
  19785. },
  19786. renderItems : function(items, target) {
  19787. var me = this,
  19788. ln = items.length,
  19789. i = 0,
  19790. item;
  19791. if (ln) {
  19792. Ext.suspendLayouts();
  19793. for (; i < ln; i++) {
  19794. item = items[i];
  19795. if (item && !item.rendered) {
  19796. me.renderItem(item, target, i);
  19797. } else if (!me.isValidParent(item, target, i)) {
  19798. me.moveItem(item, target, i);
  19799. } else {
  19800. me.configureItem(item);
  19801. }
  19802. }
  19803. Ext.resumeLayouts(true);
  19804. }
  19805. },
  19806. isValidParent : function(item, target, position) {
  19807. var itemDom = item.el ? item.el.dom : Ext.getDom(item),
  19808. targetDom = (target && target.dom) || target;
  19809. if (itemDom.parentNode && itemDom.parentNode.className.indexOf(Ext.baseCSSPrefix + 'resizable-wrap') !== -1) {
  19810. itemDom = itemDom.parentNode;
  19811. }
  19812. if (itemDom && targetDom) {
  19813. if (typeof position == 'number') {
  19814. return itemDom === targetDom.childNodes[position];
  19815. }
  19816. return itemDom.parentNode === targetDom;
  19817. }
  19818. return false;
  19819. },
  19820. configureItem: function(item) {
  19821. item.ownerLayout = this;
  19822. },
  19823. renderItem : function(item, target, position) {
  19824. var me = this;
  19825. if (!item.rendered) {
  19826. me.configureItem(item);
  19827. item.render(target, position);
  19828. me.afterRenderItem(item);
  19829. }
  19830. },
  19831. moveItem : function(item, target, position) {
  19832. target = target.dom || target;
  19833. if (typeof position == 'number') {
  19834. position = target.childNodes[position];
  19835. }
  19836. target.insertBefore(item.el.dom, position || null);
  19837. item.container = Ext.get(target);
  19838. this.configureItem(item);
  19839. },
  19840. onContentChange: function () {
  19841. this.owner.updateLayout();
  19842. return true;
  19843. },
  19844. initLayout : function() {
  19845. this.initialized = true;
  19846. },
  19847. setOwner : function(owner) {
  19848. this.owner = owner;
  19849. },
  19850. getLayoutItems : function() {
  19851. return [];
  19852. },
  19853. afterRenderItem: Ext.emptyFn,
  19854. onAdd : Ext.emptyFn,
  19855. onRemove : Ext.emptyFn,
  19856. onDestroy : Ext.emptyFn,
  19857. afterRemove : function(item) {
  19858. var me = this,
  19859. el = item.el,
  19860. owner = me.owner,
  19861. removeClasses;
  19862. if (item.rendered) {
  19863. removeClasses = [].concat(me.itemCls || []);
  19864. if (owner.itemCls) {
  19865. removeClasses = Ext.Array.push(removeClasses, owner.itemCls);
  19866. }
  19867. if (removeClasses.length) {
  19868. el.removeCls(removeClasses);
  19869. }
  19870. }
  19871. delete item.ownerLayout;
  19872. },
  19873. destroy : function() {
  19874. var me = this,
  19875. target;
  19876. if (me.targetCls) {
  19877. target = me.getTarget();
  19878. if (target) {
  19879. target.removeCls(me.targetCls);
  19880. }
  19881. }
  19882. me.onDestroy();
  19883. },
  19884. sortWeightedItems: function (items, reverseProp) {
  19885. for (var i = 0, length = items.length; i < length; ++i) {
  19886. items[i].$i = i;
  19887. }
  19888. Ext.Array.sort(items, function (item1, item2) {
  19889. var ret = item2.weight - item1.weight;
  19890. if (!ret) {
  19891. ret = item1.$i - item2.$i;
  19892. if (item1[reverseProp]) {
  19893. ret = -ret;
  19894. }
  19895. }
  19896. return ret;
  19897. });
  19898. for (i = 0; i < length; ++i) {
  19899. delete items[i].$i;
  19900. }
  19901. }
  19902. }, function () {
  19903. var Layout = this,
  19904. sizeModels = {},
  19905. sizeModelsArray = [],
  19906. i, j, n, pairs, sizeModel;
  19907. Layout.prototype.sizeModels = Layout.sizeModels = sizeModels;
  19908. var SizeModel = function (config) {
  19909. var me = this,
  19910. name = config.name;
  19911. Ext.apply(Ext.apply(me, defaults), config);
  19912. me[name] = true;
  19913. SizeModel[name] = sizeModels[name] = me;
  19914. me.fixed = !(me.auto = me.natural || me.shrinkWrap);
  19915. me.ordinal = sizeModelsArray.length;
  19916. sizeModelsArray.push(me);
  19917. };
  19918. Ext.layout.SizeModel = SizeModel;
  19919. var defaults = {
  19920. calculated: false,
  19921. configured: false,
  19922. constrainedMax: false,
  19923. constrainedMin: false,
  19924. natural: false,
  19925. shrinkWrap: false,
  19926. calculatedFromConfigured: false,
  19927. calculatedFromNatural: false,
  19928. calculatedFromShrinkWrap: false,
  19929. names: null
  19930. };
  19931. new SizeModel({
  19932. name: 'calculated'
  19933. });
  19934. new SizeModel({
  19935. name: 'configured',
  19936. names: { width: 'width', height: 'height' }
  19937. });
  19938. new SizeModel({
  19939. name: 'natural'
  19940. });
  19941. new SizeModel({
  19942. name: 'shrinkWrap'
  19943. });
  19944. new SizeModel({
  19945. name: 'calculatedFromConfigured',
  19946. configured: true,
  19947. names: { width: 'width', height: 'height' }
  19948. });
  19949. new SizeModel({
  19950. name: 'calculatedFromNatural',
  19951. natural: true
  19952. });
  19953. new SizeModel({
  19954. name: 'calculatedFromShrinkWrap',
  19955. shrinkWrap: true
  19956. });
  19957. new SizeModel({
  19958. name: 'constrainedMax',
  19959. configured: true,
  19960. constrained: true,
  19961. names: { width: 'maxWidth', height: 'maxHeight' }
  19962. });
  19963. new SizeModel({
  19964. name: 'constrainedMin',
  19965. configured: true,
  19966. constrained: true,
  19967. names: { width: 'minWidth', height: 'minHeight' }
  19968. });
  19969. for (i = 0, n = sizeModelsArray.length; i < n; ++i) {
  19970. sizeModel = sizeModelsArray[i];
  19971. sizeModel.pairsByHeightOrdinal = pairs = [];
  19972. for (j = 0; j < n; ++j) {
  19973. pairs.push({
  19974. width: sizeModel,
  19975. height: sizeModelsArray[j]
  19976. });
  19977. }
  19978. }
  19979. });
  19980. Ext.define('Ext.layout.container.Container', {
  19981. extend: 'Ext.layout.Layout',
  19982. alternateClassName: 'Ext.layout.ContainerLayout',
  19983. mixins: {
  19984. elementCt: 'Ext.util.ElementContainer'
  19985. },
  19986. requires: [
  19987. 'Ext.XTemplate'
  19988. ],
  19989. type: 'container',
  19990. manageOverflow: 0,
  19991. beginCollapse: Ext.emptyFn,
  19992. beginExpand: Ext.emptyFn,
  19993. animatePolicy: null,
  19994. childEls: [
  19995. 'overflowPadderEl'
  19996. ],
  19997. renderTpl: [
  19998. '{%this.renderBody(out,values)%}'
  19999. ],
  20000. usesContainerHeight: true,
  20001. usesContainerWidth: true,
  20002. usesHeight: true,
  20003. usesWidth: true,
  20004. reserveScrollbar: false,
  20005. lastOverflowAdjust: {
  20006. width: 0,
  20007. height: 0
  20008. },
  20009. constructor: function () {
  20010. this.callParent(arguments);
  20011. this.mixins.elementCt.constructor.call(this);
  20012. },
  20013. destroy : function() {
  20014. this.callParent();
  20015. this.mixins.elementCt.destroy.call(this);
  20016. },
  20017. initLayout: function() {
  20018. var me = this,
  20019. scrollbarWidth = Ext.getScrollbarSize().width;
  20020. me.callParent();
  20021. if (scrollbarWidth && me.manageOverflow && !me.hasOwnProperty('lastOverflowAdjust')) {
  20022. if (me.owner.autoScroll || me.reserveScrollbar) {
  20023. me.lastOverflowAdjust = {
  20024. width: scrollbarWidth,
  20025. height: 0
  20026. };
  20027. }
  20028. }
  20029. },
  20030. beginLayout: function (ownerContext) {
  20031. this.callParent(arguments);
  20032. ownerContext.targetContext = ownerContext.getEl('getTarget', this);
  20033. this.cacheChildItems(ownerContext);
  20034. },
  20035. beginLayoutCycle: function (ownerContext, firstCycle) {
  20036. var me = this,
  20037. padEl = me.overflowPadderEl;
  20038. me.callParent(arguments);
  20039. if (!ownerContext.state.overflowAdjust) {
  20040. ownerContext.state.overflowAdjust = me.lastOverflowAdjust;
  20041. }
  20042. if (firstCycle) {
  20043. if (me.usesContainerHeight) {
  20044. ++ownerContext.consumersContainerHeight;
  20045. }
  20046. if (me.usesContainerWidth) {
  20047. ++ownerContext.consumersContainerWidth;
  20048. }
  20049. }
  20050. if (padEl) {
  20051. padEl.setStyle('display', 'none');
  20052. }
  20053. },
  20054. completeLayout: function (ownerContext) {
  20055. this.lastOverflowAdjust = ownerContext.state.overflowAdjust;
  20056. },
  20057. cacheChildItems: function (ownerContext) {
  20058. var context = ownerContext.context,
  20059. childItems = [],
  20060. items = this.getVisibleItems(),
  20061. length = items.length,
  20062. i;
  20063. ownerContext.childItems = childItems;
  20064. ownerContext.visibleItems = items;
  20065. for (i = 0; i < length; ++i) {
  20066. childItems.push(context.getCmp(items[i]));
  20067. }
  20068. },
  20069. cacheElements: function () {
  20070. var owner = this.owner;
  20071. this.applyChildEls(owner.el, owner.id);
  20072. },
  20073. calculateContentSize: function (ownerContext, dimensions) {
  20074. var me = this,
  20075. containerDimensions = (dimensions || 0) | me.manageOverflow |
  20076. ((ownerContext.widthModel.shrinkWrap ? 1 : 0) |
  20077. (ownerContext.heightModel.shrinkWrap ? 2 : 0)),
  20078. calcWidth = (containerDimensions & 1) || undefined,
  20079. calcHeight = (containerDimensions & 2) || undefined,
  20080. childItems = ownerContext.childItems,
  20081. length = childItems.length,
  20082. contentHeight = 0,
  20083. contentWidth = 0,
  20084. needed = 0,
  20085. props = ownerContext.props,
  20086. targetXY, targetX, targetY, targetPadding,
  20087. borders, child, childContext, childX, childY, height, i, margins, width, xy;
  20088. if (calcWidth) {
  20089. if (isNaN(props.contentWidth)) {
  20090. ++needed;
  20091. } else {
  20092. calcWidth = undefined;
  20093. }
  20094. }
  20095. if (calcHeight) {
  20096. if (isNaN(props.contentHeight)) {
  20097. ++needed;
  20098. } else {
  20099. calcHeight = undefined;
  20100. }
  20101. }
  20102. if (needed) {
  20103. for (i = 0; i < length; ++i) {
  20104. childContext = childItems[i];
  20105. child = childContext.target;
  20106. height = calcHeight && childContext.getProp('height');
  20107. width = calcWidth && childContext.getProp('width');
  20108. margins = childContext.getMarginInfo();
  20109. if ((calcWidth && isNaN(child.x)) || (calcHeight && isNaN(child.y))) {
  20110. xy = child.el.getXY();
  20111. if (!targetXY) {
  20112. targetXY = ownerContext.targetContext.el.getXY();
  20113. borders = ownerContext.targetContext.getBorderInfo();
  20114. targetX = targetXY[0] + borders.left;
  20115. targetY = targetXY[1] + borders.top;
  20116. }
  20117. childX = xy[0] - targetX;
  20118. childY = xy[1] - targetY;
  20119. } else {
  20120. childX = child.x;
  20121. childY = child.y;
  20122. }
  20123. height += margins.bottom;
  20124. width += margins.right;
  20125. contentHeight = Math.max(contentHeight, childY + height);
  20126. contentWidth = Math.max(contentWidth, childX + width);
  20127. if (isNaN(contentHeight) && isNaN(contentWidth)) {
  20128. me.done = false;
  20129. return;
  20130. }
  20131. }
  20132. if (calcWidth || calcHeight) {
  20133. targetPadding = ownerContext.targetContext.getPaddingInfo();
  20134. }
  20135. if (calcWidth && !ownerContext.setContentWidth(contentWidth + targetPadding.right)) {
  20136. me.done = false;
  20137. }
  20138. if (calcHeight && !ownerContext.setContentHeight(contentHeight + targetPadding.bottom)) {
  20139. me.done = false;
  20140. }
  20141. }
  20142. },
  20143. calculateOverflow: function (ownerContext, containerSize, dimensions) {
  20144. var me = this,
  20145. owner = me.owner,
  20146. manageOverflow = me.manageOverflow,
  20147. state = ownerContext.state,
  20148. overflowAdjust = state.overflowAdjust,
  20149. padWidth, padHeight, padElContext, padding, scrollRangeFlags,
  20150. overflow, scrollbarSize, contentW, contentH, ownerW, ownerH, scrollbars,
  20151. xauto, yauto;
  20152. if (manageOverflow && !state.secondPass && !me.reserveScrollbar) {
  20153. if (owner.autoScroll) {
  20154. xauto = yauto = true;
  20155. } else {
  20156. if (owner.overflowX) {
  20157. xauto = owner.overflowX == 'auto';
  20158. } else {
  20159. overflow = ownerContext.targetContext.getStyle('overflow-x');
  20160. xauto = overflow && overflow != 'hidden' && overflow != 'scroll';
  20161. }
  20162. if (owner.overflowY) {
  20163. yauto = owner.overflowY == 'auto';
  20164. } else {
  20165. overflow = ownerContext.targetContext.getStyle('overflow-y');
  20166. yauto = overflow && overflow != 'hidden' && overflow != 'scroll';
  20167. }
  20168. }
  20169. if (!containerSize.gotWidth) {
  20170. xauto = false;
  20171. }
  20172. if (!containerSize.gotHeight) {
  20173. yauto = false;
  20174. }
  20175. if (xauto || yauto) {
  20176. scrollbarSize = Ext.getScrollbarSize();
  20177. contentW = ownerContext.peek('contentWidth');
  20178. contentH = ownerContext.peek('contentHeight');
  20179. ownerW = containerSize.width;
  20180. ownerH = containerSize.height;
  20181. scrollbars = me.getScrollbarsNeeded(ownerW, ownerH, contentW, contentH);
  20182. state.overflowState = scrollbars;
  20183. if (typeof dimensions == 'number') {
  20184. scrollbars &= ~dimensions;
  20185. }
  20186. overflowAdjust = {
  20187. width: (xauto && (scrollbars & 2)) ? scrollbarSize.width : 0,
  20188. height: (yauto && (scrollbars & 1)) ? scrollbarSize.height : 0
  20189. };
  20190. if (overflowAdjust.width !== me.lastOverflowAdjust.width || overflowAdjust.height !== me.lastOverflowAdjust.height) {
  20191. me.done = false;
  20192. ownerContext.invalidate({
  20193. state: {
  20194. overflowAdjust: overflowAdjust,
  20195. overflowState: state.overflowState,
  20196. secondPass: true
  20197. }
  20198. });
  20199. }
  20200. }
  20201. }
  20202. if (!me.done) {
  20203. return;
  20204. }
  20205. padElContext = ownerContext.padElContext ||
  20206. (ownerContext.padElContext = ownerContext.getEl('overflowPadderEl', me));
  20207. if (padElContext) {
  20208. scrollbars = state.overflowState;
  20209. padWidth = containerSize.width;
  20210. padHeight = 0;
  20211. if (scrollbars) {
  20212. padding = ownerContext.targetContext.getPaddingInfo();
  20213. scrollRangeFlags = me.scrollRangeFlags;
  20214. if ((scrollbars & 2) && (scrollRangeFlags & 1)) {
  20215. padHeight += padding.bottom;
  20216. }
  20217. if ((scrollbars & 1) && (scrollRangeFlags & 4)) {
  20218. padWidth += padding.right;
  20219. }
  20220. padElContext.setProp('display', '');
  20221. padElContext.setSize(padWidth, padHeight);
  20222. } else {
  20223. padElContext.setProp('display', 'none');
  20224. }
  20225. }
  20226. },
  20227. configureItem: function(item) {
  20228. var me = this,
  20229. ownerItemCls = me.owner.itemCls,
  20230. addClasses = [].concat(me.itemCls || []);
  20231. me.callParent(arguments);
  20232. if (ownerItemCls) {
  20233. addClasses = Ext.Array.push(addClasses, ownerItemCls);
  20234. }
  20235. item.addCls(addClasses);
  20236. },
  20237. doRenderBody: function (out, renderData) {
  20238. this.renderItems(out, renderData);
  20239. this.renderContent(out, renderData);
  20240. },
  20241. doRenderContainer: function (out, renderData) {
  20242. var me = renderData.$comp.layout,
  20243. tpl = me.getRenderTpl(),
  20244. data = me.getRenderData();
  20245. tpl.applyOut(data, out);
  20246. },
  20247. doRenderItems: function (out, renderData) {
  20248. var me = renderData.$layout,
  20249. tree = me.getRenderTree();
  20250. if (tree) {
  20251. Ext.DomHelper.generateMarkup(tree, out);
  20252. }
  20253. },
  20254. doRenderPadder: function (out, renderData) {
  20255. var me = renderData.$layout,
  20256. owner = me.owner,
  20257. scrollRangeFlags = me.getScrollRangeFlags();
  20258. if (me.manageOverflow == 2) {
  20259. if (scrollRangeFlags & 5) {
  20260. out.push('<div id="',owner.id,'-overflowPadderEl" ',
  20261. 'style="font-size: 1px; width:1px; height: 1px;');
  20262. out.push('"></div>');
  20263. me.scrollRangeFlags = scrollRangeFlags;
  20264. }
  20265. }
  20266. },
  20267. finishRender: function () {
  20268. var me = this,
  20269. target, items;
  20270. me.callParent();
  20271. me.cacheElements();
  20272. target = me.getRenderTarget();
  20273. items = me.getLayoutItems();
  20274. if (me.targetCls) {
  20275. me.getTarget().addCls(me.targetCls);
  20276. }
  20277. me.finishRenderItems(target, items);
  20278. },
  20279. notifyOwner: function() {
  20280. this.owner.afterLayout(this);
  20281. },
  20282. getContainerSize : function(ownerContext, inDom) {
  20283. var targetContext = ownerContext.targetContext,
  20284. frameInfo = targetContext.getFrameInfo(),
  20285. padding = targetContext.getPaddingInfo(),
  20286. got = 0,
  20287. needed = 0,
  20288. overflowAdjust = ownerContext.state.overflowAdjust,
  20289. gotWidth, gotHeight, width, height;
  20290. if (!ownerContext.widthModel.shrinkWrap) {
  20291. ++needed;
  20292. width = inDom ? targetContext.getDomProp('width') : targetContext.getProp('width');
  20293. gotWidth = (typeof width == 'number');
  20294. if (gotWidth) {
  20295. ++got;
  20296. width -= frameInfo.width + padding.width;
  20297. if (overflowAdjust) {
  20298. width -= overflowAdjust.width;
  20299. }
  20300. }
  20301. }
  20302. if (!ownerContext.heightModel.shrinkWrap) {
  20303. ++needed;
  20304. height = inDom ? targetContext.getDomProp('height') : targetContext.getProp('height');
  20305. gotHeight = (typeof height == 'number');
  20306. if (gotHeight) {
  20307. ++got;
  20308. height -= frameInfo.height + padding.height;
  20309. if (overflowAdjust) {
  20310. height -= overflowAdjust.height;
  20311. }
  20312. }
  20313. }
  20314. return {
  20315. width: width,
  20316. height: height,
  20317. needed: needed,
  20318. got: got,
  20319. gotAll: got == needed,
  20320. gotWidth: gotWidth,
  20321. gotHeight: gotHeight
  20322. };
  20323. },
  20324. getLayoutItems: function() {
  20325. var owner = this.owner,
  20326. items = owner && owner.items;
  20327. return (items && items.items) || [];
  20328. },
  20329. getRenderData: function () {
  20330. var comp = this.owner;
  20331. return {
  20332. $comp: comp,
  20333. $layout: this,
  20334. ownerId: comp.id
  20335. };
  20336. },
  20337. getRenderedItems: function() {
  20338. var me = this,
  20339. target = me.getRenderTarget(),
  20340. items = me.getLayoutItems(),
  20341. ln = items.length,
  20342. renderedItems = [],
  20343. i, item;
  20344. for (i = 0; i < ln; i++) {
  20345. item = items[i];
  20346. if (item.rendered && me.isValidParent(item, target, i)) {
  20347. renderedItems.push(item);
  20348. }
  20349. }
  20350. return renderedItems;
  20351. },
  20352. getRenderTarget: function() {
  20353. return this.owner.getTargetEl();
  20354. },
  20355. getElementTarget: function() {
  20356. return this.getRenderTarget();
  20357. },
  20358. getRenderTpl: function () {
  20359. var me = this,
  20360. renderTpl = Ext.XTemplate.getTpl(this, 'renderTpl');
  20361. if (!renderTpl.renderContent) {
  20362. me.owner.setupRenderTpl(renderTpl);
  20363. }
  20364. return renderTpl;
  20365. },
  20366. getRenderTree: function () {
  20367. var result,
  20368. items = this.owner.items,
  20369. itemsGen,
  20370. renderCfgs = {};
  20371. do {
  20372. itemsGen = items.generation;
  20373. result = this.getItemsRenderTree(this.getLayoutItems(), renderCfgs);
  20374. } while (items.generation !== itemsGen);
  20375. return result;
  20376. },
  20377. getScrollbarsNeeded: function (width, height, contentWidth, contentHeight) {
  20378. var scrollbarSize = Ext.getScrollbarSize(),
  20379. hasWidth = typeof width == 'number',
  20380. hasHeight = typeof height == 'number',
  20381. needHorz = 0,
  20382. needVert = 0;
  20383. if (!scrollbarSize.width) {
  20384. return 0;
  20385. }
  20386. if (hasHeight && height < contentHeight) {
  20387. needVert = 2;
  20388. width -= scrollbarSize.width;
  20389. }
  20390. if (hasWidth && width < contentWidth) {
  20391. needHorz = 1;
  20392. if (!needVert && hasHeight) {
  20393. height -= scrollbarSize.height;
  20394. if (height < contentHeight) {
  20395. needVert = 2;
  20396. }
  20397. }
  20398. }
  20399. return needVert + needHorz;
  20400. },
  20401. getScrollRangeFlags: (function () {
  20402. var flags = -1;
  20403. return function () {
  20404. if (flags < 0) {
  20405. var div = Ext.getBody().createChild({
  20406. cls: Ext.baseCSSPrefix + 'border-box',
  20407. style: {
  20408. width: '100px', height: '100px', padding: '10px',
  20409. overflow: 'auto'
  20410. },
  20411. children: [{
  20412. style: {
  20413. border: '1px solid red',
  20414. width: '150px', height: '150px',
  20415. margin: '0 5px 5px 0'
  20416. }
  20417. }]
  20418. }),
  20419. scrollHeight = div.dom.scrollHeight,
  20420. scrollWidth = div.dom.scrollWidth,
  20421. heightFlags = {
  20422. 175: 0,
  20423. 165: 1,
  20424. 170: 2,
  20425. 160: 3
  20426. },
  20427. widthFlags = {
  20428. 175: 0,
  20429. 165: 4,
  20430. 170: 8,
  20431. 160: 12
  20432. };
  20433. flags = (heightFlags[scrollHeight] || 0) | (widthFlags[scrollWidth] || 0);
  20434. div.remove();
  20435. }
  20436. return flags;
  20437. };
  20438. }()),
  20439. getTarget: function() {
  20440. return this.owner.getTargetEl();
  20441. },
  20442. getVisibleItems: function() {
  20443. var target = this.getRenderTarget(),
  20444. items = this.getLayoutItems(),
  20445. ln = items.length,
  20446. visibleItems = [],
  20447. i, item;
  20448. for (i = 0; i < ln; i++) {
  20449. item = items[i];
  20450. if (item.rendered && this.isValidParent(item, target, i) && item.hidden !== true) {
  20451. visibleItems.push(item);
  20452. }
  20453. }
  20454. return visibleItems;
  20455. },
  20456. setupRenderTpl: function (renderTpl) {
  20457. var me = this;
  20458. renderTpl.renderBody = me.doRenderBody;
  20459. renderTpl.renderContainer = me.doRenderContainer;
  20460. renderTpl.renderItems = me.doRenderItems;
  20461. renderTpl.renderPadder = me.doRenderPadder;
  20462. }
  20463. });
  20464. Ext.define('Ext.layout.container.Editor', {
  20465. alias: 'layout.editor',
  20466. extend: 'Ext.layout.container.Container',
  20467. autoSizeDefault: {
  20468. width: 'field',
  20469. height: 'field'
  20470. },
  20471. getItemSizePolicy: function (item) {
  20472. var me = this,
  20473. autoSize = me.owner.autoSize;
  20474. return me.sizePolicy || (me.sizePolicy = {
  20475. setsWidth: autoSize && autoSize.width === 'boundEl' ? 1 : 0,
  20476. setsHeight: autoSize && autoSize.height === 'boundEl' ? 1 : 0
  20477. });
  20478. },
  20479. calculate: function(ownerContext) {
  20480. var me = this,
  20481. owner = me.owner,
  20482. autoSize = owner.autoSize,
  20483. fieldWidth,
  20484. fieldHeight;
  20485. if (autoSize === true) {
  20486. autoSize = me.autoSizeDefault;
  20487. }
  20488. if (autoSize) {
  20489. fieldWidth = me.getDimension(owner, autoSize.width, 'getWidth', owner.width);
  20490. fieldHeight = me.getDimension(owner, autoSize.height, 'getHeight', owner.height);
  20491. }
  20492. ownerContext.childItems[0].setSize(fieldWidth, fieldHeight);
  20493. ownerContext.setWidth(fieldWidth);
  20494. ownerContext.setHeight(fieldHeight);
  20495. ownerContext.setContentSize(fieldWidth || owner.field.getWidth(),
  20496. fieldHeight || owner.field.getHeight());
  20497. },
  20498. getDimension: function(owner, type, getMethod, ownerSize){
  20499. switch (type) {
  20500. case 'boundEl':
  20501. return owner.boundEl[getMethod]();
  20502. case 'field':
  20503. return undefined;
  20504. default:
  20505. return ownerSize;
  20506. }
  20507. }
  20508. });
  20509. Ext.define('Ext.layout.component.Component', {
  20510. extend: 'Ext.layout.Layout',
  20511. type: 'component',
  20512. isComponentLayout: true,
  20513. nullBox: {},
  20514. usesContentHeight: true,
  20515. usesContentWidth: true,
  20516. usesHeight: true,
  20517. usesWidth: true,
  20518. beginLayoutCycle: function (ownerContext, firstCycle) {
  20519. var me = this,
  20520. owner = me.owner,
  20521. ownerCtContext = ownerContext.ownerCtContext,
  20522. heightModel = ownerContext.heightModel,
  20523. widthModel = ownerContext.widthModel,
  20524. body = owner.el.dom === document.body,
  20525. lastBox = owner.lastBox || me.nullBox,
  20526. lastSize = owner.el.lastBox || me.nullBox,
  20527. dirty = !body,
  20528. ownerLayout, v, widthName, heightName;
  20529. me.callParent(arguments);
  20530. if (firstCycle) {
  20531. if (me.usesContentWidth) {
  20532. ++ownerContext.consumersContentWidth;
  20533. }
  20534. if (me.usesContentHeight) {
  20535. ++ownerContext.consumersContentHeight;
  20536. }
  20537. if (me.usesWidth) {
  20538. ++ownerContext.consumersWidth;
  20539. }
  20540. if (me.usesHeight) {
  20541. ++ownerContext.consumersHeight;
  20542. }
  20543. if (ownerCtContext && !ownerCtContext.hasRawContent) {
  20544. ownerLayout = owner.ownerLayout;
  20545. if (ownerLayout.usesWidth) {
  20546. ++ownerContext.consumersWidth;
  20547. }
  20548. if (ownerLayout.usesHeight) {
  20549. ++ownerContext.consumersHeight;
  20550. }
  20551. }
  20552. }
  20553. if (widthModel.configured) {
  20554. widthName = widthModel.names.width;
  20555. if (!body) {
  20556. dirty = firstCycle ? owner[widthName] !== lastSize.width
  20557. : widthModel.constrained;
  20558. }
  20559. ownerContext.setWidth(owner[widthName], dirty);
  20560. } else if (ownerContext.isTopLevel) {
  20561. if (widthModel.calculated) {
  20562. v = lastBox.width;
  20563. ownerContext.setWidth(v, v != lastSize.width);
  20564. }
  20565. v = lastBox.x;
  20566. ownerContext.setProp('x', v, v != lastSize.x);
  20567. }
  20568. if (heightModel.configured) {
  20569. heightName = heightModel.names.height;
  20570. if (!body) {
  20571. dirty = firstCycle ? owner[heightName] !== lastSize.height
  20572. : heightModel.constrained;
  20573. }
  20574. ownerContext.setHeight(owner[heightName], dirty);
  20575. } else if (ownerContext.isTopLevel) {
  20576. if (heightModel.calculated) {
  20577. v = lastBox.height;
  20578. ownerContext.setHeight(v, v != lastSize.height);
  20579. }
  20580. v = lastBox.y;
  20581. ownerContext.setProp('y', v, v != lastSize.y);
  20582. }
  20583. },
  20584. finishedLayout: function(ownerContext) {
  20585. var me = this,
  20586. elementChildren = ownerContext.children,
  20587. owner = me.owner,
  20588. len, i, elContext, lastBox, props, v;
  20589. if (elementChildren) {
  20590. len = elementChildren.length;
  20591. for (i = 0; i < len; i++) {
  20592. elContext = elementChildren[i];
  20593. elContext.el.lastBox = elContext.props;
  20594. }
  20595. }
  20596. ownerContext.previousSize = me.lastComponentSize;
  20597. me.lastComponentSize = owner.el.lastBox = props = ownerContext.props;
  20598. owner.lastBox = lastBox = {};
  20599. v = props.x;
  20600. if (v !== undefined) {
  20601. lastBox.x = v;
  20602. }
  20603. v = props.y;
  20604. if (v !== undefined) {
  20605. lastBox.y = v;
  20606. }
  20607. v = props.width;
  20608. if (v !== undefined) {
  20609. lastBox.width = v;
  20610. }
  20611. v = props.height;
  20612. if (v !== undefined) {
  20613. lastBox.height = v;
  20614. }
  20615. me.callParent(arguments);
  20616. },
  20617. notifyOwner: function(ownerContext) {
  20618. var me = this,
  20619. currentSize = me.lastComponentSize,
  20620. prevSize = ownerContext.previousSize,
  20621. args = [currentSize.width, currentSize.height];
  20622. if (prevSize) {
  20623. args.push(prevSize.width, prevSize.height);
  20624. }
  20625. me.owner.afterComponentLayout.apply(me.owner, args);
  20626. },
  20627. getTarget : function() {
  20628. return this.owner.el;
  20629. },
  20630. getRenderTarget : function() {
  20631. return this.owner.el;
  20632. },
  20633. cacheTargetInfo: function(ownerContext) {
  20634. var me = this,
  20635. targetInfo = me.targetInfo,
  20636. target;
  20637. if (!targetInfo) {
  20638. target = ownerContext.getEl('getTarget', me);
  20639. me.targetInfo = targetInfo = {
  20640. padding: target.getPaddingInfo(),
  20641. border: target.getBorderInfo()
  20642. };
  20643. }
  20644. return targetInfo;
  20645. },
  20646. measureAutoDimensions: function (ownerContext, dimensions) {
  20647. var me = this,
  20648. owner = me.owner,
  20649. containerLayout = owner.layout,
  20650. heightModel = ownerContext.heightModel,
  20651. widthModel = ownerContext.widthModel,
  20652. boxParent = ownerContext.boxParent,
  20653. isBoxParent = ownerContext.isBoxParent,
  20654. props = ownerContext.props,
  20655. isContainer,
  20656. ret = {
  20657. gotWidth: false,
  20658. gotHeight: false,
  20659. isContainer: (isContainer = !ownerContext.hasRawContent)
  20660. },
  20661. hv = dimensions || 3,
  20662. zeroWidth, zeroHeight,
  20663. needed = 0,
  20664. got = 0,
  20665. ready, size, temp;
  20666. if (widthModel.shrinkWrap && ownerContext.consumersContentWidth) {
  20667. ++needed;
  20668. zeroWidth = !(hv & 1);
  20669. if (isContainer) {
  20670. if (zeroWidth) {
  20671. ret.contentWidth = 0;
  20672. ret.gotWidth = true;
  20673. ++got;
  20674. } else if ((ret.contentWidth = ownerContext.getProp('contentWidth')) !== undefined) {
  20675. ret.gotWidth = true;
  20676. ++got;
  20677. }
  20678. } else {
  20679. size = props.contentWidth;
  20680. if (typeof size == 'number') {
  20681. ret.contentWidth = size;
  20682. ret.gotWidth = true;
  20683. ++got;
  20684. } else {
  20685. if (zeroWidth) {
  20686. ready = true;
  20687. } else if (!ownerContext.hasDomProp('containerChildrenDone')) {
  20688. ready = false;
  20689. } else if (isBoxParent || !boxParent || boxParent.widthModel.shrinkWrap) {
  20690. ready = true;
  20691. } else {
  20692. ready = boxParent.hasDomProp('width');
  20693. }
  20694. if (ready) {
  20695. if (zeroWidth) {
  20696. temp = 0;
  20697. } else if (containerLayout && containerLayout.measureContentWidth) {
  20698. temp = containerLayout.measureContentWidth(ownerContext);
  20699. } else {
  20700. temp = me.measureContentWidth(ownerContext);
  20701. }
  20702. if (!isNaN(ret.contentWidth = temp)) {
  20703. ownerContext.setContentWidth(temp, true);
  20704. ret.gotWidth = true;
  20705. ++got;
  20706. }
  20707. }
  20708. }
  20709. }
  20710. } else if (widthModel.natural && ownerContext.consumersWidth) {
  20711. ++needed;
  20712. size = props.width;
  20713. if (typeof size == 'number') {
  20714. ret.width = size;
  20715. ret.gotWidth = true;
  20716. ++got;
  20717. } else {
  20718. if (isBoxParent || !boxParent) {
  20719. ready = true;
  20720. } else {
  20721. ready = boxParent.hasDomProp('width');
  20722. }
  20723. if (ready) {
  20724. if (!isNaN(ret.width = me.measureOwnerWidth(ownerContext))) {
  20725. ownerContext.setWidth(ret.width, false);
  20726. ret.gotWidth = true;
  20727. ++got;
  20728. }
  20729. }
  20730. }
  20731. }
  20732. if (heightModel.shrinkWrap && ownerContext.consumersContentHeight) {
  20733. ++needed;
  20734. zeroHeight = !(hv & 2);
  20735. if (isContainer) {
  20736. if (zeroHeight) {
  20737. ret.contentHeight = 0;
  20738. ret.gotHeight = true;
  20739. ++got;
  20740. } else if ((ret.contentHeight = ownerContext.getProp('contentHeight')) !== undefined) {
  20741. ret.gotHeight = true;
  20742. ++got;
  20743. }
  20744. } else {
  20745. size = props.contentHeight;
  20746. if (typeof size == 'number') {
  20747. ret.contentHeight = size;
  20748. ret.gotHeight = true;
  20749. ++got;
  20750. } else {
  20751. if (zeroHeight) {
  20752. ready = true;
  20753. } else if (!ownerContext.hasDomProp('containerChildrenDone')) {
  20754. ready = false;
  20755. } else if (owner.noWrap) {
  20756. ready = true;
  20757. } else if (!widthModel.shrinkWrap) {
  20758. ready = (ownerContext.bodyContext || ownerContext).hasDomProp('width');
  20759. } else if (isBoxParent || !boxParent || boxParent.widthModel.shrinkWrap) {
  20760. ready = true;
  20761. } else {
  20762. ready = boxParent.hasDomProp('width');
  20763. }
  20764. if (ready) {
  20765. if (zeroHeight) {
  20766. temp = 0;
  20767. } else if (containerLayout && containerLayout.measureContentHeight) {
  20768. temp = containerLayout.measureContentHeight(ownerContext);
  20769. } else {
  20770. temp = me.measureContentHeight(ownerContext);
  20771. }
  20772. if (!isNaN(ret.contentHeight = temp)) {
  20773. ownerContext.setContentHeight(temp, true);
  20774. ret.gotHeight = true;
  20775. ++got;
  20776. }
  20777. }
  20778. }
  20779. }
  20780. } else if (heightModel.natural && ownerContext.consumersHeight) {
  20781. ++needed;
  20782. size = props.height;
  20783. if (typeof size == 'number') {
  20784. ret.height = size;
  20785. ret.gotHeight = true;
  20786. ++got;
  20787. } else {
  20788. if (isBoxParent || !boxParent) {
  20789. ready = true;
  20790. } else {
  20791. ready = boxParent.hasDomProp('width');
  20792. }
  20793. if (ready) {
  20794. if (!isNaN(ret.height = me.measureOwnerHeight(ownerContext))) {
  20795. ownerContext.setHeight(ret.height, false);
  20796. ret.gotHeight = true;
  20797. ++got;
  20798. }
  20799. }
  20800. }
  20801. }
  20802. if (boxParent) {
  20803. ownerContext.onBoxMeasured();
  20804. }
  20805. ret.gotAll = got == needed;
  20806. return ret;
  20807. },
  20808. measureContentWidth: function (ownerContext) {
  20809. return ownerContext.el.getWidth() - ownerContext.getFrameInfo().width;
  20810. },
  20811. measureContentHeight: function (ownerContext) {
  20812. return ownerContext.el.getHeight() - ownerContext.getFrameInfo().height;
  20813. },
  20814. measureOwnerHeight: function (ownerContext) {
  20815. return ownerContext.el.getHeight();
  20816. },
  20817. measureOwnerWidth: function (ownerContext) {
  20818. return ownerContext.el.getWidth();
  20819. }
  20820. });
  20821. Ext.define('Ext.layout.component.Auto', {
  20822. alias: 'layout.autocomponent',
  20823. extend: 'Ext.layout.component.Component',
  20824. type: 'autocomponent',
  20825. setHeightInDom: false,
  20826. setWidthInDom: false,
  20827. waitForOuterHeightInDom: false,
  20828. waitForOuterWidthInDom: false,
  20829. beginLayoutCycle: function(ownerContext, firstCycle){
  20830. var me = this,
  20831. lastWidthModel = me.lastWidthModel,
  20832. lastHeightModel = me.lastHeightModel,
  20833. owner = me.owner;
  20834. me.callParent(arguments);
  20835. if (lastWidthModel && lastWidthModel.fixed && ownerContext.widthModel.shrinkWrap) {
  20836. owner.el.setWidth(null);
  20837. }
  20838. if (lastHeightModel && lastHeightModel.fixed && ownerContext.heightModel.shrinkWrap) {
  20839. owner.el.setHeight(null);
  20840. }
  20841. },
  20842. calculate: function(ownerContext) {
  20843. var me = this,
  20844. measurement = me.measureAutoDimensions(ownerContext),
  20845. heightModel = ownerContext.heightModel,
  20846. widthModel = ownerContext.widthModel,
  20847. width, height;
  20848. if (measurement.gotWidth) {
  20849. if (widthModel.shrinkWrap) {
  20850. me.publishOwnerWidth(ownerContext, measurement.contentWidth);
  20851. } else if (me.publishInnerWidth) {
  20852. me.publishInnerWidth(ownerContext, measurement.width);
  20853. }
  20854. } else if (!widthModel.auto && me.publishInnerWidth) {
  20855. width = me.waitForOuterWidthInDom ? ownerContext.getDomProp('width')
  20856. : ownerContext.getProp('width');
  20857. if (width === undefined) {
  20858. me.done = false;
  20859. } else {
  20860. me.publishInnerWidth(ownerContext, width);
  20861. }
  20862. }
  20863. if (measurement.gotHeight) {
  20864. if (heightModel.shrinkWrap) {
  20865. me.publishOwnerHeight(ownerContext, measurement.contentHeight);
  20866. } else if (me.publishInnerHeight) {
  20867. me.publishInnerHeight(ownerContext, measurement.height);
  20868. }
  20869. } else if (!heightModel.auto && me.publishInnerHeight) {
  20870. height = me.waitForOuterHeightInDom ? ownerContext.getDomProp('height')
  20871. : ownerContext.getProp('height');
  20872. if (height === undefined) {
  20873. me.done = false;
  20874. } else {
  20875. me.publishInnerHeight(ownerContext, height);
  20876. }
  20877. }
  20878. if (!measurement.gotAll) {
  20879. me.done = false;
  20880. }
  20881. },
  20882. calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
  20883. return contentHeight + ownerContext.getFrameInfo().height;
  20884. },
  20885. calculateOwnerWidthFromContentWidth: function (ownerContext, contentWidth) {
  20886. return contentWidth + ownerContext.getFrameInfo().width;
  20887. },
  20888. publishOwnerHeight: function (ownerContext, contentHeight) {
  20889. var me = this,
  20890. owner = me.owner,
  20891. height = me.calculateOwnerHeightFromContentHeight(ownerContext, contentHeight),
  20892. constrainedHeight, dirty, heightModel;
  20893. if (isNaN(height)) {
  20894. me.done = false;
  20895. } else {
  20896. constrainedHeight = Ext.Number.constrain(height, owner.minHeight, owner.maxHeight);
  20897. if (constrainedHeight == height) {
  20898. dirty = me.setHeightInDom;
  20899. } else {
  20900. heightModel = me.sizeModels[
  20901. (constrainedHeight < height) ? 'constrainedMax' : 'constrainedMin'];
  20902. height = constrainedHeight;
  20903. if (ownerContext.heightModel.calculatedFromShrinkWrap) {
  20904. ownerContext.heightModel = heightModel;
  20905. } else {
  20906. ownerContext.invalidate({ heightModel: heightModel });
  20907. }
  20908. }
  20909. ownerContext.setHeight(height, dirty);
  20910. }
  20911. },
  20912. publishOwnerWidth: function (ownerContext, contentWidth) {
  20913. var me = this,
  20914. owner = me.owner,
  20915. width = me.calculateOwnerWidthFromContentWidth(ownerContext, contentWidth),
  20916. constrainedWidth, dirty, widthModel;
  20917. if (isNaN(width)) {
  20918. me.done = false;
  20919. } else {
  20920. constrainedWidth = Ext.Number.constrain(width, owner.minWidth, owner.maxWidth);
  20921. if (constrainedWidth == width) {
  20922. dirty = me.setWidthInDom;
  20923. } else {
  20924. widthModel = me.sizeModels[
  20925. (constrainedWidth < width) ? 'constrainedMax' : 'constrainedMin'];
  20926. width = constrainedWidth;
  20927. if (ownerContext.widthModel.calculatedFromShrinkWrap) {
  20928. ownerContext.widthModel = widthModel;
  20929. } else {
  20930. ownerContext.invalidate({ widthModel: widthModel });
  20931. }
  20932. }
  20933. ownerContext.setWidth(width, dirty);
  20934. }
  20935. }
  20936. });
  20937. Ext.define('Ext.layout.container.Auto', {
  20938. alias: ['layout.auto', 'layout.autocontainer'],
  20939. extend: 'Ext.layout.container.Container',
  20940. type: 'autocontainer',
  20941. childEls: [
  20942. 'clearEl'
  20943. ],
  20944. renderTpl: [
  20945. '{%this.renderBody(out,values)%}',
  20946. '<div id="{ownerId}-clearEl" class="', Ext.baseCSSPrefix, 'clear" role="presentation"></div>'
  20947. ],
  20948. calculate: function(ownerContext) {
  20949. var me = this,
  20950. containerSize;
  20951. if (!ownerContext.hasDomProp('containerChildrenDone')) {
  20952. me.done = false;
  20953. } else {
  20954. containerSize = me.getContainerSize(ownerContext);
  20955. if (!containerSize.gotAll) {
  20956. me.done = false;
  20957. }
  20958. me.calculateContentSize(ownerContext);
  20959. }
  20960. }
  20961. });
  20962. Ext.define('Ext.util.Filter', {
  20963. anyMatch: false,
  20964. exactMatch: false,
  20965. caseSensitive: false,
  20966. constructor: function(config) {
  20967. var me = this;
  20968. Ext.apply(me, config);
  20969. me.filter = me.filter || me.filterFn;
  20970. if (me.filter === undefined) {
  20971. if (me.property === undefined || me.value === undefined) {
  20972. } else {
  20973. me.filter = me.createFilterFn();
  20974. }
  20975. me.filterFn = me.filter;
  20976. }
  20977. },
  20978. createFilterFn: function() {
  20979. var me = this,
  20980. matcher = me.createValueMatcher(),
  20981. property = me.property;
  20982. return function(item) {
  20983. var value = me.getRoot.call(me, item)[property];
  20984. return matcher === null ? value === null : matcher.test(value);
  20985. };
  20986. },
  20987. getRoot: function(item) {
  20988. var root = this.root;
  20989. return root === undefined ? item : item[root];
  20990. },
  20991. createValueMatcher : function() {
  20992. var me = this,
  20993. value = me.value,
  20994. anyMatch = me.anyMatch,
  20995. exactMatch = me.exactMatch,
  20996. caseSensitive = me.caseSensitive,
  20997. escapeRe = Ext.String.escapeRegex;
  20998. if (value === null) {
  20999. return value;
  21000. }
  21001. if (!value.exec) {
  21002. value = String(value);
  21003. if (anyMatch === true) {
  21004. value = escapeRe(value);
  21005. } else {
  21006. value = '^' + escapeRe(value);
  21007. if (exactMatch === true) {
  21008. value += '$';
  21009. }
  21010. }
  21011. value = new RegExp(value, caseSensitive ? '' : 'i');
  21012. }
  21013. return value;
  21014. }
  21015. });
  21016. Ext.define('Ext.util.AbstractMixedCollection', {
  21017. requires: ['Ext.util.Filter'],
  21018. mixins: {
  21019. observable: 'Ext.util.Observable'
  21020. },
  21021. isMixedCollection: true,
  21022. generation: 0,
  21023. constructor: function(allowFunctions, keyFn) {
  21024. var me = this;
  21025. me.items = [];
  21026. me.map = {};
  21027. me.keys = [];
  21028. me.length = 0;
  21029. me.allowFunctions = allowFunctions === true;
  21030. if (keyFn) {
  21031. me.getKey = keyFn;
  21032. }
  21033. me.mixins.observable.constructor.call(me);
  21034. },
  21035. allowFunctions : false,
  21036. add : function(key, obj){
  21037. var me = this,
  21038. myObj = obj,
  21039. myKey = key,
  21040. old;
  21041. if (arguments.length == 1) {
  21042. myObj = myKey;
  21043. myKey = me.getKey(myObj);
  21044. }
  21045. if (typeof myKey != 'undefined' && myKey !== null) {
  21046. old = me.map[myKey];
  21047. if (typeof old != 'undefined') {
  21048. return me.replace(myKey, myObj);
  21049. }
  21050. me.map[myKey] = myObj;
  21051. }
  21052. me.generation++;
  21053. me.length++;
  21054. me.items.push(myObj);
  21055. me.keys.push(myKey);
  21056. if (me.hasListeners.add) {
  21057. me.fireEvent('add', me.length - 1, myObj, myKey);
  21058. }
  21059. return myObj;
  21060. },
  21061. getKey : function(o){
  21062. return o.id;
  21063. },
  21064. replace : function(key, o){
  21065. var me = this,
  21066. old,
  21067. index;
  21068. if (arguments.length == 1) {
  21069. o = arguments[0];
  21070. key = me.getKey(o);
  21071. }
  21072. old = me.map[key];
  21073. if (typeof key == 'undefined' || key === null || typeof old == 'undefined') {
  21074. return me.add(key, o);
  21075. }
  21076. me.generation++;
  21077. index = me.indexOfKey(key);
  21078. me.items[index] = o;
  21079. me.map[key] = o;
  21080. if (me.hasListeners.replace) {
  21081. me.fireEvent('replace', key, old, o);
  21082. }
  21083. return o;
  21084. },
  21085. addAll : function(objs){
  21086. var me = this,
  21087. i = 0,
  21088. args,
  21089. len,
  21090. key;
  21091. if (arguments.length > 1 || Ext.isArray(objs)) {
  21092. args = arguments.length > 1 ? arguments : objs;
  21093. for (len = args.length; i < len; i++) {
  21094. me.add(args[i]);
  21095. }
  21096. } else {
  21097. for (key in objs) {
  21098. if (objs.hasOwnProperty(key)) {
  21099. if (me.allowFunctions || typeof objs[key] != 'function') {
  21100. me.add(key, objs[key]);
  21101. }
  21102. }
  21103. }
  21104. }
  21105. },
  21106. each : function(fn, scope){
  21107. var items = [].concat(this.items),
  21108. i = 0,
  21109. len = items.length,
  21110. item;
  21111. for (; i < len; i++) {
  21112. item = items[i];
  21113. if (fn.call(scope || item, item, i, len) === false) {
  21114. break;
  21115. }
  21116. }
  21117. },
  21118. eachKey : function(fn, scope){
  21119. var keys = this.keys,
  21120. items = this.items,
  21121. i = 0,
  21122. len = keys.length;
  21123. for (; i < len; i++) {
  21124. fn.call(scope || window, keys[i], items[i], i, len);
  21125. }
  21126. },
  21127. findBy : function(fn, scope) {
  21128. var keys = this.keys,
  21129. items = this.items,
  21130. i = 0,
  21131. len = items.length;
  21132. for (; i < len; i++) {
  21133. if (fn.call(scope || window, items[i], keys[i])) {
  21134. return items[i];
  21135. }
  21136. }
  21137. return null;
  21138. },
  21139. find : function() {
  21140. if (Ext.isDefined(Ext.global.console)) {
  21141. Ext.global.console.warn('Ext.util.MixedCollection: find has been deprecated. Use findBy instead.');
  21142. }
  21143. return this.findBy.apply(this, arguments);
  21144. },
  21145. insert : function(index, key, obj){
  21146. var me = this,
  21147. myKey = key,
  21148. myObj = obj;
  21149. if (arguments.length == 2) {
  21150. myObj = myKey;
  21151. myKey = me.getKey(myObj);
  21152. }
  21153. if (me.containsKey(myKey)) {
  21154. me.suspendEvents();
  21155. me.removeAtKey(myKey);
  21156. me.resumeEvents();
  21157. }
  21158. if (index >= me.length) {
  21159. return me.add(myKey, myObj);
  21160. }
  21161. me.generation++;
  21162. me.length++;
  21163. Ext.Array.splice(me.items, index, 0, myObj);
  21164. if (typeof myKey != 'undefined' && myKey !== null) {
  21165. me.map[myKey] = myObj;
  21166. }
  21167. Ext.Array.splice(me.keys, index, 0, myKey);
  21168. if (me.hasListeners.add) {
  21169. me.fireEvent('add', index, myObj, myKey);
  21170. }
  21171. return myObj;
  21172. },
  21173. remove : function(o) {
  21174. this.generation++;
  21175. return this.removeAt(this.indexOf(o));
  21176. },
  21177. removeAll : function(items) {
  21178. items = [].concat(items);
  21179. var i, iLen = items.length;
  21180. for (i = 0; i < iLen; i++) {
  21181. this.remove(items[i]);
  21182. }
  21183. return this;
  21184. },
  21185. removeAt : function(index) {
  21186. var me = this,
  21187. o,
  21188. key;
  21189. if (index < me.length && index >= 0) {
  21190. me.length--;
  21191. o = me.items[index];
  21192. Ext.Array.erase(me.items, index, 1);
  21193. key = me.keys[index];
  21194. if (typeof key != 'undefined') {
  21195. delete me.map[key];
  21196. }
  21197. Ext.Array.erase(me.keys, index, 1);
  21198. if (me.hasListeners.remove) {
  21199. me.fireEvent('remove', o, key);
  21200. }
  21201. me.generation++;
  21202. return o;
  21203. }
  21204. return false;
  21205. },
  21206. removeAtKey : function(key){
  21207. return this.removeAt(this.indexOfKey(key));
  21208. },
  21209. getCount : function(){
  21210. return this.length;
  21211. },
  21212. indexOf : function(o){
  21213. return Ext.Array.indexOf(this.items, o);
  21214. },
  21215. indexOfKey : function(key){
  21216. return Ext.Array.indexOf(this.keys, key);
  21217. },
  21218. get : function(key) {
  21219. var me = this,
  21220. mk = me.map[key],
  21221. item = mk !== undefined ? mk : (typeof key == 'number') ? me.items[key] : undefined;
  21222. return typeof item != 'function' || me.allowFunctions ? item : null;
  21223. },
  21224. getAt : function(index) {
  21225. return this.items[index];
  21226. },
  21227. getByKey : function(key) {
  21228. return this.map[key];
  21229. },
  21230. contains : function(o){
  21231. return typeof this.map[this.getKey(o)] != 'undefined';
  21232. },
  21233. containsKey : function(key){
  21234. return typeof this.map[key] != 'undefined';
  21235. },
  21236. clear : function(){
  21237. var me = this;
  21238. me.length = 0;
  21239. me.items = [];
  21240. me.keys = [];
  21241. me.map = {};
  21242. me.generation++;
  21243. if (me.hasListeners.clear) {
  21244. me.fireEvent('clear');
  21245. }
  21246. },
  21247. first : function() {
  21248. return this.items[0];
  21249. },
  21250. last : function() {
  21251. return this.items[this.length - 1];
  21252. },
  21253. sum: function(property, root, start, end) {
  21254. var values = this.extractValues(property, root),
  21255. length = values.length,
  21256. sum = 0,
  21257. i;
  21258. start = start || 0;
  21259. end = (end || end === 0) ? end : length - 1;
  21260. for (i = start; i <= end; i++) {
  21261. sum += values[i];
  21262. }
  21263. return sum;
  21264. },
  21265. collect: function(property, root, allowNull) {
  21266. var values = this.extractValues(property, root),
  21267. length = values.length,
  21268. hits = {},
  21269. unique = [],
  21270. value, strValue, i;
  21271. for (i = 0; i < length; i++) {
  21272. value = values[i];
  21273. strValue = String(value);
  21274. if ((allowNull || !Ext.isEmpty(value)) && !hits[strValue]) {
  21275. hits[strValue] = true;
  21276. unique.push(value);
  21277. }
  21278. }
  21279. return unique;
  21280. },
  21281. extractValues: function(property, root) {
  21282. var values = this.items;
  21283. if (root) {
  21284. values = Ext.Array.pluck(values, root);
  21285. }
  21286. return Ext.Array.pluck(values, property);
  21287. },
  21288. getRange : function(start, end){
  21289. var me = this,
  21290. items = me.items,
  21291. range = [],
  21292. i;
  21293. if (items.length < 1) {
  21294. return range;
  21295. }
  21296. start = start || 0;
  21297. end = Math.min(typeof end == 'undefined' ? me.length - 1 : end, me.length - 1);
  21298. if (start <= end) {
  21299. for (i = start; i <= end; i++) {
  21300. range[range.length] = items[i];
  21301. }
  21302. } else {
  21303. for (i = start; i >= end; i--) {
  21304. range[range.length] = items[i];
  21305. }
  21306. }
  21307. return range;
  21308. },
  21309. filter : function(property, value, anyMatch, caseSensitive) {
  21310. var filters = [],
  21311. filterFn;
  21312. if (Ext.isString(property)) {
  21313. filters.push(new Ext.util.Filter({
  21314. property : property,
  21315. value : value,
  21316. anyMatch : anyMatch,
  21317. caseSensitive: caseSensitive
  21318. }));
  21319. } else if (Ext.isArray(property) || property instanceof Ext.util.Filter) {
  21320. filters = filters.concat(property);
  21321. }
  21322. filterFn = function(record) {
  21323. var isMatch = true,
  21324. length = filters.length,
  21325. i,
  21326. filter,
  21327. fn,
  21328. scope;
  21329. for (i = 0; i < length; i++) {
  21330. filter = filters[i];
  21331. fn = filter.filterFn;
  21332. scope = filter.scope;
  21333. isMatch = isMatch && fn.call(scope, record);
  21334. }
  21335. return isMatch;
  21336. };
  21337. return this.filterBy(filterFn);
  21338. },
  21339. filterBy : function(fn, scope) {
  21340. var me = this,
  21341. newMC = new this.self(),
  21342. keys = me.keys,
  21343. items = me.items,
  21344. length = items.length,
  21345. i;
  21346. newMC.getKey = me.getKey;
  21347. for (i = 0; i < length; i++) {
  21348. if (fn.call(scope || me, items[i], keys[i])) {
  21349. newMC.add(keys[i], items[i]);
  21350. }
  21351. }
  21352. return newMC;
  21353. },
  21354. findIndex : function(property, value, start, anyMatch, caseSensitive){
  21355. if(Ext.isEmpty(value, false)){
  21356. return -1;
  21357. }
  21358. value = this.createValueMatcher(value, anyMatch, caseSensitive);
  21359. return this.findIndexBy(function(o){
  21360. return o && value.test(o[property]);
  21361. }, null, start);
  21362. },
  21363. findIndexBy : function(fn, scope, start){
  21364. var me = this,
  21365. keys = me.keys,
  21366. items = me.items,
  21367. i = start || 0,
  21368. len = items.length;
  21369. for (; i < len; i++) {
  21370. if (fn.call(scope || me, items[i], keys[i])) {
  21371. return i;
  21372. }
  21373. }
  21374. return -1;
  21375. },
  21376. createValueMatcher : function(value, anyMatch, caseSensitive, exactMatch) {
  21377. if (!value.exec) {
  21378. var er = Ext.String.escapeRegex;
  21379. value = String(value);
  21380. if (anyMatch === true) {
  21381. value = er(value);
  21382. } else {
  21383. value = '^' + er(value);
  21384. if (exactMatch === true) {
  21385. value += '$';
  21386. }
  21387. }
  21388. value = new RegExp(value, caseSensitive ? '' : 'i');
  21389. }
  21390. return value;
  21391. },
  21392. clone : function() {
  21393. var me = this,
  21394. copy = new this.self(),
  21395. keys = me.keys,
  21396. items = me.items,
  21397. i = 0,
  21398. len = items.length;
  21399. for(; i < len; i++){
  21400. copy.add(keys[i], items[i]);
  21401. }
  21402. copy.getKey = me.getKey;
  21403. return copy;
  21404. }
  21405. });
  21406. Ext.define('Ext.util.Sorter', {
  21407. direction: "ASC",
  21408. constructor: function(config) {
  21409. var me = this;
  21410. Ext.apply(me, config);
  21411. me.updateSortFunction();
  21412. },
  21413. createSortFunction: function(sorterFn) {
  21414. var me = this,
  21415. property = me.property,
  21416. direction = me.direction || "ASC",
  21417. modifier = direction.toUpperCase() == "DESC" ? -1 : 1;
  21418. return function(o1, o2) {
  21419. return modifier * sorterFn.call(me, o1, o2);
  21420. };
  21421. },
  21422. defaultSorterFn: function(o1, o2) {
  21423. var me = this,
  21424. transform = me.transform,
  21425. v1 = me.getRoot(o1)[me.property],
  21426. v2 = me.getRoot(o2)[me.property];
  21427. if (transform) {
  21428. v1 = transform(v1);
  21429. v2 = transform(v2);
  21430. }
  21431. return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
  21432. },
  21433. getRoot: function(item) {
  21434. return this.root === undefined ? item : item[this.root];
  21435. },
  21436. setDirection: function(direction) {
  21437. var me = this;
  21438. me.direction = direction ? direction.toUpperCase() : direction;
  21439. me.updateSortFunction();
  21440. },
  21441. toggle: function() {
  21442. var me = this;
  21443. me.direction = Ext.String.toggle(me.direction, "ASC", "DESC");
  21444. me.updateSortFunction();
  21445. },
  21446. updateSortFunction: function(fn) {
  21447. var me = this;
  21448. fn = fn || me.sorterFn || me.defaultSorterFn;
  21449. me.sort = me.createSortFunction(fn);
  21450. }
  21451. });
  21452. Ext.define("Ext.util.Sortable", {
  21453. isSortable: true,
  21454. defaultSortDirection: "ASC",
  21455. requires: [
  21456. 'Ext.util.Sorter'
  21457. ],
  21458. initSortable: function() {
  21459. var me = this,
  21460. sorters = me.sorters;
  21461. me.sorters = new Ext.util.AbstractMixedCollection(false, function(item) {
  21462. return item.id || item.property;
  21463. });
  21464. if (sorters) {
  21465. me.sorters.addAll(me.decodeSorters(sorters));
  21466. }
  21467. },
  21468. sort: function(sorters, direction, where, doSort) {
  21469. var me = this,
  21470. sorter, sorterFn,
  21471. newSorters;
  21472. if (Ext.isArray(sorters)) {
  21473. doSort = where;
  21474. where = direction;
  21475. newSorters = sorters;
  21476. }
  21477. else if (Ext.isObject(sorters)) {
  21478. doSort = where;
  21479. where = direction;
  21480. newSorters = [sorters];
  21481. }
  21482. else if (Ext.isString(sorters)) {
  21483. sorter = me.sorters.get(sorters);
  21484. if (!sorter) {
  21485. sorter = {
  21486. property : sorters,
  21487. direction: direction
  21488. };
  21489. newSorters = [sorter];
  21490. }
  21491. else if (direction === undefined) {
  21492. sorter.toggle();
  21493. }
  21494. else {
  21495. sorter.setDirection(direction);
  21496. }
  21497. }
  21498. if (newSorters && newSorters.length) {
  21499. newSorters = me.decodeSorters(newSorters);
  21500. if (Ext.isString(where)) {
  21501. if (where === 'prepend') {
  21502. sorters = me.sorters.clone().items;
  21503. me.sorters.clear();
  21504. me.sorters.addAll(newSorters);
  21505. me.sorters.addAll(sorters);
  21506. }
  21507. else {
  21508. me.sorters.addAll(newSorters);
  21509. }
  21510. }
  21511. else {
  21512. me.sorters.clear();
  21513. me.sorters.addAll(newSorters);
  21514. }
  21515. }
  21516. if (doSort !== false) {
  21517. me.onBeforeSort(newSorters);
  21518. sorters = me.sorters.items;
  21519. if (sorters.length) {
  21520. me.doSort(me.generateComparator());
  21521. }
  21522. }
  21523. return sorters;
  21524. },
  21525. generateComparator: function() {
  21526. var sorters = this.sorters.getRange();
  21527. return sorters.length ? this.createComparator(sorters) : this.emptyComparator;
  21528. },
  21529. createComparator: function(sorters) {
  21530. return function(r1, r2) {
  21531. var result = sorters[0].sort(r1, r2),
  21532. length = sorters.length,
  21533. i = 1;
  21534. for (; i < length; i++) {
  21535. result = result || sorters[i].sort.call(this, r1, r2);
  21536. }
  21537. return result;
  21538. };
  21539. },
  21540. emptyComparator: function(){
  21541. return 0;
  21542. },
  21543. onBeforeSort: Ext.emptyFn,
  21544. decodeSorters: function(sorters) {
  21545. if (!Ext.isArray(sorters)) {
  21546. if (sorters === undefined) {
  21547. sorters = [];
  21548. } else {
  21549. sorters = [sorters];
  21550. }
  21551. }
  21552. var length = sorters.length,
  21553. Sorter = Ext.util.Sorter,
  21554. fields = this.model ? this.model.prototype.fields : null,
  21555. field,
  21556. config, i;
  21557. for (i = 0; i < length; i++) {
  21558. config = sorters[i];
  21559. if (!(config instanceof Sorter)) {
  21560. if (Ext.isString(config)) {
  21561. config = {
  21562. property: config
  21563. };
  21564. }
  21565. Ext.applyIf(config, {
  21566. root : this.sortRoot,
  21567. direction: "ASC"
  21568. });
  21569. if (config.fn) {
  21570. config.sorterFn = config.fn;
  21571. }
  21572. if (typeof config == 'function') {
  21573. config = {
  21574. sorterFn: config
  21575. };
  21576. }
  21577. if (fields && !config.transform) {
  21578. field = fields.get(config.property);
  21579. config.transform = field ? field.sortType : undefined;
  21580. }
  21581. sorters[i] = new Ext.util.Sorter(config);
  21582. }
  21583. }
  21584. return sorters;
  21585. },
  21586. getSorters: function() {
  21587. return this.sorters.items;
  21588. },
  21589. getFirstSorter: function(){
  21590. var sorters = this.sorters.items,
  21591. len = sorters.length,
  21592. i = 0,
  21593. sorter;
  21594. for (; i < len; ++i) {
  21595. sorter = sorters[i];
  21596. if (!sorter.isGrouper) {
  21597. return sorter;
  21598. }
  21599. }
  21600. return null;
  21601. }
  21602. });
  21603. Ext.define('Ext.util.MixedCollection', {
  21604. extend: 'Ext.util.AbstractMixedCollection',
  21605. mixins: {
  21606. sortable: 'Ext.util.Sortable'
  21607. },
  21608. constructor: function() {
  21609. var me = this;
  21610. me.callParent(arguments);
  21611. me.addEvents('sort');
  21612. me.mixins.sortable.initSortable.call(me);
  21613. },
  21614. doSort: function(sorterFn) {
  21615. this.sortBy(sorterFn);
  21616. },
  21617. _sort : function(property, dir, fn){
  21618. var me = this,
  21619. i, len,
  21620. dsc = String(dir).toUpperCase() == 'DESC' ? -1 : 1,
  21621. c = [],
  21622. keys = me.keys,
  21623. items = me.items;
  21624. fn = fn || function(a, b) {
  21625. return a - b;
  21626. };
  21627. for(i = 0, len = items.length; i < len; i++){
  21628. c[c.length] = {
  21629. key : keys[i],
  21630. value: items[i],
  21631. index: i
  21632. };
  21633. }
  21634. Ext.Array.sort(c, function(a, b){
  21635. var v = fn(a[property], b[property]) * dsc;
  21636. if(v === 0){
  21637. v = (a.index < b.index ? -1 : 1);
  21638. }
  21639. return v;
  21640. });
  21641. for(i = 0, len = c.length; i < len; i++){
  21642. items[i] = c[i].value;
  21643. keys[i] = c[i].key;
  21644. }
  21645. me.fireEvent('sort', me);
  21646. },
  21647. sortBy: function(sorterFn) {
  21648. var me = this,
  21649. items = me.items,
  21650. keys = me.keys,
  21651. length = items.length,
  21652. temp = [],
  21653. i;
  21654. for (i = 0; i < length; i++) {
  21655. temp[i] = {
  21656. key : keys[i],
  21657. value: items[i],
  21658. index: i
  21659. };
  21660. }
  21661. Ext.Array.sort(temp, function(a, b) {
  21662. var v = sorterFn(a.value, b.value);
  21663. if (v === 0) {
  21664. v = (a.index < b.index ? -1 : 1);
  21665. }
  21666. return v;
  21667. });
  21668. for (i = 0; i < length; i++) {
  21669. items[i] = temp[i].value;
  21670. keys[i] = temp[i].key;
  21671. }
  21672. me.fireEvent('sort', me, items, keys);
  21673. },
  21674. findInsertionIndex: function(newItem, sorterFn) {
  21675. var me = this,
  21676. items = me.items,
  21677. start = 0,
  21678. end = items.length - 1,
  21679. middle,
  21680. comparison;
  21681. if (!sorterFn) {
  21682. sorterFn = me.generateComparator();
  21683. }
  21684. while (start <= end) {
  21685. middle = (start + end) >> 1;
  21686. comparison = sorterFn(newItem, items[middle]);
  21687. if (comparison >= 0) {
  21688. start = middle + 1;
  21689. } else if (comparison < 0) {
  21690. end = middle - 1;
  21691. }
  21692. }
  21693. return start;
  21694. },
  21695. reorder: function(mapping) {
  21696. var me = this,
  21697. items = me.items,
  21698. index = 0,
  21699. length = items.length,
  21700. order = [],
  21701. remaining = [],
  21702. oldIndex;
  21703. me.suspendEvents();
  21704. for (oldIndex in mapping) {
  21705. order[mapping[oldIndex]] = items[oldIndex];
  21706. }
  21707. for (index = 0; index < length; index++) {
  21708. if (mapping[index] == undefined) {
  21709. remaining.push(items[index]);
  21710. }
  21711. }
  21712. for (index = 0; index < length; index++) {
  21713. if (order[index] == undefined) {
  21714. order[index] = remaining.shift();
  21715. }
  21716. }
  21717. me.clear();
  21718. me.addAll(order);
  21719. me.resumeEvents();
  21720. me.fireEvent('sort', me);
  21721. },
  21722. sortByKey : function(dir, fn){
  21723. this._sort('key', dir, fn || function(a, b){
  21724. var v1 = String(a).toUpperCase(), v2 = String(b).toUpperCase();
  21725. return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
  21726. });
  21727. }
  21728. });
  21729. Ext.define('Ext.ZIndexManager', {
  21730. alternateClassName: 'Ext.WindowGroup',
  21731. statics: {
  21732. zBase : 9000
  21733. },
  21734. constructor: function(container) {
  21735. var me = this;
  21736. me.list = {};
  21737. me.zIndexStack = [];
  21738. me.front = null;
  21739. if (container) {
  21740. if (container.isContainer) {
  21741. container.on('resize', me._onContainerResize, me);
  21742. me.zseed = Ext.Number.from(me.rendered ? container.getEl().getStyle('zIndex') : undefined, me.getNextZSeed());
  21743. me.targetEl = container.getTargetEl();
  21744. me.container = container;
  21745. }
  21746. else {
  21747. Ext.EventManager.onWindowResize(me._onContainerResize, me);
  21748. me.zseed = me.getNextZSeed();
  21749. me.targetEl = Ext.get(container);
  21750. }
  21751. }
  21752. else {
  21753. Ext.EventManager.onWindowResize(me._onContainerResize, me);
  21754. me.zseed = me.getNextZSeed();
  21755. Ext.onDocumentReady(function() {
  21756. me.targetEl = Ext.getBody();
  21757. });
  21758. }
  21759. },
  21760. getNextZSeed: function() {
  21761. return (Ext.ZIndexManager.zBase += 10000);
  21762. },
  21763. setBase: function(baseZIndex) {
  21764. this.zseed = baseZIndex;
  21765. var result = this.assignZIndices();
  21766. this._activateLast();
  21767. return result;
  21768. },
  21769. assignZIndices: function() {
  21770. var a = this.zIndexStack,
  21771. len = a.length,
  21772. i = 0,
  21773. zIndex = this.zseed,
  21774. comp;
  21775. for (; i < len; i++) {
  21776. comp = a[i];
  21777. if (comp && !comp.hidden) {
  21778. zIndex = comp.setZIndex(zIndex);
  21779. }
  21780. }
  21781. this._activateLast();
  21782. return zIndex;
  21783. },
  21784. _setActiveChild: function(comp, oldFront) {
  21785. var front = this.front;
  21786. if (comp !== front) {
  21787. if (front && !front.destroying) {
  21788. front.setActive(false, comp);
  21789. }
  21790. this.front = comp;
  21791. if (comp && comp != oldFront) {
  21792. comp.setActive(true);
  21793. if (comp.modal) {
  21794. this._showModalMask(comp);
  21795. }
  21796. }
  21797. }
  21798. },
  21799. onComponentHide: function(comp){
  21800. comp.setActive(false);
  21801. this._activateLast();
  21802. },
  21803. _activateLast: function() {
  21804. var me = this,
  21805. stack = me.zIndexStack,
  21806. i = stack.length - 1,
  21807. oldFront = me.front,
  21808. comp;
  21809. me.front = undefined;
  21810. for (; i >= 0 && stack[i].hidden; --i);
  21811. if ((comp = stack[i])) {
  21812. me._setActiveChild(comp, oldFront);
  21813. if (comp.modal) {
  21814. return;
  21815. }
  21816. }
  21817. for (; i >= 0; --i) {
  21818. comp = stack[i];
  21819. if (comp.isVisible() && comp.modal) {
  21820. me._showModalMask(comp);
  21821. return;
  21822. }
  21823. }
  21824. me._hideModalMask();
  21825. },
  21826. _showModalMask: function(comp) {
  21827. var me = this,
  21828. zIndex = comp.el.getStyle('zIndex') - 4,
  21829. maskTarget = comp.floatParent ? comp.floatParent.getTargetEl() : comp.container,
  21830. viewSize = maskTarget.getBox();
  21831. if (maskTarget.dom === document.body) {
  21832. viewSize.height = Math.max(document.body.scrollHeight, Ext.dom.Element.getDocumentHeight());
  21833. viewSize.width = Math.max(document.body.scrollWidth, viewSize.width);
  21834. }
  21835. if (!me.mask) {
  21836. me.mask = Ext.getBody().createChild({
  21837. cls: Ext.baseCSSPrefix + 'mask'
  21838. });
  21839. me.mask.setVisibilityMode(Ext.Element.DISPLAY);
  21840. me.mask.on('click', me._onMaskClick, me);
  21841. }
  21842. me.mask.maskTarget = maskTarget;
  21843. maskTarget.addCls(Ext.baseCSSPrefix + 'body-masked');
  21844. me.mask.setStyle('zIndex', zIndex);
  21845. me.mask.show();
  21846. me.mask.setBox(viewSize);
  21847. },
  21848. _hideModalMask: function() {
  21849. var mask = this.mask;
  21850. if (mask && mask.isVisible()) {
  21851. mask.maskTarget.removeCls(Ext.baseCSSPrefix + 'body-masked');
  21852. mask.maskTarget = undefined;
  21853. mask.hide();
  21854. }
  21855. },
  21856. _onMaskClick: function() {
  21857. if (this.front) {
  21858. this.front.focus();
  21859. }
  21860. },
  21861. _onContainerResize: function() {
  21862. var mask = this.mask,
  21863. maskTarget,
  21864. viewSize;
  21865. if (mask && mask.isVisible()) {
  21866. mask.hide();
  21867. maskTarget = mask.maskTarget;
  21868. if (maskTarget.dom === document.body) {
  21869. viewSize = {
  21870. height: Math.max(document.body.scrollHeight, Ext.dom.Element.getDocumentHeight()),
  21871. width: Math.max(document.body.scrollWidth, document.documentElement.clientWidth)
  21872. };
  21873. } else {
  21874. viewSize = maskTarget.getViewSize(true);
  21875. }
  21876. mask.setSize(viewSize);
  21877. mask.show();
  21878. }
  21879. },
  21880. register : function(comp) {
  21881. var me = this;
  21882. if (comp.zIndexManager) {
  21883. comp.zIndexManager.unregister(comp);
  21884. }
  21885. comp.zIndexManager = me;
  21886. me.list[comp.id] = comp;
  21887. me.zIndexStack.push(comp);
  21888. comp.on('hide', me.onComponentHide, me);
  21889. },
  21890. unregister : function(comp) {
  21891. var me = this,
  21892. list = me.list;
  21893. delete comp.zIndexManager;
  21894. if (list && list[comp.id]) {
  21895. delete list[comp.id];
  21896. comp.un('hide', me.onComponentHide);
  21897. Ext.Array.remove(me.zIndexStack, comp);
  21898. me._activateLast();
  21899. }
  21900. },
  21901. get : function(id) {
  21902. return id.isComponent ? id : this.list[id];
  21903. },
  21904. bringToFront : function(comp) {
  21905. var me = this,
  21906. result = false,
  21907. zIndexStack = me.zIndexStack;
  21908. comp = me.get(comp);
  21909. if (comp !== me.front) {
  21910. Ext.Array.remove(zIndexStack, comp);
  21911. if (comp.preventBringToFront) {
  21912. zIndexStack.unshift(comp);
  21913. } else {
  21914. zIndexStack.push(comp);
  21915. }
  21916. me.assignZIndices();
  21917. result = true;
  21918. this.front = comp;
  21919. }
  21920. if (result && comp.modal) {
  21921. me._showModalMask(comp);
  21922. }
  21923. return result;
  21924. },
  21925. sendToBack : function(comp) {
  21926. var me = this;
  21927. comp = me.get(comp);
  21928. Ext.Array.remove(me.zIndexStack, comp);
  21929. me.zIndexStack.unshift(comp);
  21930. me.assignZIndices();
  21931. this._activateLast();
  21932. return comp;
  21933. },
  21934. hideAll : function() {
  21935. var list = this.list,
  21936. item,
  21937. id;
  21938. for (id in list) {
  21939. if (list.hasOwnProperty(id)) {
  21940. item = list[id];
  21941. if (item.isComponent && item.isVisible()) {
  21942. item.hide();
  21943. }
  21944. }
  21945. }
  21946. },
  21947. hide: function() {
  21948. var me = this,
  21949. mask = me.mask,
  21950. i = 0,
  21951. stack = me.zIndexStack,
  21952. len = stack.length,
  21953. comp;
  21954. me.tempHidden = me.tempHidden||[];
  21955. for (; i < len; i++) {
  21956. comp = stack[i];
  21957. if (comp.isVisible()) {
  21958. me.tempHidden.push(comp);
  21959. comp.el.hide();
  21960. }
  21961. }
  21962. if (mask) {
  21963. mask.hide();
  21964. }
  21965. },
  21966. show: function() {
  21967. var me = this,
  21968. mask = me.mask,
  21969. i = 0,
  21970. tempHidden = me.tempHidden,
  21971. len = tempHidden ? tempHidden.length : 0,
  21972. comp;
  21973. for (; i < len; i++) {
  21974. comp = tempHidden[i];
  21975. comp.el.show();
  21976. comp.setPosition(comp.x, comp.y);
  21977. }
  21978. me.tempHidden.length = 0;
  21979. if (mask) {
  21980. mask.show();
  21981. mask.alignTo(mask.maskTarget, 'tl-tl');
  21982. }
  21983. },
  21984. getActive : function() {
  21985. return this.front;
  21986. },
  21987. getBy : function(fn, scope) {
  21988. var r = [],
  21989. i = 0,
  21990. stack = this.zIndexStack,
  21991. len = stack.length,
  21992. comp;
  21993. for (; i < len; i++) {
  21994. comp = stack[i];
  21995. if (fn.call(scope||comp, comp) !== false) {
  21996. r.push(comp);
  21997. }
  21998. }
  21999. return r;
  22000. },
  22001. each : function(fn, scope) {
  22002. var list = this.list,
  22003. id,
  22004. comp;
  22005. for (id in list) {
  22006. if (list.hasOwnProperty(id)) {
  22007. comp = list[id];
  22008. if (comp.isComponent && fn.call(scope || comp, comp) === false) {
  22009. return;
  22010. }
  22011. }
  22012. }
  22013. },
  22014. eachBottomUp: function (fn, scope) {
  22015. var stack = this.zIndexStack,
  22016. i = 0,
  22017. len = stack.length,
  22018. comp;
  22019. for (; i < len; i++) {
  22020. comp = stack[i];
  22021. if (comp.isComponent && fn.call(scope || comp, comp) === false) {
  22022. return;
  22023. }
  22024. }
  22025. },
  22026. eachTopDown: function (fn, scope) {
  22027. var stack = this.zIndexStack,
  22028. i = stack.length,
  22029. comp;
  22030. for (; i-- > 0; ) {
  22031. comp = stack[i];
  22032. if (comp.isComponent && fn.call(scope || comp, comp) === false) {
  22033. return;
  22034. }
  22035. }
  22036. },
  22037. destroy: function() {
  22038. var me = this,
  22039. list = me.list,
  22040. comp,
  22041. id;
  22042. for (id in list) {
  22043. if (list.hasOwnProperty(id)) {
  22044. comp = list[id];
  22045. if (comp.isComponent) {
  22046. comp.destroy();
  22047. }
  22048. }
  22049. }
  22050. delete me.zIndexStack;
  22051. delete me.list;
  22052. delete me.container;
  22053. delete me.targetEl;
  22054. }
  22055. }, function() {
  22056. Ext.WindowManager = Ext.WindowMgr = new this();
  22057. });
  22058. Ext.define('Ext.container.AbstractContainer', {
  22059. extend: 'Ext.Component',
  22060. requires: [
  22061. 'Ext.util.MixedCollection',
  22062. 'Ext.layout.container.Auto',
  22063. 'Ext.ZIndexManager'
  22064. ],
  22065. renderTpl: '{%this.renderContainer(out,values)%}',
  22066. suspendLayout : false,
  22067. autoDestroy : true,
  22068. defaultType: 'panel',
  22069. detachOnRemove: true,
  22070. isContainer : true,
  22071. layoutCounter : 0,
  22072. baseCls: Ext.baseCSSPrefix + 'container',
  22073. bubbleEvents: ['add', 'remove'],
  22074. defaultLayoutType: 'auto',
  22075. initComponent : function(){
  22076. var me = this;
  22077. me.addEvents(
  22078. 'afterlayout',
  22079. 'beforeadd',
  22080. 'beforeremove',
  22081. 'add',
  22082. 'remove'
  22083. );
  22084. me.callParent();
  22085. me.getLayout();
  22086. me.initItems();
  22087. },
  22088. initItems : function() {
  22089. var me = this,
  22090. items = me.items;
  22091. me.items = new Ext.util.AbstractMixedCollection(false, me.getComponentId);
  22092. if (items) {
  22093. if (!Ext.isArray(items)) {
  22094. items = [items];
  22095. }
  22096. me.add(items);
  22097. }
  22098. },
  22099. getFocusEl: function() {
  22100. return this.getTargetEl();
  22101. },
  22102. finishRenderChildren: function () {
  22103. this.callParent();
  22104. var layout = this.getLayout();
  22105. if (layout) {
  22106. layout.finishRender();
  22107. }
  22108. },
  22109. beforeRender: function () {
  22110. var me = this,
  22111. layout = me.getLayout();
  22112. me.callParent();
  22113. if (!layout.initialized) {
  22114. layout.initLayout();
  22115. }
  22116. },
  22117. setupRenderTpl: function (renderTpl) {
  22118. var layout = this.getLayout();
  22119. this.callParent(arguments);
  22120. layout.setupRenderTpl(renderTpl);
  22121. },
  22122. setLayout : function(layout) {
  22123. var currentLayout = this.layout;
  22124. if (currentLayout && currentLayout.isLayout && currentLayout != layout) {
  22125. currentLayout.setOwner(null);
  22126. }
  22127. this.layout = layout;
  22128. layout.setOwner(this);
  22129. },
  22130. getLayout : function() {
  22131. var me = this;
  22132. if (!me.layout || !me.layout.isLayout) {
  22133. me.setLayout(Ext.layout.Layout.create(me.layout, me.self.prototype.layout || 'autocontainer'));
  22134. }
  22135. return me.layout;
  22136. },
  22137. doLayout : function() {
  22138. this.updateLayout();
  22139. return this;
  22140. },
  22141. afterLayout : function(layout) {
  22142. var me = this;
  22143. ++me.layoutCounter;
  22144. if (me.hasListeners.afterlayout) {
  22145. me.fireEvent('afterlayout', me, layout);
  22146. }
  22147. },
  22148. prepareItems : function(items, applyDefaults) {
  22149. if (Ext.isArray(items)) {
  22150. items = items.slice();
  22151. } else {
  22152. items = [items];
  22153. }
  22154. var me = this,
  22155. i = 0,
  22156. len = items.length,
  22157. item;
  22158. for (; i < len; i++) {
  22159. item = items[i];
  22160. if (item == null) {
  22161. Ext.Array.erase(items, i, 1);
  22162. --i;
  22163. --len;
  22164. } else {
  22165. if (applyDefaults) {
  22166. item = this.applyDefaults(item);
  22167. }
  22168. item.isContained = me;
  22169. items[i] = me.lookupComponent(item);
  22170. delete item.isContained;
  22171. }
  22172. }
  22173. return items;
  22174. },
  22175. applyDefaults : function(config) {
  22176. var defaults = this.defaults;
  22177. if (defaults) {
  22178. if (Ext.isFunction(defaults)) {
  22179. defaults = defaults.call(this, config);
  22180. }
  22181. if (Ext.isString(config)) {
  22182. config = Ext.ComponentManager.get(config);
  22183. }
  22184. Ext.applyIf(config, defaults);
  22185. }
  22186. return config;
  22187. },
  22188. lookupComponent : function(comp) {
  22189. return (typeof comp == 'string') ? Ext.ComponentManager.get(comp)
  22190. : Ext.ComponentManager.create(comp, this.defaultType);
  22191. },
  22192. getComponentId : function(comp) {
  22193. return comp.getItemId();
  22194. },
  22195. add : function() {
  22196. var me = this,
  22197. args = Ext.Array.slice(arguments),
  22198. index = (typeof args[0] == 'number') ? args.shift() : -1,
  22199. layout = me.getLayout(),
  22200. addingArray, items, i, length, item, pos, ret;
  22201. if (args.length == 1 && Ext.isArray(args[0])) {
  22202. items = args[0];
  22203. addingArray = true;
  22204. } else {
  22205. items = args;
  22206. }
  22207. ret = items = me.prepareItems(items, true);
  22208. length = items.length;
  22209. if (me.rendered) {
  22210. Ext.suspendLayouts();
  22211. }
  22212. if (!addingArray && length == 1) {
  22213. ret = items[0];
  22214. }
  22215. for (i = 0; i < length; i++) {
  22216. item = items[i];
  22217. pos = (index < 0) ? me.items.length : (index + i);
  22218. if (item.floating) {
  22219. me.floatingItems = me.floatingItems || new Ext.util.MixedCollection();
  22220. me.floatingItems.add(item);
  22221. item.onAdded(me, pos);
  22222. } else if ((!me.hasListeners.beforeadd || me.fireEvent('beforeadd', me, item, pos) !== false) && me.onBeforeAdd(item) !== false) {
  22223. me.items.insert(pos, item);
  22224. item.onAdded(me, pos);
  22225. me.onAdd(item, pos);
  22226. layout.onAdd(item, pos);
  22227. if (me.hasListeners.add) {
  22228. me.fireEvent('add', me, item, pos);
  22229. }
  22230. }
  22231. }
  22232. me.updateLayout();
  22233. if (me.rendered) {
  22234. Ext.resumeLayouts(true);
  22235. }
  22236. return ret;
  22237. },
  22238. onAdd : Ext.emptyFn,
  22239. onRemove : Ext.emptyFn,
  22240. insert : function(index, comp) {
  22241. return this.add(index, comp);
  22242. },
  22243. move : function(fromIdx, toIdx) {
  22244. var items = this.items,
  22245. item;
  22246. item = items.removeAt(fromIdx);
  22247. if (item === false) {
  22248. return false;
  22249. }
  22250. items.insert(toIdx, item);
  22251. this.doLayout();
  22252. return item;
  22253. },
  22254. onBeforeAdd : function(item) {
  22255. var me = this,
  22256. border = item.border;
  22257. if (item.ownerCt && item.ownerCt !== me) {
  22258. item.ownerCt.remove(item, false);
  22259. }
  22260. if (me.border === false || me.border === 0) {
  22261. item.border = Ext.isDefined(border) && border !== false && border !== 0;
  22262. }
  22263. },
  22264. remove : function(comp, autoDestroy) {
  22265. var me = this,
  22266. c = me.getComponent(comp);
  22267. if (c && (!me.hasListeners.beforeremove || me.fireEvent('beforeremove', me, c) !== false)) {
  22268. me.doRemove(c, autoDestroy);
  22269. if (me.hasListeners.remove) {
  22270. me.fireEvent('remove', me, c);
  22271. }
  22272. if (!me.destroying) {
  22273. me.doLayout();
  22274. }
  22275. }
  22276. return c;
  22277. },
  22278. doRemove : function(component, autoDestroy) {
  22279. var me = this,
  22280. layout = me.layout,
  22281. hasLayout = layout && me.rendered,
  22282. destroying = autoDestroy === true || (autoDestroy !== false && me.autoDestroy);
  22283. autoDestroy = autoDestroy === true || (autoDestroy !== false && me.autoDestroy);
  22284. me.items.remove(component);
  22285. if (hasLayout) {
  22286. if (layout.running) {
  22287. Ext.AbstractComponent.cancelLayout(component, destroying);
  22288. }
  22289. layout.onRemove(component, destroying);
  22290. }
  22291. component.onRemoved(destroying);
  22292. me.onRemove(component, destroying);
  22293. if (destroying) {
  22294. component.destroy();
  22295. }
  22296. else {
  22297. if (hasLayout) {
  22298. layout.afterRemove(component);
  22299. }
  22300. if (me.detachOnRemove && component.rendered) {
  22301. Ext.getDetachedBody().appendChild(component.getEl());
  22302. }
  22303. }
  22304. },
  22305. removeAll : function(autoDestroy) {
  22306. var me = this,
  22307. removeItems = me.items.items.slice(),
  22308. items = [],
  22309. i = 0,
  22310. len = removeItems.length,
  22311. item;
  22312. me.suspendLayouts();
  22313. for (; i < len; i++) {
  22314. item = removeItems[i];
  22315. me.remove(item, autoDestroy);
  22316. if (item.ownerCt !== me) {
  22317. items.push(item);
  22318. }
  22319. }
  22320. me.resumeLayouts(!!len);
  22321. return items;
  22322. },
  22323. getRefItems : function(deep) {
  22324. var me = this,
  22325. items = me.items.items,
  22326. len = items.length,
  22327. i = 0,
  22328. item,
  22329. result = [];
  22330. for (; i < len; i++) {
  22331. item = items[i];
  22332. result.push(item);
  22333. if (deep && item.getRefItems) {
  22334. result.push.apply(result, item.getRefItems(true));
  22335. }
  22336. }
  22337. if (me.floatingItems) {
  22338. result.push.apply(result, me.floatingItems.items);
  22339. }
  22340. return result;
  22341. },
  22342. cascade : function(fn, scope, origArgs){
  22343. var me = this,
  22344. cs = me.items ? me.items.items : [],
  22345. len = cs.length,
  22346. i = 0,
  22347. c,
  22348. args = origArgs ? origArgs.concat(me) : [me],
  22349. componentIndex = args.length - 1;
  22350. if (fn.apply(scope || me, args) !== false) {
  22351. for (; i < len; i++){
  22352. c = cs[i];
  22353. if (c.cascade) {
  22354. c.cascade(fn, scope, origArgs);
  22355. } else {
  22356. args[componentIndex] = c;
  22357. fn.apply(scope || cs, args);
  22358. }
  22359. }
  22360. }
  22361. return this;
  22362. },
  22363. isAncestor: function(possibleDescendant) {
  22364. while (possibleDescendant) {
  22365. if (possibleDescendant.ownerCt === this) {
  22366. return true;
  22367. }
  22368. possibleDescendant = possibleDescendant.ownerCt;
  22369. }
  22370. },
  22371. getComponent : function(comp) {
  22372. if (Ext.isObject(comp)) {
  22373. comp = comp.getItemId();
  22374. }
  22375. return this.items.get(comp);
  22376. },
  22377. query : function(selector) {
  22378. selector = selector || '*';
  22379. return Ext.ComponentQuery.query(selector, this);
  22380. },
  22381. queryBy: function(fn, scope) {
  22382. var out = [],
  22383. items = this.getRefItems(true),
  22384. i = 0,
  22385. len = items.length,
  22386. item;
  22387. for (; i < len; ++i) {
  22388. item = items[i];
  22389. if (fn.call(scope || item, item) !== false) {
  22390. out.push(item);
  22391. }
  22392. }
  22393. return out;
  22394. },
  22395. queryById: function(id){
  22396. return this.down('#' + id);
  22397. },
  22398. child : function(selector) {
  22399. selector = selector || '';
  22400. return this.query('> ' + selector)[0] || null;
  22401. },
  22402. nextChild: function(child, selector) {
  22403. var me = this,
  22404. result,
  22405. childIndex = me.items.indexOf(child);
  22406. if (childIndex !== -1) {
  22407. result = selector ? Ext.ComponentQuery(selector, me.items.items.slice(childIndex + 1)) : me.items.getAt(childIndex + 1);
  22408. if (!result && me.ownerCt) {
  22409. result = me.ownerCt.nextChild(me, selector);
  22410. }
  22411. }
  22412. return result;
  22413. },
  22414. prevChild: function(child, selector) {
  22415. var me = this,
  22416. result,
  22417. childIndex = me.items.indexOf(child);
  22418. if (childIndex !== -1) {
  22419. result = selector ? Ext.ComponentQuery(selector, me.items.items.slice(childIndex + 1)) : me.items.getAt(childIndex + 1);
  22420. if (!result && me.ownerCt) {
  22421. result = me.ownerCt.nextChild(me, selector);
  22422. }
  22423. }
  22424. return result;
  22425. },
  22426. down : function(selector) {
  22427. return this.query(selector)[0] || null;
  22428. },
  22429. enable: function() {
  22430. this.callParent(arguments);
  22431. var itemsToDisable = this.getChildItemsToDisable(),
  22432. length = itemsToDisable.length,
  22433. item, i;
  22434. for (i = 0; i < length; i++) {
  22435. item = itemsToDisable[i];
  22436. if (item.resetDisable) {
  22437. item.enable();
  22438. }
  22439. }
  22440. return this;
  22441. },
  22442. disable: function() {
  22443. this.callParent(arguments);
  22444. var itemsToDisable = this.getChildItemsToDisable(),
  22445. length = itemsToDisable.length,
  22446. item, i;
  22447. for (i = 0; i < length; i++) {
  22448. item = itemsToDisable[i];
  22449. if (item.resetDisable !== false && !item.disabled) {
  22450. item.disable();
  22451. item.resetDisable = true;
  22452. }
  22453. }
  22454. return this;
  22455. },
  22456. getChildItemsToDisable: function(){
  22457. return this.query('[isFormField],button');
  22458. },
  22459. beforeLayout: function() {
  22460. return true;
  22461. },
  22462. beforeDestroy : function() {
  22463. var me = this,
  22464. items = me.items,
  22465. c;
  22466. if (items) {
  22467. while ((c = items.first())) {
  22468. me.doRemove(c, true);
  22469. }
  22470. }
  22471. Ext.destroy(
  22472. me.layout
  22473. );
  22474. me.callParent();
  22475. }
  22476. });
  22477. Ext.define('Ext.container.Container', {
  22478. extend: 'Ext.container.AbstractContainer',
  22479. alias: 'widget.container',
  22480. alternateClassName: 'Ext.Container',
  22481. fireHierarchyEvent: function (ename) {
  22482. this.hierarchyEventSource.fireEvent(ename, this);
  22483. },
  22484. afterHide: function() {
  22485. this.callParent(arguments);
  22486. this.fireHierarchyEvent('hide');
  22487. },
  22488. afterShow: function(){
  22489. this.callParent(arguments);
  22490. this.fireHierarchyEvent('show');
  22491. },
  22492. onAdded: function() {
  22493. this.callParent(arguments);
  22494. if (this.hierarchyEventSource.hasListeners.added) {
  22495. this.fireHierarchyEvent('added');
  22496. }
  22497. },
  22498. getChildByElement: function(el, deep) {
  22499. var item,
  22500. itemEl,
  22501. i = 0,
  22502. it = this.getRefItems(),
  22503. ln = it.length;
  22504. el = Ext.getDom(el);
  22505. for (; i < ln; i++) {
  22506. item = it[i];
  22507. itemEl = item.getEl();
  22508. if (itemEl && ((itemEl.dom === el) || itemEl.contains(el))) {
  22509. return (deep && item.getChildByElement) ? item.getChildByElement(el, deep) : item;
  22510. }
  22511. }
  22512. return null;
  22513. }
  22514. }, function () {
  22515. this.hierarchyEventSource = this.prototype.hierarchyEventSource = new Ext.util.Observable({ events: {
  22516. hide: true,
  22517. show: true,
  22518. collapse: true,
  22519. expand: true,
  22520. added: true
  22521. }});
  22522. });
  22523. Ext.define('Ext.Editor', {
  22524. extend: 'Ext.container.Container',
  22525. alias: 'widget.editor',
  22526. requires: ['Ext.layout.container.Editor'],
  22527. layout: 'editor',
  22528. allowBlur: true,
  22529. revertInvalid: true,
  22530. value : '',
  22531. alignment: 'c-c?',
  22532. offsets: [0, 0],
  22533. shadow : 'frame',
  22534. constrain : false,
  22535. swallowKeys : true,
  22536. completeOnEnter : true,
  22537. cancelOnEsc : true,
  22538. updateEl : false,
  22539. hidden: true,
  22540. baseCls: Ext.baseCSSPrefix + 'editor',
  22541. initComponent : function() {
  22542. var me = this,
  22543. field = me.field = Ext.ComponentManager.create(me.field, 'textfield');
  22544. Ext.apply(field, {
  22545. inEditor: true,
  22546. msgTarget: field.msgTarget == 'title' ? 'title' : 'qtip'
  22547. });
  22548. me.mon(field, {
  22549. scope: me,
  22550. blur: {
  22551. fn: me.onFieldBlur,
  22552. delay: 1
  22553. },
  22554. specialkey: me.onSpecialKey
  22555. });
  22556. if (field.grow) {
  22557. me.mon(field, 'autosize', me.onFieldAutosize, me, {delay: 1});
  22558. }
  22559. me.floating = {
  22560. constrain: me.constrain
  22561. };
  22562. me.items = field;
  22563. me.callParent(arguments);
  22564. me.addEvents(
  22565. 'beforestartedit',
  22566. 'startedit',
  22567. 'beforecomplete',
  22568. 'complete',
  22569. 'canceledit',
  22570. 'specialkey'
  22571. );
  22572. },
  22573. onFieldAutosize: function(){
  22574. this.updateLayout();
  22575. },
  22576. afterRender : function(ct, position) {
  22577. var me = this,
  22578. field = me.field,
  22579. inputEl = field.inputEl;
  22580. me.callParent(arguments);
  22581. if (inputEl) {
  22582. inputEl.dom.name = '';
  22583. if (me.swallowKeys) {
  22584. inputEl.swallowEvent([
  22585. 'keypress',
  22586. 'keydown'
  22587. ]);
  22588. }
  22589. }
  22590. },
  22591. onSpecialKey : function(field, event) {
  22592. var me = this,
  22593. key = event.getKey(),
  22594. complete = me.completeOnEnter && key == event.ENTER,
  22595. cancel = me.cancelOnEsc && key == event.ESC;
  22596. if (complete || cancel) {
  22597. event.stopEvent();
  22598. Ext.defer(function() {
  22599. if (complete) {
  22600. me.completeEdit();
  22601. } else {
  22602. me.cancelEdit();
  22603. }
  22604. if (field.triggerBlur) {
  22605. field.triggerBlur(event);
  22606. }
  22607. }, 10);
  22608. }
  22609. me.fireEvent('specialkey', me, field, event);
  22610. },
  22611. startEdit : function(el, value) {
  22612. var me = this,
  22613. field = me.field;
  22614. me.completeEdit();
  22615. me.boundEl = Ext.get(el);
  22616. value = Ext.isDefined(value) ? value : Ext.String.trim(me.boundEl.dom.innerText || me.boundEl.dom.innerHTML);
  22617. if (!me.rendered) {
  22618. me.render(me.parentEl || document.body);
  22619. }
  22620. if (me.fireEvent('beforestartedit', me, me.boundEl, value) !== false) {
  22621. me.startValue = value;
  22622. me.show();
  22623. field.suspendEvents();
  22624. field.reset();
  22625. field.setValue(value);
  22626. field.resumeEvents();
  22627. me.realign(true);
  22628. field.focus(false, 10);
  22629. if (field.autoSize) {
  22630. field.autoSize();
  22631. }
  22632. me.editing = true;
  22633. }
  22634. },
  22635. realign : function(autoSize) {
  22636. var me = this;
  22637. if (autoSize === true) {
  22638. me.updateLayout();
  22639. }
  22640. me.alignTo(me.boundEl, me.alignment, me.offsets);
  22641. },
  22642. completeEdit : function(remainVisible) {
  22643. var me = this,
  22644. field = me.field,
  22645. value;
  22646. if (!me.editing) {
  22647. return;
  22648. }
  22649. if (field.assertValue) {
  22650. field.assertValue();
  22651. }
  22652. value = me.getValue();
  22653. if (!field.isValid()) {
  22654. if (me.revertInvalid !== false) {
  22655. me.cancelEdit(remainVisible);
  22656. }
  22657. return;
  22658. }
  22659. if (String(value) === String(me.startValue) && me.ignoreNoChange) {
  22660. me.hideEdit(remainVisible);
  22661. return;
  22662. }
  22663. if (me.fireEvent('beforecomplete', me, value, me.startValue) !== false) {
  22664. value = me.getValue();
  22665. if (me.updateEl && me.boundEl) {
  22666. me.boundEl.update(value);
  22667. }
  22668. me.hideEdit(remainVisible);
  22669. me.fireEvent('complete', me, value, me.startValue);
  22670. }
  22671. },
  22672. onShow : function() {
  22673. var me = this;
  22674. me.callParent(arguments);
  22675. if (me.hideEl !== false) {
  22676. me.boundEl.hide();
  22677. }
  22678. me.fireEvent('startedit', me, me.boundEl, me.startValue);
  22679. },
  22680. cancelEdit : function(remainVisible) {
  22681. var me = this,
  22682. startValue = me.startValue,
  22683. field = me.field,
  22684. value;
  22685. if (me.editing) {
  22686. value = me.getValue();
  22687. field.suspendEvents();
  22688. me.setValue(startValue);
  22689. field.resumeEvents();
  22690. me.hideEdit(remainVisible);
  22691. me.fireEvent('canceledit', me, value, startValue);
  22692. }
  22693. },
  22694. hideEdit: function(remainVisible) {
  22695. if (remainVisible !== true) {
  22696. this.editing = false;
  22697. this.hide();
  22698. }
  22699. },
  22700. onFieldBlur : function(field, e) {
  22701. var me = this,
  22702. target;
  22703. if(me.allowBlur === true && me.editing && me.selectSameEditor !== true) {
  22704. me.completeEdit();
  22705. }
  22706. if (e && Ext.fly(target = e.getTarget()).focusable()) {
  22707. target.focus();
  22708. }
  22709. },
  22710. onHide : function() {
  22711. var me = this,
  22712. field = me.field;
  22713. if (me.editing) {
  22714. me.completeEdit();
  22715. return;
  22716. }
  22717. if (field.hasFocus) {
  22718. field.blur();
  22719. }
  22720. if (field.collapse) {
  22721. field.collapse();
  22722. }
  22723. if (me.hideEl !== false) {
  22724. me.boundEl.show();
  22725. }
  22726. me.callParent(arguments);
  22727. },
  22728. setValue : function(value) {
  22729. this.field.setValue(value);
  22730. },
  22731. getValue : function() {
  22732. return this.field.getValue();
  22733. },
  22734. beforeDestroy : function() {
  22735. var me = this;
  22736. Ext.destroy(me.field);
  22737. delete me.field;
  22738. delete me.parentEl;
  22739. delete me.boundEl;
  22740. me.callParent(arguments);
  22741. }
  22742. });
  22743. Ext.define('Ext.util.KeyMap', {
  22744. alternateClassName: 'Ext.KeyMap',
  22745. eventName: 'keydown',
  22746. constructor: function(config) {
  22747. var me = this;
  22748. if ((arguments.length !== 1) || (typeof config === 'string') || config.dom || config.tagName || config === document || config.isComponent) {
  22749. me.legacyConstructor.apply(me, arguments);
  22750. return;
  22751. }
  22752. Ext.apply(me, config);
  22753. me.bindings = [];
  22754. if (!me.target.isComponent) {
  22755. me.target = Ext.get(me.target);
  22756. }
  22757. if (me.binding) {
  22758. me.addBinding(me.binding);
  22759. } else if (config.key) {
  22760. me.addBinding(config);
  22761. }
  22762. me.enable();
  22763. },
  22764. legacyConstructor: function(el, binding, eventName){
  22765. var me = this;
  22766. Ext.apply(me, {
  22767. target: Ext.get(el),
  22768. eventName: eventName || me.eventName,
  22769. bindings: []
  22770. });
  22771. if (binding) {
  22772. me.addBinding(binding);
  22773. }
  22774. me.enable();
  22775. },
  22776. addBinding : function(binding){
  22777. var keyCode = binding.key,
  22778. processed = false,
  22779. key,
  22780. keys,
  22781. keyString,
  22782. i,
  22783. len;
  22784. if (Ext.isArray(binding)) {
  22785. for (i = 0, len = binding.length; i < len; i++) {
  22786. this.addBinding(binding[i]);
  22787. }
  22788. return;
  22789. }
  22790. if (Ext.isString(keyCode)) {
  22791. keys = [];
  22792. keyString = keyCode.toUpperCase();
  22793. for (i = 0, len = keyString.length; i < len; ++i){
  22794. keys.push(keyString.charCodeAt(i));
  22795. }
  22796. keyCode = keys;
  22797. processed = true;
  22798. }
  22799. if (!Ext.isArray(keyCode)) {
  22800. keyCode = [keyCode];
  22801. }
  22802. if (!processed) {
  22803. for (i = 0, len = keyCode.length; i < len; ++i) {
  22804. key = keyCode[i];
  22805. if (Ext.isString(key)) {
  22806. keyCode[i] = key.toUpperCase().charCodeAt(0);
  22807. }
  22808. }
  22809. }
  22810. this.bindings.push(Ext.apply({
  22811. keyCode: keyCode
  22812. }, binding));
  22813. },
  22814. handleTargetEvent: (function() {
  22815. var tagRe = /input|textarea/i;
  22816. return function(event) {
  22817. var me = this,
  22818. bindings, i, len,
  22819. target, contentEditable;
  22820. if (this.enabled) {
  22821. bindings = this.bindings;
  22822. i = 0;
  22823. len = bindings.length;
  22824. event = me.processEvent.apply(me||me.processEventScope, arguments);
  22825. if (me.ignoreInputFields) {
  22826. target = event.target;
  22827. contentEditable = target.contentEditable;
  22828. if (tagRe.test(target.tagName) || (contentEditable === '' || contentEditable === 'true')) {
  22829. return;
  22830. }
  22831. }
  22832. if (!event.getKey) {
  22833. return event;
  22834. }
  22835. for(; i < len; ++i){
  22836. this.processBinding(bindings[i], event);
  22837. }
  22838. }
  22839. }
  22840. }()),
  22841. processEvent: function(event){
  22842. return event;
  22843. },
  22844. processBinding: function(binding, event){
  22845. if (this.checkModifiers(binding, event)) {
  22846. var key = event.getKey(),
  22847. handler = binding.fn || binding.handler,
  22848. scope = binding.scope || this,
  22849. keyCode = binding.keyCode,
  22850. defaultEventAction = binding.defaultEventAction,
  22851. i,
  22852. len,
  22853. keydownEvent = new Ext.EventObjectImpl(event);
  22854. for (i = 0, len = keyCode.length; i < len; ++i) {
  22855. if (key === keyCode[i]) {
  22856. if (handler.call(scope, key, event) !== true && defaultEventAction) {
  22857. keydownEvent[defaultEventAction]();
  22858. }
  22859. break;
  22860. }
  22861. }
  22862. }
  22863. },
  22864. checkModifiers: function(binding, e) {
  22865. var keys = ['shift', 'ctrl', 'alt'],
  22866. i = 0,
  22867. len = keys.length,
  22868. val, key;
  22869. for (; i < len; ++i){
  22870. key = keys[i];
  22871. val = binding[key];
  22872. if (!(val === undefined || (val === e[key + 'Key']))) {
  22873. return false;
  22874. }
  22875. }
  22876. return true;
  22877. },
  22878. on: function(key, fn, scope) {
  22879. var keyCode, shift, ctrl, alt;
  22880. if (Ext.isObject(key) && !Ext.isArray(key)) {
  22881. keyCode = key.key;
  22882. shift = key.shift;
  22883. ctrl = key.ctrl;
  22884. alt = key.alt;
  22885. } else {
  22886. keyCode = key;
  22887. }
  22888. this.addBinding({
  22889. key: keyCode,
  22890. shift: shift,
  22891. ctrl: ctrl,
  22892. alt: alt,
  22893. fn: fn,
  22894. scope: scope
  22895. });
  22896. },
  22897. isEnabled : function() {
  22898. return this.enabled;
  22899. },
  22900. enable: function() {
  22901. var me = this;
  22902. if (!me.enabled) {
  22903. me.target.on(me.eventName, me.handleTargetEvent, me);
  22904. me.enabled = true;
  22905. }
  22906. },
  22907. disable: function() {
  22908. var me = this;
  22909. if (me.enabled) {
  22910. me.target.removeListener(me.eventName, me.handleTargetEvent, me);
  22911. me.enabled = false;
  22912. }
  22913. },
  22914. setDisabled : function(disabled) {
  22915. if (disabled) {
  22916. this.disable();
  22917. } else {
  22918. this.enable();
  22919. }
  22920. },
  22921. destroy: function(removeTarget) {
  22922. var me = this,
  22923. target = me.target;
  22924. me.bindings = [];
  22925. me.disable();
  22926. if (removeTarget === true) {
  22927. if (target.isComponent) {
  22928. target.destroy();
  22929. } else {
  22930. target.remove();
  22931. }
  22932. }
  22933. delete me.target;
  22934. }
  22935. });
  22936. Ext.define('Ext.util.KeyNav', {
  22937. alternateClassName: 'Ext.KeyNav',
  22938. requires: ['Ext.util.KeyMap'],
  22939. statics: {
  22940. keyOptions: {
  22941. left: 37,
  22942. right: 39,
  22943. up: 38,
  22944. down: 40,
  22945. space: 32,
  22946. pageUp: 33,
  22947. pageDown: 34,
  22948. del: 46,
  22949. backspace: 8,
  22950. home: 36,
  22951. end: 35,
  22952. enter: 13,
  22953. esc: 27,
  22954. tab: 9
  22955. }
  22956. },
  22957. constructor: function(config) {
  22958. var me = this;
  22959. if (arguments.length === 2) {
  22960. me.legacyConstructor.apply(me, arguments);
  22961. return;
  22962. }
  22963. me.setConfig(config);
  22964. },
  22965. legacyConstructor: function(el, config) {
  22966. this.setConfig(Ext.apply({
  22967. target: el
  22968. }, config));
  22969. },
  22970. setConfig: function(config) {
  22971. var me = this,
  22972. keymapCfg = {
  22973. target: config.target,
  22974. ignoreInputFields: config.ignoreInputFields,
  22975. eventName: me.getKeyEvent('forceKeyDown' in config ? config.forceKeyDown : me.forceKeyDown, config.eventName)
  22976. },
  22977. map, keyCodes, defaultScope, keyName, binding;
  22978. if (me.map) {
  22979. me.map.destroy();
  22980. }
  22981. if (config.processEvent) {
  22982. keymapCfg.processEvent = config.processEvent;
  22983. keymapCfg.processEventScope = config.processEventScope||me;
  22984. }
  22985. map = me.map = new Ext.util.KeyMap(keymapCfg);
  22986. keyCodes = Ext.util.KeyNav.keyOptions;
  22987. defaultScope = config.scope || me;
  22988. for (keyName in keyCodes) {
  22989. if (keyCodes.hasOwnProperty(keyName)) {
  22990. if (binding = config[keyName]) {
  22991. if (typeof binding === 'function') {
  22992. binding = {
  22993. handler: binding,
  22994. defaultAction: (config.defaultEventAction !== undefined) ? config.defaultEventAction : me.defaultEventAction
  22995. };
  22996. }
  22997. map.addBinding({
  22998. key: keyCodes[keyName],
  22999. handler: Ext.Function.bind(me.handleEvent, binding.scope||defaultScope, binding.handler||binding.fn, true),
  23000. defaultEventAction: (binding.defaultEventAction !== undefined) ? binding.defaultAction : me.defaultEventAction
  23001. });
  23002. }
  23003. }
  23004. }
  23005. map.disable();
  23006. if (!config.disabled) {
  23007. map.enable();
  23008. }
  23009. },
  23010. handleEvent: function(keyCode, event, handler){
  23011. return handler.call(this, event);
  23012. },
  23013. disabled: false,
  23014. defaultEventAction: "stopEvent",
  23015. forceKeyDown: false,
  23016. eventName: 'keypress',
  23017. destroy: function(removeEl) {
  23018. this.map.destroy(removeEl);
  23019. delete this.map;
  23020. },
  23021. enable: function() {
  23022. this.map.enable();
  23023. this.disabled = false;
  23024. },
  23025. disable: function() {
  23026. this.map.disable();
  23027. this.disabled = true;
  23028. },
  23029. setDisabled : function(disabled) {
  23030. this.map.setDisabled(disabled);
  23031. this.disabled = disabled;
  23032. },
  23033. getKeyEvent: function(forceKeyDown, configuredEventName) {
  23034. if (forceKeyDown || (Ext.EventManager.useKeyDown && !configuredEventName)) {
  23035. return 'keydown';
  23036. } else {
  23037. return configuredEventName||this.eventName;
  23038. }
  23039. }
  23040. });
  23041. Ext.define('Ext.FocusManager', {
  23042. singleton: true,
  23043. alternateClassName: ['Ext.FocusMgr' ],
  23044. mixins: {
  23045. observable: 'Ext.util.Observable'
  23046. },
  23047. requires: [
  23048. 'Ext.AbstractComponent',
  23049. 'Ext.Component',
  23050. 'Ext.ComponentManager',
  23051. 'Ext.ComponentQuery',
  23052. 'Ext.util.HashMap',
  23053. 'Ext.util.KeyNav'
  23054. ],
  23055. enabled: false,
  23056. focusElementCls: Ext.baseCSSPrefix + 'focus-element',
  23057. focusFrameCls: Ext.baseCSSPrefix + 'focus-frame',
  23058. whitelist: [
  23059. 'textfield'
  23060. ],
  23061. constructor: function(config) {
  23062. var me = this,
  23063. CQ = Ext.ComponentQuery;
  23064. me.mixins.observable.constructor.call(me, config);
  23065. me.addEvents(
  23066. 'beforecomponentfocus',
  23067. 'componentfocus',
  23068. 'disable',
  23069. 'enable'
  23070. );
  23071. me.focusTask = new Ext.util.DelayedTask(me.handleComponentFocus, me);
  23072. Ext.override(Ext.AbstractComponent, {
  23073. onFocus: function() {
  23074. this.callParent(arguments);
  23075. if (me.enabled && this.hasFocus) {
  23076. Array.prototype.unshift.call(arguments, this);
  23077. me.onComponentFocus.apply(me, arguments);
  23078. }
  23079. },
  23080. onBlur: function() {
  23081. this.callParent(arguments);
  23082. if (me.enabled && !this.hasFocus) {
  23083. Array.prototype.unshift.call(arguments, this);
  23084. me.onComponentBlur.apply(me, arguments);
  23085. }
  23086. },
  23087. onDestroy: function() {
  23088. this.callParent(arguments);
  23089. if (me.enabled) {
  23090. Array.prototype.unshift.call(arguments, this);
  23091. me.onComponentDestroy.apply(me, arguments);
  23092. }
  23093. }
  23094. });
  23095. Ext.override(Ext.Component, {
  23096. afterHide: function() {
  23097. this.callParent(arguments);
  23098. if (me.enabled) {
  23099. Array.prototype.unshift.call(arguments, this);
  23100. me.onComponentHide.apply(me, arguments);
  23101. }
  23102. }
  23103. });
  23104. me.keyNav = new Ext.util.KeyNav(Ext.getDoc(), {
  23105. disabled: true,
  23106. scope: me,
  23107. backspace: me.focusLast,
  23108. enter: me.navigateIn,
  23109. esc: me.navigateOut,
  23110. tab: me.navigateSiblings,
  23111. space: me.navigateIn,
  23112. del: me.focusLast,
  23113. left: me.navigateSiblings,
  23114. right: me.navigateSiblings,
  23115. down: me.navigateSiblings,
  23116. up: me.navigateSiblings
  23117. });
  23118. me.focusData = {};
  23119. me.subscribers = new Ext.util.HashMap();
  23120. me.focusChain = {};
  23121. Ext.apply(CQ.pseudos, {
  23122. focusable: function(cmps) {
  23123. var len = cmps.length,
  23124. results = [],
  23125. i = 0,
  23126. c;
  23127. for (; i < len; i++) {
  23128. c = cmps[i];
  23129. if (c.isFocusable()) {
  23130. results.push(c);
  23131. }
  23132. }
  23133. return results;
  23134. },
  23135. nextFocus: function(cmps, idx, step) {
  23136. step = step || 1;
  23137. idx = parseInt(idx, 10);
  23138. var len = cmps.length,
  23139. i = idx, c;
  23140. for (;;) {
  23141. if ((i += step) >= len) {
  23142. i = 0;
  23143. } else if (i < 0) {
  23144. i = len - 1;
  23145. }
  23146. if (i === idx) {
  23147. return [];
  23148. }
  23149. if ((c = cmps[i]).isFocusable()) {
  23150. return [c];
  23151. }
  23152. }
  23153. return [];
  23154. },
  23155. prevFocus: function(cmps, idx) {
  23156. return this.nextFocus(cmps, idx, -1);
  23157. },
  23158. root: function(cmps) {
  23159. var len = cmps.length,
  23160. results = [],
  23161. i = 0,
  23162. c;
  23163. for (; i < len; i++) {
  23164. c = cmps[i];
  23165. if (!c.ownerCt) {
  23166. results.push(c);
  23167. }
  23168. }
  23169. return results;
  23170. }
  23171. });
  23172. },
  23173. addXTypeToWhitelist: function(xtype) {
  23174. var me = this;
  23175. if (Ext.isArray(xtype)) {
  23176. Ext.Array.forEach(xtype, me.addXTypeToWhitelist, me);
  23177. return;
  23178. }
  23179. if (!Ext.Array.contains(me.whitelist, xtype)) {
  23180. me.whitelist.push(xtype);
  23181. }
  23182. },
  23183. clearComponent: function(cmp) {
  23184. clearTimeout(this.cmpFocusDelay);
  23185. if (!cmp.isDestroyed) {
  23186. cmp.blur();
  23187. }
  23188. },
  23189. disable: function() {
  23190. var me = this;
  23191. if (!me.enabled) {
  23192. return;
  23193. }
  23194. delete me.options;
  23195. me.enabled = false;
  23196. me.removeDOM();
  23197. me.keyNav.disable();
  23198. me.fireEvent('disable', me);
  23199. },
  23200. enable: function(options) {
  23201. var me = this;
  23202. if (options === true) {
  23203. options = { focusFrame: true };
  23204. }
  23205. me.options = options = options || {};
  23206. if (me.enabled) {
  23207. return;
  23208. }
  23209. me.enabled = true;
  23210. me.initDOM(options);
  23211. me.keyNav.enable();
  23212. me.focusEl.focus();
  23213. delete me.focusedCmp;
  23214. me.fireEvent('enable', me);
  23215. },
  23216. focusLast: function(e) {
  23217. var me = this;
  23218. if (me.isWhitelisted(me.focusedCmp)) {
  23219. return true;
  23220. }
  23221. if (me.previousFocusedCmp) {
  23222. me.previousFocusedCmp.focus();
  23223. }
  23224. },
  23225. getRootComponents: function() {
  23226. var me = this,
  23227. CQ = Ext.ComponentQuery,
  23228. inline = CQ.query(':focusable:root:not([floating])'),
  23229. floating = CQ.query(':focusable:root[floating]');
  23230. floating.sort(function(a, b) {
  23231. return a.el.getZIndex() > b.el.getZIndex();
  23232. });
  23233. return floating.concat(inline);
  23234. },
  23235. initDOM: function(options) {
  23236. var me = this,
  23237. cls = me.focusFrameCls,
  23238. needListeners = Ext.ComponentQuery.query('{getFocusEl()}:not([focusListenerAdded])'),
  23239. i = 0, len = needListeners.length;
  23240. if (!Ext.isReady) {
  23241. return Ext.onReady(me.initDOM, me);
  23242. }
  23243. for (; i < len; i++) {
  23244. needListeners[i].addFocusListener();
  23245. }
  23246. if (!me.focusEl) {
  23247. me.focusEl = Ext.getBody();
  23248. me.focusEl.dom.tabIndex = -1;
  23249. }
  23250. if (!me.focusFrame && options.focusFrame) {
  23251. me.focusFrame = Ext.getBody().createChild({
  23252. cls: cls,
  23253. children: [
  23254. { cls: cls + '-top' },
  23255. { cls: cls + '-bottom' },
  23256. { cls: cls + '-left' },
  23257. { cls: cls + '-right' }
  23258. ],
  23259. style: 'top: -100px; left: -100px;'
  23260. });
  23261. me.focusFrame.setVisibilityMode(Ext.Element.DISPLAY);
  23262. me.focusFrame.hide().setLeftTop(0, 0);
  23263. }
  23264. },
  23265. isWhitelisted: function(cmp) {
  23266. return cmp && Ext.Array.some(this.whitelist, function(x) {
  23267. return cmp.isXType(x);
  23268. });
  23269. },
  23270. navigateIn: function(e) {
  23271. var me = this,
  23272. focusedCmp = me.focusedCmp,
  23273. defaultRoot,
  23274. firstChild;
  23275. if (me.isWhitelisted(focusedCmp)) {
  23276. return true;
  23277. }
  23278. if (!focusedCmp) {
  23279. defaultRoot = me.getRootComponents()[0];
  23280. if (defaultRoot) {
  23281. if (defaultRoot.getFocusEl() === me.focusEl) {
  23282. me.focusEl.blur();
  23283. }
  23284. defaultRoot.focus();
  23285. }
  23286. } else {
  23287. firstChild = focusedCmp.hasFocus ? Ext.ComponentQuery.query('>:focusable', focusedCmp)[0] : focusedCmp;
  23288. if (firstChild) {
  23289. firstChild.focus();
  23290. } else {
  23291. if (Ext.isFunction(focusedCmp.onClick)) {
  23292. e.button = 0;
  23293. focusedCmp.onClick(e);
  23294. if (focusedCmp.isVisible(true)) {
  23295. focusedCmp.focus();
  23296. } else {
  23297. me.navigateOut();
  23298. }
  23299. }
  23300. }
  23301. }
  23302. },
  23303. navigateOut: function(e) {
  23304. var me = this,
  23305. parent;
  23306. if (!me.focusedCmp || !(parent = me.focusedCmp.up(':focusable'))) {
  23307. me.focusEl.focus();
  23308. } else {
  23309. parent.focus();
  23310. }
  23311. return true;
  23312. },
  23313. navigateSiblings: function(e, source, parent) {
  23314. var me = this,
  23315. src = source || me,
  23316. key = e.getKey(),
  23317. EO = Ext.EventObject,
  23318. goBack = e.shiftKey || key == EO.LEFT || key == EO.UP,
  23319. checkWhitelist = key == EO.LEFT || key == EO.RIGHT || key == EO.UP || key == EO.DOWN,
  23320. nextSelector = goBack ? 'prev' : 'next',
  23321. idx, next, focusedCmp, siblings;
  23322. focusedCmp = (src.focusedCmp && src.focusedCmp.comp) || src.focusedCmp;
  23323. if (!focusedCmp && !parent) {
  23324. return true;
  23325. }
  23326. if (checkWhitelist && me.isWhitelisted(focusedCmp)) {
  23327. return true;
  23328. }
  23329. if (!focusedCmp || focusedCmp.is(':root')) {
  23330. siblings = me.getRootComponents();
  23331. } else {
  23332. parent = parent || focusedCmp.up();
  23333. if (parent) {
  23334. siblings = parent.getRefItems();
  23335. }
  23336. }
  23337. if (siblings) {
  23338. idx = focusedCmp ? Ext.Array.indexOf(siblings, focusedCmp) : -1;
  23339. next = Ext.ComponentQuery.query(':' + nextSelector + 'Focus(' + idx + ')', siblings)[0];
  23340. if (next && focusedCmp !== next) {
  23341. next.focus();
  23342. return next;
  23343. }
  23344. }
  23345. },
  23346. onComponentBlur: function(cmp, e) {
  23347. var me = this;
  23348. if (me.focusedCmp === cmp) {
  23349. me.previousFocusedCmp = cmp;
  23350. delete me.focusedCmp;
  23351. }
  23352. if (me.focusFrame) {
  23353. me.focusFrame.hide();
  23354. }
  23355. },
  23356. onComponentFocus: function(cmp, e) {
  23357. var me = this,
  23358. chain = me.focusChain,
  23359. parent;
  23360. if (!cmp.isFocusable()) {
  23361. me.clearComponent(cmp);
  23362. if (chain[cmp.id]) {
  23363. return;
  23364. }
  23365. parent = cmp.up();
  23366. if (parent) {
  23367. chain[cmp.id] = true;
  23368. parent.focus();
  23369. }
  23370. return;
  23371. }
  23372. me.focusChain = {};
  23373. me.focusTask.delay(10, null, null, [cmp, cmp.getFocusEl()]);
  23374. },
  23375. handleComponentFocus: function(cmp, focusEl) {
  23376. var me = this,
  23377. cls,
  23378. ff,
  23379. fw,
  23380. box,
  23381. bt,
  23382. bl,
  23383. bw,
  23384. bh,
  23385. ft,
  23386. fb,
  23387. fl,
  23388. fr;
  23389. if (me.fireEvent('beforecomponentfocus', me, cmp, me.previousFocusedCmp) === false) {
  23390. me.clearComponent(cmp);
  23391. return;
  23392. }
  23393. me.focusedCmp = cmp;
  23394. if (me.shouldShowFocusFrame(cmp)) {
  23395. cls = '.' + me.focusFrameCls + '-';
  23396. ff = me.focusFrame;
  23397. box = focusEl.getPageBox();
  23398. bt = box.top;
  23399. bl = box.left;
  23400. bw = box.width;
  23401. bh = box.height;
  23402. ft = ff.child(cls + 'top');
  23403. fb = ff.child(cls + 'bottom');
  23404. fl = ff.child(cls + 'left');
  23405. fr = ff.child(cls + 'right');
  23406. ft.setWidth(bw).setLeftTop(bl, bt);
  23407. fb.setWidth(bw).setLeftTop(bl, bt + bh - 2);
  23408. fl.setHeight(bh - 2).setLeftTop(bl, bt + 2);
  23409. fr.setHeight(bh - 2).setLeftTop(bl + bw - 2, bt + 2);
  23410. ff.show();
  23411. }
  23412. me.fireEvent('componentfocus', me, cmp, me.previousFocusedCmp);
  23413. },
  23414. onComponentHide: function(cmp) {
  23415. var me = this,
  23416. cmpHadFocus = false,
  23417. focusedCmp = me.focusedCmp,
  23418. parent;
  23419. if (focusedCmp) {
  23420. cmpHadFocus = cmp.hasFocus || (cmp.isContainer && cmp.isAncestor(me.focusedCmp));
  23421. }
  23422. me.clearComponent(cmp);
  23423. if (cmpHadFocus && (parent = cmp.up(':focusable'))) {
  23424. parent.focus();
  23425. } else {
  23426. me.focusEl.focus();
  23427. }
  23428. },
  23429. onComponentDestroy: function() {
  23430. },
  23431. removeDOM: function() {
  23432. var me = this;
  23433. if (me.enabled || me.subscribers.length) {
  23434. return;
  23435. }
  23436. Ext.destroy(
  23437. me.focusFrame
  23438. );
  23439. delete me.focusEl;
  23440. delete me.focusFrame;
  23441. },
  23442. removeXTypeFromWhitelist: function(xtype) {
  23443. var me = this;
  23444. if (Ext.isArray(xtype)) {
  23445. Ext.Array.forEach(xtype, me.removeXTypeFromWhitelist, me);
  23446. return;
  23447. }
  23448. Ext.Array.remove(me.whitelist, xtype);
  23449. },
  23450. setupSubscriberKeys: function(container, keys) {
  23451. var me = this,
  23452. el = container.getFocusEl(),
  23453. scope = keys.scope,
  23454. handlers = {
  23455. backspace: me.focusLast,
  23456. enter: me.navigateIn,
  23457. esc: me.navigateOut,
  23458. scope: me
  23459. },
  23460. navSiblings = function(e) {
  23461. if (me.focusedCmp === container) {
  23462. return me.navigateSiblings(e, me, container);
  23463. } else {
  23464. return me.navigateSiblings(e);
  23465. }
  23466. };
  23467. Ext.iterate(keys, function(key, cb) {
  23468. handlers[key] = function(e) {
  23469. var ret = navSiblings(e);
  23470. if (Ext.isFunction(cb) && cb.call(scope || container, e, ret) === true) {
  23471. return true;
  23472. }
  23473. return ret;
  23474. };
  23475. }, me);
  23476. return new Ext.util.KeyNav(el, handlers);
  23477. },
  23478. shouldShowFocusFrame: function(cmp) {
  23479. var me = this,
  23480. opts = me.options || {},
  23481. cmpFocusEl = cmp.getFocusEl(),
  23482. cmpFocusElTag = Ext.getDom(cmpFocusEl).tagName;
  23483. if (!me.focusFrame || !cmp) {
  23484. return false;
  23485. }
  23486. if (opts.focusFrame) {
  23487. return true;
  23488. }
  23489. if (me.focusData[cmp.id].focusFrame) {
  23490. return true;
  23491. }
  23492. return false;
  23493. }
  23494. });
  23495. Ext.define('Ext.Img', {
  23496. extend: 'Ext.Component',
  23497. alias: ['widget.image', 'widget.imagecomponent'],
  23498. autoEl: 'img',
  23499. src: '',
  23500. alt: '',
  23501. imgCls: '',
  23502. getElConfig: function() {
  23503. var me = this,
  23504. config = me.callParent(),
  23505. img;
  23506. if (me.autoEl == 'img') {
  23507. img = config;
  23508. } else {
  23509. config.cn = [img = {
  23510. tag: 'img',
  23511. id: me.id + '-img'
  23512. }];
  23513. }
  23514. if (me.imgCls) {
  23515. img.cls = (img.cls ? img.cls + ' ' : '') + me.imgCls;
  23516. }
  23517. img.src = me.src || Ext.BLANK_IMAGE_URL;
  23518. if (me.alt) {
  23519. img.alt = me.alt;
  23520. }
  23521. return config;
  23522. },
  23523. onRender: function () {
  23524. var me = this,
  23525. el;
  23526. me.callParent(arguments);
  23527. el = me.el;
  23528. me.imgEl = (me.autoEl == 'img') ? el : el.getById(me.id + '-img');
  23529. },
  23530. onDestroy: function () {
  23531. Ext.destroy(this.imgEl);
  23532. this.imgEl = null;
  23533. this.callParent();
  23534. },
  23535. setSrc: function(src) {
  23536. var me = this,
  23537. imgEl = me.imgEl;
  23538. me.src = src;
  23539. if (imgEl) {
  23540. imgEl.dom.src = src || Ext.BLANK_IMAGE_URL;
  23541. }
  23542. }
  23543. });
  23544. Ext.define('Ext.Layer', {
  23545. extend: 'Ext.Element',
  23546. uses: ['Ext.Shadow'],
  23547. statics: {
  23548. shims: []
  23549. },
  23550. isLayer: true,
  23551. constructor: function(config, existingEl) {
  23552. config = config || {};
  23553. var me = this,
  23554. dh = Ext.DomHelper,
  23555. cp = config.parentEl,
  23556. pel = cp ? Ext.getDom(cp) : document.body,
  23557. hm = config.hideMode;
  23558. if (existingEl) {
  23559. me.dom = Ext.getDom(existingEl);
  23560. }
  23561. if (!me.dom) {
  23562. me.dom = dh.append(pel, config.dh || {
  23563. tag: 'div',
  23564. cls: Ext.baseCSSPrefix + 'layer'
  23565. });
  23566. } else {
  23567. me.addCls(Ext.baseCSSPrefix + 'layer');
  23568. if (!me.dom.parentNode) {
  23569. pel.appendChild(me.dom);
  23570. }
  23571. }
  23572. if (config.id) {
  23573. me.id = me.dom.id = config.id;
  23574. } else {
  23575. me.id = Ext.id(me.dom);
  23576. }
  23577. Ext.Element.addToCache(me);
  23578. if (config.cls) {
  23579. me.addCls(config.cls);
  23580. }
  23581. me.constrain = config.constrain !== false;
  23582. if (hm) {
  23583. me.setVisibilityMode(Ext.Element[hm.toUpperCase()]);
  23584. if (me.visibilityMode == Ext.Element.ASCLASS) {
  23585. me.visibilityCls = config.visibilityCls;
  23586. }
  23587. } else if (config.useDisplay) {
  23588. me.setVisibilityMode(Ext.Element.DISPLAY);
  23589. } else {
  23590. me.setVisibilityMode(Ext.Element.VISIBILITY);
  23591. }
  23592. if (config.shadow) {
  23593. me.shadowOffset = config.shadowOffset || 4;
  23594. me.shadow = new Ext.Shadow({
  23595. offset: me.shadowOffset,
  23596. mode: config.shadow
  23597. });
  23598. me.disableShadow();
  23599. } else {
  23600. me.shadowOffset = 0;
  23601. }
  23602. me.useShim = config.shim !== false && Ext.useShims;
  23603. if (config.hidden === true) {
  23604. me.hide();
  23605. } else {
  23606. me.show();
  23607. }
  23608. },
  23609. getZIndex: function() {
  23610. return parseInt((this.getShim() || this).getStyle('z-index'), 10);
  23611. },
  23612. getShim: function() {
  23613. var me = this,
  23614. shim, pn;
  23615. if (!me.useShim) {
  23616. return null;
  23617. }
  23618. if (!me.shim) {
  23619. shim = me.self.shims.shift();
  23620. if (!shim) {
  23621. shim = me.createShim();
  23622. shim.enableDisplayMode('block');
  23623. shim.hide();
  23624. }
  23625. pn = me.dom.parentNode;
  23626. if (shim.dom.parentNode != pn) {
  23627. pn.insertBefore(shim.dom, me.dom);
  23628. }
  23629. me.shim = shim;
  23630. }
  23631. return me.shim;
  23632. },
  23633. hideShim: function() {
  23634. var me = this;
  23635. if (me.shim) {
  23636. me.shim.setDisplayed(false);
  23637. me.self.shims.push(me.shim);
  23638. delete me.shim;
  23639. }
  23640. },
  23641. disableShadow: function() {
  23642. var me = this;
  23643. if (me.shadow && !me.shadowDisabled) {
  23644. me.shadowDisabled = true;
  23645. me.shadow.hide();
  23646. me.lastShadowOffset = me.shadowOffset;
  23647. me.shadowOffset = 0;
  23648. }
  23649. },
  23650. enableShadow: function(show) {
  23651. var me = this;
  23652. if (me.shadow && me.shadowDisabled) {
  23653. me.shadowDisabled = false;
  23654. me.shadowOffset = me.lastShadowOffset;
  23655. delete me.lastShadowOffset;
  23656. if (show) {
  23657. me.sync(true);
  23658. }
  23659. }
  23660. },
  23661. sync: function(doShow) {
  23662. var me = this,
  23663. shadow = me.shadow,
  23664. shadowPos, shimStyle, shadowSize,
  23665. shim, l, t, w, h, shimIndex;
  23666. if (!me.updating && me.isVisible() && (shadow || me.useShim)) {
  23667. shim = me.getShim();
  23668. l = me.getLocalX();
  23669. t = me.getLocalY();
  23670. w = me.dom.offsetWidth;
  23671. h = me.dom.offsetHeight;
  23672. if (shadow && !me.shadowDisabled) {
  23673. if (doShow && !shadow.isVisible()) {
  23674. shadow.show(me);
  23675. } else {
  23676. shadow.realign(l, t, w, h);
  23677. }
  23678. if (shim) {
  23679. shimIndex = shim.getStyle('z-index');
  23680. if (shimIndex > me.zindex) {
  23681. me.shim.setStyle('z-index', me.zindex - 2);
  23682. }
  23683. shim.show();
  23684. if (shadow.isVisible()) {
  23685. shadowPos = shadow.el.getXY();
  23686. shimStyle = shim.dom.style;
  23687. shadowSize = shadow.el.getSize();
  23688. if (Ext.supports.CSS3BoxShadow) {
  23689. shadowSize.height += 6;
  23690. shadowSize.width += 4;
  23691. shadowPos[0] -= 2;
  23692. shadowPos[1] -= 4;
  23693. }
  23694. shimStyle.left = (shadowPos[0]) + 'px';
  23695. shimStyle.top = (shadowPos[1]) + 'px';
  23696. shimStyle.width = (shadowSize.width) + 'px';
  23697. shimStyle.height = (shadowSize.height) + 'px';
  23698. } else {
  23699. shim.setSize(w, h);
  23700. shim.setLeftTop(l, t);
  23701. }
  23702. }
  23703. } else if (shim) {
  23704. shimIndex = shim.getStyle('z-index');
  23705. if (shimIndex > me.zindex) {
  23706. me.shim.setStyle('z-index', me.zindex - 2);
  23707. }
  23708. shim.show();
  23709. shim.setSize(w, h);
  23710. shim.setLeftTop(l, t);
  23711. }
  23712. }
  23713. return me;
  23714. },
  23715. remove: function() {
  23716. this.hideUnders();
  23717. this.callParent();
  23718. },
  23719. beginUpdate: function() {
  23720. this.updating = true;
  23721. },
  23722. endUpdate: function() {
  23723. this.updating = false;
  23724. this.sync(true);
  23725. },
  23726. hideUnders: function() {
  23727. if (this.shadow) {
  23728. this.shadow.hide();
  23729. }
  23730. this.hideShim();
  23731. },
  23732. constrainXY: function() {
  23733. if (this.constrain) {
  23734. var vw = Ext.Element.getViewWidth(),
  23735. vh = Ext.Element.getViewHeight(),
  23736. s = Ext.getDoc().getScroll(),
  23737. xy = this.getXY(),
  23738. x = xy[0],
  23739. y = xy[1],
  23740. so = this.shadowOffset,
  23741. w = this.dom.offsetWidth + so,
  23742. h = this.dom.offsetHeight + so,
  23743. moved = false;
  23744. if ((x + w) > vw + s.left) {
  23745. x = vw - w - so;
  23746. moved = true;
  23747. }
  23748. if ((y + h) > vh + s.top) {
  23749. y = vh - h - so;
  23750. moved = true;
  23751. }
  23752. if (x < s.left) {
  23753. x = s.left;
  23754. moved = true;
  23755. }
  23756. if (y < s.top) {
  23757. y = s.top;
  23758. moved = true;
  23759. }
  23760. if (moved) {
  23761. Ext.Layer.superclass.setXY.call(this, [x, y]);
  23762. this.sync();
  23763. }
  23764. }
  23765. return this;
  23766. },
  23767. getConstrainOffset: function() {
  23768. return this.shadowOffset;
  23769. },
  23770. setVisible: function(visible, animate, duration, callback, easing) {
  23771. var me = this,
  23772. cb;
  23773. cb = function() {
  23774. if (visible) {
  23775. me.sync(true);
  23776. }
  23777. if (callback) {
  23778. callback();
  23779. }
  23780. };
  23781. if (!visible) {
  23782. me.hideUnders(true);
  23783. }
  23784. me.callParent([visible, animate, duration, callback, easing]);
  23785. if (!animate) {
  23786. cb();
  23787. }
  23788. return me;
  23789. },
  23790. beforeFx: function() {
  23791. this.beforeAction();
  23792. return this.callParent(arguments);
  23793. },
  23794. afterFx: function() {
  23795. this.callParent(arguments);
  23796. this.sync(this.isVisible());
  23797. },
  23798. beforeAction: function() {
  23799. if (!this.updating && this.shadow) {
  23800. this.shadow.hide();
  23801. }
  23802. },
  23803. setLeft: function(left) {
  23804. this.callParent(arguments);
  23805. return this.sync();
  23806. },
  23807. setTop: function(top) {
  23808. this.callParent(arguments);
  23809. return this.sync();
  23810. },
  23811. setLeftTop: function(left, top) {
  23812. this.callParent(arguments);
  23813. return this.sync();
  23814. },
  23815. setXY: function(xy, animate, duration, callback, easing) {
  23816. var me = this;
  23817. callback = me.createCB(callback);
  23818. me.fixDisplay();
  23819. me.beforeAction();
  23820. me.callParent([xy, animate, duration, callback, easing]);
  23821. if (!animate) {
  23822. callback();
  23823. }
  23824. return me;
  23825. },
  23826. createCB: function(callback) {
  23827. var me = this,
  23828. showShadow = me.shadow && me.shadow.isVisible();
  23829. return function() {
  23830. me.constrainXY();
  23831. me.sync(showShadow);
  23832. if (callback) {
  23833. callback();
  23834. }
  23835. };
  23836. },
  23837. setX: function(x, animate, duration, callback, easing) {
  23838. this.setXY([x, this.getY()], animate, duration, callback, easing);
  23839. return this;
  23840. },
  23841. setY: function(y, animate, duration, callback, easing) {
  23842. this.setXY([this.getX(), y], animate, duration, callback, easing);
  23843. return this;
  23844. },
  23845. setSize: function(w, h, animate, duration, callback, easing) {
  23846. var me = this;
  23847. callback = me.createCB(callback);
  23848. me.beforeAction();
  23849. me.callParent([w, h, animate, duration, callback, easing]);
  23850. if (!animate) {
  23851. callback();
  23852. }
  23853. return me;
  23854. },
  23855. setWidth: function(w, animate, duration, callback, easing) {
  23856. var me = this;
  23857. callback = me.createCB(callback);
  23858. me.beforeAction();
  23859. me.callParent([w, animate, duration, callback, easing]);
  23860. if (!animate) {
  23861. callback();
  23862. }
  23863. return me;
  23864. },
  23865. setHeight: function(h, animate, duration, callback, easing) {
  23866. var me = this;
  23867. callback = me.createCB(callback);
  23868. me.beforeAction();
  23869. me.callParent([h, animate, duration, callback, easing]);
  23870. if (!animate) {
  23871. callback();
  23872. }
  23873. return me;
  23874. },
  23875. setBounds: function(x, y, width, height, animate, duration, callback, easing) {
  23876. var me = this;
  23877. callback = me.createCB(callback);
  23878. me.beforeAction();
  23879. if (!animate) {
  23880. Ext.Layer.superclass.setXY.call(me, [x, y]);
  23881. Ext.Layer.superclass.setSize.call(me, width, height);
  23882. callback();
  23883. } else {
  23884. me.callParent([x, y, width, height, animate, duration, callback, easing]);
  23885. }
  23886. return me;
  23887. },
  23888. setZIndex: function(zindex) {
  23889. var me = this;
  23890. me.zindex = zindex;
  23891. if (me.getShim()) {
  23892. me.shim.setStyle('z-index', zindex++);
  23893. }
  23894. if (me.shadow) {
  23895. me.shadow.setZIndex(zindex++);
  23896. }
  23897. return me.setStyle('z-index', zindex);
  23898. },
  23899. onOpacitySet: function(opacity){
  23900. var shadow = this.shadow;
  23901. if (shadow) {
  23902. shadow.setOpacity(opacity);
  23903. }
  23904. }
  23905. });
  23906. Ext.define('Ext.util.Bindable', {
  23907. bindStore: function(store, initial){
  23908. var me = this,
  23909. oldStore = me.store;
  23910. if (!initial && me.store) {
  23911. me.onUnbindStore(oldStore, initial);
  23912. if (store !== oldStore && oldStore.autoDestroy) {
  23913. oldStore.destroyStore();
  23914. } else {
  23915. me.unbindStoreListeners(oldStore);
  23916. }
  23917. }
  23918. if (store) {
  23919. store = Ext.data.StoreManager.lookup(store);
  23920. me.bindStoreListeners(store);
  23921. me.onBindStore(store, initial);
  23922. }
  23923. me.store = store || null;
  23924. return me;
  23925. },
  23926. getStore: function(){
  23927. return this.store;
  23928. },
  23929. unbindStoreListeners: function(store) {
  23930. var listeners = this.storeListeners;
  23931. if (listeners) {
  23932. store.un(listeners);
  23933. }
  23934. },
  23935. bindStoreListeners: function(store) {
  23936. var me = this,
  23937. listeners = Ext.apply({}, me.getStoreListeners());
  23938. if (!listeners.scope) {
  23939. listeners.scope = me;
  23940. }
  23941. me.storeListeners = listeners;
  23942. store.on(listeners);
  23943. },
  23944. getStoreListeners: Ext.emptyFn,
  23945. onUnbindStore: Ext.emptyFn,
  23946. onBindStore: Ext.emptyFn
  23947. });
  23948. Ext.define('Ext.LoadMask', {
  23949. extend: 'Ext.Component',
  23950. alias: 'widget.loadmask',
  23951. mixins: {
  23952. floating: 'Ext.util.Floating',
  23953. bindable: 'Ext.util.Bindable'
  23954. },
  23955. uses: ['Ext.data.StoreManager'],
  23956. msg : 'Loading...',
  23957. msgCls : Ext.baseCSSPrefix + 'mask-loading',
  23958. maskCls: Ext.baseCSSPrefix + 'mask',
  23959. useMsg: true,
  23960. useTargetEl: false,
  23961. baseCls: Ext.baseCSSPrefix + 'mask-msg',
  23962. childEls: [
  23963. 'msgEl'
  23964. ],
  23965. renderTpl: '<div id="{id}-msgEl" style="position:relative" class="{[values.$comp.msgCls]}"></div>',
  23966. floating: {
  23967. shadow: 'frame'
  23968. },
  23969. focusOnToFront: false,
  23970. bringParentToFront: false,
  23971. constructor : function(comp, config) {
  23972. var me = this;
  23973. if (!comp.isComponent) {
  23974. comp = Ext.get(comp);
  23975. this.isElement = true;
  23976. }
  23977. me.ownerCt = comp;
  23978. if (!this.isElement) {
  23979. me.bindComponent(comp);
  23980. }
  23981. me.callParent([config]);
  23982. if (me.store) {
  23983. me.bindStore(me.store, true);
  23984. }
  23985. },
  23986. bindComponent: function(comp){
  23987. var me = this,
  23988. listeners = {
  23989. scope: this,
  23990. resize: me.sizeMask,
  23991. added: me.onComponentAdded,
  23992. removed: me.onComponentRemoved
  23993. },
  23994. hierarchyEventSource = Ext.container.Container.hierarchyEventSource;
  23995. if (comp.floating) {
  23996. listeners.move = me.sizeMask;
  23997. me.activeOwner = comp;
  23998. } else if (comp.ownerCt) {
  23999. me.onComponentAdded(comp.ownerCt);
  24000. } else {
  24001. me.preventBringToFront = true;
  24002. }
  24003. me.mon(comp, listeners);
  24004. me.mon(hierarchyEventSource, {
  24005. show: me.onContainerShow,
  24006. hide: me.onContainerHide,
  24007. expand: me.onContainerExpand,
  24008. collapse: me.onContainerCollapse,
  24009. scope: me
  24010. });
  24011. },
  24012. onComponentAdded: function(owner){
  24013. var me = this;
  24014. delete me.activeOwner;
  24015. me.floatParent = owner;
  24016. if (!owner.floating) {
  24017. owner = owner.up('[floating]');
  24018. }
  24019. if (owner) {
  24020. me.activeOwner = owner;
  24021. me.mon(owner, 'move', me.sizeMask, me);
  24022. }
  24023. owner = me.floatParent.ownerCt;
  24024. if (me.rendered && me.isVisible() && owner) {
  24025. me.floatOwner = owner;
  24026. me.mon(owner, 'afterlayout', me.sizeMask, me, {single: true});
  24027. }
  24028. },
  24029. onComponentRemoved: function(owner){
  24030. var me = this,
  24031. activeOwner = me.activeOwner,
  24032. floatOwner = me.floatOwner;
  24033. if (activeOwner) {
  24034. me.mun(activeOwner, 'move', me.sizeMask, me);
  24035. }
  24036. if (floatOwner) {
  24037. me.mun(floatOwner, 'afterlayout', me.sizeMask, me);
  24038. }
  24039. delete me.activeOwner;
  24040. delete me.floatOwner;
  24041. },
  24042. afterRender: function() {
  24043. this.callParent(arguments);
  24044. this.container = this.floatParent.getContentTarget();
  24045. },
  24046. onContainerShow: function(container){
  24047. if (this.isActiveContainer(container)) {
  24048. this.onComponentShow();
  24049. }
  24050. },
  24051. onContainerHide: function(container){
  24052. if (this.isActiveContainer(container)) {
  24053. this.onComponentHide();
  24054. }
  24055. },
  24056. onContainerExpand: function(container){
  24057. if (this.isActiveContainer(container)) {
  24058. this.onComponentShow();
  24059. }
  24060. },
  24061. onContainerCollapse: function(container){
  24062. if (this.isActiveContainer(container)) {
  24063. this.onComponentHide();
  24064. }
  24065. },
  24066. isActiveContainer: function(container){
  24067. return this.isDescendantOf(container);
  24068. },
  24069. onComponentHide: function(){
  24070. var me = this;
  24071. if (me.rendered && me.isVisible()) {
  24072. me.hide();
  24073. me.showNext = true;
  24074. }
  24075. },
  24076. onComponentShow: function(){
  24077. if (this.showNext) {
  24078. this.show();
  24079. }
  24080. delete this.showNext;
  24081. },
  24082. sizeMask: function() {
  24083. var me = this,
  24084. target;
  24085. if (me.rendered && me.isVisible()) {
  24086. me.center();
  24087. target = me.getMaskTarget();
  24088. me.getMaskEl().show().setSize(target.getSize()).alignTo(target, 'tl-tl');
  24089. }
  24090. },
  24091. bindStore : function(store, initial) {
  24092. var me = this;
  24093. me.mixins.bindable.bindStore.apply(me, arguments);
  24094. store = me.store;
  24095. if (store && store.isLoading()) {
  24096. me.onBeforeLoad();
  24097. }
  24098. },
  24099. getStoreListeners: function(){
  24100. return {
  24101. beforeload: this.onBeforeLoad,
  24102. load: this.onLoad,
  24103. exception: this.onLoad,
  24104. cachemiss: this.onBeforeLoad,
  24105. cachefilled: this.onLoad
  24106. };
  24107. },
  24108. onDisable : function() {
  24109. this.callParent(arguments);
  24110. if (this.loading) {
  24111. this.onLoad();
  24112. }
  24113. },
  24114. getOwner: function(){
  24115. return this.ownerCt || this.floatParent;
  24116. },
  24117. getMaskTarget: function(){
  24118. var owner = this.getOwner();
  24119. return this.useTargetEl ? owner.getTargetEl() : owner.getEl();
  24120. },
  24121. onBeforeLoad : function() {
  24122. var me = this,
  24123. owner = me.getOwner(),
  24124. origin;
  24125. if (!me.disabled) {
  24126. me.loading = true;
  24127. if (owner.componentLayoutCounter) {
  24128. me.maybeShow();
  24129. } else {
  24130. origin = owner.afterComponentLayout;
  24131. owner.afterComponentLayout = function() {
  24132. owner.afterComponentLayout = origin;
  24133. origin.apply(owner, arguments);
  24134. me.maybeShow();
  24135. };
  24136. }
  24137. }
  24138. },
  24139. maybeShow: function(){
  24140. var me = this,
  24141. owner = me.getOwner();
  24142. if (!owner.isVisible(true)) {
  24143. me.showNext = true;
  24144. }
  24145. else if (me.loading && owner.rendered) {
  24146. me.show();
  24147. }
  24148. },
  24149. getMaskEl: function(){
  24150. var me = this;
  24151. return me.maskEl || (me.maskEl = me.el.insertSibling({
  24152. cls: me.maskCls,
  24153. style: {
  24154. zIndex: me.el.getStyle('zIndex') - 2
  24155. }
  24156. }, 'before'));
  24157. },
  24158. onShow: function() {
  24159. var me = this,
  24160. msgEl = me.msgEl;
  24161. me.callParent(arguments);
  24162. me.loading = true;
  24163. if (me.useMsg) {
  24164. msgEl.show().update(me.msg);
  24165. } else {
  24166. msgEl.parent().hide();
  24167. }
  24168. },
  24169. hide: function(){
  24170. if (this.isElement) {
  24171. this.ownerCt.unmask();
  24172. this.fireEvent('hide', this);
  24173. return;
  24174. }
  24175. delete this.showNext;
  24176. return this.callParent(arguments);
  24177. },
  24178. onHide: function(){
  24179. this.callParent();
  24180. this.getMaskEl().hide();
  24181. },
  24182. show: function(){
  24183. if (this.isElement) {
  24184. this.ownerCt.mask(this.useMsg ? this.msg : '', this.msgCls);
  24185. this.fireEvent('show', this);
  24186. return;
  24187. }
  24188. return this.callParent(arguments);
  24189. },
  24190. afterShow: function() {
  24191. this.callParent(arguments);
  24192. this.sizeMask();
  24193. },
  24194. setZIndex: function(index) {
  24195. var me = this,
  24196. owner = me.activeOwner;
  24197. if (owner) {
  24198. index = parseInt(owner.el.getStyle('zIndex'), 10) + 1;
  24199. }
  24200. me.getMaskEl().setStyle('zIndex', index - 1);
  24201. return me.mixins.floating.setZIndex.apply(me, arguments);
  24202. },
  24203. onLoad : function() {
  24204. this.loading = false;
  24205. this.hide();
  24206. },
  24207. onDestroy: function(){
  24208. var me = this;
  24209. if (me.isElement) {
  24210. me.ownerCt.unmask();
  24211. }
  24212. Ext.destroy(me.maskEl);
  24213. me.callParent();
  24214. }
  24215. });
  24216. Ext.define('Ext.data.association.Association', {
  24217. alternateClassName: 'Ext.data.Association',
  24218. primaryKey: 'id',
  24219. defaultReaderType: 'json',
  24220. isAssociation: true,
  24221. initialConfig: null,
  24222. statics: {
  24223. AUTO_ID: 1000,
  24224. create: function(association){
  24225. if (Ext.isString(association)) {
  24226. association = {
  24227. type: association
  24228. };
  24229. }
  24230. switch (association.type) {
  24231. case 'belongsTo':
  24232. return new Ext.data.association.BelongsTo(association);
  24233. case 'hasMany':
  24234. return new Ext.data.association.HasMany(association);
  24235. case 'hasOne':
  24236. return new Ext.data.association.HasOne(association);
  24237. default:
  24238. }
  24239. return association;
  24240. }
  24241. },
  24242. constructor: function(config) {
  24243. Ext.apply(this, config);
  24244. var me = this,
  24245. types = Ext.ModelManager.types,
  24246. ownerName = config.ownerModel,
  24247. associatedName = config.associatedModel,
  24248. ownerModel = types[ownerName],
  24249. associatedModel = types[associatedName];
  24250. me.initialConfig = config;
  24251. me.ownerModel = ownerModel;
  24252. me.associatedModel = associatedModel;
  24253. Ext.applyIf(me, {
  24254. ownerName : ownerName,
  24255. associatedName: associatedName
  24256. });
  24257. me.associationId = 'association' + (++me.statics().AUTO_ID);
  24258. },
  24259. getReader: function(){
  24260. var me = this,
  24261. reader = me.reader,
  24262. model = me.associatedModel;
  24263. if (reader) {
  24264. if (Ext.isString(reader)) {
  24265. reader = {
  24266. type: reader
  24267. };
  24268. }
  24269. if (reader.isReader) {
  24270. reader.setModel(model);
  24271. } else {
  24272. Ext.applyIf(reader, {
  24273. model: model,
  24274. type : me.defaultReaderType
  24275. });
  24276. }
  24277. me.reader = Ext.createByAlias('reader.' + reader.type, reader);
  24278. }
  24279. return me.reader || null;
  24280. }
  24281. });
  24282. Ext.define('Ext.ModelManager', {
  24283. extend: 'Ext.AbstractManager',
  24284. alternateClassName: 'Ext.ModelMgr',
  24285. requires: ['Ext.data.association.Association'],
  24286. singleton: true,
  24287. typeName: 'mtype',
  24288. associationStack: [],
  24289. registerType: function(name, config) {
  24290. var proto = config.prototype,
  24291. model;
  24292. if (proto && proto.isModel) {
  24293. model = config;
  24294. } else {
  24295. if (!config.extend) {
  24296. config.extend = 'Ext.data.Model';
  24297. }
  24298. model = Ext.define(name, config);
  24299. }
  24300. this.types[name] = model;
  24301. return model;
  24302. },
  24303. onModelDefined: function(model) {
  24304. var stack = this.associationStack,
  24305. length = stack.length,
  24306. create = [],
  24307. association, i, created;
  24308. for (i = 0; i < length; i++) {
  24309. association = stack[i];
  24310. if (association.associatedModel == model.modelName) {
  24311. create.push(association);
  24312. }
  24313. }
  24314. for (i = 0, length = create.length; i < length; i++) {
  24315. created = create[i];
  24316. this.types[created.ownerModel].prototype.associations.add(Ext.data.association.Association.create(created));
  24317. Ext.Array.remove(stack, created);
  24318. }
  24319. },
  24320. registerDeferredAssociation: function(association){
  24321. this.associationStack.push(association);
  24322. },
  24323. getModel: function(id) {
  24324. var model = id;
  24325. if (typeof model == 'string') {
  24326. model = this.types[model];
  24327. }
  24328. return model;
  24329. },
  24330. create: function(config, name, id) {
  24331. var Con = typeof name == 'function' ? name : this.types[name || config.name];
  24332. return new Con(config, id);
  24333. }
  24334. }, function() {
  24335. Ext.regModel = function() {
  24336. return this.ModelManager.registerType.apply(this.ModelManager, arguments);
  24337. };
  24338. });
  24339. Ext.define('Ext.PluginManager', {
  24340. extend: 'Ext.AbstractManager',
  24341. alternateClassName: 'Ext.PluginMgr',
  24342. singleton: true,
  24343. typeName: 'ptype',
  24344. create : function(config, defaultType){
  24345. if (config.init) {
  24346. return config;
  24347. } else {
  24348. return Ext.createByAlias('plugin.' + (config.ptype || defaultType), config);
  24349. }
  24350. },
  24351. findByType: function(type, defaultsOnly) {
  24352. var matches = [],
  24353. types = this.types,
  24354. name,
  24355. item;
  24356. for (name in types) {
  24357. if (!types.hasOwnProperty(name)) {
  24358. continue;
  24359. }
  24360. item = types[name];
  24361. if (item.type == type && (!defaultsOnly || (defaultsOnly === true && item.isDefault))) {
  24362. matches.push(item);
  24363. }
  24364. }
  24365. return matches;
  24366. }
  24367. }, function() {
  24368. Ext.preg = function() {
  24369. return Ext.PluginManager.registerType.apply(Ext.PluginManager, arguments);
  24370. };
  24371. });
  24372. Ext.define('Ext.layout.component.ProgressBar', {
  24373. alias: ['layout.progressbar'],
  24374. extend: 'Ext.layout.component.Auto',
  24375. type: 'progressbar',
  24376. beginLayout: function (ownerContext) {
  24377. var me = this,
  24378. i, textEls;
  24379. me.callParent(arguments);
  24380. if (!ownerContext.textEls) {
  24381. textEls = me.owner.textEl;
  24382. if (textEls.isComposite) {
  24383. ownerContext.textEls = [];
  24384. textEls = textEls.elements;
  24385. for (i = textEls.length; i--; ) {
  24386. ownerContext.textEls[i] = ownerContext.getEl(Ext.get(textEls[i]));
  24387. }
  24388. } else {
  24389. ownerContext.textEls = [ ownerContext.getEl('textEl') ];
  24390. }
  24391. }
  24392. },
  24393. calculate: function(ownerContext) {
  24394. var me = this,
  24395. i, textEls, width;
  24396. me.callParent(arguments);
  24397. if (Ext.isNumber(width = ownerContext.getProp('width'))) {
  24398. width -= ownerContext.getBorderInfo().width;
  24399. textEls = ownerContext.textEls;
  24400. for (i = textEls.length; i--; ) {
  24401. textEls[i].setWidth(width);
  24402. }
  24403. } else {
  24404. me.done = false;
  24405. }
  24406. }
  24407. });
  24408. //@tag dom,core
  24409. Ext.define('Ext.dom.CompositeElement', {
  24410. alternateClassName: 'Ext.CompositeElement',
  24411. extend: 'Ext.dom.CompositeElementLite',
  24412. getElement: function(el) {
  24413. return el;
  24414. },
  24415. transformElement: function(el) {
  24416. return Ext.get(el);
  24417. }
  24418. }, function() {
  24419. Ext.dom.Element.select = function(selector, unique, root) {
  24420. var elements;
  24421. if (typeof selector == "string") {
  24422. elements = Ext.dom.Element.selectorFunction(selector, root);
  24423. }
  24424. else if (selector.length !== undefined) {
  24425. elements = selector;
  24426. }
  24427. else {
  24428. }
  24429. return (unique === true) ? new Ext.CompositeElement(elements) : new Ext.CompositeElementLite(elements);
  24430. };
  24431. });
  24432. Ext.select = Ext.Element.select;
  24433. Ext.define('Ext.ProgressBar', {
  24434. extend: 'Ext.Component',
  24435. alias: 'widget.progressbar',
  24436. requires: [
  24437. 'Ext.Template',
  24438. 'Ext.CompositeElement',
  24439. 'Ext.TaskManager',
  24440. 'Ext.layout.component.ProgressBar'
  24441. ],
  24442. uses: ['Ext.fx.Anim'],
  24443. baseCls: Ext.baseCSSPrefix + 'progress',
  24444. animate: false,
  24445. text: '',
  24446. waitTimer: null,
  24447. childEls: [
  24448. 'bar'
  24449. ],
  24450. renderTpl: [
  24451. '<tpl if="internalText">',
  24452. '<div class="{baseCls}-text {baseCls}-text-back">{text}</div>',
  24453. '</tpl>',
  24454. '<div id="{id}-bar" class="{baseCls}-bar" style="width:{percentage}%">',
  24455. '<tpl if="internalText">',
  24456. '<div class="{baseCls}-text">',
  24457. '<div>{text}</div>',
  24458. '</div>',
  24459. '</tpl>',
  24460. '</div>'
  24461. ],
  24462. componentLayout: 'progressbar',
  24463. initComponent: function() {
  24464. this.callParent();
  24465. this.addEvents(
  24466. "update"
  24467. );
  24468. },
  24469. initRenderData: function() {
  24470. var me = this;
  24471. return Ext.apply(me.callParent(), {
  24472. internalText : !me.hasOwnProperty('textEl'),
  24473. text : me.text || '&#160;',
  24474. percentage : me.value ? me.value * 100 : 0
  24475. });
  24476. },
  24477. onRender : function() {
  24478. var me = this;
  24479. me.callParent(arguments);
  24480. if (me.textEl) {
  24481. me.textEl = Ext.get(me.textEl);
  24482. me.updateText(me.text);
  24483. }
  24484. else {
  24485. me.textEl = me.el.select('.' + me.baseCls + '-text');
  24486. }
  24487. },
  24488. updateProgress: function(value, text, animate) {
  24489. var me = this,
  24490. oldValue = me.value;
  24491. me.value = value || 0;
  24492. if (text) {
  24493. me.updateText(text);
  24494. }
  24495. if (me.rendered && !me.isDestroyed) {
  24496. if (animate === true || (animate !== false && me.animate)) {
  24497. me.bar.stopAnimation();
  24498. me.bar.animate(Ext.apply({
  24499. from: {
  24500. width: (oldValue * 100) + '%'
  24501. },
  24502. to: {
  24503. width: (me.value * 100) + '%'
  24504. }
  24505. }, me.animate));
  24506. } else {
  24507. me.bar.setStyle('width', (me.value * 100) + '%');
  24508. }
  24509. }
  24510. me.fireEvent('update', me, me.value, text);
  24511. return me;
  24512. },
  24513. updateText: function(text) {
  24514. var me = this;
  24515. me.text = text;
  24516. if (me.rendered) {
  24517. me.textEl.update(me.text);
  24518. }
  24519. return me;
  24520. },
  24521. applyText : function(text) {
  24522. this.updateText(text);
  24523. },
  24524. getText: function(){
  24525. return this.text;
  24526. },
  24527. wait: function(o) {
  24528. var me = this, scope;
  24529. if (!me.waitTimer) {
  24530. scope = me;
  24531. o = o || {};
  24532. me.updateText(o.text);
  24533. me.waitTimer = Ext.TaskManager.start({
  24534. run: function(i){
  24535. var inc = o.increment || 10;
  24536. i -= 1;
  24537. me.updateProgress(((((i+inc)%inc)+1)*(100/inc))*0.01, null, o.animate);
  24538. },
  24539. interval: o.interval || 1000,
  24540. duration: o.duration,
  24541. onStop: function(){
  24542. if (o.fn) {
  24543. o.fn.apply(o.scope || me);
  24544. }
  24545. me.reset();
  24546. },
  24547. scope: scope
  24548. });
  24549. }
  24550. return me;
  24551. },
  24552. isWaiting: function(){
  24553. return this.waitTimer !== null;
  24554. },
  24555. reset: function(hide){
  24556. var me = this;
  24557. me.updateProgress(0);
  24558. me.clearTimer();
  24559. if (hide === true) {
  24560. me.hide();
  24561. }
  24562. return me;
  24563. },
  24564. clearTimer: function(){
  24565. var me = this;
  24566. if (me.waitTimer) {
  24567. me.waitTimer.onStop = null;
  24568. Ext.TaskManager.stop(me.waitTimer);
  24569. me.waitTimer = null;
  24570. }
  24571. },
  24572. onDestroy: function(){
  24573. var me = this;
  24574. me.clearTimer();
  24575. if (me.rendered) {
  24576. if (me.textEl.isComposite) {
  24577. me.textEl.clear();
  24578. }
  24579. Ext.destroyMembers(me, 'textEl', 'progressBar');
  24580. }
  24581. me.callParent();
  24582. }
  24583. });
  24584. Ext.define('Ext.ShadowPool', {
  24585. singleton: true,
  24586. requires: ['Ext.DomHelper'],
  24587. markup: (function() {
  24588. return Ext.String.format(
  24589. '<div class="{0}{1}-shadow" role="presentation"></div>',
  24590. Ext.baseCSSPrefix,
  24591. Ext.isIE && !Ext.supports.CSS3BoxShadow ? 'ie' : 'css'
  24592. );
  24593. }()),
  24594. shadows: [],
  24595. pull: function() {
  24596. var sh = this.shadows.shift();
  24597. if (!sh) {
  24598. sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, this.markup));
  24599. sh.autoBoxAdjust = false;
  24600. }
  24601. return sh;
  24602. },
  24603. push: function(sh) {
  24604. this.shadows.push(sh);
  24605. },
  24606. reset: function() {
  24607. var shadows = [].concat(this.shadows),
  24608. s,
  24609. sLen = shadows.length;
  24610. for (s = 0; s < sLen; s++) {
  24611. shadows[s].remove();
  24612. }
  24613. this.shadows = [];
  24614. }
  24615. });
  24616. Ext.define('Ext.Shadow', {
  24617. requires: ['Ext.ShadowPool'],
  24618. constructor: function(config) {
  24619. var me = this,
  24620. adjusts,
  24621. offset,
  24622. rad;
  24623. Ext.apply(me, config);
  24624. if (!Ext.isString(me.mode)) {
  24625. me.mode = me.defaultMode;
  24626. }
  24627. offset = me.offset;
  24628. rad = Math.floor(offset / 2);
  24629. me.opacity = 50;
  24630. switch (me.mode.toLowerCase()) {
  24631. case "drop":
  24632. if (Ext.supports.CSS3BoxShadow) {
  24633. adjusts = {
  24634. t: offset,
  24635. l: offset,
  24636. h: -offset,
  24637. w: -offset
  24638. };
  24639. }
  24640. else {
  24641. adjusts = {
  24642. t: -rad,
  24643. l: -rad,
  24644. h: -rad,
  24645. w: -rad
  24646. };
  24647. }
  24648. break;
  24649. case "sides":
  24650. if (Ext.supports.CSS3BoxShadow) {
  24651. adjusts = {
  24652. t: offset,
  24653. l: 0,
  24654. h: -offset,
  24655. w: 0
  24656. };
  24657. }
  24658. else {
  24659. adjusts = {
  24660. t: - (1 + rad),
  24661. l: 1 + rad - 2 * offset,
  24662. h: -1,
  24663. w: rad - 1
  24664. };
  24665. }
  24666. break;
  24667. case "frame":
  24668. if (Ext.supports.CSS3BoxShadow) {
  24669. adjusts = {
  24670. t: 0,
  24671. l: 0,
  24672. h: 0,
  24673. w: 0
  24674. };
  24675. }
  24676. else {
  24677. adjusts = {
  24678. t: 1 + rad - 2 * offset,
  24679. l: 1 + rad - 2 * offset,
  24680. h: offset - rad - 1,
  24681. w: offset - rad - 1
  24682. };
  24683. }
  24684. break;
  24685. }
  24686. me.adjusts = adjusts;
  24687. },
  24688. getShadowSize: function() {
  24689. var me = this,
  24690. offset = me.el ? me.offset : 0,
  24691. result = [offset, offset, offset, offset],
  24692. mode = me.mode.toLowerCase();
  24693. if (me.el && mode !== 'frame') {
  24694. result[0] = 0;
  24695. if (mode == 'drop') {
  24696. result[3] = 0;
  24697. }
  24698. }
  24699. return result;
  24700. },
  24701. offset: 4,
  24702. defaultMode: "drop",
  24703. boxShadowProperty: (function() {
  24704. var property = 'boxShadow',
  24705. style = document.documentElement.style;
  24706. if (!('boxShadow' in style)) {
  24707. if ('WebkitBoxShadow' in style) {
  24708. property = 'WebkitBoxShadow';
  24709. }
  24710. else if ('MozBoxShadow' in style) {
  24711. property = 'MozBoxShadow';
  24712. }
  24713. }
  24714. return property;
  24715. }()),
  24716. show: function(target) {
  24717. var me = this,
  24718. index;
  24719. target = Ext.get(target);
  24720. if (!me.el) {
  24721. me.el = Ext.ShadowPool.pull();
  24722. if (me.el.dom.nextSibling != target.dom) {
  24723. me.el.insertBefore(target);
  24724. }
  24725. }
  24726. index = (parseInt(target.getStyle("z-index"), 10) - 1) || 0;
  24727. me.el.setStyle("z-index", me.zIndex || index);
  24728. if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {
  24729. me.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=" + me.opacity + ") progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (me.offset) + ")";
  24730. }
  24731. me.realign(
  24732. target.getLocalX(),
  24733. target.getLocalY(),
  24734. target.dom.offsetWidth,
  24735. target.dom.offsetHeight
  24736. );
  24737. me.el.dom.style.display = "block";
  24738. },
  24739. isVisible: function() {
  24740. return this.el ? true: false;
  24741. },
  24742. realign: function(l, t, targetWidth, targetHeight) {
  24743. if (!this.el) {
  24744. return;
  24745. }
  24746. var adjusts = this.adjusts,
  24747. d = this.el.dom,
  24748. targetStyle = d.style,
  24749. shadowWidth,
  24750. shadowHeight,
  24751. sws,
  24752. shs;
  24753. targetStyle.left = (l + adjusts.l) + "px";
  24754. targetStyle.top = (t + adjusts.t) + "px";
  24755. shadowWidth = Math.max(targetWidth + adjusts.w, 0);
  24756. shadowHeight = Math.max(targetHeight + adjusts.h, 0);
  24757. sws = shadowWidth + "px";
  24758. shs = shadowHeight + "px";
  24759. if (targetStyle.width != sws || targetStyle.height != shs) {
  24760. targetStyle.width = sws;
  24761. targetStyle.height = shs;
  24762. if (Ext.supports.CSS3BoxShadow) {
  24763. targetStyle[this.boxShadowProperty] = '0 0 ' + this.offset + 'px #888';
  24764. }
  24765. }
  24766. },
  24767. hide: function() {
  24768. var me = this;
  24769. if (me.el) {
  24770. me.el.dom.style.display = "none";
  24771. Ext.ShadowPool.push(me.el);
  24772. delete me.el;
  24773. }
  24774. },
  24775. setZIndex: function(z) {
  24776. this.zIndex = z;
  24777. if (this.el) {
  24778. this.el.setStyle("z-index", z);
  24779. }
  24780. },
  24781. setOpacity: function(opacity){
  24782. if (this.el) {
  24783. if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {
  24784. opacity = Math.floor(opacity * 100 / 2) / 100;
  24785. }
  24786. this.opacity = opacity;
  24787. this.el.setOpacity(opacity);
  24788. }
  24789. }
  24790. });
  24791. Ext.define('Ext.app.Controller', {
  24792. mixins: {
  24793. observable: 'Ext.util.Observable'
  24794. },
  24795. onClassExtended: function(cls, data, hooks) {
  24796. var className = Ext.getClassName(cls),
  24797. match = className.match(/^(.*)\.controller\./),
  24798. namespace,
  24799. onBeforeClassCreated,
  24800. requires,
  24801. modules,
  24802. namespaceAndModule;
  24803. if (match !== null) {
  24804. namespace = Ext.Loader.getPrefix(className) || match[1];
  24805. onBeforeClassCreated = hooks.onBeforeCreated;
  24806. requires = [];
  24807. modules = ['model', 'view', 'store'];
  24808. hooks.onBeforeCreated = function(cls, data) {
  24809. var i, ln, module,
  24810. items, j, subLn, item;
  24811. for (i = 0,ln = modules.length; i < ln; i++) {
  24812. module = modules[i];
  24813. namespaceAndModule = namespace + '.' + module + '.';
  24814. items = Ext.Array.from(data[module + 's']);
  24815. for (j = 0,subLn = items.length; j < subLn; j++) {
  24816. item = items[j];
  24817. if (item.indexOf('.') !== -1 && (Ext.ClassManager.isCreated(item) || Ext.Loader.isAClassNameWithAKnownPrefix(item))) {
  24818. requires.push(item);
  24819. } else {
  24820. requires.push(namespaceAndModule + item);
  24821. }
  24822. }
  24823. }
  24824. Ext.require(requires, Ext.Function.pass(onBeforeClassCreated, arguments, this));
  24825. };
  24826. }
  24827. },
  24828. constructor: function(config) {
  24829. this.mixins.observable.constructor.call(this, config);
  24830. Ext.apply(this, config || {});
  24831. this.createGetters('model', this.models);
  24832. this.createGetters('store', this.stores);
  24833. this.createGetters('view', this.views);
  24834. if (this.refs) {
  24835. this.ref(this.refs);
  24836. }
  24837. },
  24838. init: Ext.emptyFn,
  24839. onLaunch: Ext.emptyFn,
  24840. createGetters: function(type, refs) {
  24841. type = Ext.String.capitalize(type);
  24842. var i = 0,
  24843. length = (refs) ? refs.length : 0,
  24844. fn, ref, parts, x, numParts;
  24845. for (; i < length; i++) {
  24846. fn = 'get';
  24847. ref = refs[i];
  24848. parts = ref.split('.');
  24849. numParts = parts.length;
  24850. for (x = 0 ; x < numParts; x++) {
  24851. fn += Ext.String.capitalize(parts[x]);
  24852. }
  24853. fn += type;
  24854. if (!this[fn]) {
  24855. this[fn] = Ext.Function.pass(this['get' + type], [ref], this);
  24856. }
  24857. this[fn](ref);
  24858. }
  24859. },
  24860. ref: function(refs) {
  24861. refs = Ext.Array.from(refs);
  24862. var me = this,
  24863. i = 0,
  24864. length = refs.length,
  24865. info, ref, fn;
  24866. me.references = me.references || [];
  24867. for (; i < length; i++) {
  24868. info = refs[i];
  24869. ref = info.ref;
  24870. fn = 'get' + Ext.String.capitalize(ref);
  24871. if (!me[fn]) {
  24872. me[fn] = Ext.Function.pass(me.getRef, [ref, info], me);
  24873. }
  24874. me.references.push(ref.toLowerCase());
  24875. }
  24876. },
  24877. addRef: function(ref) {
  24878. return this.ref([ref]);
  24879. },
  24880. getRef: function(ref, info, config) {
  24881. this.refCache = this.refCache || {};
  24882. info = info || {};
  24883. config = config || {};
  24884. Ext.apply(info, config);
  24885. if (info.forceCreate) {
  24886. return Ext.ComponentManager.create(info, 'component');
  24887. }
  24888. var me = this,
  24889. cached = me.refCache[ref];
  24890. if (!cached) {
  24891. me.refCache[ref] = cached = Ext.ComponentQuery.query(info.selector)[0];
  24892. if (!cached && info.autoCreate) {
  24893. me.refCache[ref] = cached = Ext.ComponentManager.create(info, 'component');
  24894. }
  24895. if (cached) {
  24896. cached.on('beforedestroy', function() {
  24897. me.refCache[ref] = null;
  24898. });
  24899. }
  24900. }
  24901. return cached;
  24902. },
  24903. hasRef: function(ref) {
  24904. return this.references && this.references.indexOf(ref.toLowerCase()) !== -1;
  24905. },
  24906. control: function(selectors, listeners) {
  24907. this.application.control(selectors, listeners, this);
  24908. },
  24909. getController: function(name) {
  24910. return this.application.getController(name);
  24911. },
  24912. getStore: function(name) {
  24913. return this.application.getStore(name);
  24914. },
  24915. getModel: function(model) {
  24916. return this.application.getModel(model);
  24917. },
  24918. getView: function(view) {
  24919. return this.application.getView(view);
  24920. }
  24921. });
  24922. Ext.define('Ext.data.IdGenerator', {
  24923. isGenerator: true,
  24924. constructor: function(config) {
  24925. var me = this;
  24926. Ext.apply(me, config);
  24927. if (me.id) {
  24928. Ext.data.IdGenerator.all[me.id] = me;
  24929. }
  24930. },
  24931. getRecId: function (rec) {
  24932. return rec.modelName + '-' + rec.internalId;
  24933. },
  24934. statics: {
  24935. all: {},
  24936. get: function (config) {
  24937. var generator,
  24938. id,
  24939. type;
  24940. if (typeof config == 'string') {
  24941. id = type = config;
  24942. config = null;
  24943. } else if (config.isGenerator) {
  24944. return config;
  24945. } else {
  24946. id = config.id || config.type;
  24947. type = config.type;
  24948. }
  24949. generator = this.all[id];
  24950. if (!generator) {
  24951. generator = Ext.create('idgen.' + type, config);
  24952. }
  24953. return generator;
  24954. }
  24955. }
  24956. });
  24957. Ext.define('Ext.data.SortTypes', {
  24958. singleton: true,
  24959. none : function(s) {
  24960. return s;
  24961. },
  24962. stripTagsRE : /<\/?[^>]+>/gi,
  24963. asText : function(s) {
  24964. return String(s).replace(this.stripTagsRE, "");
  24965. },
  24966. asUCText : function(s) {
  24967. return String(s).toUpperCase().replace(this.stripTagsRE, "");
  24968. },
  24969. asUCString : function(s) {
  24970. return String(s).toUpperCase();
  24971. },
  24972. asDate : function(s) {
  24973. if(!s){
  24974. return 0;
  24975. }
  24976. if(Ext.isDate(s)){
  24977. return s.getTime();
  24978. }
  24979. return Date.parse(String(s));
  24980. },
  24981. asFloat : function(s) {
  24982. var val = parseFloat(String(s).replace(/,/g, ""));
  24983. return isNaN(val) ? 0 : val;
  24984. },
  24985. asInt : function(s) {
  24986. var val = parseInt(String(s).replace(/,/g, ""), 10);
  24987. return isNaN(val) ? 0 : val;
  24988. }
  24989. });
  24990. Ext.define('Ext.data.Types', {
  24991. singleton: true,
  24992. requires: ['Ext.data.SortTypes']
  24993. }, function() {
  24994. var st = Ext.data.SortTypes;
  24995. Ext.apply(Ext.data.Types, {
  24996. stripRe: /[\$,%]/g,
  24997. AUTO: {
  24998. sortType: st.none,
  24999. type: 'auto'
  25000. },
  25001. STRING: {
  25002. convert: function(v) {
  25003. var defaultValue = this.useNull ? null : '';
  25004. return (v === undefined || v === null) ? defaultValue : String(v);
  25005. },
  25006. sortType: st.asUCString,
  25007. type: 'string'
  25008. },
  25009. INT: {
  25010. convert: function(v) {
  25011. return v !== undefined && v !== null && v !== '' ?
  25012. parseInt(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
  25013. },
  25014. sortType: st.none,
  25015. type: 'int'
  25016. },
  25017. FLOAT: {
  25018. convert: function(v) {
  25019. return v !== undefined && v !== null && v !== '' ?
  25020. parseFloat(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
  25021. },
  25022. sortType: st.none,
  25023. type: 'float'
  25024. },
  25025. BOOL: {
  25026. convert: function(v) {
  25027. if (this.useNull && (v === undefined || v === null || v === '')) {
  25028. return null;
  25029. }
  25030. return v === true || v === 'true' || v == 1;
  25031. },
  25032. sortType: st.none,
  25033. type: 'bool'
  25034. },
  25035. DATE: {
  25036. convert: function(v) {
  25037. var df = this.dateFormat,
  25038. parsed;
  25039. if (!v) {
  25040. return null;
  25041. }
  25042. if (Ext.isDate(v)) {
  25043. return v;
  25044. }
  25045. if (df) {
  25046. if (df == 'timestamp') {
  25047. return new Date(v*1000);
  25048. }
  25049. if (df == 'time') {
  25050. return new Date(parseInt(v, 10));
  25051. }
  25052. return Ext.Date.parse(v, df);
  25053. }
  25054. parsed = Date.parse(v);
  25055. return parsed ? new Date(parsed) : null;
  25056. },
  25057. sortType: st.asDate,
  25058. type: 'date'
  25059. }
  25060. });
  25061. Ext.apply(Ext.data.Types, {
  25062. BOOLEAN: this.BOOL,
  25063. INTEGER: this.INT,
  25064. NUMBER: this.FLOAT
  25065. });
  25066. });
  25067. Ext.define('Ext.data.Field', {
  25068. requires: ['Ext.data.Types', 'Ext.data.SortTypes'],
  25069. alias: 'data.field',
  25070. isField: true,
  25071. constructor : function(config) {
  25072. var me = this,
  25073. types = Ext.data.Types,
  25074. st;
  25075. if (Ext.isString(config)) {
  25076. config = {name: config};
  25077. }
  25078. Ext.apply(me, config);
  25079. st = me.sortType;
  25080. if (me.type) {
  25081. if (Ext.isString(me.type)) {
  25082. me.type = types[me.type.toUpperCase()] || types.AUTO;
  25083. }
  25084. } else {
  25085. me.type = types.AUTO;
  25086. }
  25087. if (Ext.isString(st)) {
  25088. me.sortType = Ext.data.SortTypes[st];
  25089. } else if(Ext.isEmpty(st)) {
  25090. me.sortType = me.type.sortType;
  25091. }
  25092. if (!config.hasOwnProperty('convert')) {
  25093. me.convert = me.type.convert;
  25094. } else if (!me.convert && me.type.convert && !config.hasOwnProperty('defaultValue')) {
  25095. me.defaultValue = me.type.convert(me.defaultValue);
  25096. }
  25097. if (config.convert) {
  25098. me.hasCustomConvert = true;
  25099. }
  25100. },
  25101. dateFormat: null,
  25102. useNull: false,
  25103. defaultValue: "",
  25104. mapping: null,
  25105. sortType : null,
  25106. sortDir : "ASC",
  25107. allowBlank : true,
  25108. persist: true
  25109. });
  25110. Ext.define('Ext.data.Errors', {
  25111. extend: 'Ext.util.MixedCollection',
  25112. isValid: function() {
  25113. return this.length === 0;
  25114. },
  25115. getByField: function(fieldName) {
  25116. var errors = [],
  25117. error, field, i;
  25118. for (i = 0; i < this.length; i++) {
  25119. error = this.items[i];
  25120. if (error.field == fieldName) {
  25121. errors.push(error);
  25122. }
  25123. }
  25124. return errors;
  25125. }
  25126. });
  25127. Ext.define('Ext.data.Operation', {
  25128. synchronous: true,
  25129. action: undefined,
  25130. filters: undefined,
  25131. sorters: undefined,
  25132. groupers: undefined,
  25133. start: undefined,
  25134. limit: undefined,
  25135. batch: undefined,
  25136. callback: undefined,
  25137. scope: undefined,
  25138. started: false,
  25139. running: false,
  25140. complete: false,
  25141. success: undefined,
  25142. exception: false,
  25143. error: undefined,
  25144. actionCommitRecordsRe: /^(?:create|update)$/i,
  25145. actionSkipSyncRe: /^destroy$/i,
  25146. constructor: function(config) {
  25147. Ext.apply(this, config || {});
  25148. },
  25149. commitRecords: function (serverRecords) {
  25150. var me = this,
  25151. mc, index, clientRecords, serverRec, clientRec, i, len;
  25152. if (!me.actionSkipSyncRe.test(me.action)) {
  25153. clientRecords = me.records;
  25154. if (clientRecords && clientRecords.length) {
  25155. if (clientRecords.length > 1) {
  25156. if (me.action == 'update' || clientRecords[0].clientIdProperty) {
  25157. mc = new Ext.util.MixedCollection();
  25158. mc.addAll(serverRecords);
  25159. for (index = clientRecords.length; index--; ) {
  25160. clientRec = clientRecords[index];
  25161. serverRec = mc.findBy(me.matchClientRec, clientRec);
  25162. clientRec.copyFrom(serverRec);
  25163. }
  25164. } else {
  25165. for (i = 0, len = clientRecords.length; i < len; ++i) {
  25166. clientRec = clientRecords[i];
  25167. serverRec = serverRecords[i];
  25168. if (clientRec && serverRec) {
  25169. me.updateRecord(clientRec, serverRec);
  25170. }
  25171. }
  25172. }
  25173. } else {
  25174. this.updateRecord(clientRecords[0], serverRecords[0]);
  25175. }
  25176. if (me.actionCommitRecordsRe.test(me.action)) {
  25177. for (index = clientRecords.length; index--; ) {
  25178. clientRecords[index].commit();
  25179. }
  25180. }
  25181. }
  25182. }
  25183. },
  25184. updateRecord: function(clientRec, serverRec) {
  25185. if(serverRec && (clientRec.phantom || clientRec.getId() === serverRec.getId())) {
  25186. clientRec.copyFrom(serverRec);
  25187. }
  25188. },
  25189. matchClientRec: function(record) {
  25190. var clientRec = this,
  25191. clientRecordId = clientRec.getId();
  25192. if(clientRecordId && record.getId() === clientRecordId) {
  25193. return true;
  25194. }
  25195. return record.internalId === clientRec.internalId;
  25196. },
  25197. setStarted: function() {
  25198. this.started = true;
  25199. this.running = true;
  25200. },
  25201. setCompleted: function() {
  25202. this.complete = true;
  25203. this.running = false;
  25204. },
  25205. setSuccessful: function() {
  25206. this.success = true;
  25207. },
  25208. setException: function(error) {
  25209. this.exception = true;
  25210. this.success = false;
  25211. this.running = false;
  25212. this.error = error;
  25213. },
  25214. hasException: function() {
  25215. return this.exception === true;
  25216. },
  25217. getError: function() {
  25218. return this.error;
  25219. },
  25220. getRecords: function() {
  25221. var resultSet = this.getResultSet();
  25222. return this.records || (resultSet ? resultSet.records : null);
  25223. },
  25224. getResultSet: function() {
  25225. return this.resultSet;
  25226. },
  25227. isStarted: function() {
  25228. return this.started === true;
  25229. },
  25230. isRunning: function() {
  25231. return this.running === true;
  25232. },
  25233. isComplete: function() {
  25234. return this.complete === true;
  25235. },
  25236. wasSuccessful: function() {
  25237. return this.isComplete() && this.success === true;
  25238. },
  25239. setBatch: function(batch) {
  25240. this.batch = batch;
  25241. },
  25242. allowWrite: function() {
  25243. return this.action != 'read';
  25244. }
  25245. });
  25246. Ext.define('Ext.data.validations', {
  25247. singleton: true,
  25248. presenceMessage: 'must be present',
  25249. lengthMessage: 'is the wrong length',
  25250. formatMessage: 'is the wrong format',
  25251. inclusionMessage: 'is not included in the list of acceptable values',
  25252. exclusionMessage: 'is not an acceptable value',
  25253. emailMessage: 'is not a valid email address',
  25254. emailRe: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
  25255. presence: function(config, value) {
  25256. if (arguments.length === 1) {
  25257. value = config;
  25258. }
  25259. return !!value || value === 0;
  25260. },
  25261. length: function(config, value) {
  25262. if (value === undefined || value === null) {
  25263. return false;
  25264. }
  25265. var length = value.length,
  25266. min = config.min,
  25267. max = config.max;
  25268. if ((min && length < min) || (max && length > max)) {
  25269. return false;
  25270. } else {
  25271. return true;
  25272. }
  25273. },
  25274. email: function(config, email) {
  25275. return Ext.data.validations.emailRe.test(email);
  25276. },
  25277. format: function(config, value) {
  25278. return !!(config.matcher && config.matcher.test(value));
  25279. },
  25280. inclusion: function(config, value) {
  25281. return config.list && Ext.Array.indexOf(config.list,value) != -1;
  25282. },
  25283. exclusion: function(config, value) {
  25284. return config.list && Ext.Array.indexOf(config.list,value) == -1;
  25285. }
  25286. });
  25287. Ext.define('Ext.data.Model', {
  25288. alternateClassName: 'Ext.data.Record',
  25289. mixins: {
  25290. observable: 'Ext.util.Observable'
  25291. },
  25292. requires: [
  25293. 'Ext.ModelManager',
  25294. 'Ext.data.IdGenerator',
  25295. 'Ext.data.Field',
  25296. 'Ext.data.Errors',
  25297. 'Ext.data.Operation',
  25298. 'Ext.data.validations',
  25299. 'Ext.util.MixedCollection'
  25300. ],
  25301. compareConvertFields: function(f1, f2) {
  25302. var f1SpecialConvert = f1.convert && f1.type && f1.convert !== f1.type.convert,
  25303. f2SpecialConvert = f2.convert && f2.type && f2.convert !== f2.type.convert;
  25304. if (f1SpecialConvert && !f2SpecialConvert) {
  25305. return 1;
  25306. }
  25307. if (!f1SpecialConvert && f2SpecialConvert) {
  25308. return -1;
  25309. }
  25310. return 0;
  25311. },
  25312. itemNameFn: function(item) {
  25313. return item.name;
  25314. },
  25315. onClassExtended: function(cls, data, hooks) {
  25316. var onBeforeClassCreated = hooks.onBeforeCreated;
  25317. hooks.onBeforeCreated = function(cls, data) {
  25318. var me = this,
  25319. name = Ext.getClassName(cls),
  25320. prototype = cls.prototype,
  25321. superCls = cls.prototype.superclass,
  25322. validations = data.validations || [],
  25323. fields = data.fields || [],
  25324. field,
  25325. associationsConfigs = data.associations || [],
  25326. addAssociations = function(items, type) {
  25327. var i = 0,
  25328. len,
  25329. item;
  25330. if (items) {
  25331. items = Ext.Array.from(items);
  25332. for (len = items.length; i < len; ++i) {
  25333. item = items[i];
  25334. if (!Ext.isObject(item)) {
  25335. item = {model: item};
  25336. }
  25337. item.type = type;
  25338. associationsConfigs.push(item);
  25339. }
  25340. }
  25341. },
  25342. idgen = data.idgen,
  25343. fieldsMixedCollection = new Ext.util.MixedCollection(false, prototype.itemNameFn),
  25344. associationsMixedCollection = new Ext.util.MixedCollection(false, prototype.itemNameFn),
  25345. superValidations = superCls.validations,
  25346. superFields = superCls.fields,
  25347. superAssociations = superCls.associations,
  25348. associationConfig, i, ln,
  25349. dependencies = [],
  25350. idProperty = data.idProperty || cls.prototype.idProperty,
  25351. onFieldAddReplace = function(arg0, arg1, arg2) {
  25352. var newField,
  25353. pos;
  25354. if (fieldsMixedCollection.events.add.firing) {
  25355. pos = arg0;
  25356. newField = arg1;
  25357. } else {
  25358. newField = arg2;
  25359. pos = arg1.originalIndex;
  25360. }
  25361. newField.originalIndex = pos;
  25362. if (newField.mapping === idProperty || (newField.mapping == null && newField.name === idProperty)) {
  25363. newField.defaultValue = undefined;
  25364. }
  25365. },
  25366. clsProxy = data.proxy || cls.prototype.proxy || cls.prototype.defaultProxyType,
  25367. fieldConvertSortFn = function() {
  25368. fieldsMixedCollection.sortBy(prototype.compareConvertFields);
  25369. };
  25370. cls.modelName = name;
  25371. prototype.modelName = name;
  25372. if (superValidations) {
  25373. validations = superValidations.concat(validations);
  25374. }
  25375. data.validations = validations;
  25376. if (superFields) {
  25377. fields = superFields.items.concat(fields);
  25378. }
  25379. fieldsMixedCollection.on({
  25380. add: onFieldAddReplace,
  25381. replace: onFieldAddReplace
  25382. });
  25383. for (i = 0, ln = fields.length; i < ln; ++i) {
  25384. field = fields[i];
  25385. fieldsMixedCollection.add(field.isField ? field : new Ext.data.Field(field));
  25386. }
  25387. if (!fieldsMixedCollection.get(idProperty)) {
  25388. fieldsMixedCollection.add(new Ext.data.Field(idProperty));
  25389. }
  25390. fieldConvertSortFn();
  25391. fieldsMixedCollection.on({
  25392. add: fieldConvertSortFn,
  25393. replace: fieldConvertSortFn
  25394. });
  25395. data.fields = fieldsMixedCollection;
  25396. if (idgen) {
  25397. data.idgen = Ext.data.IdGenerator.get(idgen);
  25398. }
  25399. addAssociations(data.belongsTo, 'belongsTo');
  25400. delete data.belongsTo;
  25401. addAssociations(data.hasMany, 'hasMany');
  25402. delete data.hasMany;
  25403. addAssociations(data.hasOne, 'hasOne');
  25404. delete data.hasOne;
  25405. if (superAssociations) {
  25406. associationsConfigs = superAssociations.items.concat(associationsConfigs);
  25407. }
  25408. for (i = 0, ln = associationsConfigs.length; i < ln; ++i) {
  25409. dependencies.push('association.' + associationsConfigs[i].type.toLowerCase());
  25410. }
  25411. if (clsProxy && !clsProxy.isProxy) {
  25412. dependencies.push('proxy.' + (typeof clsProxy === 'string' ? clsProxy : clsProxy.type));
  25413. }
  25414. Ext.require(dependencies, function() {
  25415. Ext.ModelManager.registerType(name, cls);
  25416. for (i = 0, ln = associationsConfigs.length; i < ln; ++i) {
  25417. associationConfig = associationsConfigs[i];
  25418. if (associationConfig.isAssociation) {
  25419. associationConfig = Ext.applyIf({
  25420. ownerModel: name,
  25421. associatedModel: associationConfig.model
  25422. }, associationConfig.initialConfig);
  25423. } else {
  25424. Ext.apply(associationConfig, {
  25425. ownerModel: name,
  25426. associatedModel: associationConfig.model
  25427. });
  25428. }
  25429. if (Ext.ModelManager.getModel(associationConfig.model) === undefined) {
  25430. Ext.ModelManager.registerDeferredAssociation(associationConfig);
  25431. } else {
  25432. associationsMixedCollection.add(Ext.data.association.Association.create(associationConfig));
  25433. }
  25434. }
  25435. data.associations = associationsMixedCollection;
  25436. onBeforeClassCreated.call(me, cls, data, hooks);
  25437. cls.setProxy(clsProxy);
  25438. Ext.ModelManager.onModelDefined(cls);
  25439. });
  25440. };
  25441. },
  25442. inheritableStatics: {
  25443. setProxy: function(proxy) {
  25444. if (!proxy.isProxy) {
  25445. if (typeof proxy == "string") {
  25446. proxy = {
  25447. type: proxy
  25448. };
  25449. }
  25450. proxy = Ext.createByAlias("proxy." + proxy.type, proxy);
  25451. }
  25452. proxy.setModel(this);
  25453. this.proxy = this.prototype.proxy = proxy;
  25454. return proxy;
  25455. },
  25456. getProxy: function() {
  25457. return this.proxy;
  25458. },
  25459. setFields: function(fields, idProperty, clientIdProperty) {
  25460. var me = this,
  25461. proto = me.prototype,
  25462. prototypeFields = proto.fields,
  25463. len = fields ? fields.length : 0,
  25464. i = 0;
  25465. if (idProperty) {
  25466. proto.idProperty = idProperty;
  25467. }
  25468. if (clientIdProperty) {
  25469. proto.clientIdProperty = clientIdProperty;
  25470. }
  25471. if (prototypeFields) {
  25472. prototypeFields.clear();
  25473. }
  25474. else {
  25475. prototypeFields = me.prototype.fields = new Ext.util.MixedCollection(false, function(field) {
  25476. return field.name;
  25477. });
  25478. }
  25479. for (; i < len; i++) {
  25480. prototypeFields.add(new Ext.data.Field(fields[i]));
  25481. }
  25482. if (!prototypeFields.get(proto.idProperty)) {
  25483. prototypeFields.add(new Ext.data.Field(proto.idProperty));
  25484. }
  25485. me.fields = prototypeFields;
  25486. return prototypeFields;
  25487. },
  25488. getFields: function() {
  25489. return this.prototype.fields.items;
  25490. },
  25491. load: function(id, config) {
  25492. config = Ext.apply({}, config);
  25493. config = Ext.applyIf(config, {
  25494. action: 'read',
  25495. id : id
  25496. });
  25497. var operation = new Ext.data.Operation(config),
  25498. scope = config.scope || this,
  25499. record = null,
  25500. callback;
  25501. callback = function(operation) {
  25502. if (operation.wasSuccessful()) {
  25503. record = operation.getRecords()[0];
  25504. Ext.callback(config.success, scope, [record, operation]);
  25505. } else {
  25506. Ext.callback(config.failure, scope, [record, operation]);
  25507. }
  25508. Ext.callback(config.callback, scope, [record, operation]);
  25509. };
  25510. this.proxy.read(operation, callback, this);
  25511. }
  25512. },
  25513. statics: {
  25514. PREFIX : 'ext-record',
  25515. AUTO_ID: 1,
  25516. EDIT : 'edit',
  25517. REJECT : 'reject',
  25518. COMMIT : 'commit',
  25519. id: function(rec) {
  25520. var id = [this.PREFIX, '-', this.AUTO_ID++].join('');
  25521. rec.phantom = true;
  25522. rec.internalId = id;
  25523. return id;
  25524. }
  25525. },
  25526. idgen: {
  25527. isGenerator: true,
  25528. type: 'default',
  25529. generate: function () {
  25530. return null;
  25531. },
  25532. getRecId: function (rec) {
  25533. return rec.modelName + '-' + rec.internalId;
  25534. }
  25535. },
  25536. editing : false,
  25537. dirty : false,
  25538. persistenceProperty: 'data',
  25539. evented: false,
  25540. isModel: true,
  25541. phantom : false,
  25542. idProperty: 'id',
  25543. clientIdProperty: null,
  25544. defaultProxyType: 'ajax',
  25545. constructor: function(data, id, raw, convertedData) {
  25546. data = data || {};
  25547. var me = this,
  25548. fields,
  25549. length,
  25550. field,
  25551. name,
  25552. value,
  25553. newId,
  25554. persistenceProperty,
  25555. i;
  25556. me.internalId = (id || id === 0) ? id : Ext.data.Model.id(me);
  25557. me.raw = raw || data;
  25558. if (!me.data) {
  25559. me.data = {};
  25560. }
  25561. me.modified = {};
  25562. if (me.persistanceProperty) {
  25563. me.persistenceProperty = me.persistanceProperty;
  25564. }
  25565. me[me.persistenceProperty] = convertedData || {};
  25566. me.mixins.observable.constructor.call(me);
  25567. if (!convertedData) {
  25568. fields = me.fields.items;
  25569. length = fields.length;
  25570. i = 0;
  25571. persistenceProperty = me[me.persistenceProperty];
  25572. if (Ext.isArray(data)) {
  25573. for (; i < length; i++) {
  25574. field = fields[i];
  25575. name = field.name;
  25576. value = data[field.originalIndex];
  25577. if (value === undefined) {
  25578. value = field.defaultValue;
  25579. }
  25580. if (field.convert) {
  25581. value = field.convert(value, me);
  25582. }
  25583. if (value !== undefined) {
  25584. persistenceProperty[name] = value;
  25585. }
  25586. }
  25587. } else {
  25588. for (; i < length; i++) {
  25589. field = fields[i];
  25590. name = field.name;
  25591. value = data[name];
  25592. if (value === undefined) {
  25593. value = field.defaultValue;
  25594. }
  25595. if (field.convert) {
  25596. value = field.convert(value, me);
  25597. }
  25598. if (value !== undefined) {
  25599. persistenceProperty[name] = value;
  25600. }
  25601. }
  25602. }
  25603. }
  25604. me.stores = [];
  25605. if (me.getId()) {
  25606. me.phantom = false;
  25607. } else if (me.phantom) {
  25608. newId = me.idgen.generate();
  25609. if (newId !== null) {
  25610. me.setId(newId);
  25611. }
  25612. }
  25613. me.dirty = false;
  25614. me.modified = {};
  25615. if (typeof me.init == 'function') {
  25616. me.init();
  25617. }
  25618. me.id = me.idgen.getRecId(me);
  25619. },
  25620. get: function(field) {
  25621. return this[this.persistenceProperty][field];
  25622. },
  25623. _singleProp: {},
  25624. set: function (fieldName, newValue) {
  25625. var me = this,
  25626. data = me[me.persistenceProperty],
  25627. fields = me.fields,
  25628. modified = me.modified,
  25629. single = (typeof fieldName == 'string'),
  25630. currentValue, field, idChanged, key, modifiedFieldNames, name, oldId,
  25631. newId, value, values;
  25632. if (single) {
  25633. values = me._singleProp;
  25634. values[fieldName] = newValue;
  25635. } else {
  25636. values = fieldName;
  25637. }
  25638. for (name in values) {
  25639. if (values.hasOwnProperty(name)) {
  25640. value = values[name];
  25641. if (fields && (field = fields.get(name)) && field.convert) {
  25642. value = field.convert(value, me);
  25643. }
  25644. currentValue = data[name];
  25645. if (me.isEqual(currentValue, value)) {
  25646. continue;
  25647. }
  25648. data[name] = value;
  25649. (modifiedFieldNames || (modifiedFieldNames = [])).push(name);
  25650. if (field && field.persist) {
  25651. if (modified.hasOwnProperty(name)) {
  25652. if (me.isEqual(modified[name], value)) {
  25653. delete modified[name];
  25654. me.dirty = false;
  25655. for (key in modified) {
  25656. if (modified.hasOwnProperty(key)){
  25657. me.dirty = true;
  25658. break;
  25659. }
  25660. }
  25661. }
  25662. } else {
  25663. me.dirty = true;
  25664. modified[name] = currentValue;
  25665. }
  25666. }
  25667. if (name == me.idProperty) {
  25668. idChanged = true;
  25669. oldId = currentValue;
  25670. newId = value;
  25671. }
  25672. }
  25673. }
  25674. if (single) {
  25675. delete values[fieldName];
  25676. }
  25677. if (idChanged) {
  25678. me.fireEvent('idchanged', me, oldId, newId);
  25679. }
  25680. if (!me.editing && modifiedFieldNames) {
  25681. me.afterEdit(modifiedFieldNames);
  25682. }
  25683. return modifiedFieldNames || null;
  25684. },
  25685. copyFrom: function(sourceRecord) {
  25686. if (sourceRecord) {
  25687. var me = this,
  25688. fields = me.fields.items,
  25689. fieldCount = fields.length,
  25690. field, i = 0,
  25691. myData = me[me.persistenceProperty],
  25692. sourceData = sourceRecord[sourceRecord.persistenceProperty],
  25693. value;
  25694. for (; i < fieldCount; i++) {
  25695. field = fields[i];
  25696. value = sourceData[field.name];
  25697. if (value !== undefined) {
  25698. myData[field.name] = value;
  25699. }
  25700. }
  25701. if (me.phantom && !sourceRecord.phantom) {
  25702. me.setId(sourceRecord.getId());
  25703. }
  25704. }
  25705. },
  25706. isEqual: function(a, b){
  25707. if (Ext.isDate(a) && Ext.isDate(b)) {
  25708. return Ext.Date.isEqual(a, b);
  25709. }
  25710. return a === b;
  25711. },
  25712. beginEdit : function(){
  25713. var me = this;
  25714. if (!me.editing) {
  25715. me.editing = true;
  25716. me.dirtySave = me.dirty;
  25717. me.dataSave = Ext.apply({}, me[me.persistenceProperty]);
  25718. me.modifiedSave = Ext.apply({}, me.modified);
  25719. }
  25720. },
  25721. cancelEdit : function(){
  25722. var me = this;
  25723. if (me.editing) {
  25724. me.editing = false;
  25725. me.modified = me.modifiedSave;
  25726. me[me.persistenceProperty] = me.dataSave;
  25727. me.dirty = me.dirtySave;
  25728. delete me.modifiedSave;
  25729. delete me.dataSave;
  25730. delete me.dirtySave;
  25731. }
  25732. },
  25733. endEdit : function(silent, modifiedFieldNames){
  25734. var me = this,
  25735. changed;
  25736. if (me.editing) {
  25737. me.editing = false;
  25738. if(!modifiedFieldNames) {
  25739. modifiedFieldNames = me.getModifiedFieldNames();
  25740. }
  25741. changed = me.dirty || modifiedFieldNames.length > 0;
  25742. delete me.modifiedSave;
  25743. delete me.dataSave;
  25744. delete me.dirtySave;
  25745. if (changed && silent !== true) {
  25746. me.afterEdit(modifiedFieldNames);
  25747. }
  25748. }
  25749. },
  25750. getModifiedFieldNames: function(){
  25751. var me = this,
  25752. saved = me.dataSave,
  25753. data = me[me.persistenceProperty],
  25754. modified = [],
  25755. key;
  25756. for (key in data) {
  25757. if (data.hasOwnProperty(key)) {
  25758. if (!me.isEqual(data[key], saved[key])) {
  25759. modified.push(key);
  25760. }
  25761. }
  25762. }
  25763. return modified;
  25764. },
  25765. getChanges : function(){
  25766. var modified = this.modified,
  25767. changes = {},
  25768. field;
  25769. for (field in modified) {
  25770. if (modified.hasOwnProperty(field)){
  25771. changes[field] = this.get(field);
  25772. }
  25773. }
  25774. return changes;
  25775. },
  25776. isModified : function(fieldName) {
  25777. return this.modified.hasOwnProperty(fieldName);
  25778. },
  25779. setDirty : function() {
  25780. var me = this,
  25781. fields = me.fields.items,
  25782. fLen = fields.length,
  25783. field, name, f;
  25784. me.dirty = true;
  25785. for (f = 0; f < fLen; f++) {
  25786. field = fields[f];
  25787. if (field.persist) {
  25788. name = field.name;
  25789. me.modified[name] = me.get(name);
  25790. }
  25791. }
  25792. },
  25793. reject : function(silent) {
  25794. var me = this,
  25795. modified = me.modified,
  25796. field;
  25797. for (field in modified) {
  25798. if (modified.hasOwnProperty(field)) {
  25799. if (typeof modified[field] != "function") {
  25800. me[me.persistenceProperty][field] = modified[field];
  25801. }
  25802. }
  25803. }
  25804. me.dirty = false;
  25805. me.editing = false;
  25806. me.modified = {};
  25807. if (silent !== true) {
  25808. me.afterReject();
  25809. }
  25810. },
  25811. commit : function(silent) {
  25812. var me = this;
  25813. me.phantom = me.dirty = me.editing = false;
  25814. me.modified = {};
  25815. if (silent !== true) {
  25816. me.afterCommit();
  25817. }
  25818. },
  25819. copy : function(newId) {
  25820. var me = this;
  25821. return new me.self(me.raw, newId, null, Ext.apply({}, me[me.persistenceProperty]));
  25822. },
  25823. setProxy: function(proxy) {
  25824. if (!proxy.isProxy) {
  25825. if (typeof proxy === "string") {
  25826. proxy = {
  25827. type: proxy
  25828. };
  25829. }
  25830. proxy = Ext.createByAlias("proxy." + proxy.type, proxy);
  25831. }
  25832. proxy.setModel(this.self);
  25833. this.proxy = proxy;
  25834. return proxy;
  25835. },
  25836. getProxy: function() {
  25837. return this.proxy;
  25838. },
  25839. validate: function() {
  25840. var errors = new Ext.data.Errors(),
  25841. validations = this.validations,
  25842. validators = Ext.data.validations,
  25843. length, validation, field, valid, type, i;
  25844. if (validations) {
  25845. length = validations.length;
  25846. for (i = 0; i < length; i++) {
  25847. validation = validations[i];
  25848. field = validation.field || validation.name;
  25849. type = validation.type;
  25850. valid = validators[type](validation, this.get(field));
  25851. if (!valid) {
  25852. errors.add({
  25853. field : field,
  25854. message: validation.message || validators[type + 'Message']
  25855. });
  25856. }
  25857. }
  25858. }
  25859. return errors;
  25860. },
  25861. isValid: function(){
  25862. return this.validate().isValid();
  25863. },
  25864. save: function(options) {
  25865. options = Ext.apply({}, options);
  25866. var me = this,
  25867. action = me.phantom ? 'create' : 'update',
  25868. scope = options.scope || me,
  25869. stores = me.stores,
  25870. i = 0,
  25871. storeCount,
  25872. store,
  25873. args,
  25874. operation,
  25875. callback;
  25876. Ext.apply(options, {
  25877. records: [me],
  25878. action : action
  25879. });
  25880. operation = new Ext.data.Operation(options);
  25881. callback = function(operation) {
  25882. args = [me, operation];
  25883. if (operation.wasSuccessful()) {
  25884. for(storeCount = stores.length; i < storeCount; i++) {
  25885. store = stores[i];
  25886. store.fireEvent('write', store, operation);
  25887. store.fireEvent('datachanged', store);
  25888. }
  25889. Ext.callback(options.success, scope, args);
  25890. } else {
  25891. Ext.callback(options.failure, scope, args);
  25892. }
  25893. Ext.callback(options.callback, scope, args);
  25894. };
  25895. me.getProxy()[action](operation, callback, me);
  25896. return me;
  25897. },
  25898. destroy: function(options){
  25899. options = Ext.apply({}, options);
  25900. var me = this,
  25901. scope = options.scope || me,
  25902. stores = me.stores,
  25903. i = 0,
  25904. storeCount,
  25905. store,
  25906. args,
  25907. operation,
  25908. callback;
  25909. Ext.apply(options, {
  25910. records: [me],
  25911. action : 'destroy'
  25912. });
  25913. operation = new Ext.data.Operation(options);
  25914. callback = function(operation) {
  25915. args = [me, operation];
  25916. if (operation.wasSuccessful()) {
  25917. for(storeCount = stores.length; i < storeCount; i++) {
  25918. store = stores[i];
  25919. store.fireEvent('write', store, operation);
  25920. store.fireEvent('datachanged', store);
  25921. }
  25922. me.clearListeners();
  25923. Ext.callback(options.success, scope, args);
  25924. } else {
  25925. Ext.callback(options.failure, scope, args);
  25926. }
  25927. Ext.callback(options.callback, scope, args);
  25928. };
  25929. me.getProxy().destroy(operation, callback, me);
  25930. return me;
  25931. },
  25932. getId: function() {
  25933. return this.get(this.idProperty);
  25934. },
  25935. getObservableId: function() {
  25936. return this.id;
  25937. },
  25938. setId: function(id) {
  25939. this.set(this.idProperty, id);
  25940. this.phantom = !(id || id === 0);
  25941. },
  25942. join : function(store) {
  25943. Ext.Array.include(this.stores, store);
  25944. this.store = this.stores[0];
  25945. },
  25946. unjoin: function(store) {
  25947. Ext.Array.remove(this.stores, store);
  25948. this.store = this.stores[0] || null;
  25949. },
  25950. afterEdit : function(modifiedFieldNames) {
  25951. this.callStore('afterEdit', modifiedFieldNames);
  25952. },
  25953. afterReject : function() {
  25954. this.callStore("afterReject");
  25955. },
  25956. afterCommit: function() {
  25957. this.callStore('afterCommit');
  25958. },
  25959. callStore: function(fn) {
  25960. var args = Ext.Array.clone(arguments),
  25961. stores = this.stores,
  25962. i = 0,
  25963. len = stores.length,
  25964. store, treeStore;
  25965. args[0] = this;
  25966. for (; i < len; ++i) {
  25967. store = stores[i];
  25968. if (store && typeof store[fn] == "function") {
  25969. store[fn].apply(store, args);
  25970. }
  25971. treeStore = store.treeStore;
  25972. if (treeStore && typeof treeStore[fn] == "function") {
  25973. treeStore[fn].apply(treeStore, args);
  25974. }
  25975. }
  25976. },
  25977. getData: function(includeAssociated){
  25978. var me = this,
  25979. fields = me.fields.items,
  25980. fLen = fields.length,
  25981. data = {},
  25982. name, f;
  25983. for (f = 0; f < fLen; f++) {
  25984. name = fields[f].name;
  25985. data[name] = me.get(name);
  25986. }
  25987. if (includeAssociated === true) {
  25988. Ext.apply(data, me.getAssociatedData());
  25989. }
  25990. return data;
  25991. },
  25992. getAssociatedData: function(){
  25993. return this.prepareAssociatedData({}, 1);
  25994. },
  25995. prepareAssociatedData: function(seenKeys, depth) {
  25996. var me = this,
  25997. associations = me.associations.items,
  25998. associationCount = associations.length,
  25999. associationData = {},
  26000. toRead = [],
  26001. toReadKey = [],
  26002. toReadIndex = [],
  26003. associatedStore, associatedRecords, associatedRecord, o, index, result, seenDepth,
  26004. associationId, associatedRecordCount, association, i, j, type, name;
  26005. for (i = 0; i < associationCount; i++) {
  26006. association = associations[i];
  26007. associationId = association.associationId;
  26008. seenDepth = seenKeys[associationId];
  26009. if (seenDepth && seenDepth !== depth) {
  26010. continue;
  26011. }
  26012. seenKeys[associationId] = depth;
  26013. type = association.type;
  26014. name = association.name;
  26015. if (type == 'hasMany') {
  26016. associatedStore = me[association.storeName];
  26017. associationData[name] = [];
  26018. if (associatedStore && associatedStore.getCount() > 0) {
  26019. associatedRecords = associatedStore.data.items;
  26020. associatedRecordCount = associatedRecords.length;
  26021. for (j = 0; j < associatedRecordCount; j++) {
  26022. associatedRecord = associatedRecords[j];
  26023. associationData[name][j] = associatedRecord.getData();
  26024. toRead.push(associatedRecord);
  26025. toReadKey.push(name);
  26026. toReadIndex.push(j);
  26027. }
  26028. }
  26029. } else if (type == 'belongsTo' || type == 'hasOne') {
  26030. associatedRecord = me[association.instanceName];
  26031. if (associatedRecord !== undefined) {
  26032. associationData[name] = associatedRecord.getData();
  26033. toRead.push(associatedRecord);
  26034. toReadKey.push(name);
  26035. toReadIndex.push(-1);
  26036. }
  26037. }
  26038. }
  26039. for (i = 0, associatedRecordCount = toRead.length; i < associatedRecordCount; ++i) {
  26040. associatedRecord = toRead[i];
  26041. o = associationData[toReadKey[i]];
  26042. index = toReadIndex[i];
  26043. result = associatedRecord.prepareAssociatedData(seenKeys, depth + 1);
  26044. if (index === -1) {
  26045. Ext.apply(o, result);
  26046. } else {
  26047. Ext.apply(o[index], result);
  26048. }
  26049. }
  26050. return associationData;
  26051. }
  26052. });
  26053. Ext.define('Ext.data.StoreManager', {
  26054. extend: 'Ext.util.MixedCollection',
  26055. alternateClassName: ['Ext.StoreMgr', 'Ext.data.StoreMgr', 'Ext.StoreManager'],
  26056. singleton: true,
  26057. uses: ['Ext.data.ArrayStore'],
  26058. register : function() {
  26059. for (var i = 0, s; (s = arguments[i]); i++) {
  26060. this.add(s);
  26061. }
  26062. },
  26063. unregister : function() {
  26064. for (var i = 0, s; (s = arguments[i]); i++) {
  26065. this.remove(this.lookup(s));
  26066. }
  26067. },
  26068. lookup : function(store) {
  26069. if (Ext.isArray(store)) {
  26070. var fields = ['field1'],
  26071. expand = !Ext.isArray(store[0]),
  26072. data = store,
  26073. i,
  26074. len;
  26075. if(expand){
  26076. data = [];
  26077. for (i = 0, len = store.length; i < len; ++i) {
  26078. data.push([store[i]]);
  26079. }
  26080. } else {
  26081. for(i = 2, len = store[0].length; i <= len; ++i){
  26082. fields.push('field' + i);
  26083. }
  26084. }
  26085. return new Ext.data.ArrayStore({
  26086. data : data,
  26087. fields: fields,
  26088. autoDestroy: true,
  26089. autoCreated: true,
  26090. expanded: expand
  26091. });
  26092. }
  26093. if (Ext.isString(store)) {
  26094. return this.get(store);
  26095. } else {
  26096. return Ext.data.AbstractStore.create(store);
  26097. }
  26098. },
  26099. getKey : function(o) {
  26100. return o.storeId;
  26101. }
  26102. }, function() {
  26103. Ext.regStore = function(name, config) {
  26104. var store;
  26105. if (Ext.isObject(name)) {
  26106. config = name;
  26107. } else {
  26108. config.storeId = name;
  26109. }
  26110. if (config instanceof Ext.data.Store) {
  26111. store = config;
  26112. } else {
  26113. store = new Ext.data.Store(config);
  26114. }
  26115. return Ext.data.StoreManager.register(store);
  26116. };
  26117. Ext.getStore = function(name) {
  26118. return Ext.data.StoreManager.lookup(name);
  26119. };
  26120. });
  26121. Ext.define('Ext.layout.component.Dock', {
  26122. extend: 'Ext.layout.component.Component',
  26123. alias: 'layout.dock',
  26124. alternateClassName: 'Ext.layout.component.AbstractDock',
  26125. type: 'dock',
  26126. initializedBorders: -1,
  26127. horizontalCollapsePolicy: { width: true, x: true },
  26128. verticalCollapsePolicy: { height: true, y: true },
  26129. finishRender: function () {
  26130. var me = this,
  26131. target, items;
  26132. me.callParent();
  26133. target = me.getRenderTarget();
  26134. items = me.getDockedItems();
  26135. me.finishRenderItems(target, items);
  26136. },
  26137. isItemBoxParent: function (itemContext) {
  26138. return true;
  26139. },
  26140. isItemShrinkWrap: function (item) {
  26141. return true;
  26142. },
  26143. dockOpposites: {
  26144. top: 'bottom',
  26145. right: 'left',
  26146. bottom: 'top',
  26147. left: 'right'
  26148. },
  26149. handleItemBorders: function() {
  26150. var me = this,
  26151. owner = me.owner,
  26152. borders, docked,
  26153. oldBorders = me.borders,
  26154. opposites = me.dockOpposites,
  26155. currentGeneration = owner.dockedItems.generation,
  26156. i, ln, item, dock, side, borderItem,
  26157. collapsed = me.collapsed;
  26158. if (me.initializedBorders == currentGeneration || (owner.border && !owner.manageBodyBorders)) {
  26159. return;
  26160. }
  26161. me.initializedBorders = currentGeneration;
  26162. me.collapsed = false;
  26163. docked = me.getLayoutItems();
  26164. me.collapsed = collapsed;
  26165. borders = { top: [], right: [], bottom: [], left: [] };
  26166. for (i = 0, ln = docked.length; i < ln; i++) {
  26167. item = docked[i];
  26168. dock = item.dock;
  26169. if (item.ignoreBorderManagement) {
  26170. continue;
  26171. }
  26172. if (!borders[dock].satisfied) {
  26173. borders[dock].push(item);
  26174. borders[dock].satisfied = true;
  26175. }
  26176. if (!borders.top.satisfied && opposites[dock] !== 'top') {
  26177. borders.top.push(item);
  26178. }
  26179. if (!borders.right.satisfied && opposites[dock] !== 'right') {
  26180. borders.right.push(item);
  26181. }
  26182. if (!borders.bottom.satisfied && opposites[dock] !== 'bottom') {
  26183. borders.bottom.push(item);
  26184. }
  26185. if (!borders.left.satisfied && opposites[dock] !== 'left') {
  26186. borders.left.push(item);
  26187. }
  26188. }
  26189. if (oldBorders) {
  26190. for (side in oldBorders) {
  26191. if (oldBorders.hasOwnProperty(side)) {
  26192. ln = oldBorders[side].length;
  26193. if (!owner.manageBodyBorders) {
  26194. for (i = 0; i < ln; i++) {
  26195. borderItem = oldBorders[side][i];
  26196. if (!borderItem.isDestroyed) {
  26197. borderItem.removeCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
  26198. }
  26199. }
  26200. if (!oldBorders[side].satisfied && !owner.bodyBorder) {
  26201. owner.removeBodyCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
  26202. }
  26203. }
  26204. else if (oldBorders[side].satisfied) {
  26205. owner.setBodyStyle('border-' + side + '-width', '');
  26206. }
  26207. }
  26208. }
  26209. }
  26210. for (side in borders) {
  26211. if (borders.hasOwnProperty(side)) {
  26212. ln = borders[side].length;
  26213. if (!owner.manageBodyBorders) {
  26214. for (i = 0; i < ln; i++) {
  26215. borders[side][i].addCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
  26216. }
  26217. if ((!borders[side].satisfied && !owner.bodyBorder) || owner.bodyBorder === false) {
  26218. owner.addBodyCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
  26219. }
  26220. }
  26221. else if (borders[side].satisfied) {
  26222. owner.setBodyStyle('border-' + side + '-width', '1px');
  26223. }
  26224. }
  26225. }
  26226. me.borders = borders;
  26227. },
  26228. beforeLayoutCycle: function (ownerContext) {
  26229. var me = this,
  26230. owner = me.owner,
  26231. shrinkWrap = me.sizeModels.shrinkWrap,
  26232. collapsedHorz, collapsedVert;
  26233. if (owner.collapsed) {
  26234. if (owner.collapsedVertical()) {
  26235. collapsedVert = true;
  26236. ownerContext.measureDimensions = 1;
  26237. } else {
  26238. collapsedHorz = true;
  26239. ownerContext.measureDimensions = 2;
  26240. }
  26241. }
  26242. ownerContext.collapsedVert = collapsedVert;
  26243. ownerContext.collapsedHorz = collapsedHorz;
  26244. if (collapsedVert) {
  26245. ownerContext.heightModel = shrinkWrap;
  26246. } else if (collapsedHorz) {
  26247. ownerContext.widthModel = shrinkWrap;
  26248. }
  26249. },
  26250. beginLayout: function(ownerContext) {
  26251. var me = this,
  26252. owner = me.owner,
  26253. docked = me.getLayoutItems(),
  26254. layoutContext = ownerContext.context,
  26255. dockedItemCount = docked.length,
  26256. dockedItems, i, item, itemContext, offsets,
  26257. collapsed;
  26258. me.callParent(arguments);
  26259. me.handleItemBorders();
  26260. collapsed = owner.getCollapsed();
  26261. if (collapsed !== me.lastCollapsedState && Ext.isDefined(me.lastCollapsedState)) {
  26262. if (me.owner.collapsed) {
  26263. ownerContext.isCollapsingOrExpanding = 1;
  26264. owner.addClsWithUI(owner.collapsedCls);
  26265. } else {
  26266. ownerContext.isCollapsingOrExpanding = 2;
  26267. owner.removeClsWithUI(owner.collapsedCls);
  26268. ownerContext.lastCollapsedState = me.lastCollapsedState;
  26269. }
  26270. }
  26271. me.lastCollapsedState = collapsed;
  26272. ownerContext.dockedItems = dockedItems = [];
  26273. for (i = 0; i < dockedItemCount; i++) {
  26274. item = docked[i];
  26275. if (item.rendered) {
  26276. itemContext = layoutContext.getCmp(item);
  26277. itemContext.dockedAt = { x: 0, y: 0 };
  26278. itemContext.offsets = offsets = Ext.Element.parseBox(item.offsets || {});
  26279. offsets.width = offsets.left + offsets.right;
  26280. offsets.height = offsets.top + offsets.bottom;
  26281. dockedItems.push(itemContext);
  26282. }
  26283. }
  26284. ownerContext.bodyContext = ownerContext.getEl('body');
  26285. },
  26286. beginLayoutCycle: function(ownerContext) {
  26287. var me = this,
  26288. docked = ownerContext.dockedItems,
  26289. len = docked.length,
  26290. owner = me.owner,
  26291. frameBody = owner.frameBody,
  26292. lastHeightModel = me.lastHeightModel,
  26293. i, item, dock;
  26294. me.callParent(arguments);
  26295. if (lastHeightModel && lastHeightModel.shrinkWrap &&
  26296. !ownerContext.heightModel.shrinkWrap && !me.owner.manageHeight) {
  26297. owner.body.dom.style.marginBottom = '';
  26298. }
  26299. if (ownerContext.widthModel.auto) {
  26300. if (ownerContext.widthModel.shrinkWrap) {
  26301. owner.el.setWidth(null);
  26302. }
  26303. owner.body.setWidth(null);
  26304. if (frameBody) {
  26305. frameBody.setWidth(null);
  26306. }
  26307. }
  26308. if (ownerContext.heightModel.auto) {
  26309. owner.body.setHeight(null);
  26310. if (frameBody) {
  26311. frameBody.setHeight(null);
  26312. }
  26313. }
  26314. if (ownerContext.collapsedVert) {
  26315. ownerContext.setContentHeight(0);
  26316. } else if (ownerContext.collapsedHorz) {
  26317. ownerContext.setContentWidth(0);
  26318. }
  26319. for (i = 0; i < len; i++) {
  26320. item = docked[i].target;
  26321. dock = item.dock;
  26322. if (dock == 'right') {
  26323. item.el.setLeft(0);
  26324. } else if (dock != 'left') {
  26325. continue;
  26326. }
  26327. }
  26328. },
  26329. calculate: function (ownerContext) {
  26330. var me = this,
  26331. measure = me.measureAutoDimensions(ownerContext, ownerContext.measureDimensions),
  26332. state = ownerContext.state,
  26333. horzDone = state.horzDone,
  26334. vertDone = state.vertDone,
  26335. bodyContext = ownerContext.bodyContext,
  26336. horz, vert, forward, backward;
  26337. ownerContext.borderInfo || ownerContext.getBorderInfo();
  26338. ownerContext.paddingInfo || ownerContext.getPaddingInfo();
  26339. ownerContext.framingInfo || ownerContext.getFraming();
  26340. bodyContext.borderInfo || bodyContext.getBorderInfo();
  26341. bodyContext.paddingInfo || bodyContext.getPaddingInfo();
  26342. horz = !horzDone &&
  26343. me.createAxis(ownerContext, measure.contentWidth, ownerContext.widthModel,
  26344. 'left', 'right', 'x', 'width', 'Width', ownerContext.collapsedHorz);
  26345. vert = !vertDone &&
  26346. me.createAxis(ownerContext, measure.contentHeight, ownerContext.heightModel,
  26347. 'top', 'bottom', 'y', 'height', 'Height', ownerContext.collapsedVert);
  26348. for (forward = 0, backward = ownerContext.dockedItems.length; backward--; ++forward) {
  26349. if (horz) {
  26350. me.dockChild(ownerContext, horz, backward, forward);
  26351. }
  26352. if (vert) {
  26353. me.dockChild(ownerContext, vert, backward, forward);
  26354. }
  26355. }
  26356. if (horz && me.finishAxis(ownerContext, horz)) {
  26357. state.horzDone = horzDone = horz;
  26358. }
  26359. if (vert && me.finishAxis(ownerContext, vert)) {
  26360. state.vertDone = vertDone = vert;
  26361. }
  26362. if (horzDone && vertDone && me.finishConstraints(ownerContext, horzDone, vertDone)) {
  26363. me.finishPositions(ownerContext, horzDone, vertDone);
  26364. } else {
  26365. me.done = false;
  26366. }
  26367. },
  26368. createAxis: function (ownerContext, contentSize, sizeModel, dockBegin, dockEnd, posProp,
  26369. sizeProp, sizePropCap, collapsedAxis) {
  26370. var begin = 0,
  26371. owner = this.owner,
  26372. maxSize = owner['max' + sizePropCap],
  26373. minSize = owner['min' + sizePropCap] || 0,
  26374. hasMaxSize = maxSize != null,
  26375. setSize = 'set' + sizePropCap,
  26376. border, bodyContext, frameSize, padding, end;
  26377. if (sizeModel.shrinkWrap) {
  26378. if (collapsedAxis) {
  26379. end = 0;
  26380. } else {
  26381. bodyContext = ownerContext.bodyContext;
  26382. end = contentSize + bodyContext.borderInfo[sizeProp];
  26383. }
  26384. } else {
  26385. border = ownerContext.borderInfo;
  26386. frameSize = ownerContext.framingInfo;
  26387. padding = ownerContext.paddingInfo;
  26388. end = ownerContext.getProp(sizeProp);
  26389. end -= border[dockEnd] + padding[dockEnd] + frameSize[dockEnd];
  26390. begin = border[dockBegin] + padding[dockBegin] + frameSize[dockBegin];
  26391. }
  26392. return {
  26393. shrinkWrap: sizeModel.shrinkWrap,
  26394. sizeModel: sizeModel,
  26395. begin: begin,
  26396. end: end,
  26397. collapsed: collapsedAxis,
  26398. horizontal: posProp == 'x',
  26399. ignoreFrameBegin: false,
  26400. ignoreFrameEnd: false,
  26401. initialSize: end - begin,
  26402. hasMinMaxConstraints: (minSize || hasMaxSize) && sizeModel.shrinkWrap,
  26403. minSize: minSize,
  26404. maxSize: hasMaxSize ? maxSize : 1e9,
  26405. bodyPosProp: this.owner.manageHeight ? posProp : ('margin-' + dockBegin),
  26406. dockBegin: dockBegin,
  26407. dockEnd: dockEnd,
  26408. posProp: posProp,
  26409. sizeProp: sizeProp,
  26410. sizePropCap: sizePropCap,
  26411. setSize: setSize,
  26412. dockedPixelsEnd: 0
  26413. };
  26414. },
  26415. dockChild: function (ownerContext, axis, backward, forward) {
  26416. var me = this,
  26417. itemContext = ownerContext.dockedItems[axis.shrinkWrap ? backward : forward],
  26418. item = itemContext.target,
  26419. dock = item.dock,
  26420. pos;
  26421. if(item.ignoreParentFrame && ownerContext.isCollapsingOrExpanding) {
  26422. itemContext.clearMarginCache();
  26423. }
  26424. if (dock == axis.dockBegin) {
  26425. if (axis.shrinkWrap) {
  26426. pos = me.dockOutwardBegin(ownerContext, itemContext, item, axis);
  26427. } else {
  26428. pos = me.dockInwardBegin(ownerContext, itemContext, item, axis);
  26429. }
  26430. } else if (dock == axis.dockEnd) {
  26431. if (axis.shrinkWrap) {
  26432. pos = me.dockOutwardEnd(ownerContext, itemContext, item, axis);
  26433. } else {
  26434. pos = me.dockInwardEnd(ownerContext, itemContext, item, axis);
  26435. }
  26436. } else {
  26437. pos = me.dockStretch(ownerContext, itemContext, item, axis);
  26438. }
  26439. itemContext.dockedAt[axis.posProp] = pos;
  26440. },
  26441. dockInwardBegin: function (ownerContext, itemContext, item, axis) {
  26442. var pos = axis.begin,
  26443. sizeProp = axis.sizeProp,
  26444. size,
  26445. dock;
  26446. if (item.ignoreParentFrame) {
  26447. dock = item.dock;
  26448. pos -= ownerContext.borderInfo[dock] + ownerContext.paddingInfo[dock] +
  26449. ownerContext.framingInfo[dock];
  26450. }
  26451. if (!item.overlay) {
  26452. size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp];
  26453. axis.begin += size;
  26454. }
  26455. return pos;
  26456. },
  26457. dockInwardEnd: function (ownerContext, itemContext, item, axis) {
  26458. var sizeProp = axis.sizeProp,
  26459. size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp],
  26460. pos = axis.end - size;
  26461. if (!item.overlay) {
  26462. axis.end = pos;
  26463. }
  26464. if (item.ignoreParentFrame) {
  26465. pos += ownerContext.borderInfo[item.dock] + ownerContext.paddingInfo[item.dock] +
  26466. ownerContext.framingInfo[item.dock];
  26467. }
  26468. return pos;
  26469. },
  26470. dockOutwardBegin: function (ownerContext, itemContext, item, axis) {
  26471. var pos = axis.begin,
  26472. sizeProp = axis.sizeProp,
  26473. dock, size;
  26474. if (axis.collapsed) {
  26475. axis.ignoreFrameBegin = axis.ignoreFrameEnd = true;
  26476. } else if (item.ignoreParentFrame) {
  26477. dock = item.dock;
  26478. pos -= ownerContext.borderInfo[dock] + ownerContext.paddingInfo[dock] +
  26479. ownerContext.framingInfo[dock];
  26480. axis.ignoreFrameBegin = true;
  26481. }
  26482. if (!item.overlay) {
  26483. size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp];
  26484. pos -= size;
  26485. axis.begin = pos;
  26486. }
  26487. return pos;
  26488. },
  26489. dockOutwardEnd: function (ownerContext, itemContext, item, axis) {
  26490. var pos = axis.end,
  26491. sizeProp = axis.sizeProp,
  26492. dock, size;
  26493. size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp];
  26494. if (axis.collapsed) {
  26495. axis.ignoreFrameBegin = axis.ignoreFrameEnd = true;
  26496. } else if (item.ignoreParentFrame) {
  26497. dock = item.dock;
  26498. pos += ownerContext.borderInfo[dock] + ownerContext.paddingInfo[dock] +
  26499. ownerContext.framingInfo[dock];
  26500. axis.ignoreFrameEnd = true;
  26501. }
  26502. if (!item.overlay) {
  26503. axis.end = pos + size;
  26504. axis.dockedPixelsEnd += size;
  26505. }
  26506. return pos;
  26507. },
  26508. dockStretch: function (ownerContext, itemContext, item, axis) {
  26509. var dock = item.dock,
  26510. sizeProp = axis.sizeProp,
  26511. horizontal = dock == 'top' || dock == 'bottom',
  26512. offsets = itemContext.offsets,
  26513. border = ownerContext.borderInfo,
  26514. padding = ownerContext.paddingInfo,
  26515. endProp = horizontal ? 'right' : 'bottom',
  26516. startProp = horizontal ? 'left' : 'top',
  26517. pos = axis.begin + offsets[startProp],
  26518. margin, size, framing;
  26519. if (item.stretch !== false) {
  26520. size = axis.end - pos - offsets[endProp];
  26521. if (item.ignoreParentFrame) {
  26522. framing = ownerContext.framingInfo;
  26523. pos -= border[startProp] + padding[startProp] + framing[startProp];
  26524. size += border[sizeProp] + padding[sizeProp] + framing[sizeProp];
  26525. }
  26526. margin = itemContext.getMarginInfo();
  26527. size -= margin[sizeProp];
  26528. itemContext[axis.setSize](size);
  26529. }
  26530. return pos;
  26531. },
  26532. finishAxis: function (ownerContext, axis) {
  26533. var size = axis.end - axis.begin,
  26534. setSizeMethod = axis.setSize,
  26535. beginName = axis.dockBegin,
  26536. endName = axis.dockEnd,
  26537. border = ownerContext.borderInfo,
  26538. padding = ownerContext.paddingInfo,
  26539. framing = ownerContext.framingInfo,
  26540. frameSize = padding[beginName] + border[beginName] + framing[beginName],
  26541. bodyContext = ownerContext.bodyContext,
  26542. bodyPos, bodySize, dirty;
  26543. if (axis.shrinkWrap) {
  26544. axis.delta = -axis.begin;
  26545. bodySize = axis.initialSize;
  26546. if (axis.ignoreFrameBegin) {
  26547. axis.delta -= border[beginName];
  26548. bodyPos = -axis.begin - frameSize;
  26549. } else {
  26550. size += frameSize;
  26551. axis.delta += padding[beginName] + framing[beginName];
  26552. bodyPos = -axis.begin;
  26553. }
  26554. if (!axis.ignoreFrameEnd) {
  26555. size += padding[endName] + border[endName] + framing[endName];
  26556. }
  26557. axis.size = size;
  26558. if (!axis.horizontal && !this.owner.manageHeight) {
  26559. dirty = false;
  26560. }
  26561. } else {
  26562. axis.delta = -border[axis.dockBegin];
  26563. bodySize = size;
  26564. bodyPos = axis.begin - frameSize;
  26565. }
  26566. bodyContext[setSizeMethod](bodySize, dirty);
  26567. bodyContext.setProp(axis.bodyPosProp, bodyPos);
  26568. return !isNaN(size);
  26569. },
  26570. finishConstraints: function (ownerContext, horz, vert) {
  26571. var sizeModels = this.sizeModels,
  26572. publishWidth = horz.shrinkWrap,
  26573. publishHeight = vert.shrinkWrap,
  26574. dirty, height, width, heightModel, widthModel, size;
  26575. if (publishWidth) {
  26576. size = horz.size;
  26577. if (size < horz.minSize) {
  26578. widthModel = sizeModels.constrainedMin;
  26579. width = horz.minSize;
  26580. } else if (size > horz.maxSize) {
  26581. widthModel = sizeModels.constrainedMax;
  26582. width = horz.maxSize;
  26583. } else {
  26584. width = size;
  26585. }
  26586. }
  26587. if (publishHeight) {
  26588. size = vert.size;
  26589. if (size < vert.minSize) {
  26590. heightModel = sizeModels.constrainedMin;
  26591. height = vert.minSize;
  26592. } else if (size > vert.maxSize) {
  26593. heightModel = sizeModels.constrainedMax;
  26594. height = vert.maxSize;
  26595. } else {
  26596. if (!ownerContext.collapsedVert && !this.owner.manageHeight) {
  26597. dirty = false;
  26598. ownerContext.bodyContext.setProp('margin-bottom', vert.dockedPixelsEnd);
  26599. }
  26600. height = size;
  26601. }
  26602. }
  26603. if (widthModel || heightModel) {
  26604. if (widthModel && heightModel &&
  26605. widthModel.constrainedMax && heightModel.constrainedMin) {
  26606. ownerContext.invalidate({ widthModel: widthModel });
  26607. return false;
  26608. }
  26609. if (!ownerContext.widthModel.calculatedFromShrinkWrap &&
  26610. !ownerContext.heightModel.calculatedFromShrinkWrap) {
  26611. ownerContext.invalidate({ widthModel: widthModel, heightModel: heightModel });
  26612. return false;
  26613. }
  26614. }
  26615. if (publishWidth) {
  26616. ownerContext.setWidth(width);
  26617. if (widthModel) {
  26618. ownerContext.widthModel = widthModel;
  26619. }
  26620. }
  26621. if (publishHeight) {
  26622. ownerContext.setHeight(height, dirty);
  26623. if (heightModel) {
  26624. ownerContext.heightModel = heightModel;
  26625. }
  26626. }
  26627. return true;
  26628. },
  26629. finishPositions: function (ownerContext, horz, vert) {
  26630. var dockedItems = ownerContext.dockedItems,
  26631. length = dockedItems.length,
  26632. deltaX = horz.delta,
  26633. deltaY = vert.delta,
  26634. index, itemContext;
  26635. for (index = 0; index < length; ++index) {
  26636. itemContext = dockedItems[index];
  26637. itemContext.setProp('x', deltaX + itemContext.dockedAt.x);
  26638. itemContext.setProp('y', deltaY + itemContext.dockedAt.y);
  26639. }
  26640. },
  26641. finishedLayout: function(ownerContext) {
  26642. var me = this,
  26643. target = ownerContext.target;
  26644. me.callParent(arguments);
  26645. if (!ownerContext.animatePolicy) {
  26646. if (ownerContext.isCollapsingOrExpanding === 1) {
  26647. target.afterCollapse(false);
  26648. } else if (ownerContext.isCollapsingOrExpanding === 2) {
  26649. target.afterExpand(false);
  26650. }
  26651. }
  26652. },
  26653. getAnimatePolicy: function(ownerContext) {
  26654. var me = this,
  26655. lastCollapsedState, policy;
  26656. if (ownerContext.isCollapsingOrExpanding == 1) {
  26657. lastCollapsedState = me.lastCollapsedState;
  26658. } else if (ownerContext.isCollapsingOrExpanding == 2) {
  26659. lastCollapsedState = ownerContext.lastCollapsedState;
  26660. }
  26661. if (lastCollapsedState == 'left' || lastCollapsedState == 'right') {
  26662. policy = me.horizontalCollapsePolicy;
  26663. } else if (lastCollapsedState == 'top' || lastCollapsedState == 'bottom') {
  26664. policy = me.verticalCollapsePolicy;
  26665. }
  26666. return policy;
  26667. },
  26668. getDockedItems: function(order, beforeBody) {
  26669. var me = this,
  26670. renderedOnly = (order === 'visual'),
  26671. all = renderedOnly ? Ext.ComponentQuery.query('[rendered]', me.owner.dockedItems.items) : me.owner.dockedItems.items,
  26672. sort = all && all.length && order !== false,
  26673. renderOrder,
  26674. dock, dockedItems, i, isBefore, length;
  26675. if (beforeBody == null) {
  26676. dockedItems = sort && !renderedOnly ? all.slice() : all;
  26677. } else {
  26678. dockedItems = [];
  26679. for (i = 0, length = all.length; i < length; ++i) {
  26680. dock = all[i].dock;
  26681. isBefore = (dock == 'top' || dock == 'left');
  26682. if (beforeBody ? isBefore : !isBefore) {
  26683. dockedItems.push(all[i]);
  26684. }
  26685. }
  26686. sort = sort && dockedItems.length;
  26687. }
  26688. if (sort) {
  26689. renderOrder = (order = order || 'render') == 'render';
  26690. Ext.Array.sort(dockedItems, function(a, b) {
  26691. var aw,
  26692. bw;
  26693. if (renderOrder && ((aw = me.owner.dockOrder[a.dock]) !== (bw = me.owner.dockOrder[b.dock]))) {
  26694. if (!(aw + bw)) {
  26695. return aw - bw;
  26696. }
  26697. }
  26698. aw = me.getItemWeight(a, order);
  26699. bw = me.getItemWeight(b, order);
  26700. if ((aw !== undefined) && (bw !== undefined)) {
  26701. return aw - bw;
  26702. }
  26703. return 0;
  26704. });
  26705. }
  26706. return dockedItems || [];
  26707. },
  26708. getItemWeight: function (item, order) {
  26709. var weight = item.weight || this.owner.defaultDockWeights[item.dock];
  26710. return weight[order] || weight;
  26711. },
  26712. getLayoutItems : function() {
  26713. var me = this,
  26714. items,
  26715. itemCount,
  26716. item,
  26717. i,
  26718. result;
  26719. if (me.owner.collapsed) {
  26720. result = me.owner.getCollapsedDockedItems();
  26721. } else {
  26722. items = me.getDockedItems('visual');
  26723. itemCount = items.length;
  26724. result = [];
  26725. for (i = 0; i < itemCount; i++) {
  26726. item = items[i];
  26727. if (!item.hidden) {
  26728. result.push(item);
  26729. }
  26730. }
  26731. }
  26732. return result;
  26733. },
  26734. measureContentWidth: function (ownerContext) {
  26735. var bodyContext = ownerContext.bodyContext;
  26736. return bodyContext.el.getWidth() - bodyContext.getBorderInfo().width;
  26737. },
  26738. measureContentHeight: function (ownerContext) {
  26739. var bodyContext = ownerContext.bodyContext;
  26740. return bodyContext.el.getHeight() - bodyContext.getBorderInfo().height;
  26741. },
  26742. redoLayout: function(ownerContext) {
  26743. var me = this,
  26744. owner = me.owner;
  26745. if (ownerContext.isCollapsingOrExpanding == 1) {
  26746. if (owner.reExpander) {
  26747. owner.reExpander.el.show();
  26748. }
  26749. owner.addClsWithUI(owner.collapsedCls);
  26750. ownerContext.redo(true);
  26751. } else if (ownerContext.isCollapsingOrExpanding == 2) {
  26752. owner.removeClsWithUI(owner.collapsedCls);
  26753. ownerContext.bodyContext.redo();
  26754. }
  26755. },
  26756. renderChildren: function() {
  26757. var me = this,
  26758. items = me.getDockedItems(),
  26759. target = me.getRenderTarget();
  26760. me.renderItems(items, target);
  26761. },
  26762. renderItems: function(items, target) {
  26763. var me = this,
  26764. dockedItemCount = items.length,
  26765. itemIndex = 0,
  26766. correctPosition = 0,
  26767. staticNodeCount = 0,
  26768. targetNodes = me.getRenderTarget().dom.childNodes,
  26769. targetChildCount = targetNodes.length,
  26770. i, j, targetChildNode, item;
  26771. for (i = 0, j = 0; i < targetChildCount; i++) {
  26772. targetChildNode = targetNodes[i];
  26773. if (Ext.fly(targetChildNode).hasCls('x-resizable-handle')) {
  26774. break;
  26775. }
  26776. for (j = 0; j < dockedItemCount; j++) {
  26777. item = items[j];
  26778. if (item.rendered && item.el.dom === targetChildNode) {
  26779. break;
  26780. }
  26781. }
  26782. if (j === dockedItemCount) {
  26783. staticNodeCount++;
  26784. }
  26785. }
  26786. for (; itemIndex < dockedItemCount; itemIndex++, correctPosition++) {
  26787. item = items[itemIndex];
  26788. if (itemIndex === correctPosition && (item.dock === 'right' || item.dock === 'bottom')) {
  26789. correctPosition += staticNodeCount;
  26790. }
  26791. if (item && !item.rendered) {
  26792. me.renderItem(item, target, correctPosition);
  26793. }
  26794. else if (!me.isValidParent(item, target, correctPosition)) {
  26795. me.moveItem(item, target, correctPosition);
  26796. }
  26797. }
  26798. },
  26799. undoLayout: function(ownerContext) {
  26800. var me = this,
  26801. owner = me.owner;
  26802. if (ownerContext.isCollapsingOrExpanding == 1) {
  26803. if (owner.reExpander) {
  26804. owner.reExpander.el.hide();
  26805. }
  26806. owner.removeClsWithUI(owner.collapsedCls);
  26807. ownerContext.undo(true);
  26808. } else if (ownerContext.isCollapsingOrExpanding == 2) {
  26809. owner.addClsWithUI(owner.collapsedCls);
  26810. ownerContext.bodyContext.undo();
  26811. }
  26812. },
  26813. sizePolicy: {
  26814. nostretch: {
  26815. setsWidth: 0,
  26816. setsHeight: 0
  26817. },
  26818. stretchH: {
  26819. setsWidth: 1,
  26820. setsHeight: 0
  26821. },
  26822. stretchV: {
  26823. setsWidth: 0,
  26824. setsHeight: 1
  26825. },
  26826. autoStretchH: {
  26827. readsWidth: 1,
  26828. setsWidth: 1,
  26829. setsHeight: 0
  26830. },
  26831. autoStretchV: {
  26832. readsHeight: 1,
  26833. setsWidth: 0,
  26834. setsHeight: 1
  26835. }
  26836. },
  26837. getItemSizePolicy: function (item) {
  26838. var policy = this.sizePolicy,
  26839. dock, vertical;
  26840. if (item.stretch === false) {
  26841. return policy.nostretch;
  26842. }
  26843. dock = item.dock;
  26844. vertical = (dock == 'left' || dock == 'right');
  26845. if (vertical) {
  26846. return policy.stretchV;
  26847. }
  26848. return policy.stretchH;
  26849. },
  26850. configureItem : function(item, pos) {
  26851. this.callParent(arguments);
  26852. item.addCls(Ext.baseCSSPrefix + 'docked');
  26853. item.addClsWithUI('docked-' + item.dock);
  26854. },
  26855. afterRemove : function(item) {
  26856. this.callParent(arguments);
  26857. if (this.itemCls) {
  26858. item.el.removeCls(this.itemCls + '-' + item.dock);
  26859. }
  26860. var dom = item.el.dom;
  26861. if (!item.destroying && dom) {
  26862. dom.parentNode.removeChild(dom);
  26863. }
  26864. this.childrenChanged = true;
  26865. }
  26866. });
  26867. Ext.define('Ext.toolbar.Fill', {
  26868. extend: 'Ext.Component',
  26869. alias: 'widget.tbfill',
  26870. alternateClassName: 'Ext.Toolbar.Fill',
  26871. isFill : true,
  26872. flex: 1
  26873. });
  26874. Ext.define('Ext.layout.container.boxOverflow.None', {
  26875. alternateClassName: 'Ext.layout.boxOverflow.None',
  26876. constructor: function(layout, config) {
  26877. this.layout = layout;
  26878. Ext.apply(this, config);
  26879. },
  26880. handleOverflow: Ext.emptyFn,
  26881. clearOverflow: Ext.emptyFn,
  26882. beginLayout: Ext.emptyFn,
  26883. beginLayoutCycle: Ext.emptyFn,
  26884. finishedLayout: Ext.emptyFn,
  26885. completeLayout: function (ownerContext) {
  26886. var me = this,
  26887. plan = ownerContext.state.boxPlan,
  26888. overflow;
  26889. if (plan && plan.tooNarrow) {
  26890. overflow = me.handleOverflow(ownerContext);
  26891. if (overflow) {
  26892. if (overflow.reservedSpace) {
  26893. me.layout.publishInnerCtSize(ownerContext, overflow.reservedSpace);
  26894. }
  26895. }
  26896. } else {
  26897. me.clearOverflow();
  26898. }
  26899. },
  26900. onRemove: Ext.emptyFn,
  26901. getItem: function(item) {
  26902. return this.layout.owner.getComponent(item);
  26903. },
  26904. getOwnerType: function(owner){
  26905. var type;
  26906. if (owner.isToolbar) {
  26907. type = 'toolbar';
  26908. } else if (owner.isTabBar) {
  26909. type = 'tabbar';
  26910. } else if (owner.isMenu) {
  26911. type = 'menu';
  26912. } else {
  26913. type = owner.getXType();
  26914. }
  26915. return type;
  26916. },
  26917. getPrefixConfig: Ext.emptyFn,
  26918. getSuffixConfig: Ext.emptyFn,
  26919. getOverflowCls: function() {
  26920. return '';
  26921. }
  26922. });
  26923. Ext.define('Ext.toolbar.Item', {
  26924. extend: 'Ext.Component',
  26925. alias: 'widget.tbitem',
  26926. alternateClassName: 'Ext.Toolbar.Item',
  26927. enable:Ext.emptyFn,
  26928. disable:Ext.emptyFn,
  26929. focus:Ext.emptyFn
  26930. });
  26931. Ext.define('Ext.toolbar.Separator', {
  26932. extend: 'Ext.toolbar.Item',
  26933. alias: 'widget.tbseparator',
  26934. alternateClassName: 'Ext.Toolbar.Separator',
  26935. baseCls: Ext.baseCSSPrefix + 'toolbar-separator',
  26936. focusable: false,
  26937. border: true
  26938. });
  26939. Ext.define('Ext.layout.component.Button', {
  26940. alias: ['layout.button'],
  26941. extend: 'Ext.layout.component.Auto',
  26942. type: 'button',
  26943. cellClsRE: /-btn-(tl|br)\b/,
  26944. htmlRE: /<.*>/,
  26945. constructor: function () {
  26946. this.callParent(arguments);
  26947. this.hackWidth = Ext.isIE && (!Ext.isStrict || Ext.isIE6 || Ext.isIE7 || Ext.isIE8);
  26948. this.heightIncludesPadding = Ext.isIE6 && Ext.isStrict;
  26949. },
  26950. beginLayout: function (ownerContext) {
  26951. this.callParent(arguments);
  26952. this.cacheTargetInfo(ownerContext);
  26953. },
  26954. beginLayoutCycle: function(ownerContext) {
  26955. var me = this,
  26956. empty = '',
  26957. owner = me.owner,
  26958. btnEl = owner.btnEl,
  26959. btnInnerEl = owner.btnInnerEl,
  26960. text = owner.text,
  26961. htmlAutoHeight;
  26962. me.callParent(arguments);
  26963. btnInnerEl.setStyle('overflow', empty);
  26964. if (!ownerContext.widthModel.natural) {
  26965. owner.el.setStyle('width', empty);
  26966. }
  26967. htmlAutoHeight = ownerContext.heightModel.shrinkWrap && text && me.htmlRE.test(text);
  26968. btnEl.setStyle('width', empty);
  26969. btnEl.setStyle('height', htmlAutoHeight ? 'auto' : empty);
  26970. btnInnerEl.setStyle('width', empty);
  26971. btnInnerEl.setStyle('height', htmlAutoHeight ? 'auto' : empty);
  26972. btnInnerEl.setStyle('line-height', htmlAutoHeight ? 'normal' : empty);
  26973. btnInnerEl.setStyle('padding-top', empty);
  26974. owner.btnIconEl.setStyle('width', empty);
  26975. },
  26976. calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
  26977. return contentHeight;
  26978. },
  26979. calculateOwnerWidthFromContentWidth: function (ownerContext, contentWidth) {
  26980. return contentWidth;
  26981. },
  26982. measureContentWidth: function (ownerContext) {
  26983. var me = this,
  26984. owner = me.owner,
  26985. btnEl = owner.btnEl,
  26986. btnInnerEl = owner.btnInnerEl,
  26987. text = owner.text,
  26988. btnFrameWidth, metrics, sizeIconEl, width, btnElContext, btnInnerElContext;
  26989. if (owner.text && me.hackWidth && btnEl) {
  26990. btnFrameWidth = me.btnFrameWidth;
  26991. if (text.indexOf('>') === -1) {
  26992. text = text.replace(/</g, '&lt;');
  26993. }
  26994. metrics = Ext.util.TextMetrics.measure(btnInnerEl, text);
  26995. width = metrics.width + btnFrameWidth + me.adjWidth;
  26996. btnElContext = ownerContext.getEl('btnEl');
  26997. btnInnerElContext = ownerContext.getEl('btnInnerEl');
  26998. sizeIconEl = (owner.icon || owner.iconCls) &&
  26999. (owner.iconAlign == "top" || owner.iconAlign == "bottom");
  27000. ownerContext.setWidth(width);
  27001. btnElContext.setWidth(metrics.width + btnFrameWidth);
  27002. btnInnerElContext.setWidth(metrics.width + btnFrameWidth);
  27003. if (sizeIconEl) {
  27004. owner.btnIconEl.setWidth(metrics.width + btnFrameWidth);
  27005. }
  27006. } else {
  27007. width = ownerContext.el.getWidth();
  27008. }
  27009. return width;
  27010. },
  27011. measureContentHeight: function (ownerContext) {
  27012. var me = this,
  27013. owner = me.owner,
  27014. btnInnerEl = owner.btnInnerEl,
  27015. btnItem = ownerContext.getEl('btnEl'),
  27016. btnInnerItem = ownerContext.getEl('btnInnerEl'),
  27017. minTextHeight = me.minTextHeight,
  27018. adjHeight = me.adjHeight,
  27019. text = owner.getText(),
  27020. height,
  27021. textHeight,
  27022. topPadding;
  27023. if (owner.vertical) {
  27024. height = Ext.util.TextMetrics.measure(btnInnerEl, owner.text).width;
  27025. height += me.btnFrameHeight + adjHeight;
  27026. ownerContext.setHeight(height, true, true);
  27027. }
  27028. else {
  27029. if (text && me.htmlRE.test(text)) {
  27030. textHeight = btnInnerEl.getHeight();
  27031. if (textHeight < minTextHeight) {
  27032. topPadding = Math.floor((minTextHeight - textHeight) / 2);
  27033. btnInnerItem.setHeight(minTextHeight - (me.heightIncludesPadding ? topPadding : 0));
  27034. btnInnerItem.setProp('padding-top', topPadding);
  27035. textHeight = minTextHeight;
  27036. }
  27037. height = textHeight + adjHeight;
  27038. }
  27039. else {
  27040. height = ownerContext.el.getHeight();
  27041. }
  27042. }
  27043. btnItem.setHeight(height - adjHeight);
  27044. return height;
  27045. },
  27046. publishInnerHeight: function(ownerContext, height) {
  27047. var me = this,
  27048. owner = me.owner,
  27049. isNum = Ext.isNumber,
  27050. btnItem = ownerContext.getEl('btnEl'),
  27051. btnInnerEl = owner.btnInnerEl,
  27052. btnInnerItem = ownerContext.getEl('btnInnerEl'),
  27053. btnHeight = isNum(height) ? height - me.adjHeight : height,
  27054. btnFrameHeight = me.btnFrameHeight,
  27055. text = owner.getText(),
  27056. textHeight,
  27057. paddingTop;
  27058. btnItem.setHeight(btnHeight);
  27059. btnInnerItem.setHeight(btnHeight);
  27060. if (!owner.vertical && btnHeight >= 0) {
  27061. btnInnerItem.setProp('line-height', btnHeight - btnFrameHeight + 'px');
  27062. }
  27063. if (text && me.htmlRE.test(text)) {
  27064. btnInnerItem.setProp('line-height', 'normal');
  27065. btnInnerEl.setStyle('line-height', 'normal');
  27066. textHeight = Ext.util.TextMetrics.measure(btnInnerEl, text).height;
  27067. paddingTop = Math.floor(Math.max(btnHeight - btnFrameHeight - textHeight, 0) / 2);
  27068. btnInnerItem.setProp('padding-top', me.btnFrameTop + paddingTop);
  27069. btnInnerItem.setHeight(btnHeight - (me.heightIncludesPadding ? paddingTop : 0));
  27070. }
  27071. },
  27072. publishInnerWidth: function(ownerContext, width) {
  27073. var me = this,
  27074. isNum = Ext.isNumber,
  27075. btnItem = ownerContext.getEl('btnEl'),
  27076. btnInnerItem = ownerContext.getEl('btnInnerEl'),
  27077. btnWidth = isNum(width) ? width - me.adjWidth : width;
  27078. btnItem.setWidth(btnWidth);
  27079. btnInnerItem.setWidth(btnWidth);
  27080. },
  27081. clearTargetCache: function(){
  27082. delete this.adjWidth;
  27083. },
  27084. cacheTargetInfo: function(ownerContext) {
  27085. var me = this,
  27086. owner = me.owner,
  27087. scale = owner.scale,
  27088. padding, frameSize, btnWrapPadding, btnInnerEl, innerFrameSize;
  27089. if (!('adjWidth' in me) || me.lastScale !== scale) {
  27090. if (me.lastScale) {
  27091. owner.btnInnerEl.setStyle('line-height', '');
  27092. }
  27093. me.lastScale = scale;
  27094. padding = ownerContext.getPaddingInfo();
  27095. frameSize = ownerContext.getFrameInfo();
  27096. btnWrapPadding = ownerContext.getEl('btnWrap').getPaddingInfo();
  27097. btnInnerEl = ownerContext.getEl('btnInnerEl');
  27098. innerFrameSize = btnInnerEl.getPaddingInfo();
  27099. Ext.apply(me, {
  27100. adjWidth : btnWrapPadding.width + frameSize.width + padding.width,
  27101. adjHeight : btnWrapPadding.height + frameSize.height + padding.height,
  27102. btnFrameWidth : innerFrameSize.width,
  27103. btnFrameHeight : innerFrameSize.height,
  27104. btnFrameTop : innerFrameSize.top,
  27105. minTextHeight : parseInt(btnInnerEl.getStyle('line-height'), 10)
  27106. });
  27107. }
  27108. me.callParent(arguments);
  27109. },
  27110. finishedLayout: function(){
  27111. var owner = this.owner;
  27112. this.callParent(arguments);
  27113. if (Ext.isWebKit) {
  27114. owner.el.dom.offsetWidth;
  27115. }
  27116. }
  27117. });
  27118. Ext.define('Ext.menu.Manager', {
  27119. singleton: true,
  27120. requires: [
  27121. 'Ext.util.MixedCollection',
  27122. 'Ext.util.KeyMap'
  27123. ],
  27124. alternateClassName: 'Ext.menu.MenuMgr',
  27125. uses: ['Ext.menu.Menu'],
  27126. menus: {},
  27127. groups: {},
  27128. attached: false,
  27129. lastShow: new Date(),
  27130. init: function() {
  27131. var me = this;
  27132. me.active = new Ext.util.MixedCollection();
  27133. Ext.getDoc().addKeyListener(27, function() {
  27134. if (me.active.length > 0) {
  27135. me.hideAll();
  27136. }
  27137. }, me);
  27138. },
  27139. hideAll: function() {
  27140. var active = this.active,
  27141. clone, menus, m, mLen;
  27142. if (active && active.length > 0) {
  27143. clone = active.clone();
  27144. menus = clone.items;
  27145. mLen = menus.length;
  27146. for (m = 0; m < mLen; m++) {
  27147. menus[m].hide();
  27148. }
  27149. return true;
  27150. }
  27151. return false;
  27152. },
  27153. onHide: function(m) {
  27154. var me = this,
  27155. active = me.active;
  27156. active.remove(m);
  27157. if (active.length < 1) {
  27158. Ext.getDoc().un('mousedown', me.onMouseDown, me);
  27159. me.attached = false;
  27160. }
  27161. },
  27162. onShow: function(m) {
  27163. var me = this,
  27164. active = me.active,
  27165. last = active.last(),
  27166. attached = me.attached,
  27167. menuEl = m.getEl(),
  27168. zIndex;
  27169. me.lastShow = new Date();
  27170. active.add(m);
  27171. if (!attached) {
  27172. Ext.getDoc().on('mousedown', me.onMouseDown, me, {
  27173. buffer: Ext.isIE ? 10 : undefined
  27174. });
  27175. me.attached = true;
  27176. }
  27177. m.toFront();
  27178. },
  27179. onBeforeHide: function(m) {
  27180. if (m.activeChild) {
  27181. m.activeChild.hide();
  27182. }
  27183. if (m.autoHideTimer) {
  27184. clearTimeout(m.autoHideTimer);
  27185. delete m.autoHideTimer;
  27186. }
  27187. },
  27188. onBeforeShow: function(m) {
  27189. var active = this.active,
  27190. parentMenu = m.parentMenu;
  27191. active.remove(m);
  27192. if (!parentMenu && !m.allowOtherMenus) {
  27193. this.hideAll();
  27194. }
  27195. else if (parentMenu && parentMenu.activeChild && m != parentMenu.activeChild) {
  27196. parentMenu.activeChild.hide();
  27197. }
  27198. },
  27199. onMouseDown: function(e) {
  27200. var me = this,
  27201. active = me.active,
  27202. lastShow = me.lastShow;
  27203. if (Ext.Date.getElapsed(lastShow) > 50 && active.length > 0 && !e.getTarget('.' + Ext.baseCSSPrefix + 'menu')) {
  27204. me.hideAll();
  27205. }
  27206. },
  27207. register: function(menu) {
  27208. var me = this;
  27209. if (!me.active) {
  27210. me.init();
  27211. }
  27212. if (menu.floating) {
  27213. me.menus[menu.id] = menu;
  27214. menu.on({
  27215. beforehide: me.onBeforeHide,
  27216. hide: me.onHide,
  27217. beforeshow: me.onBeforeShow,
  27218. show: me.onShow,
  27219. scope: me
  27220. });
  27221. }
  27222. },
  27223. get: function(menu) {
  27224. var menus = this.menus;
  27225. if (typeof menu == 'string') {
  27226. if (!menus) {
  27227. return null;
  27228. }
  27229. return menus[menu];
  27230. } else if (menu.isMenu) {
  27231. return menu;
  27232. } else if (Ext.isArray(menu)) {
  27233. return new Ext.menu.Menu({items:menu});
  27234. } else {
  27235. return Ext.ComponentManager.create(menu, 'menu');
  27236. }
  27237. },
  27238. unregister: function(menu) {
  27239. var me = this,
  27240. menus = me.menus,
  27241. active = me.active;
  27242. delete menus[menu.id];
  27243. active.remove(menu);
  27244. menu.un({
  27245. beforehide: me.onBeforeHide,
  27246. hide: me.onHide,
  27247. beforeshow: me.onBeforeShow,
  27248. show: me.onShow,
  27249. scope: me
  27250. });
  27251. },
  27252. registerCheckable: function(menuItem) {
  27253. var groups = this.groups,
  27254. groupId = menuItem.group;
  27255. if (groupId) {
  27256. if (!groups[groupId]) {
  27257. groups[groupId] = [];
  27258. }
  27259. groups[groupId].push(menuItem);
  27260. }
  27261. },
  27262. unregisterCheckable: function(menuItem) {
  27263. var groups = this.groups,
  27264. groupId = menuItem.group;
  27265. if (groupId) {
  27266. Ext.Array.remove(groups[groupId], menuItem);
  27267. }
  27268. },
  27269. onCheckChange: function(menuItem, state) {
  27270. var groups = this.groups,
  27271. groupId = menuItem.group,
  27272. i = 0,
  27273. group, ln, curr;
  27274. if (groupId && state) {
  27275. group = groups[groupId];
  27276. ln = group.length;
  27277. for (; i < ln; i++) {
  27278. curr = group[i];
  27279. if (curr != menuItem) {
  27280. curr.setChecked(false);
  27281. }
  27282. }
  27283. }
  27284. }
  27285. });
  27286. Ext.define('Ext.util.ClickRepeater', {
  27287. extend: 'Ext.util.Observable',
  27288. constructor : function(el, config){
  27289. var me = this;
  27290. me.el = Ext.get(el);
  27291. me.el.unselectable();
  27292. Ext.apply(me, config);
  27293. me.callParent();
  27294. me.addEvents(
  27295. "mousedown",
  27296. "click",
  27297. "mouseup"
  27298. );
  27299. if(!me.disabled){
  27300. me.disabled = true;
  27301. me.enable();
  27302. }
  27303. if(me.handler){
  27304. me.on("click", me.handler, me.scope || me);
  27305. }
  27306. },
  27307. interval : 20,
  27308. delay: 250,
  27309. preventDefault : true,
  27310. stopDefault : false,
  27311. timer : 0,
  27312. enable: function(){
  27313. if(this.disabled){
  27314. this.el.on('mousedown', this.handleMouseDown, this);
  27315. if (Ext.isIE && !(Ext.isStrict && Ext.isIE9)){
  27316. this.el.on('dblclick', this.handleDblClick, this);
  27317. }
  27318. if(this.preventDefault || this.stopDefault){
  27319. this.el.on('click', this.eventOptions, this);
  27320. }
  27321. }
  27322. this.disabled = false;
  27323. },
  27324. disable: function( force){
  27325. if(force || !this.disabled){
  27326. clearTimeout(this.timer);
  27327. if(this.pressedCls){
  27328. this.el.removeCls(this.pressedCls);
  27329. }
  27330. Ext.getDoc().un('mouseup', this.handleMouseUp, this);
  27331. this.el.removeAllListeners();
  27332. }
  27333. this.disabled = true;
  27334. },
  27335. setDisabled: function(disabled){
  27336. this[disabled ? 'disable' : 'enable']();
  27337. },
  27338. eventOptions: function(e){
  27339. if(this.preventDefault){
  27340. e.preventDefault();
  27341. }
  27342. if(this.stopDefault){
  27343. e.stopEvent();
  27344. }
  27345. },
  27346. destroy : function() {
  27347. this.disable(true);
  27348. Ext.destroy(this.el);
  27349. this.clearListeners();
  27350. },
  27351. handleDblClick : function(e){
  27352. clearTimeout(this.timer);
  27353. this.el.blur();
  27354. this.fireEvent("mousedown", this, e);
  27355. this.fireEvent("click", this, e);
  27356. },
  27357. handleMouseDown : function(e){
  27358. clearTimeout(this.timer);
  27359. this.el.blur();
  27360. if(this.pressedCls){
  27361. this.el.addCls(this.pressedCls);
  27362. }
  27363. this.mousedownTime = new Date();
  27364. Ext.getDoc().on("mouseup", this.handleMouseUp, this);
  27365. this.el.on("mouseout", this.handleMouseOut, this);
  27366. this.fireEvent("mousedown", this, e);
  27367. this.fireEvent("click", this, e);
  27368. if (this.accelerate) {
  27369. this.delay = 400;
  27370. }
  27371. e = new Ext.EventObjectImpl(e);
  27372. this.timer = Ext.defer(this.click, this.delay || this.interval, this, [e]);
  27373. },
  27374. click : function(e){
  27375. this.fireEvent("click", this, e);
  27376. this.timer = Ext.defer(this.click, this.accelerate ?
  27377. this.easeOutExpo(Ext.Date.getElapsed(this.mousedownTime),
  27378. 400,
  27379. -390,
  27380. 12000) :
  27381. this.interval, this, [e]);
  27382. },
  27383. easeOutExpo : function (t, b, c, d) {
  27384. return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
  27385. },
  27386. handleMouseOut : function(){
  27387. clearTimeout(this.timer);
  27388. if(this.pressedCls){
  27389. this.el.removeCls(this.pressedCls);
  27390. }
  27391. this.el.on("mouseover", this.handleMouseReturn, this);
  27392. },
  27393. handleMouseReturn : function(){
  27394. this.el.un("mouseover", this.handleMouseReturn, this);
  27395. if(this.pressedCls){
  27396. this.el.addCls(this.pressedCls);
  27397. }
  27398. this.click();
  27399. },
  27400. handleMouseUp : function(e){
  27401. clearTimeout(this.timer);
  27402. this.el.un("mouseover", this.handleMouseReturn, this);
  27403. this.el.un("mouseout", this.handleMouseOut, this);
  27404. Ext.getDoc().un("mouseup", this.handleMouseUp, this);
  27405. if(this.pressedCls){
  27406. this.el.removeCls(this.pressedCls);
  27407. }
  27408. this.fireEvent("mouseup", this, e);
  27409. }
  27410. });
  27411. Ext.define('Ext.util.TextMetrics', {
  27412. statics: {
  27413. shared: null,
  27414. measure: function(el, text, fixedWidth){
  27415. var me = this,
  27416. shared = me.shared;
  27417. if(!shared){
  27418. shared = me.shared = new me(el, fixedWidth);
  27419. }
  27420. shared.bind(el);
  27421. shared.setFixedWidth(fixedWidth || 'auto');
  27422. return shared.getSize(text);
  27423. },
  27424. destroy: function(){
  27425. var me = this;
  27426. Ext.destroy(me.shared);
  27427. me.shared = null;
  27428. }
  27429. },
  27430. constructor: function(bindTo, fixedWidth){
  27431. var measure = this.measure = Ext.getBody().createChild({
  27432. cls: Ext.baseCSSPrefix + 'textmetrics'
  27433. });
  27434. this.el = Ext.get(bindTo);
  27435. measure.position('absolute');
  27436. measure.setLeftTop(-1000, -1000);
  27437. measure.hide();
  27438. if (fixedWidth) {
  27439. measure.setWidth(fixedWidth);
  27440. }
  27441. },
  27442. getSize: function(text){
  27443. var measure = this.measure,
  27444. size;
  27445. measure.update(text);
  27446. size = measure.getSize();
  27447. measure.update('');
  27448. return size;
  27449. },
  27450. bind: function(el){
  27451. var me = this;
  27452. me.el = Ext.get(el);
  27453. me.measure.setStyle(
  27454. me.el.getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')
  27455. );
  27456. },
  27457. setFixedWidth : function(width){
  27458. this.measure.setWidth(width);
  27459. },
  27460. getWidth : function(text){
  27461. this.measure.dom.style.width = 'auto';
  27462. return this.getSize(text).width;
  27463. },
  27464. getHeight : function(text){
  27465. return this.getSize(text).height;
  27466. },
  27467. destroy: function(){
  27468. var me = this;
  27469. me.measure.remove();
  27470. delete me.el;
  27471. delete me.measure;
  27472. }
  27473. }, function(){
  27474. Ext.Element.addMethods({
  27475. getTextWidth : function(text, min, max){
  27476. return Ext.Number.constrain(Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width, min || 0, max || 1000000);
  27477. }
  27478. });
  27479. });
  27480. Ext.define('Ext.button.Button', {
  27481. alias: 'widget.button',
  27482. extend: 'Ext.Component',
  27483. requires: [
  27484. 'Ext.menu.Manager',
  27485. 'Ext.util.ClickRepeater',
  27486. 'Ext.layout.component.Button',
  27487. 'Ext.util.TextMetrics',
  27488. 'Ext.util.KeyMap'
  27489. ],
  27490. alternateClassName: 'Ext.Button',
  27491. isButton: true,
  27492. componentLayout: 'button',
  27493. hidden: false,
  27494. disabled: false,
  27495. pressed: false,
  27496. enableToggle: false,
  27497. menuAlign: 'tl-bl?',
  27498. textAlign: 'center',
  27499. type: 'button',
  27500. clickEvent: 'click',
  27501. preventDefault: true,
  27502. handleMouseEvents: true,
  27503. tooltipType: 'qtip',
  27504. baseCls: Ext.baseCSSPrefix + 'btn',
  27505. pressedCls: 'pressed',
  27506. overCls: 'over',
  27507. focusCls: 'focus',
  27508. menuActiveCls: 'menu-active',
  27509. hrefTarget: '_blank',
  27510. border: true,
  27511. childEls: [
  27512. 'btnEl', 'btnWrap', 'btnInnerEl', 'btnIconEl'
  27513. ],
  27514. renderTpl: [
  27515. '<em id="{id}-btnWrap"<tpl if="splitCls"> class="{splitCls}"</tpl>>',
  27516. '<tpl if="href">',
  27517. '<a id="{id}-btnEl" href="{href}" class="{btnCls}" target="{hrefTarget}"',
  27518. '<tpl if="tabIndex"> tabIndex="{tabIndex}"</tpl>',
  27519. '<tpl if="disabled"> disabled="disabled"</tpl>',
  27520. ' role="link">',
  27521. '<span id="{id}-btnInnerEl" class="{baseCls}-inner">',
  27522. '{text}',
  27523. '</span>',
  27524. '<span id="{id}-btnIconEl" class="{baseCls}-icon {iconCls}"<tpl if="iconUrl"> style="background-image:url({iconUrl})"</tpl>></span>',
  27525. '</a>',
  27526. '<tpl else>',
  27527. '<button id="{id}-btnEl" type="{type}" class="{btnCls}" hidefocus="true"',
  27528. '<tpl if="tabIndex"> tabIndex="{tabIndex}"</tpl>',
  27529. '<tpl if="disabled"> disabled="disabled"</tpl>',
  27530. ' role="button" autocomplete="off">',
  27531. '<span id="{id}-btnInnerEl" class="{baseCls}-inner" style="{innerSpanStyle}">',
  27532. '{text}',
  27533. '</span>',
  27534. '<span id="{id}-btnIconEl" class="{baseCls}-icon {iconCls}"<tpl if="iconUrl"> style="background-image:url({iconUrl})"</tpl>></span>',
  27535. '</button>',
  27536. '</tpl>',
  27537. '</em>',
  27538. '<tpl if="closable">',
  27539. '<a id="{id}-closeEl" href="#" class="{baseCls}-close-btn" title="{closeText}"></a>',
  27540. '</tpl>'
  27541. ],
  27542. scale: 'small',
  27543. allowedScales: ['small', 'medium', 'large'],
  27544. iconAlign: 'left',
  27545. arrowAlign: 'right',
  27546. arrowCls: 'arrow',
  27547. maskOnDisable: false,
  27548. persistentPadding: undefined,
  27549. shrinkWrap: 3,
  27550. frame: true,
  27551. initComponent: function() {
  27552. var me = this;
  27553. me.callParent(arguments);
  27554. me.addEvents(
  27555. 'click',
  27556. 'toggle',
  27557. 'mouseover',
  27558. 'mouseout',
  27559. 'menushow',
  27560. 'menuhide',
  27561. 'menutriggerover',
  27562. 'menutriggerout'
  27563. );
  27564. if (me.menu) {
  27565. me.split = true;
  27566. me.menu = Ext.menu.Manager.get(me.menu);
  27567. me.menu.ownerButton = me;
  27568. }
  27569. if (me.url) {
  27570. me.href = me.url;
  27571. }
  27572. if (me.href && !me.hasOwnProperty('preventDefault')) {
  27573. me.preventDefault = false;
  27574. }
  27575. if (Ext.isString(me.toggleGroup) && me.toggleGroup !== '') {
  27576. me.enableToggle = true;
  27577. }
  27578. if (me.html && !me.text) {
  27579. me.text = me.html;
  27580. delete me.html;
  27581. }
  27582. },
  27583. getActionEl: function() {
  27584. return this.btnEl;
  27585. },
  27586. getFocusEl: function() {
  27587. return this.useElForFocus ? this.el : this.btnEl;
  27588. },
  27589. onFocus: function(e) {
  27590. var me = this;
  27591. me.useElForFocus = true;
  27592. me.callParent(arguments);
  27593. me.useElForFocus = false;
  27594. },
  27595. onBlur : function(e) {
  27596. this.useElForFocus = true;
  27597. this.callParent(arguments);
  27598. this.useElForFocus = false;
  27599. },
  27600. onDisable: function(){
  27601. this.useElForFocus = true;
  27602. this.callParent(arguments);
  27603. this.useElForFocus = false;
  27604. },
  27605. setComponentCls: function() {
  27606. var me = this,
  27607. cls = me.getComponentCls();
  27608. if (!Ext.isEmpty(me.oldCls)) {
  27609. me.removeClsWithUI(me.oldCls);
  27610. me.removeClsWithUI(me.pressedCls);
  27611. }
  27612. me.oldCls = cls;
  27613. me.addClsWithUI(cls);
  27614. },
  27615. getComponentCls: function() {
  27616. var me = this,
  27617. cls = [];
  27618. if (me.iconCls || me.icon) {
  27619. if (me.text) {
  27620. cls.push('icon-text-' + me.iconAlign);
  27621. } else {
  27622. cls.push('icon');
  27623. }
  27624. } else if (me.text) {
  27625. cls.push('noicon');
  27626. }
  27627. if (me.pressed) {
  27628. cls.push(me.pressedCls);
  27629. }
  27630. return cls;
  27631. },
  27632. beforeRender: function () {
  27633. var me = this;
  27634. me.callParent();
  27635. me.oldCls = me.getComponentCls();
  27636. me.addClsWithUI(me.oldCls);
  27637. Ext.applyIf(me.renderData, me.getTemplateArgs());
  27638. if (me.scale) {
  27639. me.setScale(me.scale);
  27640. }
  27641. },
  27642. onRender: function() {
  27643. var me = this,
  27644. addOnclick,
  27645. btn,
  27646. btnListeners;
  27647. me.doc = Ext.getDoc();
  27648. me.callParent(arguments);
  27649. if (me.split && me.arrowTooltip) {
  27650. me.arrowEl.dom.setAttribute(me.getTipAttr(), me.arrowTooltip);
  27651. }
  27652. btn = me.el;
  27653. if (me.tooltip) {
  27654. me.setTooltip(me.tooltip, true);
  27655. }
  27656. if (me.handleMouseEvents) {
  27657. btnListeners = {
  27658. scope: me,
  27659. mouseover: me.onMouseOver,
  27660. mouseout: me.onMouseOut,
  27661. mousedown: me.onMouseDown
  27662. };
  27663. if (me.split) {
  27664. btnListeners.mousemove = me.onMouseMove;
  27665. }
  27666. } else {
  27667. btnListeners = {
  27668. scope: me
  27669. };
  27670. }
  27671. if (me.menu) {
  27672. me.mon(me.menu, {
  27673. scope: me,
  27674. show: me.onMenuShow,
  27675. hide: me.onMenuHide
  27676. });
  27677. me.keyMap = new Ext.util.KeyMap({
  27678. target: me.el,
  27679. key: Ext.EventObject.DOWN,
  27680. handler: me.onDownKey,
  27681. scope: me
  27682. });
  27683. }
  27684. if (me.repeat) {
  27685. me.mon(new Ext.util.ClickRepeater(btn, Ext.isObject(me.repeat) ? me.repeat: {}), 'click', me.onRepeatClick, me);
  27686. } else {
  27687. if (btnListeners[me.clickEvent]) {
  27688. addOnclick = true;
  27689. } else {
  27690. btnListeners[me.clickEvent] = me.onClick;
  27691. }
  27692. }
  27693. me.mon(btn, btnListeners);
  27694. if (addOnclick) {
  27695. me.mon(btn, me.clickEvent, me.onClick, me);
  27696. }
  27697. Ext.ButtonToggleManager.register(me);
  27698. },
  27699. getTemplateArgs: function() {
  27700. var me = this,
  27701. persistentPadding = me.getPersistentPadding(),
  27702. innerSpanStyle = '';
  27703. if (Math.max.apply(Math, persistentPadding) > 0) {
  27704. innerSpanStyle = 'margin:' + Ext.Array.map(persistentPadding, function(pad) {
  27705. return -pad + 'px';
  27706. }).join(' ');
  27707. }
  27708. return {
  27709. href : me.getHref(),
  27710. disabled : me.disabled,
  27711. hrefTarget: me.hrefTarget,
  27712. type : me.type,
  27713. btnCls : me.getBtnCls(),
  27714. splitCls : me.getSplitCls(),
  27715. iconUrl : me.icon,
  27716. iconCls : me.iconCls,
  27717. text : me.text || '&#160;',
  27718. tabIndex : me.tabIndex,
  27719. innerSpanStyle: innerSpanStyle
  27720. };
  27721. },
  27722. getHref: function() {
  27723. var me = this,
  27724. params = Ext.apply({}, me.baseParams);
  27725. params = Ext.apply(params, me.params);
  27726. return me.href ? Ext.urlAppend(me.href, Ext.Object.toQueryString(params)) : false;
  27727. },
  27728. setParams: function(params) {
  27729. this.params = params;
  27730. this.btnEl.dom.href = this.getHref();
  27731. },
  27732. getSplitCls: function() {
  27733. var me = this;
  27734. return me.split ? (me.baseCls + '-' + me.arrowCls) + ' ' + (me.baseCls + '-' + me.arrowCls + '-' + me.arrowAlign) : '';
  27735. },
  27736. getBtnCls: function() {
  27737. return this.textAlign ? this.baseCls + '-' + this.textAlign : '';
  27738. },
  27739. setIconCls: function(cls) {
  27740. var me = this,
  27741. btnIconEl = me.btnIconEl,
  27742. oldCls = me.iconCls;
  27743. me.iconCls = cls;
  27744. if (btnIconEl) {
  27745. btnIconEl.removeCls(oldCls);
  27746. btnIconEl.addCls(cls || '');
  27747. me.setComponentCls();
  27748. if (me.didIconStateChange(oldCls, cls)) {
  27749. me.updateLayout();
  27750. }
  27751. }
  27752. return me;
  27753. },
  27754. setTooltip: function(tooltip, initial) {
  27755. var me = this;
  27756. if (me.rendered) {
  27757. if (!initial) {
  27758. me.clearTip();
  27759. }
  27760. if (Ext.isObject(tooltip)) {
  27761. Ext.tip.QuickTipManager.register(Ext.apply({
  27762. target: me.btnEl.id
  27763. },
  27764. tooltip));
  27765. me.tooltip = tooltip;
  27766. } else {
  27767. me.btnEl.dom.setAttribute(me.getTipAttr(), tooltip);
  27768. }
  27769. } else {
  27770. me.tooltip = tooltip;
  27771. }
  27772. return me;
  27773. },
  27774. setTextAlign: function(align) {
  27775. var me = this,
  27776. btnEl = me.btnEl;
  27777. if (btnEl) {
  27778. btnEl.removeCls(me.baseCls + '-' + me.textAlign);
  27779. btnEl.addCls(me.baseCls + '-' + align);
  27780. }
  27781. me.textAlign = align;
  27782. return me;
  27783. },
  27784. getTipAttr: function(){
  27785. return this.tooltipType == 'qtip' ? 'data-qtip' : 'title';
  27786. },
  27787. getRefItems: function(deep){
  27788. var menu = this.menu,
  27789. items;
  27790. if (menu) {
  27791. items = menu.getRefItems(deep);
  27792. items.unshift(menu);
  27793. }
  27794. return items || [];
  27795. },
  27796. clearTip: function() {
  27797. if (Ext.isObject(this.tooltip)) {
  27798. Ext.tip.QuickTipManager.unregister(this.btnEl);
  27799. }
  27800. },
  27801. beforeDestroy: function() {
  27802. var me = this;
  27803. if (me.rendered) {
  27804. me.clearTip();
  27805. }
  27806. if (me.menu && me.destroyMenu !== false) {
  27807. Ext.destroy(me.menu);
  27808. }
  27809. Ext.destroy(me.btnInnerEl, me.repeater);
  27810. me.callParent();
  27811. },
  27812. onDestroy: function() {
  27813. var me = this;
  27814. if (me.rendered) {
  27815. me.doc.un('mouseover', me.monitorMouseOver, me);
  27816. me.doc.un('mouseup', me.onMouseUp, me);
  27817. delete me.doc;
  27818. Ext.ButtonToggleManager.unregister(me);
  27819. Ext.destroy(me.keyMap);
  27820. delete me.keyMap;
  27821. }
  27822. me.callParent();
  27823. },
  27824. setHandler: function(handler, scope) {
  27825. this.handler = handler;
  27826. this.scope = scope;
  27827. return this;
  27828. },
  27829. setText: function(text) {
  27830. var me = this;
  27831. me.text = text;
  27832. if (me.rendered) {
  27833. me.btnInnerEl.update(text || '&#160;');
  27834. me.setComponentCls();
  27835. if (Ext.isStrict && Ext.isIE8) {
  27836. me.el.repaint();
  27837. }
  27838. me.updateLayout();
  27839. }
  27840. return me;
  27841. },
  27842. setIcon: function(icon) {
  27843. var me = this,
  27844. btnIconEl = me.btnIconEl,
  27845. oldIcon = me.icon;
  27846. me.icon = icon;
  27847. if (btnIconEl) {
  27848. btnIconEl.setStyle('background-image', icon ? 'url(' + icon + ')': '');
  27849. me.setComponentCls();
  27850. if (me.didIconStateChange(oldIcon, icon)) {
  27851. me.updateLayout();
  27852. }
  27853. }
  27854. return me;
  27855. },
  27856. didIconStateChange: function(old, current) {
  27857. var currentEmpty = Ext.isEmpty(current);
  27858. return Ext.isEmpty(old) ? !currentEmpty : currentEmpty;
  27859. },
  27860. getText: function() {
  27861. return this.text;
  27862. },
  27863. toggle: function(state, suppressEvent) {
  27864. var me = this;
  27865. state = state === undefined ? !me.pressed: !!state;
  27866. if (state !== me.pressed) {
  27867. if (me.rendered) {
  27868. me[state ? 'addClsWithUI': 'removeClsWithUI'](me.pressedCls);
  27869. }
  27870. me.pressed = state;
  27871. if (!suppressEvent) {
  27872. me.fireEvent('toggle', me, state);
  27873. Ext.callback(me.toggleHandler, me.scope || me, [me, state]);
  27874. }
  27875. }
  27876. return me;
  27877. },
  27878. maybeShowMenu: function(){
  27879. var me = this;
  27880. if (me.menu && !me.hasVisibleMenu() && !me.ignoreNextClick) {
  27881. me.showMenu();
  27882. }
  27883. },
  27884. showMenu: function() {
  27885. var me = this;
  27886. if (me.rendered && me.menu) {
  27887. if (me.tooltip && me.getTipAttr() != 'title') {
  27888. Ext.tip.QuickTipManager.getQuickTip().cancelShow(me.btnEl);
  27889. }
  27890. if (me.menu.isVisible()) {
  27891. me.menu.hide();
  27892. }
  27893. me.menu.showBy(me.el, me.menuAlign, ((!Ext.isStrict && Ext.isIE) || Ext.isIE6) ? [-2, -2] : undefined);
  27894. }
  27895. return me;
  27896. },
  27897. hideMenu: function() {
  27898. if (this.hasVisibleMenu()) {
  27899. this.menu.hide();
  27900. }
  27901. return this;
  27902. },
  27903. hasVisibleMenu: function() {
  27904. var menu = this.menu;
  27905. return menu && menu.rendered && menu.isVisible();
  27906. },
  27907. onRepeatClick: function(repeat, e) {
  27908. this.onClick(e);
  27909. },
  27910. onClick: function(e) {
  27911. var me = this;
  27912. if (me.preventDefault || (me.disabled && me.getHref()) && e) {
  27913. e.preventDefault();
  27914. }
  27915. if (e.button !== 0) {
  27916. return;
  27917. }
  27918. if (!me.disabled) {
  27919. me.doToggle();
  27920. me.maybeShowMenu();
  27921. me.fireHandler(e);
  27922. }
  27923. },
  27924. fireHandler: function(e){
  27925. var me = this,
  27926. handler = me.handler;
  27927. if (me.fireEvent('click', me, e) !== false) {
  27928. if (handler) {
  27929. handler.call(me.scope || me, me, e);
  27930. }
  27931. me.blur();
  27932. }
  27933. },
  27934. doToggle: function(){
  27935. var me = this;
  27936. if (me.enableToggle && (me.allowDepress !== false || !me.pressed)) {
  27937. me.toggle();
  27938. }
  27939. },
  27940. onMouseOver: function(e) {
  27941. var me = this;
  27942. if (!me.disabled && !e.within(me.el, true, true)) {
  27943. me.onMouseEnter(e);
  27944. }
  27945. },
  27946. onMouseOut: function(e) {
  27947. var me = this;
  27948. if (!e.within(me.el, true, true)) {
  27949. if (me.overMenuTrigger) {
  27950. me.onMenuTriggerOut(e);
  27951. }
  27952. me.onMouseLeave(e);
  27953. }
  27954. },
  27955. onMouseMove: function(e) {
  27956. var me = this,
  27957. el = me.el,
  27958. over = me.overMenuTrigger,
  27959. overlap, btnSize;
  27960. if (me.split) {
  27961. if (me.arrowAlign === 'right') {
  27962. overlap = e.getX() - el.getX();
  27963. btnSize = el.getWidth();
  27964. } else {
  27965. overlap = e.getY() - el.getY();
  27966. btnSize = el.getHeight();
  27967. }
  27968. if (overlap > (btnSize - me.getTriggerSize())) {
  27969. if (!over) {
  27970. me.onMenuTriggerOver(e);
  27971. }
  27972. } else {
  27973. if (over) {
  27974. me.onMenuTriggerOut(e);
  27975. }
  27976. }
  27977. }
  27978. },
  27979. getTriggerSize: function() {
  27980. var me = this,
  27981. size = me.triggerSize,
  27982. side, sideFirstLetter, undef;
  27983. if (size === undef) {
  27984. side = me.arrowAlign;
  27985. sideFirstLetter = side.charAt(0);
  27986. size = me.triggerSize = me.el.getFrameWidth(sideFirstLetter) + me.btnWrap.getFrameWidth(sideFirstLetter) + me.frameSize[side];
  27987. }
  27988. return size;
  27989. },
  27990. onMouseEnter: function(e) {
  27991. var me = this;
  27992. me.addClsWithUI(me.overCls);
  27993. me.fireEvent('mouseover', me, e);
  27994. },
  27995. onMouseLeave: function(e) {
  27996. var me = this;
  27997. me.removeClsWithUI(me.overCls);
  27998. me.fireEvent('mouseout', me, e);
  27999. },
  28000. onMenuTriggerOver: function(e) {
  28001. var me = this;
  28002. me.overMenuTrigger = true;
  28003. me.fireEvent('menutriggerover', me, me.menu, e);
  28004. },
  28005. onMenuTriggerOut: function(e) {
  28006. var me = this;
  28007. delete me.overMenuTrigger;
  28008. me.fireEvent('menutriggerout', me, me.menu, e);
  28009. },
  28010. enable : function(silent) {
  28011. var me = this;
  28012. me.callParent(arguments);
  28013. if (me.btnEl) {
  28014. me.btnEl.dom.disabled = false;
  28015. }
  28016. me.removeClsWithUI('disabled');
  28017. return me;
  28018. },
  28019. disable : function(silent) {
  28020. var me = this;
  28021. me.callParent(arguments);
  28022. if (me.btnEl) {
  28023. me.btnEl.dom.disabled = true;
  28024. }
  28025. me.addClsWithUI('disabled');
  28026. me.removeClsWithUI(me.overCls);
  28027. if (me.btnInnerEl && (Ext.isIE6 || Ext.isIE7)) {
  28028. me.btnInnerEl.repaint();
  28029. }
  28030. return me;
  28031. },
  28032. setScale: function(scale) {
  28033. var me = this,
  28034. ui = me.ui.replace('-' + me.scale, '');
  28035. if (!Ext.Array.contains(me.allowedScales, scale)) {
  28036. throw('#setScale: scale must be an allowed scale (' + me.allowedScales.join(', ') + ')');
  28037. }
  28038. me.scale = scale;
  28039. me.setUI(ui);
  28040. },
  28041. setUI: function(ui) {
  28042. var me = this;
  28043. if (me.scale && !ui.match(me.scale)) {
  28044. ui = ui + '-' + me.scale;
  28045. }
  28046. me.callParent([ui]);
  28047. },
  28048. onMouseDown: function(e) {
  28049. var me = this;
  28050. if (!me.disabled && e.button === 0) {
  28051. me.addClsWithUI(me.pressedCls);
  28052. me.doc.on('mouseup', me.onMouseUp, me);
  28053. }
  28054. },
  28055. onMouseUp: function(e) {
  28056. var me = this;
  28057. if (e.button === 0) {
  28058. if (!me.pressed) {
  28059. me.removeClsWithUI(me.pressedCls);
  28060. }
  28061. me.doc.un('mouseup', me.onMouseUp, me);
  28062. }
  28063. },
  28064. onMenuShow: function(e) {
  28065. var me = this;
  28066. me.ignoreNextClick = 0;
  28067. me.addClsWithUI(me.menuActiveCls);
  28068. me.fireEvent('menushow', me, me.menu);
  28069. },
  28070. onMenuHide: function(e) {
  28071. var me = this;
  28072. me.removeClsWithUI(me.menuActiveCls);
  28073. me.ignoreNextClick = Ext.defer(me.restoreClick, 250, me);
  28074. me.fireEvent('menuhide', me, me.menu);
  28075. },
  28076. restoreClick: function() {
  28077. this.ignoreNextClick = 0;
  28078. },
  28079. onDownKey: function() {
  28080. var me = this;
  28081. if (!me.disabled) {
  28082. if (me.menu) {
  28083. me.showMenu();
  28084. }
  28085. }
  28086. },
  28087. getPersistentPadding: function() {
  28088. var me = this,
  28089. reset = Ext.scopeResetCSS,
  28090. padding = me.persistentPadding,
  28091. btn, leftTop, btnEl, btnInnerEl, wrap;
  28092. if (!padding) {
  28093. padding = me.self.prototype.persistentPadding = [0, 0, 0, 0];
  28094. if (!Ext.isIE) {
  28095. btn = new Ext.button.Button({
  28096. text: 'test',
  28097. style: 'position:absolute;top:-999px;'
  28098. });
  28099. btn.el = Ext.DomHelper.append(Ext.resetElement, btn.getRenderTree(), true);
  28100. btn.applyChildEls(btn.el);
  28101. btnEl = btn.btnEl;
  28102. btnInnerEl = btn.btnInnerEl;
  28103. btnEl.setSize(null, null);
  28104. leftTop = btnInnerEl.getOffsetsTo(btnEl);
  28105. padding[0] = leftTop[1];
  28106. padding[1] = btnEl.getWidth() - btnInnerEl.getWidth() - leftTop[0];
  28107. padding[2] = btnEl.getHeight() - btnInnerEl.getHeight() - leftTop[1];
  28108. padding[3] = leftTop[0];
  28109. btn.destroy();
  28110. btn.el.remove();
  28111. }
  28112. }
  28113. return padding;
  28114. }
  28115. }, function() {
  28116. var groups = {},
  28117. toggleGroup = function(btn, state) {
  28118. if (state) {
  28119. var g = groups[btn.toggleGroup],
  28120. length = g.length,
  28121. i;
  28122. for (i = 0; i < length; i++) {
  28123. if (g[i] !== btn) {
  28124. g[i].toggle(false);
  28125. }
  28126. }
  28127. }
  28128. };
  28129. Ext.ButtonToggleManager = {
  28130. register: function(btn) {
  28131. if (!btn.toggleGroup) {
  28132. return;
  28133. }
  28134. var group = groups[btn.toggleGroup];
  28135. if (!group) {
  28136. group = groups[btn.toggleGroup] = [];
  28137. }
  28138. group.push(btn);
  28139. btn.on('toggle', toggleGroup);
  28140. },
  28141. unregister: function(btn) {
  28142. if (!btn.toggleGroup) {
  28143. return;
  28144. }
  28145. var group = groups[btn.toggleGroup];
  28146. if (group) {
  28147. Ext.Array.remove(group, btn);
  28148. btn.un('toggle', toggleGroup);
  28149. }
  28150. },
  28151. getPressed: function(group) {
  28152. var g = groups[group],
  28153. i = 0,
  28154. len;
  28155. if (g) {
  28156. for (len = g.length; i < len; i++) {
  28157. if (g[i].pressed === true) {
  28158. return g[i];
  28159. }
  28160. }
  28161. }
  28162. return null;
  28163. }
  28164. };
  28165. });
  28166. Ext.define('Ext.layout.container.boxOverflow.Menu', {
  28167. extend: 'Ext.layout.container.boxOverflow.None',
  28168. requires: ['Ext.toolbar.Separator', 'Ext.button.Button'],
  28169. alternateClassName: 'Ext.layout.boxOverflow.Menu',
  28170. noItemsMenuText : '<div class="' + Ext.baseCSSPrefix + 'toolbar-no-items">(None)</div>',
  28171. constructor: function(layout) {
  28172. var me = this;
  28173. me.callParent(arguments);
  28174. me.triggerButtonCls = me.triggerButtonCls || Ext.baseCSSPrefix + 'box-menu-' + layout.getNames().right;
  28175. me.menuItems = [];
  28176. },
  28177. beginLayout: function (ownerContext) {
  28178. this.callParent(arguments);
  28179. this.clearOverflow(ownerContext);
  28180. },
  28181. beginLayoutCycle: function (ownerContext, firstCycle) {
  28182. this.callParent(arguments);
  28183. if (!firstCycle) {
  28184. this.clearOverflow(ownerContext);
  28185. this.layout.cacheChildItems(ownerContext);
  28186. }
  28187. },
  28188. onRemove: function(comp){
  28189. Ext.Array.remove(this.menuItems, comp);
  28190. },
  28191. getSuffixConfig: function() {
  28192. var me = this,
  28193. layout = me.layout,
  28194. oid = layout.owner.id;
  28195. me.menu = new Ext.menu.Menu({
  28196. listeners: {
  28197. scope: me,
  28198. beforeshow: me.beforeMenuShow
  28199. }
  28200. });
  28201. me.menuTrigger = new Ext.button.Button({
  28202. id : oid + '-menu-trigger',
  28203. cls : Ext.layout.container.Box.prototype.innerCls + ' ' + me.triggerButtonCls,
  28204. hidden : true,
  28205. ownerCt : layout.owner,
  28206. ownerLayout: layout,
  28207. iconCls : Ext.baseCSSPrefix + me.getOwnerType(layout.owner) + '-more-icon',
  28208. ui : layout.owner instanceof Ext.toolbar.Toolbar ? 'default-toolbar' : 'default',
  28209. menu : me.menu,
  28210. getSplitCls: function() { return '';}
  28211. });
  28212. return me.menuTrigger.getRenderTree();
  28213. },
  28214. getOverflowCls: function() {
  28215. return Ext.baseCSSPrefix + this.layout.direction + '-box-overflow-body';
  28216. },
  28217. handleOverflow: function(ownerContext) {
  28218. var me = this,
  28219. layout = me.layout,
  28220. names = layout.getNames(),
  28221. plan = ownerContext.state.boxPlan,
  28222. posArgs = [null, null];
  28223. me.showTrigger(ownerContext);
  28224. posArgs[names.heightIndex] = (plan.maxSize - me.menuTrigger[names.getHeight]()) / 2;
  28225. me.menuTrigger.setPosition.apply(me.menuTrigger, posArgs);
  28226. return {
  28227. reservedSpace: me.menuTrigger[names.getWidth]()
  28228. };
  28229. },
  28230. captureChildElements: function() {
  28231. var menuTrigger = this.menuTrigger;
  28232. if (menuTrigger.rendering) {
  28233. menuTrigger.finishRender();
  28234. }
  28235. },
  28236. _asLayoutRoot: { isRoot: true },
  28237. clearOverflow: function(ownerContext) {
  28238. var me = this,
  28239. items = me.menuItems,
  28240. item,
  28241. i = 0,
  28242. length = items.length,
  28243. owner = me.layout.owner,
  28244. asLayoutRoot = me._asLayoutRoot;
  28245. owner.suspendLayouts();
  28246. me.captureChildElements();
  28247. me.hideTrigger();
  28248. owner.resumeLayouts();
  28249. for (; i < length; i++) {
  28250. item = items[i];
  28251. item.suspendLayouts();
  28252. item.show();
  28253. item.resumeLayouts(asLayoutRoot);
  28254. }
  28255. items.length = 0;
  28256. },
  28257. showTrigger: function(ownerContext) {
  28258. var me = this,
  28259. layout = me.layout,
  28260. owner = layout.owner,
  28261. names = layout.getNames(),
  28262. startProp = names.x,
  28263. sizeProp = names.width,
  28264. plan = ownerContext.state.boxPlan,
  28265. available = plan.targetSize[sizeProp],
  28266. childItems = ownerContext.childItems,
  28267. len = childItems.length,
  28268. menuTrigger = me.menuTrigger,
  28269. childContext,
  28270. comp, i, props;
  28271. menuTrigger.suspendLayouts();
  28272. menuTrigger.show();
  28273. menuTrigger.resumeLayouts(me._asLayoutRoot);
  28274. available -= me.menuTrigger.getWidth();
  28275. owner.suspendLayouts();
  28276. me.menuItems.length = 0;
  28277. for (i = 0; i < len; i++) {
  28278. childContext = childItems[i];
  28279. props = childContext.props;
  28280. if (props[startProp] + props[sizeProp] > available) {
  28281. comp = childContext.target;
  28282. me.menuItems.push(comp);
  28283. comp.hide();
  28284. }
  28285. }
  28286. owner.resumeLayouts();
  28287. },
  28288. hideTrigger: function() {
  28289. var menuTrigger = this.menuTrigger;
  28290. if (menuTrigger) {
  28291. menuTrigger.hide();
  28292. }
  28293. },
  28294. beforeMenuShow: function(menu) {
  28295. var me = this,
  28296. items = me.menuItems,
  28297. i = 0,
  28298. len = items.length,
  28299. item,
  28300. prev,
  28301. needsSep = function(group, prev){
  28302. return group.isXType('buttongroup') && !(prev instanceof Ext.toolbar.Separator);
  28303. };
  28304. menu.suspendLayouts();
  28305. me.clearMenu();
  28306. menu.removeAll();
  28307. for (; i < len; i++) {
  28308. item = items[i];
  28309. if (!i && (item instanceof Ext.toolbar.Separator)) {
  28310. continue;
  28311. }
  28312. if (prev && (needsSep(item, prev) || needsSep(prev, item))) {
  28313. menu.add('-');
  28314. }
  28315. me.addComponentToMenu(menu, item);
  28316. prev = item;
  28317. }
  28318. if (menu.items.length < 1) {
  28319. menu.add(me.noItemsMenuText);
  28320. }
  28321. menu.resumeLayouts();
  28322. },
  28323. createMenuConfig : function(component, hideOnClick) {
  28324. var config = Ext.apply({}, component.initialConfig),
  28325. group = component.toggleGroup;
  28326. Ext.copyTo(config, component, [
  28327. 'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu'
  28328. ]);
  28329. Ext.apply(config, {
  28330. text : component.overflowText || component.text,
  28331. hideOnClick: hideOnClick,
  28332. destroyMenu: false
  28333. });
  28334. if (component.isFormField) {
  28335. config.value = component.getValue();
  28336. if (!config.listeners) {
  28337. config.listeners = {};
  28338. }
  28339. config.listeners.change = function(c, newVal, oldVal) {
  28340. component.setValue(newVal);
  28341. }
  28342. }
  28343. else if (group || component.enableToggle) {
  28344. Ext.apply(config, {
  28345. iconAlign: 'right',
  28346. hideOnClick: false,
  28347. group : group,
  28348. checked: component.pressed,
  28349. listeners: {
  28350. checkchange: function(item, checked) {
  28351. component.toggle(checked);
  28352. }
  28353. }
  28354. });
  28355. }
  28356. delete config.ownerCt;
  28357. delete config.xtype;
  28358. delete config.id;
  28359. return config;
  28360. },
  28361. addComponentToMenu : function(menu, component) {
  28362. var me = this,
  28363. i, items, iLen;
  28364. if (component instanceof Ext.toolbar.Separator) {
  28365. menu.add('-');
  28366. } else if (component.isComponent) {
  28367. if (component.isXType('splitbutton')) {
  28368. menu.add(me.createMenuConfig(component, true));
  28369. } else if (component.isXType('button')) {
  28370. menu.add(me.createMenuConfig(component, !component.menu));
  28371. } else if (component.isXType('buttongroup')) {
  28372. items = component.items.items;
  28373. iLen = items.length;
  28374. for (i = 0; i < iLen; i++) {
  28375. me.addComponentToMenu(menu, items[i]);
  28376. }
  28377. } else {
  28378. menu.add(Ext.create(Ext.getClassName(component), me.createMenuConfig(component)));
  28379. }
  28380. }
  28381. },
  28382. clearMenu : function() {
  28383. var menu = this.menu,
  28384. items, i, iLen, item;
  28385. if (menu && menu.items) {
  28386. items = menu.items.items;
  28387. iLen = items.length;
  28388. for (i = 0; i < iLen; i++) {
  28389. item = items[i];
  28390. if (item.setMenu) {
  28391. item.setMenu(null);
  28392. }
  28393. }
  28394. }
  28395. },
  28396. destroy: function() {
  28397. var trigger = this.menuTrigger;
  28398. if (trigger && !this.layout.owner.items.contains(trigger)) {
  28399. delete trigger.ownerCt;
  28400. }
  28401. Ext.destroy(this.menu, trigger);
  28402. }
  28403. });
  28404. Ext.define('Ext.layout.container.boxOverflow.Scroller', {
  28405. extend: 'Ext.layout.container.boxOverflow.None',
  28406. requires: ['Ext.util.ClickRepeater', 'Ext.Element'],
  28407. alternateClassName: 'Ext.layout.boxOverflow.Scroller',
  28408. mixins: {
  28409. observable: 'Ext.util.Observable'
  28410. },
  28411. animateScroll: false,
  28412. scrollIncrement: 20,
  28413. wheelIncrement: 10,
  28414. scrollRepeatInterval: 60,
  28415. scrollDuration: 400,
  28416. scrollerCls: Ext.baseCSSPrefix + 'box-scroller',
  28417. constructor: function(layout, config) {
  28418. var me = this;
  28419. me.layout = layout;
  28420. Ext.apply(me, config || {});
  28421. me.mixins.observable.constructor.call(me);
  28422. me.addEvents(
  28423. 'scroll'
  28424. );
  28425. me.scrollPosition = 0;
  28426. me.scrollSize = 0;
  28427. },
  28428. getPrefixConfig: function() {
  28429. var me = this;
  28430. me.initCSSClasses();
  28431. return {
  28432. cls: Ext.layout.container.Box.prototype.innerCls + ' ' + me.beforeCtCls,
  28433. cn : {
  28434. id : me.layout.owner.id + '-before-scroller',
  28435. cls: me.scrollerCls + ' ' + me.beforeScrollerCls,
  28436. style: 'display:none'
  28437. }
  28438. };
  28439. },
  28440. getSuffixConfig: function() {
  28441. var me = this;
  28442. return {
  28443. cls: Ext.layout.container.Box.prototype.innerCls + ' ' + me.afterCtCls,
  28444. cn : {
  28445. id : me.layout.owner.id + '-after-scroller',
  28446. cls: me.scrollerCls + ' ' + me.afterScrollerCls,
  28447. style: 'display:none'
  28448. }
  28449. };
  28450. },
  28451. getOverflowCls: function() {
  28452. return Ext.baseCSSPrefix + this.layout.direction + '-box-overflow-body';
  28453. },
  28454. initCSSClasses: function() {
  28455. var me = this,
  28456. prefix = Ext.baseCSSPrefix,
  28457. layout = me.layout,
  28458. names = layout.getNames(),
  28459. leftName = names.left,
  28460. rightName = names.right,
  28461. type = me.getOwnerType(layout.owner);
  28462. me.beforeCtCls = me.beforeCtCls || prefix + 'box-scroller-' + leftName;
  28463. me.afterCtCls = me.afterCtCls || prefix + 'box-scroller-' + rightName;
  28464. me.beforeScrollerCls = me.beforeScrollerCls || prefix + type + '-scroll-' + leftName;
  28465. me.afterScrollerCls = me.afterScrollerCls || prefix + type + '-scroll-' + rightName;
  28466. },
  28467. beginLayout: function (ownerContext) {
  28468. var layout = this.layout,
  28469. names = layout.getNames();
  28470. ownerContext.innerCtScrollPos = layout.innerCt.dom['scroll' + names.leftCap];
  28471. this.callParent(arguments);
  28472. },
  28473. completeLayout: function (ownerContext) {
  28474. this.scrollSize = ownerContext.props['content'+this.layout.getNames().widthCap];
  28475. this.callParent(arguments);
  28476. },
  28477. finishedLayout: function(ownerContext) {
  28478. var me = this,
  28479. layout = me.layout,
  28480. names = layout.getNames(),
  28481. scrollPos = Math.min(me.getMaxScrollPosition(), ownerContext.innerCtScrollPos);
  28482. layout.innerCt.dom['scroll' + names.leftCap] = scrollPos;
  28483. },
  28484. handleOverflow: function(ownerContext) {
  28485. var me = this,
  28486. layout = me.layout,
  28487. names = layout.getNames(),
  28488. methodName = 'get' + names.widthCap;
  28489. me.captureChildElements();
  28490. me.showScrollers();
  28491. return {
  28492. reservedSpace: me.beforeCt[methodName]() + me.afterCt[methodName]()
  28493. };
  28494. },
  28495. captureChildElements: function() {
  28496. var me = this,
  28497. el = me.layout.owner.el,
  28498. before,
  28499. after;
  28500. if (!me.beforeCt) {
  28501. before = me.beforeScroller = el.getById(me.layout.owner.id + '-before-scroller');
  28502. after = me.afterScroller = el.getById(me.layout.owner.id + '-after-scroller');
  28503. me.beforeCt = before.up('');
  28504. me.afterCt = after.up('');
  28505. me.createWheelListener();
  28506. before.addClsOnOver(me.beforeScrollerCls + '-hover');
  28507. after.addClsOnOver(me.afterScrollerCls + '-hover');
  28508. before.setVisibilityMode(Ext.Element.DISPLAY);
  28509. after.setVisibilityMode(Ext.Element.DISPLAY);
  28510. me.beforeRepeater = new Ext.util.ClickRepeater(before, {
  28511. interval: me.scrollRepeatInterval,
  28512. handler : me.scrollLeft,
  28513. scope : me
  28514. });
  28515. me.afterRepeater = new Ext.util.ClickRepeater(after, {
  28516. interval: me.scrollRepeatInterval,
  28517. handler : me.scrollRight,
  28518. scope : me
  28519. });
  28520. }
  28521. },
  28522. createWheelListener: function() {
  28523. this.layout.innerCt.on({
  28524. mousewheel: function(e) {
  28525. this.scrollBy(e.getWheelDelta() * this.wheelIncrement * -1, false);
  28526. },
  28527. stopEvent: true,
  28528. scope: this
  28529. });
  28530. },
  28531. clearOverflow: function () {
  28532. var layout = this.layout;
  28533. this.hideScrollers();
  28534. },
  28535. showScrollers: function() {
  28536. var me = this;
  28537. me.captureChildElements();
  28538. me.beforeScroller.show();
  28539. me.afterScroller.show();
  28540. me.updateScrollButtons();
  28541. me.layout.owner.addClsWithUI('scroller');
  28542. },
  28543. hideScrollers: function() {
  28544. var me = this;
  28545. if (me.beforeScroller !== undefined) {
  28546. me.beforeScroller.hide();
  28547. me.afterScroller.hide();
  28548. me.layout.owner.removeClsWithUI('scroller');
  28549. }
  28550. },
  28551. destroy: function() {
  28552. var me = this;
  28553. Ext.destroy(me.beforeRepeater, me.afterRepeater, me.beforeScroller, me.afterScroller, me.beforeCt, me.afterCt);
  28554. },
  28555. scrollBy: function(delta, animate) {
  28556. this.scrollTo(this.getScrollPosition() + delta, animate);
  28557. },
  28558. getScrollAnim: function() {
  28559. return {
  28560. duration: this.scrollDuration,
  28561. callback: this.updateScrollButtons,
  28562. scope : this
  28563. };
  28564. },
  28565. updateScrollButtons: function() {
  28566. var me = this,
  28567. beforeMeth,
  28568. afterMeth,
  28569. beforeCls,
  28570. afterCls;
  28571. if (me.beforeScroller === undefined || me.afterScroller === undefined) {
  28572. return;
  28573. }
  28574. beforeMeth = me.atExtremeBefore() ? 'addCls' : 'removeCls';
  28575. afterMeth = me.atExtremeAfter() ? 'addCls' : 'removeCls';
  28576. beforeCls = me.beforeScrollerCls + '-disabled';
  28577. afterCls = me.afterScrollerCls + '-disabled';
  28578. me.beforeScroller[beforeMeth](beforeCls);
  28579. me.afterScroller[afterMeth](afterCls);
  28580. me.scrolling = false;
  28581. },
  28582. atExtremeBefore: function() {
  28583. return !this.getScrollPosition();
  28584. },
  28585. scrollLeft: function() {
  28586. this.scrollBy(-this.scrollIncrement, false);
  28587. },
  28588. scrollRight: function() {
  28589. this.scrollBy(this.scrollIncrement, false);
  28590. },
  28591. getScrollPosition: function(){
  28592. var me = this,
  28593. layout = me.layout,
  28594. result;
  28595. if (me.hasOwnProperty('scrollPosition')) {
  28596. result = me.scrollPosition;
  28597. } else {
  28598. result = parseInt(layout.innerCt.dom['scroll' + layout.getNames().leftCap], 10) || 0;
  28599. }
  28600. return result;
  28601. },
  28602. getMaxScrollPosition: function() {
  28603. var me = this,
  28604. layout = me.layout,
  28605. names = layout.getNames(),
  28606. maxScrollPos = me.scrollSize - layout.innerCt['get'+names.widthCap]();
  28607. return (maxScrollPos < 0) ? 0 : maxScrollPos;
  28608. },
  28609. atExtremeAfter: function() {
  28610. return this.getScrollPosition() >= this.getMaxScrollPosition();
  28611. },
  28612. scrollTo: function(position, animate) {
  28613. var me = this,
  28614. layout = me.layout,
  28615. names = layout.getNames(),
  28616. oldPosition = me.getScrollPosition(),
  28617. newPosition = Ext.Number.constrain(position, 0, me.getMaxScrollPosition());
  28618. if (newPosition != oldPosition && !me.scrolling) {
  28619. delete me.scrollPosition;
  28620. if (animate === undefined) {
  28621. animate = me.animateScroll;
  28622. }
  28623. layout.innerCt.scrollTo(names.left, newPosition, animate ? me.getScrollAnim() : false);
  28624. if (animate) {
  28625. me.scrolling = true;
  28626. } else {
  28627. me.updateScrollButtons();
  28628. }
  28629. me.fireEvent('scroll', me, newPosition, animate ? me.getScrollAnim() : false);
  28630. }
  28631. },
  28632. scrollToItem: function(item, animate) {
  28633. var me = this,
  28634. layout = me.layout,
  28635. names = layout.getNames(),
  28636. visibility,
  28637. box,
  28638. newPos;
  28639. item = me.getItem(item);
  28640. if (item !== undefined) {
  28641. visibility = me.getItemVisibility(item);
  28642. if (!visibility.fullyVisible) {
  28643. box = item.getBox(true, true);
  28644. newPos = box[names.x];
  28645. if (visibility.hiddenEnd) {
  28646. newPos -= (me.layout.innerCt['get' + names.widthCap]() - box[names.width]);
  28647. }
  28648. me.scrollTo(newPos, animate);
  28649. }
  28650. }
  28651. },
  28652. getItemVisibility: function(item) {
  28653. var me = this,
  28654. box = me.getItem(item).getBox(true, true),
  28655. layout = me.layout,
  28656. names = layout.getNames(),
  28657. itemStart = box[names.x],
  28658. itemEnd = itemStart + box[names.width],
  28659. scrollStart = me.getScrollPosition(),
  28660. scrollEnd = scrollStart + layout.innerCt['get' + names.widthCap]();
  28661. return {
  28662. hiddenStart : itemStart < scrollStart,
  28663. hiddenEnd : itemEnd > scrollEnd,
  28664. fullyVisible: itemStart > scrollStart && itemEnd < scrollEnd
  28665. };
  28666. }
  28667. });
  28668. Ext.define('Ext.util.Offset', {
  28669. statics: {
  28670. fromObject: function(obj) {
  28671. return new this(obj.x, obj.y);
  28672. }
  28673. },
  28674. constructor: function(x, y) {
  28675. this.x = (x != null && !isNaN(x)) ? x : 0;
  28676. this.y = (y != null && !isNaN(y)) ? y : 0;
  28677. return this;
  28678. },
  28679. copy: function() {
  28680. return new Ext.util.Offset(this.x, this.y);
  28681. },
  28682. copyFrom: function(p) {
  28683. this.x = p.x;
  28684. this.y = p.y;
  28685. },
  28686. toString: function() {
  28687. return "Offset[" + this.x + "," + this.y + "]";
  28688. },
  28689. equals: function(offset) {
  28690. return (this.x == offset.x && this.y == offset.y);
  28691. },
  28692. round: function(to) {
  28693. if (!isNaN(to)) {
  28694. var factor = Math.pow(10, to);
  28695. this.x = Math.round(this.x * factor) / factor;
  28696. this.y = Math.round(this.y * factor) / factor;
  28697. } else {
  28698. this.x = Math.round(this.x);
  28699. this.y = Math.round(this.y);
  28700. }
  28701. },
  28702. isZero: function() {
  28703. return this.x == 0 && this.y == 0;
  28704. }
  28705. });
  28706. Ext.define('Ext.util.Region', {
  28707. requires: ['Ext.util.Offset'],
  28708. statics: {
  28709. getRegion: function(el) {
  28710. return Ext.fly(el).getPageBox(true);
  28711. },
  28712. from: function(o) {
  28713. return new this(o.top, o.right, o.bottom, o.left);
  28714. }
  28715. },
  28716. constructor : function(t, r, b, l) {
  28717. var me = this;
  28718. me.y = me.top = me[1] = t;
  28719. me.right = r;
  28720. me.bottom = b;
  28721. me.x = me.left = me[0] = l;
  28722. },
  28723. contains : function(region) {
  28724. var me = this;
  28725. return (region.x >= me.x &&
  28726. region.right <= me.right &&
  28727. region.y >= me.y &&
  28728. region.bottom <= me.bottom);
  28729. },
  28730. intersect : function(region) {
  28731. var me = this,
  28732. t = Math.max(me.y, region.y),
  28733. r = Math.min(me.right, region.right),
  28734. b = Math.min(me.bottom, region.bottom),
  28735. l = Math.max(me.x, region.x);
  28736. if (b > t && r > l) {
  28737. return new this.self(t, r, b, l);
  28738. }
  28739. else {
  28740. return false;
  28741. }
  28742. },
  28743. union : function(region) {
  28744. var me = this,
  28745. t = Math.min(me.y, region.y),
  28746. r = Math.max(me.right, region.right),
  28747. b = Math.max(me.bottom, region.bottom),
  28748. l = Math.min(me.x, region.x);
  28749. return new this.self(t, r, b, l);
  28750. },
  28751. constrainTo : function(r) {
  28752. var me = this,
  28753. constrain = Ext.Number.constrain;
  28754. me.top = me.y = constrain(me.top, r.y, r.bottom);
  28755. me.bottom = constrain(me.bottom, r.y, r.bottom);
  28756. me.left = me.x = constrain(me.left, r.x, r.right);
  28757. me.right = constrain(me.right, r.x, r.right);
  28758. return me;
  28759. },
  28760. adjust : function(t, r, b, l) {
  28761. var me = this;
  28762. me.top = me.y += t;
  28763. me.left = me.x += l;
  28764. me.right += r;
  28765. me.bottom += b;
  28766. return me;
  28767. },
  28768. getOutOfBoundOffset: function(axis, p) {
  28769. if (!Ext.isObject(axis)) {
  28770. if (axis == 'x') {
  28771. return this.getOutOfBoundOffsetX(p);
  28772. } else {
  28773. return this.getOutOfBoundOffsetY(p);
  28774. }
  28775. } else {
  28776. p = axis;
  28777. var d = new Ext.util.Offset();
  28778. d.x = this.getOutOfBoundOffsetX(p.x);
  28779. d.y = this.getOutOfBoundOffsetY(p.y);
  28780. return d;
  28781. }
  28782. },
  28783. getOutOfBoundOffsetX: function(p) {
  28784. if (p <= this.x) {
  28785. return this.x - p;
  28786. } else if (p >= this.right) {
  28787. return this.right - p;
  28788. }
  28789. return 0;
  28790. },
  28791. getOutOfBoundOffsetY: function(p) {
  28792. if (p <= this.y) {
  28793. return this.y - p;
  28794. } else if (p >= this.bottom) {
  28795. return this.bottom - p;
  28796. }
  28797. return 0;
  28798. },
  28799. isOutOfBound: function(axis, p) {
  28800. if (!Ext.isObject(axis)) {
  28801. if (axis == 'x') {
  28802. return this.isOutOfBoundX(p);
  28803. } else {
  28804. return this.isOutOfBoundY(p);
  28805. }
  28806. } else {
  28807. p = axis;
  28808. return (this.isOutOfBoundX(p.x) || this.isOutOfBoundY(p.y));
  28809. }
  28810. },
  28811. isOutOfBoundX: function(p) {
  28812. return (p < this.x || p > this.right);
  28813. },
  28814. isOutOfBoundY: function(p) {
  28815. return (p < this.y || p > this.bottom);
  28816. },
  28817. restrict: function(axis, p, factor) {
  28818. if (Ext.isObject(axis)) {
  28819. var newP;
  28820. factor = p;
  28821. p = axis;
  28822. if (p.copy) {
  28823. newP = p.copy();
  28824. }
  28825. else {
  28826. newP = {
  28827. x: p.x,
  28828. y: p.y
  28829. };
  28830. }
  28831. newP.x = this.restrictX(p.x, factor);
  28832. newP.y = this.restrictY(p.y, factor);
  28833. return newP;
  28834. } else {
  28835. if (axis == 'x') {
  28836. return this.restrictX(p, factor);
  28837. } else {
  28838. return this.restrictY(p, factor);
  28839. }
  28840. }
  28841. },
  28842. restrictX : function(p, factor) {
  28843. if (!factor) {
  28844. factor = 1;
  28845. }
  28846. if (p <= this.x) {
  28847. p -= (p - this.x) * factor;
  28848. }
  28849. else if (p >= this.right) {
  28850. p -= (p - this.right) * factor;
  28851. }
  28852. return p;
  28853. },
  28854. restrictY : function(p, factor) {
  28855. if (!factor) {
  28856. factor = 1;
  28857. }
  28858. if (p <= this.y) {
  28859. p -= (p - this.y) * factor;
  28860. }
  28861. else if (p >= this.bottom) {
  28862. p -= (p - this.bottom) * factor;
  28863. }
  28864. return p;
  28865. },
  28866. getSize: function() {
  28867. return {
  28868. width: this.right - this.x,
  28869. height: this.bottom - this.y
  28870. };
  28871. },
  28872. copy: function() {
  28873. return new this.self(this.y, this.right, this.bottom, this.x);
  28874. },
  28875. copyFrom: function(p) {
  28876. var me = this;
  28877. me.top = me.y = me[1] = p.y;
  28878. me.right = p.right;
  28879. me.bottom = p.bottom;
  28880. me.left = me.x = me[0] = p.x;
  28881. return this;
  28882. },
  28883. toString: function() {
  28884. return "Region[" + this.top + "," + this.right + "," + this.bottom + "," + this.left + "]";
  28885. },
  28886. translateBy: function(x, y) {
  28887. if (arguments.length == 1) {
  28888. y = x.y;
  28889. x = x.x;
  28890. }
  28891. var me = this;
  28892. me.top = me.y += y;
  28893. me.right += x;
  28894. me.bottom += y;
  28895. me.left = me.x += x;
  28896. return me;
  28897. },
  28898. round: function() {
  28899. var me = this;
  28900. me.top = me.y = Math.round(me.y);
  28901. me.right = Math.round(me.right);
  28902. me.bottom = Math.round(me.bottom);
  28903. me.left = me.x = Math.round(me.x);
  28904. return me;
  28905. },
  28906. equals: function(region) {
  28907. return (this.top == region.top && this.right == region.right && this.bottom == region.bottom && this.left == region.left);
  28908. }
  28909. });
  28910. Ext.define('Ext.dd.DragDropManager', {
  28911. singleton: true,
  28912. requires: ['Ext.util.Region'],
  28913. uses: ['Ext.tip.QuickTipManager'],
  28914. alternateClassName: ['Ext.dd.DragDropMgr', 'Ext.dd.DDM'],
  28915. ids: {},
  28916. handleIds: {},
  28917. dragCurrent: null,
  28918. dragOvers: {},
  28919. deltaX: 0,
  28920. deltaY: 0,
  28921. preventDefault: true,
  28922. stopPropagation: true,
  28923. initialized: false,
  28924. locked: false,
  28925. init: function() {
  28926. this.initialized = true;
  28927. },
  28928. POINT: 0,
  28929. INTERSECT: 1,
  28930. mode: 0,
  28931. notifyOccluded: false,
  28932. _execOnAll: function(sMethod, args) {
  28933. var i, j, oDD;
  28934. for (i in this.ids) {
  28935. for (j in this.ids[i]) {
  28936. oDD = this.ids[i][j];
  28937. if (! this.isTypeOfDD(oDD)) {
  28938. continue;
  28939. }
  28940. oDD[sMethod].apply(oDD, args);
  28941. }
  28942. }
  28943. },
  28944. _onLoad: function() {
  28945. this.init();
  28946. var Event = Ext.EventManager;
  28947. Event.on(document, "mouseup", this.handleMouseUp, this, true);
  28948. Event.on(document, "mousemove", this.handleMouseMove, this, true);
  28949. Event.on(window, "unload", this._onUnload, this, true);
  28950. Event.on(window, "resize", this._onResize, this, true);
  28951. },
  28952. _onResize: function(e) {
  28953. this._execOnAll("resetConstraints", []);
  28954. },
  28955. lock: function() { this.locked = true; },
  28956. unlock: function() { this.locked = false; },
  28957. isLocked: function() { return this.locked; },
  28958. locationCache: {},
  28959. useCache: true,
  28960. clickPixelThresh: 3,
  28961. clickTimeThresh: 350,
  28962. dragThreshMet: false,
  28963. clickTimeout: null,
  28964. startX: 0,
  28965. startY: 0,
  28966. regDragDrop: function(oDD, sGroup) {
  28967. if (!this.initialized) { this.init(); }
  28968. if (!this.ids[sGroup]) {
  28969. this.ids[sGroup] = {};
  28970. }
  28971. this.ids[sGroup][oDD.id] = oDD;
  28972. },
  28973. removeDDFromGroup: function(oDD, sGroup) {
  28974. if (!this.ids[sGroup]) {
  28975. this.ids[sGroup] = {};
  28976. }
  28977. var obj = this.ids[sGroup];
  28978. if (obj && obj[oDD.id]) {
  28979. delete obj[oDD.id];
  28980. }
  28981. },
  28982. _remove: function(oDD) {
  28983. for (var g in oDD.groups) {
  28984. if (g && this.ids[g] && this.ids[g][oDD.id]) {
  28985. delete this.ids[g][oDD.id];
  28986. }
  28987. }
  28988. delete this.handleIds[oDD.id];
  28989. },
  28990. regHandle: function(sDDId, sHandleId) {
  28991. if (!this.handleIds[sDDId]) {
  28992. this.handleIds[sDDId] = {};
  28993. }
  28994. this.handleIds[sDDId][sHandleId] = sHandleId;
  28995. },
  28996. isDragDrop: function(id) {
  28997. return ( this.getDDById(id) ) ? true : false;
  28998. },
  28999. getRelated: function(p_oDD, bTargetsOnly) {
  29000. var oDDs = [],
  29001. i, j, dd;
  29002. for (i in p_oDD.groups) {
  29003. for (j in this.ids[i]) {
  29004. dd = this.ids[i][j];
  29005. if (! this.isTypeOfDD(dd)) {
  29006. continue;
  29007. }
  29008. if (!bTargetsOnly || dd.isTarget) {
  29009. oDDs[oDDs.length] = dd;
  29010. }
  29011. }
  29012. }
  29013. return oDDs;
  29014. },
  29015. isLegalTarget: function (oDD, oTargetDD) {
  29016. var targets = this.getRelated(oDD, true),
  29017. i, len;
  29018. for (i=0, len=targets.length;i<len;++i) {
  29019. if (targets[i].id == oTargetDD.id) {
  29020. return true;
  29021. }
  29022. }
  29023. return false;
  29024. },
  29025. isTypeOfDD: function (oDD) {
  29026. return (oDD && oDD.__ygDragDrop);
  29027. },
  29028. isHandle: function(sDDId, sHandleId) {
  29029. return ( this.handleIds[sDDId] &&
  29030. this.handleIds[sDDId][sHandleId] );
  29031. },
  29032. getDDById: function(id) {
  29033. var me = this,
  29034. i, dd;
  29035. for (i in this.ids) {
  29036. dd = this.ids[i][id];
  29037. if (dd instanceof Ext.dd.DDTarget) {
  29038. return dd;
  29039. }
  29040. }
  29041. return null;
  29042. },
  29043. handleMouseDown: function(e, oDD) {
  29044. if(Ext.tip.QuickTipManager){
  29045. Ext.tip.QuickTipManager.ddDisable();
  29046. }
  29047. if(this.dragCurrent){
  29048. this.handleMouseUp(e);
  29049. }
  29050. this.currentTarget = e.getTarget();
  29051. this.dragCurrent = oDD;
  29052. var el = oDD.getEl();
  29053. if (Ext.isIE && el.setCapture) {
  29054. el.setCapture();
  29055. }
  29056. this.startX = e.getPageX();
  29057. this.startY = e.getPageY();
  29058. this.deltaX = this.startX - el.offsetLeft;
  29059. this.deltaY = this.startY - el.offsetTop;
  29060. this.dragThreshMet = false;
  29061. this.clickTimeout = setTimeout(
  29062. function() {
  29063. var DDM = Ext.dd.DragDropManager;
  29064. DDM.startDrag(DDM.startX, DDM.startY);
  29065. },
  29066. this.clickTimeThresh );
  29067. },
  29068. startDrag: function(x, y) {
  29069. clearTimeout(this.clickTimeout);
  29070. if (this.dragCurrent) {
  29071. this.dragCurrent.b4StartDrag(x, y);
  29072. this.dragCurrent.startDrag(x, y);
  29073. }
  29074. this.dragThreshMet = true;
  29075. },
  29076. handleMouseUp: function(e) {
  29077. var current = this.dragCurrent;
  29078. if(Ext.tip && Ext.tip.QuickTipManager){
  29079. Ext.tip.QuickTipManager.ddEnable();
  29080. }
  29081. if (!current) {
  29082. return;
  29083. }
  29084. if (Ext.isIE && document.releaseCapture) {
  29085. document.releaseCapture();
  29086. }
  29087. clearTimeout(this.clickTimeout);
  29088. if (this.dragThreshMet) {
  29089. this.fireEvents(e, true);
  29090. }
  29091. this.stopDrag(e);
  29092. this.stopEvent(e);
  29093. },
  29094. stopEvent: function(e){
  29095. if(this.stopPropagation) {
  29096. e.stopPropagation();
  29097. }
  29098. if (this.preventDefault) {
  29099. e.preventDefault();
  29100. }
  29101. },
  29102. stopDrag: function(e) {
  29103. if (this.dragCurrent) {
  29104. if (this.dragThreshMet) {
  29105. this.dragCurrent.b4EndDrag(e);
  29106. this.dragCurrent.endDrag(e);
  29107. }
  29108. this.dragCurrent.onMouseUp(e);
  29109. }
  29110. this.dragCurrent = null;
  29111. this.dragOvers = {};
  29112. },
  29113. handleMouseMove: function(e) {
  29114. var me = this,
  29115. diffX,
  29116. diffY;
  29117. if (!me.dragCurrent) {
  29118. return true;
  29119. }
  29120. if (!me.dragThreshMet) {
  29121. diffX = Math.abs(me.startX - e.getPageX());
  29122. diffY = Math.abs(me.startY - e.getPageY());
  29123. if (diffX > me.clickPixelThresh ||
  29124. diffY > me.clickPixelThresh) {
  29125. me.startDrag(me.startX, me.startY);
  29126. }
  29127. }
  29128. if (me.dragThreshMet) {
  29129. me.dragCurrent.b4Drag(e);
  29130. me.dragCurrent.onDrag(e);
  29131. if(!me.dragCurrent.moveOnly){
  29132. me.fireEvents(e, false);
  29133. }
  29134. }
  29135. me.stopEvent(e);
  29136. return true;
  29137. },
  29138. fireEvents: function(e, isDrop) {
  29139. var me = this,
  29140. dragCurrent = me.dragCurrent,
  29141. mousePoint = e.getPoint(),
  29142. overTarget,
  29143. overTargetEl,
  29144. allTargets = [],
  29145. oldOvers = [],
  29146. outEvts = [],
  29147. overEvts = [],
  29148. dropEvts = [],
  29149. enterEvts = [],
  29150. needsSort,
  29151. i,
  29152. len,
  29153. sGroup;
  29154. if (!dragCurrent || dragCurrent.isLocked()) {
  29155. return;
  29156. }
  29157. for (i in me.dragOvers) {
  29158. overTarget = me.dragOvers[i];
  29159. if (! me.isTypeOfDD(overTarget)) {
  29160. continue;
  29161. }
  29162. if (! this.isOverTarget(mousePoint, overTarget, me.mode)) {
  29163. outEvts.push( overTarget );
  29164. }
  29165. oldOvers[i] = true;
  29166. delete me.dragOvers[i];
  29167. }
  29168. for (sGroup in dragCurrent.groups) {
  29169. if ("string" != typeof sGroup) {
  29170. continue;
  29171. }
  29172. for (i in me.ids[sGroup]) {
  29173. overTarget = me.ids[sGroup][i];
  29174. if (me.isTypeOfDD(overTarget) &&
  29175. (overTargetEl = overTarget.getEl()) &&
  29176. (overTarget.isTarget) &&
  29177. (!overTarget.isLocked()) &&
  29178. (Ext.fly(overTargetEl).isVisible(true)) &&
  29179. ((overTarget != dragCurrent) || (dragCurrent.ignoreSelf === false))) {
  29180. if ((overTarget.zIndex = me.getZIndex(overTargetEl)) !== -1) {
  29181. needsSort = true;
  29182. }
  29183. allTargets.push(overTarget);
  29184. }
  29185. }
  29186. }
  29187. if (needsSort) {
  29188. Ext.Array.sort(allTargets, me.byZIndex);
  29189. }
  29190. for (i = 0, len = allTargets.length; i < len; i++) {
  29191. overTarget = allTargets[i];
  29192. if (me.isOverTarget(mousePoint, overTarget, me.mode)) {
  29193. if (isDrop) {
  29194. dropEvts.push( overTarget );
  29195. } else {
  29196. if (!oldOvers[overTarget.id]) {
  29197. enterEvts.push( overTarget );
  29198. } else {
  29199. overEvts.push( overTarget );
  29200. }
  29201. me.dragOvers[overTarget.id] = overTarget;
  29202. }
  29203. if (!me.notifyOccluded) {
  29204. break;
  29205. }
  29206. }
  29207. }
  29208. if (me.mode) {
  29209. if (outEvts.length) {
  29210. dragCurrent.b4DragOut(e, outEvts);
  29211. dragCurrent.onDragOut(e, outEvts);
  29212. }
  29213. if (enterEvts.length) {
  29214. dragCurrent.onDragEnter(e, enterEvts);
  29215. }
  29216. if (overEvts.length) {
  29217. dragCurrent.b4DragOver(e, overEvts);
  29218. dragCurrent.onDragOver(e, overEvts);
  29219. }
  29220. if (dropEvts.length) {
  29221. dragCurrent.b4DragDrop(e, dropEvts);
  29222. dragCurrent.onDragDrop(e, dropEvts);
  29223. }
  29224. } else {
  29225. for (i=0, len=outEvts.length; i<len; ++i) {
  29226. dragCurrent.b4DragOut(e, outEvts[i].id);
  29227. dragCurrent.onDragOut(e, outEvts[i].id);
  29228. }
  29229. for (i=0,len=enterEvts.length; i<len; ++i) {
  29230. dragCurrent.onDragEnter(e, enterEvts[i].id);
  29231. }
  29232. for (i=0,len=overEvts.length; i<len; ++i) {
  29233. dragCurrent.b4DragOver(e, overEvts[i].id);
  29234. dragCurrent.onDragOver(e, overEvts[i].id);
  29235. }
  29236. for (i=0, len=dropEvts.length; i<len; ++i) {
  29237. dragCurrent.b4DragDrop(e, dropEvts[i].id);
  29238. dragCurrent.onDragDrop(e, dropEvts[i].id);
  29239. }
  29240. }
  29241. if (isDrop && !dropEvts.length) {
  29242. dragCurrent.onInvalidDrop(e);
  29243. }
  29244. },
  29245. getZIndex: function(element) {
  29246. var body = document.body,
  29247. z,
  29248. zIndex = -1;
  29249. element = Ext.getDom(element);
  29250. while (element !== body) {
  29251. if (!isNaN(z = Number(Ext.fly(element).getStyle('zIndex')))) {
  29252. zIndex = z;
  29253. }
  29254. element = element.parentNode;
  29255. }
  29256. return zIndex;
  29257. },
  29258. byZIndex: function(d1, d2) {
  29259. return d1.zIndex < d2.zIndex;
  29260. },
  29261. getBestMatch: function(dds) {
  29262. var winner = null,
  29263. len = dds.length,
  29264. i, dd;
  29265. if (len == 1) {
  29266. winner = dds[0];
  29267. } else {
  29268. for (i=0; i<len; ++i) {
  29269. dd = dds[i];
  29270. if (dd.cursorIsOver) {
  29271. winner = dd;
  29272. break;
  29273. } else {
  29274. if (!winner ||
  29275. winner.overlap.getArea() < dd.overlap.getArea()) {
  29276. winner = dd;
  29277. }
  29278. }
  29279. }
  29280. }
  29281. return winner;
  29282. },
  29283. refreshCache: function(groups) {
  29284. var sGroup, i, oDD, loc;
  29285. for (sGroup in groups) {
  29286. if ("string" != typeof sGroup) {
  29287. continue;
  29288. }
  29289. for (i in this.ids[sGroup]) {
  29290. oDD = this.ids[sGroup][i];
  29291. if (this.isTypeOfDD(oDD)) {
  29292. loc = this.getLocation(oDD);
  29293. if (loc) {
  29294. this.locationCache[oDD.id] = loc;
  29295. } else {
  29296. delete this.locationCache[oDD.id];
  29297. }
  29298. }
  29299. }
  29300. }
  29301. },
  29302. verifyEl: function(el) {
  29303. if (el) {
  29304. var parent;
  29305. if(Ext.isIE){
  29306. try{
  29307. parent = el.offsetParent;
  29308. }catch(e){}
  29309. }else{
  29310. parent = el.offsetParent;
  29311. }
  29312. if (parent) {
  29313. return true;
  29314. }
  29315. }
  29316. return false;
  29317. },
  29318. getLocation: function(oDD) {
  29319. if (! this.isTypeOfDD(oDD)) {
  29320. return null;
  29321. }
  29322. if (oDD.getRegion) {
  29323. return oDD.getRegion();
  29324. }
  29325. var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
  29326. try {
  29327. pos= Ext.Element.getXY(el);
  29328. } catch (e) { }
  29329. if (!pos) {
  29330. return null;
  29331. }
  29332. x1 = pos[0];
  29333. x2 = x1 + el.offsetWidth;
  29334. y1 = pos[1];
  29335. y2 = y1 + el.offsetHeight;
  29336. t = y1 - oDD.padding[0];
  29337. r = x2 + oDD.padding[1];
  29338. b = y2 + oDD.padding[2];
  29339. l = x1 - oDD.padding[3];
  29340. return new Ext.util.Region(t, r, b, l);
  29341. },
  29342. isOverTarget: function(pt, oTarget, intersect) {
  29343. var loc = this.locationCache[oTarget.id],
  29344. dc, pos, el, curRegion, overlap;
  29345. if (!loc || !this.useCache) {
  29346. loc = this.getLocation(oTarget);
  29347. this.locationCache[oTarget.id] = loc;
  29348. }
  29349. if (!loc) {
  29350. return false;
  29351. }
  29352. oTarget.cursorIsOver = loc.contains( pt );
  29353. dc = this.dragCurrent;
  29354. if (!dc || !dc.getTargetCoord ||
  29355. (!intersect && !dc.constrainX && !dc.constrainY)) {
  29356. return oTarget.cursorIsOver;
  29357. }
  29358. oTarget.overlap = null;
  29359. pos = dc.getTargetCoord(pt.x, pt.y);
  29360. el = dc.getDragEl();
  29361. curRegion = new Ext.util.Region(pos.y,
  29362. pos.x + el.offsetWidth,
  29363. pos.y + el.offsetHeight,
  29364. pos.x );
  29365. overlap = curRegion.intersect(loc);
  29366. if (overlap) {
  29367. oTarget.overlap = overlap;
  29368. return (intersect) ? true : oTarget.cursorIsOver;
  29369. } else {
  29370. return false;
  29371. }
  29372. },
  29373. _onUnload: function(e, me) {
  29374. Ext.dd.DragDropManager.unregAll();
  29375. },
  29376. unregAll: function() {
  29377. if (this.dragCurrent) {
  29378. this.stopDrag();
  29379. this.dragCurrent = null;
  29380. }
  29381. this._execOnAll("unreg", []);
  29382. for (var i in this.elementCache) {
  29383. delete this.elementCache[i];
  29384. }
  29385. this.elementCache = {};
  29386. this.ids = {};
  29387. },
  29388. elementCache: {},
  29389. getElWrapper: function(id) {
  29390. var oWrapper = this.elementCache[id];
  29391. if (!oWrapper || !oWrapper.el) {
  29392. oWrapper = this.elementCache[id] =
  29393. new this.ElementWrapper(Ext.getDom(id));
  29394. }
  29395. return oWrapper;
  29396. },
  29397. getElement: function(id) {
  29398. return Ext.getDom(id);
  29399. },
  29400. getCss: function(id) {
  29401. var el = Ext.getDom(id);
  29402. return (el) ? el.style : null;
  29403. },
  29404. ElementWrapper: function(el) {
  29405. this.el = el || null;
  29406. this.id = this.el && el.id;
  29407. this.css = this.el && el.style;
  29408. },
  29409. getPosX: function(el) {
  29410. return Ext.Element.getX(el);
  29411. },
  29412. getPosY: function(el) {
  29413. return Ext.Element.getY(el);
  29414. },
  29415. swapNode: function(n1, n2) {
  29416. if (n1.swapNode) {
  29417. n1.swapNode(n2);
  29418. } else {
  29419. var p = n2.parentNode,
  29420. s = n2.nextSibling;
  29421. if (s == n1) {
  29422. p.insertBefore(n1, n2);
  29423. } else if (n2 == n1.nextSibling) {
  29424. p.insertBefore(n2, n1);
  29425. } else {
  29426. n1.parentNode.replaceChild(n2, n1);
  29427. p.insertBefore(n1, s);
  29428. }
  29429. }
  29430. },
  29431. getScroll: function () {
  29432. var doc = window.document,
  29433. docEl = doc.documentElement,
  29434. body = doc.body,
  29435. top = 0,
  29436. left = 0;
  29437. if (Ext.isGecko4) {
  29438. top = window.scrollYOffset;
  29439. left = window.scrollXOffset;
  29440. } else {
  29441. if (docEl && (docEl.scrollTop || docEl.scrollLeft)) {
  29442. top = docEl.scrollTop;
  29443. left = docEl.scrollLeft;
  29444. } else if (body) {
  29445. top = body.scrollTop;
  29446. left = body.scrollLeft;
  29447. }
  29448. }
  29449. return {
  29450. top: top,
  29451. left: left
  29452. };
  29453. },
  29454. getStyle: function(el, styleProp) {
  29455. return Ext.fly(el).getStyle(styleProp);
  29456. },
  29457. getScrollTop: function () {
  29458. return this.getScroll().top;
  29459. },
  29460. getScrollLeft: function () {
  29461. return this.getScroll().left;
  29462. },
  29463. moveToEl: function (moveEl, targetEl) {
  29464. var aCoord = Ext.Element.getXY(targetEl);
  29465. Ext.Element.setXY(moveEl, aCoord);
  29466. },
  29467. numericSort: function(a, b) {
  29468. return (a - b);
  29469. },
  29470. _timeoutCount: 0,
  29471. _addListeners: function() {
  29472. if ( document ) {
  29473. this._onLoad();
  29474. } else {
  29475. if (this._timeoutCount <= 2000) {
  29476. setTimeout(this._addListeners, 10);
  29477. if (document && document.body) {
  29478. this._timeoutCount += 1;
  29479. }
  29480. }
  29481. }
  29482. },
  29483. handleWasClicked: function(node, id) {
  29484. if (this.isHandle(id, node.id)) {
  29485. return true;
  29486. } else {
  29487. var p = node.parentNode;
  29488. while (p) {
  29489. if (this.isHandle(id, p.id)) {
  29490. return true;
  29491. } else {
  29492. p = p.parentNode;
  29493. }
  29494. }
  29495. }
  29496. return false;
  29497. }
  29498. }, function() {
  29499. this._addListeners();
  29500. });
  29501. Ext.define('Ext.layout.container.Box', {
  29502. alias: ['layout.box'],
  29503. extend: 'Ext.layout.container.Container',
  29504. alternateClassName: 'Ext.layout.BoxLayout',
  29505. requires: [
  29506. 'Ext.layout.container.boxOverflow.None',
  29507. 'Ext.layout.container.boxOverflow.Menu',
  29508. 'Ext.layout.container.boxOverflow.Scroller',
  29509. 'Ext.util.Format',
  29510. 'Ext.dd.DragDropManager'
  29511. ],
  29512. defaultMargins: {
  29513. top: 0,
  29514. right: 0,
  29515. bottom: 0,
  29516. left: 0
  29517. },
  29518. padding: 0,
  29519. pack: 'start',
  29520. flex: undefined,
  29521. stretchMaxPartner: undefined,
  29522. type: 'box',
  29523. scrollOffset: 0,
  29524. itemCls: Ext.baseCSSPrefix + 'box-item',
  29525. targetCls: Ext.baseCSSPrefix + 'box-layout-ct',
  29526. innerCls: Ext.baseCSSPrefix + 'box-inner',
  29527. availableSpaceOffset: 0,
  29528. reserveOffset: true,
  29529. manageMargins: true,
  29530. childEls: [
  29531. 'innerCt',
  29532. 'targetEl'
  29533. ],
  29534. renderTpl: [
  29535. '{%var oc,l=values.$comp.layout,oh=l.overflowHandler;',
  29536. 'if (oh.getPrefixConfig!==Ext.emptyFn) {',
  29537. 'if(oc=oh.getPrefixConfig())dh.generateMarkup(oc, out)',
  29538. '}%}',
  29539. '<div id="{ownerId}-innerCt" class="{[l.innerCls]} {[oh.getOverflowCls()]}" role="presentation">',
  29540. '<div id="{ownerId}-targetEl" style="position:absolute;',
  29541. 'width:20000px;',
  29542. 'left:0px;top:0px;',
  29543. 'height:1px">',
  29544. '{%this.renderBody(out, values)%}',
  29545. '</div>',
  29546. '</div>',
  29547. '{%if (oh.getSuffixConfig!==Ext.emptyFn) {',
  29548. 'if(oc=oh.getSuffixConfig())dh.generateMarkup(oc, out)',
  29549. '}%}',
  29550. {
  29551. disableFormats: true,
  29552. definitions: 'var dh=Ext.DomHelper;'
  29553. }
  29554. ],
  29555. constructor: function(config) {
  29556. var me = this,
  29557. type;
  29558. me.callParent(arguments);
  29559. me.flexSortFn = Ext.Function.bind(me.flexSort, me);
  29560. me.initOverflowHandler();
  29561. type = typeof me.padding;
  29562. if (type == 'string' || type == 'number') {
  29563. me.padding = Ext.util.Format.parseBox(me.padding);
  29564. me.padding.height = me.padding.top + me.padding.bottom;
  29565. me.padding.width = me.padding.left + me.padding.right;
  29566. }
  29567. },
  29568. getNames: function () {
  29569. return this.names;
  29570. },
  29571. _percentageRe: /^\s*(\d+(?:\.\d*)?)\s*[%]\s*$/,
  29572. getItemSizePolicy: function (item, ownerSizeModel) {
  29573. var me = this,
  29574. policy = me.sizePolicy,
  29575. align = me.align,
  29576. flex = item.flex,
  29577. key = align,
  29578. names = me.names,
  29579. width = item[names.width],
  29580. height = item[names.height],
  29581. percentageRe = me._percentageRe,
  29582. percentageWidth = percentageRe.test(width),
  29583. isStretch = (align == 'stretch');
  29584. if ((isStretch || flex || percentageWidth) && !ownerSizeModel) {
  29585. ownerSizeModel = me.owner.getSizeModel();
  29586. }
  29587. if (isStretch) {
  29588. if (!percentageRe.test(height) && ownerSizeModel[names.height].shrinkWrap) {
  29589. key = 'stretchmax';
  29590. }
  29591. } else if (align != 'stretchmax') {
  29592. if (percentageRe.test(height)) {
  29593. key = 'stretch';
  29594. } else {
  29595. key = '';
  29596. }
  29597. }
  29598. if (flex || percentageWidth) {
  29599. if (!ownerSizeModel[names.width].shrinkWrap) {
  29600. policy = policy.flex;
  29601. }
  29602. }
  29603. return policy[key];
  29604. },
  29605. flexSort: function (a, b) {
  29606. var maxWidthName = this.getNames().maxWidth,
  29607. infiniteValue = Infinity;
  29608. a = a.target[maxWidthName] || infiniteValue;
  29609. b = b.target[maxWidthName] || infiniteValue;
  29610. if (!isFinite(a) && !isFinite(b)) {
  29611. return 0;
  29612. }
  29613. return a - b;
  29614. },
  29615. isItemBoxParent: function (itemContext) {
  29616. return true;
  29617. },
  29618. isItemShrinkWrap: function (item) {
  29619. return true;
  29620. },
  29621. minSizeSortFn: function(a, b) {
  29622. return b.available - a.available;
  29623. },
  29624. roundFlex: function(width) {
  29625. return Math.ceil(width);
  29626. },
  29627. beginCollapse: function(child) {
  29628. var me = this;
  29629. if (me.direction === 'vertical' && child.collapsedVertical()) {
  29630. child.collapseMemento.capture(['flex']);
  29631. delete child.flex;
  29632. } else if (me.direction === 'horizontal' && child.collapsedHorizontal()) {
  29633. child.collapseMemento.capture(['flex']);
  29634. delete child.flex;
  29635. }
  29636. },
  29637. beginExpand: function(child) {
  29638. child.collapseMemento.restore(['flex']);
  29639. },
  29640. beginLayout: function (ownerContext) {
  29641. var me = this,
  29642. smp = me.owner.stretchMaxPartner,
  29643. style = me.innerCt.dom.style,
  29644. names = me.getNames();
  29645. ownerContext.boxNames = names;
  29646. me.overflowHandler.beginLayout(ownerContext);
  29647. if (typeof smp === 'string') {
  29648. smp = Ext.getCmp(smp) || me.owner.query(smp)[0];
  29649. }
  29650. ownerContext.stretchMaxPartner = smp && ownerContext.context.getCmp(smp);
  29651. me.callParent(arguments);
  29652. ownerContext.innerCtContext = ownerContext.getEl('innerCt', me);
  29653. me.scrollParallel = !!(me.owner.autoScroll || me.owner[names.overflowX]);
  29654. me.scrollPerpendicular = !!(me.owner.autoScroll || me.owner[names.overflowY]);
  29655. if (me.scrollParallel) {
  29656. me.scrollPos = me.owner.getTargetEl().dom[names.scrollLeft];
  29657. }
  29658. style.width = '';
  29659. style.height = '';
  29660. },
  29661. beginLayoutCycle: function (ownerContext, firstCycle) {
  29662. var me = this,
  29663. align = me.align,
  29664. names = ownerContext.boxNames,
  29665. pack = me.pack,
  29666. heightModelName = names.heightModel;
  29667. me.overflowHandler.beginLayoutCycle(ownerContext, firstCycle);
  29668. me.callParent(arguments);
  29669. ownerContext.parallelSizeModel = ownerContext[names.widthModel];
  29670. ownerContext.perpendicularSizeModel = ownerContext[heightModelName];
  29671. ownerContext.boxOptions = {
  29672. align: align = {
  29673. stretch: align == 'stretch',
  29674. stretchmax: align == 'stretchmax',
  29675. center: align == names.center
  29676. },
  29677. pack: pack = {
  29678. center: pack == 'center',
  29679. end: pack == 'end'
  29680. }
  29681. };
  29682. if (align.stretch && ownerContext.perpendicularSizeModel.shrinkWrap) {
  29683. align.stretchmax = true;
  29684. align.stretch = false;
  29685. }
  29686. align.nostretch = !(align.stretch || align.stretchmax);
  29687. if (ownerContext.parallelSizeModel.shrinkWrap) {
  29688. pack.center = pack.end = false;
  29689. }
  29690. me.cacheFlexes(ownerContext);
  29691. if (Ext.isWebKit) {
  29692. me.targetEl.setWidth(20000);
  29693. }
  29694. },
  29695. cacheFlexes: function (ownerContext) {
  29696. var me = this,
  29697. names = ownerContext.boxNames,
  29698. widthModelName = names.widthModel,
  29699. heightModelName = names.heightModel,
  29700. nostretch = ownerContext.boxOptions.align.nostretch,
  29701. totalFlex = 0,
  29702. childItems = ownerContext.childItems,
  29703. i = childItems.length,
  29704. flexedItems = [],
  29705. minWidth = 0,
  29706. minWidthName = names.minWidth,
  29707. percentageRe = me._percentageRe,
  29708. percentageWidths = 0,
  29709. percentageHeights = 0,
  29710. child, childContext, flex, match;
  29711. while (i--) {
  29712. childContext = childItems[i];
  29713. child = childContext.target;
  29714. if (childContext[widthModelName].calculated) {
  29715. childContext.flex = flex = child.flex;
  29716. if (flex) {
  29717. totalFlex += flex;
  29718. flexedItems.push(childContext);
  29719. minWidth += child[minWidthName] || 0;
  29720. } else {
  29721. match = percentageRe.exec(child[names.width]);
  29722. childContext.percentageParallel = parseFloat(match[1]) / 100;
  29723. ++percentageWidths;
  29724. }
  29725. }
  29726. if (nostretch && childContext[heightModelName].calculated) {
  29727. match = percentageRe.exec(child[names.height]);
  29728. childContext.percentagePerpendicular = parseFloat(match[1]) / 100;
  29729. ++percentageHeights;
  29730. }
  29731. }
  29732. ownerContext.flexedItems = flexedItems;
  29733. ownerContext.flexedMinSize = minWidth;
  29734. ownerContext.totalFlex = totalFlex;
  29735. ownerContext.percentageWidths = percentageWidths;
  29736. ownerContext.percentageHeights = percentageHeights;
  29737. Ext.Array.sort(flexedItems, me.flexSortFn);
  29738. },
  29739. calculate: function(ownerContext) {
  29740. var me = this,
  29741. targetSize = me.getContainerSize(ownerContext),
  29742. names = ownerContext.boxNames,
  29743. state = ownerContext.state,
  29744. plan = state.boxPlan || (state.boxPlan = {});
  29745. plan.targetSize = targetSize;
  29746. if (!ownerContext.parallelSizeModel.shrinkWrap && !targetSize[names.gotWidth]) {
  29747. me.done = false;
  29748. return;
  29749. }
  29750. if (!state.parallelDone) {
  29751. state.parallelDone = me.calculateParallel(ownerContext, names, plan);
  29752. }
  29753. if (!state.perpendicularDone) {
  29754. state.perpendicularDone = me.calculatePerpendicular(ownerContext, names, plan);
  29755. }
  29756. if (state.parallelDone && state.perpendicularDone) {
  29757. if (me.owner.dock && (Ext.isIE6 || Ext.isIE7 || Ext.isIEQuirks) && !me.owner.width && !me.horizontal) {
  29758. plan.isIEVerticalDock = true;
  29759. plan.calculatedWidth = plan.maxSize + ownerContext.getPaddingInfo().width + ownerContext.getFrameInfo().width;
  29760. }
  29761. me.publishInnerCtSize(ownerContext, me.reserveOffset ? me.availableSpaceOffset : 0);
  29762. if (me.done && ownerContext.childItems.length > 1 && ownerContext.boxOptions.align.stretchmax && !state.stretchMaxDone) {
  29763. me.calculateStretchMax(ownerContext, names, plan);
  29764. state.stretchMaxDone = true;
  29765. }
  29766. } else {
  29767. me.done = false;
  29768. }
  29769. },
  29770. calculateParallel: function(ownerContext, names, plan) {
  29771. var me = this,
  29772. widthName = names.width,
  29773. childItems = ownerContext.childItems,
  29774. leftName = names.left,
  29775. rightName = names.right,
  29776. setWidthName = names.setWidth,
  29777. childItemsLength = childItems.length,
  29778. flexedItems = ownerContext.flexedItems,
  29779. flexedItemsLength = flexedItems.length,
  29780. pack = ownerContext.boxOptions.pack,
  29781. padding = me.padding,
  29782. containerWidth = plan.targetSize[widthName],
  29783. totalMargin = 0,
  29784. left = padding[leftName],
  29785. nonFlexWidth = left + padding[rightName] + me.scrollOffset +
  29786. (me.reserveOffset ? me.availableSpaceOffset : 0),
  29787. scrollbarWidth = Ext.getScrollbarSize()[names.width],
  29788. i, childMargins, remainingWidth, remainingFlex, childContext, flex, flexedWidth,
  29789. contentWidth, mayNeedScrollbarAdjust, childWidth, percentageSpace;
  29790. if (scrollbarWidth &&
  29791. me.scrollPerpendicular &&
  29792. ownerContext.parallelSizeModel.shrinkWrap &&
  29793. !ownerContext.boxOptions.align.stretch &&
  29794. !ownerContext.perpendicularSizeModel.shrinkWrap) {
  29795. if (!ownerContext.state.perpendicularDone) {
  29796. return false;
  29797. }
  29798. mayNeedScrollbarAdjust = true;
  29799. }
  29800. for (i = 0; i < childItemsLength; ++i) {
  29801. childContext = childItems[i];
  29802. childMargins = childContext.marginInfo || childContext.getMarginInfo();
  29803. totalMargin += childMargins[widthName];
  29804. if (!childContext[names.widthModel].calculated) {
  29805. childWidth = childContext.getProp(widthName);
  29806. nonFlexWidth += childWidth;
  29807. if (isNaN(nonFlexWidth)) {
  29808. return false;
  29809. }
  29810. }
  29811. }
  29812. nonFlexWidth += totalMargin;
  29813. if (ownerContext.percentageWidths) {
  29814. percentageSpace = containerWidth - totalMargin;
  29815. if (isNaN(percentageSpace)) {
  29816. return false;
  29817. }
  29818. for (i = 0; i < childItemsLength; ++i) {
  29819. childContext = childItems[i];
  29820. if (childContext.percentageParallel) {
  29821. childWidth = Math.ceil(percentageSpace * childContext.percentageParallel);
  29822. childWidth = childContext.setWidth(childWidth);
  29823. nonFlexWidth += childWidth;
  29824. }
  29825. }
  29826. }
  29827. if (ownerContext.parallelSizeModel.shrinkWrap) {
  29828. plan.availableSpace = 0;
  29829. plan.tooNarrow = false;
  29830. } else {
  29831. plan.availableSpace = containerWidth - nonFlexWidth;
  29832. plan.tooNarrow = plan.availableSpace < ownerContext.flexedMinSize;
  29833. if (plan.tooNarrow && Ext.getScrollbarSize()[names.height] && me.scrollParallel && ownerContext.state.perpendicularDone) {
  29834. ownerContext.state.perpendicularDone = false;
  29835. for (i = 0; i < childItemsLength; ++i) {
  29836. childItems[i].invalidate();
  29837. }
  29838. }
  29839. }
  29840. contentWidth = nonFlexWidth;
  29841. remainingWidth = plan.availableSpace;
  29842. remainingFlex = ownerContext.totalFlex;
  29843. for (i = 0; i < flexedItemsLength; i++) {
  29844. childContext = flexedItems[i];
  29845. flex = childContext.flex;
  29846. flexedWidth = me.roundFlex((flex / remainingFlex) * remainingWidth);
  29847. flexedWidth = childContext[setWidthName](flexedWidth);
  29848. contentWidth += flexedWidth;
  29849. remainingWidth = Math.max(0, remainingWidth - flexedWidth);
  29850. remainingFlex -= flex;
  29851. }
  29852. if (pack.center) {
  29853. left += remainingWidth / 2;
  29854. if (left < 0) {
  29855. left = 0;
  29856. }
  29857. } else if (pack.end) {
  29858. left += remainingWidth;
  29859. }
  29860. for (i = 0; i < childItemsLength; ++i) {
  29861. childContext = childItems[i];
  29862. childMargins = childContext.marginInfo;
  29863. left += childMargins[leftName];
  29864. childContext.setProp(names.x, left);
  29865. left += childMargins[rightName] + childContext.props[widthName];
  29866. }
  29867. contentWidth += ownerContext.targetContext.getPaddingInfo()[widthName];
  29868. ownerContext.state.contentWidth = contentWidth;
  29869. if (mayNeedScrollbarAdjust &&
  29870. (ownerContext.peek(names.contentHeight) > plan.targetSize[names.height])) {
  29871. contentWidth += scrollbarWidth;
  29872. ownerContext[names.hasOverflowY] = true;
  29873. ownerContext.target.componentLayout[names.setWidthInDom] = true;
  29874. ownerContext[names.invalidateScrollY] = (Ext.isStrict && Ext.isIE8);
  29875. }
  29876. ownerContext[names.setContentWidth](contentWidth);
  29877. return true;
  29878. },
  29879. calculatePerpendicular: function(ownerContext, names, plan) {
  29880. var me = this,
  29881. heightShrinkWrap = ownerContext.perpendicularSizeModel.shrinkWrap,
  29882. targetSize = plan.targetSize,
  29883. childItems = ownerContext.childItems,
  29884. childItemsLength = childItems.length,
  29885. mmax = Math.max,
  29886. heightName = names.height,
  29887. setHeightName = names.setHeight,
  29888. topName = names.top,
  29889. topPositionName = names.y,
  29890. padding = me.padding,
  29891. top = padding[topName],
  29892. availHeight = targetSize[heightName] - top - padding[names.bottom],
  29893. align = ownerContext.boxOptions.align,
  29894. isStretch = align.stretch,
  29895. isStretchMax = align.stretchmax,
  29896. isCenter = align.center,
  29897. maxHeight = 0,
  29898. hasPercentageSizes = 0,
  29899. scrollbarHeight = Ext.getScrollbarSize().height,
  29900. childTop, i, childHeight, childMargins, diff, height, childContext,
  29901. stretchMaxPartner, stretchMaxChildren, shrinkWrapParallelOverflow,
  29902. percentagePerpendicular;
  29903. if (isStretch || (isCenter && !heightShrinkWrap)) {
  29904. if (isNaN(availHeight)) {
  29905. return false;
  29906. }
  29907. }
  29908. if (me.scrollParallel && plan.tooNarrow) {
  29909. if (heightShrinkWrap) {
  29910. shrinkWrapParallelOverflow = true;
  29911. } else {
  29912. availHeight -= scrollbarHeight;
  29913. plan.targetSize[heightName] -= scrollbarHeight;
  29914. }
  29915. }
  29916. if (isStretch) {
  29917. height = availHeight;
  29918. } else {
  29919. for (i = 0; i < childItemsLength; i++) {
  29920. childContext = childItems[i];
  29921. childMargins = (childContext.marginInfo || childContext.getMarginInfo())[heightName];
  29922. if (!(percentagePerpendicular = childContext.percentagePerpendicular)) {
  29923. childHeight = childContext.getProp(heightName);
  29924. } else {
  29925. ++hasPercentageSizes;
  29926. if (heightShrinkWrap) {
  29927. continue;
  29928. } else {
  29929. childHeight = percentagePerpendicular * availHeight - childMargins;
  29930. childHeight = childContext[names.setHeight](childHeight);
  29931. }
  29932. }
  29933. if (isNaN(maxHeight = mmax(maxHeight, childHeight + childMargins,
  29934. childContext.target[names.minHeight] || 0))) {
  29935. return false;
  29936. }
  29937. }
  29938. if (shrinkWrapParallelOverflow) {
  29939. maxHeight += scrollbarHeight;
  29940. ownerContext[names.hasOverflowX] = true;
  29941. ownerContext.target.componentLayout[names.setHeightInDom] = true;
  29942. ownerContext[names.invalidateScrollX] = (Ext.isStrict && Ext.isIE8);
  29943. }
  29944. stretchMaxPartner = ownerContext.stretchMaxPartner;
  29945. if (stretchMaxPartner) {
  29946. ownerContext.setProp('maxChildHeight', maxHeight);
  29947. stretchMaxChildren = stretchMaxPartner.childItems;
  29948. if (stretchMaxChildren && stretchMaxChildren.length) {
  29949. maxHeight = mmax(maxHeight, stretchMaxPartner.getProp('maxChildHeight'));
  29950. if (isNaN(maxHeight)) {
  29951. return false;
  29952. }
  29953. }
  29954. }
  29955. ownerContext[names.setContentHeight](maxHeight + me.padding[heightName] +
  29956. ownerContext.targetContext.getPaddingInfo()[heightName]);
  29957. if (shrinkWrapParallelOverflow) {
  29958. maxHeight -= scrollbarHeight;
  29959. }
  29960. plan.maxSize = maxHeight;
  29961. if (isStretchMax) {
  29962. height = maxHeight;
  29963. } else if (isCenter || hasPercentageSizes) {
  29964. height = heightShrinkWrap ? maxHeight : mmax(availHeight, maxHeight);
  29965. height -= ownerContext.innerCtContext.getBorderInfo()[heightName];
  29966. }
  29967. }
  29968. for (i = 0; i < childItemsLength; i++) {
  29969. childContext = childItems[i];
  29970. childMargins = childContext.marginInfo || childContext.getMarginInfo();
  29971. childTop = top + childMargins[topName];
  29972. if (isStretch) {
  29973. childContext[setHeightName](height - childMargins[heightName]);
  29974. } else {
  29975. percentagePerpendicular = childContext.percentagePerpendicular;
  29976. if (heightShrinkWrap && percentagePerpendicular) {
  29977. childMargins = childContext.marginInfo || childContext.getMarginInfo();
  29978. childHeight = percentagePerpendicular * height - childMargins[heightName];
  29979. childHeight = childContext.setHeight(childHeight);
  29980. }
  29981. if (isCenter) {
  29982. diff = height - childContext.props[heightName];
  29983. if (diff > 0) {
  29984. childTop = top + Math.round(diff / 2);
  29985. }
  29986. }
  29987. }
  29988. childContext.setProp(topPositionName, childTop);
  29989. }
  29990. return true;
  29991. },
  29992. calculateStretchMax: function (ownerContext, names, plan) {
  29993. var me = this,
  29994. heightName = names.height,
  29995. widthName = names.width,
  29996. childItems = ownerContext.childItems,
  29997. length = childItems.length,
  29998. height = plan.maxSize,
  29999. onBeforeInvalidateChild = me.onBeforeInvalidateChild,
  30000. onAfterInvalidateChild = me.onAfterInvalidateChild,
  30001. childContext, props, i, childHeight;
  30002. for (i = 0; i < length; ++i) {
  30003. childContext = childItems[i];
  30004. props = childContext.props;
  30005. childHeight = height - childContext.getMarginInfo()[heightName];
  30006. if (childHeight != props[heightName] ||
  30007. childContext[names.heightModel].constrained) {
  30008. childContext.invalidate({
  30009. before: onBeforeInvalidateChild,
  30010. after: onAfterInvalidateChild,
  30011. layout: me,
  30012. childWidth: props[widthName],
  30013. childHeight: childHeight,
  30014. childX: props.x,
  30015. childY: props.y,
  30016. names: names
  30017. });
  30018. }
  30019. }
  30020. },
  30021. completeLayout: function(ownerContext) {
  30022. var me = this,
  30023. names = ownerContext.boxNames,
  30024. invalidateScrollX = ownerContext.invalidateScrollX,
  30025. invalidateScrollY = ownerContext.invalidateScrollY,
  30026. dom, el, overflowX, overflowY, styles;
  30027. me.overflowHandler.completeLayout(ownerContext);
  30028. if (invalidateScrollX || invalidateScrollY) {
  30029. el = me.getTarget();
  30030. dom = el.dom;
  30031. styles = dom.style;
  30032. if (invalidateScrollX) {
  30033. overflowX = el.getStyle('overflowX');
  30034. if (overflowX == 'auto') {
  30035. overflowX = styles.overflowX;
  30036. styles.overflowX = 'scroll';
  30037. } else {
  30038. invalidateScrollX = false;
  30039. }
  30040. }
  30041. if (invalidateScrollY) {
  30042. overflowY = el.getStyle('overflowY');
  30043. if (overflowY == 'auto') {
  30044. overflowY = styles.overflowY;
  30045. styles.overflowY = 'scroll';
  30046. } else {
  30047. invalidateScrollY = false;
  30048. }
  30049. }
  30050. if (invalidateScrollX || invalidateScrollY) {
  30051. dom.scrollWidth;
  30052. if (invalidateScrollX) {
  30053. styles.overflowX = overflowX;
  30054. }
  30055. if (invalidateScrollY) {
  30056. styles.overflowY = overflowY;
  30057. }
  30058. }
  30059. }
  30060. if (me.scrollParallel) {
  30061. me.owner.getTargetEl().dom[names.scrollLeft] = me.scrollPos;
  30062. }
  30063. },
  30064. finishedLayout: function(ownerContext) {
  30065. this.overflowHandler.finishedLayout(ownerContext);
  30066. this.callParent(arguments);
  30067. if (Ext.isWebKit) {
  30068. this.targetEl.setWidth(ownerContext.innerCtContext.props.width);
  30069. }
  30070. },
  30071. onBeforeInvalidateChild: function (childContext, options) {
  30072. var heightModelName = options.names.heightModel;
  30073. if (!childContext[heightModelName].constrainedMax) {
  30074. childContext[heightModelName] = Ext.layout.SizeModel.calculated;
  30075. }
  30076. },
  30077. onAfterInvalidateChild: function (childContext, options) {
  30078. var names = options.names,
  30079. scrollbarSize = Ext.getScrollbarSize(),
  30080. childHeight = options.childHeight,
  30081. childWidth = options.childWidth;
  30082. childContext.setProp('x', options.childX);
  30083. childContext.setProp('y', options.childY);
  30084. if (childContext[names.heightModel].calculated) {
  30085. childContext[names.setHeight](childHeight);
  30086. }
  30087. if (childContext[names.widthModel].calculated) {
  30088. childContext[names.setWidth](childWidth);
  30089. }
  30090. },
  30091. publishInnerCtSize: function(ownerContext, reservedSpace) {
  30092. var me = this,
  30093. names = ownerContext.boxNames,
  30094. heightName = names.height,
  30095. widthName = names.width,
  30096. align = ownerContext.boxOptions.align,
  30097. dock = me.owner.dock,
  30098. padding = me.padding,
  30099. plan = ownerContext.state.boxPlan,
  30100. targetSize = plan.targetSize,
  30101. height = targetSize[heightName],
  30102. innerCtContext = ownerContext.innerCtContext,
  30103. innerCtWidth = (ownerContext.parallelSizeModel.shrinkWrap || (plan.tooNarrow && me.scrollParallel)
  30104. ? ownerContext.state.contentWidth
  30105. : targetSize[widthName]) - (reservedSpace || 0),
  30106. innerCtHeight;
  30107. if (align.stretch) {
  30108. innerCtHeight = height;
  30109. } else {
  30110. innerCtHeight = plan.maxSize + padding[names.top] + padding[names.bottom] + innerCtContext.getBorderInfo()[heightName];
  30111. if (!ownerContext.perpendicularSizeModel.shrinkWrap && align.center) {
  30112. innerCtHeight = Math.max(height, innerCtHeight);
  30113. }
  30114. }
  30115. innerCtContext[names.setWidth](innerCtWidth);
  30116. innerCtContext[names.setHeight](innerCtHeight);
  30117. if (isNaN(innerCtWidth + innerCtHeight)) {
  30118. me.done = false;
  30119. }
  30120. if (plan.calculatedWidth && (dock == 'left' || dock == 'right')) {
  30121. ownerContext.setWidth(plan.calculatedWidth, true, true);
  30122. }
  30123. },
  30124. onRemove: function(comp){
  30125. var me = this;
  30126. me.callParent(arguments);
  30127. if (me.overflowHandler) {
  30128. me.overflowHandler.onRemove(comp);
  30129. }
  30130. if (comp.layoutMarginCap == me.id) {
  30131. delete comp.layoutMarginCap;
  30132. }
  30133. },
  30134. initOverflowHandler: function() {
  30135. var me = this,
  30136. handler = me.overflowHandler,
  30137. handlerType,
  30138. constructor;
  30139. if (typeof handler == 'string') {
  30140. handler = {
  30141. type: handler
  30142. };
  30143. }
  30144. handlerType = 'None';
  30145. if (handler && handler.type !== undefined) {
  30146. handlerType = handler.type;
  30147. }
  30148. constructor = Ext.layout.container.boxOverflow[handlerType];
  30149. if (constructor[me.type]) {
  30150. constructor = constructor[me.type];
  30151. }
  30152. me.overflowHandler = Ext.create('Ext.layout.container.boxOverflow.' + handlerType, me, handler);
  30153. },
  30154. getRenderTarget: function() {
  30155. return this.targetEl;
  30156. },
  30157. getElementTarget: function() {
  30158. return this.innerCt;
  30159. },
  30160. destroy: function() {
  30161. Ext.destroy(this.innerCt, this.overflowHandler);
  30162. this.callParent(arguments);
  30163. }
  30164. });
  30165. Ext.define('Ext.layout.container.HBox', {
  30166. alias: ['layout.hbox'],
  30167. extend: 'Ext.layout.container.Box',
  30168. alternateClassName: 'Ext.layout.HBoxLayout',
  30169. align: 'top',
  30170. type : 'hbox',
  30171. direction: 'horizontal',
  30172. horizontal: true,
  30173. names: {
  30174. lr: 'lr',
  30175. left: 'left',
  30176. leftCap: 'Left',
  30177. right: 'right',
  30178. position: 'left',
  30179. width: 'width',
  30180. contentWidth: 'contentWidth',
  30181. minWidth: 'minWidth',
  30182. maxWidth: 'maxWidth',
  30183. widthCap: 'Width',
  30184. widthModel: 'widthModel',
  30185. widthIndex: 0,
  30186. x: 'x',
  30187. scrollLeft: 'scrollLeft',
  30188. overflowX: 'overflowX',
  30189. hasOverflowX: 'hasOverflowX',
  30190. invalidateScrollX: 'invalidateScrollX',
  30191. center: 'middle',
  30192. top: 'top',
  30193. topPosition: 'top',
  30194. bottom: 'bottom',
  30195. height: 'height',
  30196. contentHeight: 'contentHeight',
  30197. minHeight: 'minHeight',
  30198. maxHeight: 'maxHeight',
  30199. heightCap: 'Height',
  30200. heightModel: 'heightModel',
  30201. heightIndex: 1,
  30202. y: 'y',
  30203. scrollTop: 'scrollTop',
  30204. overflowY: 'overflowY',
  30205. hasOverflowY: 'hasOverflowY',
  30206. invalidateScrollY: 'invalidateScrollY',
  30207. getWidth: 'getWidth',
  30208. getHeight: 'getHeight',
  30209. setWidth: 'setWidth',
  30210. setHeight: 'setHeight',
  30211. gotWidth: 'gotWidth',
  30212. gotHeight: 'gotHeight',
  30213. setContentWidth: 'setContentWidth',
  30214. setContentHeight: 'setContentHeight',
  30215. setWidthInDom: 'setWidthInDom',
  30216. setHeightInDom: 'setHeightInDom'
  30217. },
  30218. sizePolicy: {
  30219. flex: {
  30220. '': {
  30221. setsWidth: 1,
  30222. setsHeight: 0
  30223. },
  30224. stretch: {
  30225. setsWidth: 1,
  30226. setsHeight: 1
  30227. },
  30228. stretchmax: {
  30229. readsHeight: 1,
  30230. setsWidth: 1,
  30231. setsHeight: 1
  30232. }
  30233. },
  30234. '': {
  30235. setsWidth: 0,
  30236. setsHeight: 0
  30237. },
  30238. stretch: {
  30239. setsWidth: 0,
  30240. setsHeight: 1
  30241. },
  30242. stretchmax: {
  30243. readsHeight: 1,
  30244. setsWidth: 0,
  30245. setsHeight: 1
  30246. }
  30247. }
  30248. });
  30249. Ext.define('Ext.layout.container.VBox', {
  30250. alias: ['layout.vbox'],
  30251. extend: 'Ext.layout.container.Box',
  30252. alternateClassName: 'Ext.layout.VBoxLayout',
  30253. align : 'left',
  30254. type: 'vbox',
  30255. direction: 'vertical',
  30256. horizontal: false,
  30257. names: {
  30258. lr: 'tb',
  30259. left: 'top',
  30260. leftCap: 'Top',
  30261. right: 'bottom',
  30262. position: 'top',
  30263. width: 'height',
  30264. contentWidth: 'contentHeight',
  30265. minWidth: 'minHeight',
  30266. maxWidth: 'maxHeight',
  30267. widthCap: 'Height',
  30268. widthModel: 'heightModel',
  30269. widthIndex: 1,
  30270. x: 'y',
  30271. scrollLeft: 'scrollTop',
  30272. overflowX: 'overflowY',
  30273. hasOverflowX: 'hasOverflowY',
  30274. invalidateScrollX: 'invalidateScrollY',
  30275. center: 'center',
  30276. top: 'left',
  30277. topPosition: 'left',
  30278. bottom: 'right',
  30279. height: 'width',
  30280. contentHeight: 'contentWidth',
  30281. minHeight: 'minWidth',
  30282. maxHeight: 'maxWidth',
  30283. heightCap: 'Width',
  30284. heightModel: 'widthModel',
  30285. heightIndex: 0,
  30286. y: 'x',
  30287. scrollTop: 'scrollLeft',
  30288. overflowY: 'overflowX',
  30289. hasOverflowY: 'hasOverflowX',
  30290. invalidateScrollY: 'invalidateScrollX',
  30291. getWidth: 'getHeight',
  30292. getHeight: 'getWidth',
  30293. setWidth: 'setHeight',
  30294. setHeight: 'setWidth',
  30295. gotWidth: 'gotHeight',
  30296. gotHeight: 'gotWidth',
  30297. setContentWidth: 'setContentHeight',
  30298. setContentHeight: 'setContentWidth',
  30299. setWidthInDom: 'setHeightInDom',
  30300. setHeightInDom: 'setWidthInDom'
  30301. },
  30302. sizePolicy: {
  30303. flex: {
  30304. '': {
  30305. setsWidth: 0,
  30306. setsHeight: 1
  30307. },
  30308. stretch: {
  30309. setsWidth: 1,
  30310. setsHeight: 1
  30311. },
  30312. stretchmax: {
  30313. readsWidth: 1,
  30314. setsWidth: 1,
  30315. setsHeight: 1
  30316. }
  30317. },
  30318. '': {
  30319. setsWidth: 0,
  30320. setsHeight: 0
  30321. },
  30322. stretch: {
  30323. setsWidth: 1,
  30324. setsHeight: 0
  30325. },
  30326. stretchmax: {
  30327. readsWidth: 1,
  30328. setsWidth: 1,
  30329. setsHeight: 0
  30330. }
  30331. }
  30332. });
  30333. Ext.define('Ext.toolbar.Toolbar', {
  30334. extend: 'Ext.container.Container',
  30335. requires: [
  30336. 'Ext.toolbar.Fill',
  30337. 'Ext.layout.container.HBox',
  30338. 'Ext.layout.container.VBox'
  30339. ],
  30340. uses: [
  30341. 'Ext.toolbar.Separator'
  30342. ],
  30343. alias: 'widget.toolbar',
  30344. alternateClassName: 'Ext.Toolbar',
  30345. isToolbar: true,
  30346. baseCls : Ext.baseCSSPrefix + 'toolbar',
  30347. ariaRole : 'toolbar',
  30348. defaultType: 'button',
  30349. vertical: false,
  30350. enableOverflow: false,
  30351. menuTriggerCls: Ext.baseCSSPrefix + 'toolbar-more-icon',
  30352. trackMenus: true,
  30353. itemCls: Ext.baseCSSPrefix + 'toolbar-item',
  30354. statics: {
  30355. shortcuts: {
  30356. '-' : 'tbseparator',
  30357. ' ' : 'tbspacer'
  30358. },
  30359. shortcutsHV: {
  30360. 0: {
  30361. '->': { xtype: 'tbfill', height: 0 }
  30362. },
  30363. 1: {
  30364. '->': { xtype: 'tbfill', width: 0 }
  30365. }
  30366. }
  30367. },
  30368. initComponent: function() {
  30369. var me = this,
  30370. keys;
  30371. if (!me.layout && me.enableOverflow) {
  30372. me.layout = { overflowHandler: 'Menu' };
  30373. }
  30374. if (me.dock === 'right' || me.dock === 'left') {
  30375. me.vertical = true;
  30376. }
  30377. me.layout = Ext.applyIf(Ext.isString(me.layout) ? {
  30378. type: me.layout
  30379. } : me.layout || {}, {
  30380. type: me.vertical ? 'vbox' : 'hbox',
  30381. align: me.vertical ? 'stretchmax' : 'middle'
  30382. });
  30383. if (me.vertical) {
  30384. me.addClsWithUI('vertical');
  30385. }
  30386. if (me.ui === 'footer') {
  30387. me.ignoreBorderManagement = true;
  30388. }
  30389. me.callParent();
  30390. me.addEvents('overflowchange');
  30391. },
  30392. getRefItems: function(deep) {
  30393. var me = this,
  30394. items = me.callParent(arguments),
  30395. layout = me.layout,
  30396. handler;
  30397. if (deep && me.enableOverflow) {
  30398. handler = layout.overflowHandler;
  30399. if (handler && handler.menu) {
  30400. items = items.concat(handler.menu.getRefItems(deep));
  30401. }
  30402. }
  30403. return items;
  30404. },
  30405. lookupComponent: function(c) {
  30406. if (typeof c == 'string') {
  30407. var T = Ext.toolbar.Toolbar,
  30408. shortcut = T.shortcutsHV[this.vertical ? 1 : 0][c] || T.shortcuts[c];
  30409. if (typeof shortcut == 'string') {
  30410. c = {
  30411. xtype: shortcut
  30412. };
  30413. } else if (shortcut) {
  30414. c = Ext.apply({}, shortcut);
  30415. } else {
  30416. c = {
  30417. xtype: 'tbtext',
  30418. text: c
  30419. };
  30420. }
  30421. this.applyDefaults(c);
  30422. }
  30423. return this.callParent(arguments);
  30424. },
  30425. applyDefaults: function(c) {
  30426. if (!Ext.isString(c)) {
  30427. c = this.callParent(arguments);
  30428. }
  30429. return c;
  30430. },
  30431. trackMenu: function(item, remove) {
  30432. if (this.trackMenus && item.menu) {
  30433. var method = remove ? 'mun' : 'mon',
  30434. me = this;
  30435. me[method](item, 'mouseover', me.onButtonOver, me);
  30436. me[method](item, 'menushow', me.onButtonMenuShow, me);
  30437. me[method](item, 'menuhide', me.onButtonMenuHide, me);
  30438. }
  30439. },
  30440. constructButton: function(item) {
  30441. return item.events ? item
  30442. : Ext.widget(item.split ? 'splitbutton' : this.defaultType, item);
  30443. },
  30444. onBeforeAdd: function(component) {
  30445. if (component.is('field') || (component.is('button') && this.ui != 'footer')) {
  30446. component.ui = component.ui + '-toolbar';
  30447. }
  30448. if (component instanceof Ext.toolbar.Separator) {
  30449. component.setUI((this.vertical) ? 'vertical' : 'horizontal');
  30450. }
  30451. this.callParent(arguments);
  30452. },
  30453. onAdd: function(component) {
  30454. this.callParent(arguments);
  30455. this.trackMenu(component);
  30456. },
  30457. onRemove: function(c) {
  30458. this.callParent(arguments);
  30459. this.trackMenu(c, true);
  30460. },
  30461. getChildItemsToDisable: function() {
  30462. return this.items.getRange();
  30463. },
  30464. onButtonOver: function(btn){
  30465. if (this.activeMenuBtn && this.activeMenuBtn != btn) {
  30466. this.activeMenuBtn.hideMenu();
  30467. btn.showMenu();
  30468. this.activeMenuBtn = btn;
  30469. }
  30470. },
  30471. onButtonMenuShow: function(btn) {
  30472. this.activeMenuBtn = btn;
  30473. },
  30474. onButtonMenuHide: function(btn) {
  30475. delete this.activeMenuBtn;
  30476. }
  30477. });
  30478. Ext.define('Ext.container.DockingContainer', {
  30479. requires: ['Ext.util.MixedCollection', 'Ext.Element' ],
  30480. isDockingContainer: true,
  30481. defaultDockWeights: {
  30482. top: { render: 1, visual: 1 },
  30483. left: { render: 3, visual: 5 },
  30484. right: { render: 5, visual: 7 },
  30485. bottom: { render: 7, visual: 3 }
  30486. },
  30487. dockOrder: {
  30488. top: -1,
  30489. left: -1,
  30490. right: 1,
  30491. bottom: 1
  30492. },
  30493. addDocked : function(items, pos) {
  30494. var me = this,
  30495. i = 0,
  30496. item, length;
  30497. items = me.prepareItems(items);
  30498. length = items.length;
  30499. for (; i < length; i++) {
  30500. item = items[i];
  30501. item.dock = item.dock || 'top';
  30502. if (pos !== undefined) {
  30503. me.dockedItems.insert(pos + i, item);
  30504. } else {
  30505. me.dockedItems.add(item);
  30506. }
  30507. if (item.onAdded !== Ext.emptyFn) {
  30508. item.onAdded(me, i);
  30509. }
  30510. if (me.onDockedAdd !== Ext.emptyFn) {
  30511. me.onDockedAdd(item);
  30512. }
  30513. }
  30514. if (me.rendered && !me.suspendLayout) {
  30515. me.updateLayout();
  30516. }
  30517. return items;
  30518. },
  30519. destroyDockedItems: function(){
  30520. var dockedItems = this.dockedItems,
  30521. c;
  30522. if (dockedItems) {
  30523. while ((c = dockedItems.first())) {
  30524. this.removeDocked(c, true);
  30525. }
  30526. }
  30527. },
  30528. doRenderDockedItems: function (out, renderData, after) {
  30529. var me = renderData.$comp,
  30530. layout = me.componentLayout,
  30531. items,
  30532. tree;
  30533. if (layout.getDockedItems && !renderData.$skipDockedItems) {
  30534. items = layout.getDockedItems('render', !after);
  30535. tree = items && layout.getItemsRenderTree(items);
  30536. if (tree) {
  30537. Ext.DomHelper.generateMarkup(tree, out);
  30538. }
  30539. }
  30540. },
  30541. getDockedComponent: function(comp) {
  30542. if (Ext.isObject(comp)) {
  30543. comp = comp.getItemId();
  30544. }
  30545. return this.dockedItems.get(comp);
  30546. },
  30547. getDockedItems : function(selector, beforeBody) {
  30548. var dockedItems = this.getComponentLayout().getDockedItems('render', beforeBody);
  30549. if (selector && dockedItems.length) {
  30550. dockedItems = Ext.ComponentQuery.query(selector, dockedItems);
  30551. }
  30552. return dockedItems;
  30553. },
  30554. getDockingRefItems: function(deep, containerItems) {
  30555. var selector = deep && '*,* *',
  30556. dockedItems = this.getDockedItems(selector, true),
  30557. items;
  30558. dockedItems.push.apply(dockedItems, containerItems);
  30559. items = this.getDockedItems(selector, false);
  30560. dockedItems.push.apply(dockedItems, items);
  30561. return dockedItems;
  30562. },
  30563. initDockingItems: function() {
  30564. var me = this,
  30565. items = me.dockedItems;
  30566. me.dockedItems = new Ext.util.AbstractMixedCollection(false, me.getComponentId);
  30567. if (items) {
  30568. me.addDocked(items);
  30569. }
  30570. },
  30571. insertDocked : function(pos, items) {
  30572. this.addDocked(items, pos);
  30573. },
  30574. onDockedAdd : Ext.emptyFn,
  30575. onDockedRemove : Ext.emptyFn,
  30576. removeDocked : function(item, autoDestroy) {
  30577. var me = this,
  30578. layout,
  30579. hasLayout;
  30580. if (!me.dockedItems.contains(item)) {
  30581. return item;
  30582. }
  30583. layout = me.componentLayout;
  30584. hasLayout = layout && me.rendered;
  30585. if (hasLayout) {
  30586. layout.onRemove(item);
  30587. }
  30588. me.dockedItems.remove(item);
  30589. item.onRemoved();
  30590. me.onDockedRemove(item);
  30591. if (autoDestroy === true || (autoDestroy !== false && me.autoDestroy)) {
  30592. item.destroy();
  30593. } else if (hasLayout) {
  30594. layout.afterRemove(item);
  30595. }
  30596. if (!me.destroying && !me.suspendLayout) {
  30597. me.updateLayout();
  30598. }
  30599. return item;
  30600. },
  30601. setupDockingRenderTpl: function (renderTpl) {
  30602. renderTpl.renderDockedItems = this.doRenderDockedItems;
  30603. }
  30604. });
  30605. Ext.define('Ext.panel.AbstractPanel', {
  30606. extend: 'Ext.container.Container',
  30607. mixins: {
  30608. docking: 'Ext.container.DockingContainer'
  30609. },
  30610. requires: ['Ext.util.MixedCollection', 'Ext.Element', 'Ext.toolbar.Toolbar'],
  30611. baseCls : Ext.baseCSSPrefix + 'panel',
  30612. isPanel: true,
  30613. componentLayout: 'dock',
  30614. childEls: [
  30615. 'body'
  30616. ],
  30617. renderTpl: [
  30618. '{% this.renderDockedItems(out,values,0); %}',
  30619. (Ext.isIE6 || Ext.isIE7 || Ext.isIEQuirks) ? '<div></div>' : '',
  30620. '<div id="{id}-body" class="{baseCls}-body<tpl if="bodyCls"> {bodyCls}</tpl>',
  30621. ' {baseCls}-body-{ui}<tpl if="uiCls">',
  30622. '<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl>',
  30623. '</tpl>"<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',
  30624. '{%this.renderContainer(out,values);%}',
  30625. '</div>',
  30626. '{% this.renderDockedItems(out,values,1); %}'
  30627. ],
  30628. bodyPosProps: {
  30629. x: 'x',
  30630. y: 'y'
  30631. },
  30632. border: true,
  30633. emptyArray: [],
  30634. initComponent : function() {
  30635. var me = this;
  30636. if (me.frame && me.border && me.bodyBorder === undefined) {
  30637. me.bodyBorder = false;
  30638. }
  30639. if (me.frame && me.border && (me.bodyBorder === false || me.bodyBorder === 0)) {
  30640. me.manageBodyBorders = true;
  30641. }
  30642. me.callParent();
  30643. },
  30644. beforeDestroy: function(){
  30645. this.destroyDockedItems();
  30646. this.callParent();
  30647. },
  30648. initItems : function() {
  30649. this.callParent();
  30650. this.initDockingItems();
  30651. },
  30652. initRenderData: function() {
  30653. var me = this,
  30654. data = me.callParent();
  30655. me.initBodyStyles();
  30656. me.protoBody.writeTo(data);
  30657. delete me.protoBody;
  30658. return data;
  30659. },
  30660. getComponent: function(comp) {
  30661. var component = this.callParent(arguments);
  30662. if (component === undefined && !Ext.isNumber(comp)) {
  30663. component = this.getDockedComponent(comp);
  30664. }
  30665. return component;
  30666. },
  30667. getProtoBody: function () {
  30668. var me = this,
  30669. body = me.protoBody;
  30670. if (!body) {
  30671. me.protoBody = body = new Ext.util.ProtoElement({
  30672. cls: me.bodyCls,
  30673. style: me.bodyStyle,
  30674. clsProp: 'bodyCls',
  30675. styleProp: 'bodyStyle',
  30676. styleIsText: true
  30677. });
  30678. }
  30679. return body;
  30680. },
  30681. initBodyStyles: function() {
  30682. var me = this,
  30683. body = me.getProtoBody(),
  30684. Element = Ext.Element;
  30685. if (me.bodyPadding !== undefined) {
  30686. body.setStyle('padding', Element.unitizeBox((me.bodyPadding === true) ? 5 : me.bodyPadding));
  30687. }
  30688. if (me.frame && me.bodyBorder) {
  30689. if (!Ext.isNumber(me.bodyBorder)) {
  30690. me.bodyBorder = 1;
  30691. }
  30692. body.setStyle('border-width', Element.unitizeBox(me.bodyBorder));
  30693. }
  30694. },
  30695. getCollapsedDockedItems: function () {
  30696. var me = this;
  30697. return me.collapseMode == 'placeholder' ? me.emptyArray : [ me.getReExpander() ];
  30698. },
  30699. setBodyStyle: function(style, value) {
  30700. var me = this,
  30701. body = me.rendered ? me.body : me.getProtoBody();
  30702. if (Ext.isFunction(style)) {
  30703. style = style();
  30704. }
  30705. if (arguments.length == 1) {
  30706. if (Ext.isString(style)) {
  30707. style = Ext.Element.parseStyles(style);
  30708. }
  30709. body.setStyle(style);
  30710. } else {
  30711. body.setStyle(style, value);
  30712. }
  30713. return me;
  30714. },
  30715. addBodyCls: function(cls) {
  30716. var me = this,
  30717. body = me.rendered ? me.body : me.getProtoBody();
  30718. body.addCls(cls);
  30719. return me;
  30720. },
  30721. removeBodyCls: function(cls) {
  30722. var me = this,
  30723. body = me.rendered ? me.body : me.getProtoBody();
  30724. body.removeCls(cls);
  30725. return me;
  30726. },
  30727. addUIClsToElement: function(cls) {
  30728. var me = this,
  30729. result = me.callParent(arguments);
  30730. me.addBodyCls([Ext.baseCSSPrefix + cls, me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls]);
  30731. return result;
  30732. },
  30733. removeUIClsFromElement: function(cls) {
  30734. var me = this,
  30735. result = me.callParent(arguments);
  30736. me.removeBodyCls([Ext.baseCSSPrefix + cls, me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls]);
  30737. return result;
  30738. },
  30739. addUIToElement: function() {
  30740. var me = this;
  30741. me.callParent(arguments);
  30742. me.addBodyCls(me.baseCls + '-body-' + me.ui);
  30743. },
  30744. removeUIFromElement: function() {
  30745. var me = this;
  30746. me.callParent(arguments);
  30747. me.removeBodyCls(me.baseCls + '-body-' + me.ui);
  30748. },
  30749. getTargetEl : function() {
  30750. return this.body;
  30751. },
  30752. getRefItems: function(deep) {
  30753. var items = this.callParent(arguments);
  30754. return this.getDockingRefItems(deep, items);
  30755. },
  30756. setupRenderTpl: function (renderTpl) {
  30757. this.callParent(arguments);
  30758. this.setupDockingRenderTpl(renderTpl);
  30759. }
  30760. });
  30761. Ext.define('Ext.layout.component.Body', {
  30762. alias: ['layout.body'],
  30763. extend: 'Ext.layout.component.Auto',
  30764. type: 'body',
  30765. beginLayout: function (ownerContext) {
  30766. this.callParent(arguments);
  30767. ownerContext.bodyContext = ownerContext.getEl('body');
  30768. },
  30769. calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
  30770. var height = this.callParent(arguments);
  30771. if (ownerContext.targetContext != ownerContext) {
  30772. height += ownerContext.getPaddingInfo().height;
  30773. }
  30774. return height;
  30775. },
  30776. calculateOwnerWidthFromContentWidth: function (ownerContext, contentWidth) {
  30777. var width = this.callParent(arguments);
  30778. if (ownerContext.targetContext != ownerContext) {
  30779. width += ownerContext.getPaddingInfo().width;
  30780. }
  30781. return width;
  30782. },
  30783. measureContentWidth: function (ownerContext) {
  30784. return ownerContext.bodyContext.setWidth(ownerContext.bodyContext.el.dom.offsetWidth, false);
  30785. },
  30786. measureContentHeight: function (ownerContext) {
  30787. return ownerContext.bodyContext.setHeight(ownerContext.bodyContext.el.dom.offsetHeight, false);
  30788. },
  30789. publishInnerHeight: function (ownerContext, height) {
  30790. var innerHeight = height - ownerContext.getFrameInfo().height,
  30791. targetContext = ownerContext.targetContext;
  30792. if (targetContext != ownerContext) {
  30793. innerHeight -= ownerContext.getPaddingInfo().height;
  30794. }
  30795. return ownerContext.bodyContext.setHeight(innerHeight, !ownerContext.heightModel.natural);
  30796. },
  30797. publishInnerWidth: function (ownerContext, width) {
  30798. var innerWidth = width - ownerContext.getFrameInfo().width,
  30799. targetContext = ownerContext.targetContext;
  30800. if (targetContext != ownerContext) {
  30801. innerWidth -= ownerContext.getPaddingInfo().width;
  30802. }
  30803. ownerContext.bodyContext.setWidth(innerWidth, !ownerContext.widthModel.natural);
  30804. }
  30805. });
  30806. Ext.define('Ext.panel.Header', {
  30807. extend: 'Ext.container.Container',
  30808. uses: ['Ext.panel.Tool', 'Ext.draw.Component', 'Ext.util.CSS', 'Ext.layout.component.Body', 'Ext.Img'],
  30809. alias: 'widget.header',
  30810. isHeader : true,
  30811. defaultType : 'tool',
  30812. indicateDrag : false,
  30813. weight : -1,
  30814. componentLayout: 'body',
  30815. titleAlign: 'left',
  30816. childEls: [
  30817. 'body'
  30818. ],
  30819. renderTpl: [
  30820. '<div id="{id}-body" class="{baseCls}-body {bodyCls}',
  30821. '<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl>"',
  30822. '<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',
  30823. '{%this.renderContainer(out,values)%}',
  30824. '</div>'
  30825. ],
  30826. headingTpl: '<span id="{id}-textEl" class="{cls}-text {cls}-text-{ui}">{title}</span>',
  30827. shrinkWrap: 3,
  30828. initComponent: function() {
  30829. var me = this,
  30830. ruleStyle,
  30831. rule,
  30832. style,
  30833. ui,
  30834. tempEl;
  30835. me.addEvents(
  30836. 'click',
  30837. 'dblclick'
  30838. );
  30839. me.indicateDragCls = me.baseCls + '-draggable';
  30840. me.title = me.title || '&#160;';
  30841. me.tools = me.tools || [];
  30842. me.items = me.items || [];
  30843. me.orientation = me.orientation || 'horizontal';
  30844. me.dock = (me.dock) ? me.dock : (me.orientation == 'horizontal') ? 'top' : 'left';
  30845. me.addClsWithUI([me.orientation, me.dock]);
  30846. if (me.indicateDrag) {
  30847. me.addCls(me.indicateDragCls);
  30848. }
  30849. if (!Ext.isEmpty(me.iconCls) || !Ext.isEmpty(me.icon)) {
  30850. me.initIconCmp();
  30851. me.items.push(me.iconCmp);
  30852. }
  30853. if (me.orientation == 'vertical') {
  30854. me.layout = {
  30855. type : 'vbox',
  30856. align: 'center'
  30857. };
  30858. me.textConfig = {
  30859. width: 16,
  30860. cls: me.baseCls + '-text',
  30861. type: 'text',
  30862. text: me.title,
  30863. rotate: {
  30864. degrees: 90
  30865. }
  30866. };
  30867. ui = me.ui;
  30868. if (Ext.isArray(ui)) {
  30869. ui = ui[0];
  30870. }
  30871. ruleStyle = '.' + me.baseCls + '-text-' + ui;
  30872. if (Ext.scopeResetCSS) {
  30873. ruleStyle = '.' + Ext.baseCSSPrefix + 'reset ' + ruleStyle;
  30874. }
  30875. rule = Ext.util.CSS.getRule(ruleStyle);
  30876. if (rule) {
  30877. style = rule.style;
  30878. } else {
  30879. style = (tempEl = Ext.resetElement.createChild({style: 'position:absolute', cls: me.baseCls + '-text-' + ui})).getStyles('fontFamily', 'fontWeight', 'fontSize', 'color');
  30880. tempEl.remove();
  30881. }
  30882. if (style) {
  30883. Ext.apply(me.textConfig, {
  30884. 'font-family': style.fontFamily,
  30885. 'font-weight': style.fontWeight,
  30886. 'font-size': style.fontSize,
  30887. fill: style.color
  30888. });
  30889. }
  30890. me.titleCmp = new Ext.draw.Component({
  30891. width : 16,
  30892. ariaRole : 'heading',
  30893. focusable : false,
  30894. viewBox : false,
  30895. flex : 1,
  30896. id : me.id + '_hd',
  30897. autoSize : true,
  30898. items : me.textConfig,
  30899. xhooks: {
  30900. setSize: function (width) {
  30901. this.callParent([width]);
  30902. }
  30903. },
  30904. childEls : [
  30905. { name: 'textEl', select: '.' + me.baseCls + '-text' }
  30906. ]
  30907. });
  30908. } else {
  30909. me.layout = {
  30910. type : 'hbox',
  30911. align: 'middle'
  30912. };
  30913. me.titleCmp = new Ext.Component({
  30914. ariaRole : 'heading',
  30915. focusable : false,
  30916. noWrap : true,
  30917. flex : 1,
  30918. id : me.id + '_hd',
  30919. style : 'text-align:' + me.titleAlign,
  30920. cls : me.baseCls + '-text-container',
  30921. renderTpl : me.getTpl('headingTpl'),
  30922. renderData: {
  30923. title: me.title,
  30924. cls : me.baseCls,
  30925. ui : me.ui
  30926. },
  30927. childEls : ['textEl']
  30928. });
  30929. }
  30930. me.items.push(me.titleCmp);
  30931. me.items = me.items.concat(me.tools);
  30932. me.callParent();
  30933. me.on({
  30934. dblclick: me.onDblClick,
  30935. click: me.onClick,
  30936. element: 'el',
  30937. scope: me
  30938. });
  30939. },
  30940. initIconCmp: function() {
  30941. var me = this,
  30942. cfg = {
  30943. focusable: false,
  30944. src: Ext.BLANK_IMAGE_URL,
  30945. cls: [me.baseCls + '-icon', me.iconCls],
  30946. id: me.id + '-iconEl',
  30947. iconCls: me.iconCls
  30948. };
  30949. if (!Ext.isEmpty(me.icon)) {
  30950. delete cfg.iconCls;
  30951. cfg.src = me.icon;
  30952. }
  30953. me.iconCmp = new Ext.Img(cfg);
  30954. },
  30955. afterRender: function() {
  30956. this.el.unselectable();
  30957. this.callParent();
  30958. },
  30959. addUIClsToElement: function(cls) {
  30960. var me = this,
  30961. result = me.callParent(arguments),
  30962. classes = [me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls],
  30963. array, i;
  30964. if (me.bodyCls) {
  30965. array = me.bodyCls.split(' ');
  30966. for (i = 0; i < classes.length; i++) {
  30967. if (!Ext.Array.contains(array, classes[i])) {
  30968. array.push(classes[i]);
  30969. }
  30970. }
  30971. me.bodyCls = array.join(' ');
  30972. } else {
  30973. me.bodyCls = classes.join(' ');
  30974. }
  30975. return result;
  30976. },
  30977. removeUIClsFromElement: function(cls) {
  30978. var me = this,
  30979. result = me.callParent(arguments),
  30980. classes = [me.baseCls + '-body-' + cls, me.baseCls + '-body-' + me.ui + '-' + cls],
  30981. array, i;
  30982. if (me.bodyCls) {
  30983. array = me.bodyCls.split(' ');
  30984. for (i = 0; i < classes.length; i++) {
  30985. Ext.Array.remove(array, classes[i]);
  30986. }
  30987. me.bodyCls = array.join(' ');
  30988. }
  30989. return result;
  30990. },
  30991. addUIToElement: function() {
  30992. var me = this,
  30993. array, cls;
  30994. me.callParent(arguments);
  30995. cls = me.baseCls + '-body-' + me.ui;
  30996. if (me.rendered) {
  30997. if (me.bodyCls) {
  30998. me.body.addCls(me.bodyCls);
  30999. } else {
  31000. me.body.addCls(cls);
  31001. }
  31002. } else {
  31003. if (me.bodyCls) {
  31004. array = me.bodyCls.split(' ');
  31005. if (!Ext.Array.contains(array, cls)) {
  31006. array.push(cls);
  31007. }
  31008. me.bodyCls = array.join(' ');
  31009. } else {
  31010. me.bodyCls = cls;
  31011. }
  31012. }
  31013. if (me.titleCmp && me.titleCmp.rendered && me.titleCmp.textEl) {
  31014. me.titleCmp.textEl.addCls(me.baseCls + '-text-' + me.ui);
  31015. }
  31016. },
  31017. removeUIFromElement: function() {
  31018. var me = this,
  31019. array, cls;
  31020. me.callParent(arguments);
  31021. cls = me.baseCls + '-body-' + me.ui;
  31022. if (me.rendered) {
  31023. if (me.bodyCls) {
  31024. me.body.removeCls(me.bodyCls);
  31025. } else {
  31026. me.body.removeCls(cls);
  31027. }
  31028. } else {
  31029. if (me.bodyCls) {
  31030. array = me.bodyCls.split(' ');
  31031. Ext.Array.remove(array, cls);
  31032. me.bodyCls = array.join(' ');
  31033. } else {
  31034. me.bodyCls = cls;
  31035. }
  31036. }
  31037. if (me.titleCmp && me.titleCmp.rendered && me.titleCmp.textEl) {
  31038. me.titleCmp.textEl.removeCls(me.baseCls + '-text-' + me.ui);
  31039. }
  31040. },
  31041. onClick: function(e) {
  31042. this.fireClickEvent('click', e);
  31043. },
  31044. onDblClick: function(e){
  31045. this.fireClickEvent('dblclick', e);
  31046. },
  31047. fireClickEvent: function(type, e){
  31048. var toolCls = '.' + Ext.panel.Tool.prototype.baseCls;
  31049. if (!e.getTarget(toolCls)) {
  31050. this.fireEvent(type, this, e);
  31051. }
  31052. },
  31053. getFocusEl: function() {
  31054. return this.el;
  31055. },
  31056. getTargetEl: function() {
  31057. return this.body || this.frameBody || this.el;
  31058. },
  31059. setTitle: function(title) {
  31060. var me = this,
  31061. sprite,
  31062. surface;
  31063. if (me.rendered) {
  31064. if (me.titleCmp.rendered) {
  31065. if (me.titleCmp.surface) {
  31066. me.title = title || '';
  31067. sprite = me.titleCmp.surface.items.items[0];
  31068. surface = me.titleCmp.surface;
  31069. surface.remove(sprite);
  31070. me.textConfig.type = 'text';
  31071. me.textConfig.text = title;
  31072. sprite = surface.add(me.textConfig);
  31073. sprite.setAttributes({
  31074. rotate: {
  31075. degrees: 90
  31076. }
  31077. }, true);
  31078. me.titleCmp.autoSizeSurface();
  31079. } else {
  31080. me.title = title;
  31081. me.titleCmp.textEl.update(me.title || '&#160;');
  31082. }
  31083. me.titleCmp.updateLayout();
  31084. } else {
  31085. me.titleCmp.on({
  31086. render: function() {
  31087. me.setTitle(title);
  31088. },
  31089. single: true
  31090. });
  31091. }
  31092. } else {
  31093. me.title = title;
  31094. }
  31095. },
  31096. getMinWidth: function() {
  31097. var me = this,
  31098. textEl = me.titleCmp.textEl.dom,
  31099. result,
  31100. tools = me.tools,
  31101. l, i;
  31102. textEl.style.display = 'inline';
  31103. result = textEl.offsetWidth;
  31104. textEl.style.display = '';
  31105. if (tools && (l = tools.length)) {
  31106. for (i = 0; i < l; i++) {
  31107. if (tools[i].el) {
  31108. result += tools[i].el.dom.offsetWidth;
  31109. }
  31110. }
  31111. }
  31112. if (me.iconCmp) {
  31113. result += me.iconCmp.el.dom.offsetWidth;
  31114. }
  31115. return result + 10;
  31116. },
  31117. setIconCls: function(cls) {
  31118. var me = this,
  31119. isEmpty = !cls || !cls.length,
  31120. iconCmp = me.iconCmp;
  31121. me.iconCls = cls;
  31122. if (!me.iconCmp && !isEmpty) {
  31123. me.initIconCmp();
  31124. me.insert(0, me.iconCmp);
  31125. } else if (iconCmp) {
  31126. if (isEmpty) {
  31127. me.iconCmp.destroy();
  31128. delete me.iconCmp;
  31129. } else {
  31130. iconCmp.removeCls(iconCmp.iconCls);
  31131. iconCmp.addCls(cls);
  31132. iconCmp.iconCls = cls;
  31133. }
  31134. }
  31135. },
  31136. setIcon: function(icon) {
  31137. var me = this,
  31138. isEmpty = !icon || !icon.length,
  31139. iconCmp = me.iconCmp;
  31140. me.icon = icon;
  31141. if (!me.iconCmp && !isEmpty) {
  31142. me.initIconCmp();
  31143. me.insert(0, me.iconCmp);
  31144. } else if (iconCmp) {
  31145. if (isEmpty) {
  31146. me.iconCmp.destroy();
  31147. delete me.iconCmp;
  31148. } else {
  31149. iconCmp.setSrc(me.icon);
  31150. }
  31151. }
  31152. },
  31153. addTool: function(tool) {
  31154. this.tools.push(this.add(tool));
  31155. },
  31156. onAdd: function(component, index) {
  31157. this.callParent(arguments);
  31158. if (component instanceof Ext.panel.Tool) {
  31159. component.bindTo(this.ownerCt);
  31160. this.tools[component.type] = component;
  31161. }
  31162. },
  31163. initRenderData: function() {
  31164. return Ext.applyIf(this.callParent(), {
  31165. bodyCls: this.bodyCls
  31166. });
  31167. }
  31168. });
  31169. Ext.define('Ext.fx.target.Target', {
  31170. isAnimTarget: true,
  31171. constructor: function(target) {
  31172. this.target = target;
  31173. this.id = this.getId();
  31174. },
  31175. getId: function() {
  31176. return this.target.id;
  31177. }
  31178. });
  31179. Ext.define('Ext.fx.target.Element', {
  31180. extend: 'Ext.fx.target.Target',
  31181. type: 'element',
  31182. getElVal: function(el, attr, val) {
  31183. if (val == undefined) {
  31184. if (attr === 'x') {
  31185. val = el.getX();
  31186. }
  31187. else if (attr === 'y') {
  31188. val = el.getY();
  31189. }
  31190. else if (attr === 'scrollTop') {
  31191. val = el.getScroll().top;
  31192. }
  31193. else if (attr === 'scrollLeft') {
  31194. val = el.getScroll().left;
  31195. }
  31196. else if (attr === 'height') {
  31197. val = el.getHeight();
  31198. }
  31199. else if (attr === 'width') {
  31200. val = el.getWidth();
  31201. }
  31202. else {
  31203. val = el.getStyle(attr);
  31204. }
  31205. }
  31206. return val;
  31207. },
  31208. getAttr: function(attr, val) {
  31209. var el = this.target;
  31210. return [[ el, this.getElVal(el, attr, val)]];
  31211. },
  31212. setAttr: function(targetData) {
  31213. var target = this.target,
  31214. ln = targetData.length,
  31215. attrs, attr, o, i, j, ln2, element, value;
  31216. for (i = 0; i < ln; i++) {
  31217. attrs = targetData[i].attrs;
  31218. for (attr in attrs) {
  31219. if (attrs.hasOwnProperty(attr)) {
  31220. ln2 = attrs[attr].length;
  31221. for (j = 0; j < ln2; j++) {
  31222. o = attrs[attr][j];
  31223. element = o[0];
  31224. value = o[1];
  31225. if (attr === 'x') {
  31226. element.setX(value);
  31227. } else if (attr === 'y') {
  31228. element.setY(value);
  31229. } else if (attr === 'scrollTop') {
  31230. element.scrollTo('top', value);
  31231. } else if (attr === 'scrollLeft') {
  31232. element.scrollTo('left',value);
  31233. } else if (attr === 'width') {
  31234. element.setWidth(value);
  31235. } else if (attr === 'height') {
  31236. element.setHeight(value);
  31237. } else {
  31238. element.setStyle(attr, value);
  31239. }
  31240. }
  31241. }
  31242. }
  31243. }
  31244. }
  31245. });
  31246. Ext.define('Ext.fx.target.ElementCSS', {
  31247. extend: 'Ext.fx.target.Element',
  31248. setAttr: function(targetData, isFirstFrame) {
  31249. var cssArr = {
  31250. attrs: [],
  31251. duration: [],
  31252. easing: []
  31253. },
  31254. ln = targetData.length,
  31255. attributes,
  31256. attrs,
  31257. attr,
  31258. easing,
  31259. duration,
  31260. o,
  31261. i,
  31262. j,
  31263. ln2;
  31264. for (i = 0; i < ln; i++) {
  31265. attrs = targetData[i];
  31266. duration = attrs.duration;
  31267. easing = attrs.easing;
  31268. attrs = attrs.attrs;
  31269. for (attr in attrs) {
  31270. if (Ext.Array.indexOf(cssArr.attrs, attr) == -1) {
  31271. cssArr.attrs.push(attr.replace(/[A-Z]/g, function(v) {
  31272. return '-' + v.toLowerCase();
  31273. }));
  31274. cssArr.duration.push(duration + 'ms');
  31275. cssArr.easing.push(easing);
  31276. }
  31277. }
  31278. }
  31279. attributes = cssArr.attrs.join(',');
  31280. duration = cssArr.duration.join(',');
  31281. easing = cssArr.easing.join(', ');
  31282. for (i = 0; i < ln; i++) {
  31283. attrs = targetData[i].attrs;
  31284. for (attr in attrs) {
  31285. ln2 = attrs[attr].length;
  31286. for (j = 0; j < ln2; j++) {
  31287. o = attrs[attr][j];
  31288. o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionProperty', isFirstFrame ? '' : attributes);
  31289. o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionDuration', isFirstFrame ? '' : duration);
  31290. o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionTimingFunction', isFirstFrame ? '' : easing);
  31291. o[0].setStyle(attr, o[1]);
  31292. if (isFirstFrame) {
  31293. o = o[0].dom.offsetWidth;
  31294. }
  31295. else {
  31296. o[0].on(Ext.supports.CSS3TransitionEnd, function() {
  31297. this.setStyle(Ext.supports.CSS3Prefix + 'TransitionProperty', null);
  31298. this.setStyle(Ext.supports.CSS3Prefix + 'TransitionDuration', null);
  31299. this.setStyle(Ext.supports.CSS3Prefix + 'TransitionTimingFunction', null);
  31300. }, o[0], { single: true });
  31301. }
  31302. }
  31303. }
  31304. }
  31305. }
  31306. });
  31307. Ext.define('Ext.fx.target.CompositeElement', {
  31308. extend: 'Ext.fx.target.Element',
  31309. isComposite: true,
  31310. constructor: function(target) {
  31311. target.id = target.id || Ext.id(null, 'ext-composite-');
  31312. this.callParent([target]);
  31313. },
  31314. getAttr: function(attr, val) {
  31315. var out = [],
  31316. elements = this.target.elements,
  31317. length = elements.length,
  31318. i,
  31319. el;
  31320. for (i = 0; i < length; i++) {
  31321. el = elements[i];
  31322. if (el) {
  31323. el = this.target.getElement(el);
  31324. out.push([el, this.getElVal(el, attr, val)]);
  31325. }
  31326. }
  31327. return out;
  31328. }
  31329. });
  31330. Ext.define('Ext.fx.target.CompositeElementCSS', {
  31331. extend: 'Ext.fx.target.CompositeElement',
  31332. requires: ['Ext.fx.target.ElementCSS'],
  31333. setAttr: function() {
  31334. return Ext.fx.target.ElementCSS.prototype.setAttr.apply(this, arguments);
  31335. }
  31336. });
  31337. Ext.define('Ext.fx.target.Sprite', {
  31338. extend: 'Ext.fx.target.Target',
  31339. type: 'draw',
  31340. getFromPrim: function (sprite, attr) {
  31341. var obj;
  31342. switch (attr) {
  31343. case 'rotate':
  31344. case 'rotation':
  31345. obj = sprite.attr.rotation;
  31346. return {
  31347. x: obj.x || 0,
  31348. y: obj.y || 0,
  31349. degrees: obj.degrees || 0
  31350. };
  31351. case 'scale':
  31352. case 'scaling':
  31353. obj = sprite.attr.scaling;
  31354. return {
  31355. x: obj.x || 1,
  31356. y: obj.y || 1,
  31357. cx: obj.cx || 0,
  31358. cy: obj.cy || 0
  31359. };
  31360. case 'translate':
  31361. case 'translation':
  31362. obj = sprite.attr.translation;
  31363. return {
  31364. x: obj.x || 0,
  31365. y: obj.y || 0
  31366. };
  31367. default:
  31368. return sprite.attr[attr];
  31369. }
  31370. },
  31371. getAttr: function (attr, val) {
  31372. return [
  31373. [this.target, val != undefined ? val : this.getFromPrim(this.target, attr)]
  31374. ];
  31375. },
  31376. setAttr: function (targetData) {
  31377. var ln = targetData.length,
  31378. spriteArr = [],
  31379. attrsConf, attr, attrArr, attrs, sprite, idx, value, i, j, x, y, ln2;
  31380. for (i = 0; i < ln; i++) {
  31381. attrsConf = targetData[i].attrs;
  31382. for (attr in attrsConf) {
  31383. attrArr = attrsConf[attr];
  31384. ln2 = attrArr.length;
  31385. for (j = 0; j < ln2; j++) {
  31386. sprite = attrArr[j][0];
  31387. attrs = attrArr[j][1];
  31388. if (attr === 'translate' || attr === 'translation') {
  31389. value = {
  31390. x: attrs.x,
  31391. y: attrs.y
  31392. };
  31393. }
  31394. else if (attr === 'rotate' || attr === 'rotation') {
  31395. x = attrs.x;
  31396. if (isNaN(x)) {
  31397. x = null;
  31398. }
  31399. y = attrs.y;
  31400. if (isNaN(y)) {
  31401. y = null;
  31402. }
  31403. value = {
  31404. degrees: attrs.degrees,
  31405. x: x,
  31406. y: y
  31407. };
  31408. } else if (attr === 'scale' || attr === 'scaling') {
  31409. x = attrs.x;
  31410. if (isNaN(x)) {
  31411. x = null;
  31412. }
  31413. y = attrs.y;
  31414. if (isNaN(y)) {
  31415. y = null;
  31416. }
  31417. value = {
  31418. x: x,
  31419. y: y,
  31420. cx: attrs.cx,
  31421. cy: attrs.cy
  31422. };
  31423. }
  31424. else if (attr === 'width' || attr === 'height' || attr === 'x' || attr === 'y') {
  31425. value = parseFloat(attrs);
  31426. }
  31427. else {
  31428. value = attrs;
  31429. }
  31430. idx = Ext.Array.indexOf(spriteArr, sprite);
  31431. if (idx == -1) {
  31432. spriteArr.push([sprite, {}]);
  31433. idx = spriteArr.length - 1;
  31434. }
  31435. spriteArr[idx][1][attr] = value;
  31436. }
  31437. }
  31438. }
  31439. ln = spriteArr.length;
  31440. for (i = 0; i < ln; i++) {
  31441. spriteArr[i][0].setAttributes(spriteArr[i][1]);
  31442. }
  31443. this.target.redraw();
  31444. }
  31445. });
  31446. Ext.define('Ext.fx.target.CompositeSprite', {
  31447. extend: 'Ext.fx.target.Sprite',
  31448. getAttr: function(attr, val) {
  31449. var out = [],
  31450. sprites = [].concat(this.target.items),
  31451. length = sprites.length,
  31452. i,
  31453. sprite;
  31454. for (i = 0; i < length; i++) {
  31455. sprite = sprites[i];
  31456. out.push([sprite, val != undefined ? val : this.getFromPrim(sprite, attr)]);
  31457. }
  31458. return out;
  31459. }
  31460. });
  31461. Ext.define('Ext.fx.target.Component', {
  31462. extend: 'Ext.fx.target.Target',
  31463. type: 'component',
  31464. getPropMethod: {
  31465. top: function() {
  31466. return this.getPosition(true)[1];
  31467. },
  31468. left: function() {
  31469. return this.getPosition(true)[0];
  31470. },
  31471. x: function() {
  31472. return this.getPosition()[0];
  31473. },
  31474. y: function() {
  31475. return this.getPosition()[1];
  31476. },
  31477. height: function() {
  31478. return this.getHeight();
  31479. },
  31480. width: function() {
  31481. return this.getWidth();
  31482. },
  31483. opacity: function() {
  31484. return this.el.getStyle('opacity');
  31485. }
  31486. },
  31487. compMethod: {
  31488. top: 'setPosition',
  31489. left: 'setPosition',
  31490. x: 'setPagePosition',
  31491. y: 'setPagePosition',
  31492. height: 'setSize',
  31493. width: 'setSize',
  31494. opacity: 'setOpacity'
  31495. },
  31496. getAttr: function(attr, val) {
  31497. return [[this.target, val !== undefined ? val : this.getPropMethod[attr].call(this.target)]];
  31498. },
  31499. setAttr: function(targetData, isFirstFrame, isLastFrame) {
  31500. var me = this,
  31501. target = me.target,
  31502. ln = targetData.length,
  31503. attrs, attr, o, i, j, meth, targets, left, top, w, h;
  31504. for (i = 0; i < ln; i++) {
  31505. attrs = targetData[i].attrs;
  31506. for (attr in attrs) {
  31507. targets = attrs[attr].length;
  31508. meth = {
  31509. setPosition: {},
  31510. setPagePosition: {},
  31511. setSize: {},
  31512. setOpacity: {}
  31513. };
  31514. for (j = 0; j < targets; j++) {
  31515. o = attrs[attr][j];
  31516. meth[me.compMethod[attr]].target = o[0];
  31517. meth[me.compMethod[attr]][attr] = o[1];
  31518. }
  31519. if (meth.setPosition.target) {
  31520. o = meth.setPosition;
  31521. left = (o.left === undefined) ? undefined : parseFloat(o.left);
  31522. top = (o.top === undefined) ? undefined : parseFloat(o.top);
  31523. o.target.setPosition(left, top);
  31524. }
  31525. if (meth.setPagePosition.target) {
  31526. o = meth.setPagePosition;
  31527. o.target.setPagePosition(o.x, o.y);
  31528. }
  31529. if (meth.setSize.target) {
  31530. o = meth.setSize;
  31531. w = (o.width === undefined) ? o.target.getWidth() : parseFloat(o.width);
  31532. h = (o.height === undefined) ? o.target.getHeight() : parseFloat(o.height);
  31533. if (isLastFrame || me.dynamic) {
  31534. o.target.setSize(w, h);
  31535. } else {
  31536. o.target.el.setSize(w, h);
  31537. }
  31538. }
  31539. if (meth.setOpacity.target) {
  31540. o = meth.setOpacity;
  31541. o.target.el.setStyle('opacity', o.opacity);
  31542. }
  31543. }
  31544. }
  31545. }
  31546. });
  31547. Ext.define('Ext.fx.Queue', {
  31548. requires: ['Ext.util.HashMap'],
  31549. constructor: function() {
  31550. this.targets = new Ext.util.HashMap();
  31551. this.fxQueue = {};
  31552. },
  31553. getFxDefaults: function(targetId) {
  31554. var target = this.targets.get(targetId);
  31555. if (target) {
  31556. return target.fxDefaults;
  31557. }
  31558. return {};
  31559. },
  31560. setFxDefaults: function(targetId, obj) {
  31561. var target = this.targets.get(targetId);
  31562. if (target) {
  31563. target.fxDefaults = Ext.apply(target.fxDefaults || {}, obj);
  31564. }
  31565. },
  31566. stopAnimation: function(targetId) {
  31567. var me = this,
  31568. queue = me.getFxQueue(targetId),
  31569. ln = queue.length;
  31570. while (ln) {
  31571. queue[ln - 1].end();
  31572. ln--;
  31573. }
  31574. },
  31575. getActiveAnimation: function(targetId) {
  31576. var queue = this.getFxQueue(targetId);
  31577. return (queue && !!queue.length) ? queue[0] : false;
  31578. },
  31579. hasFxBlock: function(targetId) {
  31580. var queue = this.getFxQueue(targetId);
  31581. return queue && queue[0] && queue[0].block;
  31582. },
  31583. getFxQueue: function(targetId) {
  31584. if (!targetId) {
  31585. return false;
  31586. }
  31587. var me = this,
  31588. queue = me.fxQueue[targetId],
  31589. target = me.targets.get(targetId);
  31590. if (!target) {
  31591. return false;
  31592. }
  31593. if (!queue) {
  31594. me.fxQueue[targetId] = [];
  31595. if (target.type != 'element') {
  31596. target.target.on('destroy', function() {
  31597. me.fxQueue[targetId] = [];
  31598. });
  31599. }
  31600. }
  31601. return me.fxQueue[targetId];
  31602. },
  31603. queueFx: function(anim) {
  31604. var me = this,
  31605. target = anim.target,
  31606. queue, ln;
  31607. if (!target) {
  31608. return;
  31609. }
  31610. queue = me.getFxQueue(target.getId());
  31611. ln = queue.length;
  31612. if (ln) {
  31613. if (anim.concurrent) {
  31614. anim.paused = false;
  31615. }
  31616. else {
  31617. queue[ln - 1].on('afteranimate', function() {
  31618. anim.paused = false;
  31619. });
  31620. }
  31621. }
  31622. else {
  31623. anim.paused = false;
  31624. }
  31625. anim.on('afteranimate', function() {
  31626. Ext.Array.remove(queue, anim);
  31627. if (anim.remove) {
  31628. if (target.type == 'element') {
  31629. var el = Ext.get(target.id);
  31630. if (el) {
  31631. el.remove();
  31632. }
  31633. }
  31634. }
  31635. }, this);
  31636. queue.push(anim);
  31637. }
  31638. });
  31639. Ext.define('Ext.fx.Manager', {
  31640. singleton: true,
  31641. requires: ['Ext.util.MixedCollection',
  31642. 'Ext.fx.target.Element',
  31643. 'Ext.fx.target.ElementCSS',
  31644. 'Ext.fx.target.CompositeElement',
  31645. 'Ext.fx.target.CompositeElementCSS',
  31646. 'Ext.fx.target.Sprite',
  31647. 'Ext.fx.target.CompositeSprite',
  31648. 'Ext.fx.target.Component'],
  31649. mixins: {
  31650. queue: 'Ext.fx.Queue'
  31651. },
  31652. constructor: function() {
  31653. this.items = new Ext.util.MixedCollection();
  31654. this.mixins.queue.constructor.call(this);
  31655. },
  31656. interval: 16,
  31657. forceJS: true,
  31658. createTarget: function(target) {
  31659. var me = this,
  31660. useCSS3 = !me.forceJS && Ext.supports.Transitions,
  31661. targetObj;
  31662. me.useCSS3 = useCSS3;
  31663. if (target) {
  31664. if (target.tagName || Ext.isString(target) || target.isFly) {
  31665. target = Ext.get(target);
  31666. targetObj = new Ext.fx.target['Element' + (useCSS3 ? 'CSS' : '')](target);
  31667. }
  31668. else if (target.dom) {
  31669. targetObj = new Ext.fx.target['Element' + (useCSS3 ? 'CSS' : '')](target);
  31670. }
  31671. else if (target.isComposite) {
  31672. targetObj = new Ext.fx.target['CompositeElement' + (useCSS3 ? 'CSS' : '')](target);
  31673. }
  31674. else if (target.isSprite) {
  31675. targetObj = new Ext.fx.target.Sprite(target);
  31676. }
  31677. else if (target.isCompositeSprite) {
  31678. targetObj = new Ext.fx.target.CompositeSprite(target);
  31679. }
  31680. else if (target.isComponent) {
  31681. targetObj = new Ext.fx.target.Component(target);
  31682. }
  31683. else if (target.isAnimTarget) {
  31684. return target;
  31685. }
  31686. else {
  31687. return null;
  31688. }
  31689. me.targets.add(targetObj);
  31690. return targetObj;
  31691. }
  31692. else {
  31693. return null;
  31694. }
  31695. },
  31696. addAnim: function(anim) {
  31697. var items = this.items,
  31698. task = this.task;
  31699. items.add(anim.id, anim);
  31700. if (!task && items.length) {
  31701. task = this.task = {
  31702. run: this.runner,
  31703. interval: this.interval,
  31704. scope: this
  31705. };
  31706. Ext.TaskManager.start(task);
  31707. }
  31708. },
  31709. removeAnim: function(anim) {
  31710. var me = this,
  31711. items = me.items,
  31712. task = me.task;
  31713. items.removeAtKey(anim.id);
  31714. if (task && !items.length) {
  31715. Ext.TaskManager.stop(task);
  31716. delete me.task;
  31717. }
  31718. },
  31719. runner: function() {
  31720. var me = this,
  31721. items = me.items.getRange(),
  31722. i = 0,
  31723. len = items.length,
  31724. anim;
  31725. me.targetArr = {};
  31726. me.timestamp = new Date();
  31727. for (; i < len; i++) {
  31728. anim = items[i];
  31729. if (anim.isReady()) {
  31730. me.startAnim(anim);
  31731. }
  31732. }
  31733. for (i = 0; i < len; i++) {
  31734. anim = items[i];
  31735. if (anim.isRunning()) {
  31736. me.runAnim(anim);
  31737. }
  31738. }
  31739. me.applyPendingAttrs();
  31740. },
  31741. startAnim: function(anim) {
  31742. anim.start(this.timestamp);
  31743. },
  31744. runAnim: function(anim) {
  31745. if (!anim) {
  31746. return;
  31747. }
  31748. var me = this,
  31749. targetId = anim.target.getId(),
  31750. useCSS3 = me.useCSS3 && anim.target.type == 'element',
  31751. elapsedTime = me.timestamp - anim.startTime,
  31752. lastFrame = (elapsedTime >= anim.duration),
  31753. target, o;
  31754. target = this.collectTargetData(anim, elapsedTime, useCSS3, lastFrame);
  31755. if (useCSS3) {
  31756. anim.target.setAttr(target.anims[anim.id].attributes, true);
  31757. me.collectTargetData(anim, anim.duration, useCSS3, lastFrame);
  31758. anim.paused = true;
  31759. target = anim.target.target;
  31760. if (anim.target.isComposite) {
  31761. target = anim.target.target.last();
  31762. }
  31763. o = {};
  31764. o[Ext.supports.CSS3TransitionEnd] = anim.lastFrame;
  31765. o.scope = anim;
  31766. o.single = true;
  31767. target.on(o);
  31768. }
  31769. },
  31770. collectTargetData: function(anim, elapsedTime, useCSS3, isLastFrame) {
  31771. var targetId = anim.target.getId(),
  31772. target = this.targetArr[targetId];
  31773. if (!target) {
  31774. target = this.targetArr[targetId] = {
  31775. id: targetId,
  31776. el: anim.target,
  31777. anims: {}
  31778. };
  31779. }
  31780. target.anims[anim.id] = {
  31781. id: anim.id,
  31782. anim: anim,
  31783. elapsed: elapsedTime,
  31784. isLastFrame: isLastFrame,
  31785. attributes: [{
  31786. duration: anim.duration,
  31787. easing: (useCSS3 && anim.reverse) ? anim.easingFn.reverse().toCSS3() : anim.easing,
  31788. attrs: anim.runAnim(elapsedTime)
  31789. }]
  31790. };
  31791. return target;
  31792. },
  31793. applyPendingAttrs: function() {
  31794. var targetArr = this.targetArr,
  31795. target, targetId, animWrap, anim, animId;
  31796. for (targetId in targetArr) {
  31797. if (targetArr.hasOwnProperty(targetId)) {
  31798. target = targetArr[targetId];
  31799. for (animId in target.anims) {
  31800. if (target.anims.hasOwnProperty(animId)) {
  31801. animWrap = target.anims[animId];
  31802. anim = animWrap.anim;
  31803. if (animWrap.attributes && anim.isRunning()) {
  31804. target.el.setAttr(animWrap.attributes, false, animWrap.isLastFrame);
  31805. if (animWrap.isLastFrame) {
  31806. anim.lastFrame();
  31807. }
  31808. }
  31809. }
  31810. }
  31811. }
  31812. }
  31813. }
  31814. });
  31815. Ext.define('Ext.fx.Animator', {
  31816. mixins: {
  31817. observable: 'Ext.util.Observable'
  31818. },
  31819. requires: ['Ext.fx.Manager'],
  31820. isAnimator: true,
  31821. duration: 250,
  31822. delay: 0,
  31823. delayStart: 0,
  31824. dynamic: false,
  31825. easing: 'ease',
  31826. running: false,
  31827. paused: false,
  31828. damper: 1,
  31829. iterations: 1,
  31830. currentIteration: 0,
  31831. keyframeStep: 0,
  31832. animKeyFramesRE: /^(from|to|\d+%?)$/,
  31833. constructor: function(config) {
  31834. var me = this;
  31835. config = Ext.apply(me, config || {});
  31836. me.config = config;
  31837. me.id = Ext.id(null, 'ext-animator-');
  31838. me.addEvents(
  31839. 'beforeanimate',
  31840. 'keyframe',
  31841. 'afteranimate'
  31842. );
  31843. me.mixins.observable.constructor.call(me, config);
  31844. me.timeline = [];
  31845. me.createTimeline(me.keyframes);
  31846. if (me.target) {
  31847. me.applyAnimator(me.target);
  31848. Ext.fx.Manager.addAnim(me);
  31849. }
  31850. },
  31851. sorter: function (a, b) {
  31852. return a.pct - b.pct;
  31853. },
  31854. createTimeline: function(keyframes) {
  31855. var me = this,
  31856. attrs = [],
  31857. to = me.to || {},
  31858. duration = me.duration,
  31859. prevMs, ms, i, ln, pct, anim, nextAnim, attr;
  31860. for (pct in keyframes) {
  31861. if (keyframes.hasOwnProperty(pct) && me.animKeyFramesRE.test(pct)) {
  31862. attr = {attrs: Ext.apply(keyframes[pct], to)};
  31863. if (pct == "from") {
  31864. pct = 0;
  31865. }
  31866. else if (pct == "to") {
  31867. pct = 100;
  31868. }
  31869. attr.pct = parseInt(pct, 10);
  31870. attrs.push(attr);
  31871. }
  31872. }
  31873. Ext.Array.sort(attrs, me.sorter);
  31874. ln = attrs.length;
  31875. for (i = 0; i < ln; i++) {
  31876. prevMs = (attrs[i - 1]) ? duration * (attrs[i - 1].pct / 100) : 0;
  31877. ms = duration * (attrs[i].pct / 100);
  31878. me.timeline.push({
  31879. duration: ms - prevMs,
  31880. attrs: attrs[i].attrs
  31881. });
  31882. }
  31883. },
  31884. applyAnimator: function(target) {
  31885. var me = this,
  31886. anims = [],
  31887. timeline = me.timeline,
  31888. reverse = me.reverse,
  31889. ln = timeline.length,
  31890. anim, easing, damper, initial, attrs, lastAttrs, i;
  31891. if (me.fireEvent('beforeanimate', me) !== false) {
  31892. for (i = 0; i < ln; i++) {
  31893. anim = timeline[i];
  31894. attrs = anim.attrs;
  31895. easing = attrs.easing || me.easing;
  31896. damper = attrs.damper || me.damper;
  31897. delete attrs.easing;
  31898. delete attrs.damper;
  31899. anim = new Ext.fx.Anim({
  31900. target: target,
  31901. easing: easing,
  31902. damper: damper,
  31903. duration: anim.duration,
  31904. paused: true,
  31905. to: attrs
  31906. });
  31907. anims.push(anim);
  31908. }
  31909. me.animations = anims;
  31910. me.target = anim.target;
  31911. for (i = 0; i < ln - 1; i++) {
  31912. anim = anims[i];
  31913. anim.nextAnim = anims[i + 1];
  31914. anim.on('afteranimate', function() {
  31915. this.nextAnim.paused = false;
  31916. });
  31917. anim.on('afteranimate', function() {
  31918. this.fireEvent('keyframe', this, ++this.keyframeStep);
  31919. }, me);
  31920. }
  31921. anims[ln - 1].on('afteranimate', function() {
  31922. this.lastFrame();
  31923. }, me);
  31924. }
  31925. },
  31926. start: function(startTime) {
  31927. var me = this,
  31928. delay = me.delay,
  31929. delayStart = me.delayStart,
  31930. delayDelta;
  31931. if (delay) {
  31932. if (!delayStart) {
  31933. me.delayStart = startTime;
  31934. return;
  31935. }
  31936. else {
  31937. delayDelta = startTime - delayStart;
  31938. if (delayDelta < delay) {
  31939. return;
  31940. }
  31941. else {
  31942. startTime = new Date(delayStart.getTime() + delay);
  31943. }
  31944. }
  31945. }
  31946. if (me.fireEvent('beforeanimate', me) !== false) {
  31947. me.startTime = startTime;
  31948. me.running = true;
  31949. me.animations[me.keyframeStep].paused = false;
  31950. }
  31951. },
  31952. lastFrame: function() {
  31953. var me = this,
  31954. iter = me.iterations,
  31955. iterCount = me.currentIteration;
  31956. iterCount++;
  31957. if (iterCount < iter) {
  31958. me.startTime = new Date();
  31959. me.currentIteration = iterCount;
  31960. me.keyframeStep = 0;
  31961. me.applyAnimator(me.target);
  31962. me.animations[me.keyframeStep].paused = false;
  31963. }
  31964. else {
  31965. me.currentIteration = 0;
  31966. me.end();
  31967. }
  31968. },
  31969. end: function() {
  31970. var me = this;
  31971. me.fireEvent('afteranimate', me, me.startTime, new Date() - me.startTime);
  31972. },
  31973. isReady: function() {
  31974. return this.paused === false && this.running === false && this.iterations > 0;
  31975. },
  31976. isRunning: function() {
  31977. return false;
  31978. }
  31979. });
  31980. Ext.define('Ext.fx.CubicBezier', {
  31981. singleton: true,
  31982. cubicBezierAtTime: function(t, p1x, p1y, p2x, p2y, duration) {
  31983. var cx = 3 * p1x,
  31984. bx = 3 * (p2x - p1x) - cx,
  31985. ax = 1 - cx - bx,
  31986. cy = 3 * p1y,
  31987. by = 3 * (p2y - p1y) - cy,
  31988. ay = 1 - cy - by;
  31989. function sampleCurveX(t) {
  31990. return ((ax * t + bx) * t + cx) * t;
  31991. }
  31992. function solve(x, epsilon) {
  31993. var t = solveCurveX(x, epsilon);
  31994. return ((ay * t + by) * t + cy) * t;
  31995. }
  31996. function solveCurveX(x, epsilon) {
  31997. var t0, t1, t2, x2, d2, i;
  31998. for (t2 = x, i = 0; i < 8; i++) {
  31999. x2 = sampleCurveX(t2) - x;
  32000. if (Math.abs(x2) < epsilon) {
  32001. return t2;
  32002. }
  32003. d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;
  32004. if (Math.abs(d2) < 1e-6) {
  32005. break;
  32006. }
  32007. t2 = t2 - x2 / d2;
  32008. }
  32009. t0 = 0;
  32010. t1 = 1;
  32011. t2 = x;
  32012. if (t2 < t0) {
  32013. return t0;
  32014. }
  32015. if (t2 > t1) {
  32016. return t1;
  32017. }
  32018. while (t0 < t1) {
  32019. x2 = sampleCurveX(t2);
  32020. if (Math.abs(x2 - x) < epsilon) {
  32021. return t2;
  32022. }
  32023. if (x > x2) {
  32024. t0 = t2;
  32025. } else {
  32026. t1 = t2;
  32027. }
  32028. t2 = (t1 - t0) / 2 + t0;
  32029. }
  32030. return t2;
  32031. }
  32032. return solve(t, 1 / (200 * duration));
  32033. },
  32034. cubicBezier: function(x1, y1, x2, y2) {
  32035. var fn = function(pos) {
  32036. return Ext.fx.CubicBezier.cubicBezierAtTime(pos, x1, y1, x2, y2, 1);
  32037. };
  32038. fn.toCSS3 = function() {
  32039. return 'cubic-bezier(' + [x1, y1, x2, y2].join(',') + ')';
  32040. };
  32041. fn.reverse = function() {
  32042. return Ext.fx.CubicBezier.cubicBezier(1 - x2, 1 - y2, 1 - x1, 1 - y1);
  32043. };
  32044. return fn;
  32045. }
  32046. });
  32047. //@define Ext.fx.Easing
  32048. Ext.ns('Ext.fx');
  32049. Ext.require('Ext.fx.CubicBezier', function() {
  32050. var math = Math,
  32051. pi = math.PI,
  32052. pow = math.pow,
  32053. sin = math.sin,
  32054. sqrt = math.sqrt,
  32055. abs = math.abs,
  32056. backInSeed = 1.70158;
  32057. Ext.fx.Easing = {
  32058. };
  32059. Ext.apply(Ext.fx.Easing, {
  32060. linear: function(n) {
  32061. return n;
  32062. },
  32063. ease: function(n) {
  32064. var q = 0.07813 - n / 2,
  32065. alpha = -0.25,
  32066. Q = sqrt(0.0066 + q * q),
  32067. x = Q - q,
  32068. X = pow(abs(x), 1/3) * (x < 0 ? -1 : 1),
  32069. y = -Q - q,
  32070. Y = pow(abs(y), 1/3) * (y < 0 ? -1 : 1),
  32071. t = X + Y + 0.25;
  32072. return pow(1 - t, 2) * 3 * t * 0.1 + (1 - t) * 3 * t * t + t * t * t;
  32073. },
  32074. easeIn: function (n) {
  32075. return pow(n, 1.7);
  32076. },
  32077. easeOut: function (n) {
  32078. return pow(n, 0.48);
  32079. },
  32080. easeInOut: function(n) {
  32081. var q = 0.48 - n / 1.04,
  32082. Q = sqrt(0.1734 + q * q),
  32083. x = Q - q,
  32084. X = pow(abs(x), 1/3) * (x < 0 ? -1 : 1),
  32085. y = -Q - q,
  32086. Y = pow(abs(y), 1/3) * (y < 0 ? -1 : 1),
  32087. t = X + Y + 0.5;
  32088. return (1 - t) * 3 * t * t + t * t * t;
  32089. },
  32090. backIn: function (n) {
  32091. return n * n * ((backInSeed + 1) * n - backInSeed);
  32092. },
  32093. backOut: function (n) {
  32094. n = n - 1;
  32095. return n * n * ((backInSeed + 1) * n + backInSeed) + 1;
  32096. },
  32097. elasticIn: function (n) {
  32098. if (n === 0 || n === 1) {
  32099. return n;
  32100. }
  32101. var p = 0.3,
  32102. s = p / 4;
  32103. return pow(2, -10 * n) * sin((n - s) * (2 * pi) / p) + 1;
  32104. },
  32105. elasticOut: function (n) {
  32106. return 1 - Ext.fx.Easing.elasticIn(1 - n);
  32107. },
  32108. bounceIn: function (n) {
  32109. return 1 - Ext.fx.Easing.bounceOut(1 - n);
  32110. },
  32111. bounceOut: function (n) {
  32112. var s = 7.5625,
  32113. p = 2.75,
  32114. l;
  32115. if (n < (1 / p)) {
  32116. l = s * n * n;
  32117. } else {
  32118. if (n < (2 / p)) {
  32119. n -= (1.5 / p);
  32120. l = s * n * n + 0.75;
  32121. } else {
  32122. if (n < (2.5 / p)) {
  32123. n -= (2.25 / p);
  32124. l = s * n * n + 0.9375;
  32125. } else {
  32126. n -= (2.625 / p);
  32127. l = s * n * n + 0.984375;
  32128. }
  32129. }
  32130. }
  32131. return l;
  32132. }
  32133. });
  32134. Ext.apply(Ext.fx.Easing, {
  32135. 'back-in': Ext.fx.Easing.backIn,
  32136. 'back-out': Ext.fx.Easing.backOut,
  32137. 'ease-in': Ext.fx.Easing.easeIn,
  32138. 'ease-out': Ext.fx.Easing.easeOut,
  32139. 'elastic-in': Ext.fx.Easing.elasticIn,
  32140. 'elastic-out': Ext.fx.Easing.elasticIn,
  32141. 'bounce-in': Ext.fx.Easing.bounceIn,
  32142. 'bounce-out': Ext.fx.Easing.bounceOut,
  32143. 'ease-in-out': Ext.fx.Easing.easeInOut
  32144. });
  32145. });
  32146. Ext.define('Ext.draw.Color', {
  32147. colorToHexRe: /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/,
  32148. rgbRe: /\s*rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)\s*/,
  32149. hexRe: /\s*#([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)\s*/,
  32150. lightnessFactor: 0.2,
  32151. constructor : function(red, green, blue) {
  32152. var me = this,
  32153. clamp = Ext.Number.constrain;
  32154. me.r = clamp(red, 0, 255);
  32155. me.g = clamp(green, 0, 255);
  32156. me.b = clamp(blue, 0, 255);
  32157. },
  32158. getRed: function() {
  32159. return this.r;
  32160. },
  32161. getGreen: function() {
  32162. return this.g;
  32163. },
  32164. getBlue: function() {
  32165. return this.b;
  32166. },
  32167. getRGB: function() {
  32168. var me = this;
  32169. return [me.r, me.g, me.b];
  32170. },
  32171. getHSL: function() {
  32172. var me = this,
  32173. r = me.r / 255,
  32174. g = me.g / 255,
  32175. b = me.b / 255,
  32176. max = Math.max(r, g, b),
  32177. min = Math.min(r, g, b),
  32178. delta = max - min,
  32179. h,
  32180. s = 0,
  32181. l = 0.5 * (max + min);
  32182. if (min != max) {
  32183. s = (l < 0.5) ? delta / (max + min) : delta / (2 - max - min);
  32184. if (r == max) {
  32185. h = 60 * (g - b) / delta;
  32186. } else if (g == max) {
  32187. h = 120 + 60 * (b - r) / delta;
  32188. } else {
  32189. h = 240 + 60 * (r - g) / delta;
  32190. }
  32191. if (h < 0) {
  32192. h += 360;
  32193. }
  32194. if (h >= 360) {
  32195. h -= 360;
  32196. }
  32197. }
  32198. return [h, s, l];
  32199. },
  32200. getLighter: function(factor) {
  32201. var hsl = this.getHSL();
  32202. factor = factor || this.lightnessFactor;
  32203. hsl[2] = Ext.Number.constrain(hsl[2] + factor, 0, 1);
  32204. return this.fromHSL(hsl[0], hsl[1], hsl[2]);
  32205. },
  32206. getDarker: function(factor) {
  32207. factor = factor || this.lightnessFactor;
  32208. return this.getLighter(-factor);
  32209. },
  32210. toString: function() {
  32211. var me = this,
  32212. round = Math.round,
  32213. r = round(me.r).toString(16),
  32214. g = round(me.g).toString(16),
  32215. b = round(me.b).toString(16);
  32216. r = (r.length == 1) ? '0' + r : r;
  32217. g = (g.length == 1) ? '0' + g : g;
  32218. b = (b.length == 1) ? '0' + b : b;
  32219. return ['#', r, g, b].join('');
  32220. },
  32221. toHex: function(color) {
  32222. if (Ext.isArray(color)) {
  32223. color = color[0];
  32224. }
  32225. if (!Ext.isString(color)) {
  32226. return '';
  32227. }
  32228. if (color.substr(0, 1) === '#') {
  32229. return color;
  32230. }
  32231. var digits = this.colorToHexRe.exec(color),
  32232. red,
  32233. green,
  32234. blue,
  32235. rgb;
  32236. if (Ext.isArray(digits)) {
  32237. red = parseInt(digits[2], 10);
  32238. green = parseInt(digits[3], 10);
  32239. blue = parseInt(digits[4], 10);
  32240. rgb = blue | (green << 8) | (red << 16);
  32241. return digits[1] + '#' + ("000000" + rgb.toString(16)).slice(-6);
  32242. }
  32243. else {
  32244. return color;
  32245. }
  32246. },
  32247. fromString: function(str) {
  32248. var values, r, g, b,
  32249. parse = parseInt;
  32250. if ((str.length == 4 || str.length == 7) && str.substr(0, 1) === '#') {
  32251. values = str.match(this.hexRe);
  32252. if (values) {
  32253. r = parse(values[1], 16) >> 0;
  32254. g = parse(values[2], 16) >> 0;
  32255. b = parse(values[3], 16) >> 0;
  32256. if (str.length == 4) {
  32257. r += (r * 16);
  32258. g += (g * 16);
  32259. b += (b * 16);
  32260. }
  32261. }
  32262. }
  32263. else {
  32264. values = str.match(this.rgbRe);
  32265. if (values) {
  32266. r = values[1];
  32267. g = values[2];
  32268. b = values[3];
  32269. }
  32270. }
  32271. return (typeof r == 'undefined') ? undefined : new Ext.draw.Color(r, g, b);
  32272. },
  32273. getGrayscale: function() {
  32274. return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;
  32275. },
  32276. fromHSL: function(h, s, l) {
  32277. var C, X, m, i, rgb = [],
  32278. abs = Math.abs,
  32279. floor = Math.floor;
  32280. if (s == 0 || h == null) {
  32281. rgb = [l, l, l];
  32282. }
  32283. else {
  32284. h /= 60;
  32285. C = s * (1 - abs(2 * l - 1));
  32286. X = C * (1 - abs(h - 2 * floor(h / 2) - 1));
  32287. m = l - C / 2;
  32288. switch (floor(h)) {
  32289. case 0:
  32290. rgb = [C, X, 0];
  32291. break;
  32292. case 1:
  32293. rgb = [X, C, 0];
  32294. break;
  32295. case 2:
  32296. rgb = [0, C, X];
  32297. break;
  32298. case 3:
  32299. rgb = [0, X, C];
  32300. break;
  32301. case 4:
  32302. rgb = [X, 0, C];
  32303. break;
  32304. case 5:
  32305. rgb = [C, 0, X];
  32306. break;
  32307. }
  32308. rgb = [rgb[0] + m, rgb[1] + m, rgb[2] + m];
  32309. }
  32310. return new Ext.draw.Color(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255);
  32311. }
  32312. }, function() {
  32313. var prototype = this.prototype;
  32314. this.addStatics({
  32315. fromHSL: function() {
  32316. return prototype.fromHSL.apply(prototype, arguments);
  32317. },
  32318. fromString: function() {
  32319. return prototype.fromString.apply(prototype, arguments);
  32320. },
  32321. toHex: function() {
  32322. return prototype.toHex.apply(prototype, arguments);
  32323. }
  32324. });
  32325. });
  32326. Ext.define('Ext.draw.Draw', {
  32327. singleton: true,
  32328. requires: ['Ext.draw.Color'],
  32329. pathToStringRE: /,?([achlmqrstvxz]),?/gi,
  32330. pathCommandRE: /([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
  32331. pathValuesRE: /(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,
  32332. stopsRE: /^(\d+%?)$/,
  32333. radian: Math.PI / 180,
  32334. availableAnimAttrs: {
  32335. along: "along",
  32336. blur: null,
  32337. "clip-rect": "csv",
  32338. cx: null,
  32339. cy: null,
  32340. fill: "color",
  32341. "fill-opacity": null,
  32342. "font-size": null,
  32343. height: null,
  32344. opacity: null,
  32345. path: "path",
  32346. r: null,
  32347. rotation: "csv",
  32348. rx: null,
  32349. ry: null,
  32350. scale: "csv",
  32351. stroke: "color",
  32352. "stroke-opacity": null,
  32353. "stroke-width": null,
  32354. translation: "csv",
  32355. width: null,
  32356. x: null,
  32357. y: null
  32358. },
  32359. is: function(o, type) {
  32360. type = String(type).toLowerCase();
  32361. return (type == "object" && o === Object(o)) ||
  32362. (type == "undefined" && typeof o == type) ||
  32363. (type == "null" && o === null) ||
  32364. (type == "array" && Array.isArray && Array.isArray(o)) ||
  32365. (Object.prototype.toString.call(o).toLowerCase().slice(8, -1)) == type;
  32366. },
  32367. ellipsePath: function(sprite) {
  32368. var attr = sprite.attr;
  32369. return Ext.String.format("M{0},{1}A{2},{3},0,1,1,{0},{4}A{2},{3},0,1,1,{0},{1}z", attr.x, attr.y - attr.ry, attr.rx, attr.ry, attr.y + attr.ry);
  32370. },
  32371. rectPath: function(sprite) {
  32372. var attr = sprite.attr;
  32373. if (attr.radius) {
  32374. return Ext.String.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z", attr.x + attr.radius, attr.y, attr.width - attr.radius * 2, attr.radius, -attr.radius, attr.height - attr.radius * 2, attr.radius * 2 - attr.width, attr.radius * 2 - attr.height);
  32375. }
  32376. else {
  32377. return Ext.String.format("M{0},{1}L{2},{1},{2},{3},{0},{3}z", attr.x, attr.y, attr.width + attr.x, attr.height + attr.y);
  32378. }
  32379. },
  32380. path2string: function () {
  32381. return this.join(",").replace(Ext.draw.Draw.pathToStringRE, "$1");
  32382. },
  32383. pathToString: function(arrayPath) {
  32384. return arrayPath.join(",").replace(Ext.draw.Draw.pathToStringRE, "$1");
  32385. },
  32386. parsePathString: function (pathString) {
  32387. if (!pathString) {
  32388. return null;
  32389. }
  32390. var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0},
  32391. data = [],
  32392. me = this;
  32393. if (me.is(pathString, "array") && me.is(pathString[0], "array")) {
  32394. data = me.pathClone(pathString);
  32395. }
  32396. if (!data.length) {
  32397. String(pathString).replace(me.pathCommandRE, function (a, b, c) {
  32398. var params = [],
  32399. name = b.toLowerCase();
  32400. c.replace(me.pathValuesRE, function (a, b) {
  32401. b && params.push(+b);
  32402. });
  32403. if (name == "m" && params.length > 2) {
  32404. data.push([b].concat(Ext.Array.splice(params, 0, 2)));
  32405. name = "l";
  32406. b = (b == "m") ? "l" : "L";
  32407. }
  32408. while (params.length >= paramCounts[name]) {
  32409. data.push([b].concat(Ext.Array.splice(params, 0, paramCounts[name])));
  32410. if (!paramCounts[name]) {
  32411. break;
  32412. }
  32413. }
  32414. });
  32415. }
  32416. data.toString = me.path2string;
  32417. return data;
  32418. },
  32419. mapPath: function (path, matrix) {
  32420. if (!matrix) {
  32421. return path;
  32422. }
  32423. var x, y, i, ii, j, jj, pathi;
  32424. path = this.path2curve(path);
  32425. for (i = 0, ii = path.length; i < ii; i++) {
  32426. pathi = path[i];
  32427. for (j = 1, jj = pathi.length; j < jj-1; j += 2) {
  32428. x = matrix.x(pathi[j], pathi[j + 1]);
  32429. y = matrix.y(pathi[j], pathi[j + 1]);
  32430. pathi[j] = x;
  32431. pathi[j + 1] = y;
  32432. }
  32433. }
  32434. return path;
  32435. },
  32436. pathClone: function(pathArray) {
  32437. var res = [],
  32438. j, jj, i, ii;
  32439. if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) {
  32440. pathArray = this.parsePathString(pathArray);
  32441. }
  32442. for (i = 0, ii = pathArray.length; i < ii; i++) {
  32443. res[i] = [];
  32444. for (j = 0, jj = pathArray[i].length; j < jj; j++) {
  32445. res[i][j] = pathArray[i][j];
  32446. }
  32447. }
  32448. res.toString = this.path2string;
  32449. return res;
  32450. },
  32451. pathToAbsolute: function (pathArray) {
  32452. if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) {
  32453. pathArray = this.parsePathString(pathArray);
  32454. }
  32455. var res = [],
  32456. x = 0,
  32457. y = 0,
  32458. mx = 0,
  32459. my = 0,
  32460. i = 0,
  32461. ln = pathArray.length,
  32462. r, pathSegment, j, ln2;
  32463. if (ln && pathArray[0][0] == "M") {
  32464. x = +pathArray[0][1];
  32465. y = +pathArray[0][2];
  32466. mx = x;
  32467. my = y;
  32468. i++;
  32469. res[0] = ["M", x, y];
  32470. }
  32471. for (; i < ln; i++) {
  32472. r = res[i] = [];
  32473. pathSegment = pathArray[i];
  32474. if (pathSegment[0] != pathSegment[0].toUpperCase()) {
  32475. r[0] = pathSegment[0].toUpperCase();
  32476. switch (r[0]) {
  32477. case "A":
  32478. r[1] = pathSegment[1];
  32479. r[2] = pathSegment[2];
  32480. r[3] = pathSegment[3];
  32481. r[4] = pathSegment[4];
  32482. r[5] = pathSegment[5];
  32483. r[6] = +(pathSegment[6] + x);
  32484. r[7] = +(pathSegment[7] + y);
  32485. break;
  32486. case "V":
  32487. r[1] = +pathSegment[1] + y;
  32488. break;
  32489. case "H":
  32490. r[1] = +pathSegment[1] + x;
  32491. break;
  32492. case "M":
  32493. mx = +pathSegment[1] + x;
  32494. my = +pathSegment[2] + y;
  32495. default:
  32496. j = 1;
  32497. ln2 = pathSegment.length;
  32498. for (; j < ln2; j++) {
  32499. r[j] = +pathSegment[j] + ((j % 2) ? x : y);
  32500. }
  32501. }
  32502. }
  32503. else {
  32504. j = 0;
  32505. ln2 = pathSegment.length;
  32506. for (; j < ln2; j++) {
  32507. res[i][j] = pathSegment[j];
  32508. }
  32509. }
  32510. switch (r[0]) {
  32511. case "Z":
  32512. x = mx;
  32513. y = my;
  32514. break;
  32515. case "H":
  32516. x = r[1];
  32517. break;
  32518. case "V":
  32519. y = r[1];
  32520. break;
  32521. case "M":
  32522. pathSegment = res[i];
  32523. ln2 = pathSegment.length;
  32524. mx = pathSegment[ln2 - 2];
  32525. my = pathSegment[ln2 - 1];
  32526. default:
  32527. pathSegment = res[i];
  32528. ln2 = pathSegment.length;
  32529. x = pathSegment[ln2 - 2];
  32530. y = pathSegment[ln2 - 1];
  32531. }
  32532. }
  32533. res.toString = this.path2string;
  32534. return res;
  32535. },
  32536. pathToRelative: function (pathArray) {
  32537. if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) {
  32538. pathArray = this.parsePathString(pathArray);
  32539. }
  32540. var res = [],
  32541. x = 0,
  32542. y = 0,
  32543. mx = 0,
  32544. my = 0,
  32545. start = 0,
  32546. r,
  32547. pa,
  32548. i,
  32549. j,
  32550. k,
  32551. len,
  32552. ii,
  32553. jj,
  32554. kk;
  32555. if (pathArray[0][0] == "M") {
  32556. x = pathArray[0][1];
  32557. y = pathArray[0][2];
  32558. mx = x;
  32559. my = y;
  32560. start++;
  32561. res.push(["M", x, y]);
  32562. }
  32563. for (i = start, ii = pathArray.length; i < ii; i++) {
  32564. r = res[i] = [];
  32565. pa = pathArray[i];
  32566. if (pa[0] != pa[0].toLowerCase()) {
  32567. r[0] = pa[0].toLowerCase();
  32568. switch (r[0]) {
  32569. case "a":
  32570. r[1] = pa[1];
  32571. r[2] = pa[2];
  32572. r[3] = pa[3];
  32573. r[4] = pa[4];
  32574. r[5] = pa[5];
  32575. r[6] = +(pa[6] - x).toFixed(3);
  32576. r[7] = +(pa[7] - y).toFixed(3);
  32577. break;
  32578. case "v":
  32579. r[1] = +(pa[1] - y).toFixed(3);
  32580. break;
  32581. case "m":
  32582. mx = pa[1];
  32583. my = pa[2];
  32584. default:
  32585. for (j = 1, jj = pa.length; j < jj; j++) {
  32586. r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
  32587. }
  32588. }
  32589. } else {
  32590. r = res[i] = [];
  32591. if (pa[0] == "m") {
  32592. mx = pa[1] + x;
  32593. my = pa[2] + y;
  32594. }
  32595. for (k = 0, kk = pa.length; k < kk; k++) {
  32596. res[i][k] = pa[k];
  32597. }
  32598. }
  32599. len = res[i].length;
  32600. switch (res[i][0]) {
  32601. case "z":
  32602. x = mx;
  32603. y = my;
  32604. break;
  32605. case "h":
  32606. x += +res[i][len - 1];
  32607. break;
  32608. case "v":
  32609. y += +res[i][len - 1];
  32610. break;
  32611. default:
  32612. x += +res[i][len - 2];
  32613. y += +res[i][len - 1];
  32614. }
  32615. }
  32616. res.toString = this.path2string;
  32617. return res;
  32618. },
  32619. path2curve: function (path) {
  32620. var me = this,
  32621. points = me.pathToAbsolute(path),
  32622. ln = points.length,
  32623. attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
  32624. i, seg, segLn, point;
  32625. for (i = 0; i < ln; i++) {
  32626. points[i] = me.command2curve(points[i], attrs);
  32627. if (points[i].length > 7) {
  32628. points[i].shift();
  32629. point = points[i];
  32630. while (point.length) {
  32631. Ext.Array.splice(points, i++, 0, ["C"].concat(Ext.Array.splice(point, 0, 6)));
  32632. }
  32633. Ext.Array.erase(points, i, 1);
  32634. ln = points.length;
  32635. i--;
  32636. }
  32637. seg = points[i];
  32638. segLn = seg.length;
  32639. attrs.x = seg[segLn - 2];
  32640. attrs.y = seg[segLn - 1];
  32641. attrs.bx = parseFloat(seg[segLn - 4]) || attrs.x;
  32642. attrs.by = parseFloat(seg[segLn - 3]) || attrs.y;
  32643. }
  32644. return points;
  32645. },
  32646. interpolatePaths: function (path, path2) {
  32647. var me = this,
  32648. p = me.pathToAbsolute(path),
  32649. p2 = me.pathToAbsolute(path2),
  32650. attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
  32651. attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
  32652. fixArc = function (pp, i) {
  32653. if (pp[i].length > 7) {
  32654. pp[i].shift();
  32655. var pi = pp[i];
  32656. while (pi.length) {
  32657. Ext.Array.splice(pp, i++, 0, ["C"].concat(Ext.Array.splice(pi, 0, 6)));
  32658. }
  32659. Ext.Array.erase(pp, i, 1);
  32660. ii = Math.max(p.length, p2.length || 0);
  32661. }
  32662. },
  32663. fixM = function (path1, path2, a1, a2, i) {
  32664. if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") {
  32665. Ext.Array.splice(path2, i, 0, ["M", a2.x, a2.y]);
  32666. a1.bx = 0;
  32667. a1.by = 0;
  32668. a1.x = path1[i][1];
  32669. a1.y = path1[i][2];
  32670. ii = Math.max(p.length, p2.length || 0);
  32671. }
  32672. },
  32673. i, ii,
  32674. seg, seg2, seglen, seg2len;
  32675. for (i = 0, ii = Math.max(p.length, p2.length || 0); i < ii; i++) {
  32676. p[i] = me.command2curve(p[i], attrs);
  32677. fixArc(p, i);
  32678. (p2[i] = me.command2curve(p2[i], attrs2));
  32679. fixArc(p2, i);
  32680. fixM(p, p2, attrs, attrs2, i);
  32681. fixM(p2, p, attrs2, attrs, i);
  32682. seg = p[i];
  32683. seg2 = p2[i];
  32684. seglen = seg.length;
  32685. seg2len = seg2.length;
  32686. attrs.x = seg[seglen - 2];
  32687. attrs.y = seg[seglen - 1];
  32688. attrs.bx = parseFloat(seg[seglen - 4]) || attrs.x;
  32689. attrs.by = parseFloat(seg[seglen - 3]) || attrs.y;
  32690. attrs2.bx = (parseFloat(seg2[seg2len - 4]) || attrs2.x);
  32691. attrs2.by = (parseFloat(seg2[seg2len - 3]) || attrs2.y);
  32692. attrs2.x = seg2[seg2len - 2];
  32693. attrs2.y = seg2[seg2len - 1];
  32694. }
  32695. return [p, p2];
  32696. },
  32697. command2curve: function (pathCommand, d) {
  32698. var me = this;
  32699. if (!pathCommand) {
  32700. return ["C", d.x, d.y, d.x, d.y, d.x, d.y];
  32701. }
  32702. if (pathCommand[0] != "T" && pathCommand[0] != "Q") {
  32703. d.qx = d.qy = null;
  32704. }
  32705. switch (pathCommand[0]) {
  32706. case "M":
  32707. d.X = pathCommand[1];
  32708. d.Y = pathCommand[2];
  32709. break;
  32710. case "A":
  32711. pathCommand = ["C"].concat(me.arc2curve.apply(me, [d.x, d.y].concat(pathCommand.slice(1))));
  32712. break;
  32713. case "S":
  32714. pathCommand = ["C", d.x + (d.x - (d.bx || d.x)), d.y + (d.y - (d.by || d.y))].concat(pathCommand.slice(1));
  32715. break;
  32716. case "T":
  32717. d.qx = d.x + (d.x - (d.qx || d.x));
  32718. d.qy = d.y + (d.y - (d.qy || d.y));
  32719. pathCommand = ["C"].concat(me.quadratic2curve(d.x, d.y, d.qx, d.qy, pathCommand[1], pathCommand[2]));
  32720. break;
  32721. case "Q":
  32722. d.qx = pathCommand[1];
  32723. d.qy = pathCommand[2];
  32724. pathCommand = ["C"].concat(me.quadratic2curve(d.x, d.y, pathCommand[1], pathCommand[2], pathCommand[3], pathCommand[4]));
  32725. break;
  32726. case "L":
  32727. pathCommand = ["C"].concat(d.x, d.y, pathCommand[1], pathCommand[2], pathCommand[1], pathCommand[2]);
  32728. break;
  32729. case "H":
  32730. pathCommand = ["C"].concat(d.x, d.y, pathCommand[1], d.y, pathCommand[1], d.y);
  32731. break;
  32732. case "V":
  32733. pathCommand = ["C"].concat(d.x, d.y, d.x, pathCommand[1], d.x, pathCommand[1]);
  32734. break;
  32735. case "Z":
  32736. pathCommand = ["C"].concat(d.x, d.y, d.X, d.Y, d.X, d.Y);
  32737. break;
  32738. }
  32739. return pathCommand;
  32740. },
  32741. quadratic2curve: function (x1, y1, ax, ay, x2, y2) {
  32742. var _13 = 1 / 3,
  32743. _23 = 2 / 3;
  32744. return [
  32745. _13 * x1 + _23 * ax,
  32746. _13 * y1 + _23 * ay,
  32747. _13 * x2 + _23 * ax,
  32748. _13 * y2 + _23 * ay,
  32749. x2,
  32750. y2
  32751. ];
  32752. },
  32753. rotate: function (x, y, rad) {
  32754. var cos = Math.cos(rad),
  32755. sin = Math.sin(rad),
  32756. X = x * cos - y * sin,
  32757. Y = x * sin + y * cos;
  32758. return {x: X, y: Y};
  32759. },
  32760. arc2curve: function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
  32761. var me = this,
  32762. PI = Math.PI,
  32763. radian = me.radian,
  32764. _120 = PI * 120 / 180,
  32765. rad = radian * (+angle || 0),
  32766. res = [],
  32767. math = Math,
  32768. mcos = math.cos,
  32769. msin = math.sin,
  32770. msqrt = math.sqrt,
  32771. mabs = math.abs,
  32772. masin = math.asin,
  32773. xy, cos, sin, x, y, h, rx2, ry2, k, cx, cy, f1, f2, df, c1, s1, c2, s2,
  32774. t, hx, hy, m1, m2, m3, m4, newres, i, ln, f2old, x2old, y2old;
  32775. if (!recursive) {
  32776. xy = me.rotate(x1, y1, -rad);
  32777. x1 = xy.x;
  32778. y1 = xy.y;
  32779. xy = me.rotate(x2, y2, -rad);
  32780. x2 = xy.x;
  32781. y2 = xy.y;
  32782. cos = mcos(radian * angle);
  32783. sin = msin(radian * angle);
  32784. x = (x1 - x2) / 2;
  32785. y = (y1 - y2) / 2;
  32786. h = (x * x) / (rx * rx) + (y * y) / (ry * ry);
  32787. if (h > 1) {
  32788. h = msqrt(h);
  32789. rx = h * rx;
  32790. ry = h * ry;
  32791. }
  32792. rx2 = rx * rx;
  32793. ry2 = ry * ry;
  32794. k = (large_arc_flag == sweep_flag ? -1 : 1) *
  32795. msqrt(mabs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x)));
  32796. cx = k * rx * y / ry + (x1 + x2) / 2;
  32797. cy = k * -ry * x / rx + (y1 + y2) / 2;
  32798. f1 = masin(((y1 - cy) / ry).toFixed(7));
  32799. f2 = masin(((y2 - cy) / ry).toFixed(7));
  32800. f1 = x1 < cx ? PI - f1 : f1;
  32801. f2 = x2 < cx ? PI - f2 : f2;
  32802. if (f1 < 0) {
  32803. f1 = PI * 2 + f1;
  32804. }
  32805. if (f2 < 0) {
  32806. f2 = PI * 2 + f2;
  32807. }
  32808. if (sweep_flag && f1 > f2) {
  32809. f1 = f1 - PI * 2;
  32810. }
  32811. if (!sweep_flag && f2 > f1) {
  32812. f2 = f2 - PI * 2;
  32813. }
  32814. }
  32815. else {
  32816. f1 = recursive[0];
  32817. f2 = recursive[1];
  32818. cx = recursive[2];
  32819. cy = recursive[3];
  32820. }
  32821. df = f2 - f1;
  32822. if (mabs(df) > _120) {
  32823. f2old = f2;
  32824. x2old = x2;
  32825. y2old = y2;
  32826. f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);
  32827. x2 = cx + rx * mcos(f2);
  32828. y2 = cy + ry * msin(f2);
  32829. res = me.arc2curve(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
  32830. }
  32831. df = f2 - f1;
  32832. c1 = mcos(f1);
  32833. s1 = msin(f1);
  32834. c2 = mcos(f2);
  32835. s2 = msin(f2);
  32836. t = math.tan(df / 4);
  32837. hx = 4 / 3 * rx * t;
  32838. hy = 4 / 3 * ry * t;
  32839. m1 = [x1, y1];
  32840. m2 = [x1 + hx * s1, y1 - hy * c1];
  32841. m3 = [x2 + hx * s2, y2 - hy * c2];
  32842. m4 = [x2, y2];
  32843. m2[0] = 2 * m1[0] - m2[0];
  32844. m2[1] = 2 * m1[1] - m2[1];
  32845. if (recursive) {
  32846. return [m2, m3, m4].concat(res);
  32847. }
  32848. else {
  32849. res = [m2, m3, m4].concat(res).join().split(",");
  32850. newres = [];
  32851. ln = res.length;
  32852. for (i = 0; i < ln; i++) {
  32853. newres[i] = i % 2 ? me.rotate(res[i - 1], res[i], rad).y : me.rotate(res[i], res[i + 1], rad).x;
  32854. }
  32855. return newres;
  32856. }
  32857. },
  32858. rotateAndTranslatePath: function (sprite) {
  32859. var alpha = sprite.rotation.degrees,
  32860. cx = sprite.rotation.x,
  32861. cy = sprite.rotation.y,
  32862. dx = sprite.translation.x,
  32863. dy = sprite.translation.y,
  32864. path,
  32865. i,
  32866. p,
  32867. xy,
  32868. j,
  32869. res = [];
  32870. if (!alpha && !dx && !dy) {
  32871. return this.pathToAbsolute(sprite.attr.path);
  32872. }
  32873. dx = dx || 0;
  32874. dy = dy || 0;
  32875. path = this.pathToAbsolute(sprite.attr.path);
  32876. for (i = path.length; i--;) {
  32877. p = res[i] = path[i].slice();
  32878. if (p[0] == "A") {
  32879. xy = this.rotatePoint(p[6], p[7], alpha, cx, cy);
  32880. p[6] = xy.x + dx;
  32881. p[7] = xy.y + dy;
  32882. } else {
  32883. j = 1;
  32884. while (p[j + 1] != null) {
  32885. xy = this.rotatePoint(p[j], p[j + 1], alpha, cx, cy);
  32886. p[j] = xy.x + dx;
  32887. p[j + 1] = xy.y + dy;
  32888. j += 2;
  32889. }
  32890. }
  32891. }
  32892. return res;
  32893. },
  32894. rotatePoint: function (x, y, alpha, cx, cy) {
  32895. if (!alpha) {
  32896. return {
  32897. x: x,
  32898. y: y
  32899. };
  32900. }
  32901. cx = cx || 0;
  32902. cy = cy || 0;
  32903. x = x - cx;
  32904. y = y - cy;
  32905. alpha = alpha * this.radian;
  32906. var cos = Math.cos(alpha),
  32907. sin = Math.sin(alpha);
  32908. return {
  32909. x: x * cos - y * sin + cx,
  32910. y: x * sin + y * cos + cy
  32911. };
  32912. },
  32913. pathDimensions: function (path) {
  32914. if (!path || !(path + "")) {
  32915. return {x: 0, y: 0, width: 0, height: 0};
  32916. }
  32917. path = this.path2curve(path);
  32918. var x = 0,
  32919. y = 0,
  32920. X = [],
  32921. Y = [],
  32922. i = 0,
  32923. ln = path.length,
  32924. p, xmin, ymin, dim;
  32925. for (; i < ln; i++) {
  32926. p = path[i];
  32927. if (p[0] == "M") {
  32928. x = p[1];
  32929. y = p[2];
  32930. X.push(x);
  32931. Y.push(y);
  32932. }
  32933. else {
  32934. dim = this.curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
  32935. X = X.concat(dim.min.x, dim.max.x);
  32936. Y = Y.concat(dim.min.y, dim.max.y);
  32937. x = p[5];
  32938. y = p[6];
  32939. }
  32940. }
  32941. xmin = Math.min.apply(0, X);
  32942. ymin = Math.min.apply(0, Y);
  32943. return {
  32944. x: xmin,
  32945. y: ymin,
  32946. path: path,
  32947. width: Math.max.apply(0, X) - xmin,
  32948. height: Math.max.apply(0, Y) - ymin
  32949. };
  32950. },
  32951. intersectInside: function(path, cp1, cp2) {
  32952. return (cp2[0] - cp1[0]) * (path[1] - cp1[1]) > (cp2[1] - cp1[1]) * (path[0] - cp1[0]);
  32953. },
  32954. intersectIntersection: function(s, e, cp1, cp2) {
  32955. var p = [],
  32956. dcx = cp1[0] - cp2[0],
  32957. dcy = cp1[1] - cp2[1],
  32958. dpx = s[0] - e[0],
  32959. dpy = s[1] - e[1],
  32960. n1 = cp1[0] * cp2[1] - cp1[1] * cp2[0],
  32961. n2 = s[0] * e[1] - s[1] * e[0],
  32962. n3 = 1 / (dcx * dpy - dcy * dpx);
  32963. p[0] = (n1 * dpx - n2 * dcx) * n3;
  32964. p[1] = (n1 * dpy - n2 * dcy) * n3;
  32965. return p;
  32966. },
  32967. intersect: function(subjectPolygon, clipPolygon) {
  32968. var me = this,
  32969. i = 0,
  32970. ln = clipPolygon.length,
  32971. cp1 = clipPolygon[ln - 1],
  32972. outputList = subjectPolygon,
  32973. cp2, s, e, point, ln2, inputList, j;
  32974. for (; i < ln; ++i) {
  32975. cp2 = clipPolygon[i];
  32976. inputList = outputList;
  32977. outputList = [];
  32978. s = inputList[inputList.length - 1];
  32979. j = 0;
  32980. ln2 = inputList.length;
  32981. for (; j < ln2; j++) {
  32982. e = inputList[j];
  32983. if (me.intersectInside(e, cp1, cp2)) {
  32984. if (!me.intersectInside(s, cp1, cp2)) {
  32985. outputList.push(me.intersectIntersection(s, e, cp1, cp2));
  32986. }
  32987. outputList.push(e);
  32988. }
  32989. else if (me.intersectInside(s, cp1, cp2)) {
  32990. outputList.push(me.intersectIntersection(s, e, cp1, cp2));
  32991. }
  32992. s = e;
  32993. }
  32994. cp1 = cp2;
  32995. }
  32996. return outputList;
  32997. },
  32998. bezier : function (a, b, c, d, x) {
  32999. if (x === 0) {
  33000. return a;
  33001. }
  33002. else if (x === 1) {
  33003. return d;
  33004. }
  33005. var du = 1 - x,
  33006. d3 = du * du * du,
  33007. r = x / du;
  33008. return d3 * (a + r * (3 * b + r * (3 * c + d * r)));
  33009. },
  33010. bezierDim : function (a, b, c, d) {
  33011. var points = [], r,
  33012. A, top, C, delta, bottom, s,
  33013. min, max, i;
  33014. if (a + 3 * c == d + 3 * b) {
  33015. r = a - b;
  33016. r /= 2 * (a - b - b + c);
  33017. if ( r < 1 && r > 0) {
  33018. points.push(r);
  33019. }
  33020. } else {
  33021. A = a - 3 * b + 3 * c - d;
  33022. top = 2 * (a - b - b + c);
  33023. C = a - b;
  33024. delta = top * top - 4 * A * C;
  33025. bottom = A + A;
  33026. if (delta === 0) {
  33027. r = top / bottom;
  33028. if (r < 1 && r > 0) {
  33029. points.push(r);
  33030. }
  33031. } else if (delta > 0) {
  33032. s = Math.sqrt(delta);
  33033. r = (s + top) / bottom;
  33034. if (r < 1 && r > 0) {
  33035. points.push(r);
  33036. }
  33037. r = (top - s) / bottom;
  33038. if (r < 1 && r > 0) {
  33039. points.push(r);
  33040. }
  33041. }
  33042. }
  33043. min = Math.min(a, d);
  33044. max = Math.max(a, d);
  33045. for (i = 0; i < points.length; i++) {
  33046. min = Math.min(min, this.bezier(a, b, c, d, points[i]));
  33047. max = Math.max(max, this.bezier(a, b, c, d, points[i]));
  33048. }
  33049. return [min, max];
  33050. },
  33051. curveDim: function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
  33052. var x = this.bezierDim(p1x, c1x, c2x, p2x),
  33053. y = this.bezierDim(p1y, c1y, c2y, p2y);
  33054. return {
  33055. min: {
  33056. x: x[0],
  33057. y: y[0]
  33058. },
  33059. max: {
  33060. x: x[1],
  33061. y: y[1]
  33062. }
  33063. };
  33064. },
  33065. getAnchors: function (prevX, prevY, curX, curY, nextX, nextY, value) {
  33066. value = value || 4;
  33067. var M = Math,
  33068. PI = M.PI,
  33069. halfPI = PI / 2,
  33070. abs = M.abs,
  33071. sin = M.sin,
  33072. cos = M.cos,
  33073. atan = M.atan,
  33074. control1Length, control2Length, control1Angle, control2Angle,
  33075. control1X, control1Y, control2X, control2Y, alpha;
  33076. control1Length = (curX - prevX) / value;
  33077. control2Length = (nextX - curX) / value;
  33078. if ((curY >= prevY && curY >= nextY) || (curY <= prevY && curY <= nextY)) {
  33079. control1Angle = control2Angle = halfPI;
  33080. } else {
  33081. control1Angle = atan((curX - prevX) / abs(curY - prevY));
  33082. if (prevY < curY) {
  33083. control1Angle = PI - control1Angle;
  33084. }
  33085. control2Angle = atan((nextX - curX) / abs(curY - nextY));
  33086. if (nextY < curY) {
  33087. control2Angle = PI - control2Angle;
  33088. }
  33089. }
  33090. alpha = halfPI - ((control1Angle + control2Angle) % (PI * 2)) / 2;
  33091. if (alpha > halfPI) {
  33092. alpha -= PI;
  33093. }
  33094. control1Angle += alpha;
  33095. control2Angle += alpha;
  33096. control1X = curX - control1Length * sin(control1Angle);
  33097. control1Y = curY + control1Length * cos(control1Angle);
  33098. control2X = curX + control2Length * sin(control2Angle);
  33099. control2Y = curY + control2Length * cos(control2Angle);
  33100. if ((curY > prevY && control1Y < prevY) || (curY < prevY && control1Y > prevY)) {
  33101. control1X += abs(prevY - control1Y) * (control1X - curX) / (control1Y - curY);
  33102. control1Y = prevY;
  33103. }
  33104. if ((curY > nextY && control2Y < nextY) || (curY < nextY && control2Y > nextY)) {
  33105. control2X -= abs(nextY - control2Y) * (control2X - curX) / (control2Y - curY);
  33106. control2Y = nextY;
  33107. }
  33108. return {
  33109. x1: control1X,
  33110. y1: control1Y,
  33111. x2: control2X,
  33112. y2: control2Y
  33113. };
  33114. },
  33115. smooth: function (originalPath, value) {
  33116. var path = this.path2curve(originalPath),
  33117. newp = [path[0]],
  33118. x = path[0][1],
  33119. y = path[0][2],
  33120. j,
  33121. points,
  33122. i = 1,
  33123. ii = path.length,
  33124. beg = 1,
  33125. mx = x,
  33126. my = y,
  33127. cx = 0,
  33128. cy = 0,
  33129. pathi,
  33130. pathil,
  33131. pathim,
  33132. pathiml,
  33133. pathip,
  33134. pathipl,
  33135. begl;
  33136. for (; i < ii; i++) {
  33137. pathi = path[i];
  33138. pathil = pathi.length;
  33139. pathim = path[i - 1];
  33140. pathiml = pathim.length;
  33141. pathip = path[i + 1];
  33142. pathipl = pathip && pathip.length;
  33143. if (pathi[0] == "M") {
  33144. mx = pathi[1];
  33145. my = pathi[2];
  33146. j = i + 1;
  33147. while (path[j][0] != "C") {
  33148. j++;
  33149. }
  33150. cx = path[j][5];
  33151. cy = path[j][6];
  33152. newp.push(["M", mx, my]);
  33153. beg = newp.length;
  33154. x = mx;
  33155. y = my;
  33156. continue;
  33157. }
  33158. if (pathi[pathil - 2] == mx && pathi[pathil - 1] == my && (!pathip || pathip[0] == "M")) {
  33159. begl = newp[beg].length;
  33160. points = this.getAnchors(pathim[pathiml - 2], pathim[pathiml - 1], mx, my, newp[beg][begl - 2], newp[beg][begl - 1], value);
  33161. newp[beg][1] = points.x2;
  33162. newp[beg][2] = points.y2;
  33163. }
  33164. else if (!pathip || pathip[0] == "M") {
  33165. points = {
  33166. x1: pathi[pathil - 2],
  33167. y1: pathi[pathil - 1]
  33168. };
  33169. } else {
  33170. points = this.getAnchors(pathim[pathiml - 2], pathim[pathiml - 1], pathi[pathil - 2], pathi[pathil - 1], pathip[pathipl - 2], pathip[pathipl - 1], value);
  33171. }
  33172. newp.push(["C", x, y, points.x1, points.y1, pathi[pathil - 2], pathi[pathil - 1]]);
  33173. x = points.x2;
  33174. y = points.y2;
  33175. }
  33176. return newp;
  33177. },
  33178. findDotAtSegment: function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
  33179. var t1 = 1 - t;
  33180. return {
  33181. x: Math.pow(t1, 3) * p1x + Math.pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + Math.pow(t, 3) * p2x,
  33182. y: Math.pow(t1, 3) * p1y + Math.pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + Math.pow(t, 3) * p2y
  33183. };
  33184. },
  33185. snapEnds: function (from, to, stepsMax, prettyNumbers) {
  33186. if (Ext.isDate(from)) {
  33187. return this.snapEndsByDate(from, to, stepsMax);
  33188. }
  33189. var step = (to - from) / stepsMax,
  33190. level = Math.floor(Math.log(step) / Math.LN10) + 1,
  33191. m = Math.pow(10, level),
  33192. cur,
  33193. modulo = Math.round((step % m) * Math.pow(10, 2 - level)),
  33194. interval = [[0, 15], [20, 4], [30, 2], [40, 4], [50, 9], [60, 4], [70, 2], [80, 4], [100, 15]],
  33195. stepCount = 0,
  33196. value,
  33197. weight,
  33198. i,
  33199. topValue,
  33200. topWeight = 1e9,
  33201. ln = interval.length;
  33202. cur = from = Math.floor(from / m) * m;
  33203. if(prettyNumbers){
  33204. for (i = 0; i < ln; i++) {
  33205. value = interval[i][0];
  33206. weight = (value - modulo) < 0 ? 1e6 : (value - modulo) / interval[i][1];
  33207. if (weight < topWeight) {
  33208. topValue = value;
  33209. topWeight = weight;
  33210. }
  33211. }
  33212. step = Math.floor(step * Math.pow(10, -level)) * Math.pow(10, level) + topValue * Math.pow(10, level - 2);
  33213. while (cur < to) {
  33214. cur += step;
  33215. stepCount++;
  33216. }
  33217. to = +cur.toFixed(10);
  33218. }else{
  33219. stepCount = stepsMax;
  33220. }
  33221. return {
  33222. from: from,
  33223. to: to,
  33224. power: level,
  33225. step: step,
  33226. steps: stepCount
  33227. };
  33228. },
  33229. snapEndsByDate: function (from, to, stepsMax, lockEnds) {
  33230. var selectedStep = false,
  33231. scales = [
  33232. [Ext.Date.MILLI, [1, 2, 3, 5, 10, 20, 30, 50, 100, 200, 300, 500]],
  33233. [Ext.Date.SECOND, [1, 2, 3, 5, 10, 15, 30]],
  33234. [Ext.Date.MINUTE, [1, 2, 3, 5, 10, 20, 30]],
  33235. [Ext.Date.HOUR, [1, 2, 3, 4, 6, 12]],
  33236. [Ext.Date.DAY, [1, 2, 3, 7, 14]],
  33237. [Ext.Date.MONTH, [1, 2, 3, 4, 6]]
  33238. ],
  33239. sLen = scales.length,
  33240. stop = false,
  33241. scale, j, yearDiff, s;
  33242. for (s = 0; s < sLen; s++) {
  33243. scale = scales[s];
  33244. if (!stop) {
  33245. for (j = 0; j < scale[1].length; j++) {
  33246. if (to < Ext.Date.add(from, scale[0], scale[1][j] * stepsMax)) {
  33247. selectedStep = [scale[0], scale[1][j]];
  33248. stop = true;
  33249. break;
  33250. }
  33251. }
  33252. }
  33253. }
  33254. if (!selectedStep) {
  33255. yearDiff = this.snapEnds(from.getFullYear(), to.getFullYear() + 1, stepsMax, lockEnds);
  33256. selectedStep = [Date.YEAR, Math.round(yearDiff.step)];
  33257. }
  33258. return this.snapEndsByDateAndStep(from, to, selectedStep, lockEnds);
  33259. },
  33260. snapEndsByDateAndStep: function(from, to, step, lockEnds) {
  33261. var fromStat = [from.getFullYear(), from.getMonth(), from.getDate(),
  33262. from.getHours(), from.getMinutes(), from.getSeconds(), from.getMilliseconds()],
  33263. steps = 0, testFrom, testTo;
  33264. if (lockEnds) {
  33265. testFrom = from;
  33266. } else {
  33267. switch (step[0]) {
  33268. case Ext.Date.MILLI:
  33269. testFrom = new Date(fromStat[0], fromStat[1], fromStat[2], fromStat[3],
  33270. fromStat[4], fromStat[5], Math.floor(fromStat[6] / step[1]) * step[1]);
  33271. break;
  33272. case Ext.Date.SECOND:
  33273. testFrom = new Date(fromStat[0], fromStat[1], fromStat[2], fromStat[3],
  33274. fromStat[4], Math.floor(fromStat[5] / step[1]) * step[1], 0);
  33275. break;
  33276. case Ext.Date.MINUTE:
  33277. testFrom = new Date(fromStat[0], fromStat[1], fromStat[2], fromStat[3],
  33278. Math.floor(fromStat[4] / step[1]) * step[1], 0, 0);
  33279. break;
  33280. case Ext.Date.HOUR:
  33281. testFrom = new Date(fromStat[0], fromStat[1], fromStat[2],
  33282. Math.floor(fromStat[3] / step[1]) * step[1], 0, 0, 0);
  33283. break;
  33284. case Ext.Date.DAY:
  33285. testFrom = new Date(fromStat[0], fromStat[1],
  33286. Math.floor(fromStat[2] - 1 / step[1]) * step[1] + 1, 0, 0, 0, 0);
  33287. break;
  33288. case Ext.Date.MONTH:
  33289. testFrom = new Date(fromStat[0], Math.floor(fromStat[1] / step[1]) * step[1], 1, 0, 0, 0, 0);
  33290. break;
  33291. default:
  33292. testFrom = new Date(Math.floor(fromStat[0] / step[1]) * step[1], 0, 1, 0, 0, 0, 0);
  33293. break;
  33294. }
  33295. }
  33296. testTo = testFrom;
  33297. while (testTo < to) {
  33298. testTo = Ext.Date.add(testTo, step[0], step[1]);
  33299. steps++;
  33300. }
  33301. if (lockEnds) {
  33302. testTo = to;
  33303. }
  33304. return {
  33305. from : +testFrom,
  33306. to : +testTo,
  33307. step : (testTo - testFrom) / steps,
  33308. steps : steps
  33309. };
  33310. },
  33311. sorter: function (a, b) {
  33312. return a.offset - b.offset;
  33313. },
  33314. rad: function(degrees) {
  33315. return degrees % 360 * Math.PI / 180;
  33316. },
  33317. degrees: function(radian) {
  33318. return radian * 180 / Math.PI % 360;
  33319. },
  33320. withinBox: function(x, y, bbox) {
  33321. bbox = bbox || {};
  33322. return (x >= bbox.x && x <= (bbox.x + bbox.width) && y >= bbox.y && y <= (bbox.y + bbox.height));
  33323. },
  33324. parseGradient: function(gradient) {
  33325. var me = this,
  33326. type = gradient.type || 'linear',
  33327. angle = gradient.angle || 0,
  33328. radian = me.radian,
  33329. stops = gradient.stops,
  33330. stopsArr = [],
  33331. stop,
  33332. vector,
  33333. max,
  33334. stopObj;
  33335. if (type == 'linear') {
  33336. vector = [0, 0, Math.cos(angle * radian), Math.sin(angle * radian)];
  33337. max = 1 / (Math.max(Math.abs(vector[2]), Math.abs(vector[3])) || 1);
  33338. vector[2] *= max;
  33339. vector[3] *= max;
  33340. if (vector[2] < 0) {
  33341. vector[0] = -vector[2];
  33342. vector[2] = 0;
  33343. }
  33344. if (vector[3] < 0) {
  33345. vector[1] = -vector[3];
  33346. vector[3] = 0;
  33347. }
  33348. }
  33349. for (stop in stops) {
  33350. if (stops.hasOwnProperty(stop) && me.stopsRE.test(stop)) {
  33351. stopObj = {
  33352. offset: parseInt(stop, 10),
  33353. color: Ext.draw.Color.toHex(stops[stop].color) || '#ffffff',
  33354. opacity: stops[stop].opacity || 1
  33355. };
  33356. stopsArr.push(stopObj);
  33357. }
  33358. }
  33359. Ext.Array.sort(stopsArr, me.sorter);
  33360. if (type == 'linear') {
  33361. return {
  33362. id: gradient.id,
  33363. type: type,
  33364. vector: vector,
  33365. stops: stopsArr
  33366. };
  33367. }
  33368. else {
  33369. return {
  33370. id: gradient.id,
  33371. type: type,
  33372. centerX: gradient.centerX,
  33373. centerY: gradient.centerY,
  33374. focalX: gradient.focalX,
  33375. focalY: gradient.focalY,
  33376. radius: gradient.radius,
  33377. vector: vector,
  33378. stops: stopsArr
  33379. };
  33380. }
  33381. }
  33382. });
  33383. Ext.define('Ext.fx.PropertyHandler', {
  33384. requires: ['Ext.draw.Draw'],
  33385. statics: {
  33386. defaultHandler: {
  33387. pixelDefaultsRE: /width|height|top$|bottom$|left$|right$/i,
  33388. unitRE: /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/,
  33389. scrollRE: /^scroll/i,
  33390. computeDelta: function(from, end, damper, initial, attr) {
  33391. damper = (typeof damper == 'number') ? damper : 1;
  33392. var unitRE = this.unitRE,
  33393. match = unitRE.exec(from),
  33394. start, units;
  33395. if (match) {
  33396. from = match[1];
  33397. units = match[2];
  33398. if (!this.scrollRE.test(attr) && !units && this.pixelDefaultsRE.test(attr)) {
  33399. units = 'px';
  33400. }
  33401. }
  33402. from = +from || 0;
  33403. match = unitRE.exec(end);
  33404. if (match) {
  33405. end = match[1];
  33406. units = match[2] || units;
  33407. }
  33408. end = +end || 0;
  33409. start = (initial != null) ? initial : from;
  33410. return {
  33411. from: from,
  33412. delta: (end - start) * damper,
  33413. units: units
  33414. };
  33415. },
  33416. get: function(from, end, damper, initialFrom, attr) {
  33417. var ln = from.length,
  33418. out = [],
  33419. i, initial, res, j, len;
  33420. for (i = 0; i < ln; i++) {
  33421. if (initialFrom) {
  33422. initial = initialFrom[i][1].from;
  33423. }
  33424. if (Ext.isArray(from[i][1]) && Ext.isArray(end)) {
  33425. res = [];
  33426. j = 0;
  33427. len = from[i][1].length;
  33428. for (; j < len; j++) {
  33429. res.push(this.computeDelta(from[i][1][j], end[j], damper, initial, attr));
  33430. }
  33431. out.push([from[i][0], res]);
  33432. }
  33433. else {
  33434. out.push([from[i][0], this.computeDelta(from[i][1], end, damper, initial, attr)]);
  33435. }
  33436. }
  33437. return out;
  33438. },
  33439. set: function(values, easing) {
  33440. var ln = values.length,
  33441. out = [],
  33442. i, val, res, len, j;
  33443. for (i = 0; i < ln; i++) {
  33444. val = values[i][1];
  33445. if (Ext.isArray(val)) {
  33446. res = [];
  33447. j = 0;
  33448. len = val.length;
  33449. for (; j < len; j++) {
  33450. res.push(val[j].from + val[j].delta * easing + (val[j].units || 0));
  33451. }
  33452. out.push([values[i][0], res]);
  33453. } else {
  33454. out.push([values[i][0], val.from + val.delta * easing + (val.units || 0)]);
  33455. }
  33456. }
  33457. return out;
  33458. }
  33459. },
  33460. stringHandler: {
  33461. computeDelta: function(from, end, damper, initial, attr) {
  33462. return {
  33463. from: from,
  33464. delta: end
  33465. };
  33466. },
  33467. get: function(from, end, damper, initialFrom, attr) {
  33468. var ln = from.length,
  33469. out = [],
  33470. i, initial, res, j, len;
  33471. for (i = 0; i < ln; i++) {
  33472. out.push([from[i][0], this.computeDelta(from[i][1], end, damper, initial, attr)]);
  33473. }
  33474. return out;
  33475. },
  33476. set: function(values, easing) {
  33477. var ln = values.length,
  33478. out = [],
  33479. i, val, res, len, j;
  33480. for (i = 0; i < ln; i++) {
  33481. val = values[i][1];
  33482. out.push([values[i][0], val.delta]);
  33483. }
  33484. return out;
  33485. }
  33486. },
  33487. color: {
  33488. rgbRE: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
  33489. hexRE: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
  33490. hex3RE: /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,
  33491. parseColor : function(color, damper) {
  33492. damper = (typeof damper == 'number') ? damper : 1;
  33493. var out = false,
  33494. reList = [this.hexRE, this.rgbRE, this.hex3RE],
  33495. length = reList.length,
  33496. match, base, re, i;
  33497. for (i = 0; i < length; i++) {
  33498. re = reList[i];
  33499. base = (i % 2 === 0) ? 16 : 10;
  33500. match = re.exec(color);
  33501. if (match && match.length === 4) {
  33502. if (i === 2) {
  33503. match[1] += match[1];
  33504. match[2] += match[2];
  33505. match[3] += match[3];
  33506. }
  33507. out = {
  33508. red: parseInt(match[1], base),
  33509. green: parseInt(match[2], base),
  33510. blue: parseInt(match[3], base)
  33511. };
  33512. break;
  33513. }
  33514. }
  33515. return out || color;
  33516. },
  33517. computeDelta: function(from, end, damper, initial) {
  33518. from = this.parseColor(from);
  33519. end = this.parseColor(end, damper);
  33520. var start = initial ? initial : from,
  33521. tfrom = typeof start,
  33522. tend = typeof end;
  33523. if (tfrom == 'string' || tfrom == 'undefined'
  33524. || tend == 'string' || tend == 'undefined') {
  33525. return end || start;
  33526. }
  33527. return {
  33528. from: from,
  33529. delta: {
  33530. red: Math.round((end.red - start.red) * damper),
  33531. green: Math.round((end.green - start.green) * damper),
  33532. blue: Math.round((end.blue - start.blue) * damper)
  33533. }
  33534. };
  33535. },
  33536. get: function(start, end, damper, initialFrom) {
  33537. var ln = start.length,
  33538. out = [],
  33539. i, initial;
  33540. for (i = 0; i < ln; i++) {
  33541. if (initialFrom) {
  33542. initial = initialFrom[i][1].from;
  33543. }
  33544. out.push([start[i][0], this.computeDelta(start[i][1], end, damper, initial)]);
  33545. }
  33546. return out;
  33547. },
  33548. set: function(values, easing) {
  33549. var ln = values.length,
  33550. out = [],
  33551. i, val, parsedString, from, delta;
  33552. for (i = 0; i < ln; i++) {
  33553. val = values[i][1];
  33554. if (val) {
  33555. from = val.from;
  33556. delta = val.delta;
  33557. val = (typeof val == 'object' && 'red' in val)?
  33558. 'rgb(' + val.red + ', ' + val.green + ', ' + val.blue + ')' : val;
  33559. val = (typeof val == 'object' && val.length)? val[0] : val;
  33560. if (typeof val == 'undefined') {
  33561. return [];
  33562. }
  33563. parsedString = typeof val == 'string'? val :
  33564. 'rgb(' + [
  33565. (from.red + Math.round(delta.red * easing)) % 256,
  33566. (from.green + Math.round(delta.green * easing)) % 256,
  33567. (from.blue + Math.round(delta.blue * easing)) % 256
  33568. ].join(',') + ')';
  33569. out.push([
  33570. values[i][0],
  33571. parsedString
  33572. ]);
  33573. }
  33574. }
  33575. return out;
  33576. }
  33577. },
  33578. object: {
  33579. interpolate: function(prop, damper) {
  33580. damper = (typeof damper == 'number') ? damper : 1;
  33581. var out = {},
  33582. p;
  33583. for(p in prop) {
  33584. out[p] = parseFloat(prop[p]) * damper;
  33585. }
  33586. return out;
  33587. },
  33588. computeDelta: function(from, end, damper, initial) {
  33589. from = this.interpolate(from);
  33590. end = this.interpolate(end, damper);
  33591. var start = initial ? initial : from,
  33592. delta = {},
  33593. p;
  33594. for(p in end) {
  33595. delta[p] = end[p] - start[p];
  33596. }
  33597. return {
  33598. from: from,
  33599. delta: delta
  33600. };
  33601. },
  33602. get: function(start, end, damper, initialFrom) {
  33603. var ln = start.length,
  33604. out = [],
  33605. i, initial;
  33606. for (i = 0; i < ln; i++) {
  33607. if (initialFrom) {
  33608. initial = initialFrom[i][1].from;
  33609. }
  33610. out.push([start[i][0], this.computeDelta(start[i][1], end, damper, initial)]);
  33611. }
  33612. return out;
  33613. },
  33614. set: function(values, easing) {
  33615. var ln = values.length,
  33616. out = [],
  33617. outObject = {},
  33618. i, from, delta, val, p;
  33619. for (i = 0; i < ln; i++) {
  33620. val = values[i][1];
  33621. from = val.from;
  33622. delta = val.delta;
  33623. for (p in from) {
  33624. outObject[p] = from[p] + delta[p] * easing;
  33625. }
  33626. out.push([
  33627. values[i][0],
  33628. outObject
  33629. ]);
  33630. }
  33631. return out;
  33632. }
  33633. },
  33634. path: {
  33635. computeDelta: function(from, end, damper, initial) {
  33636. damper = (typeof damper == 'number') ? damper : 1;
  33637. var start;
  33638. from = +from || 0;
  33639. end = +end || 0;
  33640. start = (initial != null) ? initial : from;
  33641. return {
  33642. from: from,
  33643. delta: (end - start) * damper
  33644. };
  33645. },
  33646. forcePath: function(path) {
  33647. if (!Ext.isArray(path) && !Ext.isArray(path[0])) {
  33648. path = Ext.draw.Draw.parsePathString(path);
  33649. }
  33650. return path;
  33651. },
  33652. get: function(start, end, damper, initialFrom) {
  33653. var endPath = this.forcePath(end),
  33654. out = [],
  33655. startLn = start.length,
  33656. startPathLn, pointsLn, i, deltaPath, initial, j, k, path, startPath;
  33657. for (i = 0; i < startLn; i++) {
  33658. startPath = this.forcePath(start[i][1]);
  33659. deltaPath = Ext.draw.Draw.interpolatePaths(startPath, endPath);
  33660. startPath = deltaPath[0];
  33661. endPath = deltaPath[1];
  33662. startPathLn = startPath.length;
  33663. path = [];
  33664. for (j = 0; j < startPathLn; j++) {
  33665. deltaPath = [startPath[j][0]];
  33666. pointsLn = startPath[j].length;
  33667. for (k = 1; k < pointsLn; k++) {
  33668. initial = initialFrom && initialFrom[0][1][j][k].from;
  33669. deltaPath.push(this.computeDelta(startPath[j][k], endPath[j][k], damper, initial));
  33670. }
  33671. path.push(deltaPath);
  33672. }
  33673. out.push([start[i][0], path]);
  33674. }
  33675. return out;
  33676. },
  33677. set: function(values, easing) {
  33678. var ln = values.length,
  33679. out = [],
  33680. i, j, k, newPath, calcPath, deltaPath, deltaPathLn, pointsLn;
  33681. for (i = 0; i < ln; i++) {
  33682. deltaPath = values[i][1];
  33683. newPath = [];
  33684. deltaPathLn = deltaPath.length;
  33685. for (j = 0; j < deltaPathLn; j++) {
  33686. calcPath = [deltaPath[j][0]];
  33687. pointsLn = deltaPath[j].length;
  33688. for (k = 1; k < pointsLn; k++) {
  33689. calcPath.push(deltaPath[j][k].from + deltaPath[j][k].delta * easing);
  33690. }
  33691. newPath.push(calcPath.join(','));
  33692. }
  33693. out.push([values[i][0], newPath.join(',')]);
  33694. }
  33695. return out;
  33696. }
  33697. }
  33698. }
  33699. }, function() {
  33700. var props = [
  33701. 'outlineColor',
  33702. 'backgroundColor',
  33703. 'borderColor',
  33704. 'borderTopColor',
  33705. 'borderRightColor',
  33706. 'borderBottomColor',
  33707. 'borderLeftColor',
  33708. 'fill',
  33709. 'stroke'
  33710. ],
  33711. length = props.length,
  33712. i = 0,
  33713. prop;
  33714. for (; i<length; i++) {
  33715. prop = props[i];
  33716. this[prop] = this.color;
  33717. }
  33718. props = ['cursor'];
  33719. length = props.length;
  33720. i = 0;
  33721. for (; i<length; i++) {
  33722. prop = props[i];
  33723. this[prop] = this.stringHandler;
  33724. }
  33725. });
  33726. Ext.define('Ext.fx.Anim', {
  33727. mixins: {
  33728. observable: 'Ext.util.Observable'
  33729. },
  33730. requires: ['Ext.fx.Manager', 'Ext.fx.Animator', 'Ext.fx.Easing', 'Ext.fx.CubicBezier', 'Ext.fx.PropertyHandler'],
  33731. isAnimation: true,
  33732. duration: 250,
  33733. delay: 0,
  33734. delayStart: 0,
  33735. dynamic: false,
  33736. easing: 'ease',
  33737. damper: 1,
  33738. bezierRE: /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
  33739. reverse: false,
  33740. running: false,
  33741. paused: false,
  33742. iterations: 1,
  33743. alternate: false,
  33744. currentIteration: 0,
  33745. startTime: 0,
  33746. frameCount: 0,
  33747. constructor: function(config) {
  33748. var me = this,
  33749. curve;
  33750. config = config || {};
  33751. if (config.keyframes) {
  33752. return new Ext.fx.Animator(config);
  33753. }
  33754. Ext.apply(me, config);
  33755. if (me.from === undefined) {
  33756. me.from = {};
  33757. }
  33758. me.propHandlers = {};
  33759. me.config = config;
  33760. me.target = Ext.fx.Manager.createTarget(me.target);
  33761. me.easingFn = Ext.fx.Easing[me.easing];
  33762. me.target.dynamic = me.dynamic;
  33763. if (!me.easingFn) {
  33764. me.easingFn = String(me.easing).match(me.bezierRE);
  33765. if (me.easingFn && me.easingFn.length == 5) {
  33766. curve = me.easingFn;
  33767. me.easingFn = Ext.fx.CubicBezier.cubicBezier(+curve[1], +curve[2], +curve[3], +curve[4]);
  33768. }
  33769. }
  33770. me.id = Ext.id(null, 'ext-anim-');
  33771. me.addEvents(
  33772. 'beforeanimate',
  33773. 'afteranimate',
  33774. 'lastframe'
  33775. );
  33776. me.mixins.observable.constructor.call(me);
  33777. Ext.fx.Manager.addAnim(me);
  33778. },
  33779. setAttr: function(attr, value) {
  33780. return Ext.fx.Manager.items.get(this.id).setAttr(this.target, attr, value);
  33781. },
  33782. initAttrs: function() {
  33783. var me = this,
  33784. from = me.from,
  33785. to = me.to,
  33786. initialFrom = me.initialFrom || {},
  33787. out = {},
  33788. start, end, propHandler, attr;
  33789. for (attr in to) {
  33790. if (to.hasOwnProperty(attr)) {
  33791. start = me.target.getAttr(attr, from[attr]);
  33792. end = to[attr];
  33793. if (!Ext.fx.PropertyHandler[attr]) {
  33794. if (Ext.isObject(end)) {
  33795. propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler.object;
  33796. } else {
  33797. propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler.defaultHandler;
  33798. }
  33799. }
  33800. else {
  33801. propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler[attr];
  33802. }
  33803. out[attr] = propHandler.get(start, end, me.damper, initialFrom[attr], attr);
  33804. }
  33805. }
  33806. me.currentAttrs = out;
  33807. },
  33808. start: function(startTime) {
  33809. var me = this,
  33810. delay = me.delay,
  33811. delayStart = me.delayStart,
  33812. delayDelta;
  33813. if (delay) {
  33814. if (!delayStart) {
  33815. me.delayStart = startTime;
  33816. return;
  33817. }
  33818. else {
  33819. delayDelta = startTime - delayStart;
  33820. if (delayDelta < delay) {
  33821. return;
  33822. }
  33823. else {
  33824. startTime = new Date(delayStart.getTime() + delay);
  33825. }
  33826. }
  33827. }
  33828. if (me.fireEvent('beforeanimate', me) !== false) {
  33829. me.startTime = startTime;
  33830. if (!me.paused && !me.currentAttrs) {
  33831. me.initAttrs();
  33832. }
  33833. me.running = true;
  33834. me.frameCount = 0;
  33835. }
  33836. },
  33837. runAnim: function(elapsedTime) {
  33838. var me = this,
  33839. attrs = me.currentAttrs,
  33840. duration = me.duration,
  33841. easingFn = me.easingFn,
  33842. propHandlers = me.propHandlers,
  33843. ret = {},
  33844. easing, values, attr, lastFrame;
  33845. if (elapsedTime >= duration) {
  33846. elapsedTime = duration;
  33847. lastFrame = true;
  33848. }
  33849. if (me.reverse) {
  33850. elapsedTime = duration - elapsedTime;
  33851. }
  33852. for (attr in attrs) {
  33853. if (attrs.hasOwnProperty(attr)) {
  33854. values = attrs[attr];
  33855. easing = lastFrame ? 1 : easingFn(elapsedTime / duration);
  33856. ret[attr] = propHandlers[attr].set(values, easing);
  33857. }
  33858. }
  33859. me.frameCount++;
  33860. return ret;
  33861. },
  33862. lastFrame: function() {
  33863. var me = this,
  33864. iter = me.iterations,
  33865. iterCount = me.currentIteration;
  33866. iterCount++;
  33867. if (iterCount < iter) {
  33868. if (me.alternate) {
  33869. me.reverse = !me.reverse;
  33870. }
  33871. me.startTime = new Date();
  33872. me.currentIteration = iterCount;
  33873. me.paused = false;
  33874. }
  33875. else {
  33876. me.currentIteration = 0;
  33877. me.end();
  33878. me.fireEvent('lastframe', me, me.startTime);
  33879. }
  33880. },
  33881. endWasCalled: 0,
  33882. end: function() {
  33883. if (this.endWasCalled++) {
  33884. return;
  33885. }
  33886. var me = this;
  33887. me.startTime = 0;
  33888. me.paused = false;
  33889. me.running = false;
  33890. Ext.fx.Manager.removeAnim(me);
  33891. me.fireEvent('afteranimate', me, me.startTime);
  33892. Ext.callback(me.callback, me.scope, [me, me.startTime]);
  33893. },
  33894. isReady: function() {
  33895. return this.paused === false && this.running === false && this.iterations > 0;
  33896. },
  33897. isRunning: function() {
  33898. return this.paused === false && this.running === true && this.isAnimator !== true;
  33899. }
  33900. });
  33901. Ext.enableFx = true;
  33902. Ext.define('Ext.dd.DragDrop', {
  33903. requires: ['Ext.dd.DragDropManager'],
  33904. constructor: function(id, sGroup, config) {
  33905. if(id) {
  33906. this.init(id, sGroup, config);
  33907. }
  33908. },
  33909. id: null,
  33910. config: null,
  33911. dragElId: null,
  33912. handleElId: null,
  33913. invalidHandleTypes: null,
  33914. invalidHandleIds: null,
  33915. invalidHandleClasses: null,
  33916. startPageX: 0,
  33917. startPageY: 0,
  33918. groups: null,
  33919. locked: false,
  33920. lock: function() {
  33921. this.locked = true;
  33922. },
  33923. moveOnly: false,
  33924. unlock: function() {
  33925. this.locked = false;
  33926. },
  33927. isTarget: true,
  33928. padding: null,
  33929. _domRef: null,
  33930. __ygDragDrop: true,
  33931. constrainX: false,
  33932. constrainY: false,
  33933. minX: 0,
  33934. maxX: 0,
  33935. minY: 0,
  33936. maxY: 0,
  33937. maintainOffset: false,
  33938. xTicks: null,
  33939. yTicks: null,
  33940. primaryButtonOnly: true,
  33941. available: false,
  33942. hasOuterHandles: false,
  33943. b4StartDrag: function(x, y) { },
  33944. startDrag: function(x, y) { },
  33945. b4Drag: function(e) { },
  33946. onDrag: function(e) { },
  33947. onDragEnter: function(e, id) { },
  33948. b4DragOver: function(e) { },
  33949. onDragOver: function(e, id) { },
  33950. b4DragOut: function(e) { },
  33951. onDragOut: function(e, id) { },
  33952. b4DragDrop: function(e) { },
  33953. onDragDrop: function(e, id) { },
  33954. onInvalidDrop: function(e) { },
  33955. b4EndDrag: function(e) { },
  33956. endDrag: function(e) { },
  33957. b4MouseDown: function(e) { },
  33958. onMouseDown: function(e) { },
  33959. onMouseUp: function(e) { },
  33960. onAvailable: function () {
  33961. },
  33962. defaultPadding: {
  33963. left: 0,
  33964. right: 0,
  33965. top: 0,
  33966. bottom: 0
  33967. },
  33968. constrainTo : function(constrainTo, pad, inContent){
  33969. if(Ext.isNumber(pad)){
  33970. pad = {left: pad, right:pad, top:pad, bottom:pad};
  33971. }
  33972. pad = pad || this.defaultPadding;
  33973. var b = Ext.get(this.getEl()).getBox(),
  33974. ce = Ext.get(constrainTo),
  33975. s = ce.getScroll(),
  33976. c,
  33977. cd = ce.dom,
  33978. xy,
  33979. topSpace,
  33980. leftSpace;
  33981. if(cd == document.body){
  33982. c = { x: s.left, y: s.top, width: Ext.Element.getViewWidth(), height: Ext.Element.getViewHeight()};
  33983. }else{
  33984. xy = ce.getXY();
  33985. c = {x : xy[0], y: xy[1], width: cd.clientWidth, height: cd.clientHeight};
  33986. }
  33987. topSpace = b.y - c.y;
  33988. leftSpace = b.x - c.x;
  33989. this.resetConstraints();
  33990. this.setXConstraint(leftSpace - (pad.left||0),
  33991. c.width - leftSpace - b.width - (pad.right||0),
  33992. this.xTickSize
  33993. );
  33994. this.setYConstraint(topSpace - (pad.top||0),
  33995. c.height - topSpace - b.height - (pad.bottom||0),
  33996. this.yTickSize
  33997. );
  33998. },
  33999. getEl: function() {
  34000. if (!this._domRef) {
  34001. this._domRef = Ext.getDom(this.id);
  34002. }
  34003. return this._domRef;
  34004. },
  34005. getDragEl: function() {
  34006. return Ext.getDom(this.dragElId);
  34007. },
  34008. init: function(id, sGroup, config) {
  34009. this.initTarget(id, sGroup, config);
  34010. Ext.EventManager.on(this.id, "mousedown", this.handleMouseDown, this);
  34011. },
  34012. initTarget: function(id, sGroup, config) {
  34013. this.config = config || {};
  34014. this.DDMInstance = Ext.dd.DragDropManager;
  34015. this.groups = {};
  34016. if (typeof id !== "string") {
  34017. id = Ext.id(id);
  34018. }
  34019. this.id = id;
  34020. this.addToGroup((sGroup) ? sGroup : "default");
  34021. this.handleElId = id;
  34022. this.setDragElId(id);
  34023. this.invalidHandleTypes = { A: "A" };
  34024. this.invalidHandleIds = {};
  34025. this.invalidHandleClasses = [];
  34026. this.applyConfig();
  34027. this.handleOnAvailable();
  34028. },
  34029. applyConfig: function() {
  34030. this.padding = this.config.padding || [0, 0, 0, 0];
  34031. this.isTarget = (this.config.isTarget !== false);
  34032. this.maintainOffset = (this.config.maintainOffset);
  34033. this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
  34034. },
  34035. handleOnAvailable: function() {
  34036. this.available = true;
  34037. this.resetConstraints();
  34038. this.onAvailable();
  34039. },
  34040. setPadding: function(iTop, iRight, iBot, iLeft) {
  34041. if (!iRight && 0 !== iRight) {
  34042. this.padding = [iTop, iTop, iTop, iTop];
  34043. } else if (!iBot && 0 !== iBot) {
  34044. this.padding = [iTop, iRight, iTop, iRight];
  34045. } else {
  34046. this.padding = [iTop, iRight, iBot, iLeft];
  34047. }
  34048. },
  34049. setInitPosition: function(diffX, diffY) {
  34050. var el = this.getEl(),
  34051. dx, dy, p;
  34052. if (!this.DDMInstance.verifyEl(el)) {
  34053. return;
  34054. }
  34055. dx = diffX || 0;
  34056. dy = diffY || 0;
  34057. p = Ext.Element.getXY( el );
  34058. this.initPageX = p[0] - dx;
  34059. this.initPageY = p[1] - dy;
  34060. this.lastPageX = p[0];
  34061. this.lastPageY = p[1];
  34062. this.setStartPosition(p);
  34063. },
  34064. setStartPosition: function(pos) {
  34065. var p = pos || Ext.Element.getXY( this.getEl() );
  34066. this.deltaSetXY = null;
  34067. this.startPageX = p[0];
  34068. this.startPageY = p[1];
  34069. },
  34070. addToGroup: function(sGroup) {
  34071. this.groups[sGroup] = true;
  34072. this.DDMInstance.regDragDrop(this, sGroup);
  34073. },
  34074. removeFromGroup: function(sGroup) {
  34075. if (this.groups[sGroup]) {
  34076. delete this.groups[sGroup];
  34077. }
  34078. this.DDMInstance.removeDDFromGroup(this, sGroup);
  34079. },
  34080. setDragElId: function(id) {
  34081. this.dragElId = id;
  34082. },
  34083. setHandleElId: function(id) {
  34084. if (typeof id !== "string") {
  34085. id = Ext.id(id);
  34086. }
  34087. this.handleElId = id;
  34088. this.DDMInstance.regHandle(this.id, id);
  34089. },
  34090. setOuterHandleElId: function(id) {
  34091. if (typeof id !== "string") {
  34092. id = Ext.id(id);
  34093. }
  34094. Ext.EventManager.on(id, "mousedown", this.handleMouseDown, this);
  34095. this.setHandleElId(id);
  34096. this.hasOuterHandles = true;
  34097. },
  34098. unreg: function() {
  34099. Ext.EventManager.un(this.id, "mousedown", this.handleMouseDown, this);
  34100. this._domRef = null;
  34101. this.DDMInstance._remove(this);
  34102. },
  34103. destroy : function(){
  34104. this.unreg();
  34105. },
  34106. isLocked: function() {
  34107. return (this.DDMInstance.isLocked() || this.locked);
  34108. },
  34109. handleMouseDown: function(e, oDD){
  34110. if (this.primaryButtonOnly && e.button != 0) {
  34111. return;
  34112. }
  34113. if (this.isLocked()) {
  34114. return;
  34115. }
  34116. this.DDMInstance.refreshCache(this.groups);
  34117. if (this.hasOuterHandles || this.DDMInstance.isOverTarget(e.getPoint(), this) ) {
  34118. if (this.clickValidator(e)) {
  34119. this.setStartPosition();
  34120. this.b4MouseDown(e);
  34121. this.onMouseDown(e);
  34122. this.DDMInstance.handleMouseDown(e, this);
  34123. this.DDMInstance.stopEvent(e);
  34124. }
  34125. }
  34126. },
  34127. clickValidator: function(e) {
  34128. var target = e.getTarget();
  34129. return ( this.isValidHandleChild(target) &&
  34130. (this.id == this.handleElId ||
  34131. this.DDMInstance.handleWasClicked(target, this.id)) );
  34132. },
  34133. addInvalidHandleType: function(tagName) {
  34134. var type = tagName.toUpperCase();
  34135. this.invalidHandleTypes[type] = type;
  34136. },
  34137. addInvalidHandleId: function(id) {
  34138. if (typeof id !== "string") {
  34139. id = Ext.id(id);
  34140. }
  34141. this.invalidHandleIds[id] = id;
  34142. },
  34143. addInvalidHandleClass: function(cssClass) {
  34144. this.invalidHandleClasses.push(cssClass);
  34145. },
  34146. removeInvalidHandleType: function(tagName) {
  34147. var type = tagName.toUpperCase();
  34148. delete this.invalidHandleTypes[type];
  34149. },
  34150. removeInvalidHandleId: function(id) {
  34151. if (typeof id !== "string") {
  34152. id = Ext.id(id);
  34153. }
  34154. delete this.invalidHandleIds[id];
  34155. },
  34156. removeInvalidHandleClass: function(cssClass) {
  34157. for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
  34158. if (this.invalidHandleClasses[i] == cssClass) {
  34159. delete this.invalidHandleClasses[i];
  34160. }
  34161. }
  34162. },
  34163. isValidHandleChild: function(node) {
  34164. var valid = true,
  34165. nodeName,
  34166. i, len;
  34167. try {
  34168. nodeName = node.nodeName.toUpperCase();
  34169. } catch(e) {
  34170. nodeName = node.nodeName;
  34171. }
  34172. valid = valid && !this.invalidHandleTypes[nodeName];
  34173. valid = valid && !this.invalidHandleIds[node.id];
  34174. for (i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
  34175. valid = !Ext.fly(node).hasCls(this.invalidHandleClasses[i]);
  34176. }
  34177. return valid;
  34178. },
  34179. setXTicks: function(iStartX, iTickSize) {
  34180. this.xTicks = [];
  34181. this.xTickSize = iTickSize;
  34182. var tickMap = {},
  34183. i;
  34184. for (i = this.initPageX; i >= this.minX; i = i - iTickSize) {
  34185. if (!tickMap[i]) {
  34186. this.xTicks[this.xTicks.length] = i;
  34187. tickMap[i] = true;
  34188. }
  34189. }
  34190. for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
  34191. if (!tickMap[i]) {
  34192. this.xTicks[this.xTicks.length] = i;
  34193. tickMap[i] = true;
  34194. }
  34195. }
  34196. Ext.Array.sort(this.xTicks, this.DDMInstance.numericSort);
  34197. },
  34198. setYTicks: function(iStartY, iTickSize) {
  34199. this.yTicks = [];
  34200. this.yTickSize = iTickSize;
  34201. var tickMap = {},
  34202. i;
  34203. for (i = this.initPageY; i >= this.minY; i = i - iTickSize) {
  34204. if (!tickMap[i]) {
  34205. this.yTicks[this.yTicks.length] = i;
  34206. tickMap[i] = true;
  34207. }
  34208. }
  34209. for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
  34210. if (!tickMap[i]) {
  34211. this.yTicks[this.yTicks.length] = i;
  34212. tickMap[i] = true;
  34213. }
  34214. }
  34215. Ext.Array.sort(this.yTicks, this.DDMInstance.numericSort);
  34216. },
  34217. setXConstraint: function(iLeft, iRight, iTickSize) {
  34218. this.leftConstraint = iLeft;
  34219. this.rightConstraint = iRight;
  34220. this.minX = this.initPageX - iLeft;
  34221. this.maxX = this.initPageX + iRight;
  34222. if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
  34223. this.constrainX = true;
  34224. },
  34225. clearConstraints: function() {
  34226. this.constrainX = false;
  34227. this.constrainY = false;
  34228. this.clearTicks();
  34229. },
  34230. clearTicks: function() {
  34231. this.xTicks = null;
  34232. this.yTicks = null;
  34233. this.xTickSize = 0;
  34234. this.yTickSize = 0;
  34235. },
  34236. setYConstraint: function(iUp, iDown, iTickSize) {
  34237. this.topConstraint = iUp;
  34238. this.bottomConstraint = iDown;
  34239. this.minY = this.initPageY - iUp;
  34240. this.maxY = this.initPageY + iDown;
  34241. if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
  34242. this.constrainY = true;
  34243. },
  34244. resetConstraints: function() {
  34245. if (this.initPageX || this.initPageX === 0) {
  34246. var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0,
  34247. dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
  34248. this.setInitPosition(dx, dy);
  34249. } else {
  34250. this.setInitPosition();
  34251. }
  34252. if (this.constrainX) {
  34253. this.setXConstraint( this.leftConstraint,
  34254. this.rightConstraint,
  34255. this.xTickSize );
  34256. }
  34257. if (this.constrainY) {
  34258. this.setYConstraint( this.topConstraint,
  34259. this.bottomConstraint,
  34260. this.yTickSize );
  34261. }
  34262. },
  34263. getTick: function(val, tickArray) {
  34264. if (!tickArray) {
  34265. return val;
  34266. } else if (tickArray[0] >= val) {
  34267. return tickArray[0];
  34268. } else {
  34269. var i, len, next, diff1, diff2;
  34270. for (i=0, len=tickArray.length; i<len; ++i) {
  34271. next = i + 1;
  34272. if (tickArray[next] && tickArray[next] >= val) {
  34273. diff1 = val - tickArray[i];
  34274. diff2 = tickArray[next] - val;
  34275. return (diff2 > diff1) ? tickArray[i] : tickArray[next];
  34276. }
  34277. }
  34278. return tickArray[tickArray.length - 1];
  34279. }
  34280. },
  34281. toString: function() {
  34282. return ("DragDrop " + this.id);
  34283. }
  34284. });
  34285. Ext.define('Ext.dd.DD', {
  34286. extend: 'Ext.dd.DragDrop',
  34287. requires: ['Ext.dd.DragDropManager'],
  34288. constructor: function(id, sGroup, config) {
  34289. if (id) {
  34290. this.init(id, sGroup, config);
  34291. }
  34292. },
  34293. scroll: true,
  34294. autoOffset: function(iPageX, iPageY) {
  34295. var x = iPageX - this.startPageX,
  34296. y = iPageY - this.startPageY;
  34297. this.setDelta(x, y);
  34298. },
  34299. setDelta: function(iDeltaX, iDeltaY) {
  34300. this.deltaX = iDeltaX;
  34301. this.deltaY = iDeltaY;
  34302. },
  34303. setDragElPos: function(iPageX, iPageY) {
  34304. var el = this.getDragEl();
  34305. this.alignElWithMouse(el, iPageX, iPageY);
  34306. },
  34307. alignElWithMouse: function(el, iPageX, iPageY) {
  34308. var oCoord = this.getTargetCoord(iPageX, iPageY),
  34309. fly = el.dom ? el : Ext.fly(el, '_dd'),
  34310. elSize = fly.getSize(),
  34311. EL = Ext.Element,
  34312. vpSize,
  34313. aCoord,
  34314. newLeft,
  34315. newTop;
  34316. if (!this.deltaSetXY) {
  34317. vpSize = this.cachedViewportSize = { width: EL.getDocumentWidth(), height: EL.getDocumentHeight() };
  34318. aCoord = [
  34319. Math.max(0, Math.min(oCoord.x, vpSize.width - elSize.width)),
  34320. Math.max(0, Math.min(oCoord.y, vpSize.height - elSize.height))
  34321. ];
  34322. fly.setXY(aCoord);
  34323. newLeft = fly.getLocalX();
  34324. newTop = fly.getLocalY();
  34325. this.deltaSetXY = [newLeft - oCoord.x, newTop - oCoord.y];
  34326. } else {
  34327. vpSize = this.cachedViewportSize;
  34328. fly.setLeftTop(
  34329. Math.max(0, Math.min(oCoord.x + this.deltaSetXY[0], vpSize.width - elSize.width)),
  34330. Math.max(0, Math.min(oCoord.y + this.deltaSetXY[1], vpSize.height - elSize.height))
  34331. );
  34332. }
  34333. this.cachePosition(oCoord.x, oCoord.y);
  34334. this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
  34335. return oCoord;
  34336. },
  34337. cachePosition: function(iPageX, iPageY) {
  34338. if (iPageX) {
  34339. this.lastPageX = iPageX;
  34340. this.lastPageY = iPageY;
  34341. } else {
  34342. var aCoord = Ext.Element.getXY(this.getEl());
  34343. this.lastPageX = aCoord[0];
  34344. this.lastPageY = aCoord[1];
  34345. }
  34346. },
  34347. autoScroll: function(x, y, h, w) {
  34348. if (this.scroll) {
  34349. var clientH = Ext.Element.getViewHeight(),
  34350. clientW = Ext.Element.getViewWidth(),
  34351. st = this.DDMInstance.getScrollTop(),
  34352. sl = this.DDMInstance.getScrollLeft(),
  34353. bot = h + y,
  34354. right = w + x,
  34355. toBot = (clientH + st - y - this.deltaY),
  34356. toRight = (clientW + sl - x - this.deltaX),
  34357. thresh = 40,
  34358. scrAmt = (document.all) ? 80 : 30;
  34359. if ( bot > clientH && toBot < thresh ) {
  34360. window.scrollTo(sl, st + scrAmt);
  34361. }
  34362. if ( y < st && st > 0 && y - st < thresh ) {
  34363. window.scrollTo(sl, st - scrAmt);
  34364. }
  34365. if ( right > clientW && toRight < thresh ) {
  34366. window.scrollTo(sl + scrAmt, st);
  34367. }
  34368. if ( x < sl && sl > 0 && x - sl < thresh ) {
  34369. window.scrollTo(sl - scrAmt, st);
  34370. }
  34371. }
  34372. },
  34373. getTargetCoord: function(iPageX, iPageY) {
  34374. var x = iPageX - this.deltaX,
  34375. y = iPageY - this.deltaY;
  34376. if (this.constrainX) {
  34377. if (x < this.minX) {
  34378. x = this.minX;
  34379. }
  34380. if (x > this.maxX) {
  34381. x = this.maxX;
  34382. }
  34383. }
  34384. if (this.constrainY) {
  34385. if (y < this.minY) {
  34386. y = this.minY;
  34387. }
  34388. if (y > this.maxY) {
  34389. y = this.maxY;
  34390. }
  34391. }
  34392. x = this.getTick(x, this.xTicks);
  34393. y = this.getTick(y, this.yTicks);
  34394. return {x: x, y: y};
  34395. },
  34396. applyConfig: function() {
  34397. this.callParent();
  34398. this.scroll = (this.config.scroll !== false);
  34399. },
  34400. b4MouseDown: function(e) {
  34401. this.autoOffset(e.getPageX(), e.getPageY());
  34402. },
  34403. b4Drag: function(e) {
  34404. this.setDragElPos(e.getPageX(), e.getPageY());
  34405. },
  34406. toString: function() {
  34407. return ("DD " + this.id);
  34408. }
  34409. });
  34410. Ext.define('Ext.dd.DDProxy', {
  34411. extend: 'Ext.dd.DD',
  34412. statics: {
  34413. dragElId: "ygddfdiv"
  34414. },
  34415. constructor: function(id, sGroup, config) {
  34416. if (id) {
  34417. this.init(id, sGroup, config);
  34418. this.initFrame();
  34419. }
  34420. },
  34421. resizeFrame: true,
  34422. centerFrame: false,
  34423. createFrame: function() {
  34424. var self = this,
  34425. body = document.body,
  34426. div,
  34427. s;
  34428. if (!body || !body.firstChild) {
  34429. setTimeout( function() { self.createFrame(); }, 50 );
  34430. return;
  34431. }
  34432. div = this.getDragEl();
  34433. if (!div) {
  34434. div = document.createElement("div");
  34435. div.id = this.dragElId;
  34436. s = div.style;
  34437. s.position = "absolute";
  34438. s.visibility = "hidden";
  34439. s.cursor = "move";
  34440. s.border = "2px solid #aaa";
  34441. s.zIndex = 999;
  34442. body.insertBefore(div, body.firstChild);
  34443. }
  34444. },
  34445. initFrame: function() {
  34446. this.createFrame();
  34447. },
  34448. applyConfig: function() {
  34449. this.callParent();
  34450. this.resizeFrame = (this.config.resizeFrame !== false);
  34451. this.centerFrame = (this.config.centerFrame);
  34452. this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);
  34453. },
  34454. showFrame: function(iPageX, iPageY) {
  34455. var el = this.getEl(),
  34456. dragEl = this.getDragEl(),
  34457. s = dragEl.style;
  34458. this._resizeProxy();
  34459. if (this.centerFrame) {
  34460. this.setDelta( Math.round(parseInt(s.width, 10)/2),
  34461. Math.round(parseInt(s.height, 10)/2) );
  34462. }
  34463. this.setDragElPos(iPageX, iPageY);
  34464. Ext.fly(dragEl).show();
  34465. },
  34466. _resizeProxy: function() {
  34467. if (this.resizeFrame) {
  34468. var el = this.getEl();
  34469. Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
  34470. }
  34471. },
  34472. b4MouseDown: function(e) {
  34473. var x = e.getPageX(),
  34474. y = e.getPageY();
  34475. this.autoOffset(x, y);
  34476. this.setDragElPos(x, y);
  34477. },
  34478. b4StartDrag: function(x, y) {
  34479. this.showFrame(x, y);
  34480. },
  34481. b4EndDrag: function(e) {
  34482. Ext.fly(this.getDragEl()).hide();
  34483. },
  34484. endDrag: function(e) {
  34485. var lel = this.getEl(),
  34486. del = this.getDragEl();
  34487. del.style.visibility = "";
  34488. this.beforeMove();
  34489. lel.style.visibility = "hidden";
  34490. Ext.dd.DDM.moveToEl(lel, del);
  34491. del.style.visibility = "hidden";
  34492. lel.style.visibility = "";
  34493. this.afterDrag();
  34494. },
  34495. beforeMove : function(){
  34496. },
  34497. afterDrag : function(){
  34498. },
  34499. toString: function() {
  34500. return ("DDProxy " + this.id);
  34501. }
  34502. });
  34503. Ext.define('Ext.dd.StatusProxy', {
  34504. extend: 'Ext.Component',
  34505. animRepair: false,
  34506. childEls: [
  34507. 'ghost'
  34508. ],
  34509. renderTpl: [
  34510. '<div class="' + Ext.baseCSSPrefix + 'dd-drop-icon"></div>' +
  34511. '<div id="{id}-ghost" class="' + Ext.baseCSSPrefix + 'dd-drag-ghost"></div>'
  34512. ],
  34513. constructor: function(config) {
  34514. var me = this;
  34515. config = config || {};
  34516. Ext.apply(me, {
  34517. hideMode: 'visibility',
  34518. hidden: true,
  34519. floating: true,
  34520. id: me.id || Ext.id(),
  34521. cls: Ext.baseCSSPrefix + 'dd-drag-proxy ' + this.dropNotAllowed,
  34522. shadow: config.shadow || false,
  34523. renderTo: Ext.getDetachedBody()
  34524. });
  34525. me.callParent(arguments);
  34526. this.dropStatus = this.dropNotAllowed;
  34527. },
  34528. dropAllowed : Ext.baseCSSPrefix + 'dd-drop-ok',
  34529. dropNotAllowed : Ext.baseCSSPrefix + 'dd-drop-nodrop',
  34530. setStatus : function(cssClass){
  34531. cssClass = cssClass || this.dropNotAllowed;
  34532. if (this.dropStatus != cssClass) {
  34533. this.el.replaceCls(this.dropStatus, cssClass);
  34534. this.dropStatus = cssClass;
  34535. }
  34536. },
  34537. reset : function(clearGhost){
  34538. var me = this,
  34539. clsPrefix = Ext.baseCSSPrefix + 'dd-drag-proxy ';
  34540. me.el.replaceCls(clsPrefix + me.dropAllowed, clsPrefix + me.dropNotAllowed);
  34541. me.dropStatus = me.dropNotAllowed;
  34542. if (clearGhost) {
  34543. me.ghost.update('');
  34544. }
  34545. },
  34546. update : function(html){
  34547. if (typeof html == "string") {
  34548. this.ghost.update(html);
  34549. } else {
  34550. this.ghost.update("");
  34551. html.style.margin = "0";
  34552. this.ghost.dom.appendChild(html);
  34553. }
  34554. var el = this.ghost.dom.firstChild;
  34555. if (el) {
  34556. Ext.fly(el).setStyle('float', 'none');
  34557. }
  34558. },
  34559. getGhost : function(){
  34560. return this.ghost;
  34561. },
  34562. hide : function(clear) {
  34563. this.callParent();
  34564. if (clear) {
  34565. this.reset(true);
  34566. }
  34567. },
  34568. stop : function(){
  34569. if (this.anim && this.anim.isAnimated && this.anim.isAnimated()) {
  34570. this.anim.stop();
  34571. }
  34572. },
  34573. sync : function(){
  34574. this.el.sync();
  34575. },
  34576. repair : function(xy, callback, scope) {
  34577. var me = this;
  34578. me.callback = callback;
  34579. me.scope = scope;
  34580. if (xy && me.animRepair !== false) {
  34581. me.el.addCls(Ext.baseCSSPrefix + 'dd-drag-repair');
  34582. me.el.hideUnders(true);
  34583. me.anim = me.el.animate({
  34584. duration: me.repairDuration || 500,
  34585. easing: 'ease-out',
  34586. to: {
  34587. x: xy[0],
  34588. y: xy[1]
  34589. },
  34590. stopAnimation: true,
  34591. callback: me.afterRepair,
  34592. scope: me
  34593. });
  34594. } else {
  34595. me.afterRepair();
  34596. }
  34597. },
  34598. afterRepair : function() {
  34599. var me = this;
  34600. me.hide(true);
  34601. me.el.removeCls(Ext.baseCSSPrefix + 'dd-drag-repair');
  34602. if (typeof me.callback == "function") {
  34603. me.callback.call(me.scope || me);
  34604. }
  34605. delete me.callback;
  34606. delete me.scope;
  34607. }
  34608. });
  34609. Ext.define('Ext.dd.DragSource', {
  34610. extend: 'Ext.dd.DDProxy',
  34611. requires: [
  34612. 'Ext.dd.StatusProxy',
  34613. 'Ext.dd.DragDropManager'
  34614. ],
  34615. dropAllowed : Ext.baseCSSPrefix + 'dd-drop-ok',
  34616. dropNotAllowed : Ext.baseCSSPrefix + 'dd-drop-nodrop',
  34617. animRepair: true,
  34618. repairHighlightColor: 'c3daf9',
  34619. constructor: function(el, config) {
  34620. this.el = Ext.get(el);
  34621. if(!this.dragData){
  34622. this.dragData = {};
  34623. }
  34624. Ext.apply(this, config);
  34625. if(!this.proxy){
  34626. this.proxy = new Ext.dd.StatusProxy({
  34627. id: this.el.id + '-drag-status-proxy',
  34628. animRepair: this.animRepair
  34629. });
  34630. }
  34631. this.callParent([this.el.dom, this.ddGroup || this.group,
  34632. {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true}]);
  34633. this.dragging = false;
  34634. },
  34635. getDragData : function(e){
  34636. return this.dragData;
  34637. },
  34638. onDragEnter : function(e, id){
  34639. var target = Ext.dd.DragDropManager.getDDById(id),
  34640. status;
  34641. this.cachedTarget = target;
  34642. if (this.beforeDragEnter(target, e, id) !== false) {
  34643. if (target.isNotifyTarget) {
  34644. status = target.notifyEnter(this, e, this.dragData);
  34645. this.proxy.setStatus(status);
  34646. } else {
  34647. this.proxy.setStatus(this.dropAllowed);
  34648. }
  34649. if (this.afterDragEnter) {
  34650. this.afterDragEnter(target, e, id);
  34651. }
  34652. }
  34653. },
  34654. beforeDragEnter: function(target, e, id) {
  34655. return true;
  34656. },
  34657. onDragOver: function(e, id) {
  34658. var target = this.cachedTarget || Ext.dd.DragDropManager.getDDById(id),
  34659. status;
  34660. if (this.beforeDragOver(target, e, id) !== false) {
  34661. if(target.isNotifyTarget){
  34662. status = target.notifyOver(this, e, this.dragData);
  34663. this.proxy.setStatus(status);
  34664. }
  34665. if (this.afterDragOver) {
  34666. this.afterDragOver(target, e, id);
  34667. }
  34668. }
  34669. },
  34670. beforeDragOver: function(target, e, id) {
  34671. return true;
  34672. },
  34673. onDragOut: function(e, id) {
  34674. var target = this.cachedTarget || Ext.dd.DragDropManager.getDDById(id);
  34675. if (this.beforeDragOut(target, e, id) !== false) {
  34676. if (target.isNotifyTarget) {
  34677. target.notifyOut(this, e, this.dragData);
  34678. }
  34679. this.proxy.reset();
  34680. if (this.afterDragOut) {
  34681. this.afterDragOut(target, e, id);
  34682. }
  34683. }
  34684. this.cachedTarget = null;
  34685. },
  34686. beforeDragOut: function(target, e, id){
  34687. return true;
  34688. },
  34689. onDragDrop: function(e, id){
  34690. var target = this.cachedTarget || Ext.dd.DragDropManager.getDDById(id);
  34691. if (this.beforeDragDrop(target, e, id) !== false) {
  34692. if (target.isNotifyTarget) {
  34693. if (target.notifyDrop(this, e, this.dragData) !== false) {
  34694. this.onValidDrop(target, e, id);
  34695. } else {
  34696. this.onInvalidDrop(target, e, id);
  34697. }
  34698. } else {
  34699. this.onValidDrop(target, e, id);
  34700. }
  34701. if (this.afterDragDrop) {
  34702. this.afterDragDrop(target, e, id);
  34703. }
  34704. }
  34705. delete this.cachedTarget;
  34706. },
  34707. beforeDragDrop: function(target, e, id){
  34708. return true;
  34709. },
  34710. onValidDrop: function(target, e, id){
  34711. this.hideProxy();
  34712. if(this.afterValidDrop){
  34713. this.afterValidDrop(target, e, id);
  34714. }
  34715. },
  34716. getRepairXY: function(e, data){
  34717. return this.el.getXY();
  34718. },
  34719. onInvalidDrop: function(target, e, id) {
  34720. if (!e) {
  34721. e = target;
  34722. target = null;
  34723. id = e.getTarget().id;
  34724. }
  34725. this.beforeInvalidDrop(target, e, id);
  34726. if (this.cachedTarget) {
  34727. if(this.cachedTarget.isNotifyTarget){
  34728. this.cachedTarget.notifyOut(this, e, this.dragData);
  34729. }
  34730. this.cacheTarget = null;
  34731. }
  34732. this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
  34733. if (this.afterInvalidDrop) {
  34734. this.afterInvalidDrop(e, id);
  34735. }
  34736. },
  34737. afterRepair: function() {
  34738. var me = this;
  34739. if (Ext.enableFx) {
  34740. me.el.highlight(me.repairHighlightColor);
  34741. }
  34742. me.dragging = false;
  34743. },
  34744. beforeInvalidDrop: function(target, e, id) {
  34745. return true;
  34746. },
  34747. handleMouseDown: function(e) {
  34748. if (this.dragging) {
  34749. return;
  34750. }
  34751. var data = this.getDragData(e);
  34752. if (data && this.onBeforeDrag(data, e) !== false) {
  34753. this.dragData = data;
  34754. this.proxy.stop();
  34755. this.callParent(arguments);
  34756. }
  34757. },
  34758. onBeforeDrag: function(data, e){
  34759. return true;
  34760. },
  34761. onStartDrag: Ext.emptyFn,
  34762. alignElWithMouse: function() {
  34763. this.proxy.ensureAttachedToBody(true);
  34764. return this.callParent(arguments);
  34765. },
  34766. startDrag: function(x, y) {
  34767. this.proxy.reset();
  34768. this.proxy.hidden = false;
  34769. this.dragging = true;
  34770. this.proxy.update("");
  34771. this.onInitDrag(x, y);
  34772. this.proxy.show();
  34773. },
  34774. onInitDrag: function(x, y) {
  34775. var clone = this.el.dom.cloneNode(true);
  34776. clone.id = Ext.id();
  34777. this.proxy.update(clone);
  34778. this.onStartDrag(x, y);
  34779. return true;
  34780. },
  34781. getProxy: function() {
  34782. return this.proxy;
  34783. },
  34784. hideProxy: function() {
  34785. this.proxy.hide();
  34786. this.proxy.reset(true);
  34787. this.dragging = false;
  34788. },
  34789. triggerCacheRefresh: function() {
  34790. Ext.dd.DDM.refreshCache(this.groups);
  34791. },
  34792. b4EndDrag: function(e) {
  34793. },
  34794. endDrag : function(e){
  34795. this.onEndDrag(this.dragData, e);
  34796. },
  34797. onEndDrag : function(data, e){
  34798. },
  34799. autoOffset : function(x, y) {
  34800. this.setDelta(-12, -20);
  34801. },
  34802. destroy: function(){
  34803. this.callParent();
  34804. Ext.destroy(this.proxy);
  34805. }
  34806. });
  34807. Ext.define('Ext.panel.Proxy', {
  34808. alternateClassName: 'Ext.dd.PanelProxy',
  34809. moveOnDrag: true,
  34810. constructor: function(panel, config){
  34811. var me = this;
  34812. me.panel = panel;
  34813. me.id = me.panel.id +'-ddproxy';
  34814. Ext.apply(me, config);
  34815. },
  34816. insertProxy: true,
  34817. setStatus: Ext.emptyFn,
  34818. reset: Ext.emptyFn,
  34819. update: Ext.emptyFn,
  34820. stop: Ext.emptyFn,
  34821. sync: Ext.emptyFn,
  34822. getEl: function(){
  34823. return this.ghost.el;
  34824. },
  34825. getGhost: function(){
  34826. return this.ghost;
  34827. },
  34828. getProxy: function(){
  34829. return this.proxy;
  34830. },
  34831. hide : function(){
  34832. var me = this;
  34833. if (me.ghost) {
  34834. if (me.proxy) {
  34835. me.proxy.remove();
  34836. delete me.proxy;
  34837. }
  34838. me.panel.unghost(null, me.moveOnDrag);
  34839. delete me.ghost;
  34840. }
  34841. },
  34842. show: function(){
  34843. var me = this,
  34844. panelSize;
  34845. if (!me.ghost) {
  34846. panelSize = me.panel.getSize();
  34847. me.panel.el.setVisibilityMode(Ext.Element.DISPLAY);
  34848. me.ghost = me.panel.ghost();
  34849. if (me.insertProxy) {
  34850. me.proxy = me.panel.el.insertSibling({cls: Ext.baseCSSPrefix + 'panel-dd-spacer'});
  34851. me.proxy.setSize(panelSize);
  34852. }
  34853. }
  34854. },
  34855. repair: function(xy, callback, scope) {
  34856. this.hide();
  34857. Ext.callback(callback, scope || this);
  34858. },
  34859. moveProxy : function(parentNode, before){
  34860. if (this.proxy) {
  34861. parentNode.insertBefore(this.proxy.dom, before);
  34862. }
  34863. }
  34864. });
  34865. Ext.define('Ext.panel.DD', {
  34866. extend: 'Ext.dd.DragSource',
  34867. requires: ['Ext.panel.Proxy'],
  34868. constructor : function(panel, cfg){
  34869. var me = this;
  34870. me.panel = panel;
  34871. me.dragData = {panel: panel};
  34872. me.panelProxy = new Ext.panel.Proxy(panel, cfg);
  34873. me.proxy = me.panelProxy.proxy;
  34874. me.callParent([panel.el, cfg]);
  34875. me.setupEl(panel);
  34876. },
  34877. setupEl: function(panel){
  34878. var me = this,
  34879. header = panel.header,
  34880. el = panel.body;
  34881. if (header) {
  34882. me.setHandleElId(header.id);
  34883. el = header.el;
  34884. }
  34885. if (el) {
  34886. el.setStyle('cursor', 'move');
  34887. me.scroll = false;
  34888. } else {
  34889. panel.on('boxready', me.setupEl, me, {single: true});
  34890. }
  34891. },
  34892. showFrame: Ext.emptyFn,
  34893. startDrag: Ext.emptyFn,
  34894. b4StartDrag: function(x, y) {
  34895. this.panelProxy.show();
  34896. },
  34897. b4MouseDown: function(e) {
  34898. var x = e.getPageX(),
  34899. y = e.getPageY();
  34900. this.autoOffset(x, y);
  34901. },
  34902. onInitDrag : function(x, y){
  34903. this.onStartDrag(x, y);
  34904. return true;
  34905. },
  34906. createFrame : Ext.emptyFn,
  34907. getDragEl : function(e){
  34908. return this.panelProxy.ghost.el.dom;
  34909. },
  34910. endDrag : function(e){
  34911. this.panelProxy.hide();
  34912. this.panel.saveState();
  34913. },
  34914. autoOffset : function(x, y) {
  34915. x -= this.startPageX;
  34916. y -= this.startPageY;
  34917. this.setDelta(x, y);
  34918. },
  34919. onInvalidDrop: function(target, e, id) {
  34920. var me = this;
  34921. me.beforeInvalidDrop(target, e, id);
  34922. if (me.cachedTarget) {
  34923. if(me.cachedTarget.isNotifyTarget){
  34924. me.cachedTarget.notifyOut(me, e, me.dragData);
  34925. }
  34926. me.cacheTarget = null;
  34927. }
  34928. if (me.afterInvalidDrop) {
  34929. me.afterInvalidDrop(e, id);
  34930. }
  34931. }
  34932. });
  34933. Ext.define('Ext.util.Memento', (function () {
  34934. function captureOne (src, target, prop, prefix) {
  34935. src[prefix ? prefix + prop : prop] = target[prop];
  34936. }
  34937. function removeOne (src, target, prop) {
  34938. delete src[prop];
  34939. }
  34940. function restoreOne (src, target, prop, prefix) {
  34941. var name = prefix ? prefix + prop : prop,
  34942. value = src[name];
  34943. if (value || src.hasOwnProperty(name)) {
  34944. restoreValue(target, prop, value);
  34945. }
  34946. }
  34947. function restoreValue (target, prop, value) {
  34948. if (Ext.isDefined(value)) {
  34949. target[prop] = value;
  34950. } else {
  34951. delete target[prop];
  34952. }
  34953. }
  34954. function doMany (doOne, src, target, props, prefix) {
  34955. if (src) {
  34956. if (Ext.isArray(props)) {
  34957. var p, pLen = props.length;
  34958. for (p = 0; p < pLen; p++) {
  34959. doOne(src, target, props[p], prefix);
  34960. }
  34961. } else {
  34962. doOne(src, target, props, prefix);
  34963. }
  34964. }
  34965. }
  34966. return {
  34967. data: null,
  34968. target: null,
  34969. constructor: function (target, props) {
  34970. if (target) {
  34971. this.target = target;
  34972. if (props) {
  34973. this.capture(props);
  34974. }
  34975. }
  34976. },
  34977. capture: function (props, target, prefix) {
  34978. var me = this;
  34979. doMany(captureOne, me.data || (me.data = {}), target || me.target, props, prefix);
  34980. },
  34981. remove: function (props) {
  34982. doMany(removeOne, this.data, null, props);
  34983. },
  34984. restore: function (props, clear, target, prefix) {
  34985. doMany(restoreOne, this.data, target || this.target, props, prefix);
  34986. if (clear !== false) {
  34987. this.remove(props);
  34988. }
  34989. },
  34990. restoreAll: function (clear, target) {
  34991. var me = this,
  34992. t = target || this.target,
  34993. data = me.data,
  34994. prop;
  34995. for (prop in data) {
  34996. if (data.hasOwnProperty(prop)) {
  34997. restoreValue(t, prop, data[prop]);
  34998. }
  34999. }
  35000. if (clear !== false) {
  35001. delete me.data;
  35002. }
  35003. }
  35004. };
  35005. }()));
  35006. Ext.define('Ext.panel.Panel', {
  35007. extend: 'Ext.panel.AbstractPanel',
  35008. requires: [
  35009. 'Ext.panel.Header',
  35010. 'Ext.fx.Anim',
  35011. 'Ext.util.KeyMap',
  35012. 'Ext.panel.DD',
  35013. 'Ext.XTemplate',
  35014. 'Ext.layout.component.Dock',
  35015. 'Ext.util.Memento'
  35016. ],
  35017. alias: 'widget.panel',
  35018. alternateClassName: 'Ext.Panel',
  35019. collapsedCls: 'collapsed',
  35020. animCollapse: Ext.enableFx,
  35021. minButtonWidth: 75,
  35022. collapsed: false,
  35023. collapseFirst: true,
  35024. hideCollapseTool: false,
  35025. titleCollapse: false,
  35026. floatable: true,
  35027. collapsible: false,
  35028. closable: false,
  35029. closeAction: 'destroy',
  35030. placeholderCollapseHideMode: Ext.Element.VISIBILITY,
  35031. preventHeader: false,
  35032. header: undefined,
  35033. headerPosition: 'top',
  35034. frame: false,
  35035. frameHeader: true,
  35036. titleAlign: 'left',
  35037. manageHeight: true,
  35038. initComponent: function() {
  35039. var me = this;
  35040. me.addEvents(
  35041. 'beforeclose',
  35042. 'close',
  35043. "beforeexpand",
  35044. "beforecollapse",
  35045. "expand",
  35046. "collapse",
  35047. 'titlechange',
  35048. 'iconchange',
  35049. 'iconclschange'
  35050. );
  35051. if (me.collapsible) {
  35052. this.addStateEvents(['expand', 'collapse']);
  35053. }
  35054. if (me.unstyled) {
  35055. me.setUI('plain');
  35056. }
  35057. if (me.frame) {
  35058. me.setUI(me.ui + '-framed');
  35059. }
  35060. me.bridgeToolbars();
  35061. me.callParent();
  35062. me.collapseDirection = me.collapseDirection || me.headerPosition || Ext.Component.DIRECTION_TOP;
  35063. me.hiddenOnCollapse = new Ext.dom.CompositeElement();
  35064. },
  35065. beforeDestroy: function() {
  35066. var me = this;
  35067. Ext.destroy(
  35068. me.placeholder,
  35069. me.ghostPanel,
  35070. me.dd
  35071. );
  35072. me.callParent();
  35073. },
  35074. initAria: function() {
  35075. this.callParent();
  35076. this.initHeaderAria();
  35077. },
  35078. getFocusEl: function() {
  35079. return this.el;
  35080. },
  35081. initHeaderAria: function() {
  35082. var me = this,
  35083. el = me.el,
  35084. header = me.header;
  35085. if (el && header) {
  35086. el.dom.setAttribute('aria-labelledby', header.titleCmp.id);
  35087. }
  35088. },
  35089. getHeader: function() {
  35090. return this.header;
  35091. },
  35092. setTitle: function(newTitle) {
  35093. var me = this,
  35094. oldTitle = me.title,
  35095. header = me.header,
  35096. reExpander = me.reExpander,
  35097. placeholder = me.placeholder;
  35098. me.title = newTitle;
  35099. if (header) {
  35100. if (header.isHeader) {
  35101. header.setTitle(newTitle);
  35102. } else {
  35103. header.title = newTitle;
  35104. }
  35105. } else {
  35106. me.updateHeader();
  35107. }
  35108. if (reExpander) {
  35109. reExpander.setTitle(newTitle);
  35110. }
  35111. if (placeholder && placeholder.setTitle) {
  35112. placeholder.setTitle(newTitle);
  35113. }
  35114. me.fireEvent('titlechange', me, newTitle, oldTitle);
  35115. },
  35116. setIconCls: function(newIconCls) {
  35117. var me = this,
  35118. oldIconCls = me.iconCls,
  35119. header = me.header,
  35120. placeholder = me.placeholder;
  35121. me.iconCls = newIconCls;
  35122. if (header) {
  35123. if (header.isHeader) {
  35124. header.setIconCls(newIconCls);
  35125. } else {
  35126. header.iconCls = newIconCls;
  35127. }
  35128. } else {
  35129. me.updateHeader();
  35130. }
  35131. if (placeholder && placeholder.setIconCls) {
  35132. placeholder.setIconCls(newIconCls);
  35133. }
  35134. me.fireEvent('iconclschange', me, newIconCls, oldIconCls);
  35135. },
  35136. setIcon: function(newIcon) {
  35137. var me = this,
  35138. oldIcon = me.icon,
  35139. header = me.header,
  35140. placeholder = me.placeholder;
  35141. me.icon = newIcon;
  35142. if (header) {
  35143. if (header.isHeader) {
  35144. header.setIcon(newIcon);
  35145. } else {
  35146. header.icon = newIcon;
  35147. }
  35148. } else {
  35149. me.updateHeader();
  35150. }
  35151. if (placeholder && placeholder.setIcon) {
  35152. placeholder.setIcon(newIcon);
  35153. }
  35154. me.fireEvent('iconchange', me, newIcon, oldIcon);
  35155. },
  35156. bridgeToolbars: function() {
  35157. var me = this,
  35158. docked = [],
  35159. fbar,
  35160. fbarDefaults,
  35161. minButtonWidth = me.minButtonWidth;
  35162. function initToolbar (toolbar, pos, useButtonAlign) {
  35163. if (Ext.isArray(toolbar)) {
  35164. toolbar = {
  35165. xtype: 'toolbar',
  35166. items: toolbar
  35167. };
  35168. }
  35169. else if (!toolbar.xtype) {
  35170. toolbar.xtype = 'toolbar';
  35171. }
  35172. toolbar.dock = pos;
  35173. if (pos == 'left' || pos == 'right') {
  35174. toolbar.vertical = true;
  35175. }
  35176. if (useButtonAlign) {
  35177. toolbar.layout = Ext.applyIf(toolbar.layout || {}, {
  35178. pack: { left:'start', center:'center' }[me.buttonAlign] || 'end'
  35179. });
  35180. }
  35181. return toolbar;
  35182. }
  35183. if (me.tbar) {
  35184. docked.push(initToolbar(me.tbar, 'top'));
  35185. me.tbar = null;
  35186. }
  35187. if (me.bbar) {
  35188. docked.push(initToolbar(me.bbar, 'bottom'));
  35189. me.bbar = null;
  35190. }
  35191. if (me.buttons) {
  35192. me.fbar = me.buttons;
  35193. me.buttons = null;
  35194. }
  35195. if (me.fbar) {
  35196. fbar = initToolbar(me.fbar, 'bottom', true);
  35197. fbar.ui = 'footer';
  35198. if (minButtonWidth) {
  35199. fbarDefaults = fbar.defaults;
  35200. fbar.defaults = function(config) {
  35201. var defaults = fbarDefaults || {};
  35202. if ((!config.xtype || config.xtype === 'button' || (config.isComponent && config.isXType('button'))) &&
  35203. !('minWidth' in defaults)) {
  35204. defaults = Ext.apply({minWidth: minButtonWidth}, defaults);
  35205. }
  35206. return defaults;
  35207. };
  35208. }
  35209. docked.push(fbar);
  35210. me.fbar = null;
  35211. }
  35212. if (me.lbar) {
  35213. docked.push(initToolbar(me.lbar, 'left'));
  35214. me.lbar = null;
  35215. }
  35216. if (me.rbar) {
  35217. docked.push(initToolbar(me.rbar, 'right'));
  35218. me.rbar = null;
  35219. }
  35220. if (me.dockedItems) {
  35221. if (!Ext.isArray(me.dockedItems)) {
  35222. me.dockedItems = [me.dockedItems];
  35223. }
  35224. me.dockedItems = me.dockedItems.concat(docked);
  35225. } else {
  35226. me.dockedItems = docked;
  35227. }
  35228. },
  35229. isPlaceHolderCollapse: function(){
  35230. return this.collapseMode == 'placeholder';
  35231. },
  35232. onBoxReady: function(){
  35233. this.callParent();
  35234. if (this.collapsed) {
  35235. this.setHiddenDocked();
  35236. }
  35237. },
  35238. beforeRender: function() {
  35239. var me = this,
  35240. wasCollapsed;
  35241. me.callParent();
  35242. me.initTools();
  35243. if (!(me.preventHeader || (me.header === false))) {
  35244. me.updateHeader();
  35245. }
  35246. if (me.collapsed) {
  35247. if (me.isPlaceHolderCollapse()) {
  35248. me.hidden = true;
  35249. me.placeholderCollapse();
  35250. wasCollapsed = me.collapsed;
  35251. me.collapsed = false;
  35252. } else {
  35253. me.beginCollapse();
  35254. me.addClsWithUI(me.collapsedCls);
  35255. }
  35256. }
  35257. if (wasCollapsed) {
  35258. me.collapsed = wasCollapsed;
  35259. }
  35260. },
  35261. initTools: function() {
  35262. var me = this;
  35263. me.tools = me.tools ? Ext.Array.clone(me.tools) : [];
  35264. if (me.collapsible && !(me.hideCollapseTool || me.header === false || me.preventHeader)) {
  35265. me.collapseDirection = me.collapseDirection || me.headerPosition || 'top';
  35266. me.collapseTool = me.expandTool = Ext.widget({
  35267. xtype: 'tool',
  35268. type: (me.collapsed && !me.isPlaceHolderCollapse()) ? ('expand-' + me.getOppositeDirection(me.collapseDirection)) : ('collapse-' + me.collapseDirection),
  35269. handler: me.toggleCollapse,
  35270. scope: me
  35271. });
  35272. if (me.collapseFirst) {
  35273. me.tools.unshift(me.collapseTool);
  35274. }
  35275. }
  35276. me.addTools();
  35277. if (me.closable) {
  35278. me.addClsWithUI('closable');
  35279. me.addTool({
  35280. type: 'close',
  35281. handler: Ext.Function.bind(me.close, me, [])
  35282. });
  35283. }
  35284. if (me.collapseTool && !me.collapseFirst) {
  35285. me.addTool(me.collapseTool);
  35286. }
  35287. },
  35288. addTools: Ext.emptyFn,
  35289. close: function() {
  35290. if (this.fireEvent('beforeclose', this) !== false) {
  35291. this.doClose();
  35292. }
  35293. },
  35294. doClose: function() {
  35295. this.fireEvent('close', this);
  35296. this[this.closeAction]();
  35297. },
  35298. updateHeader: function(force) {
  35299. var me = this,
  35300. header = me.header,
  35301. title = me.title,
  35302. tools = me.tools,
  35303. icon = me.icon || me.iconCls,
  35304. vertical = me.headerPosition == 'left' || me.headerPosition == 'right';
  35305. if ((header !== false) && (force || (title || icon) || (tools && tools.length) || (me.collapsible && !me.titleCollapse))) {
  35306. if (header && header.isHeader) {
  35307. header.show();
  35308. } else {
  35309. header = me.header = Ext.widget(Ext.apply({
  35310. xtype : 'header',
  35311. title : title,
  35312. titleAlign : me.titleAlign,
  35313. orientation : vertical ? 'vertical' : 'horizontal',
  35314. dock : me.headerPosition || 'top',
  35315. textCls : me.headerTextCls,
  35316. iconCls : me.iconCls,
  35317. icon : me.icon,
  35318. baseCls : me.baseCls + '-header',
  35319. tools : tools,
  35320. ui : me.ui,
  35321. id : me.id + '_header',
  35322. indicateDrag: me.draggable,
  35323. frame : (me.frame || me.alwaysFramed) && me.frameHeader,
  35324. ignoreParentFrame : me.frame || me.overlapHeader,
  35325. ignoreBorderManagement: me.frame || me.ignoreHeaderBorderManagement,
  35326. listeners : me.collapsible && me.titleCollapse ? {
  35327. click: me.toggleCollapse,
  35328. scope: me
  35329. } : null
  35330. }, me.header));
  35331. me.addDocked(header, 0);
  35332. me.tools = header.tools;
  35333. }
  35334. me.initHeaderAria();
  35335. } else if (header) {
  35336. header.hide();
  35337. }
  35338. },
  35339. setUI: function(ui) {
  35340. var me = this;
  35341. me.callParent(arguments);
  35342. if (me.header && me.header.rendered) {
  35343. me.header.setUI(ui);
  35344. }
  35345. },
  35346. getContentTarget: function() {
  35347. return this.body;
  35348. },
  35349. getTargetEl: function() {
  35350. var me = this;
  35351. return me.body || me.protoBody || me.frameBody || me.el;
  35352. },
  35353. isVisible: function(deep){
  35354. var me = this;
  35355. if (me.collapsed && me.placeholder) {
  35356. return me.placeholder.isVisible(deep);
  35357. }
  35358. return me.callParent(arguments);
  35359. },
  35360. onHide: function(){
  35361. var me = this;
  35362. if (me.collapsed && me.placeholder) {
  35363. me.placeholder.hide();
  35364. } else {
  35365. me.callParent(arguments);
  35366. }
  35367. },
  35368. onShow: function(){
  35369. var me = this;
  35370. if (me.collapsed && me.placeholder) {
  35371. me.hidden = true;
  35372. me.placeholder.show();
  35373. } else {
  35374. me.callParent(arguments);
  35375. }
  35376. },
  35377. onRemoved: function(destroying) {
  35378. var me = this;
  35379. me.callParent(arguments);
  35380. if (me.placeholder && !destroying) {
  35381. me.ownerCt.remove(me.placeholder, false);
  35382. }
  35383. },
  35384. addTool: function(tools) {
  35385. tools = [].concat(tools);
  35386. var me = this,
  35387. header = me.header,
  35388. t,
  35389. tLen = tools.length,
  35390. tool;
  35391. for (t = 0; t < tLen; t++) {
  35392. tool = tools[t];
  35393. me.tools.push(tool);
  35394. if (header && header.isHeader) {
  35395. header.addTool(tool);
  35396. }
  35397. }
  35398. me.updateHeader();
  35399. },
  35400. getOppositeDirection: function(d) {
  35401. var c = Ext.Component;
  35402. switch (d) {
  35403. case c.DIRECTION_TOP:
  35404. return c.DIRECTION_BOTTOM;
  35405. case c.DIRECTION_RIGHT:
  35406. return c.DIRECTION_LEFT;
  35407. case c.DIRECTION_BOTTOM:
  35408. return c.DIRECTION_TOP;
  35409. case c.DIRECTION_LEFT:
  35410. return c.DIRECTION_RIGHT;
  35411. }
  35412. },
  35413. getWidthAuthority: function() {
  35414. if (this.collapsed && this.collapsedHorizontal()) {
  35415. return 1;
  35416. }
  35417. return this.callParent();
  35418. },
  35419. getHeightAuthority: function() {
  35420. if (this.collapsed && this.collapsedVertical()) {
  35421. return 1;
  35422. }
  35423. return this.callParent();
  35424. },
  35425. collapsedHorizontal: function () {
  35426. var dir = this.getCollapsed();
  35427. return dir == 'left' || dir == 'right';
  35428. },
  35429. collapsedVertical: function () {
  35430. var dir = this.getCollapsed();
  35431. return dir == 'top' || dir == 'bottom';
  35432. },
  35433. restoreDimension: function(){
  35434. var dir = this.collapseDirection;
  35435. return (dir === 'top' || dir === 'bottom') ? 'height' : 'width';
  35436. },
  35437. getCollapsed: function() {
  35438. var me = this;
  35439. if (me.collapsed === true) {
  35440. return me.collapseDirection;
  35441. }
  35442. return me.collapsed;
  35443. },
  35444. getState: function() {
  35445. var me = this,
  35446. state = me.callParent(),
  35447. memento;
  35448. state = me.addPropertyToState(state, 'collapsed');
  35449. if (me.collapsed) {
  35450. memento = me.collapseMemento;
  35451. memento = memento && memento.data;
  35452. if (me.collapsedVertical()) {
  35453. if (state) {
  35454. delete state.height;
  35455. }
  35456. if (memento) {
  35457. state = me.addPropertyToState(state, 'height', memento.height);
  35458. }
  35459. } else {
  35460. if (state) {
  35461. delete state.width;
  35462. }
  35463. if (memento) {
  35464. state = me.addPropertyToState(state, 'width', memento.width);
  35465. }
  35466. }
  35467. }
  35468. return state;
  35469. },
  35470. findReExpander: function (direction) {
  35471. var me = this,
  35472. c = Ext.Component,
  35473. dockedItems = me.dockedItems.items,
  35474. dockedItemCount = dockedItems.length,
  35475. comp, i;
  35476. if (me.collapseMode == 'mini') {
  35477. return;
  35478. }
  35479. switch (direction) {
  35480. case c.DIRECTION_TOP:
  35481. case c.DIRECTION_BOTTOM:
  35482. for (i = 0; i < dockedItemCount; i++) {
  35483. comp = dockedItems[i];
  35484. if (!comp.hidden) {
  35485. if (comp.isHeader && (!comp.dock || comp.dock == 'top' || comp.dock == 'bottom')) {
  35486. return comp;
  35487. }
  35488. }
  35489. }
  35490. break;
  35491. case c.DIRECTION_LEFT:
  35492. case c.DIRECTION_RIGHT:
  35493. for (i = 0; i < dockedItemCount; i++) {
  35494. comp = dockedItems[i];
  35495. if (!comp.hidden) {
  35496. if (comp.isHeader && (comp.dock == 'left' || comp.dock == 'right')) {
  35497. return comp;
  35498. }
  35499. }
  35500. }
  35501. break;
  35502. default:
  35503. throw('Panel#findReExpander must be passed a valid collapseDirection');
  35504. }
  35505. },
  35506. getReExpander: function (direction) {
  35507. var me = this,
  35508. collapseDir = direction || me.collapseDirection,
  35509. reExpander = me.reExpander || me.findReExpander(collapseDir);
  35510. me.expandDirection = me.getOppositeDirection(collapseDir);
  35511. if (!reExpander) {
  35512. me.reExpander = reExpander = me.createReExpander(collapseDir, {
  35513. dock: collapseDir,
  35514. cls: Ext.baseCSSPrefix + 'docked ' + me.baseCls + '-' + me.ui + '-collapsed',
  35515. ownerCt: me,
  35516. ownerLayout: me.componentLayout
  35517. });
  35518. me.dockedItems.insert(0, reExpander);
  35519. }
  35520. return reExpander;
  35521. },
  35522. createReExpander: function(direction, defaults) {
  35523. var me = this,
  35524. isLeft = direction == 'left',
  35525. isRight = direction == 'right',
  35526. isVertical = isLeft || isRight,
  35527. toolAtTop,
  35528. result = Ext.apply({
  35529. hideMode: 'offsets',
  35530. title: me.title,
  35531. orientation: isVertical ? 'vertical' : 'horizontal',
  35532. textCls: me.headerTextCls,
  35533. icon: me.icon,
  35534. iconCls: me.iconCls,
  35535. baseCls: me.baseCls + '-header',
  35536. ui: me.ui,
  35537. frame: me.frame && me.frameHeader,
  35538. ignoreParentFrame: me.frame || me.overlapHeader,
  35539. indicateDrag: me.draggable
  35540. }, defaults);
  35541. if (me.collapseMode == 'mini') {
  35542. if (isVertical) {
  35543. result.width = 1;
  35544. } else {
  35545. result.height = 1;
  35546. }
  35547. }
  35548. if (!me.hideCollapseTool) {
  35549. toolAtTop = isLeft || (isRight && me.isPlaceHolderCollapse());
  35550. result[toolAtTop ? 'items' : 'tools'] = [{
  35551. xtype: 'tool',
  35552. type: 'expand-' + me.getOppositeDirection(direction),
  35553. uiCls: ['top'],
  35554. handler: me.toggleCollapse,
  35555. scope: me
  35556. }];
  35557. }
  35558. result = new Ext.panel.Header(result);
  35559. result.addClsWithUI(me.getHeaderCollapsedClasses(result));
  35560. return result;
  35561. },
  35562. getHeaderCollapsedClasses: function(header) {
  35563. var me = this,
  35564. collapsedCls = me.collapsedCls,
  35565. collapsedClasses;
  35566. collapsedClasses = [ collapsedCls, collapsedCls + '-' + header.dock];
  35567. if (me.border && (!me.frame || (me.frame && Ext.supports.CSS3BorderRadius))) {
  35568. collapsedClasses.push(collapsedCls + '-border-' + header.dock);
  35569. }
  35570. return collapsedClasses;
  35571. },
  35572. beginCollapse: function() {
  35573. var me = this,
  35574. lastBox = me.lastBox,
  35575. rendered = me.rendered,
  35576. collapseMemento = me.collapseMemento || (me.collapseMemento = new Ext.util.Memento(me)),
  35577. sizeModel = me.getSizeModel(),
  35578. reExpander;
  35579. collapseMemento.capture(['height', 'minHeight', 'width', 'minWidth']);
  35580. if (lastBox) {
  35581. collapseMemento.capture(me.restoreDimension(), lastBox, 'last.');
  35582. }
  35583. if (me.collapsedVertical()) {
  35584. if (sizeModel.width.shrinkWrap) {
  35585. me.width = rendered ? me.getWidth() : me.width || me.minWidth || 100;
  35586. }
  35587. delete me.height;
  35588. me.minHeight = 0;
  35589. } else if (me.collapsedHorizontal()) {
  35590. if (sizeModel.height.shrinkWrap) {
  35591. me.height = rendered ? me.getHeight() : me.height || me.minHeight || 100;
  35592. }
  35593. delete me.width;
  35594. me.minWidth = 0;
  35595. }
  35596. if (me.ownerCt) {
  35597. me.ownerCt.getLayout().beginCollapse(me);
  35598. }
  35599. if (!me.isPlaceHolderCollapse()) {
  35600. if (me.header === (reExpander = me.getReExpander())) {
  35601. me.header.addClsWithUI(me.getHeaderCollapsedClasses(me.header));
  35602. if (me.header.rendered) {
  35603. me.header.updateFrame();
  35604. }
  35605. }
  35606. else {
  35607. if (reExpander.el) {
  35608. reExpander.el.show();
  35609. reExpander.hidden = false;
  35610. }
  35611. }
  35612. }
  35613. if (me.resizer) {
  35614. me.resizer.disable();
  35615. }
  35616. },
  35617. beginExpand: function() {
  35618. var me = this,
  35619. lastBox = me.lastBox,
  35620. collapseMemento = me.collapseMemento,
  35621. restoreDimension = this.restoreDimension(),
  35622. reExpander;
  35623. collapseMemento.restore(['minHeight', 'minWidth', restoreDimension]);
  35624. if (lastBox) {
  35625. collapseMemento.restore(restoreDimension, true, lastBox, 'last.');
  35626. }
  35627. if (me.ownerCt) {
  35628. me.ownerCt.getLayout().beginExpand(me);
  35629. }
  35630. if (!me.isPlaceHolderCollapse()) {
  35631. if (me.header === (reExpander = me.getReExpander())) {
  35632. me.header.removeClsWithUI(me.getHeaderCollapsedClasses(me.header));
  35633. if (me.header.rendered) {
  35634. me.header.updateFrame();
  35635. }
  35636. }
  35637. else {
  35638. reExpander.hidden = true;
  35639. reExpander.el.hide();
  35640. }
  35641. }
  35642. if (me.resizer) {
  35643. me.resizer.enable();
  35644. }
  35645. },
  35646. collapse: function(direction, animate) {
  35647. var me = this,
  35648. collapseDir = direction || me.collapseDirection,
  35649. ownerCt = me.ownerCt;
  35650. if (me.isCollapsingOrExpanding) {
  35651. return me;
  35652. }
  35653. if (arguments.length < 2) {
  35654. animate = me.animCollapse;
  35655. }
  35656. if (me.collapsed || me.fireEvent('beforecollapse', me, direction, animate) === false) {
  35657. return me;
  35658. }
  35659. if (ownerCt && me.isPlaceHolderCollapse()) {
  35660. return me.placeholderCollapse(direction, animate);
  35661. }
  35662. me.collapsed = collapseDir;
  35663. me.beginCollapse();
  35664. me.fireHierarchyEvent('collapse');
  35665. return me.doCollapseExpand(1, animate);
  35666. },
  35667. doCollapseExpand: function (flags, animate) {
  35668. var me = this,
  35669. originalAnimCollapse = me.animCollapse,
  35670. ownerLayout = me.ownerLayout;
  35671. me.animCollapse = animate;
  35672. me.isCollapsingOrExpanding = flags;
  35673. if (ownerLayout && !animate) {
  35674. ownerLayout.onContentChange(me);
  35675. } else {
  35676. me.updateLayout({ isRoot: true });
  35677. }
  35678. me.animCollapse = originalAnimCollapse;
  35679. return me;
  35680. },
  35681. afterCollapse: function(animated) {
  35682. var me = this,
  35683. ownerLayout = me.ownerLayout;
  35684. me.isCollapsingOrExpanding = 0;
  35685. if (me.collapseTool) {
  35686. me.collapseTool.setType('expand-' + me.getOppositeDirection(me.collapseDirection));
  35687. }
  35688. if (ownerLayout && animated) {
  35689. ownerLayout.onContentChange(me);
  35690. }
  35691. me.setHiddenDocked();
  35692. me.fireEvent('collapse', me);
  35693. },
  35694. setHiddenDocked: function(){
  35695. var me = this,
  35696. toHide = me.hiddenOnCollapse,
  35697. reExpander = me.getReExpander(),
  35698. items = me.getDockedItems(),
  35699. len = items.length,
  35700. i = 0,
  35701. item;
  35702. toHide.add(me.body);
  35703. for (; i < len; i++) {
  35704. item = items[i];
  35705. if (item && item !== reExpander && item.el) {
  35706. toHide.add(item.el);
  35707. }
  35708. }
  35709. toHide.setStyle('visibility', 'hidden');
  35710. },
  35711. restoreHiddenDocked: function(){
  35712. var toShow = this.hiddenOnCollapse;
  35713. toShow.setStyle('visibility', '');
  35714. toShow.clear();
  35715. },
  35716. getPlaceholder: function(direction) {
  35717. var me = this,
  35718. collapseDir = direction || me.collapseDirection,
  35719. listeners = null,
  35720. placeholder = me.placeholder;
  35721. if (!placeholder) {
  35722. if (me.floatable || (me.collapsible && me.titleCollapse)) {
  35723. listeners = {
  35724. click: {
  35725. fn: me.floatable ? me.floatCollapsedPanel : me.toggleCollapse,
  35726. element: 'el',
  35727. scope: me
  35728. }
  35729. };
  35730. }
  35731. me.placeholder = placeholder = Ext.widget(me.createReExpander(collapseDir, {
  35732. id: me.id + '-placeholder',
  35733. listeners: listeners
  35734. }));
  35735. }
  35736. if (!placeholder.placeholderFor) {
  35737. if (!placeholder.isComponent) {
  35738. me.placeholder = placeholder = me.lookupComponent(placeholder);
  35739. }
  35740. Ext.applyIf(placeholder, {
  35741. margins: me.margins,
  35742. placeholderFor: me
  35743. });
  35744. placeholder.addCls([Ext.baseCSSPrefix + 'region-collapsed-placeholder', Ext.baseCSSPrefix + 'region-collapsed-' + collapseDir + '-placeholder', me.collapsedCls]);
  35745. }
  35746. return placeholder;
  35747. },
  35748. placeholderCollapse: function(direction, animate) {
  35749. var me = this,
  35750. ownerCt = me.ownerCt,
  35751. collapseDir = direction || me.collapseDirection,
  35752. floatCls = Ext.baseCSSPrefix + 'border-region-slide-in',
  35753. placeholder = me.getPlaceholder(direction);
  35754. me.isCollapsingOrExpanding = 1;
  35755. me.hidden = true;
  35756. me.collapsed = collapseDir;
  35757. if (placeholder.rendered) {
  35758. if (placeholder.el.dom.parentNode !== me.el.dom.parentNode) {
  35759. me.el.dom.parentNode.insertBefore(placeholder.el.dom, me.el.dom);
  35760. }
  35761. placeholder.hidden = false;
  35762. placeholder.el.show();
  35763. ownerCt.updateLayout();
  35764. } else {
  35765. ownerCt.insert(ownerCt.items.indexOf(me), placeholder);
  35766. }
  35767. if (me.rendered) {
  35768. me.el.setVisibilityMode(me.placeholderCollapseHideMode);
  35769. if (animate) {
  35770. me.el.addCls(floatCls);
  35771. placeholder.el.hide();
  35772. me.el.slideOut(collapseDir.substr(0, 1), {
  35773. preserveScroll: true,
  35774. duration: Ext.Number.from(animate, Ext.fx.Anim.prototype.duration),
  35775. listeners: {
  35776. afteranimate: function() {
  35777. me.el.removeCls(floatCls);
  35778. placeholder.el.show().setStyle('display', 'none').slideIn(collapseDir.substr(0, 1), {
  35779. easing: 'linear',
  35780. duration: 100,
  35781. listeners: {
  35782. afteranimate: function() {
  35783. placeholder.focus();
  35784. me.isCollapsingOrExpanding = 0;
  35785. me.fireEvent('collapse', me);
  35786. }
  35787. }
  35788. });
  35789. }
  35790. }
  35791. });
  35792. } else {
  35793. me.el.hide();
  35794. me.isCollapsingOrExpanding = 0;
  35795. me.fireEvent('collapse', me);
  35796. }
  35797. } else {
  35798. me.isCollapsingOrExpanding = 0;
  35799. me.fireEvent('collapse', me);
  35800. }
  35801. return me;
  35802. },
  35803. floatCollapsedPanel: function() {
  35804. var me = this,
  35805. placeholder = me.placeholder,
  35806. pb = placeholder.getBox(true),
  35807. myBox,
  35808. floatCls = Ext.baseCSSPrefix + 'border-region-slide-in',
  35809. collapsed = me.collapsed,
  35810. layoutOwner = me.ownerCt || me,
  35811. slideDirection;
  35812. if (me.el.hasCls(floatCls)) {
  35813. me.slideOutFloatedPanel();
  35814. return;
  35815. }
  35816. if (me.isSliding) {
  35817. return;
  35818. }
  35819. me.isSliding = true;
  35820. function onMouseLeaveFloated(e) {
  35821. if (!me.isDestroyed) {
  35822. var slideRegion = me.el.getRegion().union(placeholder.el.getRegion()).adjust(1, -1, -1, 1);
  35823. if (!slideRegion.contains(e.getPoint())) {
  35824. me.slideOutFloatedPanel();
  35825. }
  35826. }
  35827. }
  35828. me.placeholder.el.hide();
  35829. me.placeholder.hidden = true;
  35830. me.el.show();
  35831. me.hidden = false;
  35832. me.collapsed = false;
  35833. layoutOwner.updateLayout();
  35834. myBox = me.getBox(true);
  35835. me.placeholder.el.show();
  35836. me.placeholder.hidden = false;
  35837. me.el.hide();
  35838. me.hidden = true;
  35839. me.collapsed = collapsed;
  35840. layoutOwner.updateLayout();
  35841. me.placeholderMouseMon = placeholder.el.monitorMouseLeave(500, onMouseLeaveFloated);
  35842. me.panelMouseMon = me.el.monitorMouseLeave(500, onMouseLeaveFloated);
  35843. me.el.addCls(floatCls);
  35844. if (me.collapseTool) {
  35845. me.collapseTool.el.hide();
  35846. }
  35847. switch (me.collapsed) {
  35848. case 'top':
  35849. me.el.setLeftTop(pb.x, pb.y + pb.height - 1);
  35850. slideDirection = 't';
  35851. break;
  35852. case 'right':
  35853. me.el.setLeftTop(pb.x - myBox.width + 1, pb.y);
  35854. slideDirection = 'r';
  35855. break;
  35856. case 'bottom':
  35857. me.el.setLeftTop(pb.x, pb.y - myBox.height + 1);
  35858. slideDirection = 'b';
  35859. break;
  35860. case 'left':
  35861. me.el.setLeftTop(pb.x + pb.width - 1, pb.y);
  35862. slideDirection = 'l';
  35863. break;
  35864. }
  35865. me.floatedFromCollapse = me.collapsed;
  35866. me.collapsed = me.hidden = false;
  35867. me.el.slideIn(slideDirection, {
  35868. preserveScroll: true,
  35869. listeners: {
  35870. afteranimate: function() {
  35871. me.isSliding = false;
  35872. }
  35873. }
  35874. });
  35875. },
  35876. isLayoutRoot: function() {
  35877. if (this.floatedFromCollapse) {
  35878. return true;
  35879. }
  35880. return this.callParent();
  35881. },
  35882. slideOutFloatedPanel: function() {
  35883. var me = this,
  35884. compEl = this.el,
  35885. collapseDirection;
  35886. if (me.isSliding) {
  35887. return;
  35888. }
  35889. me.isSliding = true;
  35890. me.slideOutFloatedPanelBegin();
  35891. if (typeof me.collapsed == 'string') {
  35892. collapseDirection = me.collapsed.charAt(0);
  35893. }
  35894. compEl.slideOut(collapseDirection, {
  35895. preserveScroll: true,
  35896. listeners: {
  35897. afteranimate: function() {
  35898. me.slideOutFloatedPanelEnd();
  35899. me.el.removeCls(Ext.baseCSSPrefix + 'border-region-slide-in');
  35900. me.isSliding = false;
  35901. }
  35902. }
  35903. });
  35904. },
  35905. slideOutFloatedPanelBegin: function() {
  35906. var me = this,
  35907. compEl = this.el;
  35908. me.collapsed = me.floatedFromCollapse;
  35909. me.hidden = true;
  35910. me.floatedFromCollapse = null;
  35911. compEl.un(me.panelMouseMon);
  35912. me.placeholder.el.un(me.placeholderMouseMon);
  35913. },
  35914. slideOutFloatedPanelEnd: function() {
  35915. if (this.collapseTool) {
  35916. this.collapseTool.el.show();
  35917. }
  35918. },
  35919. expand: function(animate) {
  35920. var me = this;
  35921. if (me.isCollapsingOrExpanding) {
  35922. return me;
  35923. }
  35924. if (!arguments.length) {
  35925. animate = me.animCollapse;
  35926. }
  35927. if (!me.collapsed && !me.floatedFromCollapse) {
  35928. return me;
  35929. }
  35930. if (me.fireEvent('beforeexpand', me, animate) === false) {
  35931. return me;
  35932. }
  35933. if (me.isPlaceHolderCollapse()) {
  35934. return me.placeholderExpand(animate);
  35935. }
  35936. me.restoreHiddenDocked();
  35937. me.beginExpand();
  35938. me.collapsed = false;
  35939. me.fireHierarchyEvent('expand');
  35940. return me.doCollapseExpand(2, animate);
  35941. },
  35942. placeholderExpand: function(animate) {
  35943. var me = this,
  35944. collapseDir = me.collapsed,
  35945. floatCls = Ext.baseCSSPrefix + 'border-region-slide-in',
  35946. finalPos,
  35947. floatedPos,
  35948. slideInDirection;
  35949. if (me.floatedFromCollapse) {
  35950. floatedPos = me.getPosition(true);
  35951. me.slideOutFloatedPanelBegin();
  35952. me.slideOutFloatedPanelEnd();
  35953. }
  35954. me.isCollapsingOrExpanding = 2;
  35955. me.placeholder.hidden = true;
  35956. me.placeholder.el.hide();
  35957. me.collapsed = false;
  35958. me.show();
  35959. if (animate) {
  35960. if (floatedPos) {
  35961. finalPos = me.el.getXY();
  35962. me.el.setLeftTop(floatedPos[0], floatedPos[1]);
  35963. me.el.moveTo(finalPos[0], finalPos[1], {
  35964. duration: Ext.Number.from(animate, Ext.fx.Anim.prototype.duration),
  35965. listeners: {
  35966. afteranimate: function() {
  35967. me.el.removeCls(floatCls);
  35968. me.isCollapsingOrExpanding = 0;
  35969. me.fireEvent('expand', me);
  35970. }
  35971. }
  35972. });
  35973. }
  35974. else {
  35975. me.hidden = true;
  35976. me.el.addCls(floatCls);
  35977. me.el.hide();
  35978. me.collapsed = collapseDir;
  35979. me.placeholder.show();
  35980. slideInDirection = collapseDir.substr(0, 1);
  35981. me.hidden = false;
  35982. me.el.slideIn(slideInDirection, {
  35983. preserveScroll: true,
  35984. duration: Ext.Number.from(animate, Ext.fx.Anim.prototype.duration),
  35985. listeners: {
  35986. afteranimate: function() {
  35987. me.collapsed = false;
  35988. me.el.removeCls(floatCls);
  35989. me.placeholder.hide();
  35990. me.isCollapsingOrExpanding = 0;
  35991. me.fireEvent('expand', me);
  35992. }
  35993. }
  35994. });
  35995. }
  35996. } else {
  35997. me.isCollapsingOrExpanding = 0;
  35998. me.fireEvent('expand', me);
  35999. }
  36000. return me;
  36001. },
  36002. afterExpand: function(animated) {
  36003. var me = this,
  36004. ownerLayout = me.ownerLayout;
  36005. me.isCollapsingOrExpanding = 0;
  36006. if (me.collapseTool) {
  36007. me.collapseTool.setType('collapse-' + me.collapseDirection);
  36008. }
  36009. if (ownerLayout && animated) {
  36010. ownerLayout.onContentChange(me);
  36011. }
  36012. me.fireEvent('expand', me);
  36013. },
  36014. setBorder: function(border, targetEl) {
  36015. if (targetEl) {
  36016. return;
  36017. }
  36018. var me = this,
  36019. header = me.header;
  36020. if (!border) {
  36021. border = 0;
  36022. } else {
  36023. border = Ext.Element.unitizeBox((border === true) ? 1 : border);
  36024. }
  36025. if (header) {
  36026. if (header.isHeader) {
  36027. header.setBorder(border);
  36028. } else {
  36029. header.border = border;
  36030. }
  36031. }
  36032. if (me.rendered && me.bodyBorder !== false) {
  36033. me.body.setStyle('border-width', border);
  36034. }
  36035. me.updateLayout();
  36036. me.border = border;
  36037. },
  36038. toggleCollapse: function() {
  36039. return (this.collapsed || this.floatedFromCollapse) ? this.expand() : this.collapse();
  36040. },
  36041. getKeyMap : function() {
  36042. return this.keyMap || (this.keyMap = new Ext.util.KeyMap(Ext.apply({
  36043. target: this.el
  36044. }, this.keys)));
  36045. },
  36046. initDraggable : function(){
  36047. this.dd = new Ext.panel.DD(this, Ext.isBoolean(this.draggable) ? null : this.draggable);
  36048. },
  36049. ghostTools : function() {
  36050. var tools = [],
  36051. header = this.header,
  36052. headerTools = header ? header.query('tool[hidden=false]') : [],
  36053. t, tLen, tool;
  36054. if (headerTools.length) {
  36055. t = 0;
  36056. tLen = headerTools.length;
  36057. for (; t < tLen; t++) {
  36058. tool = headerTools[t];
  36059. tools.push({
  36060. type: tool.type
  36061. });
  36062. }
  36063. } else {
  36064. tools = [{
  36065. type: 'placeholder'
  36066. }];
  36067. }
  36068. return tools;
  36069. },
  36070. ghost: function(cls) {
  36071. var me = this,
  36072. ghostPanel = me.ghostPanel,
  36073. box = me.getBox(),
  36074. header;
  36075. if (!ghostPanel) {
  36076. ghostPanel = new Ext.panel.Panel({
  36077. renderTo: document.body,
  36078. floating: {
  36079. shadow: false
  36080. },
  36081. frame: me.frame && !me.alwaysFramed,
  36082. alwaysFramed: me.alwaysFramed,
  36083. overlapHeader: me.overlapHeader,
  36084. headerPosition: me.headerPosition,
  36085. baseCls: me.baseCls,
  36086. cls: me.baseCls + '-ghost ' + (cls ||'')
  36087. });
  36088. me.ghostPanel = ghostPanel;
  36089. } else {
  36090. ghostPanel.el.show();
  36091. }
  36092. ghostPanel.floatParent = me.floatParent;
  36093. if (me.floating) {
  36094. ghostPanel.setZIndex(Ext.Number.from(me.el.getStyle('zIndex'), 0));
  36095. } else {
  36096. ghostPanel.toFront();
  36097. }
  36098. if (!(me.preventHeader || (me.header === false))) {
  36099. header = ghostPanel.header;
  36100. if (header) {
  36101. header.suspendLayouts();
  36102. Ext.Array.forEach(header.query('tool'), header.remove, header);
  36103. header.resumeLayouts();
  36104. }
  36105. ghostPanel.addTool(me.ghostTools());
  36106. ghostPanel.setTitle(me.title);
  36107. ghostPanel.setIconCls(me.iconCls);
  36108. }
  36109. ghostPanel.setPagePosition(box.x, box.y);
  36110. ghostPanel.setSize(box.width, box.height);
  36111. me.el.hide();
  36112. return ghostPanel;
  36113. },
  36114. unghost: function(show, matchPosition) {
  36115. var me = this;
  36116. if (!me.ghostPanel) {
  36117. return;
  36118. }
  36119. if (show !== false) {
  36120. me.el.show();
  36121. if (matchPosition !== false) {
  36122. me.setPagePosition(me.ghostPanel.el.getXY());
  36123. if (me.hideMode == 'offsets') {
  36124. delete me.el.hideModeStyles;
  36125. }
  36126. }
  36127. Ext.defer(me.focus, 10, me);
  36128. }
  36129. me.ghostPanel.el.hide();
  36130. },
  36131. beginDrag: function() {
  36132. if (this.floatingDescendants) {
  36133. this.floatingDescendants.hide();
  36134. }
  36135. },
  36136. endDrag: function() {
  36137. if (this.floatingDescendants) {
  36138. this.floatingDescendants.show();
  36139. }
  36140. },
  36141. initResizable: function(resizable) {
  36142. if (this.collapsed) {
  36143. resizable.disabled = true;
  36144. }
  36145. this.callParent([resizable]);
  36146. }
  36147. }, function() {
  36148. this.prototype.animCollapse = Ext.enableFx;
  36149. });
  36150. Ext.define('Ext.tip.Tip', {
  36151. extend: 'Ext.panel.Panel',
  36152. alternateClassName: 'Ext.Tip',
  36153. minWidth : 40,
  36154. maxWidth : 300,
  36155. shadow : "sides",
  36156. defaultAlign : "tl-bl?",
  36157. constrainPosition : true,
  36158. autoRender: true,
  36159. hidden: true,
  36160. baseCls: Ext.baseCSSPrefix + 'tip',
  36161. floating: {
  36162. shadow: true,
  36163. shim: true,
  36164. constrain: true
  36165. },
  36166. focusOnToFront: false,
  36167. closeAction: 'hide',
  36168. ariaRole: 'tooltip',
  36169. alwaysFramed: true,
  36170. frameHeader: false,
  36171. initComponent: function() {
  36172. var me = this;
  36173. me.floating = Ext.apply({}, {shadow: me.shadow}, me.self.prototype.floating);
  36174. me.callParent(arguments);
  36175. me.constrain = me.constrain || me.constrainPosition;
  36176. },
  36177. showAt : function(xy){
  36178. var me = this;
  36179. this.callParent(arguments);
  36180. if (me.isVisible()) {
  36181. me.setPagePosition(xy[0], xy[1]);
  36182. if (me.constrainPosition || me.constrain) {
  36183. me.doConstrain();
  36184. }
  36185. me.toFront(true);
  36186. }
  36187. },
  36188. showBy : function(el, pos) {
  36189. this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign));
  36190. },
  36191. initDraggable : function(){
  36192. var me = this;
  36193. me.draggable = {
  36194. el: me.getDragEl(),
  36195. delegate: me.header.el,
  36196. constrain: me,
  36197. constrainTo: me.el.getScopeParent()
  36198. };
  36199. Ext.Component.prototype.initDraggable.call(me);
  36200. },
  36201. ghost: undefined,
  36202. unghost: undefined
  36203. });
  36204. Ext.define('Ext.tip.ToolTip', {
  36205. extend: 'Ext.tip.Tip',
  36206. alias: 'widget.tooltip',
  36207. alternateClassName: 'Ext.ToolTip',
  36208. autoHide: true,
  36209. showDelay: 500,
  36210. hideDelay: 200,
  36211. dismissDelay: 5000,
  36212. trackMouse: false,
  36213. anchorToTarget: true,
  36214. anchorOffset: 0,
  36215. targetCounter: 0,
  36216. quickShowInterval: 250,
  36217. initComponent: function() {
  36218. var me = this;
  36219. me.callParent(arguments);
  36220. me.lastActive = new Date();
  36221. me.setTarget(me.target);
  36222. me.origAnchor = me.anchor;
  36223. },
  36224. onRender: function(ct, position) {
  36225. var me = this;
  36226. me.callParent(arguments);
  36227. me.anchorCls = Ext.baseCSSPrefix + 'tip-anchor-' + me.getAnchorPosition();
  36228. me.anchorEl = me.el.createChild({
  36229. cls: Ext.baseCSSPrefix + 'tip-anchor ' + me.anchorCls
  36230. });
  36231. },
  36232. setTarget: function(target) {
  36233. var me = this,
  36234. t = Ext.get(target),
  36235. tg;
  36236. if (me.target) {
  36237. tg = Ext.get(me.target);
  36238. me.mun(tg, 'mouseover', me.onTargetOver, me);
  36239. me.mun(tg, 'mouseout', me.onTargetOut, me);
  36240. me.mun(tg, 'mousemove', me.onMouseMove, me);
  36241. }
  36242. me.target = t;
  36243. if (t) {
  36244. me.mon(t, {
  36245. freezeEvent: true,
  36246. mouseover: me.onTargetOver,
  36247. mouseout: me.onTargetOut,
  36248. mousemove: me.onMouseMove,
  36249. scope: me
  36250. });
  36251. }
  36252. if (me.anchor) {
  36253. me.anchorTarget = me.target;
  36254. }
  36255. },
  36256. onMouseMove: function(e) {
  36257. var me = this,
  36258. t = me.delegate ? e.getTarget(me.delegate) : me.triggerElement = true,
  36259. xy;
  36260. if (t) {
  36261. me.targetXY = e.getXY();
  36262. if (t === me.triggerElement) {
  36263. if (!me.hidden && me.trackMouse) {
  36264. xy = me.getTargetXY();
  36265. if (me.constrainPosition) {
  36266. xy = me.el.adjustForConstraints(xy, me.el.getScopeParent());
  36267. }
  36268. me.setPagePosition(xy);
  36269. }
  36270. } else {
  36271. me.hide();
  36272. me.lastActive = new Date(0);
  36273. me.onTargetOver(e);
  36274. }
  36275. } else if ((!me.closable && me.isVisible()) && me.autoHide !== false) {
  36276. me.hide();
  36277. }
  36278. },
  36279. getTargetXY: function() {
  36280. var me = this,
  36281. mouseOffset,
  36282. offsets, xy, dw, dh, de, bd, scrollX, scrollY, axy, sz, constrainPosition;
  36283. if (me.delegate) {
  36284. me.anchorTarget = me.triggerElement;
  36285. }
  36286. if (me.anchor) {
  36287. me.targetCounter++;
  36288. offsets = me.getOffsets();
  36289. xy = (me.anchorToTarget && !me.trackMouse) ? me.el.getAlignToXY(me.anchorTarget, me.getAnchorAlign()) : me.targetXY;
  36290. dw = Ext.Element.getViewWidth() - 5;
  36291. dh = Ext.Element.getViewHeight() - 5;
  36292. de = document.documentElement;
  36293. bd = document.body;
  36294. scrollX = (de.scrollLeft || bd.scrollLeft || 0) + 5;
  36295. scrollY = (de.scrollTop || bd.scrollTop || 0) + 5;
  36296. axy = [xy[0] + offsets[0], xy[1] + offsets[1]];
  36297. sz = me.getSize();
  36298. constrainPosition = me.constrainPosition;
  36299. me.anchorEl.removeCls(me.anchorCls);
  36300. if (me.targetCounter < 2 && constrainPosition) {
  36301. if (axy[0] < scrollX) {
  36302. if (me.anchorToTarget) {
  36303. me.defaultAlign = 'l-r';
  36304. if (me.mouseOffset) {
  36305. me.mouseOffset[0] *= -1;
  36306. }
  36307. }
  36308. me.anchor = 'left';
  36309. return me.getTargetXY();
  36310. }
  36311. if (axy[0] + sz.width > dw) {
  36312. if (me.anchorToTarget) {
  36313. me.defaultAlign = 'r-l';
  36314. if (me.mouseOffset) {
  36315. me.mouseOffset[0] *= -1;
  36316. }
  36317. }
  36318. me.anchor = 'right';
  36319. return me.getTargetXY();
  36320. }
  36321. if (axy[1] < scrollY) {
  36322. if (me.anchorToTarget) {
  36323. me.defaultAlign = 't-b';
  36324. if (me.mouseOffset) {
  36325. me.mouseOffset[1] *= -1;
  36326. }
  36327. }
  36328. me.anchor = 'top';
  36329. return me.getTargetXY();
  36330. }
  36331. if (axy[1] + sz.height > dh) {
  36332. if (me.anchorToTarget) {
  36333. me.defaultAlign = 'b-t';
  36334. if (me.mouseOffset) {
  36335. me.mouseOffset[1] *= -1;
  36336. }
  36337. }
  36338. me.anchor = 'bottom';
  36339. return me.getTargetXY();
  36340. }
  36341. }
  36342. me.anchorCls = Ext.baseCSSPrefix + 'tip-anchor-' + me.getAnchorPosition();
  36343. me.anchorEl.addCls(me.anchorCls);
  36344. me.targetCounter = 0;
  36345. return axy;
  36346. } else {
  36347. mouseOffset = me.getMouseOffset();
  36348. return (me.targetXY) ? [me.targetXY[0] + mouseOffset[0], me.targetXY[1] + mouseOffset[1]] : mouseOffset;
  36349. }
  36350. },
  36351. getMouseOffset: function() {
  36352. var me = this,
  36353. offset = me.anchor ? [0, 0] : [15, 18];
  36354. if (me.mouseOffset) {
  36355. offset[0] += me.mouseOffset[0];
  36356. offset[1] += me.mouseOffset[1];
  36357. }
  36358. return offset;
  36359. },
  36360. getAnchorPosition: function() {
  36361. var me = this,
  36362. m;
  36363. if (me.anchor) {
  36364. me.tipAnchor = me.anchor.charAt(0);
  36365. } else {
  36366. m = me.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);
  36367. me.tipAnchor = m[1].charAt(0);
  36368. }
  36369. switch (me.tipAnchor) {
  36370. case 't':
  36371. return 'top';
  36372. case 'b':
  36373. return 'bottom';
  36374. case 'r':
  36375. return 'right';
  36376. }
  36377. return 'left';
  36378. },
  36379. getAnchorAlign: function() {
  36380. switch (this.anchor) {
  36381. case 'top':
  36382. return 'tl-bl';
  36383. case 'left':
  36384. return 'tl-tr';
  36385. case 'right':
  36386. return 'tr-tl';
  36387. default:
  36388. return 'bl-tl';
  36389. }
  36390. },
  36391. getOffsets: function() {
  36392. var me = this,
  36393. mouseOffset,
  36394. offsets,
  36395. ap = me.getAnchorPosition().charAt(0);
  36396. if (me.anchorToTarget && !me.trackMouse) {
  36397. switch (ap) {
  36398. case 't':
  36399. offsets = [0, 9];
  36400. break;
  36401. case 'b':
  36402. offsets = [0, -13];
  36403. break;
  36404. case 'r':
  36405. offsets = [ - 13, 0];
  36406. break;
  36407. default:
  36408. offsets = [9, 0];
  36409. break;
  36410. }
  36411. } else {
  36412. switch (ap) {
  36413. case 't':
  36414. offsets = [ - 15 - me.anchorOffset, 30];
  36415. break;
  36416. case 'b':
  36417. offsets = [ - 19 - me.anchorOffset, -13 - me.el.dom.offsetHeight];
  36418. break;
  36419. case 'r':
  36420. offsets = [ - 15 - me.el.dom.offsetWidth, -13 - me.anchorOffset];
  36421. break;
  36422. default:
  36423. offsets = [25, -13 - me.anchorOffset];
  36424. break;
  36425. }
  36426. }
  36427. mouseOffset = me.getMouseOffset();
  36428. offsets[0] += mouseOffset[0];
  36429. offsets[1] += mouseOffset[1];
  36430. return offsets;
  36431. },
  36432. onTargetOver: function(e) {
  36433. var me = this,
  36434. t;
  36435. if (me.disabled || e.within(me.target.dom, true)) {
  36436. return;
  36437. }
  36438. t = e.getTarget(me.delegate);
  36439. if (t) {
  36440. me.triggerElement = t;
  36441. me.clearTimer('hide');
  36442. me.targetXY = e.getXY();
  36443. me.delayShow();
  36444. }
  36445. },
  36446. delayShow: function() {
  36447. var me = this;
  36448. if (me.hidden && !me.showTimer) {
  36449. if (Ext.Date.getElapsed(me.lastActive) < me.quickShowInterval) {
  36450. me.show();
  36451. } else {
  36452. me.showTimer = Ext.defer(me.show, me.showDelay, me);
  36453. }
  36454. }
  36455. else if (!me.hidden && me.autoHide !== false) {
  36456. me.show();
  36457. }
  36458. },
  36459. onShowVeto: function(){
  36460. this.callParent();
  36461. this.clearTimer('show');
  36462. },
  36463. onTargetOut: function(e) {
  36464. var me = this;
  36465. if (me.disabled || e.within(me.target.dom, true)) {
  36466. return;
  36467. }
  36468. me.clearTimer('show');
  36469. if (me.autoHide !== false) {
  36470. me.delayHide();
  36471. }
  36472. },
  36473. delayHide: function() {
  36474. var me = this;
  36475. if (!me.hidden && !me.hideTimer) {
  36476. me.hideTimer = Ext.defer(me.hide, me.hideDelay, me);
  36477. }
  36478. },
  36479. hide: function() {
  36480. var me = this;
  36481. me.clearTimer('dismiss');
  36482. me.lastActive = new Date();
  36483. if (me.anchorEl) {
  36484. me.anchorEl.hide();
  36485. }
  36486. me.callParent(arguments);
  36487. delete me.triggerElement;
  36488. },
  36489. show: function() {
  36490. var me = this;
  36491. this.callParent();
  36492. if (this.hidden === false) {
  36493. me.setPagePosition(-10000, -10000);
  36494. if (me.anchor) {
  36495. me.anchor = me.origAnchor;
  36496. }
  36497. if (!me.calledFromShowAt) {
  36498. me.showAt(me.getTargetXY());
  36499. }
  36500. if (me.anchor) {
  36501. me.syncAnchor();
  36502. me.anchorEl.show();
  36503. } else {
  36504. me.anchorEl.hide();
  36505. }
  36506. }
  36507. },
  36508. showAt: function(xy) {
  36509. var me = this;
  36510. me.lastActive = new Date();
  36511. me.clearTimers();
  36512. me.calledFromShowAt = true;
  36513. if (!me.isVisible()) {
  36514. this.callParent(arguments);
  36515. }
  36516. if (me.isVisible()) {
  36517. me.setPagePosition(xy[0], xy[1]);
  36518. if (me.constrainPosition || me.constrain) {
  36519. me.doConstrain();
  36520. }
  36521. me.toFront(true);
  36522. me.el.sync(true);
  36523. if (me.dismissDelay && me.autoHide !== false) {
  36524. me.dismissTimer = Ext.defer(me.hide, me.dismissDelay, me);
  36525. }
  36526. if (me.anchor) {
  36527. me.syncAnchor();
  36528. if (!me.anchorEl.isVisible()) {
  36529. me.anchorEl.show();
  36530. }
  36531. } else {
  36532. me.anchorEl.hide();
  36533. }
  36534. }
  36535. delete me.calledFromShowAt;
  36536. },
  36537. syncAnchor: function() {
  36538. var me = this,
  36539. anchorPos,
  36540. targetPos,
  36541. offset;
  36542. switch (me.tipAnchor.charAt(0)) {
  36543. case 't':
  36544. anchorPos = 'b';
  36545. targetPos = 'tl';
  36546. offset = [20 + me.anchorOffset, 1];
  36547. break;
  36548. case 'r':
  36549. anchorPos = 'l';
  36550. targetPos = 'tr';
  36551. offset = [ - 1, 12 + me.anchorOffset];
  36552. break;
  36553. case 'b':
  36554. anchorPos = 't';
  36555. targetPos = 'bl';
  36556. offset = [20 + me.anchorOffset, -1];
  36557. break;
  36558. default:
  36559. anchorPos = 'r';
  36560. targetPos = 'tl';
  36561. offset = [1, 12 + me.anchorOffset];
  36562. break;
  36563. }
  36564. me.anchorEl.alignTo(me.el, anchorPos + '-' + targetPos, offset);
  36565. me.anchorEl.setStyle('z-index', parseInt(me.el.getZIndex(), 10) || 0 + 1).setVisibilityMode(Ext.Element.DISPLAY);
  36566. },
  36567. setPagePosition: function(x, y) {
  36568. var me = this;
  36569. me.callParent(arguments);
  36570. if (me.anchor) {
  36571. me.syncAnchor();
  36572. }
  36573. },
  36574. clearTimer: function(name) {
  36575. name = name + 'Timer';
  36576. clearTimeout(this[name]);
  36577. delete this[name];
  36578. },
  36579. clearTimers: function() {
  36580. var me = this;
  36581. me.clearTimer('show');
  36582. me.clearTimer('dismiss');
  36583. me.clearTimer('hide');
  36584. },
  36585. onShow: function() {
  36586. var me = this;
  36587. me.callParent();
  36588. me.mon(Ext.getDoc(), 'mousedown', me.onDocMouseDown, me);
  36589. },
  36590. onHide: function() {
  36591. var me = this;
  36592. me.callParent();
  36593. me.mun(Ext.getDoc(), 'mousedown', me.onDocMouseDown, me);
  36594. },
  36595. onDocMouseDown: function(e) {
  36596. var me = this;
  36597. if (!me.closable && !e.within(me.el.dom)) {
  36598. me.disable();
  36599. Ext.defer(me.doEnable, 100, me);
  36600. }
  36601. },
  36602. doEnable: function() {
  36603. if (!this.isDestroyed) {
  36604. this.enable();
  36605. }
  36606. },
  36607. onDisable: function() {
  36608. this.callParent();
  36609. this.clearTimers();
  36610. this.hide();
  36611. },
  36612. beforeDestroy: function() {
  36613. var me = this;
  36614. me.clearTimers();
  36615. Ext.destroy(me.anchorEl);
  36616. delete me.anchorEl;
  36617. delete me.target;
  36618. delete me.anchorTarget;
  36619. delete me.triggerElement;
  36620. me.callParent();
  36621. },
  36622. onDestroy: function() {
  36623. Ext.getDoc().un('mousedown', this.onDocMouseDown, this);
  36624. this.callParent();
  36625. }
  36626. });
  36627. Ext.define('Ext.tip.QuickTip', {
  36628. extend: 'Ext.tip.ToolTip',
  36629. alias: 'widget.quicktip',
  36630. alternateClassName: 'Ext.QuickTip',
  36631. interceptTitles : false,
  36632. title: '&#160;',
  36633. tagConfig : {
  36634. namespace : "data-",
  36635. attribute : "qtip",
  36636. width : "qwidth",
  36637. target : "target",
  36638. title : "qtitle",
  36639. hide : "hide",
  36640. cls : "qclass",
  36641. align : "qalign",
  36642. anchor : "anchor"
  36643. },
  36644. initComponent : function(){
  36645. var me = this;
  36646. me.target = me.target || Ext.getDoc();
  36647. me.targets = me.targets || {};
  36648. me.callParent();
  36649. },
  36650. register : function(config){
  36651. var configs = Ext.isArray(config) ? config : arguments,
  36652. i = 0,
  36653. len = configs.length,
  36654. target, j, targetLen;
  36655. for (; i < len; i++) {
  36656. config = configs[i];
  36657. target = config.target;
  36658. if (target) {
  36659. if (Ext.isArray(target)) {
  36660. for (j = 0, targetLen = target.length; j < targetLen; j++) {
  36661. this.targets[Ext.id(target[j])] = config;
  36662. }
  36663. } else{
  36664. this.targets[Ext.id(target)] = config;
  36665. }
  36666. }
  36667. }
  36668. },
  36669. unregister : function(el){
  36670. delete this.targets[Ext.id(el)];
  36671. },
  36672. cancelShow: function(el){
  36673. var me = this,
  36674. activeTarget = me.activeTarget;
  36675. el = Ext.get(el).dom;
  36676. if (me.isVisible()) {
  36677. if (activeTarget && activeTarget.el == el) {
  36678. me.hide();
  36679. }
  36680. } else if (activeTarget && activeTarget.el == el) {
  36681. me.clearTimer('show');
  36682. }
  36683. },
  36684. getTipCfg: function(e) {
  36685. var t = e.getTarget(),
  36686. titleText = t.title,
  36687. cfg;
  36688. if (this.interceptTitles && titleText && Ext.isString(titleText)) {
  36689. t.qtip = titleText;
  36690. t.removeAttribute("title");
  36691. e.preventDefault();
  36692. return {
  36693. text: titleText
  36694. };
  36695. }
  36696. else {
  36697. cfg = this.tagConfig;
  36698. t = e.getTarget('[' + cfg.namespace + cfg.attribute + ']');
  36699. if (t) {
  36700. return {
  36701. target: t,
  36702. text: t.getAttribute(cfg.namespace + cfg.attribute)
  36703. };
  36704. }
  36705. }
  36706. },
  36707. onTargetOver : function(e){
  36708. var me = this,
  36709. target = e.getTarget(me.delegate),
  36710. hasShowDelay,
  36711. delay,
  36712. elTarget,
  36713. cfg,
  36714. ns,
  36715. tipConfig,
  36716. autoHide,
  36717. targets, targetEl, value, key;
  36718. if (me.disabled) {
  36719. return;
  36720. }
  36721. me.targetXY = e.getXY();
  36722. if(!target || target.nodeType !== 1 || target == document.documentElement || target == document.body){
  36723. return;
  36724. }
  36725. if (me.activeTarget && ((target == me.activeTarget.el) || Ext.fly(me.activeTarget.el).contains(target))) {
  36726. me.clearTimer('hide');
  36727. me.show();
  36728. return;
  36729. }
  36730. if (target) {
  36731. targets = me.targets;
  36732. for (key in targets) {
  36733. if (targets.hasOwnProperty(key)) {
  36734. value = targets[key];
  36735. targetEl = Ext.fly(value.target);
  36736. if (targetEl && (targetEl.dom === target || targetEl.contains(target))) {
  36737. elTarget = targetEl.dom;
  36738. break;
  36739. }
  36740. }
  36741. }
  36742. if (elTarget) {
  36743. me.activeTarget = me.targets[elTarget.id];
  36744. me.activeTarget.el = target;
  36745. me.anchor = me.activeTarget.anchor;
  36746. if (me.anchor) {
  36747. me.anchorTarget = target;
  36748. }
  36749. hasShowDelay = Ext.isDefined(me.activeTarget.showDelay);
  36750. if (hasShowDelay) {
  36751. delay = me.showDelay;
  36752. me.showDelay = me.activeTarget.showDelay;
  36753. }
  36754. me.delayShow();
  36755. if (hasShowDelay) {
  36756. me.showDelay = delay;
  36757. }
  36758. return;
  36759. }
  36760. }
  36761. elTarget = Ext.fly(target, '_quicktip-target');
  36762. cfg = me.tagConfig;
  36763. ns = cfg.namespace;
  36764. tipConfig = me.getTipCfg(e);
  36765. if (tipConfig) {
  36766. if (tipConfig.target) {
  36767. target = tipConfig.target;
  36768. elTarget = Ext.fly(target, '_quicktip-target');
  36769. }
  36770. autoHide = elTarget.getAttribute(ns + cfg.hide);
  36771. me.activeTarget = {
  36772. el: target,
  36773. text: tipConfig.text,
  36774. width: +elTarget.getAttribute(ns + cfg.width) || null,
  36775. autoHide: autoHide != "user" && autoHide !== 'false',
  36776. title: elTarget.getAttribute(ns + cfg.title),
  36777. cls: elTarget.getAttribute(ns + cfg.cls),
  36778. align: elTarget.getAttribute(ns + cfg.align)
  36779. };
  36780. me.anchor = elTarget.getAttribute(ns + cfg.anchor);
  36781. if (me.anchor) {
  36782. me.anchorTarget = target;
  36783. }
  36784. hasShowDelay = Ext.isDefined(me.activeTarget.showDelay);
  36785. if (hasShowDelay) {
  36786. delay = me.showDelay;
  36787. me.showDelay = me.activeTarget.showDelay;
  36788. }
  36789. me.delayShow();
  36790. if (hasShowDelay) {
  36791. me.showDelay = delay;
  36792. }
  36793. }
  36794. },
  36795. onTargetOut : function(e){
  36796. var me = this,
  36797. active = me.activeTarget,
  36798. hasHideDelay,
  36799. delay;
  36800. if (active && e.within(me.activeTarget.el) && !me.getTipCfg(e)) {
  36801. return;
  36802. }
  36803. me.clearTimer('show');
  36804. delete me.activeTarget;
  36805. if (me.autoHide !== false) {
  36806. hasHideDelay = active && Ext.isDefined(active.hideDelay);
  36807. if (hasHideDelay) {
  36808. delay = me.hideDelay;
  36809. me.hideDelay = active.hideDelay;
  36810. }
  36811. me.delayHide();
  36812. if (hasHideDelay) {
  36813. me.hideDelay = delay;
  36814. }
  36815. }
  36816. },
  36817. showAt : function(xy){
  36818. var me = this,
  36819. target = me.activeTarget,
  36820. cls;
  36821. if (target) {
  36822. if (!me.rendered) {
  36823. me.render(Ext.getBody());
  36824. me.activeTarget = target;
  36825. }
  36826. me.suspendLayouts();
  36827. if (target.title) {
  36828. me.setTitle(target.title);
  36829. me.header.show();
  36830. } else {
  36831. me.header.hide();
  36832. }
  36833. me.update(target.text);
  36834. me.autoHide = target.autoHide;
  36835. me.dismissDelay = target.dismissDelay || me.dismissDelay;
  36836. if (target.mouseOffset) {
  36837. xy[0] += target.mouseOffset[0];
  36838. xy[1] += target.mouseOffset[1];
  36839. }
  36840. cls = me.lastCls;
  36841. if (cls) {
  36842. me.removeCls(cls);
  36843. delete me.lastCls;
  36844. }
  36845. cls = target.cls;
  36846. if (cls) {
  36847. me.addCls(cls);
  36848. me.lastCls = cls;
  36849. }
  36850. me.setWidth(target.width);
  36851. if (me.anchor) {
  36852. me.constrainPosition = false;
  36853. } else if (target.align) {
  36854. xy = me.el.getAlignToXY(target.el, target.align);
  36855. me.constrainPosition = false;
  36856. }else{
  36857. me.constrainPosition = true;
  36858. }
  36859. me.resumeLayouts(true);
  36860. }
  36861. me.callParent([xy]);
  36862. },
  36863. hide: function(){
  36864. delete this.activeTarget;
  36865. this.callParent();
  36866. }
  36867. });
  36868. Ext.define('Ext.tip.QuickTipManager', (function() {
  36869. var tip,
  36870. disabled = false;
  36871. return {
  36872. requires: ['Ext.tip.QuickTip'],
  36873. singleton: true,
  36874. alternateClassName: 'Ext.QuickTips',
  36875. init : function (autoRender, config) {
  36876. if (!tip) {
  36877. if (!Ext.isReady) {
  36878. Ext.onReady(function(){
  36879. Ext.tip.QuickTipManager.init(autoRender, config);
  36880. });
  36881. return;
  36882. }
  36883. var tipConfig = Ext.apply({ disabled: disabled, id: 'ext-quicktips-tip' }, config),
  36884. className = tipConfig.className,
  36885. xtype = tipConfig.xtype;
  36886. if (className) {
  36887. delete tipConfig.className;
  36888. } else if (xtype) {
  36889. className = 'widget.' + xtype;
  36890. delete tipConfig.xtype;
  36891. }
  36892. if (autoRender !== false) {
  36893. tipConfig.renderTo = document.body;
  36894. }
  36895. tip = Ext.create(className || 'Ext.tip.QuickTip', tipConfig);
  36896. }
  36897. },
  36898. destroy: function() {
  36899. if (tip) {
  36900. var undef;
  36901. tip.destroy();
  36902. tip = undef;
  36903. }
  36904. },
  36905. ddDisable : function(){
  36906. if(tip && !disabled){
  36907. tip.disable();
  36908. }
  36909. },
  36910. ddEnable : function(){
  36911. if(tip && !disabled){
  36912. tip.enable();
  36913. }
  36914. },
  36915. enable : function(){
  36916. if(tip){
  36917. tip.enable();
  36918. }
  36919. disabled = false;
  36920. },
  36921. disable : function(){
  36922. if(tip){
  36923. tip.disable();
  36924. }
  36925. disabled = true;
  36926. },
  36927. isEnabled : function(){
  36928. return tip !== undefined && !tip.disabled;
  36929. },
  36930. getQuickTip : function(){
  36931. return tip;
  36932. },
  36933. register : function(){
  36934. tip.register.apply(tip, arguments);
  36935. },
  36936. unregister : function(){
  36937. tip.unregister.apply(tip, arguments);
  36938. },
  36939. tips : function(){
  36940. tip.register.apply(tip, arguments);
  36941. }
  36942. };
  36943. }()));
  36944. Ext.define('Ext.app.EventBus', {
  36945. requires: [
  36946. 'Ext.util.Event',
  36947. 'Ext.Component'
  36948. ],
  36949. mixins: {
  36950. observable: 'Ext.util.Observable'
  36951. },
  36952. constructor: function() {
  36953. this.mixins.observable.constructor.call(this);
  36954. this.bus = {};
  36955. var me = this;
  36956. Ext.override(Ext.Component, {
  36957. fireEvent: function(ev) {
  36958. if (Ext.util.Observable.prototype.fireEvent.apply(this, arguments) !== false) {
  36959. return me.dispatch.call(me, ev, this, arguments);
  36960. }
  36961. return false;
  36962. }
  36963. });
  36964. },
  36965. dispatch: function(ev, target, args) {
  36966. var bus = this.bus,
  36967. selectors = bus[ev],
  36968. selector, controllers, id, events, event, i, ln;
  36969. if (selectors) {
  36970. for (selector in selectors) {
  36971. if (selectors.hasOwnProperty(selector) && target.is(selector)) {
  36972. controllers = selectors[selector];
  36973. for (id in controllers) {
  36974. if (controllers.hasOwnProperty(id)) {
  36975. events = controllers[id];
  36976. for (i = 0, ln = events.length; i < ln; i++) {
  36977. event = events[i];
  36978. if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) {
  36979. return false;
  36980. }
  36981. }
  36982. }
  36983. }
  36984. }
  36985. }
  36986. }
  36987. return true;
  36988. },
  36989. control: function(selectors, listeners, controller) {
  36990. var bus = this.bus,
  36991. hasListeners, tree, list,
  36992. selector, options, listener, scope, event, listenerList, ev;
  36993. if (Ext.isString(selectors)) {
  36994. selector = selectors;
  36995. selectors = {};
  36996. selectors[selector] = listeners;
  36997. this.control(selectors, null, controller);
  36998. return;
  36999. }
  37000. hasListeners = Ext.util.Observable.HasListeners.prototype;
  37001. for (selector in selectors) {
  37002. if (selectors.hasOwnProperty(selector)) {
  37003. listenerList = selectors[selector] || {};
  37004. for (ev in listenerList) {
  37005. if (listenerList.hasOwnProperty(ev)) {
  37006. options = {};
  37007. listener = listenerList[ev];
  37008. scope = controller;
  37009. event = new Ext.util.Event(controller, ev);
  37010. if (Ext.isObject(listener)) {
  37011. options = listener;
  37012. listener = options.fn;
  37013. scope = options.scope || controller;
  37014. delete options.fn;
  37015. delete options.scope;
  37016. }
  37017. event.addListener(listener, scope, options);
  37018. hasListeners[ev] = 1;
  37019. tree = bus[ev] || (bus[ev] = {});
  37020. tree = tree[selector] || (tree[selector] = {});
  37021. list = tree[controller.id] || (tree[controller.id] = []);
  37022. list.push(event);
  37023. }
  37024. }
  37025. }
  37026. }
  37027. }
  37028. });
  37029. Ext.define('Ext.app.Application', {
  37030. extend: 'Ext.app.Controller',
  37031. requires: [
  37032. 'Ext.ModelManager',
  37033. 'Ext.data.Model',
  37034. 'Ext.data.StoreManager',
  37035. 'Ext.tip.QuickTipManager',
  37036. 'Ext.ComponentManager',
  37037. 'Ext.app.EventBus'
  37038. ],
  37039. scope: undefined,
  37040. enableQuickTips: true,
  37041. appFolder: 'app',
  37042. autoCreateViewport: false,
  37043. constructor: function(config) {
  37044. config = config || {};
  37045. Ext.apply(this, config);
  37046. var me = this,
  37047. requires = config.requires || [],
  37048. controllers, ln, i, controller,
  37049. paths, path, ns;
  37050. Ext.Loader.setPath(me.name, me.appFolder);
  37051. if (me.paths) {
  37052. paths = me.paths;
  37053. for (ns in paths) {
  37054. if (paths.hasOwnProperty(ns)) {
  37055. path = paths[ns];
  37056. Ext.Loader.setPath(ns, path);
  37057. }
  37058. }
  37059. }
  37060. me.callParent(arguments);
  37061. me.eventbus = new Ext.app.EventBus;
  37062. controllers = Ext.Array.from(me.controllers);
  37063. ln = controllers && controllers.length;
  37064. me.controllers = new Ext.util.MixedCollection();
  37065. if (me.autoCreateViewport) {
  37066. requires.push(me.getModuleClassName('Viewport', 'view'));
  37067. }
  37068. for (i = 0; i < ln; i++) {
  37069. requires.push(me.getModuleClassName(controllers[i], 'controller'));
  37070. }
  37071. Ext.require(requires);
  37072. Ext.onReady(function() {
  37073. me.init(me);
  37074. for (i = 0; i < ln; i++) {
  37075. controller = me.getController(controllers[i]);
  37076. controller.init(me);
  37077. }
  37078. me.onBeforeLaunch.call(me);
  37079. }, me);
  37080. },
  37081. control: function(selectors, listeners, controller) {
  37082. this.eventbus.control(selectors, listeners, controller);
  37083. },
  37084. launch: Ext.emptyFn,
  37085. onBeforeLaunch: function() {
  37086. var me = this,
  37087. controllers, c, cLen, controller;
  37088. if (me.enableQuickTips) {
  37089. Ext.tip.QuickTipManager.init();
  37090. }
  37091. if (me.autoCreateViewport) {
  37092. me.getView('Viewport').create();
  37093. }
  37094. me.launch.call(this.scope || this);
  37095. me.launched = true;
  37096. me.fireEvent('launch', this);
  37097. controllers = me.controllers.items;
  37098. cLen = controllers.length;
  37099. for (c = 0; c < cLen; c++) {
  37100. controller = controllers[c];
  37101. controller.onLaunch(this);
  37102. }
  37103. },
  37104. getModuleClassName: function(name, module) {
  37105. if (name.indexOf('.') !== -1 && (Ext.ClassManager.isCreated(name) || Ext.Loader.isAClassNameWithAKnownPrefix(name))) {
  37106. return name;
  37107. } else {
  37108. return this.name + '.' + module + '.' + name;
  37109. }
  37110. },
  37111. getController: function(name) {
  37112. var controller = this.controllers.get(name);
  37113. if (!controller) {
  37114. controller = Ext.create(this.getModuleClassName(name, 'controller'), {
  37115. application: this,
  37116. id: name
  37117. });
  37118. this.controllers.add(controller);
  37119. }
  37120. return controller;
  37121. },
  37122. getStore: function(name) {
  37123. var store = Ext.StoreManager.get(name);
  37124. if (!store) {
  37125. store = Ext.create(this.getModuleClassName(name, 'store'), {
  37126. storeId: name
  37127. });
  37128. }
  37129. return store;
  37130. },
  37131. getModel: function(model) {
  37132. model = this.getModuleClassName(model, 'model');
  37133. return Ext.ModelManager.getModel(model);
  37134. },
  37135. getView: function(view) {
  37136. view = this.getModuleClassName(view, 'view');
  37137. return Ext.ClassManager.get(view);
  37138. }
  37139. });
  37140. Ext.define('Ext.button.Split', {
  37141. alias: 'widget.splitbutton',
  37142. extend: 'Ext.button.Button',
  37143. alternateClassName: 'Ext.SplitButton',
  37144. arrowCls : 'split',
  37145. split : true,
  37146. initComponent : function(){
  37147. this.callParent();
  37148. this.addEvents("arrowclick");
  37149. },
  37150. setArrowHandler : function(handler, scope){
  37151. this.arrowHandler = handler;
  37152. this.scope = scope;
  37153. },
  37154. onClick : function(e, t) {
  37155. var me = this;
  37156. e.preventDefault();
  37157. if (!me.disabled) {
  37158. if (me.overMenuTrigger) {
  37159. me.maybeShowMenu();
  37160. me.fireEvent("arrowclick", me, e);
  37161. if (me.arrowHandler) {
  37162. me.arrowHandler.call(me.scope || me, me, e);
  37163. }
  37164. } else {
  37165. me.doToggle();
  37166. me.fireHandler(e);
  37167. }
  37168. }
  37169. }
  37170. });
  37171. Ext.define('Ext.button.Cycle', {
  37172. alias: 'widget.cycle',
  37173. extend: 'Ext.button.Split',
  37174. alternateClassName: 'Ext.CycleButton',
  37175. getButtonText: function(item) {
  37176. var me = this,
  37177. text = '';
  37178. if (item && me.showText === true) {
  37179. if (me.prependText) {
  37180. text += me.prependText;
  37181. }
  37182. text += item.text;
  37183. return text;
  37184. }
  37185. return me.text;
  37186. },
  37187. setActiveItem: function(item, suppressEvent) {
  37188. var me = this;
  37189. if (!Ext.isObject(item)) {
  37190. item = me.menu.getComponent(item);
  37191. }
  37192. if (item) {
  37193. if (!me.rendered) {
  37194. me.text = me.getButtonText(item);
  37195. me.iconCls = item.iconCls;
  37196. } else {
  37197. me.setText(me.getButtonText(item));
  37198. me.setIconCls(item.iconCls);
  37199. }
  37200. me.activeItem = item;
  37201. if (!item.checked) {
  37202. item.setChecked(true, false);
  37203. }
  37204. if (me.forceIcon) {
  37205. me.setIconCls(me.forceIcon);
  37206. }
  37207. if (!suppressEvent) {
  37208. me.fireEvent('change', me, item);
  37209. }
  37210. }
  37211. },
  37212. getActiveItem: function() {
  37213. return this.activeItem;
  37214. },
  37215. initComponent: function() {
  37216. var me = this,
  37217. checked = 0,
  37218. items,
  37219. i, iLen, item;
  37220. me.addEvents(
  37221. "change"
  37222. );
  37223. if (me.changeHandler) {
  37224. me.on('change', me.changeHandler, me.scope || me);
  37225. delete me.changeHandler;
  37226. }
  37227. items = (me.menu.items || []).concat(me.items || []);
  37228. me.menu = Ext.applyIf({
  37229. cls: Ext.baseCSSPrefix + 'cycle-menu',
  37230. items: []
  37231. }, me.menu);
  37232. iLen = items.length;
  37233. for (i = 0; i < iLen; i++) {
  37234. item = items[i];
  37235. item = Ext.applyIf({
  37236. group : me.id,
  37237. itemIndex : i,
  37238. checkHandler : me.checkHandler,
  37239. scope : me,
  37240. checked : item.checked || false
  37241. }, item);
  37242. me.menu.items.push(item);
  37243. if (item.checked) {
  37244. checked = i;
  37245. }
  37246. }
  37247. me.itemCount = me.menu.items.length;
  37248. me.callParent(arguments);
  37249. me.on('click', me.toggleSelected, me);
  37250. me.setActiveItem(checked, me);
  37251. if (me.width && me.showText) {
  37252. me.addCls(Ext.baseCSSPrefix + 'cycle-fixed-width');
  37253. }
  37254. },
  37255. checkHandler: function(item, pressed) {
  37256. if (pressed) {
  37257. this.setActiveItem(item);
  37258. }
  37259. },
  37260. toggleSelected: function() {
  37261. var me = this,
  37262. m = me.menu,
  37263. checkItem;
  37264. checkItem = me.activeItem.next(':not([disabled])') || m.items.getAt(0);
  37265. checkItem.setChecked(true);
  37266. }
  37267. });
  37268. Ext.define('Ext.chart.Callout', {
  37269. constructor: function(config) {
  37270. if (config.callouts) {
  37271. config.callouts.styles = Ext.applyIf(config.callouts.styles || {}, {
  37272. color: "#000",
  37273. font: "11px Helvetica, sans-serif"
  37274. });
  37275. this.callouts = Ext.apply(this.callouts || {}, config.callouts);
  37276. this.calloutsArray = [];
  37277. }
  37278. },
  37279. renderCallouts: function() {
  37280. if (!this.callouts) {
  37281. return;
  37282. }
  37283. var me = this,
  37284. items = me.items,
  37285. animate = me.chart.animate,
  37286. config = me.callouts,
  37287. styles = config.styles,
  37288. group = me.calloutsArray,
  37289. store = me.chart.store,
  37290. len = store.getCount(),
  37291. ratio = items.length / len,
  37292. previouslyPlacedCallouts = [],
  37293. i,
  37294. count,
  37295. j,
  37296. p,
  37297. item,
  37298. label,
  37299. storeItem,
  37300. display;
  37301. for (i = 0, count = 0; i < len; i++) {
  37302. for (j = 0; j < ratio; j++) {
  37303. item = items[count];
  37304. label = group[count];
  37305. storeItem = store.getAt(i);
  37306. display = config.filter(storeItem);
  37307. if (!display && !label) {
  37308. count++;
  37309. continue;
  37310. }
  37311. if (!label) {
  37312. group[count] = label = me.onCreateCallout(storeItem, item, i, display, j, count);
  37313. }
  37314. for (p in label) {
  37315. if (label[p] && label[p].setAttributes) {
  37316. label[p].setAttributes(styles, true);
  37317. }
  37318. }
  37319. if (!display) {
  37320. for (p in label) {
  37321. if (label[p]) {
  37322. if (label[p].setAttributes) {
  37323. label[p].setAttributes({
  37324. hidden: true
  37325. }, true);
  37326. } else if(label[p].setVisible) {
  37327. label[p].setVisible(false);
  37328. }
  37329. }
  37330. }
  37331. }
  37332. config.renderer(label, storeItem);
  37333. me.onPlaceCallout(label, storeItem, item, i, display, animate,
  37334. j, count, previouslyPlacedCallouts);
  37335. previouslyPlacedCallouts.push(label);
  37336. count++;
  37337. }
  37338. }
  37339. this.hideCallouts(count);
  37340. },
  37341. onCreateCallout: function(storeItem, item, i, display) {
  37342. var me = this,
  37343. group = me.calloutsGroup,
  37344. config = me.callouts,
  37345. styles = config.styles,
  37346. width = styles.width,
  37347. height = styles.height,
  37348. chart = me.chart,
  37349. surface = chart.surface,
  37350. calloutObj = {
  37351. lines: false
  37352. };
  37353. calloutObj.lines = surface.add(Ext.apply({},
  37354. {
  37355. type: 'path',
  37356. path: 'M0,0',
  37357. stroke: me.getLegendColor() || '#555'
  37358. },
  37359. styles));
  37360. if (config.items) {
  37361. calloutObj.panel = new Ext.Panel({
  37362. style: "position: absolute;",
  37363. width: width,
  37364. height: height,
  37365. items: config.items,
  37366. renderTo: chart.el
  37367. });
  37368. }
  37369. return calloutObj;
  37370. },
  37371. hideCallouts: function(index) {
  37372. var calloutsArray = this.calloutsArray,
  37373. len = calloutsArray.length,
  37374. co,
  37375. p;
  37376. while (len-->index) {
  37377. co = calloutsArray[len];
  37378. for (p in co) {
  37379. if (co[p]) {
  37380. co[p].hide(true);
  37381. }
  37382. }
  37383. }
  37384. }
  37385. });
  37386. Ext.define('Ext.layout.component.Draw', {
  37387. alias: 'layout.draw',
  37388. extend: 'Ext.layout.component.Auto',
  37389. type: 'draw',
  37390. measureContentWidth : function (ownerContext) {
  37391. var target = ownerContext.target,
  37392. paddingInfo = ownerContext.getPaddingInfo(),
  37393. bbox = this.getBBox(ownerContext);
  37394. if (!target.viewBox) {
  37395. if (target.autoSize) {
  37396. return bbox.width + paddingInfo.width;
  37397. } else {
  37398. return bbox.x + bbox.width + paddingInfo.width;
  37399. }
  37400. } else {
  37401. if (ownerContext.heightModel.shrinkWrap) {
  37402. return paddingInfo.width;
  37403. } else {
  37404. return bbox.width / bbox.height * (ownerContext.getProp('contentHeight') - paddingInfo.height) + paddingInfo.width;
  37405. }
  37406. }
  37407. },
  37408. measureContentHeight : function (ownerContext) {
  37409. var target = ownerContext.target,
  37410. paddingInfo = ownerContext.getPaddingInfo(),
  37411. bbox = this.getBBox(ownerContext);
  37412. if (!ownerContext.target.viewBox) {
  37413. if (target.autoSize) {
  37414. return bbox.height + paddingInfo.height;
  37415. } else {
  37416. return bbox.y + bbox.height + paddingInfo.height;
  37417. }
  37418. } else {
  37419. if (ownerContext.widthModel.shrinkWrap) {
  37420. return paddingInfo.height;
  37421. } else {
  37422. return bbox.height / bbox.width * (ownerContext.getProp('contentWidth') - paddingInfo.width) + paddingInfo.height;
  37423. }
  37424. }
  37425. },
  37426. getBBox: function(ownerContext) {
  37427. var bbox = ownerContext.surfaceBBox;
  37428. if (!bbox) {
  37429. bbox = ownerContext.target.surface.items.getBBox();
  37430. if (bbox.width === -Infinity && bbox.height === -Infinity) {
  37431. bbox.width = bbox.height = bbox.x = bbox.y = 0;
  37432. }
  37433. ownerContext.surfaceBBox = bbox;
  37434. }
  37435. return bbox;
  37436. },
  37437. publishInnerWidth: function (ownerContext, width) {
  37438. ownerContext.setContentWidth(width - ownerContext.getFrameInfo().width, true);
  37439. },
  37440. publishInnerHeight: function (ownerContext, height) {
  37441. ownerContext.setContentHeight(height - ownerContext.getFrameInfo().height, true);
  37442. },
  37443. finishedLayout: function (ownerContext) {
  37444. var props = ownerContext.props,
  37445. paddingInfo = ownerContext.getPaddingInfo();
  37446. this.owner.setSurfaceSize(props.contentWidth - paddingInfo.width, props.contentHeight - paddingInfo.height);
  37447. this.callParent(arguments);
  37448. }
  37449. });
  37450. Ext.define('Ext.draw.CompositeSprite', {
  37451. extend: 'Ext.util.MixedCollection',
  37452. mixins: {
  37453. animate: 'Ext.util.Animate'
  37454. },
  37455. autoDestroy: false,
  37456. isCompositeSprite: true,
  37457. constructor: function(config) {
  37458. var me = this;
  37459. config = config || {};
  37460. Ext.apply(me, config);
  37461. me.addEvents(
  37462. 'mousedown',
  37463. 'mouseup',
  37464. 'mouseover',
  37465. 'mouseout',
  37466. 'click'
  37467. );
  37468. me.id = Ext.id(null, 'ext-sprite-group-');
  37469. me.callParent();
  37470. },
  37471. onClick: function(e) {
  37472. this.fireEvent('click', e);
  37473. },
  37474. onMouseUp: function(e) {
  37475. this.fireEvent('mouseup', e);
  37476. },
  37477. onMouseDown: function(e) {
  37478. this.fireEvent('mousedown', e);
  37479. },
  37480. onMouseOver: function(e) {
  37481. this.fireEvent('mouseover', e);
  37482. },
  37483. onMouseOut: function(e) {
  37484. this.fireEvent('mouseout', e);
  37485. },
  37486. attachEvents: function(o) {
  37487. var me = this;
  37488. o.on({
  37489. scope: me,
  37490. mousedown: me.onMouseDown,
  37491. mouseup: me.onMouseUp,
  37492. mouseover: me.onMouseOver,
  37493. mouseout: me.onMouseOut,
  37494. click: me.onClick
  37495. });
  37496. },
  37497. add: function(key, o) {
  37498. var result = this.callParent(arguments);
  37499. this.attachEvents(result);
  37500. return result;
  37501. },
  37502. insert: function(index, key, o) {
  37503. return this.callParent(arguments);
  37504. },
  37505. remove: function(o) {
  37506. var me = this;
  37507. o.un({
  37508. scope: me,
  37509. mousedown: me.onMouseDown,
  37510. mouseup: me.onMouseUp,
  37511. mouseover: me.onMouseOver,
  37512. mouseout: me.onMouseOut,
  37513. click: me.onClick
  37514. });
  37515. return me.callParent(arguments);
  37516. },
  37517. getBBox: function() {
  37518. var i = 0,
  37519. sprite,
  37520. bb,
  37521. items = this.items,
  37522. len = this.length,
  37523. infinity = Infinity,
  37524. minX = infinity,
  37525. maxHeight = -infinity,
  37526. minY = infinity,
  37527. maxWidth = -infinity,
  37528. maxWidthBBox, maxHeightBBox;
  37529. for (; i < len; i++) {
  37530. sprite = items[i];
  37531. if (sprite.el && ! sprite.bboxExcluded) {
  37532. bb = sprite.getBBox();
  37533. minX = Math.min(minX, bb.x);
  37534. minY = Math.min(minY, bb.y);
  37535. maxHeight = Math.max(maxHeight, bb.height + bb.y);
  37536. maxWidth = Math.max(maxWidth, bb.width + bb.x);
  37537. }
  37538. }
  37539. return {
  37540. x: minX,
  37541. y: minY,
  37542. height: maxHeight - minY,
  37543. width: maxWidth - minX
  37544. };
  37545. },
  37546. setAttributes: function(attrs, redraw) {
  37547. var i = 0,
  37548. items = this.items,
  37549. len = this.length;
  37550. for (; i < len; i++) {
  37551. items[i].setAttributes(attrs, redraw);
  37552. }
  37553. return this;
  37554. },
  37555. hide: function(redraw) {
  37556. var i = 0,
  37557. items = this.items,
  37558. len = this.length;
  37559. for (; i < len; i++) {
  37560. items[i].hide(redraw);
  37561. }
  37562. return this;
  37563. },
  37564. show: function(redraw) {
  37565. var i = 0,
  37566. items = this.items,
  37567. len = this.length;
  37568. for (; i < len; i++) {
  37569. items[i].show(redraw);
  37570. }
  37571. return this;
  37572. },
  37573. redraw: function() {
  37574. var me = this,
  37575. i = 0,
  37576. items = me.items,
  37577. surface = me.getSurface(),
  37578. len = me.length;
  37579. if (surface) {
  37580. for (; i < len; i++) {
  37581. surface.renderItem(items[i]);
  37582. }
  37583. }
  37584. return me;
  37585. },
  37586. setStyle: function(obj) {
  37587. var i = 0,
  37588. items = this.items,
  37589. len = this.length,
  37590. item, el;
  37591. for (; i < len; i++) {
  37592. item = items[i];
  37593. el = item.el;
  37594. if (el) {
  37595. el.setStyle(obj);
  37596. }
  37597. }
  37598. },
  37599. addCls: function(obj) {
  37600. var i = 0,
  37601. items = this.items,
  37602. surface = this.getSurface(),
  37603. len = this.length;
  37604. if (surface) {
  37605. for (; i < len; i++) {
  37606. surface.addCls(items[i], obj);
  37607. }
  37608. }
  37609. },
  37610. removeCls: function(obj) {
  37611. var i = 0,
  37612. items = this.items,
  37613. surface = this.getSurface(),
  37614. len = this.length;
  37615. if (surface) {
  37616. for (; i < len; i++) {
  37617. surface.removeCls(items[i], obj);
  37618. }
  37619. }
  37620. },
  37621. getSurface: function(){
  37622. var first = this.first();
  37623. if (first) {
  37624. return first.surface;
  37625. }
  37626. return null;
  37627. },
  37628. destroy: function(){
  37629. var me = this,
  37630. surface = me.getSurface(),
  37631. destroySprites = me.autoDestroy,
  37632. item;
  37633. if (surface) {
  37634. while (me.getCount() > 0) {
  37635. item = me.first();
  37636. me.remove(item);
  37637. surface.remove(item, destroySprites);
  37638. }
  37639. }
  37640. me.clearListeners();
  37641. }
  37642. });
  37643. Ext.define('Ext.draw.Surface', {
  37644. mixins: {
  37645. observable: 'Ext.util.Observable'
  37646. },
  37647. requires: ['Ext.draw.CompositeSprite'],
  37648. uses: ['Ext.draw.engine.Svg', 'Ext.draw.engine.Vml', 'Ext.draw.engine.SvgExporter', 'Ext.draw.engine.ImageExporter'],
  37649. separatorRe: /[, ]+/,
  37650. statics: {
  37651. create: function(config, enginePriority) {
  37652. enginePriority = enginePriority || ['Svg', 'Vml'];
  37653. var i = 0,
  37654. len = enginePriority.length,
  37655. surfaceClass;
  37656. for (; i < len; i++) {
  37657. if (Ext.supports[enginePriority[i]] !== false) {
  37658. return Ext.create('Ext.draw.engine.' + enginePriority[i], config);
  37659. }
  37660. }
  37661. return false;
  37662. },
  37663. save: function(surface, config) {
  37664. config = config || {};
  37665. var exportTypes = {
  37666. 'image/png': 'Image',
  37667. 'image/jpeg': 'Image',
  37668. 'image/svg+xml': 'Svg'
  37669. },
  37670. prefix = exportTypes[config.type] || 'Svg',
  37671. exporter = Ext.draw.engine[prefix + 'Exporter'];
  37672. return exporter.generate(surface, config);
  37673. }
  37674. },
  37675. availableAttrs: {
  37676. blur: 0,
  37677. "clip-rect": "0 0 1e9 1e9",
  37678. cursor: "default",
  37679. cx: 0,
  37680. cy: 0,
  37681. 'dominant-baseline': 'auto',
  37682. fill: "none",
  37683. "fill-opacity": 1,
  37684. font: '10px "Arial"',
  37685. "font-family": '"Arial"',
  37686. "font-size": "10",
  37687. "font-style": "normal",
  37688. "font-weight": 400,
  37689. gradient: "",
  37690. height: 0,
  37691. hidden: false,
  37692. href: "http://sencha.com/",
  37693. opacity: 1,
  37694. path: "M0,0",
  37695. radius: 0,
  37696. rx: 0,
  37697. ry: 0,
  37698. scale: "1 1",
  37699. src: "",
  37700. stroke: "none",
  37701. "stroke-dasharray": "",
  37702. "stroke-linecap": "butt",
  37703. "stroke-linejoin": "butt",
  37704. "stroke-miterlimit": 0,
  37705. "stroke-opacity": 1,
  37706. "stroke-width": 1,
  37707. target: "_blank",
  37708. text: "",
  37709. "text-anchor": "middle",
  37710. title: "Ext Draw",
  37711. width: 0,
  37712. x: 0,
  37713. y: 0,
  37714. zIndex: 0
  37715. },
  37716. container: undefined,
  37717. height: 352,
  37718. width: 512,
  37719. x: 0,
  37720. y: 0,
  37721. orderSpritesByZIndex: true,
  37722. constructor: function(config) {
  37723. var me = this;
  37724. config = config || {};
  37725. Ext.apply(me, config);
  37726. me.domRef = Ext.getDoc().dom;
  37727. me.customAttributes = {};
  37728. me.addEvents(
  37729. 'mousedown',
  37730. 'mouseup',
  37731. 'mouseover',
  37732. 'mouseout',
  37733. 'mousemove',
  37734. 'mouseenter',
  37735. 'mouseleave',
  37736. 'click',
  37737. 'dblclick'
  37738. );
  37739. me.mixins.observable.constructor.call(me);
  37740. me.getId();
  37741. me.initGradients();
  37742. me.initItems();
  37743. if (me.renderTo) {
  37744. me.render(me.renderTo);
  37745. delete me.renderTo;
  37746. }
  37747. me.initBackground(config.background);
  37748. },
  37749. initSurface: Ext.emptyFn,
  37750. renderItem: Ext.emptyFn,
  37751. renderItems: Ext.emptyFn,
  37752. setViewBox: function (x, y, width, height) {
  37753. if (isFinite(x) && isFinite(y) && isFinite(width) && isFinite(height)) {
  37754. this.viewBox = {x: x, y: y, width: width, height: height};
  37755. this.applyViewBox();
  37756. }
  37757. },
  37758. addCls: Ext.emptyFn,
  37759. removeCls: Ext.emptyFn,
  37760. setStyle: Ext.emptyFn,
  37761. initGradients: function() {
  37762. if (this.hasOwnProperty('gradients')) {
  37763. var gradients = this.gradients,
  37764. gLen = gradients.length,
  37765. fn = this.addGradient,
  37766. g;
  37767. if (gradients) {
  37768. for (g = 0; g < gLen; g++) {
  37769. if (fn.call(this, gradients[g], g, gLen) === false) {
  37770. break;
  37771. }
  37772. }
  37773. }
  37774. }
  37775. },
  37776. initItems: function() {
  37777. var items = this.items;
  37778. this.items = new Ext.draw.CompositeSprite();
  37779. this.items.autoDestroy = true;
  37780. this.groups = new Ext.draw.CompositeSprite();
  37781. if (items) {
  37782. this.add(items);
  37783. }
  37784. },
  37785. initBackground: function(config) {
  37786. var me = this,
  37787. width = me.width,
  37788. height = me.height,
  37789. gradientId, gradient, backgroundSprite;
  37790. if (Ext.isString(config)) {
  37791. config = {
  37792. fill : config
  37793. };
  37794. }
  37795. if (config) {
  37796. if (config.gradient) {
  37797. gradient = config.gradient;
  37798. gradientId = gradient.id;
  37799. me.addGradient(gradient);
  37800. me.background = me.add({
  37801. type: 'rect',
  37802. x: 0,
  37803. y: 0,
  37804. width: width,
  37805. height: height,
  37806. fill: 'url(#' + gradientId + ')',
  37807. zIndex: -1
  37808. });
  37809. } else if (config.fill) {
  37810. me.background = me.add({
  37811. type: 'rect',
  37812. x: 0,
  37813. y: 0,
  37814. width: width,
  37815. height: height,
  37816. fill: config.fill,
  37817. zIndex: -1
  37818. });
  37819. } else if (config.image) {
  37820. me.background = me.add({
  37821. type: 'image',
  37822. x: 0,
  37823. y: 0,
  37824. width: width,
  37825. height: height,
  37826. src: config.image,
  37827. zIndex: -1
  37828. });
  37829. }
  37830. me.background.bboxExcluded = true;
  37831. }
  37832. },
  37833. setSize: function(w, h) {
  37834. this.applyViewBox();
  37835. },
  37836. scrubAttrs: function(sprite) {
  37837. var i,
  37838. attrs = {},
  37839. exclude = {},
  37840. sattr = sprite.attr;
  37841. for (i in sattr) {
  37842. if (this.translateAttrs.hasOwnProperty(i)) {
  37843. attrs[this.translateAttrs[i]] = sattr[i];
  37844. exclude[this.translateAttrs[i]] = true;
  37845. }
  37846. else if (this.availableAttrs.hasOwnProperty(i) && !exclude[i]) {
  37847. attrs[i] = sattr[i];
  37848. }
  37849. }
  37850. return attrs;
  37851. },
  37852. onClick: function(e) {
  37853. this.processEvent('click', e);
  37854. },
  37855. onDblClick: function(e) {
  37856. this.processEvent('dblclick', e);
  37857. },
  37858. onMouseUp: function(e) {
  37859. this.processEvent('mouseup', e);
  37860. },
  37861. onMouseDown: function(e) {
  37862. this.processEvent('mousedown', e);
  37863. },
  37864. onMouseOver: function(e) {
  37865. this.processEvent('mouseover', e);
  37866. },
  37867. onMouseOut: function(e) {
  37868. this.processEvent('mouseout', e);
  37869. },
  37870. onMouseMove: function(e) {
  37871. this.fireEvent('mousemove', e);
  37872. },
  37873. onMouseEnter: Ext.emptyFn,
  37874. onMouseLeave: Ext.emptyFn,
  37875. addGradient: Ext.emptyFn,
  37876. add: function() {
  37877. var args = Array.prototype.slice.call(arguments),
  37878. sprite,
  37879. index,
  37880. hasMultipleArgs = args.length > 1,
  37881. items,
  37882. results,
  37883. i,
  37884. ln,
  37885. item;
  37886. if (hasMultipleArgs || Ext.isArray(args[0])) {
  37887. items = hasMultipleArgs ? args : args[0];
  37888. results = [];
  37889. for (i = 0, ln = items.length; i < ln; i++) {
  37890. item = items[i];
  37891. item = this.add(item);
  37892. results.push(item);
  37893. }
  37894. return results;
  37895. }
  37896. sprite = this.prepareItems(args[0], true)[0];
  37897. this.insertByZIndex(sprite);
  37898. this.onAdd(sprite);
  37899. return sprite;
  37900. },
  37901. insertByZIndex: function(sprite) {
  37902. var me = this,
  37903. sprites = me.items.items,
  37904. len = sprites.length,
  37905. ceil = Math.ceil,
  37906. zIndex = sprite.attr.zIndex,
  37907. idx = len,
  37908. high = idx - 1,
  37909. low = 0,
  37910. otherZIndex;
  37911. if (me.orderSpritesByZIndex && len && zIndex < sprites[high].attr.zIndex) {
  37912. while (low <= high) {
  37913. idx = ceil((low + high) / 2);
  37914. otherZIndex = sprites[idx].attr.zIndex;
  37915. if (otherZIndex > zIndex) {
  37916. high = idx - 1;
  37917. }
  37918. else if (otherZIndex < zIndex) {
  37919. low = idx + 1;
  37920. }
  37921. else {
  37922. break;
  37923. }
  37924. }
  37925. while (idx < len && sprites[idx].attr.zIndex <= zIndex) {
  37926. idx++;
  37927. }
  37928. }
  37929. me.items.insert(idx, sprite);
  37930. return idx;
  37931. },
  37932. onAdd: function(sprite) {
  37933. var group = sprite.group,
  37934. draggable = sprite.draggable,
  37935. groups, ln, i;
  37936. if (group) {
  37937. groups = [].concat(group);
  37938. ln = groups.length;
  37939. for (i = 0; i < ln; i++) {
  37940. group = groups[i];
  37941. this.getGroup(group).add(sprite);
  37942. }
  37943. delete sprite.group;
  37944. }
  37945. if (draggable) {
  37946. sprite.initDraggable();
  37947. }
  37948. },
  37949. remove: function(sprite, destroySprite) {
  37950. if (sprite) {
  37951. this.items.remove(sprite);
  37952. var groups = [].concat(this.groups.items),
  37953. gLen = groups.length,
  37954. g;
  37955. for (g = 0; g < gLen; g++) {
  37956. groups[g].remove(sprite);
  37957. }
  37958. sprite.onRemove();
  37959. if (destroySprite === true) {
  37960. sprite.destroy();
  37961. }
  37962. }
  37963. },
  37964. removeAll: function(destroySprites) {
  37965. var items = this.items.items,
  37966. ln = items.length,
  37967. i;
  37968. for (i = ln - 1; i > -1; i--) {
  37969. this.remove(items[i], destroySprites);
  37970. }
  37971. },
  37972. onRemove: Ext.emptyFn,
  37973. onDestroy: Ext.emptyFn,
  37974. applyViewBox: function() {
  37975. var me = this,
  37976. viewBox = me.viewBox,
  37977. width = me.width || 1,
  37978. height = me.height || 1,
  37979. viewBoxX, viewBoxY, viewBoxWidth, viewBoxHeight,
  37980. relativeHeight, relativeWidth, size;
  37981. if (viewBox && (width || height)) {
  37982. viewBoxX = viewBox.x;
  37983. viewBoxY = viewBox.y;
  37984. viewBoxWidth = viewBox.width;
  37985. viewBoxHeight = viewBox.height;
  37986. relativeHeight = height / viewBoxHeight;
  37987. relativeWidth = width / viewBoxWidth;
  37988. size = Math.min(relativeWidth, relativeHeight);
  37989. if (viewBoxWidth * size < width) {
  37990. viewBoxX -= (width - viewBoxWidth * size) / 2 / size;
  37991. }
  37992. if (viewBoxHeight * size < height) {
  37993. viewBoxY -= (height - viewBoxHeight * size) / 2 / size;
  37994. }
  37995. me.viewBoxShift = {
  37996. dx: -viewBoxX,
  37997. dy: -viewBoxY,
  37998. scale: size
  37999. };
  38000. if (me.background) {
  38001. me.background.setAttributes(Ext.apply({}, {
  38002. x: viewBoxX,
  38003. y: viewBoxY,
  38004. width: width / size,
  38005. height: height / size
  38006. }, { hidden: false }), true);
  38007. }
  38008. } else {
  38009. if (me.background && width && height) {
  38010. me.background.setAttributes(Ext.apply({x: 0, y: 0, width: width, height: height}, { hidden: false }), true);
  38011. }
  38012. }
  38013. },
  38014. getBBox: function (sprite, isWithoutTransform) {
  38015. var realPath = this["getPath" + sprite.type](sprite);
  38016. if (isWithoutTransform) {
  38017. sprite.bbox.plain = sprite.bbox.plain || Ext.draw.Draw.pathDimensions(realPath);
  38018. return sprite.bbox.plain;
  38019. }
  38020. if (sprite.dirtyTransform) {
  38021. this.applyTransformations(sprite, true);
  38022. }
  38023. sprite.bbox.transform = sprite.bbox.transform || Ext.draw.Draw.pathDimensions(Ext.draw.Draw.mapPath(realPath, sprite.matrix));
  38024. return sprite.bbox.transform;
  38025. },
  38026. transformToViewBox: function (x, y) {
  38027. if (this.viewBoxShift) {
  38028. var me = this, shift = me.viewBoxShift;
  38029. return [x / shift.scale - shift.dx, y / shift.scale - shift.dy];
  38030. } else {
  38031. return [x, y];
  38032. }
  38033. },
  38034. applyTransformations: function(sprite, onlyMatrix) {
  38035. if (sprite.type == 'text') {
  38036. sprite.bbox.transform = 0;
  38037. this.transform(sprite, false);
  38038. }
  38039. sprite.dirtyTransform = false;
  38040. var me = this,
  38041. attr = sprite.attr;
  38042. if (attr.translation.x != null || attr.translation.y != null) {
  38043. me.translate(sprite);
  38044. }
  38045. if (attr.scaling.x != null || attr.scaling.y != null) {
  38046. me.scale(sprite);
  38047. }
  38048. if (attr.rotation.degrees != null) {
  38049. me.rotate(sprite);
  38050. }
  38051. sprite.bbox.transform = 0;
  38052. this.transform(sprite, onlyMatrix);
  38053. sprite.transformations = [];
  38054. },
  38055. rotate: function (sprite) {
  38056. var bbox,
  38057. deg = sprite.attr.rotation.degrees,
  38058. centerX = sprite.attr.rotation.x,
  38059. centerY = sprite.attr.rotation.y;
  38060. if (!Ext.isNumber(centerX) || !Ext.isNumber(centerY)) {
  38061. bbox = this.getBBox(sprite, true);
  38062. centerX = !Ext.isNumber(centerX) ? bbox.x + bbox.width / 2 : centerX;
  38063. centerY = !Ext.isNumber(centerY) ? bbox.y + bbox.height / 2 : centerY;
  38064. }
  38065. sprite.transformations.push({
  38066. type: "rotate",
  38067. degrees: deg,
  38068. x: centerX,
  38069. y: centerY
  38070. });
  38071. },
  38072. translate: function(sprite) {
  38073. var x = sprite.attr.translation.x || 0,
  38074. y = sprite.attr.translation.y || 0;
  38075. sprite.transformations.push({
  38076. type: "translate",
  38077. x: x,
  38078. y: y
  38079. });
  38080. },
  38081. scale: function(sprite) {
  38082. var bbox,
  38083. x = sprite.attr.scaling.x || 1,
  38084. y = sprite.attr.scaling.y || 1,
  38085. centerX = sprite.attr.scaling.centerX,
  38086. centerY = sprite.attr.scaling.centerY;
  38087. if (!Ext.isNumber(centerX) || !Ext.isNumber(centerY)) {
  38088. bbox = this.getBBox(sprite, true);
  38089. centerX = !Ext.isNumber(centerX) ? bbox.x + bbox.width / 2 : centerX;
  38090. centerY = !Ext.isNumber(centerY) ? bbox.y + bbox.height / 2 : centerY;
  38091. }
  38092. sprite.transformations.push({
  38093. type: "scale",
  38094. x: x,
  38095. y: y,
  38096. centerX: centerX,
  38097. centerY: centerY
  38098. });
  38099. },
  38100. rectPath: function (x, y, w, h, r) {
  38101. if (r) {
  38102. return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]];
  38103. }
  38104. return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]];
  38105. },
  38106. ellipsePath: function (x, y, rx, ry) {
  38107. if (ry == null) {
  38108. ry = rx;
  38109. }
  38110. return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]];
  38111. },
  38112. getPathpath: function (el) {
  38113. return el.attr.path;
  38114. },
  38115. getPathcircle: function (el) {
  38116. var a = el.attr;
  38117. return this.ellipsePath(a.x, a.y, a.radius, a.radius);
  38118. },
  38119. getPathellipse: function (el) {
  38120. var a = el.attr;
  38121. return this.ellipsePath(a.x, a.y,
  38122. a.radiusX || (a.width / 2) || 0,
  38123. a.radiusY || (a.height / 2) || 0);
  38124. },
  38125. getPathrect: function (el) {
  38126. var a = el.attr;
  38127. return this.rectPath(a.x || 0, a.y || 0, a.width || 0, a.height || 0, a.r || 0);
  38128. },
  38129. getPathimage: function (el) {
  38130. var a = el.attr;
  38131. return this.rectPath(a.x || 0, a.y || 0, a.width, a.height);
  38132. },
  38133. getPathtext: function (el) {
  38134. var bbox = this.getBBoxText(el);
  38135. return this.rectPath(bbox.x, bbox.y, bbox.width, bbox.height);
  38136. },
  38137. createGroup: function(id) {
  38138. var group = this.groups.get(id);
  38139. if (!group) {
  38140. group = new Ext.draw.CompositeSprite({
  38141. surface: this
  38142. });
  38143. group.id = id || Ext.id(null, 'ext-surface-group-');
  38144. this.groups.add(group);
  38145. }
  38146. return group;
  38147. },
  38148. getGroup: function(id) {
  38149. var group;
  38150. if (typeof id == "string") {
  38151. group = this.groups.get(id);
  38152. if (!group) {
  38153. group = this.createGroup(id);
  38154. }
  38155. } else {
  38156. group = id;
  38157. }
  38158. return group;
  38159. },
  38160. prepareItems: function(items, applyDefaults) {
  38161. items = [].concat(items);
  38162. var item, i, ln;
  38163. for (i = 0, ln = items.length; i < ln; i++) {
  38164. item = items[i];
  38165. if (!(item instanceof Ext.draw.Sprite)) {
  38166. item.surface = this;
  38167. items[i] = this.createItem(item);
  38168. } else {
  38169. item.surface = this;
  38170. }
  38171. }
  38172. return items;
  38173. },
  38174. setText: Ext.emptyFn,
  38175. createItem: Ext.emptyFn,
  38176. getId: function() {
  38177. return this.id || (this.id = Ext.id(null, 'ext-surface-'));
  38178. },
  38179. destroy: function() {
  38180. var me = this;
  38181. delete me.domRef;
  38182. if (me.background) {
  38183. me.background.destroy();
  38184. }
  38185. me.removeAll(true);
  38186. Ext.destroy(me.groups.items);
  38187. }
  38188. });
  38189. Ext.define('Ext.draw.Component', {
  38190. alias: 'widget.draw',
  38191. extend: 'Ext.Component',
  38192. requires: [
  38193. 'Ext.draw.Surface',
  38194. 'Ext.layout.component.Draw'
  38195. ],
  38196. enginePriority: ['Svg', 'Vml'],
  38197. baseCls: Ext.baseCSSPrefix + 'surface',
  38198. componentLayout: 'draw',
  38199. viewBox: true,
  38200. shrinkWrap: 3,
  38201. autoSize: false,
  38202. initComponent: function() {
  38203. this.callParent(arguments);
  38204. this.addEvents(
  38205. 'mousedown',
  38206. 'mouseup',
  38207. 'mousemove',
  38208. 'mouseenter',
  38209. 'mouseleave',
  38210. 'click',
  38211. 'dblclick'
  38212. );
  38213. },
  38214. onRender: function() {
  38215. var me = this,
  38216. viewBox = me.viewBox,
  38217. autoSize = me.autoSize,
  38218. bbox, items, width, height, x, y;
  38219. me.callParent(arguments);
  38220. if (me.createSurface() !== false) {
  38221. items = me.surface.items;
  38222. if (viewBox || autoSize) {
  38223. bbox = items.getBBox();
  38224. width = bbox.width;
  38225. height = bbox.height;
  38226. x = bbox.x;
  38227. y = bbox.y;
  38228. if (me.viewBox) {
  38229. me.surface.setViewBox(x, y, width, height);
  38230. } else {
  38231. me.autoSizeSurface();
  38232. }
  38233. }
  38234. }
  38235. },
  38236. autoSizeSurface: function() {
  38237. var bbox = this.surface.items.getBBox();
  38238. this.setSurfaceSize(bbox.width, bbox.height);
  38239. },
  38240. setSurfaceSize: function (width, height) {
  38241. this.surface.setSize(width, height);
  38242. if (this.autoSize) {
  38243. var bbox = this.surface.items.getBBox();
  38244. this.surface.setViewBox(bbox.x, bbox.y - (+Ext.isOpera), width, height);
  38245. }
  38246. },
  38247. createSurface: function() {
  38248. var me = this,
  38249. cfg = Ext.applyIf({
  38250. renderTo: me.el,
  38251. height: me.height,
  38252. width: me.width,
  38253. items: me.items
  38254. }, me.initialConfig), surface;
  38255. delete cfg.listeners;
  38256. surface = Ext.draw.Surface.create(cfg);
  38257. if (!surface) {
  38258. return false;
  38259. }
  38260. me.surface = surface;
  38261. function refire(eventName) {
  38262. return function(e) {
  38263. me.fireEvent(eventName, e);
  38264. };
  38265. }
  38266. surface.on({
  38267. scope: me,
  38268. mouseup: refire('mouseup'),
  38269. mousedown: refire('mousedown'),
  38270. mousemove: refire('mousemove'),
  38271. mouseenter: refire('mouseenter'),
  38272. mouseleave: refire('mouseleave'),
  38273. click: refire('click'),
  38274. dblclick: refire('dblclick')
  38275. });
  38276. },
  38277. onDestroy: function() {
  38278. Ext.destroy(this.surface);
  38279. this.callParent(arguments);
  38280. }
  38281. });
  38282. Ext.define('Ext.chart.Shape', {
  38283. singleton: true,
  38284. circle: function (surface, opts) {
  38285. return surface.add(Ext.apply({
  38286. type: 'circle',
  38287. x: opts.x,
  38288. y: opts.y,
  38289. stroke: null,
  38290. radius: opts.radius
  38291. }, opts));
  38292. },
  38293. line: function (surface, opts) {
  38294. return surface.add(Ext.apply({
  38295. type: 'rect',
  38296. x: opts.x - opts.radius,
  38297. y: opts.y - opts.radius,
  38298. height: 2 * opts.radius,
  38299. width: 2 * opts.radius / 5
  38300. }, opts));
  38301. },
  38302. square: function (surface, opts) {
  38303. return surface.add(Ext.applyIf({
  38304. type: 'rect',
  38305. x: opts.x - opts.radius,
  38306. y: opts.y - opts.radius,
  38307. height: 2 * opts.radius,
  38308. width: 2 * opts.radius,
  38309. radius: null
  38310. }, opts));
  38311. },
  38312. triangle: function (surface, opts) {
  38313. opts.radius *= 1.75;
  38314. return surface.add(Ext.apply({
  38315. type: 'path',
  38316. stroke: null,
  38317. path: "M".concat(opts.x, ",", opts.y, "m0-", opts.radius * 0.58, "l", opts.radius * 0.5, ",", opts.radius * 0.87, "-", opts.radius, ",0z")
  38318. }, opts));
  38319. },
  38320. diamond: function (surface, opts) {
  38321. var r = opts.radius;
  38322. r *= 1.5;
  38323. return surface.add(Ext.apply({
  38324. type: 'path',
  38325. stroke: null,
  38326. path: ["M", opts.x, opts.y - r, "l", r, r, -r, r, -r, -r, r, -r, "z"]
  38327. }, opts));
  38328. },
  38329. cross: function (surface, opts) {
  38330. var r = opts.radius;
  38331. r = r / 1.7;
  38332. return surface.add(Ext.apply({
  38333. type: 'path',
  38334. stroke: null,
  38335. path: "M".concat(opts.x - r, ",", opts.y, "l", [-r, -r, r, -r, r, r, r, -r, r, r, -r, r, r, r, -r, r, -r, -r, -r, r, -r, -r, "z"])
  38336. }, opts));
  38337. },
  38338. plus: function (surface, opts) {
  38339. var r = opts.radius / 1.3;
  38340. return surface.add(Ext.apply({
  38341. type: 'path',
  38342. stroke: null,
  38343. path: "M".concat(opts.x - r / 2, ",", opts.y - r / 2, "l", [0, -r, r, 0, 0, r, r, 0, 0, r, -r, 0, 0, r, -r, 0, 0, -r, -r, 0, 0, -r, "z"])
  38344. }, opts));
  38345. },
  38346. arrow: function (surface, opts) {
  38347. var r = opts.radius;
  38348. return surface.add(Ext.apply({
  38349. type: 'path',
  38350. path: "M".concat(opts.x - r * 0.7, ",", opts.y - r * 0.4, "l", [r * 0.6, 0, 0, -r * 0.4, r, r * 0.8, -r, r * 0.8, 0, -r * 0.4, -r * 0.6, 0], "z")
  38351. }, opts));
  38352. },
  38353. drop: function (surface, x, y, text, size, angle) {
  38354. size = size || 30;
  38355. angle = angle || 0;
  38356. surface.add({
  38357. type: 'path',
  38358. path: ['M', x, y, 'l', size, 0, 'A', size * 0.4, size * 0.4, 0, 1, 0, x + size * 0.7, y - size * 0.7, 'z'],
  38359. fill: '#000',
  38360. stroke: 'none',
  38361. rotate: {
  38362. degrees: 22.5 - angle,
  38363. x: x,
  38364. y: y
  38365. }
  38366. });
  38367. angle = (angle + 90) * Math.PI / 180;
  38368. surface.add({
  38369. type: 'text',
  38370. x: x + size * Math.sin(angle) - 10,
  38371. y: y + size * Math.cos(angle) + 5,
  38372. text: text,
  38373. 'font-size': size * 12 / 40,
  38374. stroke: 'none',
  38375. fill: '#fff'
  38376. });
  38377. }
  38378. });
  38379. Ext.define('Ext.chart.LegendItem', {
  38380. extend: 'Ext.draw.CompositeSprite',
  38381. requires: ['Ext.chart.Shape'],
  38382. x: 0,
  38383. y: 0,
  38384. zIndex: 500,
  38385. boldRe: /bold\s\d{1,}.*/i,
  38386. constructor: function(config) {
  38387. this.callParent(arguments);
  38388. this.createLegend(config);
  38389. },
  38390. createLegend: function(config) {
  38391. var me = this,
  38392. index = config.yFieldIndex,
  38393. series = me.series,
  38394. seriesType = series.type,
  38395. idx = me.yFieldIndex,
  38396. legend = me.legend,
  38397. surface = me.surface,
  38398. refX = legend.x + me.x,
  38399. refY = legend.y + me.y,
  38400. bbox, z = me.zIndex,
  38401. markerConfig, label, mask,
  38402. radius, toggle = false,
  38403. seriesStyle = Ext.apply(series.seriesStyle, series.style);
  38404. function getSeriesProp(name) {
  38405. var val = series[name];
  38406. return (Ext.isArray(val) ? val[idx] : val);
  38407. }
  38408. label = me.add('label', surface.add({
  38409. type: 'text',
  38410. x: 20,
  38411. y: 0,
  38412. zIndex: (z || 0) + 2,
  38413. fill: legend.labelColor,
  38414. font: legend.labelFont,
  38415. text: getSeriesProp('title') || getSeriesProp('yField'),
  38416. style: {
  38417. 'cursor': 'pointer'
  38418. }
  38419. }));
  38420. if (seriesType === 'line' || seriesType === 'scatter') {
  38421. if(seriesType === 'line') {
  38422. me.add('line', surface.add({
  38423. type: 'path',
  38424. path: 'M0.5,0.5L16.5,0.5',
  38425. zIndex: (z || 0) + 2,
  38426. "stroke-width": series.lineWidth,
  38427. "stroke-linejoin": "round",
  38428. "stroke-dasharray": series.dash,
  38429. stroke: seriesStyle.stroke || series.getLegendColor(index) || '#000',
  38430. style: {
  38431. cursor: 'pointer'
  38432. }
  38433. }));
  38434. }
  38435. if (series.showMarkers || seriesType === 'scatter') {
  38436. markerConfig = Ext.apply(series.markerStyle, series.markerConfig || {}, {
  38437. fill: series.getLegendColor(index)
  38438. });
  38439. me.add('marker', Ext.chart.Shape[markerConfig.type](surface, {
  38440. fill: markerConfig.fill,
  38441. x: 8.5,
  38442. y: 0.5,
  38443. zIndex: (z || 0) + 2,
  38444. radius: markerConfig.radius || markerConfig.size,
  38445. style: {
  38446. cursor: 'pointer'
  38447. }
  38448. }));
  38449. }
  38450. }
  38451. else {
  38452. me.add('box', surface.add({
  38453. type: 'rect',
  38454. zIndex: (z || 0) + 2,
  38455. x: 0,
  38456. y: 0,
  38457. width: 12,
  38458. height: 12,
  38459. fill: series.getLegendColor(index),
  38460. style: {
  38461. cursor: 'pointer'
  38462. }
  38463. }));
  38464. }
  38465. me.setAttributes({
  38466. hidden: false
  38467. }, true);
  38468. bbox = me.getBBox();
  38469. mask = me.add('mask', surface.add({
  38470. type: 'rect',
  38471. x: bbox.x,
  38472. y: bbox.y,
  38473. width: bbox.width || 20,
  38474. height: bbox.height || 20,
  38475. zIndex: (z || 0) + 1,
  38476. fill: me.legend.boxFill,
  38477. style: {
  38478. 'cursor': 'pointer'
  38479. }
  38480. }));
  38481. me.on('mouseover', function() {
  38482. label.setStyle({
  38483. 'font-weight': 'bold'
  38484. });
  38485. mask.setStyle({
  38486. 'cursor': 'pointer'
  38487. });
  38488. series._index = index;
  38489. series.highlightItem();
  38490. }, me);
  38491. me.on('mouseout', function() {
  38492. label.setStyle({
  38493. 'font-weight': legend.labelFont && me.boldRe.test(legend.labelFont) ? 'bold' : 'normal'
  38494. });
  38495. series._index = index;
  38496. series.unHighlightItem();
  38497. }, me);
  38498. if (!series.visibleInLegend(index)) {
  38499. toggle = true;
  38500. label.setAttributes({
  38501. opacity: 0.5
  38502. }, true);
  38503. }
  38504. me.on('mousedown', function() {
  38505. if (!toggle) {
  38506. series.hideAll(index);
  38507. label.setAttributes({
  38508. opacity: 0.5
  38509. }, true);
  38510. } else {
  38511. series.showAll(index);
  38512. label.setAttributes({
  38513. opacity: 1
  38514. }, true);
  38515. }
  38516. toggle = !toggle;
  38517. me.legend.chart.redraw();
  38518. }, me);
  38519. me.updatePosition({x:0, y:0});
  38520. },
  38521. updatePosition: function(relativeTo) {
  38522. var me = this,
  38523. items = me.items,
  38524. ln = items.length,
  38525. i = 0,
  38526. item;
  38527. if (!relativeTo) {
  38528. relativeTo = me.legend;
  38529. }
  38530. for (; i < ln; i++) {
  38531. item = items[i];
  38532. switch (item.type) {
  38533. case 'text':
  38534. item.setAttributes({
  38535. x: 20 + relativeTo.x + me.x,
  38536. y: relativeTo.y + me.y
  38537. }, true);
  38538. break;
  38539. case 'rect':
  38540. item.setAttributes({
  38541. translate: {
  38542. x: relativeTo.x + me.x,
  38543. y: relativeTo.y + me.y - 6
  38544. }
  38545. }, true);
  38546. break;
  38547. default:
  38548. item.setAttributes({
  38549. translate: {
  38550. x: relativeTo.x + me.x,
  38551. y: relativeTo.y + me.y
  38552. }
  38553. }, true);
  38554. }
  38555. }
  38556. }
  38557. });
  38558. Ext.define('Ext.chart.Legend', {
  38559. requires: ['Ext.chart.LegendItem'],
  38560. visible: true,
  38561. update: true,
  38562. position: 'bottom',
  38563. x: 0,
  38564. y: 0,
  38565. labelColor: '#000',
  38566. labelFont: '12px Helvetica, sans-serif',
  38567. boxStroke: '#000',
  38568. boxStrokeWidth: 1,
  38569. boxFill: '#FFF',
  38570. itemSpacing: 10,
  38571. padding: 5,
  38572. width: 0,
  38573. height: 0,
  38574. boxZIndex: 100,
  38575. constructor: function(config) {
  38576. var me = this;
  38577. if (config) {
  38578. Ext.apply(me, config);
  38579. }
  38580. me.items = [];
  38581. me.isVertical = ("left|right|float".indexOf(me.position) !== -1);
  38582. me.origX = me.x;
  38583. me.origY = me.y;
  38584. },
  38585. create: function() {
  38586. var me = this,
  38587. seriesItems = me.chart.series.items,
  38588. i, ln, series;
  38589. me.createBox();
  38590. if (me.rebuild !== false) {
  38591. me.createItems();
  38592. }
  38593. if (!me.created && me.isDisplayed()) {
  38594. me.created = true;
  38595. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  38596. series = seriesItems[i];
  38597. series.on('titlechange', function() {
  38598. me.create();
  38599. me.updatePosition();
  38600. });
  38601. }
  38602. }
  38603. },
  38604. isDisplayed: function() {
  38605. return this.visible && this.chart.series.findIndex('showInLegend', true) !== -1;
  38606. },
  38607. createItems: function() {
  38608. var me = this,
  38609. chart = me.chart,
  38610. seriesItems = chart.series.items,
  38611. ln, series,
  38612. surface = chart.surface,
  38613. items = me.items,
  38614. padding = me.padding,
  38615. itemSpacing = me.itemSpacing,
  38616. spacingOffset = 2,
  38617. maxWidth = 0,
  38618. maxHeight = 0,
  38619. totalWidth = 0,
  38620. totalHeight = 0,
  38621. vertical = me.isVertical,
  38622. math = Math,
  38623. mfloor = math.floor,
  38624. mmax = math.max,
  38625. index = 0,
  38626. i = 0,
  38627. len = items ? items.length : 0,
  38628. x, y, spacing, item, bbox, height, width,
  38629. fields, field, nFields, j;
  38630. if (len) {
  38631. for (; i < len; i++) {
  38632. items[i].destroy();
  38633. }
  38634. }
  38635. items.length = [];
  38636. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  38637. series = seriesItems[i];
  38638. if (series.showInLegend) {
  38639. fields = [].concat(series.yField);
  38640. for (j = 0, nFields = fields.length; j < nFields; j++) {
  38641. field = fields[j];
  38642. item = new Ext.chart.LegendItem({
  38643. legend: this,
  38644. series: series,
  38645. surface: chart.surface,
  38646. yFieldIndex: j
  38647. });
  38648. bbox = item.getBBox();
  38649. width = bbox.width;
  38650. height = bbox.height;
  38651. if (i + j === 0) {
  38652. spacing = vertical ? padding + height / 2 : padding;
  38653. }
  38654. else {
  38655. spacing = itemSpacing / (vertical ? 2 : 1);
  38656. }
  38657. item.x = mfloor(vertical ? padding : totalWidth + spacing);
  38658. item.y = mfloor(vertical ? totalHeight + spacing : padding + height / 2);
  38659. totalWidth += width + spacing;
  38660. totalHeight += height + spacing;
  38661. maxWidth = mmax(maxWidth, width);
  38662. maxHeight = mmax(maxHeight, height);
  38663. items.push(item);
  38664. }
  38665. }
  38666. }
  38667. me.width = mfloor((vertical ? maxWidth : totalWidth) + padding * 2);
  38668. if (vertical && items.length === 1) {
  38669. spacingOffset = 1;
  38670. }
  38671. me.height = mfloor((vertical ? totalHeight - spacingOffset * spacing : maxHeight) + (padding * 2));
  38672. me.itemHeight = maxHeight;
  38673. },
  38674. getBBox: function() {
  38675. var me = this;
  38676. return {
  38677. x: Math.round(me.x) - me.boxStrokeWidth / 2,
  38678. y: Math.round(me.y) - me.boxStrokeWidth / 2,
  38679. width: me.width,
  38680. height: me.height
  38681. };
  38682. },
  38683. createBox: function() {
  38684. var me = this,
  38685. box, bbox;
  38686. if (me.boxSprite) {
  38687. me.boxSprite.destroy();
  38688. }
  38689. bbox = me.getBBox();
  38690. if (isNaN(bbox.width) || isNaN(bbox.height)) {
  38691. me.boxSprite = false;
  38692. return;
  38693. }
  38694. box = me.boxSprite = me.chart.surface.add(Ext.apply({
  38695. type: 'rect',
  38696. stroke: me.boxStroke,
  38697. "stroke-width": me.boxStrokeWidth,
  38698. fill: me.boxFill,
  38699. zIndex: me.boxZIndex
  38700. }, bbox));
  38701. box.redraw();
  38702. },
  38703. updatePosition: function() {
  38704. var me = this,
  38705. items = me.items,
  38706. i, ln,
  38707. x, y,
  38708. legendWidth = me.width || 0,
  38709. legendHeight = me.height || 0,
  38710. padding = me.padding,
  38711. chart = me.chart,
  38712. chartBBox = chart.chartBBox,
  38713. insets = chart.insetPadding,
  38714. chartWidth = chartBBox.width - (insets * 2),
  38715. chartHeight = chartBBox.height - (insets * 2),
  38716. chartX = chartBBox.x + insets,
  38717. chartY = chartBBox.y + insets,
  38718. surface = chart.surface,
  38719. mfloor = Math.floor,
  38720. bbox;
  38721. if (me.isDisplayed()) {
  38722. switch(me.position) {
  38723. case "left":
  38724. x = insets;
  38725. y = mfloor(chartY + chartHeight / 2 - legendHeight / 2);
  38726. break;
  38727. case "right":
  38728. x = mfloor(surface.width - legendWidth) - insets;
  38729. y = mfloor(chartY + chartHeight / 2 - legendHeight / 2);
  38730. break;
  38731. case "top":
  38732. x = mfloor(chartX + chartWidth / 2 - legendWidth / 2);
  38733. y = insets;
  38734. break;
  38735. case "bottom":
  38736. x = mfloor(chartX + chartWidth / 2 - legendWidth / 2);
  38737. y = mfloor(surface.height - legendHeight) - insets;
  38738. break;
  38739. default:
  38740. x = mfloor(me.origX) + insets;
  38741. y = mfloor(me.origY) + insets;
  38742. }
  38743. me.x = x;
  38744. me.y = y;
  38745. for (i = 0, ln = items.length; i < ln; i++) {
  38746. items[i].updatePosition();
  38747. }
  38748. bbox = me.getBBox();
  38749. if (isNaN(bbox.width) || isNaN(bbox.height)) {
  38750. if (me.boxSprite) {
  38751. me.boxSprite.hide(true);
  38752. }
  38753. } else {
  38754. if (!me.boxSprite) {
  38755. me.createBox();
  38756. }
  38757. me.boxSprite.setAttributes(bbox, true);
  38758. me.boxSprite.show(true);
  38759. }
  38760. }
  38761. },
  38762. toggle: function(show) {
  38763. var me = this,
  38764. i = 0,
  38765. items = me.items,
  38766. len = items.length;
  38767. if (me.boxSprite) {
  38768. if (show) {
  38769. me.boxSprite.show(true);
  38770. } else {
  38771. me.boxSprite.hide(true);
  38772. }
  38773. }
  38774. for (; i < len; ++i) {
  38775. if (show) {
  38776. items[i].show(true);
  38777. } else {
  38778. items[i].hide(true);
  38779. }
  38780. }
  38781. me.visible = show;
  38782. }
  38783. });
  38784. Ext.define('Ext.chart.theme.Theme', {
  38785. requires: ['Ext.draw.Color'],
  38786. theme: 'Base',
  38787. themeAttrs: false,
  38788. initTheme: function(theme) {
  38789. var me = this,
  38790. themes = Ext.chart.theme,
  38791. key, gradients;
  38792. if (theme) {
  38793. theme = theme.split(':');
  38794. for (key in themes) {
  38795. if (key == theme[0]) {
  38796. gradients = theme[1] == 'gradients';
  38797. me.themeAttrs = new themes[key]({
  38798. useGradients: gradients
  38799. });
  38800. if (gradients) {
  38801. me.gradients = me.themeAttrs.gradients;
  38802. }
  38803. if (me.themeAttrs.background) {
  38804. me.background = me.themeAttrs.background;
  38805. }
  38806. return;
  38807. }
  38808. }
  38809. }
  38810. }
  38811. },
  38812. function() {
  38813. (function() {
  38814. Ext.chart.theme = function(config, base) {
  38815. config = config || {};
  38816. var i = 0, d = +new Date(), l, colors, color,
  38817. seriesThemes, markerThemes,
  38818. seriesTheme, markerTheme,
  38819. key, gradients = [],
  38820. midColor, midL;
  38821. if (config.baseColor) {
  38822. midColor = Ext.draw.Color.fromString(config.baseColor);
  38823. midL = midColor.getHSL()[2];
  38824. if (midL < 0.15) {
  38825. midColor = midColor.getLighter(0.3);
  38826. } else if (midL < 0.3) {
  38827. midColor = midColor.getLighter(0.15);
  38828. } else if (midL > 0.85) {
  38829. midColor = midColor.getDarker(0.3);
  38830. } else if (midL > 0.7) {
  38831. midColor = midColor.getDarker(0.15);
  38832. }
  38833. config.colors = [ midColor.getDarker(0.3).toString(),
  38834. midColor.getDarker(0.15).toString(),
  38835. midColor.toString(),
  38836. midColor.getLighter(0.15).toString(),
  38837. midColor.getLighter(0.3).toString()];
  38838. delete config.baseColor;
  38839. }
  38840. if (config.colors) {
  38841. colors = config.colors.slice();
  38842. markerThemes = base.markerThemes;
  38843. seriesThemes = base.seriesThemes;
  38844. l = colors.length;
  38845. base.colors = colors;
  38846. for (; i < l; i++) {
  38847. color = colors[i];
  38848. markerTheme = markerThemes[i] || {};
  38849. seriesTheme = seriesThemes[i] || {};
  38850. markerTheme.fill = seriesTheme.fill = markerTheme.stroke = seriesTheme.stroke = color;
  38851. markerThemes[i] = markerTheme;
  38852. seriesThemes[i] = seriesTheme;
  38853. }
  38854. base.markerThemes = markerThemes.slice(0, l);
  38855. base.seriesThemes = seriesThemes.slice(0, l);
  38856. }
  38857. for (key in base) {
  38858. if (key in config) {
  38859. if (Ext.isObject(config[key]) && Ext.isObject(base[key])) {
  38860. Ext.apply(base[key], config[key]);
  38861. } else {
  38862. base[key] = config[key];
  38863. }
  38864. }
  38865. }
  38866. if (config.useGradients) {
  38867. colors = base.colors || (function () {
  38868. var ans = [];
  38869. for (i = 0, seriesThemes = base.seriesThemes, l = seriesThemes.length; i < l; i++) {
  38870. ans.push(seriesThemes[i].fill || seriesThemes[i].stroke);
  38871. }
  38872. return ans;
  38873. }());
  38874. for (i = 0, l = colors.length; i < l; i++) {
  38875. midColor = Ext.draw.Color.fromString(colors[i]);
  38876. if (midColor) {
  38877. color = midColor.getDarker(0.1).toString();
  38878. midColor = midColor.toString();
  38879. key = 'theme-' + midColor.substr(1) + '-' + color.substr(1) + '-' + d;
  38880. gradients.push({
  38881. id: key,
  38882. angle: 45,
  38883. stops: {
  38884. 0: {
  38885. color: midColor.toString()
  38886. },
  38887. 100: {
  38888. color: color.toString()
  38889. }
  38890. }
  38891. });
  38892. colors[i] = 'url(#' + key + ')';
  38893. }
  38894. }
  38895. base.gradients = gradients;
  38896. base.colors = colors;
  38897. }
  38898. Ext.apply(this, base);
  38899. };
  38900. }());
  38901. });
  38902. Ext.define('Ext.chart.theme.Base', {
  38903. requires: ['Ext.chart.theme.Theme'],
  38904. constructor: function(config) {
  38905. Ext.chart.theme.call(this, config, {
  38906. background: false,
  38907. axis: {
  38908. stroke: '#444',
  38909. 'stroke-width': 1
  38910. },
  38911. axisLabelTop: {
  38912. fill: '#444',
  38913. font: '12px Arial, Helvetica, sans-serif',
  38914. spacing: 2,
  38915. padding: 5,
  38916. renderer: function(v) { return v; }
  38917. },
  38918. axisLabelRight: {
  38919. fill: '#444',
  38920. font: '12px Arial, Helvetica, sans-serif',
  38921. spacing: 2,
  38922. padding: 5,
  38923. renderer: function(v) { return v; }
  38924. },
  38925. axisLabelBottom: {
  38926. fill: '#444',
  38927. font: '12px Arial, Helvetica, sans-serif',
  38928. spacing: 2,
  38929. padding: 5,
  38930. renderer: function(v) { return v; }
  38931. },
  38932. axisLabelLeft: {
  38933. fill: '#444',
  38934. font: '12px Arial, Helvetica, sans-serif',
  38935. spacing: 2,
  38936. padding: 5,
  38937. renderer: function(v) { return v; }
  38938. },
  38939. axisTitleTop: {
  38940. font: 'bold 18px Arial',
  38941. fill: '#444'
  38942. },
  38943. axisTitleRight: {
  38944. font: 'bold 18px Arial',
  38945. fill: '#444',
  38946. rotate: {
  38947. x:0, y:0,
  38948. degrees: 270
  38949. }
  38950. },
  38951. axisTitleBottom: {
  38952. font: 'bold 18px Arial',
  38953. fill: '#444'
  38954. },
  38955. axisTitleLeft: {
  38956. font: 'bold 18px Arial',
  38957. fill: '#444',
  38958. rotate: {
  38959. x:0, y:0,
  38960. degrees: 270
  38961. }
  38962. },
  38963. series: {
  38964. 'stroke-width': 0
  38965. },
  38966. seriesLabel: {
  38967. font: '12px Arial',
  38968. fill: '#333'
  38969. },
  38970. marker: {
  38971. stroke: '#555',
  38972. radius: 3,
  38973. size: 3
  38974. },
  38975. colors: [ "#94ae0a", "#115fa6","#a61120", "#ff8809", "#ffd13e", "#a61187", "#24ad9a", "#7c7474", "#a66111"],
  38976. seriesThemes: [{
  38977. fill: "#115fa6"
  38978. }, {
  38979. fill: "#94ae0a"
  38980. }, {
  38981. fill: "#a61120"
  38982. }, {
  38983. fill: "#ff8809"
  38984. }, {
  38985. fill: "#ffd13e"
  38986. }, {
  38987. fill: "#a61187"
  38988. }, {
  38989. fill: "#24ad9a"
  38990. }, {
  38991. fill: "#7c7474"
  38992. }, {
  38993. fill: "#115fa6"
  38994. }, {
  38995. fill: "#94ae0a"
  38996. }, {
  38997. fill: "#a61120"
  38998. }, {
  38999. fill: "#ff8809"
  39000. }, {
  39001. fill: "#ffd13e"
  39002. }, {
  39003. fill: "#a61187"
  39004. }, {
  39005. fill: "#24ad9a"
  39006. }, {
  39007. fill: "#7c7474"
  39008. }, {
  39009. fill: "#a66111"
  39010. }],
  39011. markerThemes: [{
  39012. fill: "#115fa6",
  39013. type: 'circle'
  39014. }, {
  39015. fill: "#94ae0a",
  39016. type: 'cross'
  39017. }, {
  39018. fill: "#115fa6",
  39019. type: 'plus'
  39020. }, {
  39021. fill: "#94ae0a",
  39022. type: 'circle'
  39023. }, {
  39024. fill: "#a61120",
  39025. type: 'cross'
  39026. }]
  39027. });
  39028. }
  39029. }, function() {
  39030. var palette = ['#b1da5a', '#4ce0e7', '#e84b67', '#da5abd', '#4d7fe6', '#fec935'],
  39031. names = ['Green', 'Sky', 'Red', 'Purple', 'Blue', 'Yellow'],
  39032. i = 0, j = 0, l = palette.length, themes = Ext.chart.theme,
  39033. categories = [['#f0a50a', '#c20024', '#2044ba', '#810065', '#7eae29'],
  39034. ['#6d9824', '#87146e', '#2a9196', '#d39006', '#1e40ac'],
  39035. ['#fbbc29', '#ce2e4e', '#7e0062', '#158b90', '#57880e'],
  39036. ['#ef5773', '#fcbd2a', '#4f770d', '#1d3eaa', '#9b001f'],
  39037. ['#7eae29', '#fdbe2a', '#910019', '#27b4bc', '#d74dbc'],
  39038. ['#44dce1', '#0b2592', '#996e05', '#7fb325', '#b821a1']],
  39039. cats = categories.length;
  39040. for (; i < l; i++) {
  39041. themes[names[i]] = (function(color) {
  39042. return Ext.extend(themes.Base, {
  39043. constructor: function(config) {
  39044. themes.Base.prototype.constructor.call(this, Ext.apply({
  39045. baseColor: color
  39046. }, config));
  39047. }
  39048. });
  39049. }(palette[i]));
  39050. }
  39051. for (i = 0; i < cats; i++) {
  39052. themes['Category' + (i + 1)] = (function(category) {
  39053. return Ext.extend(themes.Base, {
  39054. constructor: function(config) {
  39055. themes.Base.prototype.constructor.call(this, Ext.apply({
  39056. colors: category
  39057. }, config));
  39058. }
  39059. });
  39060. }(categories[i]));
  39061. }
  39062. });
  39063. Ext.define('Ext.chart.MaskLayer', {
  39064. extend: 'Ext.Component',
  39065. constructor: function(config) {
  39066. config = Ext.apply(config || {}, {
  39067. style: 'position:absolute;background-color:#888;cursor:move;opacity:0.6;border:1px solid #222;'
  39068. });
  39069. this.callParent([config]);
  39070. },
  39071. initComponent: function() {
  39072. var me = this;
  39073. me.callParent(arguments);
  39074. me.addEvents(
  39075. 'mousedown',
  39076. 'mouseup',
  39077. 'mousemove',
  39078. 'mouseenter',
  39079. 'mouseleave'
  39080. );
  39081. },
  39082. initDraggable: function() {
  39083. this.callParent(arguments);
  39084. this.dd.onStart = function (e) {
  39085. var me = this,
  39086. comp = me.comp;
  39087. this.startPosition = comp.getPosition(true);
  39088. if (comp.ghost && !comp.liveDrag) {
  39089. me.proxy = comp.ghost();
  39090. me.dragTarget = me.proxy.header.el;
  39091. }
  39092. if (me.constrain || me.constrainDelegate) {
  39093. me.constrainTo = me.calculateConstrainRegion();
  39094. }
  39095. };
  39096. }
  39097. });
  39098. Ext.define('Ext.chart.Mask', {
  39099. requires: [
  39100. 'Ext.chart.MaskLayer'
  39101. ],
  39102. constructor: function(config) {
  39103. var me = this,
  39104. resizeHandler;
  39105. me.addEvents('select');
  39106. if (config) {
  39107. Ext.apply(me, config);
  39108. }
  39109. if (me.enableMask) {
  39110. me.on('afterrender', function() {
  39111. var comp = new Ext.chart.MaskLayer({
  39112. renderTo: me.el,
  39113. hidden: true
  39114. });
  39115. comp.el.on({
  39116. 'mousemove': function(e) {
  39117. me.onMouseMove(e);
  39118. },
  39119. 'mouseup': function(e) {
  39120. me.resized(e);
  39121. }
  39122. });
  39123. resizeHandler = new Ext.resizer.Resizer({
  39124. el: comp.el,
  39125. handles: 'all',
  39126. pinned: true
  39127. });
  39128. resizeHandler.on({
  39129. 'resize': function(e) {
  39130. me.resized(e);
  39131. }
  39132. });
  39133. comp.initDraggable();
  39134. me.maskType = me.mask;
  39135. me.mask = comp;
  39136. me.maskSprite = me.surface.add({
  39137. type: 'path',
  39138. path: ['M', 0, 0],
  39139. zIndex: 1001,
  39140. opacity: 0.7,
  39141. hidden: true,
  39142. stroke: '#444'
  39143. });
  39144. }, me, { single: true });
  39145. }
  39146. },
  39147. resized: function(e) {
  39148. var me = this,
  39149. bbox = me.bbox || me.chartBBox,
  39150. x = bbox.x,
  39151. y = bbox.y,
  39152. width = bbox.width,
  39153. height = bbox.height,
  39154. box = me.mask.getBox(true),
  39155. max = Math.max,
  39156. min = Math.min,
  39157. staticX = box.x - x,
  39158. staticY = box.y - y;
  39159. staticX = max(staticX, x);
  39160. staticY = max(staticY, y);
  39161. staticX = min(staticX, width);
  39162. staticY = min(staticY, height);
  39163. box.x = staticX;
  39164. box.y = staticY;
  39165. me.fireEvent('select', me, box);
  39166. },
  39167. onMouseUp: function(e) {
  39168. var me = this,
  39169. bbox = me.bbox || me.chartBBox,
  39170. sel = me.maskSelection;
  39171. me.maskMouseDown = false;
  39172. me.mouseDown = false;
  39173. if (me.mouseMoved) {
  39174. me.onMouseMove(e);
  39175. me.mouseMoved = false;
  39176. me.fireEvent('select', me, {
  39177. x: sel.x - bbox.x,
  39178. y: sel.y - bbox.y,
  39179. width: sel.width,
  39180. height: sel.height
  39181. });
  39182. }
  39183. },
  39184. onMouseDown: function(e) {
  39185. var me = this;
  39186. me.mouseDown = true;
  39187. me.mouseMoved = false;
  39188. me.maskMouseDown = {
  39189. x: e.getPageX() - me.el.getX(),
  39190. y: e.getPageY() - me.el.getY()
  39191. };
  39192. },
  39193. onMouseMove: function(e) {
  39194. var me = this,
  39195. mask = me.maskType,
  39196. bbox = me.bbox || me.chartBBox,
  39197. x = bbox.x,
  39198. y = bbox.y,
  39199. math = Math,
  39200. floor = math.floor,
  39201. abs = math.abs,
  39202. min = math.min,
  39203. max = math.max,
  39204. height = floor(y + bbox.height),
  39205. width = floor(x + bbox.width),
  39206. posX = e.getPageX(),
  39207. posY = e.getPageY(),
  39208. staticX = posX - me.el.getX(),
  39209. staticY = posY - me.el.getY(),
  39210. maskMouseDown = me.maskMouseDown,
  39211. path;
  39212. me.mouseMoved = me.mouseDown;
  39213. staticX = max(staticX, x);
  39214. staticY = max(staticY, y);
  39215. staticX = min(staticX, width);
  39216. staticY = min(staticY, height);
  39217. if (maskMouseDown && me.mouseDown) {
  39218. if (mask == 'horizontal') {
  39219. staticY = y;
  39220. maskMouseDown.y = height;
  39221. posY = me.el.getY() + bbox.height + me.insetPadding;
  39222. }
  39223. else if (mask == 'vertical') {
  39224. staticX = x;
  39225. maskMouseDown.x = width;
  39226. }
  39227. width = maskMouseDown.x - staticX;
  39228. height = maskMouseDown.y - staticY;
  39229. path = ['M', staticX, staticY, 'l', width, 0, 0, height, -width, 0, 'z'];
  39230. me.maskSelection = {
  39231. x: width > 0 ? staticX : staticX + width,
  39232. y: height > 0 ? staticY : staticY + height,
  39233. width: abs(width),
  39234. height: abs(height)
  39235. };
  39236. me.mask.updateBox(me.maskSelection);
  39237. me.mask.show();
  39238. me.maskSprite.setAttributes({
  39239. hidden: true
  39240. }, true);
  39241. }
  39242. else {
  39243. if (mask == 'horizontal') {
  39244. path = ['M', staticX, y, 'L', staticX, height];
  39245. }
  39246. else if (mask == 'vertical') {
  39247. path = ['M', x, staticY, 'L', width, staticY];
  39248. }
  39249. else {
  39250. path = ['M', staticX, y, 'L', staticX, height, 'M', x, staticY, 'L', width, staticY];
  39251. }
  39252. me.maskSprite.setAttributes({
  39253. path: path,
  39254. fill: me.maskMouseDown ? me.maskSprite.stroke : false,
  39255. 'stroke-width': mask === true ? 1 : 3,
  39256. hidden: false
  39257. }, true);
  39258. }
  39259. },
  39260. onMouseLeave: function(e) {
  39261. var me = this;
  39262. me.mouseMoved = false;
  39263. me.mouseDown = false;
  39264. me.maskMouseDown = false;
  39265. me.mask.hide();
  39266. me.maskSprite.hide(true);
  39267. }
  39268. });
  39269. Ext.define('Ext.chart.Navigation', {
  39270. constructor: function() {
  39271. this.originalStore = this.store;
  39272. },
  39273. setZoom: function(zoomConfig) {
  39274. var me = this,
  39275. axes = me.axes,
  39276. axesItems = axes.items,
  39277. i, ln, axis,
  39278. bbox = me.chartBBox,
  39279. xScale = 1 / bbox.width,
  39280. yScale = 1 / bbox.height,
  39281. zoomer = {
  39282. x : zoomConfig.x * xScale,
  39283. y : zoomConfig.y * yScale,
  39284. width : zoomConfig.width * xScale,
  39285. height : zoomConfig.height * yScale
  39286. },
  39287. ends, from, to;
  39288. for (i = 0, ln = axesItems.length; i < ln; i++) {
  39289. axis = axesItems[i];
  39290. ends = axis.calcEnds();
  39291. if (axis.position == 'bottom' || axis.position == 'top') {
  39292. from = (ends.to - ends.from) * zoomer.x + ends.from;
  39293. to = (ends.to - ends.from) * zoomer.width + from;
  39294. axis.minimum = from;
  39295. axis.maximum = to;
  39296. } else {
  39297. to = (ends.to - ends.from) * (1 - zoomer.y) + ends.from;
  39298. from = to - (ends.to - ends.from) * zoomer.height;
  39299. axis.minimum = from;
  39300. axis.maximum = to;
  39301. }
  39302. }
  39303. me.redraw(false);
  39304. },
  39305. restoreZoom: function() {
  39306. if (this.originalStore) {
  39307. this.store = this.substore = this.originalStore;
  39308. this.redraw(true);
  39309. }
  39310. }
  39311. });
  39312. Ext.define('Ext.chart.Chart', {
  39313. alias: 'widget.chart',
  39314. extend: 'Ext.draw.Component',
  39315. mixins: {
  39316. themeManager: 'Ext.chart.theme.Theme',
  39317. mask: 'Ext.chart.Mask',
  39318. navigation: 'Ext.chart.Navigation',
  39319. bindable: 'Ext.util.Bindable',
  39320. observable: 'Ext.util.Observable'
  39321. },
  39322. uses: [
  39323. 'Ext.chart.series.Series'
  39324. ],
  39325. requires: [
  39326. 'Ext.util.MixedCollection',
  39327. 'Ext.data.StoreManager',
  39328. 'Ext.chart.Legend',
  39329. 'Ext.chart.theme.Base',
  39330. 'Ext.chart.theme.Theme',
  39331. 'Ext.util.DelayedTask'
  39332. ],
  39333. viewBox: false,
  39334. animate: false,
  39335. legend: false,
  39336. insetPadding: 10,
  39337. enginePriority: ['Svg', 'Vml'],
  39338. background: false,
  39339. constructor: function(config) {
  39340. var me = this,
  39341. defaultAnim;
  39342. config = Ext.apply({}, config);
  39343. me.initTheme(config.theme || me.theme);
  39344. if (me.gradients) {
  39345. Ext.apply(config, { gradients: me.gradients });
  39346. }
  39347. if (me.background) {
  39348. Ext.apply(config, { background: me.background });
  39349. }
  39350. if (config.animate) {
  39351. defaultAnim = {
  39352. easing: 'ease',
  39353. duration: 500
  39354. };
  39355. if (Ext.isObject(config.animate)) {
  39356. config.animate = Ext.applyIf(config.animate, defaultAnim);
  39357. }
  39358. else {
  39359. config.animate = defaultAnim;
  39360. }
  39361. }
  39362. me.mixins.observable.constructor.call(me, config);
  39363. if (config.enableMask) {
  39364. me.mixins.mask.constructor.call(me);
  39365. }
  39366. me.mixins.navigation.constructor.call(me);
  39367. me.callParent([config]);
  39368. },
  39369. getChartStore: function(){
  39370. return this.substore || this.store;
  39371. },
  39372. initComponent: function() {
  39373. var me = this,
  39374. axes,
  39375. series;
  39376. me.callParent();
  39377. me.addEvents(
  39378. 'itemmousedown',
  39379. 'itemmouseup',
  39380. 'itemmouseover',
  39381. 'itemmouseout',
  39382. 'itemclick',
  39383. 'itemdblclick',
  39384. 'itemdragstart',
  39385. 'itemdrag',
  39386. 'itemdragend',
  39387. 'beforerefresh',
  39388. 'refresh'
  39389. );
  39390. Ext.applyIf(me, {
  39391. zoom: {
  39392. width: 1,
  39393. height: 1,
  39394. x: 0,
  39395. y: 0
  39396. }
  39397. });
  39398. me.maxGutter = [0, 0];
  39399. me.store = Ext.data.StoreManager.lookup(me.store);
  39400. axes = me.axes;
  39401. me.axes = new Ext.util.MixedCollection(false, function(a) { return a.position; });
  39402. if (axes) {
  39403. me.axes.addAll(axes);
  39404. }
  39405. series = me.series;
  39406. me.series = new Ext.util.MixedCollection(false, function(a) { return a.seriesId || (a.seriesId = Ext.id(null, 'ext-chart-series-')); });
  39407. if (series) {
  39408. me.series.addAll(series);
  39409. }
  39410. if (me.legend !== false) {
  39411. me.legend = new Ext.chart.Legend(Ext.applyIf({chart:me}, me.legend));
  39412. }
  39413. me.on({
  39414. mousemove: me.onMouseMove,
  39415. mouseleave: me.onMouseLeave,
  39416. mousedown: me.onMouseDown,
  39417. mouseup: me.onMouseUp,
  39418. click: me.onClick,
  39419. dblclick: me.onDblClick,
  39420. scope: me
  39421. });
  39422. },
  39423. afterComponentLayout: function(width, height) {
  39424. var me = this;
  39425. if (Ext.isNumber(width) && Ext.isNumber(height)) {
  39426. if (width !== me.curWidth || height !== me.curHeight) {
  39427. me.curWidth = width;
  39428. me.curHeight = height;
  39429. me.redraw(true);
  39430. } else if (me.needsRedraw) {
  39431. delete me.needsRedraw;
  39432. me.redraw();
  39433. }
  39434. }
  39435. this.callParent(arguments);
  39436. },
  39437. redraw: function(resize) {
  39438. var me = this,
  39439. seriesItems = me.series.items,
  39440. seriesLen = seriesItems.length,
  39441. axesItems = me.axes.items,
  39442. axesLen = axesItems.length,
  39443. i,
  39444. chartBBox = me.chartBBox = {
  39445. x: 0,
  39446. y: 0,
  39447. height: me.curHeight,
  39448. width: me.curWidth
  39449. },
  39450. legend = me.legend;
  39451. me.surface.setSize(chartBBox.width, chartBBox.height);
  39452. for (i = 0; i < seriesLen; i++) {
  39453. me.initializeSeries(seriesItems[i],i);
  39454. }
  39455. for (i = 0; i < axesLen; i++) {
  39456. me.initializeAxis(axesItems[i]);
  39457. }
  39458. for (i = 0; i < axesLen; i++) {
  39459. axesItems[i].processView();
  39460. }
  39461. for (i = 0; i < axesLen; i++) {
  39462. axesItems[i].drawAxis(true);
  39463. }
  39464. if (legend !== false && legend.visible) {
  39465. if (legend.update || !legend.created) {
  39466. legend.create();
  39467. }
  39468. }
  39469. me.alignAxes();
  39470. if (legend !== false && legend.visible) {
  39471. legend.updatePosition();
  39472. }
  39473. me.getMaxGutter();
  39474. me.resizing = !!resize;
  39475. for (i = 0; i < axesLen; i++) {
  39476. axesItems[i].drawAxis();
  39477. }
  39478. for (i = 0; i < seriesLen; i++) {
  39479. me.drawCharts(seriesItems[i]);
  39480. }
  39481. me.resizing = false;
  39482. },
  39483. afterRender: function() {
  39484. var ref,
  39485. me = this;
  39486. this.callParent();
  39487. if (me.categoryNames) {
  39488. me.setCategoryNames(me.categoryNames);
  39489. }
  39490. if (me.tipRenderer) {
  39491. ref = me.getFunctionRef(me.tipRenderer);
  39492. me.setTipRenderer(ref.fn, ref.scope);
  39493. }
  39494. me.bindStore(me.store, true);
  39495. me.refresh();
  39496. if (me.surface.engine === 'Vml') {
  39497. me.on('added', me.onAddedVml, me);
  39498. me.mon(Ext.container.Container.hierarchyEventSource, 'added', me.onContainerAddedVml, me);
  39499. }
  39500. },
  39501. onAddedVml: function() {
  39502. this.needsRedraw = true;
  39503. },
  39504. onContainerAddedVml: function(container) {
  39505. if (this.isDescendantOf(container)) {
  39506. this.needsRedraw = true;
  39507. }
  39508. },
  39509. getEventXY: function(e) {
  39510. var me = this,
  39511. box = this.surface.getRegion(),
  39512. pageXY = e.getXY(),
  39513. x = pageXY[0] - box.left,
  39514. y = pageXY[1] - box.top;
  39515. return [x, y];
  39516. },
  39517. onClick: function(e) {
  39518. this.handleClick('itemclick', e);
  39519. },
  39520. onDblClick: function(e) {
  39521. this.handleClick('itemdblclick', e);
  39522. },
  39523. handleClick: function(name, e) {
  39524. var me = this,
  39525. position = me.getEventXY(e),
  39526. seriesItems = me.series.items,
  39527. i, ln, series,
  39528. item;
  39529. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  39530. series = seriesItems[i];
  39531. if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
  39532. if (series.getItemForPoint) {
  39533. item = series.getItemForPoint(position[0], position[1]);
  39534. if (item) {
  39535. series.fireEvent(name, item);
  39536. }
  39537. }
  39538. }
  39539. }
  39540. },
  39541. onMouseDown: function(e) {
  39542. var me = this,
  39543. position = me.getEventXY(e),
  39544. seriesItems = me.series.items,
  39545. i, ln, series,
  39546. item;
  39547. if (me.enableMask) {
  39548. me.mixins.mask.onMouseDown.call(me, e);
  39549. }
  39550. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  39551. series = seriesItems[i];
  39552. if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
  39553. if (series.getItemForPoint) {
  39554. item = series.getItemForPoint(position[0], position[1]);
  39555. if (item) {
  39556. series.fireEvent('itemmousedown', item);
  39557. }
  39558. }
  39559. }
  39560. }
  39561. },
  39562. onMouseUp: function(e) {
  39563. var me = this,
  39564. position = me.getEventXY(e),
  39565. seriesItems = me.series.items,
  39566. i, ln, series,
  39567. item;
  39568. if (me.enableMask) {
  39569. me.mixins.mask.onMouseUp.call(me, e);
  39570. }
  39571. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  39572. series = seriesItems[i];
  39573. if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
  39574. if (series.getItemForPoint) {
  39575. item = series.getItemForPoint(position[0], position[1]);
  39576. if (item) {
  39577. series.fireEvent('itemmouseup', item);
  39578. }
  39579. }
  39580. }
  39581. }
  39582. },
  39583. onMouseMove: function(e) {
  39584. var me = this,
  39585. position = me.getEventXY(e),
  39586. seriesItems = me.series.items,
  39587. i, ln, series,
  39588. item, last, storeItem, storeField;
  39589. if (me.enableMask) {
  39590. me.mixins.mask.onMouseMove.call(me, e);
  39591. }
  39592. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  39593. series = seriesItems[i];
  39594. if (Ext.draw.Draw.withinBox(position[0], position[1], series.bbox)) {
  39595. if (series.getItemForPoint) {
  39596. item = series.getItemForPoint(position[0], position[1]);
  39597. last = series._lastItemForPoint;
  39598. storeItem = series._lastStoreItem;
  39599. storeField = series._lastStoreField;
  39600. if (item !== last || item && (item.storeItem != storeItem || item.storeField != storeField)) {
  39601. if (last) {
  39602. series.fireEvent('itemmouseout', last);
  39603. delete series._lastItemForPoint;
  39604. delete series._lastStoreField;
  39605. delete series._lastStoreItem;
  39606. }
  39607. if (item) {
  39608. series.fireEvent('itemmouseover', item);
  39609. series._lastItemForPoint = item;
  39610. series._lastStoreItem = item.storeItem;
  39611. series._lastStoreField = item.storeField;
  39612. }
  39613. }
  39614. }
  39615. } else {
  39616. last = series._lastItemForPoint;
  39617. if (last) {
  39618. series.fireEvent('itemmouseout', last);
  39619. delete series._lastItemForPoint;
  39620. delete series._lastStoreField;
  39621. delete series._lastStoreItem;
  39622. }
  39623. }
  39624. }
  39625. },
  39626. onMouseLeave: function(e) {
  39627. var me = this,
  39628. seriesItems = me.series.items,
  39629. i, ln, series;
  39630. if (me.enableMask) {
  39631. me.mixins.mask.onMouseLeave.call(me, e);
  39632. }
  39633. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  39634. series = seriesItems[i];
  39635. delete series._lastItemForPoint;
  39636. }
  39637. },
  39638. delayRefresh: function() {
  39639. var me = this;
  39640. if (!me.refreshTask) {
  39641. me.refreshTask = new Ext.util.DelayedTask(me.refresh, me);
  39642. }
  39643. me.refreshTask.delay(me.refreshBuffer);
  39644. },
  39645. refresh: function() {
  39646. var me = this;
  39647. if (me.rendered && me.curWidth !== undefined && me.curHeight !== undefined) {
  39648. if (!me.isVisible(true) && !me.refreshPending) {
  39649. me.setShowListeners('mon');
  39650. me.refreshPending = true;
  39651. return;
  39652. }
  39653. if (me.fireEvent('beforerefresh', me) !== false) {
  39654. me.redraw();
  39655. me.fireEvent('refresh', me);
  39656. }
  39657. }
  39658. },
  39659. onShow: function(){
  39660. var me = this;
  39661. me.callParent(arguments);
  39662. if (me.refreshPending) {
  39663. me.delayRefresh();
  39664. me.setShowListeners('mun');
  39665. }
  39666. delete me.refreshPending;
  39667. },
  39668. setShowListeners: function(method){
  39669. var me = this;
  39670. me[method](Ext.container.Container.hierarchyEventSource, {
  39671. scope: me,
  39672. single: true,
  39673. show: me.forceRefresh,
  39674. expand: me.forceRefresh
  39675. });
  39676. },
  39677. forceRefresh: function(container) {
  39678. var me = this;
  39679. if (me.isDescendantOf(container) && me.refreshPending) {
  39680. me.setShowListeners('mun');
  39681. me.delayRefresh();
  39682. }
  39683. delete me.refreshPending;
  39684. },
  39685. bindStore: function(store, initial) {
  39686. var me = this;
  39687. me.mixins.bindable.bindStore.apply(me, arguments);
  39688. if (me.store && !initial) {
  39689. me.refresh();
  39690. }
  39691. },
  39692. getStoreListeners: function() {
  39693. var refresh = this.refresh,
  39694. delayRefresh = this.delayRefresh;
  39695. return {
  39696. refresh: refresh,
  39697. add: delayRefresh,
  39698. remove: delayRefresh,
  39699. update: delayRefresh,
  39700. clear: refresh
  39701. };
  39702. },
  39703. initializeAxis: function(axis) {
  39704. var me = this,
  39705. chartBBox = me.chartBBox,
  39706. w = chartBBox.width,
  39707. h = chartBBox.height,
  39708. x = chartBBox.x,
  39709. y = chartBBox.y,
  39710. themeAttrs = me.themeAttrs,
  39711. config = {
  39712. chart: me
  39713. };
  39714. if (themeAttrs) {
  39715. config.axisStyle = Ext.apply({}, themeAttrs.axis);
  39716. config.axisLabelLeftStyle = Ext.apply({}, themeAttrs.axisLabelLeft);
  39717. config.axisLabelRightStyle = Ext.apply({}, themeAttrs.axisLabelRight);
  39718. config.axisLabelTopStyle = Ext.apply({}, themeAttrs.axisLabelTop);
  39719. config.axisLabelBottomStyle = Ext.apply({}, themeAttrs.axisLabelBottom);
  39720. config.axisTitleLeftStyle = Ext.apply({}, themeAttrs.axisTitleLeft);
  39721. config.axisTitleRightStyle = Ext.apply({}, themeAttrs.axisTitleRight);
  39722. config.axisTitleTopStyle = Ext.apply({}, themeAttrs.axisTitleTop);
  39723. config.axisTitleBottomStyle = Ext.apply({}, themeAttrs.axisTitleBottom);
  39724. }
  39725. switch (axis.position) {
  39726. case 'top':
  39727. Ext.apply(config, {
  39728. length: w,
  39729. width: h,
  39730. x: x,
  39731. y: y
  39732. });
  39733. break;
  39734. case 'bottom':
  39735. Ext.apply(config, {
  39736. length: w,
  39737. width: h,
  39738. x: x,
  39739. y: h
  39740. });
  39741. break;
  39742. case 'left':
  39743. Ext.apply(config, {
  39744. length: h,
  39745. width: w,
  39746. x: x,
  39747. y: h
  39748. });
  39749. break;
  39750. case 'right':
  39751. Ext.apply(config, {
  39752. length: h,
  39753. width: w,
  39754. x: w,
  39755. y: h
  39756. });
  39757. break;
  39758. }
  39759. if (!axis.chart) {
  39760. Ext.apply(config, axis);
  39761. axis = me.axes.replace(Ext.createByAlias('axis.' + axis.type.toLowerCase(), config));
  39762. }
  39763. else {
  39764. Ext.apply(axis, config);
  39765. }
  39766. },
  39767. alignAxes: function() {
  39768. var me = this,
  39769. axes = me.axes,
  39770. axesItems = axes.items,
  39771. axis,
  39772. legend = me.legend,
  39773. edges = ['top', 'right', 'bottom', 'left'],
  39774. edge,
  39775. i, ln,
  39776. chartBBox,
  39777. insetPadding = me.insetPadding,
  39778. insets = {
  39779. top: insetPadding,
  39780. right: insetPadding,
  39781. bottom: insetPadding,
  39782. left: insetPadding
  39783. },
  39784. isVertical, bbox, pos;
  39785. function getAxis(edge) {
  39786. var i = axes.findIndex('position', edge);
  39787. return (i < 0) ? null : axes.getAt(i);
  39788. }
  39789. for (i = 0, ln = edges.length; i < ln; i++) {
  39790. edge = edges[i];
  39791. isVertical = (edge === 'left' || edge === 'right');
  39792. axis = getAxis(edge);
  39793. if (legend !== false) {
  39794. if (legend.position === edge) {
  39795. bbox = legend.getBBox();
  39796. insets[edge] += (isVertical ? bbox.width : bbox.height) + insets[edge];
  39797. }
  39798. }
  39799. if (axis && axis.bbox) {
  39800. bbox = axis.bbox;
  39801. insets[edge] += (isVertical ? bbox.width : bbox.height);
  39802. }
  39803. }
  39804. chartBBox = {
  39805. x: insets.left,
  39806. y: insets.top,
  39807. width: me.curWidth - insets.left - insets.right,
  39808. height: me.curHeight - insets.top - insets.bottom
  39809. };
  39810. me.chartBBox = chartBBox;
  39811. for (i = 0, ln = axesItems.length; i < ln; i++) {
  39812. axis = axesItems[i];
  39813. pos = axis.position;
  39814. isVertical = (pos === 'left' || pos === 'right');
  39815. axis.x = (pos === 'right' ? chartBBox.x + chartBBox.width : chartBBox.x);
  39816. axis.y = (pos === 'top' ? chartBBox.y : chartBBox.y + chartBBox.height);
  39817. axis.width = (isVertical ? chartBBox.width : chartBBox.height);
  39818. axis.length = (isVertical ? chartBBox.height : chartBBox.width);
  39819. }
  39820. },
  39821. initializeSeries: function(series, idx) {
  39822. var me = this,
  39823. themeAttrs = me.themeAttrs,
  39824. seriesObj, markerObj, seriesThemes, st,
  39825. markerThemes, colorArrayStyle = [],
  39826. i = 0, l,
  39827. config = {
  39828. chart: me,
  39829. seriesId: series.seriesId
  39830. };
  39831. if (themeAttrs) {
  39832. seriesThemes = themeAttrs.seriesThemes;
  39833. markerThemes = themeAttrs.markerThemes;
  39834. seriesObj = Ext.apply({}, themeAttrs.series);
  39835. markerObj = Ext.apply({}, themeAttrs.marker);
  39836. config.seriesStyle = Ext.apply(seriesObj, seriesThemes[idx % seriesThemes.length]);
  39837. config.seriesLabelStyle = Ext.apply({}, themeAttrs.seriesLabel);
  39838. config.markerStyle = Ext.apply(markerObj, markerThemes[idx % markerThemes.length]);
  39839. if (themeAttrs.colors) {
  39840. config.colorArrayStyle = themeAttrs.colors;
  39841. } else {
  39842. colorArrayStyle = [];
  39843. for (l = seriesThemes.length; i < l; i++) {
  39844. st = seriesThemes[i];
  39845. if (st.fill || st.stroke) {
  39846. colorArrayStyle.push(st.fill || st.stroke);
  39847. }
  39848. }
  39849. if (colorArrayStyle.length) {
  39850. config.colorArrayStyle = colorArrayStyle;
  39851. }
  39852. }
  39853. config.seriesIdx = idx;
  39854. }
  39855. if (series instanceof Ext.chart.series.Series) {
  39856. Ext.apply(series, config);
  39857. } else {
  39858. Ext.applyIf(config, series);
  39859. series = me.series.replace(Ext.createByAlias('series.' + series.type.toLowerCase(), config));
  39860. }
  39861. if (series.initialize) {
  39862. series.initialize();
  39863. }
  39864. },
  39865. getMaxGutter: function() {
  39866. var me = this,
  39867. seriesItems = me.series.items,
  39868. i, ln, series,
  39869. maxGutter = [0, 0],
  39870. gutter;
  39871. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  39872. series = seriesItems[i];
  39873. gutter = series.getGutters && series.getGutters() || [0, 0];
  39874. maxGutter[0] = Math.max(maxGutter[0], gutter[0]);
  39875. maxGutter[1] = Math.max(maxGutter[1], gutter[1]);
  39876. }
  39877. me.maxGutter = maxGutter;
  39878. },
  39879. drawAxis: function(axis) {
  39880. axis.drawAxis();
  39881. },
  39882. drawCharts: function(series) {
  39883. series.triggerafterrender = false;
  39884. series.drawSeries();
  39885. if (!this.animate) {
  39886. series.fireEvent('afterrender');
  39887. }
  39888. },
  39889. save: function(config){
  39890. return Ext.draw.Surface.save(this.surface, config);
  39891. },
  39892. destroy: function() {
  39893. Ext.destroy(this.surface);
  39894. this.bindStore(null);
  39895. this.callParent(arguments);
  39896. }
  39897. });
  39898. Ext.define('Ext.chart.Highlight', {
  39899. requires: ['Ext.fx.Anim'],
  39900. highlight: false,
  39901. highlightCfg : {
  39902. fill: '#fdd',
  39903. "stroke-width": 5,
  39904. stroke: '#f55'
  39905. },
  39906. constructor: function(config) {
  39907. if (config.highlight) {
  39908. if (config.highlight !== true) {
  39909. this.highlightCfg = Ext.merge(this.highlightCfg, config.highlight);
  39910. }
  39911. }
  39912. },
  39913. highlightItem: function(item) {
  39914. if (!item) {
  39915. return;
  39916. }
  39917. var me = this,
  39918. sprite = item.sprite,
  39919. opts = Ext.merge({}, me.highlightCfg, me.highlight),
  39920. surface = me.chart.surface,
  39921. animate = me.chart.animate,
  39922. p, from, to, pi;
  39923. if (!me.highlight || !sprite || sprite._highlighted) {
  39924. return;
  39925. }
  39926. if (sprite._anim) {
  39927. sprite._anim.paused = true;
  39928. }
  39929. sprite._highlighted = true;
  39930. if (!sprite._defaults) {
  39931. sprite._defaults = Ext.apply({}, sprite.attr);
  39932. from = {};
  39933. to = {};
  39934. for (p in opts) {
  39935. if (! (p in sprite._defaults)) {
  39936. sprite._defaults[p] = surface.availableAttrs[p];
  39937. }
  39938. from[p] = sprite._defaults[p];
  39939. to[p] = opts[p];
  39940. if (Ext.isObject(opts[p])) {
  39941. from[p] = {};
  39942. to[p] = {};
  39943. Ext.apply(sprite._defaults[p], sprite.attr[p]);
  39944. Ext.apply(from[p], sprite._defaults[p]);
  39945. for (pi in sprite._defaults[p]) {
  39946. if (! (pi in opts[p])) {
  39947. to[p][pi] = from[p][pi];
  39948. } else {
  39949. to[p][pi] = opts[p][pi];
  39950. }
  39951. }
  39952. for (pi in opts[p]) {
  39953. if (! (pi in to[p])) {
  39954. to[p][pi] = opts[p][pi];
  39955. }
  39956. }
  39957. }
  39958. }
  39959. sprite._from = from;
  39960. sprite._to = to;
  39961. sprite._endStyle = to;
  39962. }
  39963. if (animate) {
  39964. sprite._anim = new Ext.fx.Anim({
  39965. target: sprite,
  39966. from: sprite._from,
  39967. to: sprite._to,
  39968. duration: 150
  39969. });
  39970. } else {
  39971. sprite.setAttributes(sprite._to, true);
  39972. }
  39973. },
  39974. unHighlightItem: function() {
  39975. if (!this.highlight || !this.items) {
  39976. return;
  39977. }
  39978. var me = this,
  39979. items = me.items,
  39980. len = items.length,
  39981. opts = Ext.merge({}, me.highlightCfg, me.highlight),
  39982. animate = me.chart.animate,
  39983. i = 0,
  39984. obj, p, sprite;
  39985. for (; i < len; i++) {
  39986. if (!items[i]) {
  39987. continue;
  39988. }
  39989. sprite = items[i].sprite;
  39990. if (sprite && sprite._highlighted) {
  39991. if (sprite._anim) {
  39992. sprite._anim.paused = true;
  39993. }
  39994. obj = {};
  39995. for (p in opts) {
  39996. if (Ext.isObject(sprite._defaults[p])) {
  39997. obj[p] = {};
  39998. Ext.apply(obj[p], sprite._defaults[p]);
  39999. }
  40000. else {
  40001. obj[p] = sprite._defaults[p];
  40002. }
  40003. }
  40004. if (animate) {
  40005. sprite._endStyle = obj;
  40006. sprite._anim = new Ext.fx.Anim({
  40007. target: sprite,
  40008. to: obj,
  40009. duration: 150
  40010. });
  40011. }
  40012. else {
  40013. sprite.setAttributes(obj, true);
  40014. }
  40015. delete sprite._highlighted;
  40016. }
  40017. }
  40018. },
  40019. cleanHighlights: function() {
  40020. if (!this.highlight) {
  40021. return;
  40022. }
  40023. var group = this.group,
  40024. markerGroup = this.markerGroup,
  40025. i = 0,
  40026. l;
  40027. for (l = group.getCount(); i < l; i++) {
  40028. delete group.getAt(i)._defaults;
  40029. }
  40030. if (markerGroup) {
  40031. for (l = markerGroup.getCount(); i < l; i++) {
  40032. delete markerGroup.getAt(i)._defaults;
  40033. }
  40034. }
  40035. }
  40036. });
  40037. Ext.define('Ext.chart.Label', {
  40038. requires: ['Ext.draw.Color'],
  40039. colorStringRe: /url\s*\(\s*#([^\/)]+)\s*\)/,
  40040. constructor: function(config) {
  40041. var me = this;
  40042. me.label = Ext.applyIf(me.label || {},
  40043. {
  40044. display: "none",
  40045. color: "#000",
  40046. field: "name",
  40047. minMargin: 50,
  40048. font: "11px Helvetica, sans-serif",
  40049. orientation: "horizontal",
  40050. renderer: function(v) {
  40051. return v;
  40052. }
  40053. });
  40054. if (me.label.display !== 'none') {
  40055. me.labelsGroup = me.chart.surface.getGroup(me.seriesId + '-labels');
  40056. }
  40057. },
  40058. renderLabels: function() {
  40059. var me = this,
  40060. chart = me.chart,
  40061. gradients = chart.gradients,
  40062. items = me.items,
  40063. animate = chart.animate,
  40064. config = me.label,
  40065. display = config.display,
  40066. color = config.color,
  40067. field = [].concat(config.field),
  40068. group = me.labelsGroup,
  40069. groupLength = (group || 0) && group.length,
  40070. store = me.chart.getChartStore(),
  40071. len = store.getCount(),
  40072. itemLength = (items || 0) && items.length,
  40073. ratio = itemLength / len,
  40074. gradientsCount = (gradients || 0) && gradients.length,
  40075. Color = Ext.draw.Color,
  40076. hides = [],
  40077. gradient, i, count, groupIndex, index, j, k, colorStopTotal, colorStopIndex, colorStop, item, label,
  40078. storeItem, sprite, spriteColor, spriteBrightness, labelColor, colorString;
  40079. if (display == 'none') {
  40080. return;
  40081. }
  40082. if(itemLength == 0){
  40083. while(groupLength--) {
  40084. hides.push(groupLength);
  40085. }
  40086. } else {
  40087. for (i = 0, count = 0, groupIndex = 0; i < len; i++) {
  40088. index = 0;
  40089. for (j = 0; j < ratio; j++) {
  40090. item = items[count];
  40091. label = group.getAt(groupIndex);
  40092. storeItem = store.getAt(i);
  40093. while(this.__excludes && this.__excludes[index]) {
  40094. index++;
  40095. }
  40096. if (!item && label) {
  40097. label.hide(true);
  40098. groupIndex++;
  40099. }
  40100. if (item && field[j]) {
  40101. if (!label) {
  40102. label = me.onCreateLabel(storeItem, item, i, display, j, index);
  40103. }
  40104. me.onPlaceLabel(label, storeItem, item, i, display, animate, j, index);
  40105. groupIndex++;
  40106. if (config.contrast && item.sprite) {
  40107. sprite = item.sprite;
  40108. if (sprite._endStyle) {
  40109. colorString = sprite._endStyle.fill;
  40110. }
  40111. else if (sprite._to) {
  40112. colorString = sprite._to.fill;
  40113. }
  40114. else {
  40115. colorString = sprite.attr.fill;
  40116. }
  40117. colorString = colorString || sprite.attr.fill;
  40118. spriteColor = Color.fromString(colorString);
  40119. if (colorString && !spriteColor) {
  40120. colorString = colorString.match(me.colorStringRe)[1];
  40121. for (k = 0; k < gradientsCount; k++) {
  40122. gradient = gradients[k];
  40123. if (gradient.id == colorString) {
  40124. colorStop = 0; colorStopTotal = 0;
  40125. for (colorStopIndex in gradient.stops) {
  40126. colorStop++;
  40127. colorStopTotal += Color.fromString(gradient.stops[colorStopIndex].color).getGrayscale();
  40128. }
  40129. spriteBrightness = (colorStopTotal / colorStop) / 255;
  40130. break;
  40131. }
  40132. }
  40133. }
  40134. else {
  40135. spriteBrightness = spriteColor.getGrayscale() / 255;
  40136. }
  40137. if (label.isOutside) {
  40138. spriteBrightness = 1;
  40139. }
  40140. labelColor = Color.fromString(label.attr.color || label.attr.fill).getHSL();
  40141. labelColor[2] = spriteBrightness > 0.5 ? 0.2 : 0.8;
  40142. label.setAttributes({
  40143. fill: String(Color.fromHSL.apply({}, labelColor))
  40144. }, true);
  40145. }
  40146. }
  40147. count++;
  40148. index++;
  40149. }
  40150. }
  40151. groupLength = group.length;
  40152. while(groupLength > groupIndex){
  40153. hides.push(groupIndex);
  40154. groupIndex++;
  40155. }
  40156. }
  40157. me.hideLabels(hides);
  40158. },
  40159. hideLabels: function(hides){
  40160. var labelsGroup = this.labelsGroup,
  40161. hlen = !!hides && hides.length;
  40162. if (!labelsGroup) {
  40163. return;
  40164. }
  40165. if (hlen === false) {
  40166. hlen = labelsGroup.getCount();
  40167. while (hlen--) {
  40168. labelsGroup.getAt(hlen).hide(true);
  40169. }
  40170. } else {
  40171. while(hlen--) {
  40172. labelsGroup.getAt(hides[hlen]).hide(true);
  40173. }
  40174. }
  40175. }
  40176. });
  40177. Ext.define('Ext.chart.TipSurface', {
  40178. extend: 'Ext.draw.Component',
  40179. spriteArray: false,
  40180. renderFirst: true,
  40181. constructor: function(config) {
  40182. this.callParent([config]);
  40183. if (config.sprites) {
  40184. this.spriteArray = [].concat(config.sprites);
  40185. delete config.sprites;
  40186. }
  40187. },
  40188. onRender: function() {
  40189. var me = this,
  40190. i = 0,
  40191. l = 0,
  40192. sp,
  40193. sprites;
  40194. this.callParent(arguments);
  40195. sprites = me.spriteArray;
  40196. if (me.renderFirst && sprites) {
  40197. me.renderFirst = false;
  40198. for (l = sprites.length; i < l; i++) {
  40199. sp = me.surface.add(sprites[i]);
  40200. sp.setAttributes({
  40201. hidden: false
  40202. },
  40203. true);
  40204. }
  40205. }
  40206. }
  40207. });
  40208. Ext.define('Ext.chart.Tip', {
  40209. requires: ['Ext.tip.ToolTip', 'Ext.chart.TipSurface'],
  40210. constructor: function(config) {
  40211. var me = this,
  40212. surface,
  40213. sprites,
  40214. tipSurface;
  40215. if (config.tips) {
  40216. me.tipTimeout = null;
  40217. me.tipConfig = Ext.apply({}, config.tips, {
  40218. renderer: Ext.emptyFn,
  40219. constrainPosition: true,
  40220. autoHide: true
  40221. });
  40222. me.tooltip = new Ext.tip.ToolTip(me.tipConfig);
  40223. me.chart.surface.on('mousemove', me.tooltip.onMouseMove, me.tooltip);
  40224. me.chart.surface.on('mouseleave', function() {
  40225. me.hideTip();
  40226. });
  40227. if (me.tipConfig.surface) {
  40228. surface = me.tipConfig.surface;
  40229. sprites = surface.sprites;
  40230. tipSurface = new Ext.chart.TipSurface({
  40231. id: 'tipSurfaceComponent',
  40232. sprites: sprites
  40233. });
  40234. if (surface.width && surface.height) {
  40235. tipSurface.setSize(surface.width, surface.height);
  40236. }
  40237. me.tooltip.add(tipSurface);
  40238. me.spriteTip = tipSurface;
  40239. }
  40240. }
  40241. },
  40242. showTip: function(item) {
  40243. var me = this,
  40244. tooltip,
  40245. spriteTip,
  40246. tipConfig,
  40247. trackMouse,
  40248. sprite,
  40249. surface,
  40250. surfaceExt,
  40251. pos,
  40252. x,
  40253. y;
  40254. if (!me.tooltip) {
  40255. return;
  40256. }
  40257. clearTimeout(me.tipTimeout);
  40258. tooltip = me.tooltip;
  40259. spriteTip = me.spriteTip;
  40260. tipConfig = me.tipConfig;
  40261. trackMouse = tooltip.trackMouse;
  40262. if (!trackMouse) {
  40263. tooltip.trackMouse = true;
  40264. sprite = item.sprite;
  40265. surface = sprite.surface;
  40266. surfaceExt = Ext.get(surface.getId());
  40267. if (surfaceExt) {
  40268. pos = surfaceExt.getXY();
  40269. x = pos[0] + (sprite.attr.x || 0) + (sprite.attr.translation && sprite.attr.translation.x || 0);
  40270. y = pos[1] + (sprite.attr.y || 0) + (sprite.attr.translation && sprite.attr.translation.y || 0);
  40271. tooltip.targetXY = [x, y];
  40272. }
  40273. }
  40274. if (spriteTip) {
  40275. tipConfig.renderer.call(tooltip, item.storeItem, item, spriteTip.surface);
  40276. } else {
  40277. tipConfig.renderer.call(tooltip, item.storeItem, item);
  40278. }
  40279. tooltip.show();
  40280. tooltip.trackMouse = trackMouse;
  40281. },
  40282. hideTip: function(item) {
  40283. var tooltip = this.tooltip;
  40284. if (!tooltip) {
  40285. return;
  40286. }
  40287. clearTimeout(this.tipTimeout);
  40288. this.tipTimeout = setTimeout(function() {
  40289. tooltip.hide();
  40290. }, 0);
  40291. }
  40292. });
  40293. Ext.define('Ext.chart.axis.Abstract', {
  40294. requires: ['Ext.chart.Chart'],
  40295. constructor: function(config) {
  40296. config = config || {};
  40297. var me = this,
  40298. pos = config.position || 'left';
  40299. pos = pos.charAt(0).toUpperCase() + pos.substring(1);
  40300. config.label = Ext.apply(config['axisLabel' + pos + 'Style'] || {}, config.label || {});
  40301. config.axisTitleStyle = Ext.apply(config['axisTitle' + pos + 'Style'] || {}, config.labelTitle || {});
  40302. Ext.apply(me, config);
  40303. me.fields = Ext.Array.from(me.fields);
  40304. this.callParent();
  40305. me.labels = [];
  40306. me.getId();
  40307. me.labelGroup = me.chart.surface.getGroup(me.axisId + "-labels");
  40308. },
  40309. alignment: null,
  40310. grid: false,
  40311. steps: 10,
  40312. x: 0,
  40313. y: 0,
  40314. minValue: 0,
  40315. maxValue: 0,
  40316. getId: function() {
  40317. return this.axisId || (this.axisId = Ext.id(null, 'ext-axis-'));
  40318. },
  40319. processView: Ext.emptyFn,
  40320. drawAxis: Ext.emptyFn,
  40321. addDisplayAndLabels: Ext.emptyFn
  40322. });
  40323. Ext.define('Ext.chart.axis.Axis', {
  40324. extend: 'Ext.chart.axis.Abstract',
  40325. alternateClassName: 'Ext.chart.Axis',
  40326. requires: ['Ext.draw.Draw'],
  40327. forceMinMax: false,
  40328. dashSize: 3,
  40329. position: 'bottom',
  40330. skipFirst: false,
  40331. length: 0,
  40332. width: 0,
  40333. adjustEnd: true,
  40334. majorTickSteps: false,
  40335. applyData: Ext.emptyFn,
  40336. getRange: function () {
  40337. var me = this,
  40338. chart = me.chart,
  40339. store = chart.getChartStore(),
  40340. data = store.data.items,
  40341. series = chart.series.items,
  40342. position = me.position,
  40343. boundedAxes,
  40344. seriesClasses = Ext.chart.series,
  40345. aggregations = [],
  40346. min = Infinity, max = -Infinity,
  40347. vertical = me.position === 'left' || me.position === 'right',
  40348. i, ln, ln2, j, k, dataLength = data.length, aggregates,
  40349. countedFields = {},
  40350. allFields = {},
  40351. excludable = true,
  40352. fields, fieldMap, record, field, value;
  40353. fields = me.fields;
  40354. for (j = 0, ln = fields.length; j < ln; j++) {
  40355. allFields[fields[j]] = true;
  40356. }
  40357. for (i = 0, ln = series.length; i < ln; i++) {
  40358. if (series[i].seriesIsHidden) {
  40359. continue;
  40360. }
  40361. if (!series[i].getAxesForXAndYFields) {
  40362. continue;
  40363. }
  40364. boundedAxes = series[i].getAxesForXAndYFields();
  40365. if (boundedAxes.xAxis && boundedAxes.xAxis !== position && boundedAxes.yAxis && boundedAxes.yAxis !== position) {
  40366. continue;
  40367. }
  40368. if (seriesClasses.Bar && series[i] instanceof seriesClasses.Bar && !series[i].column) {
  40369. fields = vertical ? Ext.Array.from(series[i].xField) : Ext.Array.from(series[i].yField);
  40370. } else {
  40371. fields = vertical ? Ext.Array.from(series[i].yField) : Ext.Array.from(series[i].xField);
  40372. }
  40373. if (me.fields.length) {
  40374. for (j = 0, ln2 = fields.length; j < ln2; j++) {
  40375. if (allFields[fields[j]]) {
  40376. break;
  40377. }
  40378. }
  40379. if (j == ln2) {
  40380. continue;
  40381. }
  40382. }
  40383. if (aggregates = series[i].stacked) {
  40384. if (seriesClasses.Bar && series[i] instanceof seriesClasses.Bar) {
  40385. if (series[i].column != vertical) {
  40386. aggregates = false;
  40387. excludable = false;
  40388. }
  40389. }
  40390. else if (!vertical) {
  40391. aggregates = false;
  40392. excludable = false;
  40393. }
  40394. }
  40395. if (aggregates) {
  40396. fieldMap = {};
  40397. for (j = 0; j < fields.length; j++) {
  40398. if (excludable && series[i].__excludes && series[i].__excludes[j]) {
  40399. continue;
  40400. }
  40401. if (!allFields[fields[j]]) {
  40402. Ext.Logger.warn('Field `' + fields[j] + '` is not included in the ' + position + ' axis config.');
  40403. }
  40404. allFields[fields[j]] = fieldMap[fields[j]] = true;
  40405. }
  40406. aggregations.push({
  40407. fields: fieldMap,
  40408. value: 0
  40409. });
  40410. } else {
  40411. if (!fields || fields.length == 0) {
  40412. fields = me.fields;
  40413. }
  40414. for (j = 0; j < fields.length; j++) {
  40415. if (excludable && series[i].__excludes && series[i].__excludes[j]) {
  40416. continue;
  40417. }
  40418. allFields[fields[j]] = countedFields[fields[j]] = true;
  40419. }
  40420. }
  40421. }
  40422. for (i = 0; i < dataLength; i++) {
  40423. record = data[i];
  40424. for (k = 0; k < aggregations.length; k++) {
  40425. aggregations[k].value = 0;
  40426. }
  40427. for (field in allFields) {
  40428. value = record.get(field);
  40429. if (isNaN(value)) {
  40430. continue;
  40431. }
  40432. if (value === undefined) {
  40433. value = 0;
  40434. }
  40435. if (countedFields[field]) {
  40436. if (min > value) {
  40437. min = value;
  40438. }
  40439. if (max < value) {
  40440. max = value;
  40441. }
  40442. }
  40443. for (k = 0; k < aggregations.length; k++) {
  40444. if (aggregations[k].fields[field]) {
  40445. aggregations[k].value += value;
  40446. if (min > 0) {
  40447. min = 0;
  40448. }
  40449. if (max < aggregations[k].value) {
  40450. max = aggregations[k].value;
  40451. }
  40452. }
  40453. }
  40454. }
  40455. }
  40456. if (!isFinite(max)) {
  40457. max = me.prevMax || 0;
  40458. }
  40459. if (!isFinite(min)) {
  40460. min = me.prevMin || 0;
  40461. }
  40462. if (min != max && (max != Math.floor(max))) {
  40463. max = Math.floor(max) + 1;
  40464. }
  40465. if (!isNaN(me.minimum)) {
  40466. min = me.minimum;
  40467. }
  40468. if (!isNaN(me.maximum)) {
  40469. max = me.maximum;
  40470. }
  40471. if (min >= max) {
  40472. max = min + 1;
  40473. }
  40474. return {min: min, max: max};
  40475. },
  40476. calcEnds: function () {
  40477. var me = this,
  40478. range = me.getRange(),
  40479. min = range.min,
  40480. max = range.max,
  40481. steps, prettyNumbers, out, changedRange;
  40482. steps = (Ext.isNumber(me.majorTickSteps) ? me.majorTickSteps + 1 : me.steps);
  40483. prettyNumbers = !(Ext.isNumber(me.maximum) && Ext.isNumber(me.minimum) && Ext.isNumber(me.majorTickSteps) && me.majorTickSteps > 0);
  40484. out = Ext.draw.Draw.snapEnds(min, max, steps, prettyNumbers);
  40485. if (Ext.isNumber(me.maximum)) {
  40486. out.to = me.maximum;
  40487. changedRange = true;
  40488. }
  40489. if (Ext.isNumber(me.minimum)) {
  40490. out.from = me.minimum;
  40491. changedRange = true;
  40492. }
  40493. if (me.adjustMaximumByMajorUnit) {
  40494. out.to = Math.ceil(out.to / out.step) * out.step;
  40495. changedRange = true;
  40496. }
  40497. if (me.adjustMinimumByMajorUnit) {
  40498. out.from = Math.floor(out.from / out.step) * out.step;
  40499. changedRange = true;
  40500. }
  40501. if (changedRange) {
  40502. out.steps = Math.ceil((out.to - out.from) / out.step);
  40503. }
  40504. me.prevMin = (min == max ? 0 : min);
  40505. me.prevMax = max;
  40506. return out;
  40507. },
  40508. drawAxis: function (init) {
  40509. var me = this,
  40510. i,
  40511. x = me.x,
  40512. y = me.y,
  40513. gutterX = me.chart.maxGutter[0],
  40514. gutterY = me.chart.maxGutter[1],
  40515. dashSize = me.dashSize,
  40516. subDashesX = me.minorTickSteps || 0,
  40517. subDashesY = me.minorTickSteps || 0,
  40518. length = me.length,
  40519. position = me.position,
  40520. inflections = [],
  40521. calcLabels = false,
  40522. stepCalcs = me.applyData(),
  40523. step = stepCalcs.step,
  40524. steps = stepCalcs.steps,
  40525. from = stepCalcs.from,
  40526. to = stepCalcs.to,
  40527. trueLength,
  40528. currentX,
  40529. currentY,
  40530. path,
  40531. dashesX,
  40532. dashesY,
  40533. delta;
  40534. if (me.hidden || isNaN(step) || (from > to)) {
  40535. return;
  40536. }
  40537. me.from = stepCalcs.from;
  40538. me.to = stepCalcs.to;
  40539. if (position == 'left' || position == 'right') {
  40540. currentX = Math.floor(x) + 0.5;
  40541. path = ["M", currentX, y, "l", 0, -length];
  40542. trueLength = length - (gutterY * 2);
  40543. }
  40544. else {
  40545. currentY = Math.floor(y) + 0.5;
  40546. path = ["M", x, currentY, "l", length, 0];
  40547. trueLength = length - (gutterX * 2);
  40548. }
  40549. delta = steps && trueLength / steps;
  40550. dashesX = Math.max(subDashesX + 1, 0);
  40551. dashesY = Math.max(subDashesY + 1, 0);
  40552. if (me.type == 'Numeric' || me.type == 'Time') {
  40553. calcLabels = true;
  40554. me.labels = [stepCalcs.from];
  40555. }
  40556. if (position == 'right' || position == 'left') {
  40557. currentY = y - gutterY;
  40558. currentX = x - ((position == 'left') * dashSize * 2);
  40559. while (currentY >= y - gutterY - trueLength) {
  40560. path.push("M", currentX, Math.floor(currentY) + 0.5, "l", dashSize * 2 + 1, 0);
  40561. if (currentY != y - gutterY) {
  40562. for (i = 1; i < dashesY; i++) {
  40563. path.push("M", currentX + dashSize, Math.floor(currentY + delta * i / dashesY) + 0.5, "l", dashSize + 1, 0);
  40564. }
  40565. }
  40566. inflections.push([ Math.floor(x), Math.floor(currentY) ]);
  40567. currentY -= delta;
  40568. if (calcLabels) {
  40569. me.labels.push(me.labels[me.labels.length - 1] + step);
  40570. }
  40571. if (delta === 0) {
  40572. break;
  40573. }
  40574. }
  40575. if (Math.round(currentY + delta - (y - gutterY - trueLength))) {
  40576. path.push("M", currentX, Math.floor(y - length + gutterY) + 0.5, "l", dashSize * 2 + 1, 0);
  40577. for (i = 1; i < dashesY; i++) {
  40578. path.push("M", currentX + dashSize, Math.floor(y - length + gutterY + delta * i / dashesY) + 0.5, "l", dashSize + 1, 0);
  40579. }
  40580. inflections.push([ Math.floor(x), Math.floor(currentY) ]);
  40581. if (calcLabels) {
  40582. me.labels.push(me.labels[me.labels.length - 1] + step);
  40583. }
  40584. }
  40585. } else {
  40586. currentX = x + gutterX;
  40587. currentY = y - ((position == 'top') * dashSize * 2);
  40588. while (currentX <= x + gutterX + trueLength) {
  40589. path.push("M", Math.floor(currentX) + 0.5, currentY, "l", 0, dashSize * 2 + 1);
  40590. if (currentX != x + gutterX) {
  40591. for (i = 1; i < dashesX; i++) {
  40592. path.push("M", Math.floor(currentX - delta * i / dashesX) + 0.5, currentY, "l", 0, dashSize + 1);
  40593. }
  40594. }
  40595. inflections.push([ Math.floor(currentX), Math.floor(y) ]);
  40596. currentX += delta;
  40597. if (calcLabels) {
  40598. me.labels.push(me.labels[me.labels.length - 1] + step);
  40599. }
  40600. if (delta === 0) {
  40601. break;
  40602. }
  40603. }
  40604. if (Math.round(currentX - delta - (x + gutterX + trueLength))) {
  40605. path.push("M", Math.floor(x + length - gutterX) + 0.5, currentY, "l", 0, dashSize * 2 + 1);
  40606. for (i = 1; i < dashesX; i++) {
  40607. path.push("M", Math.floor(x + length - gutterX - delta * i / dashesX) + 0.5, currentY, "l", 0, dashSize + 1);
  40608. }
  40609. inflections.push([ Math.floor(currentX), Math.floor(y) ]);
  40610. if (calcLabels) {
  40611. me.labels.push(me.labels[me.labels.length - 1] + step);
  40612. }
  40613. }
  40614. }
  40615. if (calcLabels) {
  40616. me.labels[inflections.length - 1] = +(me.labels[inflections.length - 1]).toFixed(10);
  40617. }
  40618. if (!me.axis) {
  40619. me.axis = me.chart.surface.add(Ext.apply({
  40620. type: 'path',
  40621. path: path
  40622. }, me.axisStyle));
  40623. }
  40624. me.axis.setAttributes({
  40625. path: path
  40626. }, true);
  40627. me.inflections = inflections;
  40628. if (!init && me.grid) {
  40629. me.drawGrid();
  40630. }
  40631. me.axisBBox = me.axis.getBBox();
  40632. me.drawLabel();
  40633. },
  40634. drawGrid: function () {
  40635. var me = this,
  40636. surface = me.chart.surface,
  40637. grid = me.grid,
  40638. odd = grid.odd,
  40639. even = grid.even,
  40640. inflections = me.inflections,
  40641. ln = inflections.length - ((odd || even) ? 0 : 1),
  40642. position = me.position,
  40643. gutter = me.chart.maxGutter,
  40644. width = me.width - 2,
  40645. point, prevPoint,
  40646. i = 1,
  40647. path = [], styles, lineWidth, dlineWidth,
  40648. oddPath = [], evenPath = [];
  40649. if ((gutter[1] !== 0 && (position == 'left' || position == 'right')) ||
  40650. (gutter[0] !== 0 && (position == 'top' || position == 'bottom'))) {
  40651. i = 0;
  40652. ln++;
  40653. }
  40654. for (; i < ln; i++) {
  40655. point = inflections[i];
  40656. prevPoint = inflections[i - 1];
  40657. if (odd || even) {
  40658. path = (i % 2) ? oddPath : evenPath;
  40659. styles = ((i % 2) ? odd : even) || {};
  40660. lineWidth = (styles.lineWidth || styles['stroke-width'] || 0) / 2;
  40661. dlineWidth = 2 * lineWidth;
  40662. if (position == 'left') {
  40663. path.push("M", prevPoint[0] + 1 + lineWidth, prevPoint[1] + 0.5 - lineWidth,
  40664. "L", prevPoint[0] + 1 + width - lineWidth, prevPoint[1] + 0.5 - lineWidth,
  40665. "L", point[0] + 1 + width - lineWidth, point[1] + 0.5 + lineWidth,
  40666. "L", point[0] + 1 + lineWidth, point[1] + 0.5 + lineWidth, "Z");
  40667. }
  40668. else if (position == 'right') {
  40669. path.push("M", prevPoint[0] - lineWidth, prevPoint[1] + 0.5 - lineWidth,
  40670. "L", prevPoint[0] - width + lineWidth, prevPoint[1] + 0.5 - lineWidth,
  40671. "L", point[0] - width + lineWidth, point[1] + 0.5 + lineWidth,
  40672. "L", point[0] - lineWidth, point[1] + 0.5 + lineWidth, "Z");
  40673. }
  40674. else if (position == 'top') {
  40675. path.push("M", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] + 1 + lineWidth,
  40676. "L", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] + 1 + width - lineWidth,
  40677. "L", point[0] + 0.5 - lineWidth, point[1] + 1 + width - lineWidth,
  40678. "L", point[0] + 0.5 - lineWidth, point[1] + 1 + lineWidth, "Z");
  40679. }
  40680. else {
  40681. path.push("M", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] - lineWidth,
  40682. "L", prevPoint[0] + 0.5 + lineWidth, prevPoint[1] - width + lineWidth,
  40683. "L", point[0] + 0.5 - lineWidth, point[1] - width + lineWidth,
  40684. "L", point[0] + 0.5 - lineWidth, point[1] - lineWidth, "Z");
  40685. }
  40686. } else {
  40687. if (position == 'left') {
  40688. path = path.concat(["M", point[0] + 0.5, point[1] + 0.5, "l", width, 0]);
  40689. }
  40690. else if (position == 'right') {
  40691. path = path.concat(["M", point[0] - 0.5, point[1] + 0.5, "l", -width, 0]);
  40692. }
  40693. else if (position == 'top') {
  40694. path = path.concat(["M", point[0] + 0.5, point[1] + 0.5, "l", 0, width]);
  40695. }
  40696. else {
  40697. path = path.concat(["M", point[0] + 0.5, point[1] - 0.5, "l", 0, -width]);
  40698. }
  40699. }
  40700. }
  40701. if (odd || even) {
  40702. if (oddPath.length) {
  40703. if (!me.gridOdd && oddPath.length) {
  40704. me.gridOdd = surface.add({
  40705. type: 'path',
  40706. path: oddPath
  40707. });
  40708. }
  40709. me.gridOdd.setAttributes(Ext.apply({
  40710. path: oddPath,
  40711. hidden: false
  40712. }, odd || {}), true);
  40713. }
  40714. if (evenPath.length) {
  40715. if (!me.gridEven) {
  40716. me.gridEven = surface.add({
  40717. type: 'path',
  40718. path: evenPath
  40719. });
  40720. }
  40721. me.gridEven.setAttributes(Ext.apply({
  40722. path: evenPath,
  40723. hidden: false
  40724. }, even || {}), true);
  40725. }
  40726. }
  40727. else {
  40728. if (path.length) {
  40729. if (!me.gridLines) {
  40730. me.gridLines = me.chart.surface.add({
  40731. type: 'path',
  40732. path: path,
  40733. "stroke-width": me.lineWidth || 1,
  40734. stroke: me.gridColor || '#ccc'
  40735. });
  40736. }
  40737. me.gridLines.setAttributes({
  40738. hidden: false,
  40739. path: path
  40740. }, true);
  40741. }
  40742. else if (me.gridLines) {
  40743. me.gridLines.hide(true);
  40744. }
  40745. }
  40746. },
  40747. getOrCreateLabel: function (i, text) {
  40748. var me = this,
  40749. labelGroup = me.labelGroup,
  40750. textLabel = labelGroup.getAt(i),
  40751. surface = me.chart.surface;
  40752. if (textLabel) {
  40753. if (text != textLabel.attr.text) {
  40754. textLabel.setAttributes(Ext.apply({
  40755. text: text
  40756. }, me.label), true);
  40757. textLabel._bbox = textLabel.getBBox();
  40758. }
  40759. }
  40760. else {
  40761. textLabel = surface.add(Ext.apply({
  40762. group: labelGroup,
  40763. type: 'text',
  40764. x: 0,
  40765. y: 0,
  40766. text: text
  40767. }, me.label));
  40768. surface.renderItem(textLabel);
  40769. textLabel._bbox = textLabel.getBBox();
  40770. }
  40771. if (me.label.rotation) {
  40772. textLabel.setAttributes({
  40773. rotation: {
  40774. degrees: 0
  40775. }
  40776. }, true);
  40777. textLabel._ubbox = textLabel.getBBox();
  40778. textLabel.setAttributes(me.label, true);
  40779. } else {
  40780. textLabel._ubbox = textLabel._bbox;
  40781. }
  40782. return textLabel;
  40783. },
  40784. rect2pointArray: function (sprite) {
  40785. var surface = this.chart.surface,
  40786. rect = surface.getBBox(sprite, true),
  40787. p1 = [rect.x, rect.y],
  40788. p1p = p1.slice(),
  40789. p2 = [rect.x + rect.width, rect.y],
  40790. p2p = p2.slice(),
  40791. p3 = [rect.x + rect.width, rect.y + rect.height],
  40792. p3p = p3.slice(),
  40793. p4 = [rect.x, rect.y + rect.height],
  40794. p4p = p4.slice(),
  40795. matrix = sprite.matrix;
  40796. p1[0] = matrix.x.apply(matrix, p1p);
  40797. p1[1] = matrix.y.apply(matrix, p1p);
  40798. p2[0] = matrix.x.apply(matrix, p2p);
  40799. p2[1] = matrix.y.apply(matrix, p2p);
  40800. p3[0] = matrix.x.apply(matrix, p3p);
  40801. p3[1] = matrix.y.apply(matrix, p3p);
  40802. p4[0] = matrix.x.apply(matrix, p4p);
  40803. p4[1] = matrix.y.apply(matrix, p4p);
  40804. return [p1, p2, p3, p4];
  40805. },
  40806. intersect: function (l1, l2) {
  40807. var r1 = this.rect2pointArray(l1),
  40808. r2 = this.rect2pointArray(l2);
  40809. return !!Ext.draw.Draw.intersect(r1, r2).length;
  40810. },
  40811. drawHorizontalLabels: function () {
  40812. var me = this,
  40813. labelConf = me.label,
  40814. floor = Math.floor,
  40815. max = Math.max,
  40816. axes = me.chart.axes,
  40817. insetPadding = me.chart.insetPadding,
  40818. position = me.position,
  40819. inflections = me.inflections,
  40820. ln = inflections.length,
  40821. labels = me.labels,
  40822. maxHeight = 0,
  40823. ratio,
  40824. bbox, point, prevLabel, prevLabelId,
  40825. adjustEnd = me.adjustEnd,
  40826. hasLeft = axes.findIndex('position', 'left') != -1,
  40827. hasRight = axes.findIndex('position', 'right') != -1,
  40828. textLabel, text,
  40829. last, x, y, i, firstLabel;
  40830. last = ln - 1;
  40831. point = inflections[0];
  40832. firstLabel = me.getOrCreateLabel(0, me.label.renderer(labels[0]));
  40833. ratio = Math.floor(Math.abs(Math.sin(labelConf.rotate && (labelConf.rotate.degrees * Math.PI / 180) || 0)));
  40834. for (i = 0; i < ln; i++) {
  40835. point = inflections[i];
  40836. text = me.label.renderer(labels[i]);
  40837. textLabel = me.getOrCreateLabel(i, text);
  40838. bbox = textLabel._bbox;
  40839. maxHeight = max(maxHeight, bbox.height + me.dashSize + me.label.padding);
  40840. x = floor(point[0] - (ratio ? bbox.height : bbox.width) / 2);
  40841. if (adjustEnd && me.chart.maxGutter[0] == 0) {
  40842. if (i == 0 && !hasLeft) {
  40843. x = point[0];
  40844. }
  40845. else if (i == last && !hasRight) {
  40846. x = Math.min(x, point[0] - bbox.width + insetPadding);
  40847. }
  40848. }
  40849. if (position == 'top') {
  40850. y = point[1] - (me.dashSize * 2) - me.label.padding - (bbox.height / 2);
  40851. }
  40852. else {
  40853. y = point[1] + (me.dashSize * 2) + me.label.padding + (bbox.height / 2);
  40854. }
  40855. textLabel.setAttributes({
  40856. hidden: false,
  40857. x: x,
  40858. y: y
  40859. }, true);
  40860. if (i != 0 && (me.intersect(textLabel, prevLabel)
  40861. || me.intersect(textLabel, firstLabel))) {
  40862. if (i === last && prevLabelId !== 0) {
  40863. prevLabel.hide(true);
  40864. } else {
  40865. textLabel.hide(true);
  40866. continue;
  40867. }
  40868. }
  40869. prevLabel = textLabel;
  40870. prevLabelId = i;
  40871. }
  40872. return maxHeight;
  40873. },
  40874. drawVerticalLabels: function () {
  40875. var me = this,
  40876. inflections = me.inflections,
  40877. position = me.position,
  40878. ln = inflections.length,
  40879. chart = me.chart,
  40880. insetPadding = chart.insetPadding,
  40881. labels = me.labels,
  40882. maxWidth = 0,
  40883. max = Math.max,
  40884. floor = Math.floor,
  40885. ceil = Math.ceil,
  40886. axes = me.chart.axes,
  40887. gutterY = me.chart.maxGutter[1],
  40888. bbox, point, prevLabel, prevLabelId,
  40889. hasTop = axes.findIndex('position', 'top') != -1,
  40890. hasBottom = axes.findIndex('position', 'bottom') != -1,
  40891. adjustEnd = me.adjustEnd,
  40892. textLabel, text,
  40893. last = ln - 1, x, y, i;
  40894. for (i = 0; i < ln; i++) {
  40895. point = inflections[i];
  40896. text = me.label.renderer(labels[i]);
  40897. textLabel = me.getOrCreateLabel(i, text);
  40898. bbox = textLabel._bbox;
  40899. maxWidth = max(maxWidth, bbox.width + me.dashSize + me.label.padding);
  40900. y = point[1];
  40901. if (adjustEnd && gutterY < bbox.height / 2) {
  40902. if (i == last && !hasTop) {
  40903. y = Math.max(y, me.y - me.length + ceil(bbox.height / 2) - insetPadding);
  40904. }
  40905. else if (i == 0 && !hasBottom) {
  40906. y = me.y + gutterY - floor(bbox.height / 2);
  40907. }
  40908. }
  40909. if (position == 'left') {
  40910. x = point[0] - bbox.width - me.dashSize - me.label.padding - 2;
  40911. }
  40912. else {
  40913. x = point[0] + me.dashSize + me.label.padding + 2;
  40914. }
  40915. textLabel.setAttributes(Ext.apply({
  40916. hidden: false,
  40917. x: x,
  40918. y: y
  40919. }, me.label), true);
  40920. if (i != 0 && me.intersect(textLabel, prevLabel)) {
  40921. if (i === last && prevLabelId !== 0) {
  40922. prevLabel.hide(true);
  40923. } else {
  40924. textLabel.hide(true);
  40925. continue;
  40926. }
  40927. }
  40928. prevLabel = textLabel;
  40929. prevLabelId = i;
  40930. }
  40931. return maxWidth;
  40932. },
  40933. drawLabel: function () {
  40934. var me = this,
  40935. position = me.position,
  40936. labelGroup = me.labelGroup,
  40937. inflections = me.inflections,
  40938. maxWidth = 0,
  40939. maxHeight = 0,
  40940. ln, i;
  40941. if (position == 'left' || position == 'right') {
  40942. maxWidth = me.drawVerticalLabels();
  40943. } else {
  40944. maxHeight = me.drawHorizontalLabels();
  40945. }
  40946. ln = labelGroup.getCount();
  40947. i = inflections.length;
  40948. for (; i < ln; i++) {
  40949. labelGroup.getAt(i).hide(true);
  40950. }
  40951. me.bbox = {};
  40952. Ext.apply(me.bbox, me.axisBBox);
  40953. me.bbox.height = maxHeight;
  40954. me.bbox.width = maxWidth;
  40955. if (Ext.isString(me.title)) {
  40956. me.drawTitle(maxWidth, maxHeight);
  40957. }
  40958. },
  40959. setTitle: function (title) {
  40960. this.title = title;
  40961. this.drawLabel();
  40962. },
  40963. drawTitle: function (maxWidth, maxHeight) {
  40964. var me = this,
  40965. position = me.position,
  40966. surface = me.chart.surface,
  40967. displaySprite = me.displaySprite,
  40968. title = me.title,
  40969. rotate = (position == 'left' || position == 'right'),
  40970. x = me.x,
  40971. y = me.y,
  40972. base, bbox, pad;
  40973. if (displaySprite) {
  40974. displaySprite.setAttributes({text: title}, true);
  40975. } else {
  40976. base = {
  40977. type: 'text',
  40978. x: 0,
  40979. y: 0,
  40980. text: title
  40981. };
  40982. displaySprite = me.displaySprite = surface.add(Ext.apply(base, me.axisTitleStyle, me.labelTitle));
  40983. surface.renderItem(displaySprite);
  40984. }
  40985. bbox = displaySprite.getBBox();
  40986. pad = me.dashSize + me.label.padding;
  40987. if (rotate) {
  40988. y -= ((me.length / 2) - (bbox.height / 2));
  40989. if (position == 'left') {
  40990. x -= (maxWidth + pad + (bbox.width / 2));
  40991. }
  40992. else {
  40993. x += (maxWidth + pad + bbox.width - (bbox.width / 2));
  40994. }
  40995. me.bbox.width += bbox.width + 10;
  40996. }
  40997. else {
  40998. x += (me.length / 2) - (bbox.width * 0.5);
  40999. if (position == 'top') {
  41000. y -= (maxHeight + pad + (bbox.height * 0.3));
  41001. }
  41002. else {
  41003. y += (maxHeight + pad + (bbox.height * 0.8));
  41004. }
  41005. me.bbox.height += bbox.height + 10;
  41006. }
  41007. displaySprite.setAttributes({
  41008. translate: {
  41009. x: x,
  41010. y: y
  41011. }
  41012. }, true);
  41013. }
  41014. });
  41015. Ext.define('Ext.chart.axis.Category', {
  41016. extend: 'Ext.chart.axis.Axis',
  41017. alternateClassName: 'Ext.chart.CategoryAxis',
  41018. alias: 'axis.category',
  41019. categoryNames: null,
  41020. calculateCategoryCount: false,
  41021. setLabels: function() {
  41022. var store = this.chart.getChartStore(),
  41023. data = store.data.items,
  41024. d, dLen, record,
  41025. fields = this.fields,
  41026. ln = fields.length,
  41027. i;
  41028. this.labels = [];
  41029. for (d = 0, dLen = data.length; d < dLen; d++) {
  41030. record = data[d];
  41031. for (i = 0; i < ln; i++) {
  41032. this.labels.push(record.get(fields[i]));
  41033. }
  41034. }
  41035. },
  41036. applyData: function() {
  41037. this.callParent();
  41038. this.setLabels();
  41039. var count = this.chart.getChartStore().getCount();
  41040. return {
  41041. from: 0,
  41042. to: count - 1,
  41043. power: 1,
  41044. step: 1,
  41045. steps: count - 1
  41046. };
  41047. }
  41048. });
  41049. Ext.define('Ext.chart.axis.Gauge', {
  41050. extend: 'Ext.chart.axis.Abstract',
  41051. position: 'gauge',
  41052. alias: 'axis.gauge',
  41053. drawAxis: function(init) {
  41054. var chart = this.chart,
  41055. surface = chart.surface,
  41056. bbox = chart.chartBBox,
  41057. centerX = bbox.x + (bbox.width / 2),
  41058. centerY = bbox.y + bbox.height,
  41059. margin = this.margin || 10,
  41060. rho = Math.min(bbox.width, 2 * bbox.height) /2 + margin,
  41061. sprites = [], sprite,
  41062. steps = this.steps,
  41063. i, pi = Math.PI,
  41064. cos = Math.cos,
  41065. sin = Math.sin;
  41066. if (this.sprites && !chart.resizing) {
  41067. this.drawLabel();
  41068. return;
  41069. }
  41070. if (this.margin >= 0) {
  41071. if (!this.sprites) {
  41072. for (i = 0; i <= steps; i++) {
  41073. sprite = surface.add({
  41074. type: 'path',
  41075. path: ['M', centerX + (rho - margin) * cos(i / steps * pi - pi),
  41076. centerY + (rho - margin) * sin(i / steps * pi - pi),
  41077. 'L', centerX + rho * cos(i / steps * pi - pi),
  41078. centerY + rho * sin(i / steps * pi - pi), 'Z'],
  41079. stroke: '#ccc'
  41080. });
  41081. sprite.setAttributes({
  41082. hidden: false
  41083. }, true);
  41084. sprites.push(sprite);
  41085. }
  41086. } else {
  41087. sprites = this.sprites;
  41088. for (i = 0; i <= steps; i++) {
  41089. sprites[i].setAttributes({
  41090. path: ['M', centerX + (rho - margin) * cos(i / steps * pi - pi),
  41091. centerY + (rho - margin) * sin(i / steps * pi - pi),
  41092. 'L', centerX + rho * cos(i / steps * pi - pi),
  41093. centerY + rho * sin(i / steps * pi - pi), 'Z'],
  41094. stroke: '#ccc'
  41095. }, true);
  41096. }
  41097. }
  41098. }
  41099. this.sprites = sprites;
  41100. this.drawLabel();
  41101. if (this.title) {
  41102. this.drawTitle();
  41103. }
  41104. },
  41105. drawTitle: function() {
  41106. var me = this,
  41107. chart = me.chart,
  41108. surface = chart.surface,
  41109. bbox = chart.chartBBox,
  41110. labelSprite = me.titleSprite,
  41111. labelBBox;
  41112. if (!labelSprite) {
  41113. me.titleSprite = labelSprite = surface.add({
  41114. type: 'text',
  41115. zIndex: 2
  41116. });
  41117. }
  41118. labelSprite.setAttributes(Ext.apply({
  41119. text: me.title
  41120. }, me.label || {}), true);
  41121. labelBBox = labelSprite.getBBox();
  41122. labelSprite.setAttributes({
  41123. x: bbox.x + (bbox.width / 2) - (labelBBox.width / 2),
  41124. y: bbox.y + bbox.height - (labelBBox.height / 2) - 4
  41125. }, true);
  41126. },
  41127. setTitle: function(title) {
  41128. this.title = title;
  41129. this.drawTitle();
  41130. },
  41131. drawLabel: function() {
  41132. var chart = this.chart,
  41133. surface = chart.surface,
  41134. bbox = chart.chartBBox,
  41135. centerX = bbox.x + (bbox.width / 2),
  41136. centerY = bbox.y + bbox.height,
  41137. margin = this.margin || 10,
  41138. rho = Math.min(bbox.width, 2 * bbox.height) /2 + 2 * margin,
  41139. round = Math.round,
  41140. labelArray = [], label,
  41141. maxValue = this.maximum || 0,
  41142. minValue = this.minimum || 0,
  41143. steps = this.steps, i = 0,
  41144. adjY,
  41145. pi = Math.PI,
  41146. cos = Math.cos,
  41147. sin = Math.sin,
  41148. labelConf = this.label,
  41149. renderer = labelConf.renderer || function(v) { return v; };
  41150. if (!this.labelArray) {
  41151. for (i = 0; i <= steps; i++) {
  41152. adjY = (i === 0 || i === steps) ? 7 : 0;
  41153. label = surface.add({
  41154. type: 'text',
  41155. text: renderer(round(minValue + i / steps * (maxValue - minValue))),
  41156. x: centerX + rho * cos(i / steps * pi - pi),
  41157. y: centerY + rho * sin(i / steps * pi - pi) - adjY,
  41158. 'text-anchor': 'middle',
  41159. 'stroke-width': 0.2,
  41160. zIndex: 10,
  41161. stroke: '#333'
  41162. });
  41163. label.setAttributes({
  41164. hidden: false
  41165. }, true);
  41166. labelArray.push(label);
  41167. }
  41168. }
  41169. else {
  41170. labelArray = this.labelArray;
  41171. for (i = 0; i <= steps; i++) {
  41172. adjY = (i === 0 || i === steps) ? 7 : 0;
  41173. labelArray[i].setAttributes({
  41174. text: renderer(round(minValue + i / steps * (maxValue - minValue))),
  41175. x: centerX + rho * cos(i / steps * pi - pi),
  41176. y: centerY + rho * sin(i / steps * pi - pi) - adjY
  41177. }, true);
  41178. }
  41179. }
  41180. this.labelArray = labelArray;
  41181. }
  41182. });
  41183. Ext.define('Ext.chart.axis.Numeric', {
  41184. extend: 'Ext.chart.axis.Axis',
  41185. alternateClassName: 'Ext.chart.NumericAxis',
  41186. type: 'numeric',
  41187. alias: 'axis.numeric',
  41188. uses: ['Ext.data.Store'],
  41189. constructor: function(config) {
  41190. var me = this,
  41191. hasLabel = !!(config.label && config.label.renderer),
  41192. label;
  41193. me.callParent([config]);
  41194. label = me.label;
  41195. if (config.constrain == null) {
  41196. me.constrain = (config.minimum != null && config.maximum != null);
  41197. }
  41198. if (!hasLabel) {
  41199. label.renderer = function(v) {
  41200. return me.roundToDecimal(v, me.decimals);
  41201. };
  41202. }
  41203. },
  41204. roundToDecimal: function(v, dec) {
  41205. var val = Math.pow(10, dec || 0);
  41206. return Math.round(v * val) / val;
  41207. },
  41208. minimum: NaN,
  41209. maximum: NaN,
  41210. constrain: true,
  41211. decimals: 2,
  41212. scale: "linear",
  41213. doConstrain: function() {
  41214. var me = this,
  41215. store = me.chart.store,
  41216. items = store.data.items,
  41217. d, dLen, record,
  41218. series = me.chart.series.items,
  41219. fields = me.fields,
  41220. ln = fields.length,
  41221. range = me.calcEnds(),
  41222. min = range.from, max = range.to, i, l,
  41223. useAcum = false,
  41224. value, data = [],
  41225. addRecord;
  41226. for (i = 0, l = series.length; i < l; i++) {
  41227. if (series[i].type === 'bar' && series[i].stacked) {
  41228. return;
  41229. }
  41230. }
  41231. for (d = 0, dLen = items.length; d < dLen; d++) {
  41232. addRecord = true;
  41233. record = items[d];
  41234. for (i = 0; i < ln; i++) {
  41235. value = record.get(fields[i]);
  41236. if (+value < +min) {
  41237. addRecord = false;
  41238. break;
  41239. }
  41240. if (+value > +max) {
  41241. addRecord = false;
  41242. break;
  41243. }
  41244. }
  41245. if (addRecord) {
  41246. data.push(record);
  41247. }
  41248. }
  41249. me.chart.substore = Ext.create('Ext.data.Store', { model: store.model });
  41250. me.chart.substore.loadData(data);
  41251. },
  41252. position: 'left',
  41253. adjustMaximumByMajorUnit: false,
  41254. adjustMinimumByMajorUnit: false,
  41255. processView: function() {
  41256. var me = this,
  41257. constrain = me.constrain;
  41258. if (constrain) {
  41259. me.doConstrain();
  41260. }
  41261. },
  41262. applyData: function() {
  41263. this.callParent();
  41264. return this.calcEnds();
  41265. }
  41266. });
  41267. Ext.define('Ext.chart.axis.Radial', {
  41268. extend: 'Ext.chart.axis.Abstract',
  41269. position: 'radial',
  41270. alias: 'axis.radial',
  41271. drawAxis: function(init) {
  41272. var chart = this.chart,
  41273. surface = chart.surface,
  41274. bbox = chart.chartBBox,
  41275. store = chart.store,
  41276. l = store.getCount(),
  41277. centerX = bbox.x + (bbox.width / 2),
  41278. centerY = bbox.y + (bbox.height / 2),
  41279. rho = Math.min(bbox.width, bbox.height) /2,
  41280. sprites = [], sprite,
  41281. steps = this.steps,
  41282. i, j, pi2 = Math.PI * 2,
  41283. cos = Math.cos, sin = Math.sin;
  41284. if (this.sprites && !chart.resizing) {
  41285. this.drawLabel();
  41286. return;
  41287. }
  41288. if (!this.sprites) {
  41289. for (i = 1; i <= steps; i++) {
  41290. sprite = surface.add({
  41291. type: 'circle',
  41292. x: centerX,
  41293. y: centerY,
  41294. radius: Math.max(rho * i / steps, 0),
  41295. stroke: '#ccc'
  41296. });
  41297. sprite.setAttributes({
  41298. hidden: false
  41299. }, true);
  41300. sprites.push(sprite);
  41301. }
  41302. for (i = 0; i < l; i++) {
  41303. sprite = surface.add({
  41304. type: 'path',
  41305. path: ['M', centerX, centerY, 'L', centerX + rho * cos(i / l * pi2), centerY + rho * sin(i / l * pi2), 'Z'],
  41306. stroke: '#ccc'
  41307. });
  41308. sprite.setAttributes({
  41309. hidden: false
  41310. }, true);
  41311. sprites.push(sprite);
  41312. }
  41313. } else {
  41314. sprites = this.sprites;
  41315. for (i = 0; i < steps; i++) {
  41316. sprites[i].setAttributes({
  41317. x: centerX,
  41318. y: centerY,
  41319. radius: Math.max(rho * (i + 1) / steps, 0),
  41320. stroke: '#ccc'
  41321. }, true);
  41322. }
  41323. for (j = 0; j < l; j++) {
  41324. sprites[i + j].setAttributes({
  41325. path: ['M', centerX, centerY, 'L', centerX + rho * cos(j / l * pi2), centerY + rho * sin(j / l * pi2), 'Z'],
  41326. stroke: '#ccc'
  41327. }, true);
  41328. }
  41329. }
  41330. this.sprites = sprites;
  41331. this.drawLabel();
  41332. },
  41333. drawLabel: function() {
  41334. var chart = this.chart,
  41335. seriesItems = chart.series.items,
  41336. series,
  41337. surface = chart.surface,
  41338. bbox = chart.chartBBox,
  41339. store = chart.store,
  41340. data = store.data.items,
  41341. ln, record,
  41342. centerX = bbox.x + (bbox.width / 2),
  41343. centerY = bbox.y + (bbox.height / 2),
  41344. rho = Math.min(bbox.width, bbox.height) /2,
  41345. max = Math.max, round = Math.round,
  41346. labelArray = [], label,
  41347. fields = [], nfields,
  41348. categories = [], xField,
  41349. aggregate = !this.maximum,
  41350. maxValue = this.maximum || 0,
  41351. steps = this.steps, i = 0, j, dx, dy,
  41352. pi2 = Math.PI * 2,
  41353. cos = Math.cos, sin = Math.sin,
  41354. display = this.label.display,
  41355. draw = display !== 'none',
  41356. margin = 10;
  41357. if (!draw) {
  41358. return;
  41359. }
  41360. for (i = 0, ln = seriesItems.length; i < ln; i++) {
  41361. series = seriesItems[i];
  41362. fields.push(series.yField);
  41363. xField = series.xField;
  41364. }
  41365. for (j = 0, ln = data.length; j < ln; j++) {
  41366. record = data[j];
  41367. if (aggregate) {
  41368. for (i = 0, nfields = fields.length; i < nfields; i++) {
  41369. maxValue = max(+record.get(fields[i]), maxValue);
  41370. }
  41371. }
  41372. categories.push(record.get(xField));
  41373. }
  41374. if (!this.labelArray) {
  41375. if (display != 'categories') {
  41376. for (i = 1; i <= steps; i++) {
  41377. label = surface.add({
  41378. type: 'text',
  41379. text: round(i / steps * maxValue),
  41380. x: centerX,
  41381. y: centerY - rho * i / steps,
  41382. 'text-anchor': 'middle',
  41383. 'stroke-width': 0.1,
  41384. stroke: '#333'
  41385. });
  41386. label.setAttributes({
  41387. hidden: false
  41388. }, true);
  41389. labelArray.push(label);
  41390. }
  41391. }
  41392. if (display != 'scale') {
  41393. for (j = 0, steps = categories.length; j < steps; j++) {
  41394. dx = cos(j / steps * pi2) * (rho + margin);
  41395. dy = sin(j / steps * pi2) * (rho + margin);
  41396. label = surface.add({
  41397. type: 'text',
  41398. text: categories[j],
  41399. x: centerX + dx,
  41400. y: centerY + dy,
  41401. 'text-anchor': dx * dx <= 0.001? 'middle' : (dx < 0? 'end' : 'start')
  41402. });
  41403. label.setAttributes({
  41404. hidden: false
  41405. }, true);
  41406. labelArray.push(label);
  41407. }
  41408. }
  41409. }
  41410. else {
  41411. labelArray = this.labelArray;
  41412. if (display != 'categories') {
  41413. for (i = 0; i < steps; i++) {
  41414. labelArray[i].setAttributes({
  41415. text: round((i + 1) / steps * maxValue),
  41416. x: centerX,
  41417. y: centerY - rho * (i + 1) / steps,
  41418. 'text-anchor': 'middle',
  41419. 'stroke-width': 0.1,
  41420. stroke: '#333'
  41421. }, true);
  41422. }
  41423. }
  41424. if (display != 'scale') {
  41425. for (j = 0, steps = categories.length; j < steps; j++) {
  41426. dx = cos(j / steps * pi2) * (rho + margin);
  41427. dy = sin(j / steps * pi2) * (rho + margin);
  41428. if (labelArray[i + j]) {
  41429. labelArray[i + j].setAttributes({
  41430. type: 'text',
  41431. text: categories[j],
  41432. x: centerX + dx,
  41433. y: centerY + dy,
  41434. 'text-anchor': dx * dx <= 0.001? 'middle' : (dx < 0? 'end' : 'start')
  41435. }, true);
  41436. }
  41437. }
  41438. }
  41439. }
  41440. this.labelArray = labelArray;
  41441. }
  41442. });
  41443. Ext.define('Ext.chart.axis.Time', {
  41444. extend: 'Ext.chart.axis.Numeric',
  41445. alternateClassName: 'Ext.chart.TimeAxis',
  41446. alias: 'axis.time',
  41447. uses: ['Ext.data.Store'],
  41448. dateFormat: false,
  41449. fromDate: false,
  41450. toDate: false,
  41451. step: [Ext.Date.DAY, 1],
  41452. constrain: false,
  41453. constructor: function (config) {
  41454. var me = this, label, f, df;
  41455. me.callParent([config]);
  41456. label = me.label || {};
  41457. df = this.dateFormat;
  41458. if (df) {
  41459. if (label.renderer) {
  41460. f = label.renderer;
  41461. label.renderer = function(v) {
  41462. v = f(v);
  41463. return Ext.Date.format(new Date(f(v)), df);
  41464. };
  41465. } else {
  41466. label.renderer = function(v) {
  41467. return Ext.Date.format(new Date(v >> 0), df);
  41468. };
  41469. }
  41470. }
  41471. },
  41472. processView: function () {
  41473. var me = this;
  41474. if (me.fromDate) {
  41475. me.minimum = +me.fromDate;
  41476. }
  41477. if (me.toDate) {
  41478. me.maximum = +me.toDate;
  41479. }
  41480. if(me.constrain){
  41481. me.doConstrain();
  41482. }
  41483. },
  41484. calcEnds: function() {
  41485. var me = this, range, step = me.step;
  41486. if (step) {
  41487. range = me.getRange();
  41488. range = Ext.draw.Draw.snapEndsByDateAndStep(new Date(range.min), new Date(range.max), Ext.isNumber(step) ? [Date.MILLI, step]: step);
  41489. if (me.minimum) {
  41490. range.from = me.minimum;
  41491. }
  41492. if (me.maximum) {
  41493. range.to = me.maximum;
  41494. }
  41495. range.step = (range.to - range.from) / range.steps;
  41496. return range;
  41497. } else {
  41498. return me.callParent(arguments);
  41499. }
  41500. }
  41501. });
  41502. Ext.define('Ext.chart.series.Series', {
  41503. mixins: {
  41504. observable: 'Ext.util.Observable',
  41505. labels: 'Ext.chart.Label',
  41506. highlights: 'Ext.chart.Highlight',
  41507. tips: 'Ext.chart.Tip',
  41508. callouts: 'Ext.chart.Callout'
  41509. },
  41510. type: null,
  41511. title: null,
  41512. showInLegend: true,
  41513. renderer: function(sprite, record, attributes, index, store) {
  41514. return attributes;
  41515. },
  41516. shadowAttributes: null,
  41517. animating: false,
  41518. constructor: function(config) {
  41519. var me = this;
  41520. if (config) {
  41521. Ext.apply(me, config);
  41522. }
  41523. me.shadowGroups = [];
  41524. me.mixins.labels.constructor.call(me, config);
  41525. me.mixins.highlights.constructor.call(me, config);
  41526. me.mixins.tips.constructor.call(me, config);
  41527. me.mixins.callouts.constructor.call(me, config);
  41528. me.addEvents({
  41529. scope: me,
  41530. itemmouseover: true,
  41531. itemmouseout: true,
  41532. itemmousedown: true,
  41533. itemmouseup: true,
  41534. mouseleave: true,
  41535. afterdraw: true,
  41536. titlechange: true
  41537. });
  41538. me.mixins.observable.constructor.call(me, config);
  41539. me.on({
  41540. scope: me,
  41541. itemmouseover: me.onItemMouseOver,
  41542. itemmouseout: me.onItemMouseOut,
  41543. mouseleave: me.onMouseLeave
  41544. });
  41545. if (me.style) {
  41546. Ext.apply(me.seriesStyle, me.style);
  41547. }
  41548. },
  41549. eachRecord: function(fn, scope) {
  41550. var chart = this.chart;
  41551. (chart.substore || chart.store).each(fn, scope);
  41552. },
  41553. getRecordCount: function() {
  41554. var chart = this.chart,
  41555. store = chart.substore || chart.store;
  41556. return store ? store.getCount() : 0;
  41557. },
  41558. isExcluded: function(index) {
  41559. var excludes = this.__excludes;
  41560. return !!(excludes && excludes[index]);
  41561. },
  41562. setBBox: function(noGutter) {
  41563. var me = this,
  41564. chart = me.chart,
  41565. chartBBox = chart.chartBBox,
  41566. gutterX = noGutter ? 0 : chart.maxGutter[0],
  41567. gutterY = noGutter ? 0 : chart.maxGutter[1],
  41568. clipBox, bbox;
  41569. clipBox = {
  41570. x: chartBBox.x,
  41571. y: chartBBox.y,
  41572. width: chartBBox.width,
  41573. height: chartBBox.height
  41574. };
  41575. me.clipBox = clipBox;
  41576. bbox = {
  41577. x: (clipBox.x + gutterX) - (chart.zoom.x * chart.zoom.width),
  41578. y: (clipBox.y + gutterY) - (chart.zoom.y * chart.zoom.height),
  41579. width: (clipBox.width - (gutterX * 2)) * chart.zoom.width,
  41580. height: (clipBox.height - (gutterY * 2)) * chart.zoom.height
  41581. };
  41582. me.bbox = bbox;
  41583. },
  41584. onAnimate: function(sprite, attr) {
  41585. var me = this;
  41586. sprite.stopAnimation();
  41587. if (me.animating) {
  41588. return sprite.animate(Ext.applyIf(attr, me.chart.animate));
  41589. } else {
  41590. me.animating = true;
  41591. return sprite.animate(Ext.apply(Ext.applyIf(attr, me.chart.animate), {
  41592. listeners: {
  41593. 'afteranimate': function() {
  41594. me.animating = false;
  41595. me.fireEvent('afterrender');
  41596. }
  41597. }
  41598. }));
  41599. }
  41600. },
  41601. getGutters: function() {
  41602. return [0, 0];
  41603. },
  41604. onItemMouseOver: function(item) {
  41605. var me = this;
  41606. if (item.series === me) {
  41607. if (me.highlight) {
  41608. me.highlightItem(item);
  41609. }
  41610. if (me.tooltip) {
  41611. me.showTip(item);
  41612. }
  41613. }
  41614. },
  41615. onItemMouseOut: function(item) {
  41616. var me = this;
  41617. if (item.series === me) {
  41618. me.unHighlightItem();
  41619. if (me.tooltip) {
  41620. me.hideTip(item);
  41621. }
  41622. }
  41623. },
  41624. onMouseLeave: function() {
  41625. var me = this;
  41626. me.unHighlightItem();
  41627. if (me.tooltip) {
  41628. me.hideTip();
  41629. }
  41630. },
  41631. getItemForPoint: function(x, y) {
  41632. if (!this.items || !this.items.length || this.seriesIsHidden) {
  41633. return null;
  41634. }
  41635. var me = this,
  41636. items = me.items,
  41637. bbox = me.bbox,
  41638. item, i, ln;
  41639. if (!Ext.draw.Draw.withinBox(x, y, bbox)) {
  41640. return null;
  41641. }
  41642. for (i = 0, ln = items.length; i < ln; i++) {
  41643. if (items[i] && this.isItemInPoint(x, y, items[i], i)) {
  41644. return items[i];
  41645. }
  41646. }
  41647. return null;
  41648. },
  41649. isItemInPoint: function(x, y, item, i) {
  41650. return false;
  41651. },
  41652. hideAll: function() {
  41653. var me = this,
  41654. items = me.items,
  41655. item, len, i, j, l, sprite, shadows;
  41656. me.seriesIsHidden = true;
  41657. me._prevShowMarkers = me.showMarkers;
  41658. me.showMarkers = false;
  41659. me.hideLabels(0);
  41660. for (i = 0, len = items.length; i < len; i++) {
  41661. item = items[i];
  41662. sprite = item.sprite;
  41663. if (sprite) {
  41664. sprite.setAttributes({
  41665. hidden: true
  41666. }, true);
  41667. }
  41668. if (sprite && sprite.shadows) {
  41669. shadows = sprite.shadows;
  41670. for (j = 0, l = shadows.length; j < l; ++j) {
  41671. shadows[j].setAttributes({
  41672. hidden: true
  41673. }, true);
  41674. }
  41675. }
  41676. }
  41677. },
  41678. showAll: function() {
  41679. var me = this,
  41680. prevAnimate = me.chart.animate;
  41681. me.chart.animate = false;
  41682. me.seriesIsHidden = false;
  41683. me.showMarkers = me._prevShowMarkers;
  41684. me.drawSeries();
  41685. me.chart.animate = prevAnimate;
  41686. },
  41687. hide: function() {
  41688. if (this.items) {
  41689. var me = this,
  41690. items = me.items,
  41691. i, j, lsh, ln, shadows;
  41692. if (items && items.length) {
  41693. for (i = 0, ln = items.length; i < ln; ++i) {
  41694. if (items[i].sprite) {
  41695. items[i].sprite.hide(true);
  41696. shadows = items[i].shadows || items[i].sprite.shadows;
  41697. if (shadows) {
  41698. for (j = 0, lsh = shadows.length; j < lsh; ++j) {
  41699. shadows[j].hide(true);
  41700. }
  41701. }
  41702. }
  41703. }
  41704. me.hideLabels();
  41705. }
  41706. }
  41707. },
  41708. getLegendColor: function(index) {
  41709. var me = this, fill, stroke;
  41710. if (me.seriesStyle) {
  41711. fill = me.seriesStyle.fill;
  41712. stroke = me.seriesStyle.stroke;
  41713. if (fill && fill != 'none') {
  41714. return fill;
  41715. }
  41716. if(stroke){
  41717. return stroke;
  41718. }
  41719. }
  41720. return (me.colorArrayStyle)?me.colorArrayStyle[me.seriesIdx % me.colorArrayStyle.length]:'#000';
  41721. },
  41722. visibleInLegend: function(index){
  41723. var excludes = this.__excludes;
  41724. if (excludes) {
  41725. return !excludes[index];
  41726. }
  41727. return !this.seriesIsHidden;
  41728. },
  41729. setTitle: function(index, title) {
  41730. var me = this,
  41731. oldTitle = me.title;
  41732. if (Ext.isString(index)) {
  41733. title = index;
  41734. index = 0;
  41735. }
  41736. if (Ext.isArray(oldTitle)) {
  41737. oldTitle[index] = title;
  41738. } else {
  41739. me.title = title;
  41740. }
  41741. me.fireEvent('titlechange', title, index);
  41742. }
  41743. });
  41744. Ext.define('Ext.chart.series.Cartesian', {
  41745. extend: 'Ext.chart.series.Series',
  41746. alternateClassName: ['Ext.chart.CartesianSeries', 'Ext.chart.CartesianChart'],
  41747. xField: null,
  41748. yField: null,
  41749. axis: 'left',
  41750. getLegendLabels: function() {
  41751. var me = this,
  41752. labels = [],
  41753. fields, i, ln,
  41754. combinations = me.combinations,
  41755. title,
  41756. combo, label0, label1;
  41757. fields = [].concat(me.yField);
  41758. for (i = 0, ln = fields.length; i < ln; i++) {
  41759. title = me.title;
  41760. labels.push((Ext.isArray(title) ? title[i] : title) || fields[i]);
  41761. }
  41762. if (combinations) {
  41763. combinations = Ext.Array.from(combinations);
  41764. for (i = 0, ln = combinations.length; i < ln; i++) {
  41765. combo = combinations[i];
  41766. label0 = labels[combo[0]];
  41767. label1 = labels[combo[1]];
  41768. labels[combo[1]] = label0 + ' & ' + label1;
  41769. labels.splice(combo[0], 1);
  41770. }
  41771. }
  41772. return labels;
  41773. },
  41774. eachYValue: function(record, fn, scope) {
  41775. var me = this,
  41776. yValueAccessors = me.getYValueAccessors(),
  41777. i, ln, accessor;
  41778. for (i = 0, ln = yValueAccessors.length; i < ln; i++) {
  41779. accessor = yValueAccessors[i];
  41780. fn.call(scope, accessor(record), i);
  41781. }
  41782. },
  41783. getYValueCount: function() {
  41784. return this.getYValueAccessors().length;
  41785. },
  41786. combine: function(index1, index2) {
  41787. var me = this,
  41788. accessors = me.getYValueAccessors(),
  41789. accessor1 = accessors[index1],
  41790. accessor2 = accessors[index2];
  41791. accessors[index2] = function(record) {
  41792. return accessor1(record) + accessor2(record);
  41793. };
  41794. accessors.splice(index1, 1);
  41795. me.callParent([index1, index2]);
  41796. },
  41797. clearCombinations: function() {
  41798. delete this.yValueAccessors;
  41799. this.callParent();
  41800. },
  41801. getYValueAccessors: function() {
  41802. var me = this,
  41803. accessors = me.yValueAccessors,
  41804. yFields, yField, i, ln;
  41805. if (!accessors) {
  41806. accessors = me.yValueAccessors = [];
  41807. yFields = [].concat(me.yField);
  41808. for (i = 0, ln = yFields.length; i < ln; i++) {
  41809. yField = yFields[i];
  41810. accessors.push(function(record) {
  41811. return record.get(yField);
  41812. });
  41813. }
  41814. }
  41815. return accessors;
  41816. },
  41817. getMinMaxXValues: function() {
  41818. var me = this,
  41819. chart = me.chart,
  41820. store = chart.getChartStore(),
  41821. data = store.data.items,
  41822. i, ln, record,
  41823. min, max,
  41824. xField = me.xField,
  41825. xValue;
  41826. if (me.getRecordCount() > 0) {
  41827. min = Infinity;
  41828. max = -min;
  41829. for (i = 0, ln = data.length; i < ln; i++) {
  41830. record = data[i];
  41831. xValue = record.get(xField);
  41832. if (xValue > max) {
  41833. max = xValue;
  41834. }
  41835. if (xValue < min) {
  41836. min = xValue;
  41837. }
  41838. }
  41839. } else {
  41840. min = max = 0;
  41841. }
  41842. return [min, max];
  41843. },
  41844. getMinMaxYValues: function() {
  41845. var me = this,
  41846. chart = me.chart,
  41847. store = chart.getChartStore(),
  41848. data = store.data.items,
  41849. i, ln, record,
  41850. stacked = me.stacked,
  41851. min, max,
  41852. positiveTotal, negativeTotal;
  41853. function eachYValueStacked(yValue, i) {
  41854. if (!me.isExcluded(i)) {
  41855. if (yValue < 0) {
  41856. negativeTotal += yValue;
  41857. } else {
  41858. positiveTotal += yValue;
  41859. }
  41860. }
  41861. }
  41862. function eachYValue(yValue, i) {
  41863. if (!me.isExcluded(i)) {
  41864. if (yValue > max) {
  41865. max = yValue;
  41866. }
  41867. if (yValue < min) {
  41868. min = yValue;
  41869. }
  41870. }
  41871. }
  41872. if (me.getRecordCount() > 0) {
  41873. min = Infinity;
  41874. max = -min;
  41875. for (i = 0, ln = data.length; i < ln; i++) {
  41876. record = data[i];
  41877. if (stacked) {
  41878. positiveTotal = 0;
  41879. negativeTotal = 0;
  41880. me.eachYValue(record, eachYValueStacked);
  41881. if (positiveTotal > max) {
  41882. max = positiveTotal;
  41883. }
  41884. if (negativeTotal < min) {
  41885. min = negativeTotal;
  41886. }
  41887. } else {
  41888. me.eachYValue(record, eachYValue);
  41889. }
  41890. }
  41891. } else {
  41892. min = max = 0;
  41893. }
  41894. return [min, max];
  41895. },
  41896. getAxesForXAndYFields: function() {
  41897. var me = this,
  41898. axes = me.chart.axes,
  41899. axis = [].concat(me.axis),
  41900. yFields = {}, yFieldList = [].concat(me.yField),
  41901. xFields = {}, xFieldList = [].concat(me.xField),
  41902. fields, xAxis, yAxis, i, ln, flipXY;
  41903. flipXY = me.type === 'bar' && me.column === false;
  41904. if(flipXY) {
  41905. fields = yFieldList;
  41906. yFieldList = xFieldList;
  41907. xFieldList = fields;
  41908. }
  41909. if (Ext.Array.indexOf(axis, 'top') > -1) {
  41910. xAxis = 'top';
  41911. } else if (Ext.Array.indexOf(axis, 'bottom') > -1) {
  41912. xAxis = 'bottom';
  41913. } else {
  41914. if (axes.get('top') && axes.get('bottom')) {
  41915. for (i = 0, ln = xFieldList.length; i < ln; i++) {
  41916. xFields[xFieldList[i]] = true;
  41917. }
  41918. fields = [].concat(axes.get('bottom').fields);
  41919. for (i = 0, ln = fields.length; i < ln; i++) {
  41920. if (xFields[fields[i]]) {
  41921. xAxis = 'bottom';
  41922. break
  41923. }
  41924. }
  41925. fields = [].concat(axes.get('top').fields);
  41926. for (i = 0, ln = fields.length; i < ln; i++) {
  41927. if (xFields[fields[i]]) {
  41928. xAxis = 'top';
  41929. break
  41930. }
  41931. }
  41932. } else if (axes.get('top')) {
  41933. xAxis = 'top';
  41934. } else if (axes.get('bottom')) {
  41935. xAxis = 'bottom';
  41936. }
  41937. }
  41938. if (Ext.Array.indexOf(axis, 'left') > -1) {
  41939. yAxis = 'left';
  41940. } else if (Ext.Array.indexOf(axis, 'right') > -1) {
  41941. yAxis = 'right';
  41942. } else {
  41943. if (axes.get('left') && axes.get('right')) {
  41944. for (i = 0, ln = yFieldList.length; i < ln; i++) {
  41945. yFields[yFieldList[i]] = true;
  41946. }
  41947. fields = [].concat(axes.get('right').fields);
  41948. for (i = 0, ln = fields.length; i < ln; i++) {
  41949. if (yFields[fields[i]]) {
  41950. break
  41951. }
  41952. }
  41953. fields = [].concat(axes.get('left').fields);
  41954. for (i = 0, ln = fields.length; i < ln; i++) {
  41955. if (yFields[fields[i]]) {
  41956. yAxis = 'left';
  41957. break
  41958. }
  41959. }
  41960. } else if (axes.get('left')) {
  41961. yAxis = 'left';
  41962. } else if (axes.get('right')) {
  41963. yAxis = 'right';
  41964. }
  41965. }
  41966. return flipXY ? {
  41967. xAxis: yAxis,
  41968. yAxis: xAxis
  41969. }: {
  41970. xAxis: xAxis,
  41971. yAxis: yAxis
  41972. };
  41973. }
  41974. });
  41975. Ext.define('Ext.chart.series.Area', {
  41976. extend: 'Ext.chart.series.Cartesian',
  41977. alias: 'series.area',
  41978. requires: ['Ext.chart.axis.Axis', 'Ext.draw.Color', 'Ext.fx.Anim'],
  41979. type: 'area',
  41980. stacked: true,
  41981. style: {},
  41982. constructor: function(config) {
  41983. this.callParent(arguments);
  41984. var me = this,
  41985. surface = me.chart.surface,
  41986. i, l;
  41987. config.highlightCfg = Ext.Object.merge({}, {
  41988. lineWidth: 3,
  41989. stroke: '#55c',
  41990. opacity: 0.8,
  41991. color: '#f00'
  41992. }, config.highlightCfg);
  41993. Ext.apply(me, config, {
  41994. __excludes: []
  41995. });
  41996. if (me.highlight) {
  41997. me.highlightSprite = surface.add({
  41998. type: 'path',
  41999. path: ['M', 0, 0],
  42000. zIndex: 1000,
  42001. opacity: 0.3,
  42002. lineWidth: 5,
  42003. hidden: true,
  42004. stroke: '#444'
  42005. });
  42006. }
  42007. me.group = surface.getGroup(me.seriesId);
  42008. },
  42009. shrink: function(xValues, yValues, size) {
  42010. var len = xValues.length,
  42011. ratio = Math.floor(len / size),
  42012. i, j,
  42013. xSum = 0,
  42014. yCompLen = this.areas.length,
  42015. ySum = [],
  42016. xRes = [],
  42017. yRes = [];
  42018. for (j = 0; j < yCompLen; ++j) {
  42019. ySum[j] = 0;
  42020. }
  42021. for (i = 0; i < len; ++i) {
  42022. xSum += +xValues[i];
  42023. for (j = 0; j < yCompLen; ++j) {
  42024. ySum[j] += +yValues[i][j];
  42025. }
  42026. if (i % ratio == 0) {
  42027. xRes.push(xSum/ratio);
  42028. for (j = 0; j < yCompLen; ++j) {
  42029. ySum[j] /= ratio;
  42030. }
  42031. yRes.push(ySum);
  42032. xSum = 0;
  42033. for (j = 0, ySum = []; j < yCompLen; ++j) {
  42034. ySum[j] = 0;
  42035. }
  42036. }
  42037. }
  42038. return {
  42039. x: xRes,
  42040. y: yRes
  42041. };
  42042. },
  42043. getBounds: function() {
  42044. var me = this,
  42045. chart = me.chart,
  42046. store = chart.getChartStore(),
  42047. data = store.data.items,
  42048. i, l, record,
  42049. areas = [].concat(me.yField),
  42050. areasLen = areas.length,
  42051. xValues = [],
  42052. yValues = [],
  42053. infinity = Infinity,
  42054. minX = infinity,
  42055. minY = infinity,
  42056. maxX = -infinity,
  42057. maxY = -infinity,
  42058. math = Math,
  42059. mmin = math.min,
  42060. mmax = math.max,
  42061. boundAxis = me.getAxesForXAndYFields(),
  42062. boundXAxis = boundAxis.xAxis,
  42063. boundYAxis = boundAxis.yAxis,
  42064. ends, allowDate,
  42065. bbox, xScale, yScale, xValue, yValue, areaIndex, acumY, ln, sumValues, clipBox, areaElem, axis, out;
  42066. me.setBBox();
  42067. bbox = me.bbox;
  42068. if (axis = chart.axes.get(boundXAxis)) {
  42069. if (axis.type === 'Time') {
  42070. allowDate = true;
  42071. }
  42072. ends = axis.applyData();
  42073. minX = ends.from;
  42074. maxX = ends.to;
  42075. }
  42076. if (axis = chart.axes.get(boundYAxis)) {
  42077. ends = axis.applyData();
  42078. minY = ends.from;
  42079. maxY = ends.to;
  42080. }
  42081. if (me.xField && !Ext.isNumber(minX)) {
  42082. axis = me.getMinMaxXValues();
  42083. allowDate = true;
  42084. minX = axis[0];
  42085. maxX = axis[1];
  42086. }
  42087. if (me.yField && !Ext.isNumber(minY)) {
  42088. axis = me.getMinMaxYValues();
  42089. minY = axis[0];
  42090. maxY = axis[1];
  42091. }
  42092. if (!Ext.isNumber(minY)) {
  42093. minY = 0;
  42094. }
  42095. if (!Ext.isNumber(maxY)) {
  42096. maxY = 0;
  42097. }
  42098. for (i = 0, l = data.length; i < l; i++) {
  42099. record = data[i];
  42100. xValue = record.get(me.xField);
  42101. yValue = [];
  42102. if (typeof xValue != 'number') {
  42103. if (allowDate) {
  42104. xValue = +xValue;
  42105. } else {
  42106. xValue = i;
  42107. }
  42108. }
  42109. xValues.push(xValue);
  42110. acumY = 0;
  42111. for (areaIndex = 0; areaIndex < areasLen; areaIndex++) {
  42112. if (me.__excludes[areaIndex]) {
  42113. continue;
  42114. }
  42115. areaElem = record.get(areas[areaIndex]);
  42116. if (typeof areaElem == 'number') {
  42117. yValue.push(areaElem);
  42118. }
  42119. }
  42120. yValues.push(yValue);
  42121. }
  42122. xScale = bbox.width / ((maxX - minX) || 1);
  42123. yScale = bbox.height / ((maxY - minY) || 1);
  42124. ln = xValues.length;
  42125. if ((ln > bbox.width) && me.areas) {
  42126. sumValues = me.shrink(xValues, yValues, bbox.width);
  42127. xValues = sumValues.x;
  42128. yValues = sumValues.y;
  42129. }
  42130. return {
  42131. bbox: bbox,
  42132. minX: minX,
  42133. minY: minY,
  42134. xValues: xValues,
  42135. yValues: yValues,
  42136. xScale: xScale,
  42137. yScale: yScale,
  42138. areasLen: areasLen
  42139. };
  42140. },
  42141. getPaths: function() {
  42142. var me = this,
  42143. chart = me.chart,
  42144. store = chart.getChartStore(),
  42145. first = true,
  42146. bounds = me.getBounds(),
  42147. bbox = bounds.bbox,
  42148. items = me.items = [],
  42149. componentPaths = [],
  42150. componentPath,
  42151. count = 0,
  42152. paths = [],
  42153. i, ln, x, y, xValue, yValue, acumY, areaIndex, prevAreaIndex, areaElem, path;
  42154. ln = bounds.xValues.length;
  42155. for (i = 0; i < ln; i++) {
  42156. xValue = bounds.xValues[i];
  42157. yValue = bounds.yValues[i];
  42158. x = bbox.x + (xValue - bounds.minX) * bounds.xScale;
  42159. acumY = 0;
  42160. count = 0;
  42161. for (areaIndex = 0; areaIndex < bounds.areasLen; areaIndex++) {
  42162. if (me.__excludes[areaIndex]) {
  42163. continue;
  42164. }
  42165. if (!componentPaths[areaIndex]) {
  42166. componentPaths[areaIndex] = [];
  42167. }
  42168. areaElem = yValue[count];
  42169. acumY += areaElem;
  42170. y = bbox.y + bbox.height - (acumY - bounds.minY) * bounds.yScale;
  42171. if (!paths[areaIndex]) {
  42172. paths[areaIndex] = ['M', x, y];
  42173. componentPaths[areaIndex].push(['L', x, y]);
  42174. } else {
  42175. paths[areaIndex].push('L', x, y);
  42176. componentPaths[areaIndex].push(['L', x, y]);
  42177. }
  42178. if (!items[areaIndex]) {
  42179. items[areaIndex] = {
  42180. pointsUp: [],
  42181. pointsDown: [],
  42182. series: me
  42183. };
  42184. }
  42185. items[areaIndex].pointsUp.push([x, y]);
  42186. count++;
  42187. }
  42188. }
  42189. for (areaIndex = 0; areaIndex < bounds.areasLen; areaIndex++) {
  42190. if (me.__excludes[areaIndex]) {
  42191. continue;
  42192. }
  42193. path = paths[areaIndex];
  42194. if (areaIndex == 0 || first) {
  42195. first = false;
  42196. path.push('L', x, bbox.y + bbox.height,
  42197. 'L', bbox.x, bbox.y + bbox.height,
  42198. 'Z');
  42199. }
  42200. else {
  42201. componentPath = componentPaths[prevAreaIndex];
  42202. componentPath.reverse();
  42203. path.push('L', x, componentPath[0][2]);
  42204. for (i = 0; i < ln; i++) {
  42205. path.push(componentPath[i][0],
  42206. componentPath[i][1],
  42207. componentPath[i][2]);
  42208. items[areaIndex].pointsDown[ln -i -1] = [componentPath[i][1], componentPath[i][2]];
  42209. }
  42210. path.push('L', bbox.x, path[2], 'Z');
  42211. }
  42212. prevAreaIndex = areaIndex;
  42213. }
  42214. return {
  42215. paths: paths,
  42216. areasLen: bounds.areasLen
  42217. };
  42218. },
  42219. drawSeries: function() {
  42220. var me = this,
  42221. chart = me.chart,
  42222. store = chart.getChartStore(),
  42223. surface = chart.surface,
  42224. animate = chart.animate,
  42225. group = me.group,
  42226. endLineStyle = Ext.apply(me.seriesStyle, me.style),
  42227. colorArrayStyle = me.colorArrayStyle,
  42228. colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
  42229. areaIndex, areaElem, paths, path, rendererAttributes;
  42230. me.unHighlightItem();
  42231. me.cleanHighlights();
  42232. if (!store || !store.getCount() || me.seriesIsHidden) {
  42233. me.hide();
  42234. me.items = [];
  42235. return;
  42236. }
  42237. paths = me.getPaths();
  42238. if (!me.areas) {
  42239. me.areas = [];
  42240. }
  42241. for (areaIndex = 0; areaIndex < paths.areasLen; areaIndex++) {
  42242. if (me.__excludes[areaIndex]) {
  42243. continue;
  42244. }
  42245. if (!me.areas[areaIndex]) {
  42246. me.items[areaIndex].sprite = me.areas[areaIndex] = surface.add(Ext.apply({}, {
  42247. type: 'path',
  42248. group: group,
  42249. path: paths.paths[areaIndex],
  42250. stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength],
  42251. fill: colorArrayStyle[areaIndex % colorArrayLength]
  42252. }, endLineStyle || {}));
  42253. }
  42254. areaElem = me.areas[areaIndex];
  42255. path = paths.paths[areaIndex];
  42256. if (animate) {
  42257. rendererAttributes = me.renderer(areaElem, false, {
  42258. path: path,
  42259. fill: colorArrayStyle[areaIndex % colorArrayLength],
  42260. stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength]
  42261. }, areaIndex, store);
  42262. me.animation = me.onAnimate(areaElem, {
  42263. to: rendererAttributes
  42264. });
  42265. } else {
  42266. rendererAttributes = me.renderer(areaElem, false, {
  42267. path: path,
  42268. hidden: false,
  42269. fill: colorArrayStyle[areaIndex % colorArrayLength],
  42270. stroke: endLineStyle.stroke || colorArrayStyle[areaIndex % colorArrayLength]
  42271. }, areaIndex, store);
  42272. me.areas[areaIndex].setAttributes(rendererAttributes, true);
  42273. }
  42274. }
  42275. me.renderLabels();
  42276. me.renderCallouts();
  42277. },
  42278. onAnimate: function(sprite, attr) {
  42279. sprite.show();
  42280. return this.callParent(arguments);
  42281. },
  42282. onCreateLabel: function(storeItem, item, i, display) {
  42283. var me = this,
  42284. group = me.labelsGroup,
  42285. config = me.label,
  42286. bbox = me.bbox,
  42287. endLabelStyle = Ext.apply(config, me.seriesLabelStyle);
  42288. return me.chart.surface.add(Ext.apply({
  42289. 'type': 'text',
  42290. 'text-anchor': 'middle',
  42291. 'group': group,
  42292. 'x': item.point[0],
  42293. 'y': bbox.y + bbox.height / 2
  42294. }, endLabelStyle || {}));
  42295. },
  42296. onPlaceLabel: function(label, storeItem, item, i, display, animate, index) {
  42297. var me = this,
  42298. chart = me.chart,
  42299. resizing = chart.resizing,
  42300. config = me.label,
  42301. format = config.renderer,
  42302. field = config.field,
  42303. bbox = me.bbox,
  42304. x = item.point[0],
  42305. y = item.point[1],
  42306. bb, width, height;
  42307. label.setAttributes({
  42308. text: format(storeItem.get(field[index])),
  42309. hidden: true
  42310. }, true);
  42311. bb = label.getBBox();
  42312. width = bb.width / 2;
  42313. height = bb.height / 2;
  42314. x = x - width < bbox.x? bbox.x + width : x;
  42315. x = (x + width > bbox.x + bbox.width) ? (x - (x + width - bbox.x - bbox.width)) : x;
  42316. y = y - height < bbox.y? bbox.y + height : y;
  42317. y = (y + height > bbox.y + bbox.height) ? (y - (y + height - bbox.y - bbox.height)) : y;
  42318. if (me.chart.animate && !me.chart.resizing) {
  42319. label.show(true);
  42320. me.onAnimate(label, {
  42321. to: {
  42322. x: x,
  42323. y: y
  42324. }
  42325. });
  42326. } else {
  42327. label.setAttributes({
  42328. x: x,
  42329. y: y
  42330. }, true);
  42331. if (resizing) {
  42332. me.animation.on('afteranimate', function() {
  42333. label.show(true);
  42334. });
  42335. } else {
  42336. label.show(true);
  42337. }
  42338. }
  42339. },
  42340. onPlaceCallout : function(callout, storeItem, item, i, display, animate, index) {
  42341. var me = this,
  42342. chart = me.chart,
  42343. surface = chart.surface,
  42344. resizing = chart.resizing,
  42345. config = me.callouts,
  42346. items = me.items,
  42347. prev = (i == 0) ? false : items[i -1].point,
  42348. next = (i == items.length -1) ? false : items[i +1].point,
  42349. cur = item.point,
  42350. dir, norm, normal, a, aprev, anext,
  42351. bbox = callout.label.getBBox(),
  42352. offsetFromViz = 30,
  42353. offsetToSide = 10,
  42354. offsetBox = 3,
  42355. boxx, boxy, boxw, boxh,
  42356. p, clipRect = me.clipRect,
  42357. x, y;
  42358. if (!prev) {
  42359. prev = cur;
  42360. }
  42361. if (!next) {
  42362. next = cur;
  42363. }
  42364. a = (next[1] - prev[1]) / (next[0] - prev[0]);
  42365. aprev = (cur[1] - prev[1]) / (cur[0] - prev[0]);
  42366. anext = (next[1] - cur[1]) / (next[0] - cur[0]);
  42367. norm = Math.sqrt(1 + a * a);
  42368. dir = [1 / norm, a / norm];
  42369. normal = [-dir[1], dir[0]];
  42370. if (aprev > 0 && anext < 0 && normal[1] < 0 || aprev < 0 && anext > 0 && normal[1] > 0) {
  42371. normal[0] *= -1;
  42372. normal[1] *= -1;
  42373. } else if (Math.abs(aprev) < Math.abs(anext) && normal[0] < 0 || Math.abs(aprev) > Math.abs(anext) && normal[0] > 0) {
  42374. normal[0] *= -1;
  42375. normal[1] *= -1;
  42376. }
  42377. x = cur[0] + normal[0] * offsetFromViz;
  42378. y = cur[1] + normal[1] * offsetFromViz;
  42379. boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
  42380. boxy = y - bbox.height /2 - offsetBox;
  42381. boxw = bbox.width + 2 * offsetBox;
  42382. boxh = bbox.height + 2 * offsetBox;
  42383. if (boxx < clipRect[0] || (boxx + boxw) > (clipRect[0] + clipRect[2])) {
  42384. normal[0] *= -1;
  42385. }
  42386. if (boxy < clipRect[1] || (boxy + boxh) > (clipRect[1] + clipRect[3])) {
  42387. normal[1] *= -1;
  42388. }
  42389. x = cur[0] + normal[0] * offsetFromViz;
  42390. y = cur[1] + normal[1] * offsetFromViz;
  42391. boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
  42392. boxy = y - bbox.height /2 - offsetBox;
  42393. boxw = bbox.width + 2 * offsetBox;
  42394. boxh = bbox.height + 2 * offsetBox;
  42395. callout.lines.setAttributes({
  42396. path: ["M", cur[0], cur[1], "L", x, y, "Z"]
  42397. }, true);
  42398. callout.box.setAttributes({
  42399. x: boxx,
  42400. y: boxy,
  42401. width: boxw,
  42402. height: boxh
  42403. }, true);
  42404. callout.label.setAttributes({
  42405. x: x + (normal[0] > 0? offsetBox : -(bbox.width + offsetBox)),
  42406. y: y
  42407. }, true);
  42408. for (p in callout) {
  42409. callout[p].show(true);
  42410. }
  42411. },
  42412. isItemInPoint: function(x, y, item, i) {
  42413. var me = this,
  42414. pointsUp = item.pointsUp,
  42415. pointsDown = item.pointsDown,
  42416. abs = Math.abs,
  42417. distChanged = false,
  42418. last = false,
  42419. dist = Infinity, p, pln, point;
  42420. for (p = 0, pln = pointsUp.length; p < pln; p++) {
  42421. point = [pointsUp[p][0], pointsUp[p][1]];
  42422. distChanged = false;
  42423. last = p == pln -1;
  42424. if (dist > abs(x - point[0])) {
  42425. dist = abs(x - point[0]);
  42426. distChanged = true;
  42427. if (last) {
  42428. ++p;
  42429. }
  42430. }
  42431. if (!distChanged || (distChanged && last)) {
  42432. point = pointsUp[p -1];
  42433. if (y >= point[1] && (!pointsDown.length || y <= (pointsDown[p -1][1]))) {
  42434. item.storeIndex = p -1;
  42435. item.storeField = me.yField[i];
  42436. item.storeItem = me.chart.store.getAt(p -1);
  42437. item._points = pointsDown.length? [point, pointsDown[p -1]] : [point];
  42438. return true;
  42439. } else {
  42440. break;
  42441. }
  42442. }
  42443. }
  42444. return false;
  42445. },
  42446. highlightSeries: function() {
  42447. var area, to, fillColor;
  42448. if (this._index !== undefined) {
  42449. area = this.areas[this._index];
  42450. if (area.__highlightAnim) {
  42451. area.__highlightAnim.paused = true;
  42452. }
  42453. area.__highlighted = true;
  42454. area.__prevOpacity = area.__prevOpacity || area.attr.opacity || 1;
  42455. area.__prevFill = area.__prevFill || area.attr.fill;
  42456. area.__prevLineWidth = area.__prevLineWidth || area.attr.lineWidth;
  42457. fillColor = Ext.draw.Color.fromString(area.__prevFill);
  42458. to = {
  42459. lineWidth: (area.__prevLineWidth || 0) + 2
  42460. };
  42461. if (fillColor) {
  42462. to.fill = fillColor.getLighter(0.2).toString();
  42463. }
  42464. else {
  42465. to.opacity = Math.max(area.__prevOpacity - 0.3, 0);
  42466. }
  42467. if (this.chart.animate) {
  42468. area.__highlightAnim = new Ext.fx.Anim(Ext.apply({
  42469. target: area,
  42470. to: to
  42471. }, this.chart.animate));
  42472. }
  42473. else {
  42474. area.setAttributes(to, true);
  42475. }
  42476. }
  42477. },
  42478. unHighlightSeries: function() {
  42479. var area;
  42480. if (this._index !== undefined) {
  42481. area = this.areas[this._index];
  42482. if (area.__highlightAnim) {
  42483. area.__highlightAnim.paused = true;
  42484. }
  42485. if (area.__highlighted) {
  42486. area.__highlighted = false;
  42487. area.__highlightAnim = new Ext.fx.Anim({
  42488. target: area,
  42489. to: {
  42490. fill: area.__prevFill,
  42491. opacity: area.__prevOpacity,
  42492. lineWidth: area.__prevLineWidth
  42493. }
  42494. });
  42495. }
  42496. }
  42497. },
  42498. highlightItem: function(item) {
  42499. var me = this,
  42500. points, path;
  42501. if (!item) {
  42502. this.highlightSeries();
  42503. return;
  42504. }
  42505. points = item._points;
  42506. path = points.length == 2? ['M', points[0][0], points[0][1], 'L', points[1][0], points[1][1]]
  42507. : ['M', points[0][0], points[0][1], 'L', points[0][0], me.bbox.y + me.bbox.height];
  42508. me.highlightSprite.setAttributes({
  42509. path: path,
  42510. hidden: false
  42511. }, true);
  42512. },
  42513. unHighlightItem: function(item) {
  42514. if (!item) {
  42515. this.unHighlightSeries();
  42516. }
  42517. if (this.highlightSprite) {
  42518. this.highlightSprite.hide(true);
  42519. }
  42520. },
  42521. hideAll: function(index) {
  42522. var me = this;
  42523. index = (isNaN(me._index) ? index : me._index) || 0;
  42524. me.__excludes[index] = true;
  42525. me.areas[index].hide(true);
  42526. me.redraw();
  42527. },
  42528. showAll: function(index) {
  42529. var me = this;
  42530. index = (isNaN(me._index) ? index : me._index) || 0;
  42531. me.__excludes[index] = false;
  42532. me.areas[index].show(true);
  42533. me.redraw();
  42534. },
  42535. redraw: function() {
  42536. var me = this,
  42537. prevLegendConfig;
  42538. prevLegendConfig = me.chart.legend.rebuild;
  42539. me.chart.legend.rebuild = false;
  42540. me.chart.redraw();
  42541. me.chart.legend.rebuild = prevLegendConfig;
  42542. },
  42543. hide: function() {
  42544. if (this.areas) {
  42545. var me = this,
  42546. areas = me.areas,
  42547. i, j, l, ln, shadows;
  42548. if (areas && areas.length) {
  42549. for (i = 0, ln = areas.length; i < ln; ++i) {
  42550. if (areas[i]) {
  42551. areas[i].hide(true);
  42552. }
  42553. }
  42554. me.hideLabels();
  42555. }
  42556. }
  42557. },
  42558. getLegendColor: function(index) {
  42559. var me = this;
  42560. return me.colorArrayStyle[index % me.colorArrayStyle.length];
  42561. }
  42562. });
  42563. Ext.define('Ext.chart.series.Bar', {
  42564. extend: 'Ext.chart.series.Cartesian',
  42565. alternateClassName: ['Ext.chart.BarSeries', 'Ext.chart.BarChart', 'Ext.chart.StackedBarChart'],
  42566. requires: ['Ext.chart.axis.Axis', 'Ext.fx.Anim'],
  42567. type: 'bar',
  42568. alias: 'series.bar',
  42569. column: false,
  42570. style: {},
  42571. gutter: 38.2,
  42572. groupGutter: 38.2,
  42573. xPadding: 0,
  42574. yPadding: 10,
  42575. constructor: function(config) {
  42576. this.callParent(arguments);
  42577. var me = this,
  42578. surface = me.chart.surface,
  42579. shadow = me.chart.shadow,
  42580. i, l;
  42581. config.highlightCfg = Ext.Object.merge({
  42582. lineWidth: 3,
  42583. stroke: '#55c',
  42584. opacity: 0.8,
  42585. color: '#f00'
  42586. }, config.highlightCfg);
  42587. Ext.apply(me, config, {
  42588. shadowAttributes: [{
  42589. "stroke-width": 6,
  42590. "stroke-opacity": 0.05,
  42591. stroke: 'rgb(200, 200, 200)',
  42592. translate: {
  42593. x: 1.2,
  42594. y: 1.2
  42595. }
  42596. }, {
  42597. "stroke-width": 4,
  42598. "stroke-opacity": 0.1,
  42599. stroke: 'rgb(150, 150, 150)',
  42600. translate: {
  42601. x: 0.9,
  42602. y: 0.9
  42603. }
  42604. }, {
  42605. "stroke-width": 2,
  42606. "stroke-opacity": 0.15,
  42607. stroke: 'rgb(100, 100, 100)',
  42608. translate: {
  42609. x: 0.6,
  42610. y: 0.6
  42611. }
  42612. }]
  42613. });
  42614. me.group = surface.getGroup(me.seriesId + '-bars');
  42615. if (shadow) {
  42616. for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
  42617. me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
  42618. }
  42619. }
  42620. },
  42621. getBarGirth: function() {
  42622. var me = this,
  42623. store = me.chart.getChartStore(),
  42624. column = me.column,
  42625. ln = store.getCount(),
  42626. gutter = me.gutter / 100;
  42627. return (me.chart.chartBBox[column ? 'width' : 'height'] - me[column ? 'xPadding' : 'yPadding'] * 2) / (ln * (gutter + 1) - gutter);
  42628. },
  42629. getGutters: function() {
  42630. var me = this,
  42631. column = me.column,
  42632. gutter = Math.ceil(me[column ? 'xPadding' : 'yPadding'] + me.getBarGirth() / 2);
  42633. return me.column ? [gutter, 0] : [0, gutter];
  42634. },
  42635. getBounds: function() {
  42636. var me = this,
  42637. chart = me.chart,
  42638. store = chart.getChartStore(),
  42639. data = store.data.items,
  42640. i, ln, record,
  42641. bars = [].concat(me.yField),
  42642. barsLen = bars.length,
  42643. groupBarsLen = barsLen,
  42644. groupGutter = me.groupGutter / 100,
  42645. column = me.column,
  42646. xPadding = me.xPadding,
  42647. yPadding = me.yPadding,
  42648. stacked = me.stacked,
  42649. barWidth = me.getBarGirth(),
  42650. barWidthProperty = column ? 'width' : 'height',
  42651. math = Math,
  42652. mmin = math.min,
  42653. mmax = math.max,
  42654. mabs = math.abs,
  42655. boundAxes = me.getAxesForXAndYFields(),
  42656. boundYAxis = boundAxes.yAxis,
  42657. ends, shrunkBarWidth, groupBarWidth, bbox, minY, maxY, axis, out,
  42658. scale, zero, total, rec, j, plus, minus;
  42659. me.setBBox(true);
  42660. bbox = me.bbox;
  42661. if (me.__excludes) {
  42662. for (j = 0, total = me.__excludes.length; j < total; j++) {
  42663. if (me.__excludes[j]) {
  42664. groupBarsLen--;
  42665. }
  42666. }
  42667. }
  42668. axis = chart.axes.get(boundYAxis);
  42669. if (axis) {
  42670. ends = axis.applyData();
  42671. minY = ends.from;
  42672. maxY = ends.to;
  42673. }
  42674. if (me.yField && !Ext.isNumber(minY)) {
  42675. out = me.getMinMaxYValues();
  42676. minY = out[0];
  42677. maxY = out[1];
  42678. }
  42679. if (!Ext.isNumber(minY)) {
  42680. minY = 0;
  42681. }
  42682. if (!Ext.isNumber(maxY)) {
  42683. maxY = 0;
  42684. }
  42685. scale = (column ? bbox.height - yPadding * 2 : bbox.width - xPadding * 2) / (maxY - minY);
  42686. shrunkBarWidth = barWidth;
  42687. groupBarWidth = (barWidth / ((stacked ? 1 : groupBarsLen) * (groupGutter + 1) - groupGutter));
  42688. if (barWidthProperty in me.style) {
  42689. groupBarWidth = mmin(groupBarWidth, me.style[barWidthProperty]);
  42690. shrunkBarWidth = groupBarWidth * ((stacked ? 1 : groupBarsLen) * (groupGutter + 1) - groupGutter);
  42691. }
  42692. zero = (column) ? bbox.y + bbox.height - yPadding : bbox.x + xPadding;
  42693. if (stacked) {
  42694. total = [[], []];
  42695. for (i = 0, ln = data.length; i < ln; i++) {
  42696. record = data[i];
  42697. total[0][i] = total[0][i] || 0;
  42698. total[1][i] = total[1][i] || 0;
  42699. for (j = 0; j < barsLen; j++) {
  42700. if (me.__excludes && me.__excludes[j]) {
  42701. continue;
  42702. }
  42703. rec = record.get(bars[j]);
  42704. total[+(rec > 0)][i] += mabs(rec);
  42705. }
  42706. }
  42707. total[+(maxY > 0)].push(mabs(maxY));
  42708. total[+(minY > 0)].push(mabs(minY));
  42709. minus = mmax.apply(math, total[0]);
  42710. plus = mmax.apply(math, total[1]);
  42711. scale = (column ? bbox.height - yPadding * 2 : bbox.width - xPadding * 2) / (plus + minus);
  42712. zero = zero + minus * scale * (column ? -1 : 1);
  42713. }
  42714. else if (minY / maxY < 0) {
  42715. zero = zero - minY * scale * (column ? -1 : 1);
  42716. }
  42717. return {
  42718. bars: bars,
  42719. bbox: bbox,
  42720. shrunkBarWidth: shrunkBarWidth,
  42721. barsLen: barsLen,
  42722. groupBarsLen: groupBarsLen,
  42723. barWidth: barWidth,
  42724. groupBarWidth: groupBarWidth,
  42725. scale: scale,
  42726. zero: zero,
  42727. xPadding: xPadding,
  42728. yPadding: yPadding,
  42729. signed: minY / maxY < 0,
  42730. minY: minY,
  42731. maxY: maxY
  42732. };
  42733. },
  42734. getPaths: function() {
  42735. var me = this,
  42736. chart = me.chart,
  42737. store = chart.getChartStore(),
  42738. data = store.data.items,
  42739. i, total, record,
  42740. bounds = me.bounds = me.getBounds(),
  42741. items = me.items = [],
  42742. yFields = me.yField,
  42743. gutter = me.gutter / 100,
  42744. groupGutter = me.groupGutter / 100,
  42745. animate = chart.animate,
  42746. column = me.column,
  42747. group = me.group,
  42748. enableShadows = chart.shadow,
  42749. shadowGroups = me.shadowGroups,
  42750. shadowAttributes = me.shadowAttributes,
  42751. shadowGroupsLn = shadowGroups.length,
  42752. bbox = bounds.bbox,
  42753. barWidth = bounds.barWidth,
  42754. shrunkBarWidth = bounds.shrunkBarWidth,
  42755. xPadding = me.xPadding,
  42756. yPadding = me.yPadding,
  42757. stacked = me.stacked,
  42758. barsLen = bounds.barsLen,
  42759. colors = me.colorArrayStyle,
  42760. colorLength = colors && colors.length || 0,
  42761. math = Math,
  42762. mmax = math.max,
  42763. mmin = math.min,
  42764. mabs = math.abs,
  42765. j, yValue, height, totalDim, totalNegDim, bottom, top, hasShadow, barAttr, attrs, counter,
  42766. shadowIndex, shadow, sprite, offset, floorY;
  42767. for (i = 0, total = data.length; i < total; i++) {
  42768. record = data[i];
  42769. bottom = bounds.zero;
  42770. top = bounds.zero;
  42771. totalDim = 0;
  42772. totalNegDim = 0;
  42773. hasShadow = false;
  42774. for (j = 0, counter = 0; j < barsLen; j++) {
  42775. if (me.__excludes && me.__excludes[j]) {
  42776. continue;
  42777. }
  42778. yValue = record.get(bounds.bars[j]);
  42779. height = Math.round((yValue - mmax(bounds.minY, 0)) * bounds.scale);
  42780. barAttr = {
  42781. fill: colors[(barsLen > 1 ? j : 0) % colorLength]
  42782. };
  42783. if (column) {
  42784. Ext.apply(barAttr, {
  42785. height: height,
  42786. width: mmax(bounds.groupBarWidth, 0),
  42787. x: (bbox.x + xPadding + (barWidth - shrunkBarWidth) * 0.5 + i * barWidth * (1 + gutter) + counter * bounds.groupBarWidth * (1 + groupGutter) * !stacked),
  42788. y: bottom - height
  42789. });
  42790. }
  42791. else {
  42792. offset = (total - 1) - i;
  42793. Ext.apply(barAttr, {
  42794. height: mmax(bounds.groupBarWidth, 0),
  42795. width: height + (bottom == bounds.zero),
  42796. x: bottom + (bottom != bounds.zero),
  42797. y: (bbox.y + yPadding + (barWidth - shrunkBarWidth) * 0.5 + offset * barWidth * (1 + gutter) + counter * bounds.groupBarWidth * (1 + groupGutter) * !stacked + 1)
  42798. });
  42799. }
  42800. if (height < 0) {
  42801. if (column) {
  42802. barAttr.y = top;
  42803. barAttr.height = mabs(height);
  42804. } else {
  42805. barAttr.x = top + height;
  42806. barAttr.width = mabs(height);
  42807. }
  42808. }
  42809. if (stacked) {
  42810. if (height < 0) {
  42811. top += height * (column ? -1 : 1);
  42812. } else {
  42813. bottom += height * (column ? -1 : 1);
  42814. }
  42815. totalDim += mabs(height);
  42816. if (height < 0) {
  42817. totalNegDim += mabs(height);
  42818. }
  42819. }
  42820. barAttr.x = Math.floor(barAttr.x) + 1;
  42821. floorY = Math.floor(barAttr.y);
  42822. if (!Ext.isIE9 && barAttr.y > floorY) {
  42823. floorY--;
  42824. }
  42825. barAttr.y = floorY;
  42826. barAttr.width = Math.floor(barAttr.width);
  42827. barAttr.height = Math.floor(barAttr.height);
  42828. items.push({
  42829. series: me,
  42830. yField: yFields[j],
  42831. storeItem: record,
  42832. value: [record.get(me.xField), yValue],
  42833. attr: barAttr,
  42834. point: column ? [barAttr.x + barAttr.width / 2, yValue >= 0 ? barAttr.y : barAttr.y + barAttr.height] :
  42835. [yValue >= 0 ? barAttr.x + barAttr.width : barAttr.x, barAttr.y + barAttr.height / 2]
  42836. });
  42837. if (animate && chart.resizing) {
  42838. attrs = column ? {
  42839. x: barAttr.x,
  42840. y: bounds.zero,
  42841. width: barAttr.width,
  42842. height: 0
  42843. } : {
  42844. x: bounds.zero,
  42845. y: barAttr.y,
  42846. width: 0,
  42847. height: barAttr.height
  42848. };
  42849. if (enableShadows && (stacked && !hasShadow || !stacked)) {
  42850. hasShadow = true;
  42851. for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
  42852. shadow = shadowGroups[shadowIndex].getAt(stacked ? i : (i * barsLen + j));
  42853. if (shadow) {
  42854. shadow.setAttributes(attrs, true);
  42855. }
  42856. }
  42857. }
  42858. sprite = group.getAt(i * barsLen + j);
  42859. if (sprite) {
  42860. sprite.setAttributes(attrs, true);
  42861. }
  42862. }
  42863. counter++;
  42864. }
  42865. if (stacked && items.length) {
  42866. items[i * counter].totalDim = totalDim;
  42867. items[i * counter].totalNegDim = totalNegDim;
  42868. }
  42869. }
  42870. if (stacked && counter == 0) {
  42871. for (i = 0, total = data.length; i < total; i++) {
  42872. for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
  42873. shadow = shadowGroups[shadowIndex].getAt(i);
  42874. if (shadow) {
  42875. shadow.hide(true);
  42876. }
  42877. }
  42878. }
  42879. }
  42880. },
  42881. renderShadows: function(i, barAttr, baseAttrs, bounds) {
  42882. var me = this,
  42883. chart = me.chart,
  42884. surface = chart.surface,
  42885. animate = chart.animate,
  42886. stacked = me.stacked,
  42887. shadowGroups = me.shadowGroups,
  42888. shadowAttributes = me.shadowAttributes,
  42889. shadowGroupsLn = shadowGroups.length,
  42890. store = chart.getChartStore(),
  42891. column = me.column,
  42892. items = me.items,
  42893. shadows = [],
  42894. zero = bounds.zero,
  42895. shadowIndex, shadowBarAttr, shadow, totalDim, totalNegDim, j, rendererAttributes;
  42896. if ((stacked && (i % bounds.groupBarsLen === 0)) || !stacked) {
  42897. j = i / bounds.groupBarsLen;
  42898. for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
  42899. shadowBarAttr = Ext.apply({}, shadowAttributes[shadowIndex]);
  42900. shadow = shadowGroups[shadowIndex].getAt(stacked ? j : i);
  42901. Ext.copyTo(shadowBarAttr, barAttr, 'x,y,width,height');
  42902. if (!shadow) {
  42903. shadow = surface.add(Ext.apply({
  42904. type: 'rect',
  42905. group: shadowGroups[shadowIndex]
  42906. }, Ext.apply({}, baseAttrs, shadowBarAttr)));
  42907. }
  42908. if (stacked) {
  42909. totalDim = items[i].totalDim;
  42910. totalNegDim = items[i].totalNegDim;
  42911. if (column) {
  42912. shadowBarAttr.y = zero + totalNegDim - totalDim - 1;
  42913. shadowBarAttr.height = totalDim;
  42914. }
  42915. else {
  42916. shadowBarAttr.x = zero - totalNegDim;
  42917. shadowBarAttr.width = totalDim;
  42918. }
  42919. }
  42920. rendererAttributes = me.renderer(shadow, store.getAt(j), shadowBarAttr, i, store);
  42921. rendererAttributes.hidden = !!barAttr.hidden;
  42922. if (animate) {
  42923. me.onAnimate(shadow, { to: rendererAttributes });
  42924. }
  42925. else {
  42926. shadow.setAttributes(rendererAttributes, true);
  42927. }
  42928. shadows.push(shadow);
  42929. }
  42930. }
  42931. return shadows;
  42932. },
  42933. drawSeries: function() {
  42934. var me = this,
  42935. chart = me.chart,
  42936. store = chart.getChartStore(),
  42937. surface = chart.surface,
  42938. animate = chart.animate,
  42939. stacked = me.stacked,
  42940. column = me.column,
  42941. enableShadows = chart.shadow,
  42942. shadowGroups = me.shadowGroups,
  42943. shadowGroupsLn = shadowGroups.length,
  42944. group = me.group,
  42945. seriesStyle = me.seriesStyle,
  42946. items, ln, i, j, baseAttrs, sprite, rendererAttributes, shadowIndex, shadowGroup,
  42947. bounds, endSeriesStyle, barAttr, attrs, anim;
  42948. if (!store || !store.getCount() || me.seriesIsHidden) {
  42949. me.hide();
  42950. me.items = [];
  42951. return;
  42952. }
  42953. endSeriesStyle = Ext.apply({}, this.style, seriesStyle);
  42954. delete endSeriesStyle.fill;
  42955. delete endSeriesStyle.x;
  42956. delete endSeriesStyle.y;
  42957. delete endSeriesStyle.width;
  42958. delete endSeriesStyle.height;
  42959. me.unHighlightItem();
  42960. me.cleanHighlights();
  42961. me.getPaths();
  42962. bounds = me.bounds;
  42963. items = me.items;
  42964. baseAttrs = column ? {
  42965. y: bounds.zero,
  42966. height: 0
  42967. } : {
  42968. x: bounds.zero,
  42969. width: 0
  42970. };
  42971. ln = items.length;
  42972. for (i = 0; i < ln; i++) {
  42973. sprite = group.getAt(i);
  42974. barAttr = items[i].attr;
  42975. if (enableShadows) {
  42976. items[i].shadows = me.renderShadows(i, barAttr, baseAttrs, bounds);
  42977. }
  42978. if (!sprite) {
  42979. attrs = Ext.apply({}, baseAttrs, barAttr);
  42980. attrs = Ext.apply(attrs, endSeriesStyle || {});
  42981. sprite = surface.add(Ext.apply({}, {
  42982. type: 'rect',
  42983. group: group
  42984. }, attrs));
  42985. }
  42986. if (animate) {
  42987. rendererAttributes = me.renderer(sprite, store.getAt(i), barAttr, i, store);
  42988. sprite._to = rendererAttributes;
  42989. anim = me.onAnimate(sprite, { to: Ext.apply(rendererAttributes, endSeriesStyle) });
  42990. if (enableShadows && stacked && (i % bounds.barsLen === 0)) {
  42991. j = i / bounds.barsLen;
  42992. for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
  42993. anim.on('afteranimate', function() {
  42994. this.show(true);
  42995. }, shadowGroups[shadowIndex].getAt(j));
  42996. }
  42997. }
  42998. }
  42999. else {
  43000. rendererAttributes = me.renderer(sprite, store.getAt(i), Ext.apply(barAttr, { hidden: false }), i, store);
  43001. sprite.setAttributes(Ext.apply(rendererAttributes, endSeriesStyle), true);
  43002. }
  43003. items[i].sprite = sprite;
  43004. }
  43005. ln = group.getCount();
  43006. for (j = i; j < ln; j++) {
  43007. group.getAt(j).hide(true);
  43008. }
  43009. if (me.stacked) {
  43010. i = store.getCount();
  43011. }
  43012. if (enableShadows) {
  43013. for (shadowIndex = 0; shadowIndex < shadowGroupsLn; shadowIndex++) {
  43014. shadowGroup = shadowGroups[shadowIndex];
  43015. ln = shadowGroup.getCount();
  43016. for (j = i; j < ln; j++) {
  43017. shadowGroup.getAt(j).hide(true);
  43018. }
  43019. }
  43020. }
  43021. me.renderLabels();
  43022. },
  43023. onCreateLabel: function(storeItem, item, i, display) {
  43024. var me = this,
  43025. surface = me.chart.surface,
  43026. group = me.labelsGroup,
  43027. config = me.label,
  43028. endLabelStyle = Ext.apply({}, config, me.seriesLabelStyle || {}),
  43029. sprite;
  43030. return surface.add(Ext.apply({
  43031. type: 'text',
  43032. group: group
  43033. }, endLabelStyle || {}));
  43034. },
  43035. onPlaceLabel: function(label, storeItem, item, i, display, animate, j, index) {
  43036. var me = this,
  43037. opt = me.bounds,
  43038. groupBarWidth = opt.groupBarWidth,
  43039. column = me.column,
  43040. chart = me.chart,
  43041. chartBBox = chart.chartBBox,
  43042. resizing = chart.resizing,
  43043. xValue = item.value[0],
  43044. yValue = item.value[1],
  43045. attr = item.attr,
  43046. config = me.label,
  43047. rotate = config.orientation == 'vertical',
  43048. field = [].concat(config.field),
  43049. format = config.renderer,
  43050. text = format(storeItem.get(field[index])),
  43051. size = me.getLabelSize(text),
  43052. width = size.width,
  43053. height = size.height,
  43054. zero = opt.zero,
  43055. outside = 'outside',
  43056. insideStart = 'insideStart',
  43057. insideEnd = 'insideEnd',
  43058. offsetX = 10,
  43059. offsetY = 6,
  43060. signed = opt.signed,
  43061. x, y, finalAttr;
  43062. label.setAttributes({
  43063. text: text
  43064. });
  43065. label.isOutside = false;
  43066. if (column) {
  43067. if (display == outside) {
  43068. if (height + offsetY + attr.height > (yValue >= 0 ? zero - chartBBox.y : chartBBox.y + chartBBox.height - zero)) {
  43069. display = insideEnd;
  43070. }
  43071. } else {
  43072. if (height + offsetY > attr.height) {
  43073. display = outside;
  43074. label.isOutside = true;
  43075. }
  43076. }
  43077. x = attr.x + groupBarWidth / 2;
  43078. y = display == insideStart ?
  43079. (zero + ((height / 2 + 3) * (yValue >= 0 ? -1 : 1))) :
  43080. (yValue >= 0 ? (attr.y + ((height / 2 + 3) * (display == outside ? -1 : 1))) :
  43081. (attr.y + attr.height + ((height / 2 + 3) * (display === outside ? 1 : -1))));
  43082. }
  43083. else {
  43084. if (display == outside) {
  43085. if (width + offsetX + attr.width > (yValue >= 0 ? chartBBox.x + chartBBox.width - zero : zero - chartBBox.x)) {
  43086. display = insideEnd;
  43087. }
  43088. }
  43089. else {
  43090. if (width + offsetX > attr.width) {
  43091. display = outside;
  43092. label.isOutside = true;
  43093. }
  43094. }
  43095. x = display == insideStart ?
  43096. (zero + ((width / 2 + 5) * (yValue >= 0 ? 1 : -1))) :
  43097. (yValue >= 0 ? (attr.x + attr.width + ((width / 2 + 5) * (display === outside ? 1 : -1))) :
  43098. (attr.x + ((width / 2 + 5) * (display === outside ? -1 : 1))));
  43099. y = attr.y + groupBarWidth / 2;
  43100. }
  43101. finalAttr = {
  43102. x: x,
  43103. y: y
  43104. };
  43105. if (rotate) {
  43106. finalAttr.rotate = {
  43107. x: x,
  43108. y: y,
  43109. degrees: 270
  43110. };
  43111. }
  43112. if (animate && resizing) {
  43113. if (column) {
  43114. x = attr.x + attr.width / 2;
  43115. y = zero;
  43116. } else {
  43117. x = zero;
  43118. y = attr.y + attr.height / 2;
  43119. }
  43120. label.setAttributes({
  43121. x: x,
  43122. y: y
  43123. }, true);
  43124. if (rotate) {
  43125. label.setAttributes({
  43126. rotate: {
  43127. x: x,
  43128. y: y,
  43129. degrees: 270
  43130. }
  43131. }, true);
  43132. }
  43133. }
  43134. if (animate) {
  43135. me.onAnimate(label, { to: finalAttr });
  43136. }
  43137. else {
  43138. label.setAttributes(Ext.apply(finalAttr, {
  43139. hidden: false
  43140. }), true);
  43141. }
  43142. },
  43143. getLabelSize: function(value) {
  43144. var tester = this.testerLabel,
  43145. config = this.label,
  43146. endLabelStyle = Ext.apply({}, config, this.seriesLabelStyle || {}),
  43147. rotated = config.orientation === 'vertical',
  43148. bbox, w, h,
  43149. undef;
  43150. if (!tester) {
  43151. tester = this.testerLabel = this.chart.surface.add(Ext.apply({
  43152. type: 'text',
  43153. opacity: 0
  43154. }, endLabelStyle));
  43155. }
  43156. tester.setAttributes({
  43157. text: value
  43158. }, true);
  43159. bbox = tester.getBBox();
  43160. w = bbox.width;
  43161. h = bbox.height;
  43162. return {
  43163. width: rotated ? h : w,
  43164. height: rotated ? w : h
  43165. };
  43166. },
  43167. onAnimate: function(sprite, attr) {
  43168. sprite.show();
  43169. return this.callParent(arguments);
  43170. },
  43171. isItemInPoint: function(x, y, item) {
  43172. var bbox = item.sprite.getBBox();
  43173. return bbox.x <= x && bbox.y <= y
  43174. && (bbox.x + bbox.width) >= x
  43175. && (bbox.y + bbox.height) >= y;
  43176. },
  43177. hideAll: function(index) {
  43178. var axes = this.chart.axes,
  43179. axesItems = axes.items,
  43180. ln = axesItems.length,
  43181. i = 0;
  43182. index = (isNaN(this._index) ? index : this._index) || 0;
  43183. if (!this.__excludes) {
  43184. this.__excludes = [];
  43185. }
  43186. this.__excludes[index] = true;
  43187. this.drawSeries();
  43188. for (i; i < ln; i++) {
  43189. axesItems[i].drawAxis();
  43190. }
  43191. },
  43192. showAll: function(index) {
  43193. var axes = this.chart.axes,
  43194. axesItems = axes.items,
  43195. ln = axesItems.length,
  43196. i = 0;
  43197. index = (isNaN(this._index) ? index : this._index) || 0;
  43198. if (!this.__excludes) {
  43199. this.__excludes = [];
  43200. }
  43201. this.__excludes[index] = false;
  43202. this.drawSeries();
  43203. for (i; i < ln; i++) {
  43204. axesItems[i].drawAxis();
  43205. }
  43206. },
  43207. getLegendColor: function(index) {
  43208. var me = this,
  43209. colorLength = me.colorArrayStyle.length;
  43210. if (me.style && me.style.fill) {
  43211. return me.style.fill;
  43212. } else {
  43213. return me.colorArrayStyle[index % colorLength];
  43214. }
  43215. },
  43216. highlightItem: function(item) {
  43217. this.callParent(arguments);
  43218. this.renderLabels();
  43219. },
  43220. unHighlightItem: function() {
  43221. this.callParent(arguments);
  43222. this.renderLabels();
  43223. },
  43224. cleanHighlights: function() {
  43225. this.callParent(arguments);
  43226. this.renderLabels();
  43227. }
  43228. });
  43229. Ext.define('Ext.chart.series.Column', {
  43230. alternateClassName: ['Ext.chart.ColumnSeries', 'Ext.chart.ColumnChart', 'Ext.chart.StackedColumnChart'],
  43231. extend: 'Ext.chart.series.Bar',
  43232. type: 'column',
  43233. alias: 'series.column',
  43234. column: true,
  43235. xPadding: 10,
  43236. yPadding: 0
  43237. });
  43238. Ext.define('Ext.chart.series.Gauge', {
  43239. extend: 'Ext.chart.series.Series',
  43240. type: "gauge",
  43241. alias: 'series.gauge',
  43242. rad: Math.PI / 180,
  43243. highlightDuration: 150,
  43244. angleField: false,
  43245. needle: false,
  43246. donut: false,
  43247. showInLegend: false,
  43248. style: {},
  43249. constructor: function(config) {
  43250. this.callParent(arguments);
  43251. var me = this,
  43252. chart = me.chart,
  43253. surface = chart.surface,
  43254. store = chart.store,
  43255. shadow = chart.shadow, i, l, cfg;
  43256. Ext.apply(me, config, {
  43257. shadowAttributes: [{
  43258. "stroke-width": 6,
  43259. "stroke-opacity": 1,
  43260. stroke: 'rgb(200, 200, 200)',
  43261. translate: {
  43262. x: 1.2,
  43263. y: 2
  43264. }
  43265. },
  43266. {
  43267. "stroke-width": 4,
  43268. "stroke-opacity": 1,
  43269. stroke: 'rgb(150, 150, 150)',
  43270. translate: {
  43271. x: 0.9,
  43272. y: 1.5
  43273. }
  43274. },
  43275. {
  43276. "stroke-width": 2,
  43277. "stroke-opacity": 1,
  43278. stroke: 'rgb(100, 100, 100)',
  43279. translate: {
  43280. x: 0.6,
  43281. y: 1
  43282. }
  43283. }]
  43284. });
  43285. me.group = surface.getGroup(me.seriesId);
  43286. if (shadow) {
  43287. for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
  43288. me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
  43289. }
  43290. }
  43291. surface.customAttributes.segment = function(opt) {
  43292. return me.getSegment(opt);
  43293. };
  43294. },
  43295. initialize: function() {
  43296. var me = this,
  43297. store = me.chart.getChartStore(),
  43298. data = store.data.items,
  43299. i, ln, rec;
  43300. me.yField = [];
  43301. if (me.label.field) {
  43302. for (i = 0, ln = data.length; i < ln; i++) {
  43303. rec = data[i];
  43304. me.yField.push(rec.get(me.label.field));
  43305. }
  43306. }
  43307. },
  43308. getSegment: function(opt) {
  43309. var me = this,
  43310. rad = me.rad,
  43311. cos = Math.cos,
  43312. sin = Math.sin,
  43313. abs = Math.abs,
  43314. x = me.centerX,
  43315. y = me.centerY,
  43316. x1 = 0, x2 = 0, x3 = 0, x4 = 0,
  43317. y1 = 0, y2 = 0, y3 = 0, y4 = 0,
  43318. delta = 1e-2,
  43319. r = opt.endRho - opt.startRho,
  43320. startAngle = opt.startAngle,
  43321. endAngle = opt.endAngle,
  43322. midAngle = (startAngle + endAngle) / 2 * rad,
  43323. margin = opt.margin || 0,
  43324. flag = abs(endAngle - startAngle) > 180,
  43325. a1 = Math.min(startAngle, endAngle) * rad,
  43326. a2 = Math.max(startAngle, endAngle) * rad,
  43327. singleSlice = false;
  43328. x += margin * cos(midAngle);
  43329. y += margin * sin(midAngle);
  43330. x1 = x + opt.startRho * cos(a1);
  43331. y1 = y + opt.startRho * sin(a1);
  43332. x2 = x + opt.endRho * cos(a1);
  43333. y2 = y + opt.endRho * sin(a1);
  43334. x3 = x + opt.startRho * cos(a2);
  43335. y3 = y + opt.startRho * sin(a2);
  43336. x4 = x + opt.endRho * cos(a2);
  43337. y4 = y + opt.endRho * sin(a2);
  43338. if (abs(x1 - x3) <= delta && abs(y1 - y3) <= delta) {
  43339. singleSlice = true;
  43340. }
  43341. if (singleSlice) {
  43342. return {
  43343. path: [
  43344. ["M", x1, y1],
  43345. ["L", x2, y2],
  43346. ["A", opt.endRho, opt.endRho, 0, +flag, 1, x4, y4],
  43347. ["Z"]]
  43348. };
  43349. } else {
  43350. return {
  43351. path: [
  43352. ["M", x1, y1],
  43353. ["L", x2, y2],
  43354. ["A", opt.endRho, opt.endRho, 0, +flag, 1, x4, y4],
  43355. ["L", x3, y3],
  43356. ["A", opt.startRho, opt.startRho, 0, +flag, 0, x1, y1],
  43357. ["Z"]]
  43358. };
  43359. }
  43360. },
  43361. calcMiddle: function(item) {
  43362. var me = this,
  43363. rad = me.rad,
  43364. slice = item.slice,
  43365. x = me.centerX,
  43366. y = me.centerY,
  43367. startAngle = slice.startAngle,
  43368. endAngle = slice.endAngle,
  43369. radius = Math.max(('rho' in slice) ? slice.rho: me.radius, me.label.minMargin),
  43370. donut = +me.donut,
  43371. a1 = Math.min(startAngle, endAngle) * rad,
  43372. a2 = Math.max(startAngle, endAngle) * rad,
  43373. midAngle = -(a1 + (a2 - a1) / 2),
  43374. xm = x + (item.endRho + item.startRho) / 2 * Math.cos(midAngle),
  43375. ym = y - (item.endRho + item.startRho) / 2 * Math.sin(midAngle);
  43376. item.middle = {
  43377. x: xm,
  43378. y: ym
  43379. };
  43380. },
  43381. drawSeries: function() {
  43382. var me = this,
  43383. chart = me.chart,
  43384. store = chart.getChartStore(),
  43385. group = me.group,
  43386. animate = me.chart.animate,
  43387. axis = me.chart.axes.get(0),
  43388. minimum = axis && axis.minimum || me.minimum || 0,
  43389. maximum = axis && axis.maximum || me.maximum || 0,
  43390. field = me.angleField || me.field || me.xField,
  43391. surface = chart.surface,
  43392. chartBBox = chart.chartBBox,
  43393. rad = me.rad,
  43394. donut = +me.donut,
  43395. values = {},
  43396. items = [],
  43397. seriesStyle = me.seriesStyle,
  43398. seriesLabelStyle = me.seriesLabelStyle,
  43399. colorArrayStyle = me.colorArrayStyle,
  43400. colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
  43401. gutterX = chart.maxGutter[0],
  43402. gutterY = chart.maxGutter[1],
  43403. cos = Math.cos,
  43404. sin = Math.sin,
  43405. rendererAttributes, centerX, centerY, slice, slices, sprite, value,
  43406. item, ln, record, i, j, startAngle, endAngle, middleAngle, sliceLength, path,
  43407. p, spriteOptions, bbox, splitAngle, sliceA, sliceB;
  43408. Ext.apply(seriesStyle, me.style || {});
  43409. me.setBBox();
  43410. bbox = me.bbox;
  43411. if (me.colorSet) {
  43412. colorArrayStyle = me.colorSet;
  43413. colorArrayLength = colorArrayStyle.length;
  43414. }
  43415. if (!store || !store.getCount() || me.seriesIsHidden) {
  43416. me.hide();
  43417. me.items = [];
  43418. return;
  43419. }
  43420. centerX = me.centerX = chartBBox.x + (chartBBox.width / 2);
  43421. centerY = me.centerY = chartBBox.y + chartBBox.height;
  43422. me.radius = Math.min(centerX - chartBBox.x, centerY - chartBBox.y);
  43423. me.slices = slices = [];
  43424. me.items = items = [];
  43425. if (!me.value) {
  43426. record = store.getAt(0);
  43427. me.value = record.get(field);
  43428. }
  43429. value = me.value;
  43430. if (me.needle) {
  43431. sliceA = {
  43432. series: me,
  43433. value: value,
  43434. startAngle: -180,
  43435. endAngle: 0,
  43436. rho: me.radius
  43437. };
  43438. splitAngle = -180 * (1 - (value - minimum) / (maximum - minimum));
  43439. slices.push(sliceA);
  43440. } else {
  43441. splitAngle = -180 * (1 - (value - minimum) / (maximum - minimum));
  43442. sliceA = {
  43443. series: me,
  43444. value: value,
  43445. startAngle: -180,
  43446. endAngle: splitAngle,
  43447. rho: me.radius
  43448. };
  43449. sliceB = {
  43450. series: me,
  43451. value: me.maximum - value,
  43452. startAngle: splitAngle,
  43453. endAngle: 0,
  43454. rho: me.radius
  43455. };
  43456. slices.push(sliceA, sliceB);
  43457. }
  43458. for (i = 0, ln = slices.length; i < ln; i++) {
  43459. slice = slices[i];
  43460. sprite = group.getAt(i);
  43461. rendererAttributes = Ext.apply({
  43462. segment: {
  43463. startAngle: slice.startAngle,
  43464. endAngle: slice.endAngle,
  43465. margin: 0,
  43466. rho: slice.rho,
  43467. startRho: slice.rho * +donut / 100,
  43468. endRho: slice.rho
  43469. }
  43470. }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[i % colorArrayLength] } || {}));
  43471. item = Ext.apply({},
  43472. rendererAttributes.segment, {
  43473. slice: slice,
  43474. series: me,
  43475. storeItem: record,
  43476. index: i
  43477. });
  43478. items[i] = item;
  43479. if (!sprite) {
  43480. spriteOptions = Ext.apply({
  43481. type: "path",
  43482. group: group
  43483. }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[i % colorArrayLength] } || {}));
  43484. sprite = surface.add(Ext.apply(spriteOptions, rendererAttributes));
  43485. }
  43486. slice.sprite = slice.sprite || [];
  43487. item.sprite = sprite;
  43488. slice.sprite.push(sprite);
  43489. if (animate) {
  43490. rendererAttributes = me.renderer(sprite, record, rendererAttributes, i, store);
  43491. sprite._to = rendererAttributes;
  43492. me.onAnimate(sprite, {
  43493. to: rendererAttributes
  43494. });
  43495. } else {
  43496. rendererAttributes = me.renderer(sprite, record, Ext.apply(rendererAttributes, {
  43497. hidden: false
  43498. }), i, store);
  43499. sprite.setAttributes(rendererAttributes, true);
  43500. }
  43501. }
  43502. if (me.needle) {
  43503. splitAngle = splitAngle * Math.PI / 180;
  43504. if (!me.needleSprite) {
  43505. me.needleSprite = me.chart.surface.add({
  43506. type: 'path',
  43507. path: ['M', centerX + (me.radius * +donut / 100) * cos(splitAngle),
  43508. centerY + -Math.abs((me.radius * +donut / 100) * sin(splitAngle)),
  43509. 'L', centerX + me.radius * cos(splitAngle),
  43510. centerY + -Math.abs(me.radius * sin(splitAngle))],
  43511. 'stroke-width': 4,
  43512. 'stroke': '#222'
  43513. });
  43514. } else {
  43515. if (animate) {
  43516. me.onAnimate(me.needleSprite, {
  43517. to: {
  43518. path: ['M', centerX + (me.radius * +donut / 100) * cos(splitAngle),
  43519. centerY + -Math.abs((me.radius * +donut / 100) * sin(splitAngle)),
  43520. 'L', centerX + me.radius * cos(splitAngle),
  43521. centerY + -Math.abs(me.radius * sin(splitAngle))]
  43522. }
  43523. });
  43524. } else {
  43525. me.needleSprite.setAttributes({
  43526. type: 'path',
  43527. path: ['M', centerX + (me.radius * +donut / 100) * cos(splitAngle),
  43528. centerY + -Math.abs((me.radius * +donut / 100) * sin(splitAngle)),
  43529. 'L', centerX + me.radius * cos(splitAngle),
  43530. centerY + -Math.abs(me.radius * sin(splitAngle))]
  43531. });
  43532. }
  43533. }
  43534. me.needleSprite.setAttributes({
  43535. hidden: false
  43536. }, true);
  43537. }
  43538. delete me.value;
  43539. },
  43540. setValue: function (value) {
  43541. this.value = value;
  43542. this.drawSeries();
  43543. },
  43544. onCreateLabel: function(storeItem, item, i, display) {},
  43545. onPlaceLabel: function(label, storeItem, item, i, display, animate, index) {},
  43546. onPlaceCallout: function() {},
  43547. onAnimate: function(sprite, attr) {
  43548. sprite.show();
  43549. return this.callParent(arguments);
  43550. },
  43551. isItemInPoint: function(x, y, item, i) {
  43552. var me = this,
  43553. cx = me.centerX,
  43554. cy = me.centerY,
  43555. abs = Math.abs,
  43556. dx = abs(x - cx),
  43557. dy = abs(y - cy),
  43558. startAngle = item.startAngle,
  43559. endAngle = item.endAngle,
  43560. rho = Math.sqrt(dx * dx + dy * dy),
  43561. angle = Math.atan2(y - cy, x - cx) / me.rad;
  43562. return (i === 0) && (angle >= startAngle && angle < endAngle &&
  43563. rho >= item.startRho && rho <= item.endRho);
  43564. },
  43565. showAll: function() {
  43566. if (!isNaN(this._index)) {
  43567. this.__excludes[this._index] = false;
  43568. this.drawSeries();
  43569. }
  43570. },
  43571. getLegendColor: function(index) {
  43572. var me = this;
  43573. return me.colorArrayStyle[index % me.colorArrayStyle.length];
  43574. }
  43575. });
  43576. Ext.define('Ext.chart.series.Line', {
  43577. extend: 'Ext.chart.series.Cartesian',
  43578. alternateClassName: ['Ext.chart.LineSeries', 'Ext.chart.LineChart'],
  43579. requires: ['Ext.chart.axis.Axis', 'Ext.chart.Shape', 'Ext.draw.Draw', 'Ext.fx.Anim'],
  43580. type: 'line',
  43581. alias: 'series.line',
  43582. selectionTolerance: 20,
  43583. showMarkers: true,
  43584. markerConfig: {},
  43585. style: {},
  43586. smooth: false,
  43587. defaultSmoothness: 3,
  43588. fill: false,
  43589. constructor: function(config) {
  43590. this.callParent(arguments);
  43591. var me = this,
  43592. surface = me.chart.surface,
  43593. shadow = me.chart.shadow,
  43594. i, l;
  43595. config.highlightCfg = Ext.Object.merge({ 'stroke-width': 3 }, config.highlightCfg);
  43596. Ext.apply(me, config, {
  43597. shadowAttributes: [{
  43598. "stroke-width": 6,
  43599. "stroke-opacity": 0.05,
  43600. stroke: 'rgb(0, 0, 0)',
  43601. translate: {
  43602. x: 1,
  43603. y: 1
  43604. }
  43605. }, {
  43606. "stroke-width": 4,
  43607. "stroke-opacity": 0.1,
  43608. stroke: 'rgb(0, 0, 0)',
  43609. translate: {
  43610. x: 1,
  43611. y: 1
  43612. }
  43613. }, {
  43614. "stroke-width": 2,
  43615. "stroke-opacity": 0.15,
  43616. stroke: 'rgb(0, 0, 0)',
  43617. translate: {
  43618. x: 1,
  43619. y: 1
  43620. }
  43621. }]
  43622. });
  43623. me.group = surface.getGroup(me.seriesId);
  43624. if (me.showMarkers) {
  43625. me.markerGroup = surface.getGroup(me.seriesId + '-markers');
  43626. }
  43627. if (shadow) {
  43628. for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
  43629. me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
  43630. }
  43631. }
  43632. },
  43633. shrink: function(xValues, yValues, size) {
  43634. var len = xValues.length,
  43635. ratio = Math.floor(len / size),
  43636. i = 1,
  43637. xSum = 0,
  43638. ySum = 0,
  43639. xRes = [+xValues[0]],
  43640. yRes = [+yValues[0]];
  43641. for (; i < len; ++i) {
  43642. xSum += +xValues[i] || 0;
  43643. ySum += +yValues[i] || 0;
  43644. if (i % ratio == 0) {
  43645. xRes.push(xSum/ratio);
  43646. yRes.push(ySum/ratio);
  43647. xSum = 0;
  43648. ySum = 0;
  43649. }
  43650. }
  43651. return {
  43652. x: xRes,
  43653. y: yRes
  43654. };
  43655. },
  43656. drawSeries: function() {
  43657. var me = this,
  43658. chart = me.chart,
  43659. chartAxes = chart.axes,
  43660. store = chart.getChartStore(),
  43661. data = store.data.items,
  43662. record,
  43663. storeCount = store.getCount(),
  43664. surface = me.chart.surface,
  43665. bbox = {},
  43666. group = me.group,
  43667. showMarkers = me.showMarkers,
  43668. markerGroup = me.markerGroup,
  43669. enableShadows = chart.shadow,
  43670. shadowGroups = me.shadowGroups,
  43671. shadowAttributes = me.shadowAttributes,
  43672. smooth = me.smooth,
  43673. lnsh = shadowGroups.length,
  43674. dummyPath = ["M"],
  43675. path = ["M"],
  43676. renderPath = ["M"],
  43677. smoothPath = ["M"],
  43678. markerIndex = chart.markerIndex,
  43679. axes = [].concat(me.axis),
  43680. shadowBarAttr,
  43681. xValues = [],
  43682. xValueMap = {},
  43683. yValues = [],
  43684. yValueMap = {},
  43685. onbreak = false,
  43686. storeIndices = [],
  43687. markerStyle = me.markerStyle,
  43688. seriesStyle = me.seriesStyle,
  43689. colorArrayStyle = me.colorArrayStyle,
  43690. colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
  43691. isNumber = Ext.isNumber,
  43692. seriesIdx = me.seriesIdx,
  43693. boundAxes = me.getAxesForXAndYFields(),
  43694. boundXAxis = boundAxes.xAxis,
  43695. boundYAxis = boundAxes.yAxis,
  43696. shadows, shadow, shindex, fromPath, fill, fillPath, rendererAttributes,
  43697. x, y, prevX, prevY, firstX, firstY, markerCount, i, j, ln, axis, ends, marker, markerAux, item, xValue,
  43698. yValue, coords, xScale, yScale, minX, maxX, minY, maxY, line, animation, endMarkerStyle,
  43699. endLineStyle, type, count, opacity, lineOpacity, fillOpacity, fillDefaultValue;
  43700. if (me.fireEvent('beforedraw', me) === false) {
  43701. return;
  43702. }
  43703. if (!storeCount || me.seriesIsHidden) {
  43704. me.hide();
  43705. me.items = [];
  43706. if (me.line) {
  43707. me.line.hide(true);
  43708. if (me.line.shadows) {
  43709. shadows = me.line.shadows;
  43710. for (j = 0, lnsh = shadows.length; j < lnsh; j++) {
  43711. shadow = shadows[j];
  43712. shadow.hide(true);
  43713. }
  43714. }
  43715. if (me.fillPath) {
  43716. me.fillPath.hide(true);
  43717. }
  43718. }
  43719. me.line = null;
  43720. me.fillPath = null;
  43721. return;
  43722. }
  43723. endMarkerStyle = Ext.apply(markerStyle || {}, me.markerConfig, {
  43724. fill: me.seriesStyle.fill || colorArrayStyle[seriesIdx % colorArrayStyle.length]
  43725. });
  43726. type = endMarkerStyle.type;
  43727. delete endMarkerStyle.type;
  43728. endLineStyle = seriesStyle;
  43729. if (!endLineStyle['stroke-width']) {
  43730. endLineStyle['stroke-width'] = 0.5;
  43731. }
  43732. opacity = 'opacity' in endLineStyle ? endLineStyle.opacity : 1;
  43733. fillDefaultValue = 'opacity' in endLineStyle ? endLineStyle.opacity : 0.3;
  43734. lineOpacity = 'lineOpacity' in endLineStyle ? endLineStyle.lineOpacity : opacity;
  43735. fillOpacity = 'fillOpacity' in endLineStyle ? endLineStyle.fillOpacity : fillDefaultValue;
  43736. if (markerIndex && markerGroup && markerGroup.getCount()) {
  43737. for (i = 0; i < markerIndex; i++) {
  43738. marker = markerGroup.getAt(i);
  43739. markerGroup.remove(marker);
  43740. markerGroup.add(marker);
  43741. markerAux = markerGroup.getAt(markerGroup.getCount() - 2);
  43742. marker.setAttributes({
  43743. x: 0,
  43744. y: 0,
  43745. translate: {
  43746. x: markerAux.attr.translation.x,
  43747. y: markerAux.attr.translation.y
  43748. }
  43749. }, true);
  43750. }
  43751. }
  43752. me.unHighlightItem();
  43753. me.cleanHighlights();
  43754. me.setBBox();
  43755. bbox = me.bbox;
  43756. me.clipRect = [bbox.x, bbox.y, bbox.width, bbox.height];
  43757. if (axis = chartAxes.get(boundXAxis)) {
  43758. ends = axis.applyData();
  43759. minX = ends.from;
  43760. maxX = ends.to;
  43761. }
  43762. if (axis = chartAxes.get(boundYAxis)) {
  43763. ends = axis.applyData();
  43764. minY = ends.from;
  43765. maxY = ends.to;
  43766. }
  43767. if (me.xField && !Ext.isNumber(minX)) {
  43768. axis = me.getMinMaxXValues();
  43769. minX = axis[0];
  43770. maxX = axis[1];
  43771. }
  43772. if (me.yField && !Ext.isNumber(minY)) {
  43773. axis = me.getMinMaxYValues();
  43774. minY = axis[0];
  43775. maxY = axis[1];
  43776. }
  43777. if (isNaN(minX)) {
  43778. minX = 0;
  43779. xScale = bbox.width / ((storeCount - 1) || 1);
  43780. }
  43781. else {
  43782. xScale = bbox.width / ((maxX - minX) || (storeCount -1) || 1);
  43783. }
  43784. if (isNaN(minY)) {
  43785. minY = 0;
  43786. yScale = bbox.height / ((storeCount - 1) || 1);
  43787. }
  43788. else {
  43789. yScale = bbox.height / ((maxY - minY) || (storeCount - 1) || 1);
  43790. }
  43791. for (i = 0, ln = data.length; i < ln; i++) {
  43792. record = data[i];
  43793. xValue = record.get(me.xField);
  43794. if (typeof xValue == 'string' || typeof xValue == 'object' && !Ext.isDate(xValue)
  43795. || boundXAxis && chartAxes.get(boundXAxis) && chartAxes.get(boundXAxis).type == 'Category') {
  43796. if (xValue in xValueMap) {
  43797. xValue = xValueMap[xValue];
  43798. } else {
  43799. xValue = xValueMap[xValue] = i;
  43800. }
  43801. }
  43802. yValue = record.get(me.yField);
  43803. if (typeof yValue == 'undefined' || (typeof yValue == 'string' && !yValue)) {
  43804. continue;
  43805. }
  43806. if (typeof yValue == 'string' || typeof yValue == 'object' && !Ext.isDate(yValue)
  43807. || boundYAxis && chartAxes.get(boundYAxis) && chartAxes.get(boundYAxis).type == 'Category') {
  43808. yValue = i;
  43809. }
  43810. storeIndices.push(i);
  43811. xValues.push(xValue);
  43812. yValues.push(yValue);
  43813. }
  43814. ln = xValues.length;
  43815. if (ln > bbox.width) {
  43816. coords = me.shrink(xValues, yValues, bbox.width);
  43817. xValues = coords.x;
  43818. yValues = coords.y;
  43819. }
  43820. me.items = [];
  43821. count = 0;
  43822. ln = xValues.length;
  43823. for (i = 0; i < ln; i++) {
  43824. xValue = xValues[i];
  43825. yValue = yValues[i];
  43826. if (yValue === false) {
  43827. if (path.length == 1) {
  43828. path = [];
  43829. }
  43830. onbreak = true;
  43831. me.items.push(false);
  43832. continue;
  43833. } else {
  43834. x = (bbox.x + (xValue - minX) * xScale).toFixed(2);
  43835. y = ((bbox.y + bbox.height) - (yValue - minY) * yScale).toFixed(2);
  43836. if (onbreak) {
  43837. onbreak = false;
  43838. path.push('M');
  43839. }
  43840. path = path.concat([x, y]);
  43841. }
  43842. if ((typeof firstY == 'undefined') && (typeof y != 'undefined')) {
  43843. firstY = y;
  43844. firstX = x;
  43845. }
  43846. if (!me.line || chart.resizing) {
  43847. dummyPath = dummyPath.concat([x, bbox.y + bbox.height / 2]);
  43848. }
  43849. if (chart.animate && chart.resizing && me.line) {
  43850. me.line.setAttributes({
  43851. path: dummyPath,
  43852. opacity: lineOpacity
  43853. }, true);
  43854. if (me.fillPath) {
  43855. me.fillPath.setAttributes({
  43856. path: dummyPath,
  43857. opacity: fillOpacity
  43858. }, true);
  43859. }
  43860. if (me.line.shadows) {
  43861. shadows = me.line.shadows;
  43862. for (j = 0, lnsh = shadows.length; j < lnsh; j++) {
  43863. shadow = shadows[j];
  43864. shadow.setAttributes({
  43865. path: dummyPath
  43866. }, true);
  43867. }
  43868. }
  43869. }
  43870. if (showMarkers) {
  43871. marker = markerGroup.getAt(count++);
  43872. if (!marker) {
  43873. marker = Ext.chart.Shape[type](surface, Ext.apply({
  43874. group: [group, markerGroup],
  43875. x: 0, y: 0,
  43876. translate: {
  43877. x: +(prevX || x),
  43878. y: prevY || (bbox.y + bbox.height / 2)
  43879. },
  43880. value: '"' + xValue + ', ' + yValue + '"',
  43881. zIndex: 4000
  43882. }, endMarkerStyle));
  43883. marker._to = {
  43884. translate: {
  43885. x: +x,
  43886. y: +y
  43887. }
  43888. };
  43889. } else {
  43890. marker.setAttributes({
  43891. value: '"' + xValue + ', ' + yValue + '"',
  43892. x: 0, y: 0,
  43893. hidden: false
  43894. }, true);
  43895. marker._to = {
  43896. translate: {
  43897. x: +x,
  43898. y: +y
  43899. }
  43900. };
  43901. }
  43902. }
  43903. me.items.push({
  43904. series: me,
  43905. value: [xValue, yValue],
  43906. point: [x, y],
  43907. sprite: marker,
  43908. storeItem: store.getAt(storeIndices[i])
  43909. });
  43910. prevX = x;
  43911. prevY = y;
  43912. }
  43913. if (path.length <= 1) {
  43914. return;
  43915. }
  43916. if (me.smooth) {
  43917. smoothPath = Ext.draw.Draw.smooth(path, isNumber(smooth) ? smooth : me.defaultSmoothness);
  43918. }
  43919. renderPath = smooth ? smoothPath : path;
  43920. if (chart.markerIndex && me.previousPath) {
  43921. fromPath = me.previousPath;
  43922. if (!smooth) {
  43923. Ext.Array.erase(fromPath, 1, 2);
  43924. }
  43925. } else {
  43926. fromPath = path;
  43927. }
  43928. if (!me.line) {
  43929. me.line = surface.add(Ext.apply({
  43930. type: 'path',
  43931. group: group,
  43932. path: dummyPath,
  43933. stroke: endLineStyle.stroke || endLineStyle.fill
  43934. }, endLineStyle || {}));
  43935. me.line.setAttributes({
  43936. opacity: lineOpacity
  43937. }, true);
  43938. if (enableShadows) {
  43939. me.line.setAttributes(Ext.apply({}, me.shadowOptions), true);
  43940. }
  43941. me.line.setAttributes({
  43942. fill: 'none',
  43943. zIndex: 3000
  43944. });
  43945. if (!endLineStyle.stroke && colorArrayLength) {
  43946. me.line.setAttributes({
  43947. stroke: colorArrayStyle[seriesIdx % colorArrayLength]
  43948. }, true);
  43949. }
  43950. if (enableShadows) {
  43951. shadows = me.line.shadows = [];
  43952. for (shindex = 0; shindex < lnsh; shindex++) {
  43953. shadowBarAttr = shadowAttributes[shindex];
  43954. shadowBarAttr = Ext.apply({}, shadowBarAttr, { path: dummyPath });
  43955. shadow = surface.add(Ext.apply({}, {
  43956. type: 'path',
  43957. group: shadowGroups[shindex]
  43958. }, shadowBarAttr));
  43959. shadows.push(shadow);
  43960. }
  43961. }
  43962. }
  43963. if (me.fill) {
  43964. fillPath = renderPath.concat([
  43965. ["L", x, bbox.y + bbox.height],
  43966. ["L", firstX, bbox.y + bbox.height],
  43967. ["L", firstX, firstY]
  43968. ]);
  43969. if (!me.fillPath) {
  43970. me.fillPath = surface.add({
  43971. group: group,
  43972. type: 'path',
  43973. fill: endLineStyle.fill || colorArrayStyle[seriesIdx % colorArrayLength],
  43974. path: dummyPath
  43975. });
  43976. }
  43977. }
  43978. markerCount = showMarkers && markerGroup.getCount();
  43979. if (chart.animate) {
  43980. fill = me.fill;
  43981. line = me.line;
  43982. rendererAttributes = me.renderer(line, false, { path: renderPath }, i, store);
  43983. Ext.apply(rendererAttributes, endLineStyle || {}, {
  43984. stroke: endLineStyle.stroke || endLineStyle.fill
  43985. });
  43986. delete rendererAttributes.fill;
  43987. line.show(true);
  43988. if (chart.markerIndex && me.previousPath) {
  43989. me.animation = animation = me.onAnimate(line, {
  43990. to: rendererAttributes,
  43991. from: {
  43992. path: fromPath
  43993. }
  43994. });
  43995. } else {
  43996. me.animation = animation = me.onAnimate(line, {
  43997. to: rendererAttributes
  43998. });
  43999. }
  44000. if (enableShadows) {
  44001. shadows = line.shadows;
  44002. for(j = 0; j < lnsh; j++) {
  44003. shadows[j].show(true);
  44004. if (chart.markerIndex && me.previousPath) {
  44005. me.onAnimate(shadows[j], {
  44006. to: { path: renderPath },
  44007. from: { path: fromPath }
  44008. });
  44009. } else {
  44010. me.onAnimate(shadows[j], {
  44011. to: { path: renderPath }
  44012. });
  44013. }
  44014. }
  44015. }
  44016. if (fill) {
  44017. me.fillPath.show(true);
  44018. me.onAnimate(me.fillPath, {
  44019. to: Ext.apply({}, {
  44020. path: fillPath,
  44021. fill: endLineStyle.fill || colorArrayStyle[seriesIdx % colorArrayLength],
  44022. 'stroke-width': 0,
  44023. opacity: fillOpacity
  44024. }, endLineStyle || {})
  44025. });
  44026. }
  44027. if (showMarkers) {
  44028. count = 0;
  44029. for(i = 0; i < ln; i++) {
  44030. if (me.items[i]) {
  44031. item = markerGroup.getAt(count++);
  44032. if (item) {
  44033. rendererAttributes = me.renderer(item, store.getAt(i), item._to, i, store);
  44034. me.onAnimate(item, {
  44035. to: Ext.apply(rendererAttributes, endMarkerStyle || {})
  44036. });
  44037. item.show(true);
  44038. }
  44039. }
  44040. }
  44041. for(; count < markerCount; count++) {
  44042. item = markerGroup.getAt(count);
  44043. item.hide(true);
  44044. }
  44045. }
  44046. } else {
  44047. rendererAttributes = me.renderer(me.line, false, { path: renderPath, hidden: false }, i, store);
  44048. Ext.apply(rendererAttributes, endLineStyle || {}, {
  44049. stroke: endLineStyle.stroke || endLineStyle.fill
  44050. });
  44051. delete rendererAttributes.fill;
  44052. me.line.setAttributes(rendererAttributes, true);
  44053. me.line.setAttributes({
  44054. opacity: lineOpacity
  44055. }, true);
  44056. if (enableShadows) {
  44057. shadows = me.line.shadows;
  44058. for(j = 0; j < lnsh; j++) {
  44059. shadows[j].setAttributes({
  44060. path: renderPath,
  44061. hidden: false
  44062. }, true);
  44063. }
  44064. }
  44065. if (me.fill) {
  44066. me.fillPath.setAttributes({
  44067. path: fillPath,
  44068. hidden: false,
  44069. opacity: fillOpacity
  44070. }, true);
  44071. }
  44072. if (showMarkers) {
  44073. count = 0;
  44074. for(i = 0; i < ln; i++) {
  44075. if (me.items[i]) {
  44076. item = markerGroup.getAt(count++);
  44077. if (item) {
  44078. rendererAttributes = me.renderer(item, store.getAt(i), item._to, i, store);
  44079. item.setAttributes(Ext.apply(endMarkerStyle || {}, rendererAttributes || {}), true);
  44080. if (!item.attr.hidden) {
  44081. item.show(true);
  44082. }
  44083. }
  44084. }
  44085. }
  44086. for(; count < markerCount; count++) {
  44087. item = markerGroup.getAt(count);
  44088. item.hide(true);
  44089. }
  44090. }
  44091. }
  44092. if (chart.markerIndex) {
  44093. if (me.smooth) {
  44094. Ext.Array.erase(path, 1, 2);
  44095. } else {
  44096. Ext.Array.splice(path, 1, 0, path[1], path[2]);
  44097. }
  44098. me.previousPath = path;
  44099. }
  44100. me.renderLabels();
  44101. me.renderCallouts();
  44102. me.fireEvent('draw', me);
  44103. },
  44104. onCreateLabel: function(storeItem, item, i, display) {
  44105. var me = this,
  44106. group = me.labelsGroup,
  44107. config = me.label,
  44108. bbox = me.bbox,
  44109. endLabelStyle = Ext.apply(config, me.seriesLabelStyle);
  44110. return me.chart.surface.add(Ext.apply({
  44111. 'type': 'text',
  44112. 'text-anchor': 'middle',
  44113. 'group': group,
  44114. 'x': item.point[0],
  44115. 'y': bbox.y + bbox.height / 2
  44116. }, endLabelStyle || {}));
  44117. },
  44118. onPlaceLabel: function(label, storeItem, item, i, display, animate) {
  44119. var me = this,
  44120. chart = me.chart,
  44121. resizing = chart.resizing,
  44122. config = me.label,
  44123. format = config.renderer,
  44124. field = config.field,
  44125. bbox = me.bbox,
  44126. x = item.point[0],
  44127. y = item.point[1],
  44128. radius = item.sprite.attr.radius,
  44129. bb, width, height;
  44130. label.setAttributes({
  44131. text: format(storeItem.get(field)),
  44132. hidden: true
  44133. }, true);
  44134. if (display == 'rotate') {
  44135. label.setAttributes({
  44136. 'text-anchor': 'start',
  44137. 'rotation': {
  44138. x: x,
  44139. y: y,
  44140. degrees: -45
  44141. }
  44142. }, true);
  44143. bb = label.getBBox();
  44144. width = bb.width;
  44145. height = bb.height;
  44146. x = x < bbox.x? bbox.x : x;
  44147. x = (x + width > bbox.x + bbox.width)? (x - (x + width - bbox.x - bbox.width)) : x;
  44148. y = (y - height < bbox.y)? bbox.y + height : y;
  44149. } else if (display == 'under' || display == 'over') {
  44150. bb = item.sprite.getBBox();
  44151. bb.width = bb.width || (radius * 2);
  44152. bb.height = bb.height || (radius * 2);
  44153. y = y + (display == 'over'? -bb.height : bb.height);
  44154. bb = label.getBBox();
  44155. width = bb.width/2;
  44156. height = bb.height/2;
  44157. x = x - width < bbox.x? bbox.x + width : x;
  44158. x = (x + width > bbox.x + bbox.width) ? (x - (x + width - bbox.x - bbox.width)) : x;
  44159. y = y - height < bbox.y? bbox.y + height : y;
  44160. y = (y + height > bbox.y + bbox.height) ? (y - (y + height - bbox.y - bbox.height)) : y;
  44161. }
  44162. if (me.chart.animate && !me.chart.resizing) {
  44163. label.show(true);
  44164. me.onAnimate(label, {
  44165. to: {
  44166. x: x,
  44167. y: y
  44168. }
  44169. });
  44170. } else {
  44171. label.setAttributes({
  44172. x: x,
  44173. y: y
  44174. }, true);
  44175. if (resizing && me.animation) {
  44176. me.animation.on('afteranimate', function() {
  44177. label.show(true);
  44178. });
  44179. } else {
  44180. label.show(true);
  44181. }
  44182. }
  44183. },
  44184. highlightItem: function() {
  44185. var me = this;
  44186. me.callParent(arguments);
  44187. if (me.line && !me.highlighted) {
  44188. if (!('__strokeWidth' in me.line)) {
  44189. me.line.__strokeWidth = parseFloat(me.line.attr['stroke-width']) || 0;
  44190. }
  44191. if (me.line.__anim) {
  44192. me.line.__anim.paused = true;
  44193. }
  44194. me.line.__anim = Ext.create('Ext.fx.Anim', {
  44195. target: me.line,
  44196. to: {
  44197. 'stroke-width': me.line.__strokeWidth + 3
  44198. }
  44199. });
  44200. me.highlighted = true;
  44201. }
  44202. },
  44203. unHighlightItem: function() {
  44204. var me = this;
  44205. me.callParent(arguments);
  44206. if (me.line && me.highlighted) {
  44207. me.line.__anim = Ext.create('Ext.fx.Anim', {
  44208. target: me.line,
  44209. to: {
  44210. 'stroke-width': me.line.__strokeWidth
  44211. }
  44212. });
  44213. me.highlighted = false;
  44214. }
  44215. },
  44216. onPlaceCallout : function(callout, storeItem, item, i, display, animate, index) {
  44217. if (!display) {
  44218. return;
  44219. }
  44220. var me = this,
  44221. chart = me.chart,
  44222. surface = chart.surface,
  44223. resizing = chart.resizing,
  44224. config = me.callouts,
  44225. items = me.items,
  44226. prev = i == 0? false : items[i -1].point,
  44227. next = (i == items.length -1)? false : items[i +1].point,
  44228. cur = [+item.point[0], +item.point[1]],
  44229. dir, norm, normal, a, aprev, anext,
  44230. offsetFromViz = config.offsetFromViz || 30,
  44231. offsetToSide = config.offsetToSide || 10,
  44232. offsetBox = config.offsetBox || 3,
  44233. boxx, boxy, boxw, boxh,
  44234. p, clipRect = me.clipRect,
  44235. bbox = {
  44236. width: config.styles.width || 10,
  44237. height: config.styles.height || 10
  44238. },
  44239. x, y;
  44240. if (!prev) {
  44241. prev = cur;
  44242. }
  44243. if (!next) {
  44244. next = cur;
  44245. }
  44246. a = (next[1] - prev[1]) / (next[0] - prev[0]);
  44247. aprev = (cur[1] - prev[1]) / (cur[0] - prev[0]);
  44248. anext = (next[1] - cur[1]) / (next[0] - cur[0]);
  44249. norm = Math.sqrt(1 + a * a);
  44250. dir = [1 / norm, a / norm];
  44251. normal = [-dir[1], dir[0]];
  44252. if (aprev > 0 && anext < 0 && normal[1] < 0
  44253. || aprev < 0 && anext > 0 && normal[1] > 0) {
  44254. normal[0] *= -1;
  44255. normal[1] *= -1;
  44256. } else if (Math.abs(aprev) < Math.abs(anext) && normal[0] < 0
  44257. || Math.abs(aprev) > Math.abs(anext) && normal[0] > 0) {
  44258. normal[0] *= -1;
  44259. normal[1] *= -1;
  44260. }
  44261. x = cur[0] + normal[0] * offsetFromViz;
  44262. y = cur[1] + normal[1] * offsetFromViz;
  44263. boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
  44264. boxy = y - bbox.height /2 - offsetBox;
  44265. boxw = bbox.width + 2 * offsetBox;
  44266. boxh = bbox.height + 2 * offsetBox;
  44267. if (boxx < clipRect[0] || (boxx + boxw) > (clipRect[0] + clipRect[2])) {
  44268. normal[0] *= -1;
  44269. }
  44270. if (boxy < clipRect[1] || (boxy + boxh) > (clipRect[1] + clipRect[3])) {
  44271. normal[1] *= -1;
  44272. }
  44273. x = cur[0] + normal[0] * offsetFromViz;
  44274. y = cur[1] + normal[1] * offsetFromViz;
  44275. boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
  44276. boxy = y - bbox.height /2 - offsetBox;
  44277. boxw = bbox.width + 2 * offsetBox;
  44278. boxh = bbox.height + 2 * offsetBox;
  44279. if (chart.animate) {
  44280. me.onAnimate(callout.lines, {
  44281. to: {
  44282. path: ["M", cur[0], cur[1], "L", x, y, "Z"]
  44283. }
  44284. });
  44285. if (callout.panel) {
  44286. callout.panel.setPosition(boxx, boxy, true);
  44287. }
  44288. }
  44289. else {
  44290. callout.lines.setAttributes({
  44291. path: ["M", cur[0], cur[1], "L", x, y, "Z"]
  44292. }, true);
  44293. if (callout.panel) {
  44294. callout.panel.setPosition(boxx, boxy);
  44295. }
  44296. }
  44297. for (p in callout) {
  44298. callout[p].show(true);
  44299. }
  44300. },
  44301. isItemInPoint: function(x, y, item, i) {
  44302. var me = this,
  44303. items = me.items,
  44304. tolerance = me.selectionTolerance,
  44305. result = null,
  44306. prevItem,
  44307. nextItem,
  44308. prevPoint,
  44309. nextPoint,
  44310. ln,
  44311. x1,
  44312. y1,
  44313. x2,
  44314. y2,
  44315. xIntersect,
  44316. yIntersect,
  44317. dist1, dist2, dist, midx, midy,
  44318. sqrt = Math.sqrt, abs = Math.abs;
  44319. nextItem = items[i];
  44320. prevItem = i && items[i - 1];
  44321. if (i >= ln) {
  44322. prevItem = items[ln - 1];
  44323. }
  44324. prevPoint = prevItem && prevItem.point;
  44325. nextPoint = nextItem && nextItem.point;
  44326. x1 = prevItem ? prevPoint[0] : nextPoint[0] - tolerance;
  44327. y1 = prevItem ? prevPoint[1] : nextPoint[1];
  44328. x2 = nextItem ? nextPoint[0] : prevPoint[0] + tolerance;
  44329. y2 = nextItem ? nextPoint[1] : prevPoint[1];
  44330. dist1 = sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
  44331. dist2 = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
  44332. dist = Math.min(dist1, dist2);
  44333. if (dist <= tolerance) {
  44334. return dist == dist1? prevItem : nextItem;
  44335. }
  44336. return false;
  44337. },
  44338. toggleAll: function(show) {
  44339. var me = this,
  44340. i, ln, shadow, shadows;
  44341. if (!show) {
  44342. Ext.chart.series.Cartesian.prototype.hideAll.call(me);
  44343. }
  44344. else {
  44345. Ext.chart.series.Cartesian.prototype.showAll.call(me);
  44346. }
  44347. if (me.line) {
  44348. me.line.setAttributes({
  44349. hidden: !show
  44350. }, true);
  44351. if (me.line.shadows) {
  44352. for (i = 0, shadows = me.line.shadows, ln = shadows.length; i < ln; i++) {
  44353. shadow = shadows[i];
  44354. shadow.setAttributes({
  44355. hidden: !show
  44356. }, true);
  44357. }
  44358. }
  44359. }
  44360. if (me.fillPath) {
  44361. me.fillPath.setAttributes({
  44362. hidden: !show
  44363. }, true);
  44364. }
  44365. },
  44366. hideAll: function() {
  44367. this.toggleAll(false);
  44368. },
  44369. showAll: function() {
  44370. this.toggleAll(true);
  44371. }
  44372. });
  44373. Ext.define('Ext.chart.series.Pie', {
  44374. alternateClassName: ['Ext.chart.PieSeries', 'Ext.chart.PieChart'],
  44375. extend: 'Ext.chart.series.Series',
  44376. type: "pie",
  44377. alias: 'series.pie',
  44378. accuracy: 100000,
  44379. rad: Math.PI * 2 / 100000,
  44380. highlightDuration: 150,
  44381. angleField: false,
  44382. lengthField: false,
  44383. donut: false,
  44384. showInLegend: false,
  44385. style: {},
  44386. constructor: function(config) {
  44387. this.callParent(arguments);
  44388. var me = this,
  44389. chart = me.chart,
  44390. surface = chart.surface,
  44391. store = chart.store,
  44392. shadow = chart.shadow, i, l, cfg;
  44393. config.highlightCfg = Ext.merge({
  44394. segment: {
  44395. margin: 20
  44396. }
  44397. }, config.highlightCfg);
  44398. Ext.apply(me, config, {
  44399. shadowAttributes: [{
  44400. "stroke-width": 6,
  44401. "stroke-opacity": 1,
  44402. stroke: 'rgb(200, 200, 200)',
  44403. translate: {
  44404. x: 1.2,
  44405. y: 2
  44406. }
  44407. },
  44408. {
  44409. "stroke-width": 4,
  44410. "stroke-opacity": 1,
  44411. stroke: 'rgb(150, 150, 150)',
  44412. translate: {
  44413. x: 0.9,
  44414. y: 1.5
  44415. }
  44416. },
  44417. {
  44418. "stroke-width": 2,
  44419. "stroke-opacity": 1,
  44420. stroke: 'rgb(100, 100, 100)',
  44421. translate: {
  44422. x: 0.6,
  44423. y: 1
  44424. }
  44425. }]
  44426. });
  44427. me.group = surface.getGroup(me.seriesId);
  44428. if (shadow) {
  44429. for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
  44430. me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
  44431. }
  44432. }
  44433. surface.customAttributes.segment = function(opt) {
  44434. var ans = me.getSegment(opt);
  44435. if (!ans.path || ans.path.length === 0) {
  44436. ans.path = ['M', 0, 0];
  44437. }
  44438. return ans;
  44439. };
  44440. me.__excludes = me.__excludes || [];
  44441. },
  44442. initialize: function() {
  44443. var me = this,
  44444. store = me.chart.getChartStore(),
  44445. data = store.data.items,
  44446. i, ln, rec;
  44447. me.yField = [];
  44448. if (me.label.field) {
  44449. for (i = 0, ln = data.length; i < ln; i++) {
  44450. rec = data[i];
  44451. me.yField.push(rec.get(me.label.field));
  44452. }
  44453. }
  44454. },
  44455. getSegment: function(opt) {
  44456. var me = this,
  44457. rad = me.rad,
  44458. cos = Math.cos,
  44459. sin = Math.sin,
  44460. x = me.centerX,
  44461. y = me.centerY,
  44462. x1 = 0, x2 = 0, x3 = 0, x4 = 0,
  44463. y1 = 0, y2 = 0, y3 = 0, y4 = 0,
  44464. x5 = 0, y5 = 0, x6 = 0, y6 = 0,
  44465. delta = 1e-2,
  44466. startAngle = opt.startAngle,
  44467. endAngle = opt.endAngle,
  44468. midAngle = (startAngle + endAngle) / 2 * rad,
  44469. margin = opt.margin || 0,
  44470. a1 = Math.min(startAngle, endAngle) * rad,
  44471. a2 = Math.max(startAngle, endAngle) * rad,
  44472. c1 = cos(a1), s1 = sin(a1),
  44473. c2 = cos(a2), s2 = sin(a2),
  44474. cm = cos(midAngle), sm = sin(midAngle),
  44475. flag = 0, hsqr2 = 0.7071067811865476;
  44476. if (a2 - a1 < delta) {
  44477. return {path: ""};
  44478. }
  44479. if (margin !== 0) {
  44480. x += margin * cm;
  44481. y += margin * sm;
  44482. }
  44483. x2 = x + opt.endRho * c1;
  44484. y2 = y + opt.endRho * s1;
  44485. x4 = x + opt.endRho * c2;
  44486. y4 = y + opt.endRho * s2;
  44487. x6 = x + opt.endRho * cm;
  44488. y6 = y + opt.endRho * sm;
  44489. if (opt.startRho !== 0) {
  44490. x1 = x + opt.startRho * c1;
  44491. y1 = y + opt.startRho * s1;
  44492. x3 = x + opt.startRho * c2;
  44493. y3 = y + opt.startRho * s2;
  44494. x5 = x + opt.startRho * cm;
  44495. y5 = y + opt.startRho * sm;
  44496. return {
  44497. path: [
  44498. ["M", x2, y2],
  44499. ["A", opt.endRho, opt.endRho, 0, 0, 1, x6, y6], ["L", x6, y6],
  44500. ["A", opt.endRho, opt.endRho, 0, flag, 1, x4, y4], ["L", x4, y4],
  44501. ["L", x3, y3],
  44502. ["A", opt.startRho, opt.startRho, 0, flag, 0, x5, y5], ["L", x5, y5],
  44503. ["A", opt.startRho, opt.startRho, 0, 0, 0, x1, y1], ["L", x1, y1],
  44504. ["Z"]
  44505. ]
  44506. };
  44507. } else {
  44508. return {
  44509. path: [
  44510. ["M", x, y],
  44511. ["L", x2, y2],
  44512. ["A", opt.endRho, opt.endRho, 0, 0, 1, x6, y6], ["L", x6, y6],
  44513. ["A", opt.endRho, opt.endRho, 0, flag, 1, x4, y4], ["L", x4, y4],
  44514. ["L", x, y],
  44515. ["Z"]
  44516. ]
  44517. };
  44518. }
  44519. },
  44520. calcMiddle: function(item) {
  44521. var me = this,
  44522. rad = me.rad,
  44523. slice = item.slice,
  44524. x = me.centerX,
  44525. y = me.centerY,
  44526. startAngle = slice.startAngle,
  44527. endAngle = slice.endAngle,
  44528. donut = +me.donut,
  44529. midAngle = -(startAngle + endAngle) * rad / 2,
  44530. r = (item.endRho + item.startRho) / 2,
  44531. xm = x + r * Math.cos(midAngle),
  44532. ym = y - r * Math.sin(midAngle);
  44533. item.middle = {
  44534. x: xm,
  44535. y: ym
  44536. };
  44537. },
  44538. drawSeries: function() {
  44539. var me = this,
  44540. store = me.chart.getChartStore(),
  44541. data = store.data.items,
  44542. record,
  44543. group = me.group,
  44544. animate = me.chart.animate,
  44545. field = me.angleField || me.field || me.xField,
  44546. lenField = [].concat(me.lengthField),
  44547. totalLenField = 0,
  44548. chart = me.chart,
  44549. surface = chart.surface,
  44550. chartBBox = chart.chartBBox,
  44551. enableShadows = chart.shadow,
  44552. shadowGroups = me.shadowGroups,
  44553. shadowAttributes = me.shadowAttributes,
  44554. lnsh = shadowGroups.length,
  44555. layers = lenField.length,
  44556. rhoAcum = 0,
  44557. donut = +me.donut,
  44558. layerTotals = [],
  44559. items = [],
  44560. totalField = 0,
  44561. maxLenField = 0,
  44562. angle = 0,
  44563. seriesStyle = me.seriesStyle,
  44564. colorArrayStyle = me.colorArrayStyle,
  44565. colorArrayLength = colorArrayStyle && colorArrayStyle.length || 0,
  44566. rendererAttributes,
  44567. shadowAttr,
  44568. shadows,
  44569. shadow,
  44570. shindex,
  44571. centerX,
  44572. centerY,
  44573. deltaRho,
  44574. first = 0,
  44575. slice,
  44576. slices,
  44577. sprite,
  44578. value,
  44579. item,
  44580. lenValue,
  44581. ln,
  44582. i,
  44583. j,
  44584. endAngle,
  44585. path,
  44586. p,
  44587. spriteOptions, bbox;
  44588. Ext.apply(seriesStyle, me.style || {});
  44589. me.setBBox();
  44590. bbox = me.bbox;
  44591. if (me.colorSet) {
  44592. colorArrayStyle = me.colorSet;
  44593. colorArrayLength = colorArrayStyle.length;
  44594. }
  44595. if (!store || !store.getCount() || me.seriesIsHidden) {
  44596. me.hide();
  44597. me.items = [];
  44598. return;
  44599. }
  44600. me.unHighlightItem();
  44601. me.cleanHighlights();
  44602. centerX = me.centerX = chartBBox.x + (chartBBox.width / 2);
  44603. centerY = me.centerY = chartBBox.y + (chartBBox.height / 2);
  44604. me.radius = Math.min(centerX - chartBBox.x, centerY - chartBBox.y);
  44605. me.slices = slices = [];
  44606. me.items = items = [];
  44607. for (i = 0, ln = data.length; i < ln; i++) {
  44608. record = data[i];
  44609. if (this.__excludes && this.__excludes[i]) {
  44610. continue;
  44611. }
  44612. totalField += +record.get(field);
  44613. if (lenField[0]) {
  44614. for (j = 0, totalLenField = 0; j < layers; j++) {
  44615. totalLenField += +record.get(lenField[j]);
  44616. }
  44617. layerTotals[i] = totalLenField;
  44618. maxLenField = Math.max(maxLenField, totalLenField);
  44619. }
  44620. }
  44621. totalField = totalField || 1;
  44622. for (i = 0, ln = data.length; i < ln; i++) {
  44623. record = data[i];
  44624. if (this.__excludes && this.__excludes[i]) {
  44625. value = 0;
  44626. } else {
  44627. value = record.get(field);
  44628. if (first == 0) {
  44629. first = 1;
  44630. }
  44631. }
  44632. if (first == 1) {
  44633. first = 2;
  44634. me.firstAngle = angle = me.accuracy * value / totalField / 2;
  44635. for (j = 0; j < i; j++) {
  44636. slices[j].startAngle = slices[j].endAngle = me.firstAngle;
  44637. }
  44638. }
  44639. endAngle = angle - me.accuracy * value / totalField;
  44640. slice = {
  44641. series: me,
  44642. value: value,
  44643. startAngle: angle,
  44644. endAngle: endAngle,
  44645. storeItem: record
  44646. };
  44647. if (lenField[0]) {
  44648. lenValue = +layerTotals[i];
  44649. slice.rho = Math.floor(me.radius / maxLenField * lenValue);
  44650. } else {
  44651. slice.rho = me.radius;
  44652. }
  44653. slices[i] = slice;
  44654. (function () {
  44655. angle = endAngle;
  44656. })();
  44657. }
  44658. if (enableShadows) {
  44659. for (i = 0, ln = slices.length; i < ln; i++) {
  44660. slice = slices[i];
  44661. slice.shadowAttrs = [];
  44662. for (j = 0, rhoAcum = 0, shadows = []; j < layers; j++) {
  44663. sprite = group.getAt(i * layers + j);
  44664. deltaRho = lenField[j] ? store.getAt(i).get(lenField[j]) / layerTotals[i] * slice.rho: slice.rho;
  44665. rendererAttributes = {
  44666. segment: {
  44667. startAngle: slice.startAngle,
  44668. endAngle: slice.endAngle,
  44669. margin: 0,
  44670. rho: slice.rho,
  44671. startRho: rhoAcum + (deltaRho * donut / 100),
  44672. endRho: rhoAcum + deltaRho
  44673. },
  44674. hidden: !slice.value && (slice.startAngle % me.accuracy) == (slice.endAngle % me.accuracy)
  44675. };
  44676. for (shindex = 0, shadows = []; shindex < lnsh; shindex++) {
  44677. shadowAttr = shadowAttributes[shindex];
  44678. shadow = shadowGroups[shindex].getAt(i);
  44679. if (!shadow) {
  44680. shadow = chart.surface.add(Ext.apply({}, {
  44681. type: 'path',
  44682. group: shadowGroups[shindex],
  44683. strokeLinejoin: "round"
  44684. }, rendererAttributes, shadowAttr));
  44685. }
  44686. shadowAttr = me.renderer(shadow, store.getAt(i), Ext.apply({}, rendererAttributes, shadowAttr), i, store);
  44687. if (animate) {
  44688. me.onAnimate(shadow, {
  44689. to: shadowAttr
  44690. });
  44691. } else {
  44692. shadow.setAttributes(shadowAttr, true);
  44693. }
  44694. shadows.push(shadow);
  44695. }
  44696. slice.shadowAttrs[j] = shadows;
  44697. }
  44698. }
  44699. }
  44700. for (i = 0, ln = slices.length; i < ln; i++) {
  44701. slice = slices[i];
  44702. for (j = 0, rhoAcum = 0; j < layers; j++) {
  44703. sprite = group.getAt(i * layers + j);
  44704. deltaRho = lenField[j] ? store.getAt(i).get(lenField[j]) / layerTotals[i] * slice.rho: slice.rho;
  44705. rendererAttributes = Ext.apply({
  44706. segment: {
  44707. startAngle: slice.startAngle,
  44708. endAngle: slice.endAngle,
  44709. margin: 0,
  44710. rho: slice.rho,
  44711. startRho: rhoAcum + (deltaRho * donut / 100),
  44712. endRho: rhoAcum + deltaRho
  44713. },
  44714. hidden: (!slice.value && (slice.startAngle % me.accuracy) == (slice.endAngle % me.accuracy))
  44715. }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[(layers > 1? j : i) % colorArrayLength] } || {}));
  44716. item = Ext.apply({},
  44717. rendererAttributes.segment, {
  44718. slice: slice,
  44719. series: me,
  44720. storeItem: slice.storeItem,
  44721. index: i
  44722. });
  44723. me.calcMiddle(item);
  44724. if (enableShadows) {
  44725. item.shadows = slice.shadowAttrs[j];
  44726. }
  44727. items[i] = item;
  44728. if (!sprite) {
  44729. spriteOptions = Ext.apply({
  44730. type: "path",
  44731. group: group,
  44732. middle: item.middle
  44733. }, Ext.apply(seriesStyle, colorArrayStyle && { fill: colorArrayStyle[(layers > 1? j : i) % colorArrayLength] } || {}));
  44734. sprite = surface.add(Ext.apply(spriteOptions, rendererAttributes));
  44735. }
  44736. slice.sprite = slice.sprite || [];
  44737. item.sprite = sprite;
  44738. slice.sprite.push(sprite);
  44739. slice.point = [item.middle.x, item.middle.y];
  44740. if (animate) {
  44741. rendererAttributes = me.renderer(sprite, store.getAt(i), rendererAttributes, i, store);
  44742. sprite._to = rendererAttributes;
  44743. sprite._animating = true;
  44744. me.onAnimate(sprite, {
  44745. to: rendererAttributes,
  44746. listeners: {
  44747. afteranimate: {
  44748. fn: function() {
  44749. this._animating = false;
  44750. },
  44751. scope: sprite
  44752. }
  44753. }
  44754. });
  44755. } else {
  44756. rendererAttributes = me.renderer(sprite, store.getAt(i), Ext.apply(rendererAttributes, {
  44757. hidden: false
  44758. }), i, store);
  44759. sprite.setAttributes(rendererAttributes, true);
  44760. }
  44761. rhoAcum += deltaRho;
  44762. }
  44763. }
  44764. ln = group.getCount();
  44765. for (i = 0; i < ln; i++) {
  44766. if (!slices[(i / layers) >> 0] && group.getAt(i)) {
  44767. group.getAt(i).hide(true);
  44768. }
  44769. }
  44770. if (enableShadows) {
  44771. lnsh = shadowGroups.length;
  44772. for (shindex = 0; shindex < ln; shindex++) {
  44773. if (!slices[(shindex / layers) >> 0]) {
  44774. for (j = 0; j < lnsh; j++) {
  44775. if (shadowGroups[j].getAt(shindex)) {
  44776. shadowGroups[j].getAt(shindex).hide(true);
  44777. }
  44778. }
  44779. }
  44780. }
  44781. }
  44782. me.renderLabels();
  44783. me.renderCallouts();
  44784. },
  44785. onCreateLabel: function(storeItem, item, i, display) {
  44786. var me = this,
  44787. group = me.labelsGroup,
  44788. config = me.label,
  44789. centerX = me.centerX,
  44790. centerY = me.centerY,
  44791. middle = item.middle,
  44792. endLabelStyle = Ext.apply(me.seriesLabelStyle || {}, config || {});
  44793. return me.chart.surface.add(Ext.apply({
  44794. 'type': 'text',
  44795. 'text-anchor': 'middle',
  44796. 'group': group,
  44797. 'x': middle.x,
  44798. 'y': middle.y
  44799. }, endLabelStyle));
  44800. },
  44801. onPlaceLabel: function(label, storeItem, item, i, display, animate, index) {
  44802. var me = this,
  44803. chart = me.chart,
  44804. resizing = chart.resizing,
  44805. config = me.label,
  44806. format = config.renderer,
  44807. field = [].concat(config.field),
  44808. centerX = me.centerX,
  44809. centerY = me.centerY,
  44810. middle = item.middle,
  44811. opt = {
  44812. x: middle.x,
  44813. y: middle.y
  44814. },
  44815. x = middle.x - centerX,
  44816. y = middle.y - centerY,
  44817. from = {},
  44818. rho = 1,
  44819. theta = Math.atan2(y, x || 1),
  44820. dg = theta * 180 / Math.PI,
  44821. prevDg;
  44822. opt.hidden = false;
  44823. if (this.__excludes && this.__excludes[i]) {
  44824. opt.hidden = true;
  44825. }
  44826. function fixAngle(a) {
  44827. if (a < 0) {
  44828. a += 360;
  44829. }
  44830. return a % 360;
  44831. }
  44832. label.setAttributes({
  44833. text: format(storeItem.get(field[index]))
  44834. }, true);
  44835. switch (display) {
  44836. case 'outside':
  44837. rho = Math.sqrt(x * x + y * y) * 2;
  44838. opt.x = rho * Math.cos(theta) + centerX;
  44839. opt.y = rho * Math.sin(theta) + centerY;
  44840. break;
  44841. case 'rotate':
  44842. dg = fixAngle(dg);
  44843. dg = (dg > 90 && dg < 270) ? dg + 180: dg;
  44844. prevDg = label.attr.rotation.degrees;
  44845. if (prevDg != null && Math.abs(prevDg - dg) > 180 * 0.5) {
  44846. if (dg > prevDg) {
  44847. dg -= 360;
  44848. } else {
  44849. dg += 360;
  44850. }
  44851. dg = dg % 360;
  44852. } else {
  44853. dg = fixAngle(dg);
  44854. }
  44855. opt.rotate = {
  44856. degrees: dg,
  44857. x: opt.x,
  44858. y: opt.y
  44859. };
  44860. break;
  44861. default:
  44862. break;
  44863. }
  44864. opt.translate = {
  44865. x: 0, y: 0
  44866. };
  44867. if (animate && !resizing && (display != 'rotate' || prevDg != null)) {
  44868. me.onAnimate(label, {
  44869. to: opt
  44870. });
  44871. } else {
  44872. label.setAttributes(opt, true);
  44873. }
  44874. label._from = from;
  44875. },
  44876. onPlaceCallout: function(callout, storeItem, item, i, display, animate, index) {
  44877. var me = this,
  44878. chart = me.chart,
  44879. centerX = me.centerX,
  44880. centerY = me.centerY,
  44881. middle = item.middle,
  44882. opt = {
  44883. x: middle.x,
  44884. y: middle.y
  44885. },
  44886. x = middle.x - centerX,
  44887. y = middle.y - centerY,
  44888. rho = 1,
  44889. rhoCenter,
  44890. theta = Math.atan2(y, x || 1),
  44891. bbox = callout.label.getBBox(),
  44892. offsetFromViz = 20,
  44893. offsetToSide = 10,
  44894. offsetBox = 10,
  44895. p;
  44896. rho = item.endRho + offsetFromViz;
  44897. rhoCenter = (item.endRho + item.startRho) / 2 + (item.endRho - item.startRho) / 3;
  44898. opt.x = rho * Math.cos(theta) + centerX;
  44899. opt.y = rho * Math.sin(theta) + centerY;
  44900. x = rhoCenter * Math.cos(theta);
  44901. y = rhoCenter * Math.sin(theta);
  44902. if (chart.animate) {
  44903. me.onAnimate(callout.lines, {
  44904. to: {
  44905. path: ["M", x + centerX, y + centerY, "L", opt.x, opt.y, "Z", "M", opt.x, opt.y, "l", x > 0 ? offsetToSide: -offsetToSide, 0, "z"]
  44906. }
  44907. });
  44908. me.onAnimate(callout.box, {
  44909. to: {
  44910. x: opt.x + (x > 0 ? offsetToSide: -(offsetToSide + bbox.width + 2 * offsetBox)),
  44911. y: opt.y + (y > 0 ? ( - bbox.height - offsetBox / 2) : ( - bbox.height - offsetBox / 2)),
  44912. width: bbox.width + 2 * offsetBox,
  44913. height: bbox.height + 2 * offsetBox
  44914. }
  44915. });
  44916. me.onAnimate(callout.label, {
  44917. to: {
  44918. x: opt.x + (x > 0 ? (offsetToSide + offsetBox) : -(offsetToSide + bbox.width + offsetBox)),
  44919. y: opt.y + (y > 0 ? -bbox.height / 4: -bbox.height / 4)
  44920. }
  44921. });
  44922. } else {
  44923. callout.lines.setAttributes({
  44924. path: ["M", x + centerX, y + centerY, "L", opt.x, opt.y, "Z", "M", opt.x, opt.y, "l", x > 0 ? offsetToSide: -offsetToSide, 0, "z"]
  44925. },
  44926. true);
  44927. callout.box.setAttributes({
  44928. x: opt.x + (x > 0 ? offsetToSide: -(offsetToSide + bbox.width + 2 * offsetBox)),
  44929. y: opt.y + (y > 0 ? ( - bbox.height - offsetBox / 2) : ( - bbox.height - offsetBox / 2)),
  44930. width: bbox.width + 2 * offsetBox,
  44931. height: bbox.height + 2 * offsetBox
  44932. },
  44933. true);
  44934. callout.label.setAttributes({
  44935. x: opt.x + (x > 0 ? (offsetToSide + offsetBox) : -(offsetToSide + bbox.width + offsetBox)),
  44936. y: opt.y + (y > 0 ? -bbox.height / 4: -bbox.height / 4)
  44937. },
  44938. true);
  44939. }
  44940. for (p in callout) {
  44941. callout[p].show(true);
  44942. }
  44943. },
  44944. onAnimate: function(sprite, attr) {
  44945. sprite.show();
  44946. return this.callParent(arguments);
  44947. },
  44948. isItemInPoint: function(x, y, item, i) {
  44949. var me = this,
  44950. cx = me.centerX,
  44951. cy = me.centerY,
  44952. abs = Math.abs,
  44953. dx = abs(x - cx),
  44954. dy = abs(y - cy),
  44955. startAngle = item.startAngle,
  44956. endAngle = item.endAngle,
  44957. rho = Math.sqrt(dx * dx + dy * dy),
  44958. angle = Math.atan2(y - cy, x - cx) / me.rad;
  44959. if (angle > me.firstAngle) {
  44960. angle -= me.accuracy;
  44961. }
  44962. return (angle <= startAngle && angle > endAngle
  44963. && rho >= item.startRho && rho <= item.endRho);
  44964. },
  44965. hideAll: function(index) {
  44966. var i, l, shadow, shadows, sh, lsh, sprite;
  44967. index = (isNaN(this._index) ? index : this._index) || 0;
  44968. this.__excludes = this.__excludes || [];
  44969. this.__excludes[index] = true;
  44970. sprite = this.slices[index].sprite;
  44971. for (sh = 0, lsh = sprite.length; sh < lsh; sh++) {
  44972. sprite[sh].setAttributes({
  44973. hidden: true
  44974. }, true);
  44975. }
  44976. if (this.slices[index].shadowAttrs) {
  44977. for (i = 0, shadows = this.slices[index].shadowAttrs, l = shadows.length; i < l; i++) {
  44978. shadow = shadows[i];
  44979. for (sh = 0, lsh = shadow.length; sh < lsh; sh++) {
  44980. shadow[sh].setAttributes({
  44981. hidden: true
  44982. }, true);
  44983. }
  44984. }
  44985. }
  44986. this.drawSeries();
  44987. },
  44988. showAll: function(index) {
  44989. index = (isNaN(this._index) ? index : this._index) || 0;
  44990. this.__excludes[index] = false;
  44991. this.drawSeries();
  44992. },
  44993. highlightItem: function(item) {
  44994. var me = this,
  44995. rad = me.rad,
  44996. highlightSegment,
  44997. animate,
  44998. attrs,
  44999. i,
  45000. shadows,
  45001. shadow,
  45002. ln,
  45003. to,
  45004. itemHighlightSegment,
  45005. prop,
  45006. group,
  45007. display,
  45008. label,
  45009. middle,
  45010. r,
  45011. x,
  45012. y;
  45013. item = item || this.items[this._index];
  45014. this.unHighlightItem();
  45015. if (!item || me.animating || (item.sprite && item.sprite._animating)) {
  45016. return;
  45017. }
  45018. me.callParent([item]);
  45019. if (!me.highlight) {
  45020. return;
  45021. }
  45022. if ('segment' in me.highlightCfg) {
  45023. highlightSegment = me.highlightCfg.segment;
  45024. animate = me.chart.animate;
  45025. if (me.labelsGroup) {
  45026. group = me.labelsGroup;
  45027. display = me.label.display;
  45028. label = group.getAt(item.index);
  45029. middle = (item.startAngle + item.endAngle) / 2 * rad;
  45030. r = highlightSegment.margin || 0;
  45031. x = r * Math.cos(middle);
  45032. y = r * Math.sin(middle);
  45033. if (Math.abs(x) < 1e-10) {
  45034. x = 0;
  45035. }
  45036. if (Math.abs(y) < 1e-10) {
  45037. y = 0;
  45038. }
  45039. if (animate) {
  45040. label.stopAnimation();
  45041. label.animate({
  45042. to: {
  45043. translate: {
  45044. x: x,
  45045. y: y
  45046. }
  45047. },
  45048. duration: me.highlightDuration
  45049. });
  45050. }
  45051. else {
  45052. label.setAttributes({
  45053. translate: {
  45054. x: x,
  45055. y: y
  45056. }
  45057. }, true);
  45058. }
  45059. }
  45060. if (me.chart.shadow && item.shadows) {
  45061. i = 0;
  45062. shadows = item.shadows;
  45063. ln = shadows.length;
  45064. for (; i < ln; i++) {
  45065. shadow = shadows[i];
  45066. to = {};
  45067. itemHighlightSegment = item.sprite._from.segment;
  45068. for (prop in itemHighlightSegment) {
  45069. if (! (prop in highlightSegment)) {
  45070. to[prop] = itemHighlightSegment[prop];
  45071. }
  45072. }
  45073. attrs = {
  45074. segment: Ext.applyIf(to, me.highlightCfg.segment)
  45075. };
  45076. if (animate) {
  45077. shadow.stopAnimation();
  45078. shadow.animate({
  45079. to: attrs,
  45080. duration: me.highlightDuration
  45081. });
  45082. }
  45083. else {
  45084. shadow.setAttributes(attrs, true);
  45085. }
  45086. }
  45087. }
  45088. }
  45089. },
  45090. unHighlightItem: function() {
  45091. var me = this,
  45092. items,
  45093. animate,
  45094. shadowsEnabled,
  45095. group,
  45096. len,
  45097. i,
  45098. j,
  45099. display,
  45100. shadowLen,
  45101. p,
  45102. to,
  45103. ihs,
  45104. hs,
  45105. sprite,
  45106. shadows,
  45107. shadow,
  45108. item,
  45109. label,
  45110. attrs;
  45111. if (!me.highlight) {
  45112. return;
  45113. }
  45114. if (('segment' in me.highlightCfg) && me.items) {
  45115. items = me.items;
  45116. animate = me.chart.animate;
  45117. shadowsEnabled = !!me.chart.shadow;
  45118. group = me.labelsGroup;
  45119. len = items.length;
  45120. i = 0;
  45121. j = 0;
  45122. display = me.label.display;
  45123. for (; i < len; i++) {
  45124. item = items[i];
  45125. if (!item) {
  45126. continue;
  45127. }
  45128. sprite = item.sprite;
  45129. if (sprite && sprite._highlighted) {
  45130. if (group) {
  45131. label = group.getAt(item.index);
  45132. attrs = Ext.apply({
  45133. translate: {
  45134. x: 0,
  45135. y: 0
  45136. }
  45137. },
  45138. display == 'rotate' ? {
  45139. rotate: {
  45140. x: label.attr.x,
  45141. y: label.attr.y,
  45142. degrees: label.attr.rotation.degrees
  45143. }
  45144. }: {});
  45145. if (animate) {
  45146. label.stopAnimation();
  45147. label.animate({
  45148. to: attrs,
  45149. duration: me.highlightDuration
  45150. });
  45151. }
  45152. else {
  45153. label.setAttributes(attrs, true);
  45154. }
  45155. }
  45156. if (shadowsEnabled) {
  45157. shadows = item.shadows;
  45158. shadowLen = shadows.length;
  45159. for (; j < shadowLen; j++) {
  45160. to = {};
  45161. ihs = item.sprite._to.segment;
  45162. hs = item.sprite._from.segment;
  45163. Ext.apply(to, hs);
  45164. for (p in ihs) {
  45165. if (! (p in hs)) {
  45166. to[p] = ihs[p];
  45167. }
  45168. }
  45169. shadow = shadows[j];
  45170. if (animate) {
  45171. shadow.stopAnimation();
  45172. shadow.animate({
  45173. to: {
  45174. segment: to
  45175. },
  45176. duration: me.highlightDuration
  45177. });
  45178. }
  45179. else {
  45180. shadow.setAttributes({ segment: to }, true);
  45181. }
  45182. }
  45183. }
  45184. }
  45185. }
  45186. }
  45187. me.callParent(arguments);
  45188. },
  45189. getLegendColor: function(index) {
  45190. var me = this;
  45191. return (me.colorSet && me.colorSet[index % me.colorSet.length]) || me.colorArrayStyle[index % me.colorArrayStyle.length];
  45192. }
  45193. });
  45194. Ext.define('Ext.chart.series.Radar', {
  45195. extend: 'Ext.chart.series.Series',
  45196. requires: ['Ext.chart.Shape', 'Ext.fx.Anim'],
  45197. type: "radar",
  45198. alias: 'series.radar',
  45199. rad: Math.PI / 180,
  45200. showInLegend: false,
  45201. style: {},
  45202. constructor: function(config) {
  45203. this.callParent(arguments);
  45204. var me = this,
  45205. surface = me.chart.surface, i, l;
  45206. me.group = surface.getGroup(me.seriesId);
  45207. if (me.showMarkers) {
  45208. me.markerGroup = surface.getGroup(me.seriesId + '-markers');
  45209. }
  45210. },
  45211. drawSeries: function() {
  45212. var me = this,
  45213. store = me.chart.getChartStore(),
  45214. data = store.data.items,
  45215. d, record,
  45216. group = me.group,
  45217. sprite,
  45218. chart = me.chart,
  45219. seriesItems = chart.series.items,
  45220. s, sLen, series,
  45221. animate = chart.animate,
  45222. field = me.field || me.yField,
  45223. surface = chart.surface,
  45224. chartBBox = chart.chartBBox,
  45225. seriesIdx = me.seriesIdx,
  45226. colorArrayStyle = me.colorArrayStyle,
  45227. centerX, centerY,
  45228. items,
  45229. radius,
  45230. maxValue = 0,
  45231. fields = [],
  45232. max = Math.max,
  45233. cos = Math.cos,
  45234. sin = Math.sin,
  45235. pi2 = Math.PI * 2,
  45236. l = store.getCount(),
  45237. startPath, path, x, y, rho,
  45238. i, nfields,
  45239. seriesStyle = me.seriesStyle,
  45240. seriesLabelStyle = me.seriesLabelStyle,
  45241. first = chart.resizing || !me.radar,
  45242. axis = chart.axes && chart.axes.get(0),
  45243. aggregate = !(axis && axis.maximum);
  45244. me.setBBox();
  45245. maxValue = aggregate? 0 : (axis.maximum || 0);
  45246. Ext.apply(seriesStyle, me.style || {});
  45247. if (!store || !store.getCount() || me.seriesIsHidden) {
  45248. me.hide();
  45249. me.items = [];
  45250. if (me.radar) {
  45251. me.radar.hide(true);
  45252. }
  45253. me.radar = null;
  45254. return;
  45255. }
  45256. if(!seriesStyle['stroke']){
  45257. seriesStyle['stroke'] = colorArrayStyle[seriesIdx % colorArrayStyle.length];
  45258. }
  45259. me.unHighlightItem();
  45260. me.cleanHighlights();
  45261. centerX = me.centerX = chartBBox.x + (chartBBox.width / 2);
  45262. centerY = me.centerY = chartBBox.y + (chartBBox.height / 2);
  45263. me.radius = radius = Math.min(chartBBox.width, chartBBox.height) /2;
  45264. me.items = items = [];
  45265. if (aggregate) {
  45266. for (s = 0, sLen = seriesItems.length; s < sLen; s++) {
  45267. series = seriesItems[s];
  45268. fields.push(series.yField);
  45269. }
  45270. for (d = 0; d < l; d++) {
  45271. record = data[d];
  45272. for (i = 0, nfields = fields.length; i < nfields; i++) {
  45273. maxValue = max(+record.get(fields[i]), maxValue);
  45274. }
  45275. }
  45276. }
  45277. maxValue = maxValue || 1;
  45278. startPath = []; path = [];
  45279. for (i = 0; i < l; i++) {
  45280. record = data[i];
  45281. rho = radius * record.get(field) / maxValue;
  45282. x = rho * cos(i / l * pi2);
  45283. y = rho * sin(i / l * pi2);
  45284. if (i == 0) {
  45285. path.push('M', x + centerX, y + centerY);
  45286. startPath.push('M', 0.01 * x + centerX, 0.01 * y + centerY);
  45287. } else {
  45288. path.push('L', x + centerX, y + centerY);
  45289. startPath.push('L', 0.01 * x + centerX, 0.01 * y + centerY);
  45290. }
  45291. items.push({
  45292. sprite: false,
  45293. point: [centerX + x, centerY + y],
  45294. storeItem: record,
  45295. series: me
  45296. });
  45297. }
  45298. path.push('Z');
  45299. if (!me.radar) {
  45300. me.radar = surface.add(Ext.apply({
  45301. type: 'path',
  45302. group: group,
  45303. path: startPath
  45304. }, seriesStyle || {}));
  45305. }
  45306. if (chart.resizing) {
  45307. me.radar.setAttributes({
  45308. path: startPath
  45309. }, true);
  45310. }
  45311. if (chart.animate) {
  45312. me.onAnimate(me.radar, {
  45313. to: Ext.apply({
  45314. path: path
  45315. }, seriesStyle || {})
  45316. });
  45317. } else {
  45318. me.radar.setAttributes(Ext.apply({
  45319. path: path
  45320. }, seriesStyle || {}), true);
  45321. }
  45322. if (me.showMarkers) {
  45323. me.drawMarkers();
  45324. }
  45325. me.renderLabels();
  45326. me.renderCallouts();
  45327. },
  45328. drawMarkers: function() {
  45329. var me = this,
  45330. chart = me.chart,
  45331. surface = chart.surface,
  45332. markerStyle = Ext.apply({}, me.markerStyle || {}),
  45333. endMarkerStyle = Ext.apply(markerStyle, me.markerConfig, {
  45334. fill: me.colorArrayStyle[me.seriesIdx % me.colorArrayStyle.length]
  45335. }),
  45336. items = me.items,
  45337. type = endMarkerStyle.type,
  45338. markerGroup = me.markerGroup,
  45339. centerX = me.centerX,
  45340. centerY = me.centerY,
  45341. item, i, l, marker;
  45342. delete endMarkerStyle.type;
  45343. for (i = 0, l = items.length; i < l; i++) {
  45344. item = items[i];
  45345. marker = markerGroup.getAt(i);
  45346. if (!marker) {
  45347. marker = Ext.chart.Shape[type](surface, Ext.apply({
  45348. group: markerGroup,
  45349. x: 0,
  45350. y: 0,
  45351. translate: {
  45352. x: centerX,
  45353. y: centerY
  45354. }
  45355. }, endMarkerStyle));
  45356. }
  45357. else {
  45358. marker.show();
  45359. }
  45360. item.sprite = marker;
  45361. if (chart.resizing) {
  45362. marker.setAttributes({
  45363. x: 0,
  45364. y: 0,
  45365. translate: {
  45366. x: centerX,
  45367. y: centerY
  45368. }
  45369. }, true);
  45370. }
  45371. marker._to = {
  45372. translate: {
  45373. x: item.point[0],
  45374. y: item.point[1]
  45375. }
  45376. };
  45377. if (chart.animate) {
  45378. me.onAnimate(marker, {
  45379. to: marker._to
  45380. });
  45381. }
  45382. else {
  45383. marker.setAttributes(Ext.apply(marker._to, endMarkerStyle || {}), true);
  45384. }
  45385. }
  45386. },
  45387. isItemInPoint: function(x, y, item) {
  45388. var point,
  45389. tolerance = 10,
  45390. abs = Math.abs;
  45391. point = item.point;
  45392. return (abs(point[0] - x) <= tolerance &&
  45393. abs(point[1] - y) <= tolerance);
  45394. },
  45395. onCreateLabel: function(storeItem, item, i, display) {
  45396. var me = this,
  45397. group = me.labelsGroup,
  45398. config = me.label,
  45399. centerX = me.centerX,
  45400. centerY = me.centerY,
  45401. point = item.point,
  45402. endLabelStyle = Ext.apply(me.seriesLabelStyle || {}, config);
  45403. return me.chart.surface.add(Ext.apply({
  45404. 'type': 'text',
  45405. 'text-anchor': 'middle',
  45406. 'group': group,
  45407. 'x': centerX,
  45408. 'y': centerY
  45409. }, config || {}));
  45410. },
  45411. onPlaceLabel: function(label, storeItem, item, i, display, animate) {
  45412. var me = this,
  45413. chart = me.chart,
  45414. resizing = chart.resizing,
  45415. config = me.label,
  45416. format = config.renderer,
  45417. field = config.field,
  45418. centerX = me.centerX,
  45419. centerY = me.centerY,
  45420. opt = {
  45421. x: item.point[0],
  45422. y: item.point[1]
  45423. },
  45424. x = opt.x - centerX,
  45425. y = opt.y - centerY;
  45426. label.setAttributes({
  45427. text: format(storeItem.get(field)),
  45428. hidden: true
  45429. },
  45430. true);
  45431. if (resizing) {
  45432. label.setAttributes({
  45433. x: centerX,
  45434. y: centerY
  45435. }, true);
  45436. }
  45437. if (animate) {
  45438. label.show(true);
  45439. me.onAnimate(label, {
  45440. to: opt
  45441. });
  45442. } else {
  45443. label.setAttributes(opt, true);
  45444. label.show(true);
  45445. }
  45446. },
  45447. toggleAll: function(show) {
  45448. var me = this,
  45449. i, ln, shadow, shadows;
  45450. if (!show) {
  45451. Ext.chart.series.Radar.superclass.hideAll.call(me);
  45452. }
  45453. else {
  45454. Ext.chart.series.Radar.superclass.showAll.call(me);
  45455. }
  45456. if (me.radar) {
  45457. me.radar.setAttributes({
  45458. hidden: !show
  45459. }, true);
  45460. if (me.radar.shadows) {
  45461. for (i = 0, shadows = me.radar.shadows, ln = shadows.length; i < ln; i++) {
  45462. shadow = shadows[i];
  45463. shadow.setAttributes({
  45464. hidden: !show
  45465. }, true);
  45466. }
  45467. }
  45468. }
  45469. },
  45470. hideAll: function() {
  45471. this.toggleAll(false);
  45472. this.hideMarkers(0);
  45473. },
  45474. showAll: function() {
  45475. this.toggleAll(true);
  45476. },
  45477. hideMarkers: function(index) {
  45478. var me = this,
  45479. count = me.markerGroup && me.markerGroup.getCount() || 0,
  45480. i = index || 0;
  45481. for (; i < count; i++) {
  45482. me.markerGroup.getAt(i).hide(true);
  45483. }
  45484. }
  45485. });
  45486. Ext.define('Ext.chart.series.Scatter', {
  45487. extend: 'Ext.chart.series.Cartesian',
  45488. requires: ['Ext.chart.axis.Axis', 'Ext.chart.Shape', 'Ext.fx.Anim'],
  45489. type: 'scatter',
  45490. alias: 'series.scatter',
  45491. constructor: function(config) {
  45492. this.callParent(arguments);
  45493. var me = this,
  45494. shadow = me.chart.shadow,
  45495. surface = me.chart.surface, i, l;
  45496. Ext.apply(me, config, {
  45497. style: {},
  45498. markerConfig: {},
  45499. shadowAttributes: [{
  45500. "stroke-width": 6,
  45501. "stroke-opacity": 0.05,
  45502. stroke: 'rgb(0, 0, 0)'
  45503. }, {
  45504. "stroke-width": 4,
  45505. "stroke-opacity": 0.1,
  45506. stroke: 'rgb(0, 0, 0)'
  45507. }, {
  45508. "stroke-width": 2,
  45509. "stroke-opacity": 0.15,
  45510. stroke: 'rgb(0, 0, 0)'
  45511. }]
  45512. });
  45513. me.group = surface.getGroup(me.seriesId);
  45514. if (shadow) {
  45515. for (i = 0, l = me.shadowAttributes.length; i < l; i++) {
  45516. me.shadowGroups.push(surface.getGroup(me.seriesId + '-shadows' + i));
  45517. }
  45518. }
  45519. },
  45520. getBounds: function() {
  45521. var me = this,
  45522. chart = me.chart,
  45523. store = chart.getChartStore(),
  45524. chartAxes = chart.axes,
  45525. boundAxes = me.getAxesForXAndYFields(),
  45526. boundXAxis = boundAxes.xAxis,
  45527. boundYAxis = boundAxes.yAxis,
  45528. bbox, xScale, yScale, ln, minX, minY, maxX, maxY, i, axis, ends;
  45529. me.setBBox();
  45530. bbox = me.bbox;
  45531. if (axis = chartAxes.get(boundXAxis)) {
  45532. ends = axis.applyData();
  45533. minX = ends.from;
  45534. maxX = ends.to;
  45535. }
  45536. if (axis = chartAxes.get(boundYAxis)) {
  45537. ends = axis.applyData();
  45538. minY = ends.from;
  45539. maxY = ends.to;
  45540. }
  45541. if (me.xField && !Ext.isNumber(minX)) {
  45542. axis = me.getMinMaxXValues();
  45543. minX = axis[0];
  45544. maxX = axis[1];
  45545. }
  45546. if (me.yField && !Ext.isNumber(minY)) {
  45547. axis = me.getMinMaxYValues();
  45548. minY = axis[0];
  45549. maxY = axis[1];
  45550. }
  45551. if (isNaN(minX)) {
  45552. minX = 0;
  45553. maxX = store.getCount() - 1;
  45554. xScale = bbox.width / (store.getCount() - 1);
  45555. }
  45556. else {
  45557. xScale = bbox.width / (maxX - minX);
  45558. }
  45559. if (isNaN(minY)) {
  45560. minY = 0;
  45561. maxY = store.getCount() - 1;
  45562. yScale = bbox.height / (store.getCount() - 1);
  45563. }
  45564. else {
  45565. yScale = bbox.height / (maxY - minY);
  45566. }
  45567. return {
  45568. bbox: bbox,
  45569. minX: minX,
  45570. minY: minY,
  45571. xScale: xScale,
  45572. yScale: yScale
  45573. };
  45574. },
  45575. getPaths: function() {
  45576. var me = this,
  45577. chart = me.chart,
  45578. enableShadows = chart.shadow,
  45579. store = chart.getChartStore(),
  45580. data = store.data.items,
  45581. i, ln, record,
  45582. group = me.group,
  45583. bounds = me.bounds = me.getBounds(),
  45584. bbox = me.bbox,
  45585. xScale = bounds.xScale,
  45586. yScale = bounds.yScale,
  45587. minX = bounds.minX,
  45588. minY = bounds.minY,
  45589. boxX = bbox.x,
  45590. boxY = bbox.y,
  45591. boxHeight = bbox.height,
  45592. items = me.items = [],
  45593. attrs = [],
  45594. x, y, xValue, yValue, sprite;
  45595. for (i = 0, ln = data.length; i < ln; i++) {
  45596. record = data[i];
  45597. xValue = record.get(me.xField);
  45598. yValue = record.get(me.yField);
  45599. if (typeof yValue == 'undefined' || (typeof yValue == 'string' && !yValue)
  45600. || xValue == null || yValue == null) {
  45601. continue;
  45602. }
  45603. if (typeof xValue == 'string' || typeof xValue == 'object' && !Ext.isDate(xValue)) {
  45604. xValue = i;
  45605. }
  45606. if (typeof yValue == 'string' || typeof yValue == 'object' && !Ext.isDate(yValue)) {
  45607. yValue = i;
  45608. }
  45609. x = boxX + (xValue - minX) * xScale;
  45610. y = boxY + boxHeight - (yValue - minY) * yScale;
  45611. attrs.push({
  45612. x: x,
  45613. y: y
  45614. });
  45615. me.items.push({
  45616. series: me,
  45617. value: [xValue, yValue],
  45618. point: [x, y],
  45619. storeItem: record
  45620. });
  45621. if (chart.animate && chart.resizing) {
  45622. sprite = group.getAt(i);
  45623. if (sprite) {
  45624. me.resetPoint(sprite);
  45625. if (enableShadows) {
  45626. me.resetShadow(sprite);
  45627. }
  45628. }
  45629. }
  45630. }
  45631. return attrs;
  45632. },
  45633. resetPoint: function(sprite) {
  45634. var bbox = this.bbox;
  45635. sprite.setAttributes({
  45636. translate: {
  45637. x: (bbox.x + bbox.width) / 2,
  45638. y: (bbox.y + bbox.height) / 2
  45639. }
  45640. }, true);
  45641. },
  45642. resetShadow: function(sprite) {
  45643. var me = this,
  45644. shadows = sprite.shadows,
  45645. shadowAttributes = me.shadowAttributes,
  45646. ln = me.shadowGroups.length,
  45647. bbox = me.bbox,
  45648. i, attr;
  45649. for (i = 0; i < ln; i++) {
  45650. attr = Ext.apply({}, shadowAttributes[i]);
  45651. if (attr.translate) {
  45652. attr.translate.x += (bbox.x + bbox.width) / 2;
  45653. attr.translate.y += (bbox.y + bbox.height) / 2;
  45654. }
  45655. else {
  45656. attr.translate = {
  45657. x: (bbox.x + bbox.width) / 2,
  45658. y: (bbox.y + bbox.height) / 2
  45659. };
  45660. }
  45661. shadows[i].setAttributes(attr, true);
  45662. }
  45663. },
  45664. createPoint: function(attr, type) {
  45665. var me = this,
  45666. chart = me.chart,
  45667. group = me.group,
  45668. bbox = me.bbox;
  45669. return Ext.chart.Shape[type](chart.surface, Ext.apply({}, {
  45670. x: 0,
  45671. y: 0,
  45672. group: group,
  45673. translate: {
  45674. x: (bbox.x + bbox.width) / 2,
  45675. y: (bbox.y + bbox.height) / 2
  45676. }
  45677. }, attr));
  45678. },
  45679. createShadow: function(sprite, endMarkerStyle, type) {
  45680. var me = this,
  45681. chart = me.chart,
  45682. shadowGroups = me.shadowGroups,
  45683. shadowAttributes = me.shadowAttributes,
  45684. lnsh = shadowGroups.length,
  45685. bbox = me.bbox,
  45686. i, shadow, shadows, attr;
  45687. sprite.shadows = shadows = [];
  45688. for (i = 0; i < lnsh; i++) {
  45689. attr = Ext.apply({}, shadowAttributes[i]);
  45690. if (attr.translate) {
  45691. attr.translate.x += (bbox.x + bbox.width) / 2;
  45692. attr.translate.y += (bbox.y + bbox.height) / 2;
  45693. }
  45694. else {
  45695. Ext.apply(attr, {
  45696. translate: {
  45697. x: (bbox.x + bbox.width) / 2,
  45698. y: (bbox.y + bbox.height) / 2
  45699. }
  45700. });
  45701. }
  45702. Ext.apply(attr, endMarkerStyle);
  45703. shadow = Ext.chart.Shape[type](chart.surface, Ext.apply({}, {
  45704. x: 0,
  45705. y: 0,
  45706. group: shadowGroups[i]
  45707. }, attr));
  45708. shadows.push(shadow);
  45709. }
  45710. },
  45711. drawSeries: function() {
  45712. var me = this,
  45713. chart = me.chart,
  45714. store = chart.getChartStore(),
  45715. group = me.group,
  45716. enableShadows = chart.shadow,
  45717. shadowGroups = me.shadowGroups,
  45718. shadowAttributes = me.shadowAttributes,
  45719. lnsh = shadowGroups.length,
  45720. sprite, attrs, attr, ln, i, endMarkerStyle, shindex, type, shadows,
  45721. rendererAttributes, shadowAttribute;
  45722. endMarkerStyle = Ext.apply(me.markerStyle, me.markerConfig);
  45723. type = endMarkerStyle.type;
  45724. delete endMarkerStyle.type;
  45725. if (!store || !store.getCount()) {
  45726. me.hide();
  45727. me.items = [];
  45728. return;
  45729. }
  45730. me.unHighlightItem();
  45731. me.cleanHighlights();
  45732. attrs = me.getPaths();
  45733. ln = attrs.length;
  45734. for (i = 0; i < ln; i++) {
  45735. attr = attrs[i];
  45736. sprite = group.getAt(i);
  45737. Ext.apply(attr, endMarkerStyle);
  45738. if (!sprite) {
  45739. sprite = me.createPoint(attr, type);
  45740. if (enableShadows) {
  45741. me.createShadow(sprite, endMarkerStyle, type);
  45742. }
  45743. }
  45744. shadows = sprite.shadows;
  45745. if (chart.animate) {
  45746. rendererAttributes = me.renderer(sprite, store.getAt(i), { translate: attr }, i, store);
  45747. sprite._to = rendererAttributes;
  45748. me.onAnimate(sprite, {
  45749. to: rendererAttributes
  45750. });
  45751. for (shindex = 0; shindex < lnsh; shindex++) {
  45752. shadowAttribute = Ext.apply({}, shadowAttributes[shindex]);
  45753. rendererAttributes = me.renderer(shadows[shindex], store.getAt(i), Ext.apply({}, {
  45754. hidden: false,
  45755. translate: {
  45756. x: attr.x + (shadowAttribute.translate? shadowAttribute.translate.x : 0),
  45757. y: attr.y + (shadowAttribute.translate? shadowAttribute.translate.y : 0)
  45758. }
  45759. }, shadowAttribute), i, store);
  45760. me.onAnimate(shadows[shindex], { to: rendererAttributes });
  45761. }
  45762. }
  45763. else {
  45764. rendererAttributes = me.renderer(sprite, store.getAt(i), { translate: attr }, i, store);
  45765. sprite._to = rendererAttributes;
  45766. sprite.setAttributes(rendererAttributes, true);
  45767. for (shindex = 0; shindex < lnsh; shindex++) {
  45768. shadowAttribute = Ext.apply({}, shadowAttributes[shindex]);
  45769. rendererAttributes = me.renderer(shadows[shindex], store.getAt(i), Ext.apply({}, {
  45770. hidden: false,
  45771. translate: {
  45772. x: attr.x + (shadowAttribute.translate? shadowAttribute.translate.x : 0),
  45773. y: attr.y + (shadowAttribute.translate? shadowAttribute.translate.y : 0)
  45774. }
  45775. }, shadowAttribute), i, store);
  45776. shadows[shindex].setAttributes(rendererAttributes, true);
  45777. }
  45778. }
  45779. me.items[i].sprite = sprite;
  45780. }
  45781. ln = group.getCount();
  45782. for (i = attrs.length; i < ln; i++) {
  45783. group.getAt(i).hide(true);
  45784. }
  45785. me.renderLabels();
  45786. me.renderCallouts();
  45787. },
  45788. onCreateLabel: function(storeItem, item, i, display) {
  45789. var me = this,
  45790. group = me.labelsGroup,
  45791. config = me.label,
  45792. endLabelStyle = Ext.apply({}, config, me.seriesLabelStyle),
  45793. bbox = me.bbox;
  45794. return me.chart.surface.add(Ext.apply({
  45795. type: 'text',
  45796. group: group,
  45797. x: item.point[0],
  45798. y: bbox.y + bbox.height / 2
  45799. }, endLabelStyle));
  45800. },
  45801. onPlaceLabel: function(label, storeItem, item, i, display, animate) {
  45802. var me = this,
  45803. chart = me.chart,
  45804. resizing = chart.resizing,
  45805. config = me.label,
  45806. format = config.renderer,
  45807. field = config.field,
  45808. bbox = me.bbox,
  45809. x = item.point[0],
  45810. y = item.point[1],
  45811. radius = item.sprite.attr.radius,
  45812. bb, width, height, anim;
  45813. label.setAttributes({
  45814. text: format(storeItem.get(field)),
  45815. hidden: true
  45816. }, true);
  45817. if (display == 'rotate') {
  45818. label.setAttributes({
  45819. 'text-anchor': 'start',
  45820. 'rotation': {
  45821. x: x,
  45822. y: y,
  45823. degrees: -45
  45824. }
  45825. }, true);
  45826. bb = label.getBBox();
  45827. width = bb.width;
  45828. height = bb.height;
  45829. x = x < bbox.x? bbox.x : x;
  45830. x = (x + width > bbox.x + bbox.width)? (x - (x + width - bbox.x - bbox.width)) : x;
  45831. y = (y - height < bbox.y)? bbox.y + height : y;
  45832. } else if (display == 'under' || display == 'over') {
  45833. bb = item.sprite.getBBox();
  45834. bb.width = bb.width || (radius * 2);
  45835. bb.height = bb.height || (radius * 2);
  45836. y = y + (display == 'over'? -bb.height : bb.height);
  45837. bb = label.getBBox();
  45838. width = bb.width/2;
  45839. height = bb.height/2;
  45840. x = x - width < bbox.x ? bbox.x + width : x;
  45841. x = (x + width > bbox.x + bbox.width) ? (x - (x + width - bbox.x - bbox.width)) : x;
  45842. y = y - height < bbox.y? bbox.y + height : y;
  45843. y = (y + height > bbox.y + bbox.height) ? (y - (y + height - bbox.y - bbox.height)) : y;
  45844. }
  45845. if (!chart.animate) {
  45846. label.setAttributes({
  45847. x: x,
  45848. y: y
  45849. }, true);
  45850. label.show(true);
  45851. }
  45852. else {
  45853. if (resizing) {
  45854. anim = item.sprite.getActiveAnimation();
  45855. if (anim) {
  45856. anim.on('afteranimate', function() {
  45857. label.setAttributes({
  45858. x: x,
  45859. y: y
  45860. }, true);
  45861. label.show(true);
  45862. });
  45863. }
  45864. else {
  45865. label.show(true);
  45866. }
  45867. }
  45868. else {
  45869. me.onAnimate(label, {
  45870. to: {
  45871. x: x,
  45872. y: y
  45873. }
  45874. });
  45875. }
  45876. }
  45877. },
  45878. onPlaceCallout: function(callout, storeItem, item, i, display, animate, index) {
  45879. var me = this,
  45880. chart = me.chart,
  45881. surface = chart.surface,
  45882. resizing = chart.resizing,
  45883. config = me.callouts,
  45884. items = me.items,
  45885. cur = item.point,
  45886. normal,
  45887. bbox = callout.label.getBBox(),
  45888. offsetFromViz = 30,
  45889. offsetToSide = 10,
  45890. offsetBox = 3,
  45891. boxx, boxy, boxw, boxh,
  45892. p, clipRect = me.bbox,
  45893. x, y;
  45894. normal = [Math.cos(Math.PI /4), -Math.sin(Math.PI /4)];
  45895. x = cur[0] + normal[0] * offsetFromViz;
  45896. y = cur[1] + normal[1] * offsetFromViz;
  45897. boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
  45898. boxy = y - bbox.height /2 - offsetBox;
  45899. boxw = bbox.width + 2 * offsetBox;
  45900. boxh = bbox.height + 2 * offsetBox;
  45901. if (boxx < clipRect[0] || (boxx + boxw) > (clipRect[0] + clipRect[2])) {
  45902. normal[0] *= -1;
  45903. }
  45904. if (boxy < clipRect[1] || (boxy + boxh) > (clipRect[1] + clipRect[3])) {
  45905. normal[1] *= -1;
  45906. }
  45907. x = cur[0] + normal[0] * offsetFromViz;
  45908. y = cur[1] + normal[1] * offsetFromViz;
  45909. boxx = x + (normal[0] > 0? 0 : -(bbox.width + 2 * offsetBox));
  45910. boxy = y - bbox.height /2 - offsetBox;
  45911. boxw = bbox.width + 2 * offsetBox;
  45912. boxh = bbox.height + 2 * offsetBox;
  45913. if (chart.animate) {
  45914. me.onAnimate(callout.lines, {
  45915. to: {
  45916. path: ["M", cur[0], cur[1], "L", x, y, "Z"]
  45917. }
  45918. }, true);
  45919. me.onAnimate(callout.box, {
  45920. to: {
  45921. x: boxx,
  45922. y: boxy,
  45923. width: boxw,
  45924. height: boxh
  45925. }
  45926. }, true);
  45927. me.onAnimate(callout.label, {
  45928. to: {
  45929. x: x + (normal[0] > 0? offsetBox : -(bbox.width + offsetBox)),
  45930. y: y
  45931. }
  45932. }, true);
  45933. } else {
  45934. callout.lines.setAttributes({
  45935. path: ["M", cur[0], cur[1], "L", x, y, "Z"]
  45936. }, true);
  45937. callout.box.setAttributes({
  45938. x: boxx,
  45939. y: boxy,
  45940. width: boxw,
  45941. height: boxh
  45942. }, true);
  45943. callout.label.setAttributes({
  45944. x: x + (normal[0] > 0? offsetBox : -(bbox.width + offsetBox)),
  45945. y: y
  45946. }, true);
  45947. }
  45948. for (p in callout) {
  45949. callout[p].show(true);
  45950. }
  45951. },
  45952. onAnimate: function(sprite, attr) {
  45953. sprite.show();
  45954. return this.callParent(arguments);
  45955. },
  45956. isItemInPoint: function(x, y, item) {
  45957. var point,
  45958. tolerance = 10,
  45959. abs = Math.abs;
  45960. function dist(point) {
  45961. var dx = abs(point[0] - x),
  45962. dy = abs(point[1] - y);
  45963. return Math.sqrt(dx * dx + dy * dy);
  45964. }
  45965. point = item.point;
  45966. return (point[0] - tolerance <= x && point[0] + tolerance >= x &&
  45967. point[1] - tolerance <= y && point[1] + tolerance >= y);
  45968. }
  45969. });
  45970. Ext.define('Ext.layout.container.Table', {
  45971. alias: ['layout.table'],
  45972. extend: 'Ext.layout.container.Container',
  45973. alternateClassName: 'Ext.layout.TableLayout',
  45974. monitorResize:false,
  45975. type: 'table',
  45976. clearEl: true,
  45977. targetCls: Ext.baseCSSPrefix + 'table-layout-ct',
  45978. tableCls: Ext.baseCSSPrefix + 'table-layout',
  45979. cellCls: Ext.baseCSSPrefix + 'table-layout-cell',
  45980. tableAttrs: null,
  45981. itemSizePolicy: {
  45982. setsWidth: 0,
  45983. setsHeight: 0
  45984. },
  45985. getItemSizePolicy: function (item) {
  45986. return this.itemSizePolicy;
  45987. },
  45988. getLayoutItems: function() {
  45989. var me = this,
  45990. result = [],
  45991. items = me.callParent(),
  45992. item,
  45993. len = items.length, i;
  45994. for (i = 0; i < len; i++) {
  45995. item = items[i];
  45996. if (!item.hidden) {
  45997. result.push(item);
  45998. }
  45999. }
  46000. return result;
  46001. },
  46002. renderChildren: function() {
  46003. var me = this,
  46004. items = me.getLayoutItems(),
  46005. tbody = me.owner.getTargetEl().child('table', true).tBodies[0],
  46006. rows = tbody.rows,
  46007. i = 0,
  46008. len = items.length,
  46009. cells, curCell, rowIdx, cellIdx, item, trEl, tdEl, itemCt;
  46010. cells = me.calculateCells(items);
  46011. for (; i < len; i++) {
  46012. curCell = cells[i];
  46013. rowIdx = curCell.rowIdx;
  46014. cellIdx = curCell.cellIdx;
  46015. item = items[i];
  46016. trEl = rows[rowIdx];
  46017. if (!trEl) {
  46018. trEl = tbody.insertRow(rowIdx);
  46019. if (me.trAttrs) {
  46020. trEl.set(me.trAttrs);
  46021. }
  46022. }
  46023. itemCt = tdEl = Ext.get(trEl.cells[cellIdx] || trEl.insertCell(cellIdx));
  46024. if (me.needsDivWrap()) {
  46025. itemCt = tdEl.first() || tdEl.createChild({tag: 'div'});
  46026. itemCt.setWidth(null);
  46027. }
  46028. if (!item.rendered) {
  46029. me.renderItem(item, itemCt, 0);
  46030. }
  46031. else if (!me.isValidParent(item, itemCt, rowIdx, cellIdx, tbody)) {
  46032. me.moveItem(item, itemCt, 0);
  46033. }
  46034. if (me.tdAttrs) {
  46035. tdEl.set(me.tdAttrs);
  46036. }
  46037. if (item.tdAttrs) {
  46038. tdEl.set(item.tdAttrs);
  46039. }
  46040. tdEl.set({
  46041. colSpan: item.colspan || 1,
  46042. rowSpan: item.rowspan || 1,
  46043. id: item.cellId || '',
  46044. cls: me.cellCls + ' ' + (item.cellCls || '')
  46045. });
  46046. if (!cells[i + 1] || cells[i + 1].rowIdx !== rowIdx) {
  46047. cellIdx++;
  46048. while (trEl.cells[cellIdx]) {
  46049. trEl.deleteCell(cellIdx);
  46050. }
  46051. }
  46052. }
  46053. rowIdx++;
  46054. while (tbody.rows[rowIdx]) {
  46055. tbody.deleteRow(rowIdx);
  46056. }
  46057. },
  46058. calculate: function (ownerContext) {
  46059. if (!ownerContext.hasDomProp('containerChildrenDone')) {
  46060. this.done = false;
  46061. } else {
  46062. var targetContext = ownerContext.targetContext,
  46063. widthShrinkWrap = ownerContext.widthModel.shrinkWrap,
  46064. heightShrinkWrap = ownerContext.heightModel.shrinkWrap,
  46065. shrinkWrap = heightShrinkWrap || widthShrinkWrap,
  46066. table = shrinkWrap && targetContext.el.child('table', true),
  46067. targetPadding = shrinkWrap && targetContext.getPaddingInfo();
  46068. if (widthShrinkWrap) {
  46069. ownerContext.setContentWidth(table.offsetWidth + targetPadding.width, true);
  46070. }
  46071. if (heightShrinkWrap) {
  46072. ownerContext.setContentHeight(table.offsetHeight + targetPadding.height, true);
  46073. }
  46074. }
  46075. },
  46076. finalizeLayout: function() {
  46077. if (this.needsDivWrap()) {
  46078. var items = this.getLayoutItems(),
  46079. i,
  46080. iLen = items.length,
  46081. item;
  46082. for (i = 0; i < iLen; i++) {
  46083. item = items[i];
  46084. Ext.fly(item.el.dom.parentNode).setWidth(item.getWidth());
  46085. }
  46086. }
  46087. if (Ext.isIE6 || (Ext.isIEQuirks)) {
  46088. this.owner.getTargetEl().child('table').repaint();
  46089. }
  46090. },
  46091. calculateCells: function(items) {
  46092. var cells = [],
  46093. rowIdx = 0,
  46094. colIdx = 0,
  46095. cellIdx = 0,
  46096. totalCols = this.columns || Infinity,
  46097. rowspans = [],
  46098. i = 0, j,
  46099. len = items.length,
  46100. item;
  46101. for (; i < len; i++) {
  46102. item = items[i];
  46103. while (colIdx >= totalCols || rowspans[colIdx] > 0) {
  46104. if (colIdx >= totalCols) {
  46105. colIdx = 0;
  46106. cellIdx = 0;
  46107. rowIdx++;
  46108. for (j = 0; j < totalCols; j++) {
  46109. if (rowspans[j] > 0) {
  46110. rowspans[j]--;
  46111. }
  46112. }
  46113. } else {
  46114. colIdx++;
  46115. }
  46116. }
  46117. cells.push({
  46118. rowIdx: rowIdx,
  46119. cellIdx: cellIdx
  46120. });
  46121. for (j = item.colspan || 1; j; --j) {
  46122. rowspans[colIdx] = item.rowspan || 1;
  46123. ++colIdx;
  46124. }
  46125. ++cellIdx;
  46126. }
  46127. return cells;
  46128. },
  46129. getRenderTree: function() {
  46130. var me = this,
  46131. items = me.getLayoutItems(),
  46132. cells,
  46133. rows = [],
  46134. result = Ext.apply({
  46135. tag: 'table',
  46136. role: 'presentation',
  46137. cls: me.tableCls,
  46138. cellspacing: 0,
  46139. cn: {
  46140. tag: 'tbody',
  46141. cn: rows
  46142. }
  46143. }, me.tableAttrs),
  46144. tdAttrs = me.tdAttrs,
  46145. needsDivWrap = me.needsDivWrap(),
  46146. i, len = items.length, item, curCell, tr, rowIdx, cellIdx, cell;
  46147. cells = me.calculateCells(items);
  46148. for (i = 0; i < len; i++) {
  46149. item = items[i];
  46150. curCell = cells[i];
  46151. rowIdx = curCell.rowIdx;
  46152. cellIdx = curCell.cellIdx;
  46153. tr = rows[rowIdx];
  46154. if (!tr) {
  46155. tr = rows[rowIdx] = {
  46156. tag: 'tr',
  46157. cn: []
  46158. };
  46159. if (me.trAttrs) {
  46160. Ext.apply(tr, me.trAttrs);
  46161. }
  46162. }
  46163. cell = tr.cn[cellIdx] = {
  46164. tag: 'td'
  46165. };
  46166. if (tdAttrs) {
  46167. Ext.apply(cell, tdAttrs);
  46168. }
  46169. Ext.apply(cell, {
  46170. colSpan: item.colspan || 1,
  46171. rowSpan: item.rowspan || 1,
  46172. id: item.cellId || '',
  46173. cls: me.cellCls + ' ' + (item.cellCls || '')
  46174. });
  46175. if (needsDivWrap) {
  46176. cell = cell.cn = {
  46177. tag: 'div'
  46178. };
  46179. }
  46180. me.configureItem(item);
  46181. cell.cn = item.getRenderTree();
  46182. }
  46183. return result;
  46184. },
  46185. isValidParent: function(item, target, rowIdx, cellIdx) {
  46186. var tbody,
  46187. correctCell,
  46188. table;
  46189. if (arguments.length === 3) {
  46190. table = item.el.up('table');
  46191. return table && table.dom.parentNode === target.dom;
  46192. }
  46193. tbody = this.owner.getTargetEl().child('table', true).tBodies[0];
  46194. correctCell = tbody.rows[rowIdx].cells[cellIdx];
  46195. return item.el.dom.parentNode === correctCell;
  46196. },
  46197. needsDivWrap: function() {
  46198. return Ext.isOpera10_5;
  46199. }
  46200. });
  46201. Ext.define('Ext.container.ButtonGroup', {
  46202. extend: 'Ext.panel.Panel',
  46203. alias: 'widget.buttongroup',
  46204. alternateClassName: 'Ext.ButtonGroup',
  46205. requires: ['Ext.layout.container.Table'],
  46206. baseCls: Ext.baseCSSPrefix + 'btn-group',
  46207. layout: {
  46208. type: 'table'
  46209. },
  46210. defaultType: 'button',
  46211. frame: true,
  46212. frameHeader: false,
  46213. titleAlign: 'center',
  46214. initComponent : function() {
  46215. var me = this,
  46216. cols = me.columns;
  46217. me.noTitleCls = me.baseCls + '-notitle';
  46218. if (cols) {
  46219. me.layout = Ext.apply({}, {columns: cols}, me.layout);
  46220. }
  46221. if (!me.title) {
  46222. me.addCls(me.noTitleCls);
  46223. }
  46224. me.callParent(arguments);
  46225. },
  46226. onBeforeAdd: function(component) {
  46227. if (component.isButton) {
  46228. component.ui = component.ui + '-toolbar';
  46229. }
  46230. this.callParent(arguments);
  46231. },
  46232. applyDefaults: function(c) {
  46233. if (!Ext.isString(c)) {
  46234. c = this.callParent(arguments);
  46235. }
  46236. return c;
  46237. }
  46238. });
  46239. Ext.define('Ext.container.Viewport', {
  46240. extend: 'Ext.container.Container',
  46241. alias: 'widget.viewport',
  46242. requires: ['Ext.EventManager'],
  46243. alternateClassName: 'Ext.Viewport',
  46244. isViewport: true,
  46245. ariaRole: 'application',
  46246. preserveElOnDestroy: true,
  46247. initComponent : function() {
  46248. var me = this,
  46249. html = document.body.parentNode,
  46250. el;
  46251. Ext.getScrollbarSize();
  46252. me.width = me.height = undefined;
  46253. me.callParent(arguments);
  46254. Ext.fly(html).addCls(Ext.baseCSSPrefix + 'viewport');
  46255. if (me.autoScroll) {
  46256. delete me.autoScroll;
  46257. Ext.fly(html).setStyle('overflow', 'auto');
  46258. }
  46259. me.el = el = Ext.getBody();
  46260. el.setHeight = Ext.emptyFn;
  46261. el.setWidth = Ext.emptyFn;
  46262. el.setSize = Ext.emptyFn;
  46263. el.dom.scroll = 'no';
  46264. me.allowDomMove = false;
  46265. me.renderTo = me.el;
  46266. },
  46267. onRender: function() {
  46268. var me = this;
  46269. me.callParent(arguments);
  46270. me.width = Ext.Element.getViewportWidth();
  46271. me.height = Ext.Element.getViewportHeight();
  46272. },
  46273. afterFirstLayout: function() {
  46274. var me = this;
  46275. me.callParent(arguments);
  46276. setTimeout(function() {
  46277. Ext.EventManager.onWindowResize(me.fireResize, me);
  46278. }, 1);
  46279. },
  46280. fireResize : function(width, height){
  46281. if (width != this.width || height != this.height) {
  46282. this.setSize(width, height);
  46283. }
  46284. }
  46285. });
  46286. Ext.define('Ext.data.proxy.Proxy', {
  46287. alias: 'proxy.proxy',
  46288. alternateClassName: ['Ext.data.DataProxy', 'Ext.data.Proxy'],
  46289. uses: [
  46290. 'Ext.data.Batch',
  46291. 'Ext.data.Operation',
  46292. 'Ext.data.Model'
  46293. ],
  46294. mixins: {
  46295. observable: 'Ext.util.Observable'
  46296. },
  46297. batchOrder: 'create,update,destroy',
  46298. batchActions: true,
  46299. defaultReaderType: 'json',
  46300. defaultWriterType: 'json',
  46301. isProxy: true,
  46302. constructor: function(config) {
  46303. config = config || {};
  46304. if (config.model === undefined) {
  46305. delete config.model;
  46306. }
  46307. this.mixins.observable.constructor.call(this, config);
  46308. if (this.model !== undefined && !(this.model instanceof Ext.data.Model)) {
  46309. this.setModel(this.model);
  46310. }
  46311. },
  46312. setModel: function(model, setOnStore) {
  46313. this.model = Ext.ModelManager.getModel(model);
  46314. var reader = this.reader,
  46315. writer = this.writer;
  46316. this.setReader(reader);
  46317. this.setWriter(writer);
  46318. if (setOnStore && this.store) {
  46319. this.store.setModel(this.model);
  46320. }
  46321. },
  46322. getModel: function() {
  46323. return this.model;
  46324. },
  46325. setReader: function(reader) {
  46326. var me = this,
  46327. needsCopy = true;
  46328. if (reader === undefined || typeof reader == 'string') {
  46329. reader = {
  46330. type: reader
  46331. };
  46332. needsCopy = false;
  46333. }
  46334. if (reader.isReader) {
  46335. reader.setModel(me.model);
  46336. } else {
  46337. if (needsCopy) {
  46338. reader = Ext.apply({}, reader);
  46339. }
  46340. Ext.applyIf(reader, {
  46341. proxy: me,
  46342. model: me.model,
  46343. type : me.defaultReaderType
  46344. });
  46345. reader = Ext.createByAlias('reader.' + reader.type, reader);
  46346. }
  46347. if (reader.onMetaChange) {
  46348. reader.onMetaChange = Ext.Function.createSequence(reader.onMetaChange, this.onMetaChange, this);
  46349. }
  46350. me.reader = reader;
  46351. return me.reader;
  46352. },
  46353. getReader: function() {
  46354. return this.reader;
  46355. },
  46356. onMetaChange: function(meta) {
  46357. this.fireEvent('metachange', this, meta);
  46358. },
  46359. setWriter: function(writer) {
  46360. var me = this,
  46361. needsCopy = true;
  46362. if (writer === undefined || typeof writer == 'string') {
  46363. writer = {
  46364. type: writer
  46365. };
  46366. needsCopy = false;
  46367. }
  46368. if (!writer.isWriter) {
  46369. if (needsCopy) {
  46370. writer = Ext.apply({}, writer);
  46371. }
  46372. Ext.applyIf(writer, {
  46373. model: me.model,
  46374. type : me.defaultWriterType
  46375. });
  46376. writer = Ext.createByAlias('writer.' + writer.type, writer);
  46377. }
  46378. me.writer = writer;
  46379. return me.writer;
  46380. },
  46381. getWriter: function() {
  46382. return this.writer;
  46383. },
  46384. create: Ext.emptyFn,
  46385. read: Ext.emptyFn,
  46386. update: Ext.emptyFn,
  46387. destroy: Ext.emptyFn,
  46388. batch: function(options, listeners) {
  46389. var me = this,
  46390. useBatch = me.batchActions,
  46391. batch,
  46392. records,
  46393. actions, aLen, action, a, r, rLen, record;
  46394. if (options.operations === undefined) {
  46395. options = {
  46396. operations: options,
  46397. listeners: listeners
  46398. };
  46399. }
  46400. if (options.batch) {
  46401. if (Ext.isDefined(options.batch.runOperation)) {
  46402. batch = Ext.applyIf(options.batch, {
  46403. proxy: me,
  46404. listeners: {}
  46405. });
  46406. }
  46407. } else {
  46408. options.batch = {
  46409. proxy: me,
  46410. listeners: options.listeners || {}
  46411. };
  46412. }
  46413. if (!batch) {
  46414. batch = new Ext.data.Batch(options.batch);
  46415. }
  46416. batch.on('complete', Ext.bind(me.onBatchComplete, me, [options], 0));
  46417. actions = me.batchOrder.split(',');
  46418. aLen = actions.length;
  46419. for (a = 0; a < aLen; a++) {
  46420. action = actions[a];
  46421. records = options.operations[action];
  46422. if (records) {
  46423. if (useBatch) {
  46424. batch.add(new Ext.data.Operation({
  46425. action : action,
  46426. records : records
  46427. }));
  46428. } else {
  46429. rLen = records.length;
  46430. for (r = 0; r < rLen; r++) {
  46431. record = records[r];
  46432. batch.add(new Ext.data.Operation({
  46433. action : action,
  46434. records : [record]
  46435. }));
  46436. }
  46437. }
  46438. }
  46439. }
  46440. batch.start();
  46441. return batch;
  46442. },
  46443. onBatchComplete: function(batchOptions, batch) {
  46444. var scope = batchOptions.scope || this;
  46445. if (batch.hasException) {
  46446. if (Ext.isFunction(batchOptions.failure)) {
  46447. Ext.callback(batchOptions.failure, scope, [batch, batchOptions]);
  46448. }
  46449. } else if (Ext.isFunction(batchOptions.success)) {
  46450. Ext.callback(batchOptions.success, scope, [batch, batchOptions]);
  46451. }
  46452. if (Ext.isFunction(batchOptions.callback)) {
  46453. Ext.callback(batchOptions.callback, scope, [batch, batchOptions]);
  46454. }
  46455. }
  46456. }, function() {
  46457. Ext.data.DataProxy = this;
  46458. });
  46459. Ext.define('Ext.data.AbstractStore', {
  46460. requires: [
  46461. 'Ext.util.MixedCollection',
  46462. 'Ext.data.proxy.Proxy',
  46463. 'Ext.data.Operation',
  46464. 'Ext.util.Filter'
  46465. ],
  46466. mixins: {
  46467. observable: 'Ext.util.Observable',
  46468. sortable: 'Ext.util.Sortable'
  46469. },
  46470. statics: {
  46471. create: function(store) {
  46472. if (!store.isStore) {
  46473. if (!store.type) {
  46474. store.type = 'store';
  46475. }
  46476. store = Ext.createByAlias('store.' + store.type, store);
  46477. }
  46478. return store;
  46479. }
  46480. },
  46481. remoteSort : false,
  46482. remoteFilter: false,
  46483. autoLoad: undefined,
  46484. autoSync: false,
  46485. batchUpdateMode: 'operation',
  46486. filterOnLoad: true,
  46487. sortOnLoad: true,
  46488. implicitModel: false,
  46489. defaultProxyType: 'memory',
  46490. isDestroyed: false,
  46491. isStore: true,
  46492. sortRoot: 'data',
  46493. constructor: function(config) {
  46494. var me = this,
  46495. filters;
  46496. Ext.apply(me, config);
  46497. me.removed = [];
  46498. me.mixins.observable.constructor.apply(me, arguments);
  46499. me.model = Ext.ModelManager.getModel(me.model);
  46500. Ext.applyIf(me, {
  46501. modelDefaults: {}
  46502. });
  46503. if (!me.model && me.fields) {
  46504. me.model = Ext.define('Ext.data.Store.ImplicitModel-' + (me.storeId || Ext.id()), {
  46505. extend: 'Ext.data.Model',
  46506. fields: me.fields,
  46507. proxy: me.proxy || me.defaultProxyType
  46508. });
  46509. delete me.fields;
  46510. me.implicitModel = true;
  46511. }
  46512. me.setProxy(me.proxy || me.model.getProxy());
  46513. me.proxy.on('metachange', me.onMetaChange, me);
  46514. if (me.id && !me.storeId) {
  46515. me.storeId = me.id;
  46516. delete me.id;
  46517. }
  46518. if (me.storeId) {
  46519. Ext.data.StoreManager.register(me);
  46520. }
  46521. me.mixins.sortable.initSortable.call(me);
  46522. filters = me.decodeFilters(me.filters);
  46523. me.filters = new Ext.util.MixedCollection();
  46524. me.filters.addAll(filters);
  46525. },
  46526. setProxy: function(proxy) {
  46527. var me = this;
  46528. if (proxy instanceof Ext.data.proxy.Proxy) {
  46529. proxy.setModel(me.model);
  46530. } else {
  46531. if (Ext.isString(proxy)) {
  46532. proxy = {
  46533. type: proxy
  46534. };
  46535. }
  46536. Ext.applyIf(proxy, {
  46537. model: me.model
  46538. });
  46539. proxy = Ext.createByAlias('proxy.' + proxy.type, proxy);
  46540. }
  46541. me.proxy = proxy;
  46542. return me.proxy;
  46543. },
  46544. getProxy: function() {
  46545. return this.proxy;
  46546. },
  46547. onMetaChange: function(proxy, meta) {
  46548. this.fireEvent('metachange', this, meta);
  46549. },
  46550. create: function(data, options) {
  46551. var me = this,
  46552. instance = Ext.ModelManager.create(Ext.applyIf(data, me.modelDefaults), me.model.modelName),
  46553. operation;
  46554. options = options || {};
  46555. Ext.applyIf(options, {
  46556. action : 'create',
  46557. records: [instance]
  46558. });
  46559. operation = new Ext.data.Operation(options);
  46560. me.proxy.create(operation, me.onProxyWrite, me);
  46561. return instance;
  46562. },
  46563. read: function() {
  46564. return this.load.apply(this, arguments);
  46565. },
  46566. update: function(options) {
  46567. var me = this,
  46568. operation;
  46569. options = options || {};
  46570. Ext.applyIf(options, {
  46571. action : 'update',
  46572. records: me.getUpdatedRecords()
  46573. });
  46574. operation = new Ext.data.Operation(options);
  46575. return me.proxy.update(operation, me.onProxyWrite, me);
  46576. },
  46577. onProxyWrite: function(operation) {
  46578. var me = this,
  46579. success = operation.wasSuccessful(),
  46580. records = operation.getRecords();
  46581. switch (operation.action) {
  46582. case 'create':
  46583. me.onCreateRecords(records, operation, success);
  46584. break;
  46585. case 'update':
  46586. me.onUpdateRecords(records, operation, success);
  46587. break;
  46588. case 'destroy':
  46589. me.onDestroyRecords(records, operation, success);
  46590. break;
  46591. }
  46592. if (success) {
  46593. me.fireEvent('write', me, operation);
  46594. me.fireEvent('datachanged', me);
  46595. me.fireEvent('refresh', me);
  46596. }
  46597. Ext.callback(operation.callback, operation.scope || me, [records, operation, success]);
  46598. },
  46599. onCreateRecords: Ext.emptyFn,
  46600. onUpdateRecords: Ext.emptyFn,
  46601. onDestroyRecords: function(records, operation, success) {
  46602. if (success) {
  46603. this.removed = [];
  46604. }
  46605. },
  46606. destroy: function(options) {
  46607. var me = this,
  46608. operation;
  46609. options = options || {};
  46610. Ext.applyIf(options, {
  46611. action : 'destroy',
  46612. records: me.getRemovedRecords()
  46613. });
  46614. operation = new Ext.data.Operation(options);
  46615. return me.proxy.destroy(operation, me.onProxyWrite, me);
  46616. },
  46617. onBatchOperationComplete: function(batch, operation) {
  46618. return this.onProxyWrite(operation);
  46619. },
  46620. onBatchComplete: function(batch, operation) {
  46621. var me = this,
  46622. operations = batch.operations,
  46623. length = operations.length,
  46624. i;
  46625. me.suspendEvents();
  46626. for (i = 0; i < length; i++) {
  46627. me.onProxyWrite(operations[i]);
  46628. }
  46629. me.resumeEvents();
  46630. me.fireEvent('datachanged', me);
  46631. me.fireEvent('refresh', me);
  46632. },
  46633. onBatchException: function(batch, operation) {
  46634. },
  46635. filterNew: function(item) {
  46636. return item.phantom === true && item.isValid();
  46637. },
  46638. getNewRecords: function() {
  46639. return [];
  46640. },
  46641. getUpdatedRecords: function() {
  46642. return [];
  46643. },
  46644. getModifiedRecords : function(){
  46645. return [].concat(this.getNewRecords(), this.getUpdatedRecords());
  46646. },
  46647. filterUpdated: function(item) {
  46648. return item.dirty === true && item.phantom !== true && item.isValid();
  46649. },
  46650. getRemovedRecords: function() {
  46651. return this.removed;
  46652. },
  46653. filter: function(filters, value) {
  46654. },
  46655. decodeFilters: function(filters) {
  46656. if (!Ext.isArray(filters)) {
  46657. if (filters === undefined) {
  46658. filters = [];
  46659. } else {
  46660. filters = [filters];
  46661. }
  46662. }
  46663. var length = filters.length,
  46664. Filter = Ext.util.Filter,
  46665. config, i;
  46666. for (i = 0; i < length; i++) {
  46667. config = filters[i];
  46668. if (!(config instanceof Filter)) {
  46669. Ext.apply(config, {
  46670. root: 'data'
  46671. });
  46672. if (config.fn) {
  46673. config.filterFn = config.fn;
  46674. }
  46675. if (typeof config == 'function') {
  46676. config = {
  46677. filterFn: config
  46678. };
  46679. }
  46680. filters[i] = new Filter(config);
  46681. }
  46682. }
  46683. return filters;
  46684. },
  46685. clearFilter: function(supressEvent) {
  46686. },
  46687. isFiltered: function() {
  46688. },
  46689. filterBy: function(fn, scope) {
  46690. },
  46691. sync: function(options) {
  46692. var me = this,
  46693. operations = {},
  46694. toCreate = me.getNewRecords(),
  46695. toUpdate = me.getUpdatedRecords(),
  46696. toDestroy = me.getRemovedRecords(),
  46697. needsSync = false;
  46698. if (toCreate.length > 0) {
  46699. operations.create = toCreate;
  46700. needsSync = true;
  46701. }
  46702. if (toUpdate.length > 0) {
  46703. operations.update = toUpdate;
  46704. needsSync = true;
  46705. }
  46706. if (toDestroy.length > 0) {
  46707. operations.destroy = toDestroy;
  46708. needsSync = true;
  46709. }
  46710. if (needsSync && me.fireEvent('beforesync', operations) !== false) {
  46711. options = options || {};
  46712. me.proxy.batch(Ext.apply(options, {
  46713. operations: operations,
  46714. listeners: me.getBatchListeners()
  46715. }));
  46716. }
  46717. return me;
  46718. },
  46719. getBatchListeners: function() {
  46720. var me = this,
  46721. listeners = {
  46722. scope: me,
  46723. exception: me.onBatchException
  46724. };
  46725. if (me.batchUpdateMode == 'operation') {
  46726. listeners.operationcomplete = me.onBatchOperationComplete;
  46727. } else {
  46728. listeners.complete = me.onBatchComplete;
  46729. }
  46730. return listeners;
  46731. },
  46732. save: function() {
  46733. return this.sync.apply(this, arguments);
  46734. },
  46735. load: function(options) {
  46736. var me = this,
  46737. operation;
  46738. options = Ext.apply({
  46739. action: 'read',
  46740. filters: me.filters.items,
  46741. sorters: me.getSorters()
  46742. }, options);
  46743. me.lastOptions = options;
  46744. operation = new Ext.data.Operation(options);
  46745. if (me.fireEvent('beforeload', me, operation) !== false) {
  46746. me.loading = true;
  46747. me.proxy.read(operation, me.onProxyLoad, me);
  46748. }
  46749. return me;
  46750. },
  46751. reload: function(options) {
  46752. return this.load(Ext.apply(this.lastOptions, options));
  46753. },
  46754. afterEdit : function(record, modifiedFieldNames) {
  46755. var me = this,
  46756. i, shouldSync;
  46757. if (me.autoSync && !me.autoSyncSuspended) {
  46758. for (i = modifiedFieldNames.length; i--;) {
  46759. if (record.fields.get(modifiedFieldNames[i]).persist) {
  46760. shouldSync = true;
  46761. break;
  46762. }
  46763. }
  46764. if (shouldSync) {
  46765. me.sync();
  46766. }
  46767. }
  46768. me.fireEvent('update', me, record, Ext.data.Model.EDIT, modifiedFieldNames);
  46769. },
  46770. afterReject : function(record) {
  46771. this.fireEvent('update', this, record, Ext.data.Model.REJECT, null);
  46772. },
  46773. afterCommit : function(record) {
  46774. this.fireEvent('update', this, record, Ext.data.Model.COMMIT, null);
  46775. },
  46776. destroyStore: function() {
  46777. var me = this;
  46778. if (!me.isDestroyed) {
  46779. if (me.storeId) {
  46780. Ext.data.StoreManager.unregister(me);
  46781. }
  46782. me.clearData();
  46783. me.data = me.tree = me.sorters = me.filters = me.groupers = null;
  46784. if (me.reader) {
  46785. me.reader.destroyReader();
  46786. }
  46787. me.proxy = me.reader = me.writer = null;
  46788. me.clearListeners();
  46789. me.isDestroyed = true;
  46790. if (me.implicitModel) {
  46791. Ext.destroy(me.model);
  46792. } else {
  46793. me.model = null;
  46794. }
  46795. }
  46796. },
  46797. doSort: function(sorterFn) {
  46798. var me = this;
  46799. if (me.remoteSort) {
  46800. me.load();
  46801. } else {
  46802. me.data.sortBy(sorterFn);
  46803. me.fireEvent('datachanged', me);
  46804. me.fireEvent('refresh', me);
  46805. }
  46806. },
  46807. clearData: Ext.emptyFn,
  46808. getCount: Ext.emptyFn,
  46809. getById: Ext.emptyFn,
  46810. removeAll: Ext.emptyFn,
  46811. isLoading: function() {
  46812. return !!this.loading;
  46813. },
  46814. suspendAutoSync: function() {
  46815. this.autoSyncSuspended = true;
  46816. },
  46817. resumeAutoSync: function() {
  46818. this.autoSyncSuspended = false;
  46819. }
  46820. });
  46821. Ext.define('Ext.data.ResultSet', {
  46822. loaded: true,
  46823. count: 0,
  46824. total: 0,
  46825. success: false,
  46826. constructor: function(config) {
  46827. Ext.apply(this, config);
  46828. this.totalRecords = this.total;
  46829. if (config.count === undefined) {
  46830. this.count = this.records.length;
  46831. }
  46832. }
  46833. });
  46834. Ext.define('Ext.data.reader.Reader', {
  46835. requires: ['Ext.data.ResultSet', 'Ext.XTemplate'],
  46836. alternateClassName: ['Ext.data.Reader', 'Ext.data.DataReader'],
  46837. mixins: {
  46838. observable: 'Ext.util.Observable'
  46839. },
  46840. totalProperty: 'total',
  46841. successProperty: 'success',
  46842. root: '',
  46843. implicitIncludes: true,
  46844. readRecordsOnFailure: true,
  46845. isReader: true,
  46846. applyDefaults: true,
  46847. lastFieldGeneration: null,
  46848. constructor: function(config) {
  46849. var me = this;
  46850. me.mixins.observable.constructor.call(me, config);
  46851. me.fieldCount = 0;
  46852. me.model = Ext.ModelManager.getModel(me.model);
  46853. me.accessExpressionFn = Ext.Function.bind(me.createFieldAccessExpression, me);
  46854. if (me.model && me.model.prototype.fields) {
  46855. me.buildExtractors();
  46856. }
  46857. this.addEvents(
  46858. 'exception'
  46859. );
  46860. },
  46861. setModel: function(model, setOnProxy) {
  46862. var me = this;
  46863. me.model = Ext.ModelManager.getModel(model);
  46864. me.buildExtractors(true);
  46865. if (setOnProxy && me.proxy) {
  46866. me.proxy.setModel(me.model, true);
  46867. }
  46868. },
  46869. read: function(response) {
  46870. var data;
  46871. if (response) {
  46872. data = response.responseText ? this.getResponseData(response) : this.readRecords(response);
  46873. }
  46874. return data || this.nullResultSet;
  46875. },
  46876. readRecords: function(data) {
  46877. var me = this,
  46878. success,
  46879. recordCount,
  46880. records,
  46881. root,
  46882. total,
  46883. value,
  46884. message;
  46885. if (me.lastFieldGeneration !== me.model.prototype.fields.generation) {
  46886. me.buildExtractors(true);
  46887. }
  46888. me.rawData = data;
  46889. data = me.getData(data);
  46890. success = true;
  46891. recordCount = 0;
  46892. records = [];
  46893. if (me.successProperty) {
  46894. value = me.getSuccess(data);
  46895. if (value === false || value === 'false') {
  46896. success = false;
  46897. }
  46898. }
  46899. if (me.messageProperty) {
  46900. message = me.getMessage(data);
  46901. }
  46902. if (me.readRecordsOnFailure || success) {
  46903. root = Ext.isArray(data) ? data : me.getRoot(data);
  46904. if (root) {
  46905. total = root.length;
  46906. }
  46907. if (me.totalProperty) {
  46908. value = parseInt(me.getTotal(data), 10);
  46909. if (!isNaN(value)) {
  46910. total = value;
  46911. }
  46912. }
  46913. if (root) {
  46914. records = me.extractData(root);
  46915. recordCount = records.length;
  46916. }
  46917. }
  46918. return new Ext.data.ResultSet({
  46919. total : total || recordCount,
  46920. count : recordCount,
  46921. records: records,
  46922. success: success,
  46923. message: message
  46924. });
  46925. },
  46926. extractData : function(root) {
  46927. var me = this,
  46928. records = [],
  46929. Model = me.model,
  46930. length = root.length,
  46931. convertedValues, node, record, i;
  46932. if (!root.length && Ext.isObject(root)) {
  46933. root = [root];
  46934. length = 1;
  46935. }
  46936. for (i = 0; i < length; i++) {
  46937. node = root[i];
  46938. if (!node.isModel) {
  46939. record = new Model(undefined, me.getId(node), node, convertedValues = {});
  46940. record.phantom = false;
  46941. me.convertRecordData(convertedValues, node, record);
  46942. records.push(record);
  46943. if (me.implicitIncludes) {
  46944. me.readAssociated(record, node);
  46945. }
  46946. } else {
  46947. records.push(node);
  46948. }
  46949. }
  46950. return records;
  46951. },
  46952. readAssociated: function(record, data) {
  46953. var associations = record.associations.items,
  46954. i = 0,
  46955. length = associations.length,
  46956. association, associationData, proxy, reader;
  46957. for (; i < length; i++) {
  46958. association = associations[i];
  46959. associationData = this.getAssociatedDataRoot(data, association.associationKey || association.name);
  46960. if (associationData) {
  46961. reader = association.getReader();
  46962. if (!reader) {
  46963. proxy = association.associatedModel.proxy;
  46964. if (proxy) {
  46965. reader = proxy.getReader();
  46966. } else {
  46967. reader = new this.constructor({
  46968. model: association.associatedName
  46969. });
  46970. }
  46971. }
  46972. association.read(record, reader, associationData);
  46973. }
  46974. }
  46975. },
  46976. getAssociatedDataRoot: function(data, associationName) {
  46977. return data[associationName];
  46978. },
  46979. getFields: function() {
  46980. return this.model.prototype.fields.items;
  46981. },
  46982. getData: function(data) {
  46983. return data;
  46984. },
  46985. getRoot: function(data) {
  46986. return data;
  46987. },
  46988. getResponseData: function(response) {
  46989. },
  46990. onMetaChange : function(meta) {
  46991. var me = this,
  46992. fields = meta.fields || me.getFields(),
  46993. newModel,
  46994. clientIdProperty;
  46995. me.metaData = meta;
  46996. me.root = meta.root || me.root;
  46997. me.idProperty = meta.idProperty || me.idProperty;
  46998. me.totalProperty = meta.totalProperty || me.totalProperty;
  46999. me.successProperty = meta.successProperty || me.successProperty;
  47000. me.messageProperty = meta.messageProperty || me.messageProperty;
  47001. clientIdProperty = meta.clientIdProperty;
  47002. if (me.model) {
  47003. me.model.setFields(fields, me.idProperty, clientIdProperty);
  47004. me.setModel(me.model, true);
  47005. }
  47006. else {
  47007. newModel = Ext.define("Ext.data.reader.Json-Model" + Ext.id(), {
  47008. extend: 'Ext.data.Model',
  47009. fields: fields,
  47010. clientIdProperty: clientIdProperty
  47011. });
  47012. if (me.idProperty) {
  47013. newModel.idProperty = me.idProperty;
  47014. }
  47015. me.setModel(newModel, true);
  47016. }
  47017. },
  47018. getIdProperty: function(){
  47019. return this.idProperty || this.model.prototype.idProperty;
  47020. },
  47021. buildExtractors: function(force) {
  47022. var me = this,
  47023. idProp = me.getIdProperty(),
  47024. totalProp = me.totalProperty,
  47025. successProp = me.successProperty,
  47026. messageProp = me.messageProperty,
  47027. accessor,
  47028. idField,
  47029. map;
  47030. if (force === true) {
  47031. delete me.convertRecordData;
  47032. }
  47033. if (me.convertRecordData) {
  47034. return;
  47035. }
  47036. if (totalProp) {
  47037. me.getTotal = me.createAccessor(totalProp);
  47038. }
  47039. if (successProp) {
  47040. me.getSuccess = me.createAccessor(successProp);
  47041. }
  47042. if (messageProp) {
  47043. me.getMessage = me.createAccessor(messageProp);
  47044. }
  47045. if (idProp) {
  47046. idField = me.model.prototype.fields.get(idProp);
  47047. if (idField) {
  47048. map = idField.mapping;
  47049. idProp = (map !== undefined && map !== null) ? map : idProp;
  47050. }
  47051. accessor = me.createAccessor(idProp);
  47052. me.getId = function(record) {
  47053. var id = accessor.call(me, record);
  47054. return (id === undefined || id === '') ? null : id;
  47055. };
  47056. } else {
  47057. me.getId = function() {
  47058. return null;
  47059. };
  47060. }
  47061. me.convertRecordData = me.buildRecordDataExtractor();
  47062. me.lastFieldGeneration = me.model.prototype.fields.generation;
  47063. },
  47064. recordDataExtractorTemplate : [
  47065. 'var me = this\n',
  47066. ' ,fields = me.model.prototype.fields\n',
  47067. ' ,value\n',
  47068. ' ,internalId\n',
  47069. '<tpl for="fields">',
  47070. ' ,__field{#} = fields.get("{name}")\n',
  47071. '</tpl>', ';\n',
  47072. 'return function(dest, source, record) {\n',
  47073. '<tpl for="fields">',
  47074. ' value = {[ this.createFieldAccessExpression(values, "__field" + xindex, "source") ]};\n',
  47075. '<tpl if="hasCustomConvert">',
  47076. ' dest["{name}"] = value === undefined ? __field{#}.convert(__field{#}.defaultValue, record) : __field{#}.convert(value, record);\n',
  47077. '<tpl elseif="defaultValue !== undefined">',
  47078. ' if (value === undefined) {\n',
  47079. ' if (me.applyDefaults) {\n',
  47080. '<tpl if="convert">',
  47081. ' dest["{name}"] = __field{#}.convert(__field{#}.defaultValue, record);\n',
  47082. '<tpl else>',
  47083. ' dest["{name}"] = __field{#}.defaultValue\n',
  47084. '</tpl>',
  47085. ' };\n',
  47086. ' } else {\n',
  47087. '<tpl if="convert">',
  47088. ' dest["{name}"] = __field{#}.convert(value, record);\n',
  47089. '<tpl else>',
  47090. ' dest["{name}"] = value;\n',
  47091. '</tpl>',
  47092. ' };',
  47093. '<tpl else>',
  47094. ' if (value !== undefined) {\n',
  47095. '<tpl if="convert">',
  47096. ' dest["{name}"] = __field{#}.convert(value, record);\n',
  47097. '<tpl else>',
  47098. ' dest["{name}"] = value;\n',
  47099. '</tpl>',
  47100. ' }\n',
  47101. '</tpl>',
  47102. '</tpl>',
  47103. '<tpl if="clientIdProp">',
  47104. ' if (record && (internalId = {[ this.createFieldAccessExpression(\{mapping: values.clientIdProp\}, null, "source") ]})) {\n',
  47105. ' record.{["internalId"]} = internalId;\n',
  47106. ' }\n',
  47107. '</tpl>',
  47108. '};'
  47109. ],
  47110. buildRecordDataExtractor: function() {
  47111. var me = this,
  47112. modelProto = me.model.prototype,
  47113. templateData = {
  47114. clientIdProp: modelProto.clientIdProperty,
  47115. fields: modelProto.fields.items
  47116. };
  47117. me.recordDataExtractorTemplate.createFieldAccessExpression = me.accessExpressionFn;
  47118. return Ext.functionFactory(me.recordDataExtractorTemplate.apply(templateData)).call(me);
  47119. },
  47120. destroyReader: function() {
  47121. var me = this;
  47122. delete me.proxy;
  47123. delete me.model;
  47124. delete me.convertRecordData;
  47125. delete me.getId;
  47126. delete me.getTotal;
  47127. delete me.getSuccess;
  47128. delete me.getMessage;
  47129. }
  47130. }, function() {
  47131. var proto = this.prototype;
  47132. Ext.apply(proto, {
  47133. nullResultSet: new Ext.data.ResultSet({
  47134. total : 0,
  47135. count : 0,
  47136. records: [],
  47137. success: true
  47138. }),
  47139. recordDataExtractorTemplate: new Ext.XTemplate(proto.recordDataExtractorTemplate)
  47140. });
  47141. });
  47142. Ext.define('Ext.data.reader.Json', {
  47143. extend: 'Ext.data.reader.Reader',
  47144. alternateClassName: 'Ext.data.JsonReader',
  47145. alias : 'reader.json',
  47146. root: '',
  47147. useSimpleAccessors: false,
  47148. readRecords: function(data) {
  47149. if (data.metaData) {
  47150. this.onMetaChange(data.metaData);
  47151. }
  47152. this.jsonData = data;
  47153. return this.callParent([data]);
  47154. },
  47155. getResponseData: function(response) {
  47156. var data, error;
  47157. try {
  47158. data = Ext.decode(response.responseText);
  47159. return this.readRecords(data);
  47160. } catch (ex) {
  47161. error = new Ext.data.ResultSet({
  47162. total : 0,
  47163. count : 0,
  47164. records: [],
  47165. success: false,
  47166. message: ex.message
  47167. });
  47168. this.fireEvent('exception', this, response, error);
  47169. Ext.Logger.warn('Unable to parse the JSON returned by the server');
  47170. return error;
  47171. }
  47172. },
  47173. buildExtractors : function() {
  47174. var me = this;
  47175. me.callParent(arguments);
  47176. if (me.root) {
  47177. me.getRoot = me.createAccessor(me.root);
  47178. } else {
  47179. me.getRoot = function(root) {
  47180. return root;
  47181. };
  47182. }
  47183. },
  47184. extractData: function(root) {
  47185. var recordName = this.record,
  47186. data = [],
  47187. length, i;
  47188. if (recordName) {
  47189. length = root.length;
  47190. if (!length && Ext.isObject(root)) {
  47191. length = 1;
  47192. root = [root];
  47193. }
  47194. for (i = 0; i < length; i++) {
  47195. data[i] = root[i][recordName];
  47196. }
  47197. } else {
  47198. data = root;
  47199. }
  47200. return this.callParent([data]);
  47201. },
  47202. createAccessor: (function() {
  47203. var re = /[\[\.]/;
  47204. return function(expr) {
  47205. if (Ext.isEmpty(expr)) {
  47206. return Ext.emptyFn;
  47207. }
  47208. if (Ext.isFunction(expr)) {
  47209. return expr;
  47210. }
  47211. if (this.useSimpleAccessors !== true) {
  47212. var i = String(expr).search(re);
  47213. if (i >= 0) {
  47214. return Ext.functionFactory('obj', 'return obj' + (i > 0 ? '.' : '') + expr);
  47215. }
  47216. }
  47217. return function(obj) {
  47218. return obj[expr];
  47219. };
  47220. };
  47221. }()),
  47222. createFieldAccessExpression: (function() {
  47223. var re = /[\[\.]/;
  47224. return function(field, fieldVarName, dataName) {
  47225. var me = this,
  47226. hasMap = (field.mapping !== null),
  47227. map = hasMap ? field.mapping : field.name,
  47228. result,
  47229. operatorSearch;
  47230. if (typeof map === 'function') {
  47231. result = fieldVarName + '.mapping(' + dataName + ', this)';
  47232. } else if (this.useSimpleAccessors === true || ((operatorSearch = String(map).search(re)) < 0)) {
  47233. if (!hasMap || isNaN(map)) {
  47234. map = '"' + map + '"';
  47235. }
  47236. result = dataName + "[" + map + "]";
  47237. } else {
  47238. result = dataName + (operatorSearch > 0 ? '.' : '') + map;
  47239. }
  47240. return result;
  47241. };
  47242. }())
  47243. });
  47244. Ext.define('Ext.data.writer.Writer', {
  47245. alias: 'writer.base',
  47246. alternateClassName: ['Ext.data.DataWriter', 'Ext.data.Writer'],
  47247. writeAllFields: true,
  47248. nameProperty: 'name',
  47249. isWriter: true,
  47250. constructor: function(config) {
  47251. Ext.apply(this, config);
  47252. },
  47253. write: function(request) {
  47254. var operation = request.operation,
  47255. records = operation.records || [],
  47256. len = records.length,
  47257. i = 0,
  47258. data = [];
  47259. for (; i < len; i++) {
  47260. data.push(this.getRecordData(records[i], operation));
  47261. }
  47262. return this.writeRecords(request, data);
  47263. },
  47264. getRecordData: function(record, operation) {
  47265. var isPhantom = record.phantom === true,
  47266. writeAll = this.writeAllFields || isPhantom,
  47267. nameProperty = this.nameProperty,
  47268. fields = record.fields,
  47269. fieldItems = fields.items,
  47270. data = {},
  47271. clientIdProperty = record.clientIdProperty,
  47272. changes,
  47273. name,
  47274. field,
  47275. key,
  47276. value,
  47277. f, fLen;
  47278. if (writeAll) {
  47279. fLen = fieldItems.length;
  47280. for (f = 0; f < fLen; f++) {
  47281. field = fieldItems[f];
  47282. if (field.persist) {
  47283. name = field[nameProperty] || field.name;
  47284. value = record.get(field.name);
  47285. if (field.serialize) {
  47286. data[name] = field.serialize(value, record);
  47287. } else if (field.type === Ext.data.Types.DATE && field.dateFormat) {
  47288. data[name] = Ext.Date.format(value, field.dateFormat);
  47289. } else {
  47290. data[name] = value;
  47291. }
  47292. }
  47293. }
  47294. } else {
  47295. changes = record.getChanges();
  47296. for (key in changes) {
  47297. if (changes.hasOwnProperty(key)) {
  47298. field = fields.get(key);
  47299. if (field.persist) {
  47300. name = field[nameProperty] || field.name;
  47301. value = record.get(field.name);
  47302. if (field.serialize) {
  47303. data[name] = field.serialize(value, record);
  47304. } else if (field.type === Ext.data.Types.DATE && field.dateFormat) {
  47305. data[name] = Ext.Date.format(value, field.dateFormat);
  47306. } else {
  47307. data[name] = value;
  47308. }
  47309. }
  47310. }
  47311. }
  47312. }
  47313. if (isPhantom) {
  47314. if (clientIdProperty && operation && operation.records.length > 1) {
  47315. data[clientIdProperty] = record.internalId;
  47316. }
  47317. } else {
  47318. data[record.idProperty] = record.getId();
  47319. }
  47320. return data;
  47321. }
  47322. });
  47323. Ext.define('Ext.data.writer.Json', {
  47324. extend: 'Ext.data.writer.Writer',
  47325. alternateClassName: 'Ext.data.JsonWriter',
  47326. alias: 'writer.json',
  47327. root: undefined,
  47328. encode: false,
  47329. allowSingle: true,
  47330. writeRecords: function(request, data) {
  47331. var root = this.root;
  47332. if (this.allowSingle && data.length == 1) {
  47333. data = data[0];
  47334. }
  47335. if (this.encode) {
  47336. if (root) {
  47337. request.params[root] = Ext.encode(data);
  47338. } else {
  47339. }
  47340. } else {
  47341. request.jsonData = request.jsonData || {};
  47342. if (root) {
  47343. request.jsonData[root] = data;
  47344. } else {
  47345. request.jsonData = data;
  47346. }
  47347. }
  47348. return request;
  47349. }
  47350. });
  47351. Ext.define('Ext.data.proxy.Server', {
  47352. extend: 'Ext.data.proxy.Proxy',
  47353. alias : 'proxy.server',
  47354. alternateClassName: 'Ext.data.ServerProxy',
  47355. uses : ['Ext.data.Request'],
  47356. pageParam: 'page',
  47357. startParam: 'start',
  47358. limitParam: 'limit',
  47359. groupParam: 'group',
  47360. groupDirectionParam: 'groupDir',
  47361. sortParam: 'sort',
  47362. filterParam: 'filter',
  47363. directionParam: 'dir',
  47364. simpleSortMode: false,
  47365. simpleGroupMode: false,
  47366. noCache : true,
  47367. cacheString: "_dc",
  47368. timeout : 30000,
  47369. constructor: function(config) {
  47370. var me = this;
  47371. config = config || {};
  47372. me.callParent([config]);
  47373. me.extraParams = config.extraParams || {};
  47374. me.api = Ext.apply({}, config.api || me.api);
  47375. me.nocache = me.noCache;
  47376. },
  47377. create: function() {
  47378. return this.doRequest.apply(this, arguments);
  47379. },
  47380. read: function() {
  47381. return this.doRequest.apply(this, arguments);
  47382. },
  47383. update: function() {
  47384. return this.doRequest.apply(this, arguments);
  47385. },
  47386. destroy: function() {
  47387. return this.doRequest.apply(this, arguments);
  47388. },
  47389. setExtraParam: function(name, value) {
  47390. this.extraParams[name] = value;
  47391. },
  47392. buildRequest: function(operation) {
  47393. var me = this,
  47394. params = Ext.applyIf(operation.params || {}, me.extraParams || {}),
  47395. request;
  47396. params = Ext.applyIf(params, me.getParams(operation));
  47397. if (operation.id !== undefined && params.id === undefined) {
  47398. params.id = operation.id;
  47399. }
  47400. request = new Ext.data.Request({
  47401. params : params,
  47402. action : operation.action,
  47403. records : operation.records,
  47404. operation: operation,
  47405. url : operation.url,
  47406. proxy: me
  47407. });
  47408. request.url = me.buildUrl(request);
  47409. operation.request = request;
  47410. return request;
  47411. },
  47412. processResponse: function(success, operation, request, response, callback, scope) {
  47413. var me = this,
  47414. reader,
  47415. result;
  47416. if (success === true) {
  47417. reader = me.getReader();
  47418. reader.applyDefaults = operation.action === 'read';
  47419. result = reader.read(me.extractResponseData(response));
  47420. if (result.success !== false) {
  47421. Ext.apply(operation, {
  47422. response: response,
  47423. resultSet: result
  47424. });
  47425. operation.commitRecords(result.records);
  47426. operation.setCompleted();
  47427. operation.setSuccessful();
  47428. } else {
  47429. operation.setException(result.message);
  47430. me.fireEvent('exception', this, response, operation);
  47431. }
  47432. } else {
  47433. me.setException(operation, response);
  47434. me.fireEvent('exception', this, response, operation);
  47435. }
  47436. if (typeof callback == 'function') {
  47437. callback.call(scope || me, operation);
  47438. }
  47439. me.afterRequest(request, success);
  47440. },
  47441. setException: function(operation, response) {
  47442. operation.setException({
  47443. status: response.status,
  47444. statusText: response.statusText
  47445. });
  47446. },
  47447. extractResponseData: function(response) {
  47448. return response;
  47449. },
  47450. applyEncoding: function(value) {
  47451. return Ext.encode(value);
  47452. },
  47453. encodeSorters: function(sorters) {
  47454. var min = [],
  47455. length = sorters.length,
  47456. i = 0;
  47457. for (; i < length; i++) {
  47458. min[i] = {
  47459. property : sorters[i].property,
  47460. direction: sorters[i].direction
  47461. };
  47462. }
  47463. return this.applyEncoding(min);
  47464. },
  47465. encodeFilters: function(filters) {
  47466. var min = [],
  47467. length = filters.length,
  47468. i = 0;
  47469. for (; i < length; i++) {
  47470. min[i] = {
  47471. property: filters[i].property,
  47472. value : filters[i].value
  47473. };
  47474. }
  47475. return this.applyEncoding(min);
  47476. },
  47477. getParams: function(operation) {
  47478. var me = this,
  47479. params = {},
  47480. isDef = Ext.isDefined,
  47481. groupers = operation.groupers,
  47482. sorters = operation.sorters,
  47483. filters = operation.filters,
  47484. page = operation.page,
  47485. start = operation.start,
  47486. limit = operation.limit,
  47487. simpleSortMode = me.simpleSortMode,
  47488. simpleGroupMode = me.simpleGroupMode,
  47489. pageParam = me.pageParam,
  47490. startParam = me.startParam,
  47491. limitParam = me.limitParam,
  47492. groupParam = me.groupParam,
  47493. groupDirectionParam = me.groupDirectionParam,
  47494. sortParam = me.sortParam,
  47495. filterParam = me.filterParam,
  47496. directionParam = me.directionParam;
  47497. if (pageParam && isDef(page)) {
  47498. params[pageParam] = page;
  47499. }
  47500. if (startParam && isDef(start)) {
  47501. params[startParam] = start;
  47502. }
  47503. if (limitParam && isDef(limit)) {
  47504. params[limitParam] = limit;
  47505. }
  47506. if (groupParam && groupers && groupers.length > 0) {
  47507. if (simpleGroupMode) {
  47508. params[groupParam] = groupers[0].property;
  47509. params[groupDirectionParam] = groupers[0].direction || 'ASC';
  47510. } else {
  47511. params[groupParam] = me.encodeSorters(groupers);
  47512. }
  47513. }
  47514. if (sortParam && sorters && sorters.length > 0) {
  47515. if (simpleSortMode) {
  47516. params[sortParam] = sorters[0].property;
  47517. params[directionParam] = sorters[0].direction;
  47518. } else {
  47519. params[sortParam] = me.encodeSorters(sorters);
  47520. }
  47521. }
  47522. if (filterParam && filters && filters.length > 0) {
  47523. params[filterParam] = me.encodeFilters(filters);
  47524. }
  47525. return params;
  47526. },
  47527. buildUrl: function(request) {
  47528. var me = this,
  47529. url = me.getUrl(request);
  47530. if (me.noCache) {
  47531. url = Ext.urlAppend(url, Ext.String.format("{0}={1}", me.cacheString, Ext.Date.now()));
  47532. }
  47533. return url;
  47534. },
  47535. getUrl: function(request) {
  47536. return request.url || this.api[request.action] || this.url;
  47537. },
  47538. doRequest: function(operation, callback, scope) {
  47539. },
  47540. afterRequest: Ext.emptyFn,
  47541. onDestroy: function() {
  47542. Ext.destroy(this.reader, this.writer);
  47543. }
  47544. });
  47545. Ext.define('Ext.data.proxy.Ajax', {
  47546. requires: ['Ext.util.MixedCollection', 'Ext.Ajax'],
  47547. extend: 'Ext.data.proxy.Server',
  47548. alias: 'proxy.ajax',
  47549. alternateClassName: ['Ext.data.HttpProxy', 'Ext.data.AjaxProxy'],
  47550. actionMethods: {
  47551. create : 'POST',
  47552. read : 'GET',
  47553. update : 'POST',
  47554. destroy: 'POST'
  47555. },
  47556. doRequest: function(operation, callback, scope) {
  47557. var writer = this.getWriter(),
  47558. request = this.buildRequest(operation, callback, scope);
  47559. if (operation.allowWrite()) {
  47560. request = writer.write(request);
  47561. }
  47562. Ext.apply(request, {
  47563. headers : this.headers,
  47564. timeout : this.timeout,
  47565. scope : this,
  47566. callback : this.createRequestCallback(request, operation, callback, scope),
  47567. method : this.getMethod(request),
  47568. disableCaching: false
  47569. });
  47570. Ext.Ajax.request(request);
  47571. return request;
  47572. },
  47573. getMethod: function(request) {
  47574. return this.actionMethods[request.action];
  47575. },
  47576. createRequestCallback: function(request, operation, callback, scope) {
  47577. var me = this;
  47578. return function(options, success, response) {
  47579. me.processResponse(success, operation, request, response, callback, scope);
  47580. };
  47581. }
  47582. }, function() {
  47583. Ext.data.HttpProxy = this;
  47584. });
  47585. Ext.define('Ext.data.proxy.Client', {
  47586. extend: 'Ext.data.proxy.Proxy',
  47587. alternateClassName: 'Ext.data.ClientProxy',
  47588. isSynchronous: true,
  47589. clear: function() {
  47590. }
  47591. });
  47592. Ext.define('Ext.data.proxy.Memory', {
  47593. extend: 'Ext.data.proxy.Client',
  47594. alias: 'proxy.memory',
  47595. alternateClassName: 'Ext.data.MemoryProxy',
  47596. constructor: function(config) {
  47597. this.callParent([config]);
  47598. this.setReader(this.reader);
  47599. },
  47600. updateOperation: function(operation, callback, scope) {
  47601. var i = 0,
  47602. recs = operation.getRecords(),
  47603. len = recs.length;
  47604. for (i; i < len; i++) {
  47605. recs[i].commit();
  47606. }
  47607. operation.setCompleted();
  47608. operation.setSuccessful();
  47609. Ext.callback(callback, scope || this, [operation]);
  47610. },
  47611. create: function() {
  47612. this.updateOperation.apply(this, arguments);
  47613. },
  47614. update: function() {
  47615. this.updateOperation.apply(this, arguments);
  47616. },
  47617. destroy: function() {
  47618. this.updateOperation.apply(this, arguments);
  47619. },
  47620. read: function(operation, callback, scope) {
  47621. var me = this;
  47622. operation.resultSet = me.getReader().read(me.data);
  47623. operation.setCompleted();
  47624. operation.setSuccessful();
  47625. Ext.callback(callback, scope || me, [operation]);
  47626. },
  47627. clear: Ext.emptyFn
  47628. });
  47629. Ext.define('Ext.util.LruCache', {
  47630. extend: 'Ext.util.HashMap',
  47631. constructor: function(config) {
  47632. Ext.apply(this, config);
  47633. this.callParent([config]);
  47634. },
  47635. add: function(key, newValue) {
  47636. var me = this,
  47637. existingKey = me.findKey(newValue),
  47638. entry;
  47639. if (existingKey) {
  47640. me.unlinkEntry(entry = me.map[existingKey]);
  47641. entry.prev = me.last;
  47642. entry.next = null;
  47643. }
  47644. else {
  47645. entry = {
  47646. prev: me.last,
  47647. next: null,
  47648. key: key,
  47649. value: newValue
  47650. };
  47651. }
  47652. if (me.last) {
  47653. me.last.next = entry;
  47654. }
  47655. else {
  47656. me.first = entry;
  47657. }
  47658. me.last = entry;
  47659. me.callParent([key, entry]);
  47660. me.prune();
  47661. return newValue;
  47662. },
  47663. insertBefore: function(key, newValue, sibling) {
  47664. var me = this,
  47665. existingKey,
  47666. entry;
  47667. if (sibling = this.map[this.findKey(sibling)]) {
  47668. existingKey = me.findKey(newValue);
  47669. if (existingKey) {
  47670. me.unlinkEntry(entry = me.map[existingKey]);
  47671. }
  47672. else {
  47673. entry = {
  47674. prev: sibling.prev,
  47675. next: sibling,
  47676. key: key,
  47677. value: newValue
  47678. };
  47679. }
  47680. if (sibling.prev) {
  47681. entry.prev.next = entry;
  47682. } else {
  47683. me.first = entry;
  47684. }
  47685. entry.next = sibling;
  47686. sibling.prev = entry;
  47687. me.prune();
  47688. return newValue;
  47689. }
  47690. else {
  47691. return me.add(key, newValue);
  47692. }
  47693. },
  47694. get: function(key) {
  47695. var entry = this.map[key];
  47696. if (entry) {
  47697. if (entry.next) {
  47698. this.moveToEnd(entry);
  47699. }
  47700. return entry.value;
  47701. }
  47702. },
  47703. removeAtKey: function(key) {
  47704. this.unlinkEntry(this.map[key]);
  47705. return this.callParent(arguments);
  47706. },
  47707. clear: function( initial) {
  47708. this.first = this.last = null;
  47709. return this.callParent(arguments);
  47710. },
  47711. unlinkEntry: function(entry) {
  47712. if (entry) {
  47713. if (entry.next) {
  47714. entry.next.prev = entry.prev;
  47715. } else {
  47716. this.last = entry.prev;
  47717. }
  47718. if (entry.prev) {
  47719. entry.prev.next = entry.next;
  47720. } else {
  47721. this.first = entry.next;
  47722. }
  47723. entry.prev = entry.next = null;
  47724. }
  47725. },
  47726. moveToEnd: function(entry) {
  47727. this.unlinkEntry(entry);
  47728. if (entry.prev = this.last) {
  47729. this.last.next = entry;
  47730. }
  47731. else {
  47732. this.first = entry;
  47733. }
  47734. this.last = entry;
  47735. },
  47736. getArray: function(isKey) {
  47737. var arr = [],
  47738. entry = this.first;
  47739. while (entry) {
  47740. arr.push(isKey ? entry.key: entry.value);
  47741. entry = entry.next;
  47742. }
  47743. return arr;
  47744. },
  47745. each: function(fn, scope, reverse) {
  47746. var me = this,
  47747. entry = reverse ? me.last : me.first,
  47748. length = me.length;
  47749. scope = scope || me;
  47750. while (entry) {
  47751. if (fn.call(scope, entry.key, entry.value, length) === false) {
  47752. break;
  47753. }
  47754. entry = reverse ? entry.prev : entry.next;
  47755. }
  47756. return me;
  47757. },
  47758. findKey: function(value) {
  47759. var key,
  47760. map = this.map;
  47761. for (key in map) {
  47762. if (map.hasOwnProperty(key) && map[key].value === value) {
  47763. return key;
  47764. }
  47765. }
  47766. return undefined;
  47767. },
  47768. prune: function() {
  47769. var me = this,
  47770. purgeCount = me.maxSize ? (me.length - me.maxSize) : 0;
  47771. if (purgeCount > 0) {
  47772. for (; me.first && purgeCount; purgeCount--) {
  47773. me.removeAtKey(me.first.key);
  47774. }
  47775. }
  47776. }
  47777. });
  47778. Ext.define('Ext.data.Store', {
  47779. extend: 'Ext.data.AbstractStore',
  47780. alias: 'store.store',
  47781. requires: [
  47782. 'Ext.data.StoreManager',
  47783. 'Ext.data.Model',
  47784. 'Ext.data.proxy.Ajax',
  47785. 'Ext.data.proxy.Memory',
  47786. 'Ext.data.reader.Json',
  47787. 'Ext.data.writer.Json',
  47788. 'Ext.util.LruCache'
  47789. ],
  47790. uses: [
  47791. 'Ext.ModelManager',
  47792. 'Ext.util.Grouper'
  47793. ],
  47794. remoteSort: false,
  47795. remoteFilter: false,
  47796. remoteGroup : false,
  47797. groupField: undefined,
  47798. groupDir: "ASC",
  47799. trailingBufferZone: 25,
  47800. leadingBufferZone: 200,
  47801. pageSize: undefined,
  47802. currentPage: 1,
  47803. clearOnPageLoad: true,
  47804. loading: false,
  47805. sortOnFilter: true,
  47806. buffered: false,
  47807. purgePageCount: 5,
  47808. clearRemovedOnLoad: true,
  47809. defaultPageSize: 25,
  47810. addRecordsOptions: {
  47811. addRecords: true
  47812. },
  47813. statics: {
  47814. recordIdFn: function(record) {
  47815. return record.internalId;
  47816. },
  47817. recordIndexFn: function(record) {
  47818. return record.index;
  47819. }
  47820. },
  47821. onClassExtended: function(cls, data, hooks) {
  47822. var model = data.model,
  47823. onBeforeClassCreated;
  47824. if (typeof model == 'string') {
  47825. onBeforeClassCreated = hooks.onBeforeCreated;
  47826. hooks.onBeforeCreated = function() {
  47827. var me = this,
  47828. args = arguments;
  47829. Ext.require(model, function() {
  47830. onBeforeClassCreated.apply(me, args);
  47831. });
  47832. };
  47833. }
  47834. },
  47835. constructor: function(config) {
  47836. config = Ext.Object.merge({}, config);
  47837. var me = this,
  47838. groupers = config.groupers || me.groupers,
  47839. groupField = config.groupField || me.groupField,
  47840. proxy,
  47841. data;
  47842. data = config.data || me.data;
  47843. me.data = new Ext.util.MixedCollection(false, Ext.data.Store.recordIdFn);
  47844. if (data) {
  47845. me.inlineData = data;
  47846. delete config.data;
  47847. }
  47848. if (!groupers && groupField) {
  47849. groupers = [{
  47850. property : groupField,
  47851. direction: config.groupDir || me.groupDir
  47852. }];
  47853. }
  47854. delete config.groupers;
  47855. me.groupers = new Ext.util.MixedCollection();
  47856. me.groupers.addAll(me.decodeGroupers(groupers));
  47857. this.callParent([config]);
  47858. if (me.buffered) {
  47859. me.pageMap = new me.PageMap({
  47860. pageSize: me.pageSize,
  47861. maxSize: me.purgePageCount,
  47862. listeners: {
  47863. clear: me.cancelAllPrefetches,
  47864. scope: me
  47865. }
  47866. });
  47867. me.pageRequests = {};
  47868. me.sortOnLoad = false;
  47869. me.filterOnLoad = false;
  47870. }
  47871. if (me.remoteGroup) {
  47872. me.remoteSort = true;
  47873. }
  47874. if (me.groupers.items.length && !me.remoteGroup) {
  47875. me.sort(me.groupers.items, 'prepend', false);
  47876. }
  47877. proxy = me.proxy;
  47878. data = me.inlineData;
  47879. if (!me.buffered && !me.pageSize) {
  47880. me.pageSize = me.defaultPageSize;
  47881. }
  47882. if (data) {
  47883. if (proxy instanceof Ext.data.proxy.Memory) {
  47884. proxy.data = data;
  47885. me.read();
  47886. } else {
  47887. me.add.apply(me, [data]);
  47888. }
  47889. me.sort();
  47890. delete me.inlineData;
  47891. } else if (me.autoLoad) {
  47892. Ext.defer(me.load, 10, me, [ typeof me.autoLoad === 'object' ? me.autoLoad : undefined ]);
  47893. }
  47894. },
  47895. destroyStore: function() {
  47896. this.callParent(arguments);
  47897. if (this.pageMap) {
  47898. this.pageMap.clear();
  47899. }
  47900. },
  47901. onBeforeSort: function() {
  47902. var groupers = this.groupers;
  47903. if (groupers.getCount() > 0) {
  47904. this.sort(groupers.items, 'prepend', false);
  47905. }
  47906. },
  47907. decodeGroupers: function(groupers) {
  47908. if (!Ext.isArray(groupers)) {
  47909. if (groupers === undefined) {
  47910. groupers = [];
  47911. } else {
  47912. groupers = [groupers];
  47913. }
  47914. }
  47915. var length = groupers.length,
  47916. Grouper = Ext.util.Grouper,
  47917. config, i, result = [];
  47918. for (i = 0; i < length; i++) {
  47919. config = groupers[i];
  47920. if (!(config instanceof Grouper)) {
  47921. if (Ext.isString(config)) {
  47922. config = {
  47923. property: config
  47924. };
  47925. }
  47926. config = Ext.apply({
  47927. root : 'data',
  47928. direction: "ASC"
  47929. }, config);
  47930. if (config.fn) {
  47931. config.sorterFn = config.fn;
  47932. }
  47933. if (typeof config == 'function') {
  47934. config = {
  47935. sorterFn: config
  47936. };
  47937. }
  47938. result.push(new Grouper(config));
  47939. } else {
  47940. result.push(config);
  47941. }
  47942. }
  47943. return result;
  47944. },
  47945. group: function(groupers, direction) {
  47946. var me = this,
  47947. hasNew = false,
  47948. grouper,
  47949. newGroupers;
  47950. if (Ext.isArray(groupers)) {
  47951. newGroupers = groupers;
  47952. } else if (Ext.isObject(groupers)) {
  47953. newGroupers = [groupers];
  47954. } else if (Ext.isString(groupers)) {
  47955. grouper = me.groupers.get(groupers);
  47956. if (!grouper) {
  47957. grouper = {
  47958. property : groupers,
  47959. direction: direction
  47960. };
  47961. newGroupers = [grouper];
  47962. } else if (direction === undefined) {
  47963. grouper.toggle();
  47964. } else {
  47965. grouper.setDirection(direction);
  47966. }
  47967. }
  47968. if (newGroupers && newGroupers.length) {
  47969. hasNew = true;
  47970. newGroupers = me.decodeGroupers(newGroupers);
  47971. me.groupers.clear();
  47972. me.groupers.addAll(newGroupers);
  47973. }
  47974. if (me.remoteGroup) {
  47975. if (me.buffered) {
  47976. me.pageMap.clear();
  47977. me.loadPage(1, { groupChange: true });
  47978. } else {
  47979. me.load({
  47980. scope: me,
  47981. callback: me.fireGroupChange
  47982. });
  47983. }
  47984. } else {
  47985. me.sort(null, null, null, hasNew);
  47986. me.fireGroupChange();
  47987. }
  47988. },
  47989. clearGrouping: function() {
  47990. var me = this,
  47991. groupers = me.groupers.items,
  47992. gLen = groupers.length,
  47993. grouper, g;
  47994. for (g = 0; g < gLen; g++) {
  47995. grouper = groupers[g];
  47996. me.sorters.remove(grouper);
  47997. }
  47998. me.groupers.clear();
  47999. if (me.remoteGroup) {
  48000. if (me.buffered) {
  48001. me.pageMap.clear();
  48002. me.loadPage(1, { groupChange: true });
  48003. } else {
  48004. me.load({
  48005. scope: me,
  48006. callback: me.fireGroupChange
  48007. });
  48008. }
  48009. } else {
  48010. me.sort();
  48011. me.fireGroupChange();
  48012. }
  48013. },
  48014. isGrouped: function() {
  48015. return this.groupers.getCount() > 0;
  48016. },
  48017. fireGroupChange: function() {
  48018. this.fireEvent('groupchange', this, this.groupers);
  48019. },
  48020. getGroups: function(requestGroupString) {
  48021. var records = this.data.items,
  48022. length = records.length,
  48023. groups = [],
  48024. pointers = {},
  48025. record,
  48026. groupStr,
  48027. group,
  48028. i;
  48029. for (i = 0; i < length; i++) {
  48030. record = records[i];
  48031. groupStr = this.getGroupString(record);
  48032. group = pointers[groupStr];
  48033. if (group === undefined) {
  48034. group = {
  48035. name: groupStr,
  48036. children: []
  48037. };
  48038. groups.push(group);
  48039. pointers[groupStr] = group;
  48040. }
  48041. group.children.push(record);
  48042. }
  48043. return requestGroupString ? pointers[requestGroupString] : groups;
  48044. },
  48045. getGroupsForGrouper: function(records, grouper) {
  48046. var length = records.length,
  48047. groups = [],
  48048. oldValue,
  48049. newValue,
  48050. record,
  48051. group,
  48052. i;
  48053. for (i = 0; i < length; i++) {
  48054. record = records[i];
  48055. newValue = grouper.getGroupString(record);
  48056. if (newValue !== oldValue) {
  48057. group = {
  48058. name: newValue,
  48059. grouper: grouper,
  48060. records: []
  48061. };
  48062. groups.push(group);
  48063. }
  48064. group.records.push(record);
  48065. oldValue = newValue;
  48066. }
  48067. return groups;
  48068. },
  48069. getGroupsForGrouperIndex: function(records, grouperIndex) {
  48070. var me = this,
  48071. groupers = me.groupers,
  48072. grouper = groupers.getAt(grouperIndex),
  48073. groups = me.getGroupsForGrouper(records, grouper),
  48074. length = groups.length,
  48075. i;
  48076. if (grouperIndex + 1 < groupers.length) {
  48077. for (i = 0; i < length; i++) {
  48078. groups[i].children = me.getGroupsForGrouperIndex(groups[i].records, grouperIndex + 1);
  48079. }
  48080. }
  48081. for (i = 0; i < length; i++) {
  48082. groups[i].depth = grouperIndex;
  48083. }
  48084. return groups;
  48085. },
  48086. getGroupData: function(sort) {
  48087. var me = this;
  48088. if (sort !== false) {
  48089. me.sort();
  48090. }
  48091. return me.getGroupsForGrouperIndex(me.data.items, 0);
  48092. },
  48093. getGroupString: function(instance) {
  48094. var group = this.groupers.first();
  48095. if (group) {
  48096. return instance.get(group.property);
  48097. }
  48098. return '';
  48099. },
  48100. insert: function(index, records) {
  48101. var me = this,
  48102. sync = false,
  48103. i,
  48104. record,
  48105. len;
  48106. records = [].concat(records);
  48107. for (i = 0,len = records.length; i < len; i++) {
  48108. record = me.createModel(records[i]);
  48109. record.set(me.modelDefaults);
  48110. records[i] = record;
  48111. me.data.insert(index + i, record);
  48112. record.join(me);
  48113. sync = sync || record.phantom === true;
  48114. }
  48115. if (me.snapshot) {
  48116. me.snapshot.addAll(records);
  48117. }
  48118. if (me.requireSort) {
  48119. me.suspendEvents();
  48120. me.sort();
  48121. me.resumeEvents();
  48122. }
  48123. me.fireEvent('add', me, records, index);
  48124. me.fireEvent('datachanged', me);
  48125. if (me.autoSync && sync && !me.autoSyncSuspended) {
  48126. me.sync();
  48127. }
  48128. },
  48129. add: function(records) {
  48130. if (!Ext.isArray(records)) {
  48131. records = Array.prototype.slice.apply(arguments);
  48132. } else {
  48133. records = records.slice(0);
  48134. }
  48135. var me = this,
  48136. i = 0,
  48137. length = records.length,
  48138. record,
  48139. isSorted = !me.remoteSort && me.sorters && me.sorters.items.length;
  48140. if (isSorted && length === 1) {
  48141. return [ me.addSorted(me.createModel(records[0])) ];
  48142. }
  48143. for (; i < length; i++) {
  48144. record = me.createModel(records[i]);
  48145. records[i] = record;
  48146. }
  48147. if (isSorted) {
  48148. me.requireSort = true;
  48149. }
  48150. me.insert(me.data.length, records);
  48151. delete me.requireSort;
  48152. return records;
  48153. },
  48154. addSorted: function(record) {
  48155. var me = this,
  48156. index = me.data.findInsertionIndex(record, me.generateComparator());
  48157. me.insert(index, record);
  48158. return record;
  48159. },
  48160. createModel: function(record) {
  48161. if (!record.isModel) {
  48162. record = Ext.ModelManager.create(record, this.model);
  48163. }
  48164. return record;
  48165. },
  48166. each: function(fn, scope) {
  48167. var data = this.data.items,
  48168. dLen = data.length,
  48169. record, d;
  48170. for (d = 0; d < dLen; d++) {
  48171. record = data[d];
  48172. if (fn.call(scope || record, record, d, dLen) === false) {
  48173. break;
  48174. }
  48175. }
  48176. },
  48177. remove: function(records, isMove) {
  48178. if (!Ext.isArray(records)) {
  48179. records = [records];
  48180. }
  48181. isMove = isMove === true;
  48182. var me = this,
  48183. sync = false,
  48184. i = 0,
  48185. length = records.length,
  48186. isNotPhantom,
  48187. index,
  48188. record;
  48189. for (; i < length; i++) {
  48190. record = records[i];
  48191. index = me.data.indexOf(record);
  48192. if (me.snapshot) {
  48193. me.snapshot.remove(record);
  48194. }
  48195. if (index > -1) {
  48196. isNotPhantom = record.phantom !== true;
  48197. if (!isMove && isNotPhantom) {
  48198. record.removedFrom = index;
  48199. me.removed.push(record);
  48200. }
  48201. record.unjoin(me);
  48202. me.data.remove(record);
  48203. sync = sync || isNotPhantom;
  48204. me.fireEvent('remove', me, record, index);
  48205. }
  48206. }
  48207. me.fireEvent('datachanged', me);
  48208. if (!isMove && me.autoSync && sync && !me.autoSyncSuspended) {
  48209. me.sync();
  48210. }
  48211. },
  48212. removeAt: function(index) {
  48213. var record = this.getAt(index);
  48214. if (record) {
  48215. this.remove(record);
  48216. }
  48217. },
  48218. load: function(options) {
  48219. var me = this;
  48220. options = options || {};
  48221. if (typeof options == 'function') {
  48222. options = {
  48223. callback: options
  48224. };
  48225. }
  48226. options.groupers = options.groupers || me.groupers.items;
  48227. options.page = options.page || me.currentPage;
  48228. options.start = (options.start !== undefined) ? options.start : (options.page - 1) * me.pageSize;
  48229. options.limit = options.limit || me.pageSize;
  48230. options.addRecords = options.addRecords || false;
  48231. if (me.buffered) {
  48232. return me.loadToPrefetch(options);
  48233. }
  48234. return me.callParent([options]);
  48235. },
  48236. reload: function(options) {
  48237. var me = this,
  48238. startIdx,
  48239. endIdx,
  48240. startPage,
  48241. endPage,
  48242. i,
  48243. waitForReload,
  48244. bufferZone,
  48245. records;
  48246. if (!options) {
  48247. options = {};
  48248. }
  48249. if (me.buffered) {
  48250. delete me.totalCount;
  48251. waitForReload = function() {
  48252. if (me.rangeCached(startIdx, endIdx)) {
  48253. me.loading = false;
  48254. me.pageMap.un('pageAdded', waitForReload);
  48255. records = me.pageMap.getRange(startIdx, endIdx);
  48256. me.loadRecords(records, {
  48257. start: startIdx
  48258. });
  48259. me.fireEvent('load', me, records, true);
  48260. }
  48261. };
  48262. bufferZone = Math.ceil((me.leadingBufferZone + me.trailingBufferZone) / 2);
  48263. startIdx = options.start || me.getAt(0).index;
  48264. endIdx = startIdx + (options.count || me.getCount()) - 1;
  48265. startPage = me.getPageFromRecordIndex(Math.max(startIdx - bufferZone, 0));
  48266. endPage = me.getPageFromRecordIndex(endIdx + bufferZone);
  48267. me.pageMap.clear(true);
  48268. if (me.fireEvent('beforeload', me, options) !== false) {
  48269. me.loading = true;
  48270. for (i = startPage; i <= endPage; i++) {
  48271. me.prefetchPage(i, options);
  48272. }
  48273. me.pageMap.on('pageAdded', waitForReload);
  48274. }
  48275. } else {
  48276. return me.callParent(arguments);
  48277. }
  48278. },
  48279. onProxyLoad: function(operation) {
  48280. var me = this,
  48281. resultSet = operation.getResultSet(),
  48282. records = operation.getRecords(),
  48283. successful = operation.wasSuccessful();
  48284. if (resultSet) {
  48285. me.totalCount = resultSet.total;
  48286. }
  48287. if (successful) {
  48288. me.loadRecords(records, operation);
  48289. }
  48290. me.loading = false;
  48291. if (me.hasListeners.load) {
  48292. me.fireEvent('load', me, records, successful);
  48293. }
  48294. if (me.hasListeners.read) {
  48295. me.fireEvent('read', me, records, successful);
  48296. }
  48297. Ext.callback(operation.callback, operation.scope || me, [records, operation, successful]);
  48298. },
  48299. getNewRecords: function() {
  48300. return this.data.filterBy(this.filterNew).items;
  48301. },
  48302. getUpdatedRecords: function() {
  48303. return this.data.filterBy(this.filterUpdated).items;
  48304. },
  48305. filter: function(filters, value) {
  48306. if (Ext.isString(filters)) {
  48307. filters = {
  48308. property: filters,
  48309. value: value
  48310. };
  48311. }
  48312. var me = this,
  48313. decoded = me.decodeFilters(filters),
  48314. i = 0,
  48315. doLocalSort = me.sorters.length && me.sortOnFilter && !me.remoteSort,
  48316. length = decoded.length;
  48317. for (; i < length; i++) {
  48318. me.filters.replace(decoded[i]);
  48319. }
  48320. if (me.remoteFilter) {
  48321. delete me.totalCount;
  48322. if (me.buffered) {
  48323. me.pageMap.clear();
  48324. me.loadPage(1);
  48325. } else {
  48326. me.currentPage = 1;
  48327. me.load();
  48328. }
  48329. } else {
  48330. if (me.filters.getCount()) {
  48331. me.snapshot = me.snapshot || me.data.clone();
  48332. me.data = me.data.filter(me.filters.items);
  48333. if (doLocalSort) {
  48334. me.sort();
  48335. } else {
  48336. me.fireEvent('datachanged', me);
  48337. me.fireEvent('refresh', me);
  48338. }
  48339. }
  48340. }
  48341. },
  48342. clearFilter: function(suppressEvent) {
  48343. var me = this;
  48344. me.filters.clear();
  48345. if (me.remoteFilter) {
  48346. if (suppressEvent) {
  48347. return;
  48348. }
  48349. delete me.totalCount;
  48350. if (me.buffered) {
  48351. me.pageMap.clear();
  48352. me.loadPage(1);
  48353. } else {
  48354. me.currentPage = 1;
  48355. me.load();
  48356. }
  48357. } else if (me.isFiltered()) {
  48358. me.data = me.snapshot.clone();
  48359. delete me.snapshot;
  48360. if (suppressEvent !== true) {
  48361. me.fireEvent('datachanged', me);
  48362. me.fireEvent('refresh', me);
  48363. }
  48364. }
  48365. },
  48366. isFiltered: function() {
  48367. var snapshot = this.snapshot;
  48368. return !! snapshot && snapshot !== this.data;
  48369. },
  48370. filterBy: function(fn, scope) {
  48371. var me = this;
  48372. me.snapshot = me.snapshot || me.data.clone();
  48373. me.data = me.queryBy(fn, scope || me);
  48374. me.fireEvent('datachanged', me);
  48375. me.fireEvent('refresh', me);
  48376. },
  48377. queryBy: function(fn, scope) {
  48378. var me = this,
  48379. data = me.snapshot || me.data;
  48380. return data.filterBy(fn, scope || me);
  48381. },
  48382. query: function(property, value, anyMatch, caseSensitive, exactMatch) {
  48383. var me = this,
  48384. queryFn = me.createFilterFn(property, value, anyMatch, caseSensitive, exactMatch),
  48385. results = me.queryBy(queryFn);
  48386. if(!results) {
  48387. results = new Ext.util.MixedCollection();
  48388. }
  48389. return results;
  48390. },
  48391. loadData: function(data, append) {
  48392. var me = this,
  48393. model = me.model,
  48394. length = data.length,
  48395. newData = [],
  48396. i,
  48397. record;
  48398. for (i = 0; i < length; i++) {
  48399. record = data[i];
  48400. if (!(record.isModel)) {
  48401. record = Ext.ModelManager.create(record, model);
  48402. }
  48403. newData.push(record);
  48404. }
  48405. me.loadRecords(newData, append ? me.addRecordsOptions : undefined);
  48406. },
  48407. loadRawData : function(data, append) {
  48408. var me = this,
  48409. result = me.proxy.reader.read(data),
  48410. records = result.records;
  48411. if (result.success) {
  48412. me.totalCount = result.total;
  48413. me.loadRecords(records, append ? me.addRecordsOptions : undefined);
  48414. me.fireEvent('load', me, records, true);
  48415. }
  48416. },
  48417. loadRecords: function(records, options) {
  48418. var me = this,
  48419. i = 0,
  48420. length = records.length,
  48421. start,
  48422. addRecords,
  48423. snapshot = me.snapshot;
  48424. if (options) {
  48425. start = options.start;
  48426. addRecords = options.addRecords;
  48427. }
  48428. if (!addRecords) {
  48429. delete me.snapshot;
  48430. me.clearData(true);
  48431. } else if (snapshot) {
  48432. snapshot.addAll(records);
  48433. }
  48434. me.data.addAll(records);
  48435. if (start !== undefined) {
  48436. for (; i < length; i++) {
  48437. records[i].index = start + i;
  48438. records[i].join(me);
  48439. }
  48440. } else {
  48441. for (; i < length; i++) {
  48442. records[i].join(me);
  48443. }
  48444. }
  48445. me.suspendEvents();
  48446. if (me.filterOnLoad && !me.remoteFilter) {
  48447. me.filter();
  48448. }
  48449. if (me.sortOnLoad && !me.remoteSort) {
  48450. me.sort(undefined, undefined, undefined, true);
  48451. }
  48452. me.resumeEvents();
  48453. me.fireEvent('datachanged', me);
  48454. me.fireEvent('refresh', me);
  48455. },
  48456. loadPage: function(page, options) {
  48457. var me = this;
  48458. me.currentPage = page;
  48459. options = Ext.apply({
  48460. page: page,
  48461. start: (page - 1) * me.pageSize,
  48462. limit: me.pageSize,
  48463. addRecords: !me.clearOnPageLoad
  48464. }, options);
  48465. if (me.buffered) {
  48466. return me.loadToPrefetch(options);
  48467. }
  48468. me.read(options);
  48469. },
  48470. nextPage: function(options) {
  48471. this.loadPage(this.currentPage + 1, options);
  48472. },
  48473. previousPage: function(options) {
  48474. this.loadPage(this.currentPage - 1, options);
  48475. },
  48476. clearData: function(isLoad) {
  48477. var me = this,
  48478. records = me.data.items,
  48479. i = records.length;
  48480. while (i--) {
  48481. records[i].unjoin(me);
  48482. }
  48483. me.data.clear();
  48484. if (isLoad !== true || me.clearRemovedOnLoad) {
  48485. me.removed.length = 0;
  48486. }
  48487. },
  48488. loadToPrefetch: function(options) {
  48489. var me = this,
  48490. i,
  48491. records,
  48492. startIdx = options.start,
  48493. endIdx = options.start + options.limit - 1,
  48494. loadEndIdx = options.start + (me.viewSize || options.limit) - 1,
  48495. startPage = me.getPageFromRecordIndex(Math.max(startIdx - me.trailingBufferZone, 0)),
  48496. endPage = me.getPageFromRecordIndex(endIdx + me.leadingBufferZone),
  48497. waitForRequestedRange = function() {
  48498. if (me.rangeCached(startIdx, loadEndIdx)) {
  48499. me.loading = false;
  48500. records = me.pageMap.getRange(startIdx, loadEndIdx);
  48501. me.pageMap.un('pageAdded', waitForRequestedRange);
  48502. if (me.hasListeners.guaranteedrange) {
  48503. me.guaranteeRange(startIdx, loadEndIdx, options.callback, options.scope);
  48504. }
  48505. else {
  48506. me.loadRecords(records, {
  48507. start: startIdx
  48508. });
  48509. }
  48510. me.fireEvent('load', me, records, true);
  48511. if (options.groupChange) {
  48512. me.fireGroupChange();
  48513. }
  48514. }
  48515. };
  48516. if (me.fireEvent('beforeload', me, options) !== false) {
  48517. delete me.totalCount;
  48518. me.loading = true;
  48519. me.pageMap.on('pageAdded', waitForRequestedRange);
  48520. me.on('prefetch', function(){
  48521. for (i = startPage + 1; i <= endPage; ++i) {
  48522. me.prefetchPage(i, options);
  48523. }
  48524. }, null, {single: true});
  48525. me.prefetchPage(startPage, options);
  48526. }
  48527. },
  48528. prefetch: function(options) {
  48529. var me = this,
  48530. pageSize = me.pageSize,
  48531. proxy,
  48532. operation;
  48533. if (pageSize) {
  48534. if (me.lastPageSize && pageSize != me.lastPageSize) {
  48535. Ext.error.raise("pageSize cannot be dynamically altered");
  48536. }
  48537. if (!me.pageMap.pageSize) {
  48538. me.pageMap.pageSize = pageSize;
  48539. }
  48540. }
  48541. else {
  48542. me.pageSize = me.pageMap.pageSize = pageSize = options.limit;
  48543. }
  48544. me.lastPageSize = pageSize;
  48545. if (!options.page) {
  48546. options.page = me.getPageFromRecordIndex(options.start);
  48547. options.start = (options.page - 1) * pageSize;
  48548. options.limit = Math.ceil(options.limit / pageSize) * pageSize;
  48549. }
  48550. if (!me.pageRequests[options.page]) {
  48551. options = Ext.apply({
  48552. action : 'read',
  48553. filters: me.filters.items,
  48554. sorters: me.sorters.items,
  48555. groupers: me.groupers.items,
  48556. generation: me.pageMap.generation
  48557. }, options);
  48558. operation = new Ext.data.Operation(options);
  48559. if (me.fireEvent('beforeprefetch', me, operation) !== false) {
  48560. me.loading = true;
  48561. proxy = me.proxy;
  48562. me.pageRequests[options.page] = proxy.read(operation, me.onProxyPrefetch, me);
  48563. if (proxy.isSynchronous) {
  48564. delete me.pageRequests[options.page];
  48565. }
  48566. }
  48567. }
  48568. return me;
  48569. },
  48570. cancelAllPrefetches: function() {
  48571. var me = this,
  48572. reqs = me.pageRequests,
  48573. req,
  48574. page;
  48575. if (me.pageMap.events.pageadded) {
  48576. me.pageMap.events.pageadded.clearListeners();
  48577. }
  48578. for (page in reqs) {
  48579. if (reqs.hasOwnProperty(page)) {
  48580. req = reqs[page];
  48581. delete reqs[page];
  48582. delete req.callback;
  48583. }
  48584. }
  48585. },
  48586. prefetchPage: function(page, options) {
  48587. var me = this,
  48588. pageSize = me.pageSize || me.defaultPageSize,
  48589. start = (page - 1) * me.pageSize,
  48590. total = me.totalCount;
  48591. if (total !== undefined && me.getCount() === total) {
  48592. return;
  48593. }
  48594. me.prefetch(Ext.applyIf({
  48595. page : page,
  48596. start : start,
  48597. limit : pageSize
  48598. }, options));
  48599. },
  48600. onProxyPrefetch: function(operation) {
  48601. var me = this,
  48602. resultSet = operation.getResultSet(),
  48603. records = operation.getRecords(),
  48604. successful = operation.wasSuccessful(),
  48605. page = operation.page;
  48606. if (operation.generation === me.pageMap.generation) {
  48607. if (resultSet) {
  48608. me.totalCount = resultSet.total;
  48609. me.fireEvent('totalcountchange', me.totalCount);
  48610. }
  48611. if (page !== undefined) {
  48612. delete me.pageRequests[page];
  48613. }
  48614. if (successful) {
  48615. me.cachePage(records, operation.page);
  48616. }
  48617. me.loading = false;
  48618. me.fireEvent('prefetch', me, records, successful, operation);
  48619. Ext.callback(operation.callback, operation.scope || me, [records, operation, successful]);
  48620. }
  48621. },
  48622. cachePage: function(records, page) {
  48623. var me = this;
  48624. if (!Ext.isDefined(me.totalCount)) {
  48625. me.totalCount = records.length;
  48626. me.fireEvent('totalcountchange', me.totalCount);
  48627. }
  48628. me.pageMap.addPage(page, records);
  48629. },
  48630. rangeCached: function(start, end) {
  48631. return this.pageMap && this.pageMap.hasRange(start, end);
  48632. },
  48633. pageCached: function(page) {
  48634. return this.pageMap && this.pageMap.hasPage(page);
  48635. },
  48636. rangeSatisfied: function(start, end) {
  48637. return this.rangeCached(start, end);
  48638. },
  48639. getPageFromRecordIndex: function(index) {
  48640. return Math.floor(index / this.pageSize) + 1;
  48641. },
  48642. onGuaranteedRange: function(options) {
  48643. var me = this,
  48644. totalCount = me.getTotalCount(),
  48645. start = options.prefetchStart,
  48646. end = ((totalCount - 1) < options.prefetchEnd) ? totalCount - 1 : options.prefetchEnd,
  48647. range;
  48648. end = Math.max(0, end);
  48649. range = me.pageMap.getRange(start, end);
  48650. me.fireEvent('guaranteedrange', range, start, end);
  48651. if (options.cb) {
  48652. options.cb.call(options.scope || me, range, start, end);
  48653. }
  48654. },
  48655. prefetchRange: function(start, end) {
  48656. var me = this,
  48657. startPage, endPage, page;
  48658. if (!me.rangeCached(start, end)) {
  48659. startPage = me.getPageFromRecordIndex(start);
  48660. endPage = me.getPageFromRecordIndex(end);
  48661. me.pageMap.maxSize = me.purgePageCount ? (endPage - startPage + 1) + me.purgePageCount : 0;
  48662. for (page = startPage; page <= endPage; page++) {
  48663. if (!me.pageCached(page)) {
  48664. me.prefetchPage(page);
  48665. }
  48666. }
  48667. }
  48668. },
  48669. guaranteeRange: function(start, end, cb, scope) {
  48670. end = (end > this.totalCount) ? this.totalCount - 1 : end;
  48671. var me = this,
  48672. lastRequestStart = me.lastRequestStart,
  48673. options = {
  48674. prefetchStart: start,
  48675. prefetchEnd: end,
  48676. cb: cb,
  48677. scope: scope
  48678. },
  48679. pageAddHandler;
  48680. me.lastRequestStart = start;
  48681. if (me.rangeCached(start, end)) {
  48682. if (start < lastRequestStart) {
  48683. start = Math.max(start - me.leadingBufferZone, 0);
  48684. end = Math.min(end + me.trailingBufferZone, me.totalCount - 1);
  48685. } else {
  48686. start = Math.max(Math.min(start - me.trailingBufferZone, me.totalCount - me.pageSize), 0);
  48687. end = Math.min(end + me.leadingBufferZone, me.totalCount - 1);
  48688. }
  48689. if (!me.rangeCached(start, end)) {
  48690. me.prefetchRange(start, end);
  48691. }
  48692. me.onGuaranteedRange(options);
  48693. }
  48694. else {
  48695. me.fireEvent('cachemiss', me, start, end);
  48696. start = Math.min(Math.max(Math.floor(start - ((me.leadingBufferZone + me.trailingBufferZone) / 2)), 0), me.totalCount - me.pageSize);
  48697. end = Math.min(Math.max(Math.ceil (end + ((me.leadingBufferZone + me.trailingBufferZone) / 2)), 0), me.totalCount - 1);
  48698. pageAddHandler = function(page, records) {
  48699. if (me.rangeCached(options.prefetchStart, options.prefetchEnd)) {
  48700. me.fireEvent('cachefilled', me, start, end);
  48701. me.pageMap.un('pageAdded', pageAddHandler);
  48702. me.onGuaranteedRange(options);
  48703. }
  48704. };
  48705. me.pageMap.on('pageAdded', pageAddHandler);
  48706. me.prefetchRange(options.prefetchStart, options.prefetchEnd);
  48707. me.prefetchRange(start, end);
  48708. }
  48709. },
  48710. sort: function() {
  48711. var me = this,
  48712. prefetchData = me.pageMap;
  48713. if (me.buffered) {
  48714. if (me.remoteSort) {
  48715. prefetchData.clear();
  48716. me.callParent(arguments);
  48717. } else {
  48718. me.callParent(arguments);
  48719. }
  48720. } else {
  48721. me.callParent(arguments);
  48722. }
  48723. },
  48724. doSort: function(sorterFn) {
  48725. var me = this,
  48726. range,
  48727. ln,
  48728. i;
  48729. if (me.remoteSort) {
  48730. if (me.buffered) {
  48731. me.pageMap.clear();
  48732. me.loadPage(1);
  48733. } else {
  48734. me.load();
  48735. }
  48736. } else {
  48737. me.data.sortBy(sorterFn);
  48738. if (!me.buffered) {
  48739. range = me.getRange();
  48740. ln = range.length;
  48741. for (i = 0; i < ln; i++) {
  48742. range[i].index = i;
  48743. }
  48744. }
  48745. me.fireEvent('datachanged', me);
  48746. me.fireEvent('refresh', me);
  48747. }
  48748. },
  48749. find: function(property, value, start, anyMatch, caseSensitive, exactMatch) {
  48750. var fn = this.createFilterFn(property, value, anyMatch, caseSensitive, exactMatch);
  48751. return fn ? this.data.findIndexBy(fn, null, start) : -1;
  48752. },
  48753. findRecord: function() {
  48754. var me = this,
  48755. index = me.find.apply(me, arguments);
  48756. return index !== -1 ? me.getAt(index) : null;
  48757. },
  48758. createFilterFn: function(property, value, anyMatch, caseSensitive, exactMatch) {
  48759. if (Ext.isEmpty(value)) {
  48760. return false;
  48761. }
  48762. value = this.data.createValueMatcher(value, anyMatch, caseSensitive, exactMatch);
  48763. return function(r) {
  48764. return value.test(r.data[property]);
  48765. };
  48766. },
  48767. findExact: function(property, value, start) {
  48768. return this.data.findIndexBy(function(rec) {
  48769. return rec.isEqual(rec.get(property), value);
  48770. },
  48771. this, start);
  48772. },
  48773. findBy: function(fn, scope, start) {
  48774. return this.data.findIndexBy(fn, scope, start);
  48775. },
  48776. collect: function(dataIndex, allowNull, bypassFilter) {
  48777. var me = this,
  48778. data = (bypassFilter === true && me.snapshot) ? me.snapshot : me.data;
  48779. return data.collect(dataIndex, 'data', allowNull);
  48780. },
  48781. getCount: function() {
  48782. return this.data.length || 0;
  48783. },
  48784. getTotalCount: function() {
  48785. return this.totalCount || 0;
  48786. },
  48787. getAt: function(index) {
  48788. return this.data.getAt(index);
  48789. },
  48790. getRange: function(start, end) {
  48791. return this.data.getRange(start, end);
  48792. },
  48793. getById: function(id) {
  48794. return (this.snapshot || this.data).findBy(function(record) {
  48795. return record.getId() === id;
  48796. });
  48797. },
  48798. indexOf: function(record) {
  48799. return this.data.indexOf(record);
  48800. },
  48801. indexOfTotal: function(record) {
  48802. var index = record.index;
  48803. if (index || index === 0) {
  48804. return index;
  48805. }
  48806. return this.indexOf(record);
  48807. },
  48808. indexOfId: function(id) {
  48809. return this.indexOf(this.getById(id));
  48810. },
  48811. removeAll: function(silent) {
  48812. var me = this;
  48813. me.clearData();
  48814. if (me.snapshot) {
  48815. me.snapshot.clear();
  48816. }
  48817. if (me.pageMap) {
  48818. me.pageMap.clear();
  48819. }
  48820. if (silent !== true) {
  48821. me.fireEvent('clear', me);
  48822. }
  48823. },
  48824. first: function(grouped) {
  48825. var me = this;
  48826. if (grouped && me.isGrouped()) {
  48827. return me.aggregate(function(records) {
  48828. return records.length ? records[0] : undefined;
  48829. }, me, true);
  48830. } else {
  48831. return me.data.first();
  48832. }
  48833. },
  48834. last: function(grouped) {
  48835. var me = this;
  48836. if (grouped && me.isGrouped()) {
  48837. return me.aggregate(function(records) {
  48838. var len = records.length;
  48839. return len ? records[len - 1] : undefined;
  48840. }, me, true);
  48841. } else {
  48842. return me.data.last();
  48843. }
  48844. },
  48845. sum: function(field, grouped) {
  48846. var me = this;
  48847. if (grouped && me.isGrouped()) {
  48848. return me.aggregate(me.getSum, me, true, [field]);
  48849. } else {
  48850. return me.getSum(me.data.items, field);
  48851. }
  48852. },
  48853. getSum: function(records, field) {
  48854. var total = 0,
  48855. i = 0,
  48856. len = records.length;
  48857. for (; i < len; ++i) {
  48858. total += records[i].get(field);
  48859. }
  48860. return total;
  48861. },
  48862. count: function(grouped) {
  48863. var me = this;
  48864. if (grouped && me.isGrouped()) {
  48865. return me.aggregate(function(records) {
  48866. return records.length;
  48867. }, me, true);
  48868. } else {
  48869. return me.getCount();
  48870. }
  48871. },
  48872. min: function(field, grouped) {
  48873. var me = this;
  48874. if (grouped && me.isGrouped()) {
  48875. return me.aggregate(me.getMin, me, true, [field]);
  48876. } else {
  48877. return me.getMin(me.data.items, field);
  48878. }
  48879. },
  48880. getMin: function(records, field) {
  48881. var i = 1,
  48882. len = records.length,
  48883. value, min;
  48884. if (len > 0) {
  48885. min = records[0].get(field);
  48886. }
  48887. for (; i < len; ++i) {
  48888. value = records[i].get(field);
  48889. if (value < min) {
  48890. min = value;
  48891. }
  48892. }
  48893. return min;
  48894. },
  48895. max: function(field, grouped) {
  48896. var me = this;
  48897. if (grouped && me.isGrouped()) {
  48898. return me.aggregate(me.getMax, me, true, [field]);
  48899. } else {
  48900. return me.getMax(me.data.items, field);
  48901. }
  48902. },
  48903. getMax: function(records, field) {
  48904. var i = 1,
  48905. len = records.length,
  48906. value,
  48907. max;
  48908. if (len > 0) {
  48909. max = records[0].get(field);
  48910. }
  48911. for (; i < len; ++i) {
  48912. value = records[i].get(field);
  48913. if (value > max) {
  48914. max = value;
  48915. }
  48916. }
  48917. return max;
  48918. },
  48919. average: function(field, grouped) {
  48920. var me = this;
  48921. if (grouped && me.isGrouped()) {
  48922. return me.aggregate(me.getAverage, me, true, [field]);
  48923. } else {
  48924. return me.getAverage(me.data.items, field);
  48925. }
  48926. },
  48927. getAverage: function(records, field) {
  48928. var i = 0,
  48929. len = records.length,
  48930. sum = 0;
  48931. if (records.length > 0) {
  48932. for (; i < len; ++i) {
  48933. sum += records[i].get(field);
  48934. }
  48935. return sum / len;
  48936. }
  48937. return 0;
  48938. },
  48939. aggregate: function(fn, scope, grouped, args) {
  48940. args = args || [];
  48941. if (grouped && this.isGrouped()) {
  48942. var groups = this.getGroups(),
  48943. i = 0,
  48944. len = groups.length,
  48945. out = {},
  48946. group;
  48947. for (; i < len; ++i) {
  48948. group = groups[i];
  48949. out[group.name] = fn.apply(scope || this, [group.children].concat(args));
  48950. }
  48951. return out;
  48952. } else {
  48953. return fn.apply(scope || this, [this.data.items].concat(args));
  48954. }
  48955. },
  48956. commitChanges : function(){
  48957. var me = this,
  48958. recs = me.getModifiedRecords(),
  48959. len = recs.length,
  48960. i = 0;
  48961. for (; i < len; i++){
  48962. recs[i].commit();
  48963. }
  48964. me.removed.length = 0;
  48965. },
  48966. filterNewOnly: function(item){
  48967. return item.phantom === true;
  48968. },
  48969. getRejectRecords: function() {
  48970. return Ext.Array.push(this.data.filterBy(this.filterNewOnly).items, this.getUpdatedRecords());
  48971. },
  48972. rejectChanges : function() {
  48973. var me = this,
  48974. recs = me.getRejectRecords(),
  48975. len = recs.length,
  48976. i = 0,
  48977. rec;
  48978. for (; i < len; i++) {
  48979. rec = recs[i];
  48980. rec.reject();
  48981. if (rec.phantom) {
  48982. me.remove(rec);
  48983. }
  48984. }
  48985. recs = me.removed;
  48986. len = recs.length;
  48987. for (i = 0; i < len; i++) {
  48988. rec = recs[i];
  48989. me.insert(rec.removedFrom || 0, rec);
  48990. rec.reject();
  48991. }
  48992. me.removed.length = 0;
  48993. }
  48994. }, function() {
  48995. Ext.regStore('ext-empty-store', {fields: [], proxy: 'memory'});
  48996. this.prototype.PageMap = new Ext.Class({
  48997. extend: 'Ext.util.LruCache',
  48998. clear: function(initial) {
  48999. this.generation = (this.generation ||0) + 1;
  49000. this.callParent(arguments);
  49001. },
  49002. getPageFromRecordIndex: this.prototype.getPageFromRecordIndex,
  49003. addPage: function(page, records) {
  49004. this.add(page, records);
  49005. this.fireEvent('pageAdded', page, records);
  49006. },
  49007. getPage: function(page) {
  49008. return this.get(page);
  49009. },
  49010. hasRange: function(start, end) {
  49011. var page = this.getPageFromRecordIndex(start),
  49012. endPage = this.getPageFromRecordIndex(end);
  49013. for (; page <= endPage; page++) {
  49014. if (!this.hasPage(page)) {
  49015. return false;
  49016. }
  49017. }
  49018. return true;
  49019. },
  49020. hasPage: function(page) {
  49021. return !!this.get(page);
  49022. },
  49023. getRange: function(start, end) {
  49024. if (!this.hasRange(start, end)) {
  49025. Ext.Error.raise('PageMap asked for range which it does not have');
  49026. }
  49027. var me = this,
  49028. startPage = me.getPageFromRecordIndex(start),
  49029. endPage = me.getPageFromRecordIndex(end),
  49030. dataStart = (startPage - 1) * me.pageSize,
  49031. dataEnd = (endPage * me.pageSize) - 1,
  49032. page = startPage,
  49033. result = [],
  49034. sliceBegin, sliceEnd, doSlice,
  49035. i = 0, len;
  49036. for (; page <= endPage; page++) {
  49037. if (page == startPage) {
  49038. sliceBegin = start - dataStart;
  49039. doSlice = true;
  49040. } else {
  49041. sliceBegin = 0;
  49042. doSlice = false;
  49043. }
  49044. if (page == endPage) {
  49045. sliceEnd = me.pageSize - (dataEnd - end);
  49046. doSlice = true;
  49047. }
  49048. if (doSlice) {
  49049. Ext.Array.push(result, Ext.Array.slice(me.getPage(page), sliceBegin, sliceEnd));
  49050. } else {
  49051. Ext.Array.push(result, me.getPage(page));
  49052. }
  49053. }
  49054. for (len = result.length; i < len; i++) {
  49055. result[i].index = start++;
  49056. }
  49057. return result;
  49058. }
  49059. });
  49060. });
  49061. Ext.define('Ext.data.reader.Array', {
  49062. extend: 'Ext.data.reader.Json',
  49063. alternateClassName: 'Ext.data.ArrayReader',
  49064. alias : 'reader.array',
  49065. totalProperty: undefined,
  49066. successProperty: undefined,
  49067. createFieldAccessExpression: function(field, fieldVarName, dataName) {
  49068. var index = (field.mapping == null) ? field.originalIndex : field.mapping,
  49069. result;
  49070. if (typeof index === 'function') {
  49071. result = fieldVarName + '.mapping(' + dataName + ', this)';
  49072. } else {
  49073. if (isNaN(index)) {
  49074. index = '"' + index + '"';
  49075. }
  49076. result = dataName + "[" + index + "]";
  49077. }
  49078. return result;
  49079. }
  49080. });
  49081. Ext.define('Ext.data.ArrayStore', {
  49082. extend: 'Ext.data.Store',
  49083. alias: 'store.array',
  49084. requires: [
  49085. 'Ext.data.proxy.Memory',
  49086. 'Ext.data.reader.Array'
  49087. ],
  49088. constructor: function(config) {
  49089. config = Ext.apply({
  49090. proxy: {
  49091. type: 'memory',
  49092. reader: 'array'
  49093. }
  49094. }, config);
  49095. this.callParent([config]);
  49096. },
  49097. loadData: function(data, append) {
  49098. if (this.expandData === true) {
  49099. var r = [],
  49100. i = 0,
  49101. ln = data.length;
  49102. for (; i < ln; i++) {
  49103. r[r.length] = [data[i]];
  49104. }
  49105. data = r;
  49106. }
  49107. this.callParent([data, append]);
  49108. }
  49109. }, function() {
  49110. Ext.data.SimpleStore = Ext.data.ArrayStore;
  49111. });
  49112. Ext.define('Ext.data.Batch', {
  49113. mixins: {
  49114. observable: 'Ext.util.Observable'
  49115. },
  49116. autoStart: false,
  49117. pauseOnException: false,
  49118. current: -1,
  49119. total: 0,
  49120. isRunning: false,
  49121. isComplete: false,
  49122. hasException: false,
  49123. constructor: function(config) {
  49124. var me = this;
  49125. me.mixins.observable.constructor.call(me, config);
  49126. me.operations = [];
  49127. me.exceptions = [];
  49128. },
  49129. add: function(operation) {
  49130. this.total++;
  49131. operation.setBatch(this);
  49132. this.operations.push(operation);
  49133. return this;
  49134. },
  49135. start: function( index) {
  49136. var me = this;
  49137. if (me.isRunning) {
  49138. return me;
  49139. }
  49140. me.exceptions.length = 0;
  49141. me.hasException = false;
  49142. me.isRunning = true;
  49143. return me.runOperation(Ext.isDefined(index) ? index : me.current + 1);
  49144. },
  49145. retry: function() {
  49146. return this.start(this.current);
  49147. },
  49148. runNextOperation: function() {
  49149. return this.runOperation(this.current + 1);
  49150. },
  49151. pause: function() {
  49152. this.isRunning = false;
  49153. return this;
  49154. },
  49155. runOperation: function(index) {
  49156. var me = this,
  49157. operations = me.operations,
  49158. operation = operations[index],
  49159. onProxyReturn;
  49160. if (operation === undefined) {
  49161. me.isRunning = false;
  49162. me.isComplete = true;
  49163. me.fireEvent('complete', me, operations[operations.length - 1]);
  49164. } else {
  49165. me.current = index;
  49166. onProxyReturn = function(operation) {
  49167. var hasException = operation.hasException();
  49168. if (hasException) {
  49169. me.hasException = true;
  49170. me.exceptions.push(operation);
  49171. me.fireEvent('exception', me, operation);
  49172. }
  49173. if (hasException && me.pauseOnException) {
  49174. me.pause();
  49175. } else {
  49176. operation.setCompleted();
  49177. me.fireEvent('operationcomplete', me, operation);
  49178. me.runNextOperation();
  49179. }
  49180. };
  49181. operation.setStarted();
  49182. me.proxy[operation.action](operation, onProxyReturn, me);
  49183. }
  49184. return me;
  49185. }
  49186. });
  49187. Ext.define('Ext.data.BufferStore', {
  49188. extend: 'Ext.data.Store',
  49189. alias: 'store.buffer',
  49190. sortOnLoad: false,
  49191. filterOnLoad: false,
  49192. constructor: function() {
  49193. Ext.Error.raise('The BufferStore class has been deprecated. Instead, specify the buffered config option on Ext.data.Store');
  49194. }
  49195. });
  49196. Ext.define('Ext.direct.Manager', {
  49197. singleton: true,
  49198. mixins: {
  49199. observable: 'Ext.util.Observable'
  49200. },
  49201. requires: ['Ext.util.MixedCollection'],
  49202. exceptions: {
  49203. TRANSPORT: 'xhr',
  49204. PARSE: 'parse',
  49205. LOGIN: 'login',
  49206. SERVER: 'exception'
  49207. },
  49208. constructor: function(){
  49209. var me = this;
  49210. me.addEvents(
  49211. 'event',
  49212. 'exception'
  49213. );
  49214. me.transactions = new Ext.util.MixedCollection();
  49215. me.providers = new Ext.util.MixedCollection();
  49216. me.mixins.observable.constructor.call(me);
  49217. },
  49218. addProvider : function(provider){
  49219. var me = this,
  49220. args = arguments,
  49221. i = 0,
  49222. len;
  49223. if (args.length > 1) {
  49224. for (len = args.length; i < len; ++i) {
  49225. me.addProvider(args[i]);
  49226. }
  49227. return;
  49228. }
  49229. if (!provider.isProvider) {
  49230. provider = Ext.create('direct.' + provider.type + 'provider', provider);
  49231. }
  49232. me.providers.add(provider);
  49233. provider.on('data', me.onProviderData, me);
  49234. if (!provider.isConnected()) {
  49235. provider.connect();
  49236. }
  49237. return provider;
  49238. },
  49239. getProvider : function(id){
  49240. return id.isProvider ? id : this.providers.get(id);
  49241. },
  49242. removeProvider : function(provider){
  49243. var me = this,
  49244. providers = me.providers;
  49245. provider = provider.isProvider ? provider : providers.get(provider);
  49246. if (provider) {
  49247. provider.un('data', me.onProviderData, me);
  49248. providers.remove(provider);
  49249. return provider;
  49250. }
  49251. return null;
  49252. },
  49253. addTransaction: function(transaction){
  49254. this.transactions.add(transaction);
  49255. return transaction;
  49256. },
  49257. removeTransaction: function(transaction){
  49258. transaction = this.getTransaction(transaction);
  49259. this.transactions.remove(transaction);
  49260. return transaction;
  49261. },
  49262. getTransaction: function(transaction){
  49263. return Ext.isObject(transaction) ? transaction : this.transactions.get(transaction);
  49264. },
  49265. onProviderData : function(provider, event){
  49266. var me = this,
  49267. i = 0,
  49268. len;
  49269. if (Ext.isArray(event)) {
  49270. for (len = event.length; i < len; ++i) {
  49271. me.onProviderData(provider, event[i]);
  49272. }
  49273. return;
  49274. }
  49275. if (event.name && event.name != 'event' && event.name != 'exception') {
  49276. me.fireEvent(event.name, event);
  49277. } else if (event.status === false) {
  49278. me.fireEvent('exception', event);
  49279. }
  49280. me.fireEvent('event', event, provider);
  49281. },
  49282. parseMethod: function(fn){
  49283. if (Ext.isString(fn)) {
  49284. var parts = fn.split('.'),
  49285. i = 0,
  49286. len = parts.length,
  49287. current = window;
  49288. while (current && i < len) {
  49289. current = current[parts[i]];
  49290. ++i;
  49291. }
  49292. fn = Ext.isFunction(current) ? current : null;
  49293. }
  49294. return fn || null;
  49295. }
  49296. }, function(){
  49297. Ext.Direct = Ext.direct.Manager;
  49298. });
  49299. Ext.define('Ext.data.proxy.Direct', {
  49300. extend: 'Ext.data.proxy.Server',
  49301. alternateClassName: 'Ext.data.DirectProxy',
  49302. alias: 'proxy.direct',
  49303. requires: ['Ext.direct.Manager'],
  49304. paramOrder: undefined,
  49305. paramsAsHash: true,
  49306. directFn : undefined,
  49307. paramOrderRe: /[\s,|]/,
  49308. constructor: function(config){
  49309. var me = this,
  49310. paramOrder,
  49311. fn,
  49312. api;
  49313. me.callParent(arguments);
  49314. paramOrder = me.paramOrder;
  49315. if (Ext.isString(paramOrder)) {
  49316. me.paramOrder = paramOrder.split(me.paramOrderRe);
  49317. }
  49318. fn = me.directFn;
  49319. if (fn) {
  49320. me.directFn = Ext.direct.Manager.parseMethod(fn);
  49321. }
  49322. api = me.api;
  49323. for (fn in api) {
  49324. if (api.hasOwnProperty(fn)) {
  49325. api[fn] = Ext.direct.Manager.parseMethod(api[fn]);
  49326. }
  49327. }
  49328. },
  49329. doRequest: function(operation, callback, scope) {
  49330. var me = this,
  49331. writer = me.getWriter(),
  49332. request = me.buildRequest(operation, callback, scope),
  49333. fn = me.api[request.action] || me.directFn,
  49334. params = request.params,
  49335. args = [],
  49336. method;
  49337. if (operation.allowWrite()) {
  49338. request = writer.write(request);
  49339. }
  49340. if (operation.action == 'read') {
  49341. method = fn.directCfg.method;
  49342. args = method.getArgs(params, me.paramOrder, me.paramsAsHash);
  49343. } else {
  49344. args.push(request.jsonData);
  49345. }
  49346. Ext.apply(request, {
  49347. args: args,
  49348. directFn: fn
  49349. });
  49350. args.push(me.createRequestCallback(request, operation, callback, scope), me);
  49351. fn.apply(window, args);
  49352. },
  49353. applyEncoding: function(value){
  49354. return value;
  49355. },
  49356. createRequestCallback: function(request, operation, callback, scope){
  49357. var me = this;
  49358. return function(data, event){
  49359. me.processResponse(event.status, operation, request, event, callback, scope);
  49360. };
  49361. },
  49362. extractResponseData: function(response){
  49363. return Ext.isDefined(response.result) ? response.result : response.data;
  49364. },
  49365. setException: function(operation, response) {
  49366. operation.setException(response.message);
  49367. },
  49368. buildUrl: function(){
  49369. return '';
  49370. }
  49371. });
  49372. Ext.define('Ext.data.DirectStore', {
  49373. extend: 'Ext.data.Store',
  49374. alias: 'store.direct',
  49375. requires: ['Ext.data.proxy.Direct'],
  49376. constructor : function(config){
  49377. config = Ext.apply({}, config);
  49378. if (!config.proxy) {
  49379. var proxy = {
  49380. type: 'direct',
  49381. reader: {
  49382. type: 'json'
  49383. }
  49384. };
  49385. Ext.copyTo(proxy, config, 'paramOrder,paramsAsHash,directFn,api,simpleSortMode');
  49386. Ext.copyTo(proxy.reader, config, 'totalProperty,root,idProperty');
  49387. config.proxy = proxy;
  49388. }
  49389. this.callParent([config]);
  49390. }
  49391. });
  49392. Ext.define('Ext.data.JsonP', {
  49393. singleton: true,
  49394. requestCount: 0,
  49395. requests: {},
  49396. timeout: 30000,
  49397. disableCaching: true,
  49398. disableCachingParam: '_dc',
  49399. callbackKey: 'callback',
  49400. request: function(options){
  49401. options = Ext.apply({}, options);
  49402. var me = this,
  49403. disableCaching = Ext.isDefined(options.disableCaching) ? options.disableCaching : me.disableCaching,
  49404. cacheParam = options.disableCachingParam || me.disableCachingParam,
  49405. id = ++me.requestCount,
  49406. callbackName = options.callbackName || 'callback' + id,
  49407. callbackKey = options.callbackKey || me.callbackKey,
  49408. timeout = Ext.isDefined(options.timeout) ? options.timeout : me.timeout,
  49409. params = Ext.apply({}, options.params),
  49410. url = options.url,
  49411. name = Ext.name,
  49412. request,
  49413. script;
  49414. params[callbackKey] = name + '.data.JsonP.' + callbackName;
  49415. if (disableCaching) {
  49416. params[cacheParam] = new Date().getTime();
  49417. }
  49418. script = me.createScript(url, params, options);
  49419. me.requests[id] = request = {
  49420. url: url,
  49421. params: params,
  49422. script: script,
  49423. id: id,
  49424. scope: options.scope,
  49425. success: options.success,
  49426. failure: options.failure,
  49427. callback: options.callback,
  49428. callbackKey: callbackKey,
  49429. callbackName: callbackName
  49430. };
  49431. if (timeout > 0) {
  49432. request.timeout = setTimeout(Ext.bind(me.handleTimeout, me, [request]), timeout);
  49433. }
  49434. me.setupErrorHandling(request);
  49435. me[callbackName] = Ext.bind(me.handleResponse, me, [request], true);
  49436. me.loadScript(request);
  49437. return request;
  49438. },
  49439. abort: function(request){
  49440. var me = this,
  49441. requests = me.requests,
  49442. key;
  49443. if (request) {
  49444. if (!request.id) {
  49445. request = requests[request];
  49446. }
  49447. me.handleAbort(request);
  49448. } else {
  49449. for (key in requests) {
  49450. if (requests.hasOwnProperty(key)) {
  49451. me.abort(requests[key]);
  49452. }
  49453. }
  49454. }
  49455. },
  49456. setupErrorHandling: function(request){
  49457. request.script.onerror = Ext.bind(this.handleError, this, [request]);
  49458. },
  49459. handleAbort: function(request){
  49460. request.errorType = 'abort';
  49461. this.handleResponse(null, request);
  49462. },
  49463. handleError: function(request){
  49464. request.errorType = 'error';
  49465. this.handleResponse(null, request);
  49466. },
  49467. cleanupErrorHandling: function(request){
  49468. request.script.onerror = null;
  49469. },
  49470. handleTimeout: function(request){
  49471. request.errorType = 'timeout';
  49472. this.handleResponse(null, request);
  49473. },
  49474. handleResponse: function(result, request){
  49475. var success = true;
  49476. if (request.timeout) {
  49477. clearTimeout(request.timeout);
  49478. }
  49479. delete this[request.callbackName];
  49480. delete this.requests[request.id];
  49481. this.cleanupErrorHandling(request);
  49482. Ext.fly(request.script).remove();
  49483. if (request.errorType) {
  49484. success = false;
  49485. Ext.callback(request.failure, request.scope, [request.errorType]);
  49486. } else {
  49487. Ext.callback(request.success, request.scope, [result]);
  49488. }
  49489. Ext.callback(request.callback, request.scope, [success, result, request.errorType]);
  49490. },
  49491. createScript: function(url, params, options) {
  49492. var script = document.createElement('script');
  49493. script.setAttribute("src", Ext.urlAppend(url, Ext.Object.toQueryString(params)));
  49494. script.setAttribute("async", true);
  49495. script.setAttribute("type", "text/javascript");
  49496. return script;
  49497. },
  49498. loadScript: function (request) {
  49499. Ext.getHead().appendChild(request.script);
  49500. }
  49501. });
  49502. Ext.define('Ext.data.proxy.JsonP', {
  49503. extend: 'Ext.data.proxy.Server',
  49504. alternateClassName: 'Ext.data.ScriptTagProxy',
  49505. alias: ['proxy.jsonp', 'proxy.scripttag'],
  49506. requires: ['Ext.data.JsonP'],
  49507. defaultWriterType: 'base',
  49508. callbackKey : 'callback',
  49509. recordParam: 'records',
  49510. autoAppendParams: true,
  49511. constructor: function(){
  49512. this.addEvents(
  49513. 'exception'
  49514. );
  49515. this.callParent(arguments);
  49516. },
  49517. doRequest: function(operation, callback, scope) {
  49518. var me = this,
  49519. writer = me.getWriter(),
  49520. request = me.buildRequest(operation),
  49521. params = request.params;
  49522. if (operation.allowWrite()) {
  49523. request = writer.write(request);
  49524. }
  49525. Ext.apply(request, {
  49526. callbackKey: me.callbackKey,
  49527. timeout: me.timeout,
  49528. scope: me,
  49529. disableCaching: false,
  49530. callback: me.createRequestCallback(request, operation, callback, scope)
  49531. });
  49532. if (me.autoAppendParams) {
  49533. request.params = {};
  49534. }
  49535. request.jsonp = Ext.data.JsonP.request(request);
  49536. request.params = params;
  49537. operation.setStarted();
  49538. me.lastRequest = request;
  49539. return request;
  49540. },
  49541. createRequestCallback: function(request, operation, callback, scope) {
  49542. var me = this;
  49543. return function(success, response, errorType) {
  49544. delete me.lastRequest;
  49545. me.processResponse(success, operation, request, response, callback, scope);
  49546. };
  49547. },
  49548. setException: function(operation, response) {
  49549. operation.setException(operation.request.jsonp.errorType);
  49550. },
  49551. buildUrl: function(request) {
  49552. var me = this,
  49553. url = me.callParent(arguments),
  49554. params = Ext.apply({}, request.params),
  49555. filters = params.filters,
  49556. records,
  49557. filter, i;
  49558. delete params.filters;
  49559. if (me.autoAppendParams) {
  49560. url = Ext.urlAppend(url, Ext.Object.toQueryString(params));
  49561. }
  49562. if (filters && filters.length) {
  49563. for (i = 0; i < filters.length; i++) {
  49564. filter = filters[i];
  49565. if (filter.value) {
  49566. url = Ext.urlAppend(url, filter.property + "=" + filter.value);
  49567. }
  49568. }
  49569. }
  49570. records = request.records;
  49571. if (Ext.isArray(records) && records.length > 0) {
  49572. url = Ext.urlAppend(url, Ext.String.format("{0}={1}", me.recordParam, me.encodeRecords(records)));
  49573. }
  49574. return url;
  49575. },
  49576. destroy: function() {
  49577. this.abort();
  49578. this.callParent(arguments);
  49579. },
  49580. abort: function() {
  49581. var lastRequest = this.lastRequest;
  49582. if (lastRequest) {
  49583. Ext.data.JsonP.abort(lastRequest.jsonp);
  49584. }
  49585. },
  49586. encodeRecords: function(records) {
  49587. var encoded = "",
  49588. i = 0,
  49589. len = records.length;
  49590. for (; i < len; i++) {
  49591. encoded += Ext.Object.toQueryString(records[i].getData());
  49592. }
  49593. return encoded;
  49594. }
  49595. });
  49596. Ext.define('Ext.data.JsonPStore', {
  49597. extend: 'Ext.data.Store',
  49598. alias : 'store.jsonp',
  49599. requires: [
  49600. 'Ext.data.proxy.JsonP',
  49601. 'Ext.data.reader.Json'
  49602. ],
  49603. constructor: function(config) {
  49604. config = Ext.apply({
  49605. proxy: {
  49606. type: 'jsonp',
  49607. reader: 'json'
  49608. }
  49609. }, config);
  49610. this.callParent([config]);
  49611. }
  49612. });
  49613. Ext.define('Ext.data.JsonStore', {
  49614. extend: 'Ext.data.Store',
  49615. alias: 'store.json',
  49616. requires: [
  49617. 'Ext.data.proxy.Ajax',
  49618. 'Ext.data.reader.Json',
  49619. 'Ext.data.writer.Json'
  49620. ],
  49621. constructor: function(config) {
  49622. config = Ext.apply({
  49623. proxy: {
  49624. type : 'ajax',
  49625. reader: 'json',
  49626. writer: 'json'
  49627. }
  49628. }, config);
  49629. this.callParent([config]);
  49630. }
  49631. });
  49632. Ext.define('Ext.data.NodeInterface', {
  49633. requires: ['Ext.data.Field'],
  49634. statics: {
  49635. decorate: function(modelClass) {
  49636. var idName, idType;
  49637. if (typeof modelClass == 'string') {
  49638. modelClass = Ext.ModelManager.getModel(modelClass);
  49639. } else if (modelClass.isModel) {
  49640. modelClass = Ext.ModelManager.getModel(modelClass.modelName);
  49641. }
  49642. if (modelClass.prototype.isNode) {
  49643. return;
  49644. }
  49645. idName = modelClass.prototype.idProperty;
  49646. idField = modelClass.prototype.fields.get(idName);
  49647. idType = modelClass.prototype.fields.get(idName).type.type;
  49648. modelClass.override(this.getPrototypeBody());
  49649. this.applyFields(modelClass, [
  49650. {name: 'parentId', type: idType, defaultValue: null, useNull: idField.useNull},
  49651. {name: 'index', type: 'int', defaultValue: null, persist: false},
  49652. {name: 'depth', type: 'int', defaultValue: 0, persist: false},
  49653. {name: 'expanded', type: 'bool', defaultValue: false, persist: false},
  49654. {name: 'expandable', type: 'bool', defaultValue: true, persist: false},
  49655. {name: 'checked', type: 'auto', defaultValue: null, persist: false},
  49656. {name: 'leaf', type: 'bool', defaultValue: false},
  49657. {name: 'cls', type: 'string', defaultValue: null, persist: false},
  49658. {name: 'iconCls', type: 'string', defaultValue: null, persist: false},
  49659. {name: 'icon', type: 'string', defaultValue: null, persist: false},
  49660. {name: 'root', type: 'boolean', defaultValue: false, persist: false},
  49661. {name: 'isLast', type: 'boolean', defaultValue: false, persist: false},
  49662. {name: 'isFirst', type: 'boolean', defaultValue: false, persist: false},
  49663. {name: 'allowDrop', type: 'boolean', defaultValue: true, persist: false},
  49664. {name: 'allowDrag', type: 'boolean', defaultValue: true, persist: false},
  49665. {name: 'loaded', type: 'boolean', defaultValue: false, persist: false},
  49666. {name: 'loading', type: 'boolean', defaultValue: false, persist: false},
  49667. {name: 'href', type: 'string', defaultValue: null, persist: false},
  49668. {name: 'hrefTarget', type: 'string', defaultValue: null, persist: false},
  49669. {name: 'qtip', type: 'string', defaultValue: null, persist: false},
  49670. {name: 'qtitle', type: 'string', defaultValue: null, persist: false},
  49671. {name: 'children', type: 'auto', defaultValue: null, persist: false}
  49672. ]);
  49673. },
  49674. applyFields: function(modelClass, addFields) {
  49675. var modelPrototype = modelClass.prototype,
  49676. fields = modelPrototype.fields,
  49677. keys = fields.keys,
  49678. ln = addFields.length,
  49679. addField, i;
  49680. for (i = 0; i < ln; i++) {
  49681. addField = addFields[i];
  49682. if (!Ext.Array.contains(keys, addField.name)) {
  49683. fields.add(new Ext.data.Field(addField));
  49684. }
  49685. }
  49686. },
  49687. getPrototypeBody: function() {
  49688. return {
  49689. isNode: true,
  49690. constructor: function() {
  49691. var me = this;
  49692. this.callParent(arguments);
  49693. Ext.applyIf(me, {
  49694. firstChild: null,
  49695. lastChild: null,
  49696. parentNode: null,
  49697. previousSibling: null,
  49698. nextSibling: null,
  49699. childNodes: []
  49700. });
  49701. me.enableBubble([
  49702. "append",
  49703. "remove",
  49704. "move",
  49705. "insert",
  49706. "beforeappend",
  49707. "beforeremove",
  49708. "beforemove",
  49709. "beforeinsert",
  49710. "expand",
  49711. "collapse",
  49712. "beforeexpand",
  49713. "beforecollapse",
  49714. "sort"
  49715. ]);
  49716. return me;
  49717. },
  49718. createNode: function(node) {
  49719. if (Ext.isObject(node) && !node.isModel) {
  49720. node = Ext.ModelManager.create(node, this.modelName);
  49721. }
  49722. if (!node.childNodes) {
  49723. Ext.applyIf(node, {
  49724. firstChild: null,
  49725. lastChild: null,
  49726. parentNode: null,
  49727. previousSibling: null,
  49728. nextSibling: null,
  49729. childNodes: []
  49730. });
  49731. }
  49732. return node;
  49733. },
  49734. isLeaf : function() {
  49735. return this.get('leaf') === true;
  49736. },
  49737. setFirstChild : function(node) {
  49738. this.firstChild = node;
  49739. },
  49740. setLastChild : function(node) {
  49741. this.lastChild = node;
  49742. },
  49743. updateInfo: function(commit) {
  49744. var me = this,
  49745. isRoot = me.isRoot(),
  49746. parentNode = me.parentNode,
  49747. isFirst = (!parentNode || isRoot ? true : parentNode.firstChild === me),
  49748. isLast = (!parentNode || isRoot ? true : parentNode.lastChild === me),
  49749. depth = 0,
  49750. parent = me,
  49751. children = me.childNodes,
  49752. len = children.length,
  49753. i = 0,
  49754. phantom = me.phantom;
  49755. while (parent.parentNode) {
  49756. ++depth;
  49757. parent = parent.parentNode;
  49758. }
  49759. me.beginEdit();
  49760. me.set({
  49761. isFirst: isFirst,
  49762. isLast: isLast,
  49763. depth: depth,
  49764. index: parentNode ? parentNode.indexOf(me) : 0,
  49765. parentId: parentNode ? parentNode.getId() : null
  49766. });
  49767. me.endEdit(true);
  49768. if (commit) {
  49769. me.commit();
  49770. me.phantom = phantom;
  49771. }
  49772. for (i = 0; i < len; i++) {
  49773. children[i].updateInfo(commit);
  49774. }
  49775. },
  49776. isLast : function() {
  49777. return this.get('isLast');
  49778. },
  49779. isFirst : function() {
  49780. return this.get('isFirst');
  49781. },
  49782. hasChildNodes : function() {
  49783. return !this.isLeaf() && this.childNodes.length > 0;
  49784. },
  49785. isExpandable : function() {
  49786. var me = this;
  49787. if (me.get('expandable')) {
  49788. return !(me.isLeaf() || (me.isLoaded() && !me.hasChildNodes()));
  49789. }
  49790. return false;
  49791. },
  49792. triggerUIUpdate: function(){
  49793. this.afterEdit([]);
  49794. },
  49795. appendChild : function(node, suppressEvents, commit) {
  49796. var me = this,
  49797. i, ln,
  49798. index,
  49799. oldParent,
  49800. ps;
  49801. if (Ext.isArray(node)) {
  49802. me.callStore('suspendAutoSync');
  49803. for (i = 0, ln = node.length - 1; i < ln; i++) {
  49804. me.appendChild(node[i]);
  49805. }
  49806. me.callStore('resumeAutoSync');
  49807. me.appendChild(node[ln]);
  49808. } else {
  49809. node = me.createNode(node);
  49810. if (suppressEvents !== true && (!me.hasListeners.beforeappend || me.fireEvent("beforeappend", me, node) === false)) {
  49811. return false;
  49812. }
  49813. index = me.childNodes.length;
  49814. oldParent = node.parentNode;
  49815. if (oldParent) {
  49816. if (suppressEvents !== true && (!me.hasListeners.beforeremove || node.fireEvent("beforemove", node, oldParent, me, index) === false)) {
  49817. return false;
  49818. }
  49819. oldParent.removeChild(node, false, false, true);
  49820. }
  49821. index = me.childNodes.length;
  49822. if (index === 0) {
  49823. me.setFirstChild(node);
  49824. }
  49825. me.childNodes.push(node);
  49826. node.parentNode = me;
  49827. node.nextSibling = null;
  49828. me.setLastChild(node);
  49829. ps = me.childNodes[index - 1];
  49830. if (ps) {
  49831. node.previousSibling = ps;
  49832. ps.nextSibling = node;
  49833. ps.updateInfo(commit);
  49834. } else {
  49835. node.previousSibling = null;
  49836. }
  49837. node.updateInfo(commit);
  49838. if (!me.isLoaded()) {
  49839. me.set('loaded', true);
  49840. } else if (me.childNodes.length === 1) {
  49841. me.triggerUIUpdate();
  49842. }
  49843. if(!node.isLeaf() && node.phantom) {
  49844. node.set('loaded', true);
  49845. }
  49846. if (suppressEvents !== true) {
  49847. me.fireEvent("append", me, node, index);
  49848. if (oldParent) {
  49849. node.fireEvent("move", node, oldParent, me, index);
  49850. }
  49851. }
  49852. return node;
  49853. }
  49854. },
  49855. getBubbleTarget: function() {
  49856. return this.parentNode;
  49857. },
  49858. removeChild : function(node, destroy, suppressEvents, isMove) {
  49859. var me = this,
  49860. index = me.indexOf(node),
  49861. i, childCount;
  49862. if (index == -1 || (suppressEvents !== true && (!me.hasListeners.beforeremove || me.fireEvent("beforeremove", me, node, !!isMove) === false))) {
  49863. return false;
  49864. }
  49865. Ext.Array.erase(me.childNodes, index, 1);
  49866. if (me.firstChild == node) {
  49867. me.setFirstChild(node.nextSibling);
  49868. }
  49869. if (me.lastChild == node) {
  49870. me.setLastChild(node.previousSibling);
  49871. }
  49872. if (node.previousSibling) {
  49873. node.previousSibling.nextSibling = node.nextSibling;
  49874. }
  49875. if (node.nextSibling) {
  49876. node.nextSibling.previousSibling = node.previousSibling;
  49877. }
  49878. for(i = index > 0 ? index - 1 : 0, childCount = me.childNodes.length; i < childCount; i++) {
  49879. me.childNodes[i].updateInfo();
  49880. }
  49881. if (!me.childNodes.length) {
  49882. me.triggerUIUpdate();
  49883. }
  49884. if (suppressEvents !== true) {
  49885. if (me.hasListeners.remove) {
  49886. me.fireEvent("remove", me, node, !!isMove);
  49887. }
  49888. }
  49889. if (destroy) {
  49890. node.destroy(true);
  49891. } else {
  49892. node.clear();
  49893. }
  49894. return node;
  49895. },
  49896. copy: function(newId, deep) {
  49897. var me = this,
  49898. result = me.callOverridden(arguments),
  49899. len = me.childNodes ? me.childNodes.length : 0,
  49900. i;
  49901. if (deep) {
  49902. for (i = 0; i < len; i++) {
  49903. result.appendChild(me.childNodes[i].copy(true));
  49904. }
  49905. }
  49906. return result;
  49907. },
  49908. clear : function(destroy) {
  49909. var me = this;
  49910. me.parentNode = me.previousSibling = me.nextSibling = null;
  49911. if (destroy) {
  49912. me.firstChild = me.lastChild = null;
  49913. }
  49914. },
  49915. destroy : function(silent) {
  49916. var me = this,
  49917. options = me.destroyOptions,
  49918. nodes = me.childNodes,
  49919. nLen = nodes.length,
  49920. n;
  49921. if (silent === true) {
  49922. me.clear(true);
  49923. for (n = 0; n < nLen; n++) {
  49924. nodes[n].destroy(true);
  49925. }
  49926. me.childNodes = null;
  49927. delete me.destroyOptions;
  49928. me.callOverridden([options]);
  49929. } else {
  49930. me.destroyOptions = silent;
  49931. me.remove(true);
  49932. }
  49933. },
  49934. insertBefore : function(node, refNode, suppressEvents) {
  49935. var me = this,
  49936. index = me.indexOf(refNode),
  49937. oldParent = node.parentNode,
  49938. refIndex = index,
  49939. childCount, ps, i;
  49940. if (!refNode) {
  49941. return me.appendChild(node);
  49942. }
  49943. if (node == refNode) {
  49944. return false;
  49945. }
  49946. node = me.createNode(node);
  49947. if (suppressEvents !== true && (!me.hasListeners.beforeinsert || me.fireEvent("beforeinsert", me, node, refNode) === false)) {
  49948. return false;
  49949. }
  49950. if (oldParent == me && me.indexOf(node) < index) {
  49951. refIndex--;
  49952. }
  49953. if (oldParent) {
  49954. if (suppressEvents !== true && (!me.hasListeners.beforeremove || node.fireEvent("beforemove", node, oldParent, me, index, refNode) === false)) {
  49955. return false;
  49956. }
  49957. oldParent.removeChild(node, false, false, true);
  49958. }
  49959. if (refIndex === 0) {
  49960. me.setFirstChild(node);
  49961. }
  49962. Ext.Array.splice(me.childNodes, refIndex, 0, node);
  49963. node.parentNode = me;
  49964. node.nextSibling = refNode;
  49965. refNode.previousSibling = node;
  49966. ps = me.childNodes[refIndex - 1];
  49967. if (ps) {
  49968. node.previousSibling = ps;
  49969. ps.nextSibling = node;
  49970. } else {
  49971. node.previousSibling = null;
  49972. }
  49973. for(i = refIndex > 0 ? refIndex - 1 : 0, childCount = me.childNodes.length; i < childCount; i++) {
  49974. me.childNodes[i].updateInfo();
  49975. }
  49976. if (!me.isLoaded()) {
  49977. me.set('loaded', true);
  49978. }
  49979. else if (me.childNodes.length === 1) {
  49980. me.triggerUIUpdate();
  49981. }
  49982. if(!node.isLeaf() && node.phantom) {
  49983. node.set('loaded', true);
  49984. }
  49985. if (suppressEvents !== true) {
  49986. if (me.hasListeners.insert) {
  49987. me.fireEvent("insert", me, node, refNode);
  49988. }
  49989. if (oldParent && me.hasListeners.move) {
  49990. node.fireEvent("move", node, oldParent, me, refIndex, refNode);
  49991. }
  49992. }
  49993. return node;
  49994. },
  49995. insertChild: function(index, node) {
  49996. var sibling = this.childNodes[index];
  49997. if (sibling) {
  49998. return this.insertBefore(node, sibling);
  49999. }
  50000. else {
  50001. return this.appendChild(node);
  50002. }
  50003. },
  50004. remove : function(destroy, suppressEvents) {
  50005. var parentNode = this.parentNode;
  50006. if (parentNode) {
  50007. parentNode.removeChild(this, destroy, suppressEvents);
  50008. }
  50009. return this;
  50010. },
  50011. removeAll : function(destroy, suppressEvents) {
  50012. var cn = this.childNodes,
  50013. n;
  50014. while ((n = cn[0])) {
  50015. this.removeChild(n, destroy, suppressEvents);
  50016. }
  50017. return this;
  50018. },
  50019. getChildAt : function(index) {
  50020. return this.childNodes[index];
  50021. },
  50022. replaceChild : function(newChild, oldChild, suppressEvents) {
  50023. var s = oldChild ? oldChild.nextSibling : null;
  50024. this.removeChild(oldChild, false, suppressEvents);
  50025. this.insertBefore(newChild, s, suppressEvents);
  50026. return oldChild;
  50027. },
  50028. indexOf : function(child) {
  50029. return Ext.Array.indexOf(this.childNodes, child);
  50030. },
  50031. indexOfId: function(id) {
  50032. var childNodes = this.childNodes,
  50033. len = childNodes.length,
  50034. i = 0;
  50035. for (; i < len; ++i) {
  50036. if (childNodes[i].getId() === id) {
  50037. return i;
  50038. }
  50039. }
  50040. return -1;
  50041. },
  50042. getPath: function(field, separator) {
  50043. field = field || this.idProperty;
  50044. separator = separator || '/';
  50045. var path = [this.get(field)],
  50046. parent = this.parentNode;
  50047. while (parent) {
  50048. path.unshift(parent.get(field));
  50049. parent = parent.parentNode;
  50050. }
  50051. return separator + path.join(separator);
  50052. },
  50053. getDepth : function() {
  50054. return this.get('depth');
  50055. },
  50056. bubble : function(fn, scope, args) {
  50057. var p = this;
  50058. while (p) {
  50059. if (fn.apply(scope || p, args || [p]) === false) {
  50060. break;
  50061. }
  50062. p = p.parentNode;
  50063. }
  50064. },
  50065. cascade: function() {
  50066. if (Ext.isDefined(Ext.global.console)) {
  50067. Ext.global.console.warn('Ext.data.Node: cascade has been deprecated. Please use cascadeBy instead.');
  50068. }
  50069. return this.cascadeBy.apply(this, arguments);
  50070. },
  50071. cascadeBy : function(fn, scope, args) {
  50072. if (fn.apply(scope || this, args || [this]) !== false) {
  50073. var childNodes = this.childNodes,
  50074. length = childNodes.length,
  50075. i;
  50076. for (i = 0; i < length; i++) {
  50077. childNodes[i].cascadeBy(fn, scope, args);
  50078. }
  50079. }
  50080. },
  50081. eachChild : function(fn, scope, args) {
  50082. var childNodes = this.childNodes,
  50083. length = childNodes.length,
  50084. i;
  50085. for (i = 0; i < length; i++) {
  50086. if (fn.apply(scope || this, args || [childNodes[i]]) === false) {
  50087. break;
  50088. }
  50089. }
  50090. },
  50091. findChild : function(attribute, value, deep) {
  50092. return this.findChildBy(function() {
  50093. return this.get(attribute) == value;
  50094. }, null, deep);
  50095. },
  50096. findChildBy : function(fn, scope, deep) {
  50097. var cs = this.childNodes,
  50098. len = cs.length,
  50099. i = 0, n, res;
  50100. for (; i < len; i++) {
  50101. n = cs[i];
  50102. if (fn.call(scope || n, n) === true) {
  50103. return n;
  50104. }
  50105. else if (deep) {
  50106. res = n.findChildBy(fn, scope, deep);
  50107. if (res !== null) {
  50108. return res;
  50109. }
  50110. }
  50111. }
  50112. return null;
  50113. },
  50114. contains : function(node) {
  50115. return node.isAncestor(this);
  50116. },
  50117. isAncestor : function(node) {
  50118. var p = this.parentNode;
  50119. while (p) {
  50120. if (p == node) {
  50121. return true;
  50122. }
  50123. p = p.parentNode;
  50124. }
  50125. return false;
  50126. },
  50127. sort : function(sortFn, recursive, suppressEvent) {
  50128. var cs = this.childNodes,
  50129. ln = cs.length,
  50130. i, n;
  50131. if (ln > 0) {
  50132. Ext.Array.sort(cs, sortFn);
  50133. for (i = 0; i < ln; i++) {
  50134. n = cs[i];
  50135. n.previousSibling = cs[i-1];
  50136. n.nextSibling = cs[i+1];
  50137. if (i === 0) {
  50138. this.setFirstChild(n);
  50139. }
  50140. if (i == ln - 1) {
  50141. this.setLastChild(n);
  50142. }
  50143. n.updateInfo();
  50144. if (recursive && !n.isLeaf()) {
  50145. n.sort(sortFn, true, true);
  50146. }
  50147. }
  50148. if (suppressEvent !== true) {
  50149. this.fireEvent('sort', this, cs);
  50150. }
  50151. }
  50152. },
  50153. isExpanded: function() {
  50154. return this.get('expanded');
  50155. },
  50156. isLoaded: function() {
  50157. return this.get('loaded');
  50158. },
  50159. isLoading: function() {
  50160. return this.get('loading');
  50161. },
  50162. isRoot: function() {
  50163. return !this.parentNode;
  50164. },
  50165. isVisible: function() {
  50166. var parent = this.parentNode;
  50167. while (parent) {
  50168. if (!parent.isExpanded()) {
  50169. return false;
  50170. }
  50171. parent = parent.parentNode;
  50172. }
  50173. return true;
  50174. },
  50175. expand: function(recursive, callback, scope) {
  50176. var me = this;
  50177. if (!me.isLeaf()) {
  50178. if (me.isLoading()) {
  50179. me.on('expand', function(){
  50180. me.expand(recursive, callback, scope);
  50181. }, me, {single: true});
  50182. } else {
  50183. if (!me.isExpanded()) {
  50184. me.fireEvent('beforeexpand', me, function() {
  50185. me.set('expanded', true);
  50186. if (me.hasListeners.expand) {
  50187. me.fireEvent('expand', me, me.childNodes, false);
  50188. }
  50189. if (recursive) {
  50190. me.expandChildren(true, callback, scope);
  50191. } else {
  50192. Ext.callback(callback, scope || me, [me.childNodes]);
  50193. }
  50194. }, me);
  50195. } else if (recursive) {
  50196. me.expandChildren(true, callback, scope);
  50197. } else {
  50198. Ext.callback(callback, scope || me, [me.childNodes]);
  50199. }
  50200. }
  50201. } else {
  50202. Ext.callback(callback, scope || me);
  50203. }
  50204. },
  50205. expandChildren: function(recursive, callback, scope) {
  50206. var me = this,
  50207. i = 0,
  50208. nodes = me.childNodes,
  50209. ln = nodes.length,
  50210. node,
  50211. expanding = 0;
  50212. for (; i < ln; ++i) {
  50213. node = nodes[i];
  50214. if (!node.isLeaf()) {
  50215. expanding++;
  50216. nodes[i].expand(recursive, function () {
  50217. expanding--;
  50218. if (callback && !expanding) {
  50219. Ext.callback(callback, scope || me, [me.childNodes]);
  50220. }
  50221. });
  50222. }
  50223. }
  50224. if (!expanding && callback) {
  50225. Ext.callback(callback, scope || me, [me.childNodes]); }
  50226. },
  50227. collapse: function(recursive, callback, scope) {
  50228. var me = this;
  50229. if (!me.isLeaf()) {
  50230. if (!me.collapsing && me.isExpanded()) {
  50231. me.fireEvent('beforecollapse', me, function() {
  50232. me.set('expanded', false);
  50233. if (me.hasListeners.collapse) {
  50234. me.fireEvent('collapse', me, me.childNodes, false);
  50235. }
  50236. if (recursive) {
  50237. me.collapseChildren(true, callback, scope);
  50238. }
  50239. else {
  50240. Ext.callback(callback, scope || me, [me.childNodes]);
  50241. }
  50242. }, me);
  50243. }
  50244. else if (recursive) {
  50245. me.collapseChildren(true, callback, scope);
  50246. } else {
  50247. Ext.callback(callback, scope || me, [me.childNodes]);
  50248. }
  50249. }
  50250. else {
  50251. Ext.callback(callback, scope || me, [me.childNodes]);
  50252. }
  50253. },
  50254. collapseChildren: function(recursive, callback, scope) {
  50255. var me = this,
  50256. i = 0,
  50257. nodes = me.childNodes,
  50258. ln = nodes.length,
  50259. node,
  50260. collapsing = 0;
  50261. for (; i < ln; ++i) {
  50262. node = nodes[i];
  50263. if (!node.isLeaf()) {
  50264. collapsing++;
  50265. nodes[i].collapse(recursive, function () {
  50266. collapsing--;
  50267. if (callback && !collapsing) {
  50268. Ext.callback(callback, scope || me, [me.childNodes]);
  50269. }
  50270. });
  50271. }
  50272. }
  50273. if (!collapsing && callback) {
  50274. Ext.callback(callback, scope || me, [me.childNodes]);
  50275. }
  50276. }
  50277. };
  50278. }
  50279. }
  50280. });
  50281. Ext.define('Ext.data.NodeStore', {
  50282. extend: 'Ext.data.Store',
  50283. alias: 'store.node',
  50284. requires: ['Ext.data.NodeInterface'],
  50285. node: null,
  50286. recursive: false,
  50287. rootVisible: false,
  50288. constructor: function(config) {
  50289. var me = this,
  50290. node;
  50291. config = config || {};
  50292. Ext.apply(me, config);
  50293. config.proxy = {type: 'proxy'};
  50294. me.callParent([config]);
  50295. node = me.node;
  50296. if (node) {
  50297. me.node = null;
  50298. me.setNode(node);
  50299. }
  50300. },
  50301. setNode: function(node) {
  50302. var me = this;
  50303. if (me.node && me.node != node) {
  50304. me.mun(me.node, {
  50305. expand: me.onNodeExpand,
  50306. collapse: me.onNodeCollapse,
  50307. append: me.onNodeAppend,
  50308. insert: me.onNodeInsert,
  50309. remove: me.onNodeRemove,
  50310. sort: me.onNodeSort,
  50311. scope: me
  50312. });
  50313. me.node = null;
  50314. }
  50315. if (node) {
  50316. Ext.data.NodeInterface.decorate(node.self);
  50317. me.removeAll();
  50318. if (me.rootVisible) {
  50319. me.add(node);
  50320. } else if (!node.isExpanded() && me.treeStore.autoLoad !== false) {
  50321. node.expand();
  50322. }
  50323. me.mon(node, {
  50324. expand: me.onNodeExpand,
  50325. collapse: me.onNodeCollapse,
  50326. append: me.onNodeAppend,
  50327. insert: me.onNodeInsert,
  50328. remove: me.onNodeRemove,
  50329. sort: me.onNodeSort,
  50330. scope: me
  50331. });
  50332. me.node = node;
  50333. if (node.isExpanded() && node.isLoaded()) {
  50334. me.onNodeExpand(node, node.childNodes, true);
  50335. }
  50336. }
  50337. },
  50338. onNodeSort: function(node, childNodes) {
  50339. var me = this;
  50340. if ((me.indexOf(node) !== -1 || (node === me.node && !me.rootVisible) && node.isExpanded())) {
  50341. me.onNodeCollapse(node, childNodes, true);
  50342. me.onNodeExpand(node, childNodes, true);
  50343. }
  50344. },
  50345. onNodeExpand: function(parent, records, suppressEvent) {
  50346. var me = this,
  50347. insertIndex = me.indexOf(parent) + 1,
  50348. ln = records ? records.length : 0,
  50349. i, record;
  50350. if (!me.recursive && parent !== me.node) {
  50351. return;
  50352. }
  50353. if (parent !== this.node && !me.isVisible(parent)) {
  50354. return;
  50355. }
  50356. if (!suppressEvent && me.fireEvent('beforeexpand', parent, records, insertIndex) === false) {
  50357. return;
  50358. }
  50359. if (ln) {
  50360. me.insert(insertIndex, records);
  50361. for (i = 0; i < ln; i++) {
  50362. record = records[i];
  50363. if (record.isExpanded()) {
  50364. if (record.isLoaded()) {
  50365. me.onNodeExpand(record, record.childNodes, true);
  50366. }
  50367. else {
  50368. record.set('expanded', false);
  50369. record.expand();
  50370. }
  50371. }
  50372. }
  50373. }
  50374. if (!suppressEvent) {
  50375. me.fireEvent('expand', parent, records);
  50376. }
  50377. },
  50378. onNodeCollapse: function(parent, records, suppressEvent) {
  50379. var me = this,
  50380. ln = records.length,
  50381. collapseIndex = me.indexOf(parent) + 1,
  50382. i, record;
  50383. if (!me.recursive && parent !== me.node) {
  50384. return;
  50385. }
  50386. if (!suppressEvent && me.fireEvent('beforecollapse', parent, records, collapseIndex) === false) {
  50387. return;
  50388. }
  50389. for (i = 0; i < ln; i++) {
  50390. record = records[i];
  50391. me.remove(record);
  50392. if (record.isExpanded()) {
  50393. me.onNodeCollapse(record, record.childNodes, true);
  50394. }
  50395. }
  50396. if (!suppressEvent) {
  50397. me.fireEvent('collapse', parent, records, collapseIndex);
  50398. }
  50399. },
  50400. onNodeAppend: function(parent, node, index) {
  50401. var me = this,
  50402. refNode, sibling;
  50403. if (me.isVisible(node)) {
  50404. if (index === 0) {
  50405. refNode = parent;
  50406. } else {
  50407. sibling = node.previousSibling;
  50408. while (sibling.isExpanded() && sibling.lastChild) {
  50409. sibling = sibling.lastChild;
  50410. }
  50411. refNode = sibling;
  50412. }
  50413. me.insert(me.indexOf(refNode) + 1, node);
  50414. if (!node.isLeaf() && node.isExpanded()) {
  50415. if (node.isLoaded()) {
  50416. me.onNodeExpand(node, node.childNodes, true);
  50417. }
  50418. else {
  50419. node.set('expanded', false);
  50420. node.expand();
  50421. }
  50422. }
  50423. }
  50424. },
  50425. onNodeInsert: function(parent, node, refNode) {
  50426. var me = this,
  50427. index = this.indexOf(refNode);
  50428. if (index != -1 && me.isVisible(node)) {
  50429. me.insert(index, node);
  50430. if (!node.isLeaf() && node.isExpanded()) {
  50431. if (node.isLoaded()) {
  50432. me.onNodeExpand(node, node.childNodes, true);
  50433. }
  50434. else {
  50435. node.set('expanded', false);
  50436. node.expand();
  50437. }
  50438. }
  50439. }
  50440. },
  50441. onNodeRemove: function(parent, node, index) {
  50442. var me = this;
  50443. if (me.indexOf(node) != -1) {
  50444. if (!node.isLeaf() && node.isExpanded()) {
  50445. me.onNodeCollapse(node, node.childNodes, true);
  50446. }
  50447. me.remove(node);
  50448. }
  50449. },
  50450. isVisible: function(node) {
  50451. var parent = node.parentNode;
  50452. while (parent) {
  50453. if (parent === this.node && !this.rootVisible && parent.isExpanded()) {
  50454. return true;
  50455. }
  50456. if (this.indexOf(parent) === -1 || !parent.isExpanded()) {
  50457. return false;
  50458. }
  50459. parent = parent.parentNode;
  50460. }
  50461. return true;
  50462. }
  50463. });
  50464. Ext.define('Ext.data.Request', {
  50465. action: undefined,
  50466. params: undefined,
  50467. method: 'GET',
  50468. url: undefined,
  50469. constructor: function(config) {
  50470. Ext.apply(this, config);
  50471. }
  50472. });
  50473. Ext.define('Ext.data.SequentialIdGenerator', {
  50474. extend: 'Ext.data.IdGenerator',
  50475. alias: 'idgen.sequential',
  50476. constructor: function() {
  50477. var me = this;
  50478. me.callParent(arguments);
  50479. me.parts = [ me.prefix, ''];
  50480. },
  50481. prefix: '',
  50482. seed: 1,
  50483. generate: function () {
  50484. var me = this,
  50485. parts = me.parts;
  50486. parts[1] = me.seed++;
  50487. return parts.join('');
  50488. }
  50489. });
  50490. Ext.define('Ext.data.Tree', {
  50491. alias: 'data.tree',
  50492. mixins: {
  50493. observable: "Ext.util.Observable"
  50494. },
  50495. root: null,
  50496. constructor: function(root) {
  50497. var me = this;
  50498. me.mixins.observable.constructor.call(me);
  50499. if (root) {
  50500. me.setRootNode(root);
  50501. }
  50502. },
  50503. getRootNode : function() {
  50504. return this.root;
  50505. },
  50506. setRootNode : function(node) {
  50507. var me = this;
  50508. me.root = node;
  50509. if (me.fireEvent('beforeappend', null, node) !== false) {
  50510. node.set('root', true);
  50511. node.updateInfo();
  50512. node.commit();
  50513. node.on({
  50514. scope: me,
  50515. insert: me.onNodeInsert,
  50516. append: me.onNodeAppend,
  50517. remove: me.onNodeRemove
  50518. });
  50519. me.relayEvents(node, [
  50520. "append",
  50521. "remove",
  50522. "move",
  50523. "insert",
  50524. "beforeappend",
  50525. "beforeremove",
  50526. "beforemove",
  50527. "beforeinsert",
  50528. "expand",
  50529. "collapse",
  50530. "beforeexpand",
  50531. "beforecollapse" ,
  50532. "sort",
  50533. "rootchange"
  50534. ]);
  50535. me.nodeHash = {};
  50536. me.registerNode(node);
  50537. me.fireEvent('append', null, node);
  50538. me.fireEvent('rootchange', node);
  50539. }
  50540. return node;
  50541. },
  50542. flatten: function(){
  50543. return Ext.Object.getValues(this.nodeHash);
  50544. },
  50545. onNodeInsert: function(parent, node) {
  50546. this.registerNode(node, true);
  50547. },
  50548. onNodeAppend: function(parent, node) {
  50549. this.registerNode(node, true);
  50550. },
  50551. onNodeRemove: function(parent, node) {
  50552. this.unregisterNode(node, true);
  50553. },
  50554. onNodeIdChanged: function(node, oldId, newId) {
  50555. var nodeHash = this.nodeHash;
  50556. nodeHash[newId] = node;
  50557. delete nodeHash[oldId || node.internalId];
  50558. },
  50559. getNodeById : function(id) {
  50560. return this.nodeHash[id];
  50561. },
  50562. registerNode : function(node, includeChildren) {
  50563. var me = this;
  50564. me.nodeHash[node.getId() || node.internalId] = node;
  50565. node.on('idchanged', me.onNodeIdChanged, me);
  50566. if (includeChildren === true) {
  50567. node.eachChild(function(child){
  50568. me.registerNode(child, true);
  50569. });
  50570. }
  50571. },
  50572. unregisterNode : function(node, includeChildren) {
  50573. delete this.nodeHash[node.getId() || node.internalId];
  50574. if (includeChildren === true) {
  50575. node.eachChild(function(child){
  50576. this.unregisterNode(child, true);
  50577. }, this);
  50578. }
  50579. },
  50580. sort: function(sorterFn, recursive) {
  50581. this.getRootNode().sort(sorterFn, recursive);
  50582. },
  50583. filter: function(filters, recursive) {
  50584. this.getRootNode().filter(filters, recursive);
  50585. }
  50586. });
  50587. Ext.define('Ext.data.TreeStore', {
  50588. extend: 'Ext.data.AbstractStore',
  50589. alias: 'store.tree',
  50590. requires: [
  50591. 'Ext.util.Sorter',
  50592. 'Ext.data.Tree',
  50593. 'Ext.data.NodeInterface'
  50594. ],
  50595. clearOnLoad : true,
  50596. clearRemovedOnLoad: true,
  50597. nodeParam: 'node',
  50598. defaultRootId: 'root',
  50599. defaultRootProperty: 'children',
  50600. rootProperty: 'children',
  50601. folderSort: false,
  50602. constructor: function(config) {
  50603. var me = this,
  50604. root,
  50605. fields,
  50606. defaultRoot;
  50607. config = Ext.apply({}, config);
  50608. fields = config.fields || me.fields;
  50609. if (!fields) {
  50610. config.fields = [
  50611. {name: 'text', type: 'string'}
  50612. ];
  50613. defaultRoot = config.defaultRootProperty || me.defaultRootProperty;
  50614. if (defaultRoot !== me.defaultRootProperty) {
  50615. config.fields.push({
  50616. name: defaultRoot,
  50617. type: 'auto',
  50618. defaultValue: null,
  50619. persist: false
  50620. });
  50621. }
  50622. }
  50623. me.callParent([config]);
  50624. me.tree = new Ext.data.Tree();
  50625. me.relayEvents(me.tree, [
  50626. "append",
  50627. "remove",
  50628. "move",
  50629. "insert",
  50630. "beforeappend",
  50631. "beforeremove",
  50632. "beforemove",
  50633. "beforeinsert",
  50634. "expand",
  50635. "collapse",
  50636. "beforeexpand",
  50637. "beforecollapse",
  50638. "sort",
  50639. "rootchange"
  50640. ]);
  50641. me.tree.on({
  50642. scope: me,
  50643. remove: me.onNodeRemove,
  50644. beforeexpand: me.onBeforeNodeExpand,
  50645. beforecollapse: me.onBeforeNodeCollapse,
  50646. append: me.onNodeAdded,
  50647. insert: me.onNodeAdded,
  50648. sort: me.onNodeSort
  50649. });
  50650. me.onBeforeSort();
  50651. root = me.root;
  50652. if (root) {
  50653. delete me.root;
  50654. me.setRootNode(root);
  50655. }
  50656. if (Ext.isDefined(me.nodeParameter)) {
  50657. if (Ext.isDefined(Ext.global.console)) {
  50658. Ext.global.console.warn('Ext.data.TreeStore: nodeParameter has been deprecated. Please use nodeParam instead.');
  50659. }
  50660. me.nodeParam = me.nodeParameter;
  50661. delete me.nodeParameter;
  50662. }
  50663. },
  50664. setProxy: function(proxy) {
  50665. var reader,
  50666. needsRoot;
  50667. if (proxy instanceof Ext.data.proxy.Proxy) {
  50668. needsRoot = Ext.isEmpty(proxy.getReader().root);
  50669. } else if (Ext.isString(proxy)) {
  50670. needsRoot = true;
  50671. } else {
  50672. reader = proxy.reader;
  50673. needsRoot = !(reader && !Ext.isEmpty(reader.root));
  50674. }
  50675. proxy = this.callParent(arguments);
  50676. if (needsRoot) {
  50677. reader = proxy.getReader();
  50678. reader.root = this.defaultRootProperty;
  50679. reader.buildExtractors(true);
  50680. }
  50681. },
  50682. onBeforeSort: function() {
  50683. if (this.folderSort) {
  50684. this.sort({
  50685. property: 'leaf',
  50686. direction: 'ASC'
  50687. }, 'prepend', false);
  50688. }
  50689. },
  50690. onBeforeNodeExpand: function(node, callback, scope) {
  50691. if (node.isLoaded()) {
  50692. Ext.callback(callback, scope || node, [node.childNodes]);
  50693. }
  50694. else if (node.isLoading()) {
  50695. this.on('load', function() {
  50696. Ext.callback(callback, scope || node, [node.childNodes]);
  50697. }, this, {single: true});
  50698. }
  50699. else {
  50700. this.read({
  50701. node: node,
  50702. callback: function() {
  50703. Ext.callback(callback, scope || node, [node.childNodes]);
  50704. }
  50705. });
  50706. }
  50707. },
  50708. getNewRecords: function() {
  50709. return Ext.Array.filter(this.tree.flatten(), this.filterNew);
  50710. },
  50711. getUpdatedRecords: function() {
  50712. return Ext.Array.filter(this.tree.flatten(), this.filterUpdated);
  50713. },
  50714. onBeforeNodeCollapse: function(node, callback, scope) {
  50715. callback.call(scope || node, node.childNodes);
  50716. },
  50717. onNodeRemove: function(parent, node, isMove) {
  50718. var me = this,
  50719. removed = me.removed;
  50720. if (!node.isReplace && Ext.Array.indexOf(removed, node) == -1) {
  50721. removed.push(node);
  50722. }
  50723. if (me.autoSync && !me.autoSyncSuspended && !isMove) {
  50724. me.sync();
  50725. }
  50726. },
  50727. onNodeAdded: function(parent, node) {
  50728. var me = this,
  50729. proxy = me.getProxy(),
  50730. reader = proxy.getReader(),
  50731. data = node.raw || node[node.persistenceProperty],
  50732. dataRoot;
  50733. Ext.Array.remove(me.removed, node);
  50734. if (!node.isLeaf()) {
  50735. dataRoot = reader.getRoot(data);
  50736. if (dataRoot) {
  50737. me.fillNode(node, reader.extractData(dataRoot));
  50738. delete data[reader.root];
  50739. }
  50740. }
  50741. if (me.autoSync && !me.autoSyncSuspended && (node.phantom || node.dirty)) {
  50742. me.sync();
  50743. }
  50744. },
  50745. onNodeSort: function() {
  50746. if(this.autoSync && !this.autoSyncSuspended) {
  50747. this.sync();
  50748. }
  50749. },
  50750. setRootNode: function(root, preventLoad) {
  50751. var me = this,
  50752. model = me.model,
  50753. idProperty = model.prototype.idProperty
  50754. root = root || {};
  50755. if (!root.isModel) {
  50756. Ext.applyIf(root, {
  50757. id: me.defaultRootId,
  50758. text: 'Root',
  50759. allowDrag: false
  50760. });
  50761. if (root[idProperty] === undefined) {
  50762. root[idProperty] = me.defaultRootId;
  50763. }
  50764. Ext.data.NodeInterface.decorate(model);
  50765. root = Ext.ModelManager.create(root, model);
  50766. } else if (root.isModel && !root.isNode) {
  50767. Ext.data.NodeInterface.decorate(model);
  50768. }
  50769. me.getProxy().getReader().buildExtractors(true);
  50770. me.tree.setRootNode(root);
  50771. if (preventLoad !== true && !root.isLoaded() && (me.autoLoad === true || root.isExpanded())) {
  50772. me.load({
  50773. node: root
  50774. });
  50775. }
  50776. return root;
  50777. },
  50778. getRootNode: function() {
  50779. return this.tree.getRootNode();
  50780. },
  50781. getNodeById: function(id) {
  50782. return this.tree.getNodeById(id);
  50783. },
  50784. getById: function(id) {
  50785. return this.getNodeById(id);
  50786. },
  50787. load: function(options) {
  50788. options = options || {};
  50789. options.params = options.params || {};
  50790. var me = this,
  50791. node = options.node || me.tree.getRootNode();
  50792. if (!node) {
  50793. node = me.setRootNode({
  50794. expanded: true
  50795. }, true);
  50796. }
  50797. options.id = node.getId();
  50798. if (me.clearOnLoad) {
  50799. if(me.clearRemovedOnLoad) {
  50800. me.clearRemoved(node);
  50801. }
  50802. me.tree.un('remove', me.onNodeRemove, me);
  50803. node.removeAll(false);
  50804. me.tree.on('remove', me.onNodeRemove, me);
  50805. }
  50806. Ext.applyIf(options, {
  50807. node: node
  50808. });
  50809. options.params[me.nodeParam] = node ? node.getId() : 'root';
  50810. if (node) {
  50811. node.set('loading', true);
  50812. }
  50813. return me.callParent([options]);
  50814. },
  50815. clearRemoved: function(node) {
  50816. var me = this,
  50817. removed = me.removed,
  50818. id = node.getId(),
  50819. removedLength = removed.length,
  50820. i = removedLength,
  50821. recordsToClear = {},
  50822. newRemoved = [],
  50823. removedHash = {},
  50824. removedNode,
  50825. targetNode,
  50826. targetId;
  50827. if(node === me.getRootNode()) {
  50828. me.removed = [];
  50829. return;
  50830. }
  50831. for(; i--;) {
  50832. removedNode = removed[i];
  50833. removedHash[removedNode.getId()] = removedNode;
  50834. }
  50835. for(i = removedLength; i--;) {
  50836. removedNode = removed[i];
  50837. targetNode = removedNode;
  50838. while(targetNode && targetNode.getId() !== id) {
  50839. targetId = targetNode.get('parentId');
  50840. targetNode = targetNode.parentNode || me.getNodeById(targetId) || removedHash[targetId];
  50841. }
  50842. if(targetNode) {
  50843. recordsToClear[removedNode.getId()] = removedNode;
  50844. }
  50845. }
  50846. for(i = 0; i < removedLength; i++) {
  50847. removedNode = removed[i];
  50848. if(!recordsToClear[removedNode.getId()]) {
  50849. newRemoved.push(removedNode);
  50850. }
  50851. }
  50852. me.removed = newRemoved;
  50853. },
  50854. fillNode: function(node, newNodes) {
  50855. var me = this,
  50856. ln = newNodes ? newNodes.length : 0,
  50857. sorters = me.sorters,
  50858. i, sortCollection,
  50859. needsIndexSort = false,
  50860. performLocalSort = ln && me.sortOnLoad && !me.remoteSort && sorters && sorters.items && sorters.items.length,
  50861. node1, node2;
  50862. for (i = 1; i < ln; i++) {
  50863. node1 = newNodes[i];
  50864. node2 = newNodes[i - 1];
  50865. needsIndexSort = node1[node1.persistenceProperty].index != node2[node2.persistenceProperty].index;
  50866. if (needsIndexSort) {
  50867. break;
  50868. }
  50869. }
  50870. if (performLocalSort) {
  50871. if (needsIndexSort) {
  50872. me.sorters.insert(0, me.indexSorter);
  50873. }
  50874. sortCollection = new Ext.util.MixedCollection();
  50875. sortCollection.addAll(newNodes);
  50876. sortCollection.sort(me.sorters.items);
  50877. newNodes = sortCollection.items;
  50878. me.sorters.remove(me.indexSorter);
  50879. } else if (needsIndexSort) {
  50880. Ext.Array.sort(newNodes, me.sortByIndex);
  50881. }
  50882. node.set('loaded', true);
  50883. for (i = 0; i < ln; i++) {
  50884. node.appendChild(newNodes[i], undefined, true);
  50885. }
  50886. return newNodes;
  50887. },
  50888. sortByIndex: function(node1, node2) {
  50889. return node1[node1.persistenceProperty].index - node2[node2.persistenceProperty].index;
  50890. },
  50891. onProxyLoad: function(operation) {
  50892. var me = this,
  50893. successful = operation.wasSuccessful(),
  50894. records = operation.getRecords(),
  50895. node = operation.node;
  50896. me.loading = false;
  50897. node.set('loading', false);
  50898. if (successful) {
  50899. if (!me.clearOnLoad) {
  50900. records = me.cleanRecords(node, records);
  50901. }
  50902. records = me.fillNode(node, records);
  50903. }
  50904. me.fireEvent('read', me, operation.node, records, successful);
  50905. me.fireEvent('load', me, operation.node, records, successful);
  50906. Ext.callback(operation.callback, operation.scope || me, [records, operation, successful]);
  50907. },
  50908. onCreateRecords: function(records) {
  50909. this.callParent(arguments);
  50910. var i = 0,
  50911. len = records.length,
  50912. tree = this.tree,
  50913. node;
  50914. for (; i < len; ++i) {
  50915. node = records[i];
  50916. tree.onNodeIdChanged(node, null, node.getId());
  50917. }
  50918. },
  50919. cleanRecords: function(node, records){
  50920. var nodeHash = {},
  50921. childNodes = node.childNodes,
  50922. i = 0,
  50923. len = childNodes.length,
  50924. out = [],
  50925. rec;
  50926. for (; i < len; ++i) {
  50927. nodeHash[childNodes[i].getId()] = true;
  50928. }
  50929. for (i = 0, len = records.length; i < len; ++i) {
  50930. rec = records[i];
  50931. if (!nodeHash[rec.getId()]) {
  50932. out.push(rec);
  50933. }
  50934. }
  50935. return out;
  50936. },
  50937. removeAll: function() {
  50938. var root = this.getRootNode();
  50939. if (root) {
  50940. root.destroy(true);
  50941. }
  50942. this.fireEvent('clear', this);
  50943. },
  50944. doSort: function(sorterFn) {
  50945. var me = this;
  50946. if (me.remoteSort) {
  50947. me.load();
  50948. } else {
  50949. me.tree.sort(sorterFn, true);
  50950. me.fireEvent('datachanged', me);
  50951. me.fireEvent('refresh', me);
  50952. }
  50953. me.fireEvent('sort', me);
  50954. }
  50955. }, function() {
  50956. var proto = this.prototype;
  50957. proto.indexSorter = new Ext.util.Sorter({
  50958. sorterFn: proto.sortByIndex
  50959. });
  50960. });
  50961. Ext.define('Ext.data.UuidGenerator', (function () {
  50962. var twoPow14 = Math.pow(2, 14),
  50963. twoPow16 = Math.pow(2, 16),
  50964. twoPow28 = Math.pow(2, 28),
  50965. twoPow32 = Math.pow(2, 32);
  50966. function toHex (value, length) {
  50967. var ret = value.toString(16);
  50968. if (ret.length > length) {
  50969. ret = ret.substring(ret.length - length);
  50970. } else if (ret.length < length) {
  50971. ret = Ext.String.leftPad(ret, length, '0');
  50972. }
  50973. return ret;
  50974. }
  50975. function rand (lo, hi) {
  50976. var v = Math.random() * (hi - lo + 1);
  50977. return Math.floor(v) + lo;
  50978. }
  50979. function split (bignum) {
  50980. if (typeof(bignum) == 'number') {
  50981. var hi = Math.floor(bignum / twoPow32);
  50982. return {
  50983. lo: Math.floor(bignum - hi * twoPow32),
  50984. hi: hi
  50985. };
  50986. }
  50987. return bignum;
  50988. }
  50989. return {
  50990. extend: 'Ext.data.IdGenerator',
  50991. alias: 'idgen.uuid',
  50992. id: 'uuid',
  50993. version: 4,
  50994. constructor: function() {
  50995. var me = this;
  50996. me.callParent(arguments);
  50997. me.parts = [];
  50998. me.init();
  50999. },
  51000. generate: function () {
  51001. var me = this,
  51002. parts = me.parts,
  51003. ts = me.timestamp;
  51004. parts[0] = toHex(ts.lo, 8);
  51005. parts[1] = toHex(ts.hi & 0xFFFF, 4);
  51006. parts[2] = toHex(((ts.hi >>> 16) & 0xFFF) | (me.version << 12), 4);
  51007. parts[3] = toHex(0x80 | ((me.clockSeq >>> 8) & 0x3F), 2) +
  51008. toHex(me.clockSeq & 0xFF, 2);
  51009. parts[4] = toHex(me.salt.hi, 4) + toHex(me.salt.lo, 8);
  51010. if (me.version == 4) {
  51011. me.init();
  51012. } else {
  51013. ++ts.lo;
  51014. if (ts.lo >= twoPow32) {
  51015. ts.lo = 0;
  51016. ++ts.hi;
  51017. }
  51018. }
  51019. return parts.join('-').toLowerCase();
  51020. },
  51021. getRecId: function (rec) {
  51022. return rec.getId();
  51023. },
  51024. init: function () {
  51025. var me = this,
  51026. salt, time;
  51027. if (me.version == 4) {
  51028. me.clockSeq = rand(0, twoPow14-1);
  51029. salt = me.salt || (me.salt = {});
  51030. time = me.timestamp || (me.timestamp = {});
  51031. salt.lo = rand(0, twoPow32-1);
  51032. salt.hi = rand(0, twoPow16-1);
  51033. time.lo = rand(0, twoPow32-1);
  51034. time.hi = rand(0, twoPow28-1);
  51035. } else {
  51036. me.salt = split(me.salt);
  51037. me.timestamp = split(me.timestamp);
  51038. me.salt.hi |= 0x100;
  51039. }
  51040. },
  51041. reconfigure: function (config) {
  51042. Ext.apply(this, config);
  51043. this.init();
  51044. }
  51045. };
  51046. }()));
  51047. Ext.define('Ext.data.reader.Xml', {
  51048. extend: 'Ext.data.reader.Reader',
  51049. alternateClassName: 'Ext.data.XmlReader',
  51050. alias : 'reader.xml',
  51051. createAccessor: function(expr) {
  51052. var me = this;
  51053. if (Ext.isEmpty(expr)) {
  51054. return Ext.emptyFn;
  51055. }
  51056. if (Ext.isFunction(expr)) {
  51057. return expr;
  51058. }
  51059. return function(root) {
  51060. return me.getNodeValue(Ext.DomQuery.selectNode(expr, root));
  51061. };
  51062. },
  51063. getNodeValue: function(node) {
  51064. if (node && node.firstChild) {
  51065. return node.firstChild.nodeValue;
  51066. }
  51067. return undefined;
  51068. },
  51069. getResponseData: function(response) {
  51070. var xml = response.responseXML,
  51071. error,
  51072. msg;
  51073. if (!xml) {
  51074. msg = 'XML data not found in the response';
  51075. error = new Ext.data.ResultSet({
  51076. total : 0,
  51077. count : 0,
  51078. records: [],
  51079. success: false,
  51080. message: msg
  51081. });
  51082. this.fireEvent('exception', this, response, error);
  51083. Ext.Logger.warn(msg);
  51084. return error;
  51085. }
  51086. return this.readRecords(xml);
  51087. },
  51088. getData: function(data) {
  51089. return data.documentElement || data;
  51090. },
  51091. getRoot: function(data) {
  51092. var nodeName = data.nodeName,
  51093. root = this.root;
  51094. if (!root || (nodeName && nodeName == root)) {
  51095. return data;
  51096. } else if (Ext.DomQuery.isXml(data)) {
  51097. return Ext.DomQuery.selectNode(root, data);
  51098. }
  51099. },
  51100. extractData: function(root) {
  51101. var recordName = this.record;
  51102. if (recordName != root.nodeName) {
  51103. root = Ext.DomQuery.select(recordName, root);
  51104. } else {
  51105. root = [root];
  51106. }
  51107. return this.callParent([root]);
  51108. },
  51109. getAssociatedDataRoot: function(data, associationName) {
  51110. return Ext.DomQuery.select(associationName, data)[0];
  51111. },
  51112. readRecords: function(doc) {
  51113. if (Ext.isArray(doc)) {
  51114. doc = doc[0];
  51115. }
  51116. this.xmlData = doc;
  51117. return this.callParent([doc]);
  51118. },
  51119. createFieldAccessExpression: function(field, fieldVarName, dataName) {
  51120. var selector = field.mapping || field.name,
  51121. result;
  51122. if (typeof selector === 'function') {
  51123. result = fieldVarName + '.mapping(' + dataName + ', this)';
  51124. } else {
  51125. result = 'me.getNodeValue(Ext.DomQuery.selectNode("' + selector + '", ' + dataName + '))';
  51126. }
  51127. return result;
  51128. }
  51129. });
  51130. Ext.define('Ext.data.writer.Xml', {
  51131. extend: 'Ext.data.writer.Writer',
  51132. alternateClassName: 'Ext.data.XmlWriter',
  51133. alias: 'writer.xml',
  51134. documentRoot: 'xmlData',
  51135. defaultDocumentRoot: 'xmlData',
  51136. header: '',
  51137. record: 'record',
  51138. writeRecords: function(request, data) {
  51139. var me = this,
  51140. xml = [],
  51141. i = 0,
  51142. len = data.length,
  51143. root = me.documentRoot,
  51144. record = me.record,
  51145. needsRoot = data.length !== 1,
  51146. item,
  51147. key;
  51148. xml.push(me.header || '');
  51149. if (!root && needsRoot) {
  51150. root = me.defaultDocumentRoot;
  51151. }
  51152. if (root) {
  51153. xml.push('<', root, '>');
  51154. }
  51155. for (; i < len; ++i) {
  51156. item = data[i];
  51157. xml.push('<', record, '>');
  51158. for (key in item) {
  51159. if (item.hasOwnProperty(key)) {
  51160. xml.push('<', key, '>', item[key], '</', key, '>');
  51161. }
  51162. }
  51163. xml.push('</', record, '>');
  51164. }
  51165. if (root) {
  51166. xml.push('</', root, '>');
  51167. }
  51168. request.xmlData = xml.join('');
  51169. return request;
  51170. }
  51171. });
  51172. Ext.define('Ext.data.XmlStore', {
  51173. extend: 'Ext.data.Store',
  51174. alias: 'store.xml',
  51175. requires: [
  51176. 'Ext.data.proxy.Ajax',
  51177. 'Ext.data.reader.Xml',
  51178. 'Ext.data.writer.Xml'
  51179. ],
  51180. constructor: function(config){
  51181. config = Ext.apply({
  51182. proxy: {
  51183. type: 'ajax',
  51184. reader: 'xml',
  51185. writer: 'xml'
  51186. }
  51187. }, config);
  51188. this.callParent([config]);
  51189. }
  51190. });
  51191. Ext.define('Ext.data.association.BelongsTo', {
  51192. extend: 'Ext.data.association.Association',
  51193. alternateClassName: 'Ext.data.BelongsToAssociation',
  51194. alias: 'association.belongsto',
  51195. constructor: function(config) {
  51196. this.callParent(arguments);
  51197. var me = this,
  51198. ownerProto = me.ownerModel.prototype,
  51199. associatedName = me.associatedName,
  51200. getterName = me.getterName || 'get' + associatedName,
  51201. setterName = me.setterName || 'set' + associatedName;
  51202. Ext.applyIf(me, {
  51203. name : associatedName,
  51204. foreignKey : associatedName.toLowerCase() + "_id",
  51205. instanceName: associatedName + 'BelongsToInstance',
  51206. associationKey: associatedName.toLowerCase()
  51207. });
  51208. ownerProto[getterName] = me.createGetter();
  51209. ownerProto[setterName] = me.createSetter();
  51210. },
  51211. createSetter: function() {
  51212. var me = this,
  51213. foreignKey = me.foreignKey;
  51214. return function(value, options, scope) {
  51215. if (value && value.isModel) {
  51216. value = value.getId();
  51217. }
  51218. this.set(foreignKey, value);
  51219. if (Ext.isFunction(options)) {
  51220. options = {
  51221. callback: options,
  51222. scope: scope || this
  51223. };
  51224. }
  51225. if (Ext.isObject(options)) {
  51226. return this.save(options);
  51227. }
  51228. };
  51229. },
  51230. createGetter: function() {
  51231. var me = this,
  51232. associatedName = me.associatedName,
  51233. associatedModel = me.associatedModel,
  51234. foreignKey = me.foreignKey,
  51235. primaryKey = me.primaryKey,
  51236. instanceName = me.instanceName;
  51237. return function(options, scope) {
  51238. options = options || {};
  51239. var model = this,
  51240. foreignKeyId = model.get(foreignKey),
  51241. success,
  51242. instance,
  51243. args;
  51244. if (options.reload === true || model[instanceName] === undefined) {
  51245. instance = Ext.ModelManager.create({}, associatedName);
  51246. instance.set(primaryKey, foreignKeyId);
  51247. if (typeof options == 'function') {
  51248. options = {
  51249. callback: options,
  51250. scope: scope || model
  51251. };
  51252. }
  51253. success = options.success;
  51254. options.success = function(rec){
  51255. model[instanceName] = rec;
  51256. if (success) {
  51257. success.apply(this, arguments);
  51258. }
  51259. };
  51260. associatedModel.load(foreignKeyId, options);
  51261. model[instanceName] = instance;
  51262. return instance;
  51263. } else {
  51264. instance = model[instanceName];
  51265. args = [instance];
  51266. scope = scope || options.scope || model;
  51267. Ext.callback(options, scope, args);
  51268. Ext.callback(options.success, scope, args);
  51269. Ext.callback(options.failure, scope, args);
  51270. Ext.callback(options.callback, scope, args);
  51271. return instance;
  51272. }
  51273. };
  51274. },
  51275. read: function(record, reader, associationData){
  51276. record[this.instanceName] = reader.read([associationData]).records[0];
  51277. }
  51278. });
  51279. Ext.define('Ext.util.Inflector', {
  51280. singleton: true,
  51281. plurals: [
  51282. [(/(quiz)$/i), "$1zes" ],
  51283. [(/^(ox)$/i), "$1en" ],
  51284. [(/([m|l])ouse$/i), "$1ice" ],
  51285. [(/(matr|vert|ind)ix|ex$/i), "$1ices" ],
  51286. [(/(x|ch|ss|sh)$/i), "$1es" ],
  51287. [(/([^aeiouy]|qu)y$/i), "$1ies" ],
  51288. [(/(hive)$/i), "$1s" ],
  51289. [(/(?:([^f])fe|([lr])f)$/i), "$1$2ves"],
  51290. [(/sis$/i), "ses" ],
  51291. [(/([ti])um$/i), "$1a" ],
  51292. [(/(buffal|tomat|potat)o$/i), "$1oes" ],
  51293. [(/(bu)s$/i), "$1ses" ],
  51294. [(/(alias|status|sex)$/i), "$1es" ],
  51295. [(/(octop|vir)us$/i), "$1i" ],
  51296. [(/(ax|test)is$/i), "$1es" ],
  51297. [(/^person$/), "people" ],
  51298. [(/^man$/), "men" ],
  51299. [(/^(child)$/), "$1ren" ],
  51300. [(/s$/i), "s" ],
  51301. [(/$/), "s" ]
  51302. ],
  51303. singulars: [
  51304. [(/(quiz)zes$/i), "$1" ],
  51305. [(/(matr)ices$/i), "$1ix" ],
  51306. [(/(vert|ind)ices$/i), "$1ex" ],
  51307. [(/^(ox)en/i), "$1" ],
  51308. [(/(alias|status)es$/i), "$1" ],
  51309. [(/(octop|vir)i$/i), "$1us" ],
  51310. [(/(cris|ax|test)es$/i), "$1is" ],
  51311. [(/(shoe)s$/i), "$1" ],
  51312. [(/(o)es$/i), "$1" ],
  51313. [(/(bus)es$/i), "$1" ],
  51314. [(/([m|l])ice$/i), "$1ouse" ],
  51315. [(/(x|ch|ss|sh)es$/i), "$1" ],
  51316. [(/(m)ovies$/i), "$1ovie" ],
  51317. [(/(s)eries$/i), "$1eries"],
  51318. [(/([^aeiouy]|qu)ies$/i), "$1y" ],
  51319. [(/([lr])ves$/i), "$1f" ],
  51320. [(/(tive)s$/i), "$1" ],
  51321. [(/(hive)s$/i), "$1" ],
  51322. [(/([^f])ves$/i), "$1fe" ],
  51323. [(/(^analy)ses$/i), "$1sis" ],
  51324. [(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i), "$1$2sis"],
  51325. [(/([ti])a$/i), "$1um" ],
  51326. [(/(n)ews$/i), "$1ews" ],
  51327. [(/people$/i), "person" ],
  51328. [(/s$/i), "" ]
  51329. ],
  51330. uncountable: [
  51331. "sheep",
  51332. "fish",
  51333. "series",
  51334. "species",
  51335. "money",
  51336. "rice",
  51337. "information",
  51338. "equipment",
  51339. "grass",
  51340. "mud",
  51341. "offspring",
  51342. "deer",
  51343. "means"
  51344. ],
  51345. singular: function(matcher, replacer) {
  51346. this.singulars.unshift([matcher, replacer]);
  51347. },
  51348. plural: function(matcher, replacer) {
  51349. this.plurals.unshift([matcher, replacer]);
  51350. },
  51351. clearSingulars: function() {
  51352. this.singulars = [];
  51353. },
  51354. clearPlurals: function() {
  51355. this.plurals = [];
  51356. },
  51357. isTransnumeral: function(word) {
  51358. return Ext.Array.indexOf(this.uncountable, word) != -1;
  51359. },
  51360. pluralize: function(word) {
  51361. if (this.isTransnumeral(word)) {
  51362. return word;
  51363. }
  51364. var plurals = this.plurals,
  51365. length = plurals.length,
  51366. tuple, regex, i;
  51367. for (i = 0; i < length; i++) {
  51368. tuple = plurals[i];
  51369. regex = tuple[0];
  51370. if (regex == word || (regex.test && regex.test(word))) {
  51371. return word.replace(regex, tuple[1]);
  51372. }
  51373. }
  51374. return word;
  51375. },
  51376. singularize: function(word) {
  51377. if (this.isTransnumeral(word)) {
  51378. return word;
  51379. }
  51380. var singulars = this.singulars,
  51381. length = singulars.length,
  51382. tuple, regex, i;
  51383. for (i = 0; i < length; i++) {
  51384. tuple = singulars[i];
  51385. regex = tuple[0];
  51386. if (regex == word || (regex.test && regex.test(word))) {
  51387. return word.replace(regex, tuple[1]);
  51388. }
  51389. }
  51390. return word;
  51391. },
  51392. classify: function(word) {
  51393. return Ext.String.capitalize(this.singularize(word));
  51394. },
  51395. ordinalize: function(number) {
  51396. var parsed = parseInt(number, 10),
  51397. mod10 = parsed % 10,
  51398. mod100 = parsed % 100;
  51399. if (11 <= mod100 && mod100 <= 13) {
  51400. return number + "th";
  51401. } else {
  51402. switch(mod10) {
  51403. case 1 : return number + "st";
  51404. case 2 : return number + "nd";
  51405. case 3 : return number + "rd";
  51406. default: return number + "th";
  51407. }
  51408. }
  51409. }
  51410. }, function() {
  51411. var irregulars = {
  51412. alumnus: 'alumni',
  51413. cactus : 'cacti',
  51414. focus : 'foci',
  51415. nucleus: 'nuclei',
  51416. radius: 'radii',
  51417. stimulus: 'stimuli',
  51418. ellipsis: 'ellipses',
  51419. paralysis: 'paralyses',
  51420. oasis: 'oases',
  51421. appendix: 'appendices',
  51422. index: 'indexes',
  51423. beau: 'beaux',
  51424. bureau: 'bureaux',
  51425. tableau: 'tableaux',
  51426. woman: 'women',
  51427. child: 'children',
  51428. man: 'men',
  51429. corpus: 'corpora',
  51430. criterion: 'criteria',
  51431. curriculum: 'curricula',
  51432. genus: 'genera',
  51433. memorandum: 'memoranda',
  51434. phenomenon: 'phenomena',
  51435. foot: 'feet',
  51436. goose: 'geese',
  51437. tooth: 'teeth',
  51438. antenna: 'antennae',
  51439. formula: 'formulae',
  51440. nebula: 'nebulae',
  51441. vertebra: 'vertebrae',
  51442. vita: 'vitae'
  51443. },
  51444. singular;
  51445. for (singular in irregulars) {
  51446. this.plural(singular, irregulars[singular]);
  51447. this.singular(irregulars[singular], singular);
  51448. }
  51449. });
  51450. Ext.define('Ext.data.association.HasMany', {
  51451. extend: 'Ext.data.association.Association',
  51452. alternateClassName: 'Ext.data.HasManyAssociation',
  51453. requires: ['Ext.util.Inflector'],
  51454. alias: 'association.hasmany',
  51455. constructor: function(config) {
  51456. var me = this,
  51457. ownerProto,
  51458. name;
  51459. me.callParent(arguments);
  51460. me.name = me.name || Ext.util.Inflector.pluralize(me.associatedName.toLowerCase());
  51461. ownerProto = me.ownerModel.prototype;
  51462. name = me.name;
  51463. Ext.applyIf(me, {
  51464. storeName : name + "Store",
  51465. foreignKey: me.ownerName.toLowerCase() + "_id"
  51466. });
  51467. ownerProto[name] = me.createStore();
  51468. },
  51469. createStore: function() {
  51470. var that = this,
  51471. associatedModel = that.associatedModel,
  51472. storeName = that.storeName,
  51473. foreignKey = that.foreignKey,
  51474. primaryKey = that.primaryKey,
  51475. filterProperty = that.filterProperty,
  51476. autoLoad = that.autoLoad,
  51477. storeConfig = that.storeConfig || {};
  51478. return function() {
  51479. var me = this,
  51480. config, filter,
  51481. modelDefaults = {};
  51482. if (me[storeName] === undefined) {
  51483. if (filterProperty) {
  51484. filter = {
  51485. property : filterProperty,
  51486. value : me.get(filterProperty),
  51487. exactMatch: true
  51488. };
  51489. } else {
  51490. filter = {
  51491. property : foreignKey,
  51492. value : me.get(primaryKey),
  51493. exactMatch: true
  51494. };
  51495. }
  51496. modelDefaults[foreignKey] = me.get(primaryKey);
  51497. config = Ext.apply({}, storeConfig, {
  51498. model : associatedModel,
  51499. filters : [filter],
  51500. remoteFilter : false,
  51501. modelDefaults: modelDefaults
  51502. });
  51503. me[storeName] = Ext.data.AbstractStore.create(config);
  51504. if (autoLoad) {
  51505. me[storeName].load();
  51506. }
  51507. }
  51508. return me[storeName];
  51509. };
  51510. },
  51511. read: function(record, reader, associationData){
  51512. var store = record[this.name](),
  51513. inverse,
  51514. items, iLen, i;
  51515. store.add(reader.read(associationData).records);
  51516. inverse = this.associatedModel.prototype.associations.findBy(function(assoc){
  51517. return assoc.type === 'belongsTo' && assoc.associatedName === record.$className;
  51518. });
  51519. if (inverse) {
  51520. items = store.data.items;
  51521. iLen = items.length;
  51522. for (i = 0; i < iLen; i++) {
  51523. items[i][inverse.instanceName] = record;
  51524. }
  51525. }
  51526. }
  51527. });
  51528. Ext.define('Ext.data.association.HasOne', {
  51529. extend: 'Ext.data.association.Association',
  51530. alternateClassName: 'Ext.data.HasOneAssociation',
  51531. alias: 'association.hasone',
  51532. constructor: function(config) {
  51533. this.callParent(arguments);
  51534. var me = this,
  51535. ownerProto = me.ownerModel.prototype,
  51536. associatedName = me.associatedName,
  51537. getterName = me.getterName || 'get' + associatedName,
  51538. setterName = me.setterName || 'set' + associatedName;
  51539. Ext.applyIf(me, {
  51540. name : associatedName,
  51541. foreignKey : associatedName.toLowerCase() + "_id",
  51542. instanceName: associatedName + 'HasOneInstance',
  51543. associationKey: associatedName.toLowerCase()
  51544. });
  51545. ownerProto[getterName] = me.createGetter();
  51546. ownerProto[setterName] = me.createSetter();
  51547. },
  51548. createSetter: function() {
  51549. var me = this,
  51550. ownerModel = me.ownerModel,
  51551. foreignKey = me.foreignKey;
  51552. return function(value, options, scope) {
  51553. if (value && value.isModel) {
  51554. value = value.getId();
  51555. }
  51556. this.set(foreignKey, value);
  51557. if (Ext.isFunction(options)) {
  51558. options = {
  51559. callback: options,
  51560. scope: scope || this
  51561. };
  51562. }
  51563. if (Ext.isObject(options)) {
  51564. return this.save(options);
  51565. }
  51566. };
  51567. },
  51568. createGetter: function() {
  51569. var me = this,
  51570. ownerModel = me.ownerModel,
  51571. associatedName = me.associatedName,
  51572. associatedModel = me.associatedModel,
  51573. foreignKey = me.foreignKey,
  51574. primaryKey = me.primaryKey,
  51575. instanceName = me.instanceName;
  51576. return function(options, scope) {
  51577. options = options || {};
  51578. var model = this,
  51579. foreignKeyId = model.get(foreignKey),
  51580. success,
  51581. instance,
  51582. args;
  51583. if (options.reload === true || model[instanceName] === undefined) {
  51584. instance = Ext.ModelManager.create({}, associatedName);
  51585. instance.set(primaryKey, foreignKeyId);
  51586. if (typeof options == 'function') {
  51587. options = {
  51588. callback: options,
  51589. scope: scope || model
  51590. };
  51591. }
  51592. success = options.success;
  51593. options.success = function(rec){
  51594. model[instanceName] = rec;
  51595. if (success) {
  51596. success.apply(this, arguments);
  51597. }
  51598. };
  51599. associatedModel.load(foreignKeyId, options);
  51600. model[instanceName] = instance;
  51601. return instance;
  51602. } else {
  51603. instance = model[instanceName];
  51604. args = [instance];
  51605. scope = scope || options.scope || model;
  51606. Ext.callback(options, scope, args);
  51607. Ext.callback(options.success, scope, args);
  51608. Ext.callback(options.failure, scope, args);
  51609. Ext.callback(options.callback, scope, args);
  51610. return instance;
  51611. }
  51612. };
  51613. },
  51614. read: function(record, reader, associationData){
  51615. var inverse = this.associatedModel.prototype.associations.findBy(function(assoc){
  51616. return assoc.type === 'belongsTo' && assoc.associatedName === record.$className;
  51617. }), newRecord = reader.read([associationData]).records[0];
  51618. record[this.instanceName] = newRecord;
  51619. if (inverse) {
  51620. newRecord[inverse.instanceName] = record;
  51621. }
  51622. }
  51623. });
  51624. Ext.define('Ext.data.proxy.WebStorage', {
  51625. extend: 'Ext.data.proxy.Client',
  51626. alternateClassName: 'Ext.data.WebStorageProxy',
  51627. requires: [
  51628. 'Ext.data.SequentialIdGenerator'
  51629. ],
  51630. id: undefined,
  51631. constructor: function(config) {
  51632. this.callParent(arguments);
  51633. this.cache = {};
  51634. this.id = this.id || (this.store ? this.store.storeId : undefined);
  51635. this.initialize();
  51636. },
  51637. create: function(operation, callback, scope) {
  51638. var me = this,
  51639. records = operation.records,
  51640. length = records.length,
  51641. ids = me.getIds(),
  51642. id, record, i;
  51643. operation.setStarted();
  51644. if(me.isHierarchical === undefined) {
  51645. me.isHierarchical = !!records[0].isNode;
  51646. if(me.isHierarchical) {
  51647. me.getStorageObject().setItem(me.getTreeKey(), true);
  51648. }
  51649. }
  51650. for (i = 0; i < length; i++) {
  51651. record = records[i];
  51652. if (record.phantom) {
  51653. record.phantom = false;
  51654. id = me.getNextId();
  51655. } else {
  51656. id = record.getId();
  51657. }
  51658. me.setRecord(record, id);
  51659. record.commit();
  51660. ids.push(id);
  51661. }
  51662. me.setIds(ids);
  51663. operation.setCompleted();
  51664. operation.setSuccessful();
  51665. if (typeof callback == 'function') {
  51666. callback.call(scope || me, operation);
  51667. }
  51668. },
  51669. read: function(operation, callback, scope) {
  51670. var me = this,
  51671. records = [],
  51672. i = 0,
  51673. success = true,
  51674. Model = me.model,
  51675. ids, length, record, data, id;
  51676. operation.setStarted();
  51677. if(me.isHierarchical) {
  51678. records = me.getTreeData();
  51679. } else {
  51680. ids = me.getIds();
  51681. length = ids.length;
  51682. id = operation.id;
  51683. if (id) {
  51684. data = me.getRecord(id);
  51685. if (data !== null) {
  51686. record = new Model(data, id, data);
  51687. }
  51688. if (record) {
  51689. records.push(record);
  51690. } else {
  51691. success = false;
  51692. }
  51693. } else {
  51694. for (; i < length; i++) {
  51695. id = ids[i];
  51696. data = me.getRecord(id);
  51697. records.push(new Model(data, id, data));
  51698. }
  51699. }
  51700. }
  51701. if(success) {
  51702. operation.setSuccessful();
  51703. }
  51704. operation.setCompleted();
  51705. operation.resultSet = Ext.create('Ext.data.ResultSet', {
  51706. records: records,
  51707. total : records.length,
  51708. loaded : true
  51709. });
  51710. if (typeof callback == 'function') {
  51711. callback.call(scope || me, operation);
  51712. }
  51713. },
  51714. update: function(operation, callback, scope) {
  51715. var records = operation.records,
  51716. length = records.length,
  51717. ids = this.getIds(),
  51718. record, id, i;
  51719. operation.setStarted();
  51720. for (i = 0; i < length; i++) {
  51721. record = records[i];
  51722. this.setRecord(record);
  51723. record.commit();
  51724. id = record.getId();
  51725. if (id !== undefined && Ext.Array.indexOf(ids, id) == -1) {
  51726. ids.push(id);
  51727. }
  51728. }
  51729. this.setIds(ids);
  51730. operation.setCompleted();
  51731. operation.setSuccessful();
  51732. if (typeof callback == 'function') {
  51733. callback.call(scope || this, operation);
  51734. }
  51735. },
  51736. destroy: function(operation, callback, scope) {
  51737. var me = this,
  51738. records = operation.records,
  51739. ids = me.getIds(),
  51740. idLength = ids.length,
  51741. newIds = [],
  51742. removedHash = {},
  51743. i = records.length,
  51744. id;
  51745. operation.setStarted();
  51746. for (; i--;) {
  51747. Ext.apply(removedHash, me.removeRecord(records[i]));
  51748. }
  51749. for(i = 0; i < idLength; i++) {
  51750. id = ids[i];
  51751. if(!removedHash[id]) {
  51752. newIds.push(id);
  51753. }
  51754. }
  51755. me.setIds(newIds);
  51756. operation.setCompleted();
  51757. operation.setSuccessful();
  51758. if (typeof callback == 'function') {
  51759. callback.call(scope || me, operation);
  51760. }
  51761. },
  51762. getRecord: function(id) {
  51763. var me = this,
  51764. cache = me.cache,
  51765. data = !cache[id] ? Ext.decode(me.getStorageObject().getItem(me.getRecordKey(id))) : cache[id];
  51766. if(!data) {
  51767. return null;
  51768. }
  51769. cache[id] = data;
  51770. data[me.model.prototype.idProperty] = id;
  51771. return data;
  51772. },
  51773. setRecord: function(record, id) {
  51774. if (id) {
  51775. record.setId(id);
  51776. } else {
  51777. id = record.getId();
  51778. }
  51779. var me = this,
  51780. rawData = record.data,
  51781. data = {},
  51782. model = me.model,
  51783. fields = model.prototype.fields.items,
  51784. length = fields.length,
  51785. i = 0,
  51786. field, name, obj, key;
  51787. for (; i < length; i++) {
  51788. field = fields[i];
  51789. name = field.name;
  51790. if(field.persist) {
  51791. data[name] = rawData[name];
  51792. }
  51793. }
  51794. delete data[me.model.prototype.idProperty];
  51795. if(record.isNode && record.get('depth') === 1) {
  51796. delete data.parentId;
  51797. }
  51798. obj = me.getStorageObject();
  51799. key = me.getRecordKey(id);
  51800. me.cache[id] = data;
  51801. obj.removeItem(key);
  51802. obj.setItem(key, Ext.encode(data));
  51803. },
  51804. removeRecord: function(record) {
  51805. var me = this,
  51806. id = record.getId(),
  51807. records = {},
  51808. i, childNodes;
  51809. records[id] = record;
  51810. me.getStorageObject().removeItem(me.getRecordKey(id));
  51811. delete me.cache[id];
  51812. if(record.childNodes) {
  51813. childNodes = record.childNodes;
  51814. for(i = childNodes.length; i--;) {
  51815. Ext.apply(records, me.removeRecord(childNodes[i]));
  51816. }
  51817. }
  51818. return records;
  51819. },
  51820. getRecordKey: function(id) {
  51821. if (id.isModel) {
  51822. id = id.getId();
  51823. }
  51824. return Ext.String.format("{0}-{1}", this.id, id);
  51825. },
  51826. getRecordCounterKey: function() {
  51827. return Ext.String.format("{0}-counter", this.id);
  51828. },
  51829. getTreeKey: function() {
  51830. return Ext.String.format("{0}-tree", this.id);
  51831. },
  51832. getIds: function() {
  51833. var me = this,
  51834. ids = (me.getStorageObject().getItem(me.id) || "").split(","),
  51835. model = me.model,
  51836. length = ids.length,
  51837. isString = model.prototype.fields.get(model.prototype.idProperty).type.type === 'string',
  51838. i;
  51839. if (length == 1 && ids[0] === "") {
  51840. ids = [];
  51841. } else {
  51842. for (i = 0; i < length; i++) {
  51843. ids[i] = isString ? ids[i] : +ids[i];
  51844. }
  51845. }
  51846. return ids;
  51847. },
  51848. setIds: function(ids) {
  51849. var obj = this.getStorageObject(),
  51850. str = ids.join(",");
  51851. obj.removeItem(this.id);
  51852. if (!Ext.isEmpty(str)) {
  51853. obj.setItem(this.id, str);
  51854. }
  51855. },
  51856. getNextId: function() {
  51857. var me = this,
  51858. obj = me.getStorageObject(),
  51859. key = me.getRecordCounterKey(),
  51860. model = me.model,
  51861. isString = model.prototype.fields.get(model.prototype.idProperty).type.type === 'string',
  51862. id;
  51863. id = me.idGenerator.generate();
  51864. obj.setItem(key, id);
  51865. if(!isString) {
  51866. id = +id;
  51867. }
  51868. return id;
  51869. },
  51870. getTreeData: function() {
  51871. var me = this,
  51872. ids = me.getIds(),
  51873. length = ids.length,
  51874. records = [],
  51875. recordHash = {},
  51876. root = [],
  51877. i = 0,
  51878. Model = me.model,
  51879. idProperty = Model.prototype.idProperty,
  51880. rootLength, record, parent, parentId, children, id;
  51881. for(; i < length; i++) {
  51882. id = ids[i];
  51883. record = me.getRecord(id);
  51884. records.push(record);
  51885. recordHash[id] = record;
  51886. if(!record.parentId) {
  51887. root.push(record);
  51888. }
  51889. }
  51890. rootLength = root.length;
  51891. Ext.Array.sort(records, me.sortByParentId);
  51892. for(i = rootLength; i < length; i++) {
  51893. record = records[i];
  51894. parentId = record.parentId;
  51895. if(!parent || parent[idProperty] !== parentId) {
  51896. parent = recordHash[parentId];
  51897. parent.children = children = [];
  51898. }
  51899. children.push(record);
  51900. }
  51901. for(i = length; i--;) {
  51902. record = records[i];
  51903. if(!record.children && !record.leaf) {
  51904. record.loaded = true;
  51905. }
  51906. }
  51907. for(i = rootLength; i--;) {
  51908. record = root[i];
  51909. root[i] = new Model(record, record[idProperty], record);
  51910. }
  51911. return root;
  51912. },
  51913. sortByParentId: function(node1, node2) {
  51914. return (node1.parentId || 0) - (node2.parentId || 0);
  51915. },
  51916. initialize: function() {
  51917. var me = this,
  51918. storageObject = me.getStorageObject(),
  51919. lastId = +storageObject.getItem(me.getRecordCounterKey());
  51920. storageObject.setItem(me.id, storageObject.getItem(me.id) || "");
  51921. if(storageObject.getItem(me.getTreeKey())) {
  51922. me.isHierarchical = true;
  51923. }
  51924. me.idGenerator = new Ext.data.SequentialIdGenerator({
  51925. seed: lastId ? lastId + 1 : 1
  51926. });
  51927. },
  51928. clear: function() {
  51929. var me = this,
  51930. obj = me.getStorageObject(),
  51931. ids = me.getIds(),
  51932. len = ids.length,
  51933. i;
  51934. for (i = 0; i < len; i++) {
  51935. obj.removeItem(me.getRecordKey(ids[i]));
  51936. }
  51937. obj.removeItem(me.getRecordCounterKey());
  51938. obj.removeItem(me.getTreeKey());
  51939. obj.removeItem(me.id);
  51940. me.cache = {};
  51941. },
  51942. getStorageObject: function() {
  51943. }
  51944. });
  51945. Ext.define('Ext.data.proxy.LocalStorage', {
  51946. extend: 'Ext.data.proxy.WebStorage',
  51947. alias: 'proxy.localstorage',
  51948. alternateClassName: 'Ext.data.LocalStorageProxy',
  51949. getStorageObject: function() {
  51950. return window.localStorage;
  51951. }
  51952. });
  51953. Ext.define('Ext.data.proxy.Rest', {
  51954. extend: 'Ext.data.proxy.Ajax',
  51955. alternateClassName: 'Ext.data.RestProxy',
  51956. alias : 'proxy.rest',
  51957. appendId: true,
  51958. batchActions: false,
  51959. buildUrl: function(request) {
  51960. var me = this,
  51961. operation = request.operation,
  51962. records = operation.records || [],
  51963. record = records[0],
  51964. format = me.format,
  51965. url = me.getUrl(request),
  51966. id = record ? record.getId() : operation.id;
  51967. if (me.appendId && id) {
  51968. if (!url.match(/\/$/)) {
  51969. url += '/';
  51970. }
  51971. url += id;
  51972. }
  51973. if (format) {
  51974. if (!url.match(/\.$/)) {
  51975. url += '.';
  51976. }
  51977. url += format;
  51978. }
  51979. request.url = url;
  51980. return me.callParent(arguments);
  51981. }
  51982. }, function() {
  51983. Ext.apply(this.prototype, {
  51984. actionMethods: {
  51985. create : 'POST',
  51986. read : 'GET',
  51987. update : 'PUT',
  51988. destroy: 'DELETE'
  51989. }
  51990. });
  51991. });
  51992. Ext.define('Ext.data.proxy.SessionStorage', {
  51993. extend: 'Ext.data.proxy.WebStorage',
  51994. alias: 'proxy.sessionstorage',
  51995. alternateClassName: 'Ext.data.SessionStorageProxy',
  51996. getStorageObject: function() {
  51997. return window.sessionStorage;
  51998. }
  51999. });
  52000. Ext.define('Ext.dd.DDTarget', {
  52001. extend: 'Ext.dd.DragDrop',
  52002. constructor: function(id, sGroup, config) {
  52003. if (id) {
  52004. this.initTarget(id, sGroup, config);
  52005. }
  52006. },
  52007. getDragEl: Ext.emptyFn,
  52008. isValidHandleChild: Ext.emptyFn,
  52009. startDrag: Ext.emptyFn,
  52010. endDrag: Ext.emptyFn,
  52011. onDrag: Ext.emptyFn,
  52012. onDragDrop: Ext.emptyFn,
  52013. onDragEnter: Ext.emptyFn,
  52014. onDragOut: Ext.emptyFn,
  52015. onDragOver: Ext.emptyFn,
  52016. onInvalidDrop: Ext.emptyFn,
  52017. onMouseDown: Ext.emptyFn,
  52018. onMouseUp: Ext.emptyFn,
  52019. setXConstraint: Ext.emptyFn,
  52020. setYConstraint: Ext.emptyFn,
  52021. resetConstraints: Ext.emptyFn,
  52022. clearConstraints: Ext.emptyFn,
  52023. clearTicks: Ext.emptyFn,
  52024. setInitPosition: Ext.emptyFn,
  52025. setDragElId: Ext.emptyFn,
  52026. setHandleElId: Ext.emptyFn,
  52027. setOuterHandleElId: Ext.emptyFn,
  52028. addInvalidHandleClass: Ext.emptyFn,
  52029. addInvalidHandleId: Ext.emptyFn,
  52030. addInvalidHandleType: Ext.emptyFn,
  52031. removeInvalidHandleClass: Ext.emptyFn,
  52032. removeInvalidHandleId: Ext.emptyFn,
  52033. removeInvalidHandleType: Ext.emptyFn,
  52034. toString: function() {
  52035. return ("DDTarget " + this.id);
  52036. }
  52037. });
  52038. Ext.define('Ext.dd.DragTracker', {
  52039. uses: ['Ext.util.Region'],
  52040. mixins: {
  52041. observable: 'Ext.util.Observable'
  52042. },
  52043. active: false,
  52044. trackOver: false,
  52045. tolerance: 5,
  52046. autoStart: false,
  52047. constructor : function(config){
  52048. var me = this;
  52049. Ext.apply(me, config);
  52050. me.addEvents(
  52051. 'mouseover',
  52052. 'mouseout',
  52053. 'mousedown',
  52054. 'mouseup',
  52055. 'mousemove',
  52056. 'beforedragstart',
  52057. 'dragstart',
  52058. 'dragend',
  52059. 'drag'
  52060. );
  52061. me.dragRegion = new Ext.util.Region(0,0,0,0);
  52062. if (me.el) {
  52063. me.initEl(me.el);
  52064. }
  52065. me.mixins.observable.constructor.call(me);
  52066. if (me.disabled) {
  52067. me.disable();
  52068. }
  52069. },
  52070. initEl: function(el) {
  52071. var me = this;
  52072. me.el = Ext.get(el);
  52073. me.handle = Ext.get(me.delegate);
  52074. me.delegate = me.handle ? undefined : me.delegate;
  52075. if (!me.handle) {
  52076. me.handle = me.el;
  52077. }
  52078. me.mon(me.handle, {
  52079. mousedown: me.onMouseDown,
  52080. delegate: me.delegate,
  52081. scope: me
  52082. });
  52083. if (me.trackOver || me.overCls) {
  52084. me.mon(me.handle, {
  52085. mouseover: me.onMouseOver,
  52086. mouseout: me.onMouseOut,
  52087. delegate: me.delegate,
  52088. scope: me
  52089. });
  52090. }
  52091. },
  52092. disable: function() {
  52093. this.disabled = true;
  52094. },
  52095. enable: function() {
  52096. this.disabled = false;
  52097. },
  52098. destroy : function() {
  52099. this.clearListeners();
  52100. delete this.el;
  52101. },
  52102. onMouseOver: function(e, target) {
  52103. var me = this;
  52104. if (!me.disabled) {
  52105. if (Ext.EventManager.contains(e) || me.delegate) {
  52106. me.mouseIsOut = false;
  52107. if (me.overCls) {
  52108. me.el.addCls(me.overCls);
  52109. }
  52110. me.fireEvent('mouseover', me, e, me.delegate ? e.getTarget(me.delegate, target) : me.handle);
  52111. }
  52112. }
  52113. },
  52114. onMouseOut: function(e) {
  52115. var me = this;
  52116. if (me.mouseIsDown) {
  52117. me.mouseIsOut = true;
  52118. } else {
  52119. if (me.overCls) {
  52120. me.el.removeCls(me.overCls);
  52121. }
  52122. me.fireEvent('mouseout', me, e);
  52123. }
  52124. },
  52125. onMouseDown: function(e, target){
  52126. var me = this,
  52127. el;
  52128. if (me.disabled ||e.dragTracked) {
  52129. return;
  52130. }
  52131. me.dragTarget = me.delegate ? target : me.handle.dom;
  52132. me.startXY = me.lastXY = e.getXY();
  52133. me.startRegion = Ext.fly(me.dragTarget).getRegion();
  52134. if (me.fireEvent('mousedown', me, e) === false ||
  52135. me.fireEvent('beforedragstart', me, e) === false ||
  52136. me.onBeforeStart(e) === false) {
  52137. return;
  52138. }
  52139. me.mouseIsDown = true;
  52140. e.dragTracked = true;
  52141. el = me.el.dom;
  52142. if (Ext.isIE && el.setCapture) {
  52143. el.setCapture();
  52144. }
  52145. if (me.preventDefault !== false) {
  52146. e.preventDefault();
  52147. }
  52148. Ext.getDoc().on({
  52149. scope: me,
  52150. mouseup: me.onMouseUp,
  52151. mousemove: me.onMouseMove,
  52152. selectstart: me.stopSelect
  52153. });
  52154. if (me.autoStart) {
  52155. me.timer = Ext.defer(me.triggerStart, me.autoStart === true ? 1000 : me.autoStart, me, [e]);
  52156. }
  52157. },
  52158. onMouseMove: function(e, target){
  52159. var me = this,
  52160. xy = e.getXY(),
  52161. s = me.startXY;
  52162. e.preventDefault();
  52163. me.lastXY = xy;
  52164. if (!me.active) {
  52165. if (Math.max(Math.abs(s[0]-xy[0]), Math.abs(s[1]-xy[1])) > me.tolerance) {
  52166. me.triggerStart(e);
  52167. } else {
  52168. return;
  52169. }
  52170. }
  52171. if (me.fireEvent('mousemove', me, e) === false) {
  52172. me.onMouseUp(e);
  52173. } else {
  52174. me.onDrag(e);
  52175. me.fireEvent('drag', me, e);
  52176. }
  52177. },
  52178. onMouseUp: function(e) {
  52179. var me = this;
  52180. me.mouseIsDown = false;
  52181. if (me.mouseIsOut) {
  52182. me.mouseIsOut = false;
  52183. me.onMouseOut(e);
  52184. }
  52185. e.preventDefault();
  52186. if (Ext.isIE && document.releaseCapture) {
  52187. document.releaseCapture();
  52188. }
  52189. me.fireEvent('mouseup', me, e);
  52190. me.endDrag(e);
  52191. },
  52192. endDrag: function(e) {
  52193. var me = this,
  52194. doc = Ext.getDoc(),
  52195. wasActive = me.active;
  52196. doc.un('mousemove', me.onMouseMove, me);
  52197. doc.un('mouseup', me.onMouseUp, me);
  52198. doc.un('selectstart', me.stopSelect, me);
  52199. me.clearStart();
  52200. me.active = false;
  52201. if (wasActive) {
  52202. me.onEnd(e);
  52203. me.fireEvent('dragend', me, e);
  52204. }
  52205. delete me._constrainRegion;
  52206. delete Ext.EventObject.dragTracked;
  52207. },
  52208. triggerStart: function(e) {
  52209. var me = this;
  52210. me.clearStart();
  52211. me.active = true;
  52212. me.onStart(e);
  52213. me.fireEvent('dragstart', me, e);
  52214. },
  52215. clearStart : function() {
  52216. var timer = this.timer;
  52217. if (timer) {
  52218. clearTimeout(timer);
  52219. delete this.timer;
  52220. }
  52221. },
  52222. stopSelect : function(e) {
  52223. e.stopEvent();
  52224. return false;
  52225. },
  52226. onBeforeStart : function(e) {
  52227. },
  52228. onStart : function(xy) {
  52229. },
  52230. onDrag : function(e) {
  52231. },
  52232. onEnd : function(e) {
  52233. },
  52234. getDragTarget : function(){
  52235. return this.dragTarget;
  52236. },
  52237. getDragCt : function(){
  52238. return this.el;
  52239. },
  52240. getConstrainRegion: function() {
  52241. var me = this;
  52242. if (me.constrainTo) {
  52243. if (me.constrainTo instanceof Ext.util.Region) {
  52244. return me.constrainTo;
  52245. }
  52246. if (!me._constrainRegion) {
  52247. me._constrainRegion = Ext.fly(me.constrainTo).getViewRegion();
  52248. }
  52249. } else {
  52250. if (!me._constrainRegion) {
  52251. me._constrainRegion = me.getDragCt().getViewRegion();
  52252. }
  52253. }
  52254. return me._constrainRegion;
  52255. },
  52256. getXY : function(constrain){
  52257. return constrain ? this.constrainModes[constrain](this, this.lastXY) : this.lastXY;
  52258. },
  52259. getOffset : function(constrain){
  52260. var xy = this.getXY(constrain),
  52261. s = this.startXY;
  52262. return [xy[0]-s[0], xy[1]-s[1]];
  52263. },
  52264. constrainModes: {
  52265. point: function(me, xy) {
  52266. var dr = me.dragRegion,
  52267. constrainTo = me.getConstrainRegion();
  52268. if (!constrainTo) {
  52269. return xy;
  52270. }
  52271. dr.x = dr.left = dr[0] = dr.right = xy[0];
  52272. dr.y = dr.top = dr[1] = dr.bottom = xy[1];
  52273. dr.constrainTo(constrainTo);
  52274. return [dr.left, dr.top];
  52275. },
  52276. dragTarget: function(me, xy) {
  52277. var s = me.startXY,
  52278. dr = me.startRegion.copy(),
  52279. constrainTo = me.getConstrainRegion(),
  52280. adjust;
  52281. if (!constrainTo) {
  52282. return xy;
  52283. }
  52284. dr.translateBy(xy[0]-s[0], xy[1]-s[1]);
  52285. if (dr.right > constrainTo.right) {
  52286. xy[0] += adjust = (constrainTo.right - dr.right);
  52287. dr.left += adjust;
  52288. }
  52289. if (dr.left < constrainTo.left) {
  52290. xy[0] += (constrainTo.left - dr.left);
  52291. }
  52292. if (dr.bottom > constrainTo.bottom) {
  52293. xy[1] += adjust = (constrainTo.bottom - dr.bottom);
  52294. dr.top += adjust;
  52295. }
  52296. if (dr.top < constrainTo.top) {
  52297. xy[1] += (constrainTo.top - dr.top);
  52298. }
  52299. return xy;
  52300. }
  52301. }
  52302. });
  52303. Ext.define('Ext.dd.DragZone', {
  52304. extend: 'Ext.dd.DragSource',
  52305. constructor : function(el, config){
  52306. this.callParent([el, config]);
  52307. if (this.containerScroll) {
  52308. Ext.dd.ScrollManager.register(this.el);
  52309. }
  52310. },
  52311. getDragData : function(e){
  52312. return Ext.dd.Registry.getHandleFromEvent(e);
  52313. },
  52314. onInitDrag : function(x, y){
  52315. this.proxy.update(this.dragData.ddel.cloneNode(true));
  52316. this.onStartDrag(x, y);
  52317. return true;
  52318. },
  52319. afterRepair : function(){
  52320. var me = this;
  52321. if (Ext.enableFx) {
  52322. Ext.fly(me.dragData.ddel).highlight(me.repairHighlightColor);
  52323. }
  52324. me.dragging = false;
  52325. },
  52326. getRepairXY : function(e){
  52327. return Ext.fly(this.dragData.ddel).getXY();
  52328. },
  52329. destroy : function(){
  52330. this.callParent();
  52331. if (this.containerScroll) {
  52332. Ext.dd.ScrollManager.unregister(this.el);
  52333. }
  52334. }
  52335. });
  52336. Ext.define('Ext.dd.ScrollManager', {
  52337. singleton: true,
  52338. requires: [
  52339. 'Ext.dd.DragDropManager'
  52340. ],
  52341. constructor: function() {
  52342. var ddm = Ext.dd.DragDropManager;
  52343. ddm.fireEvents = Ext.Function.createSequence(ddm.fireEvents, this.onFire, this);
  52344. ddm.stopDrag = Ext.Function.createSequence(ddm.stopDrag, this.onStop, this);
  52345. this.doScroll = Ext.Function.bind(this.doScroll, this);
  52346. this.ddmInstance = ddm;
  52347. this.els = {};
  52348. this.dragEl = null;
  52349. this.proc = {};
  52350. },
  52351. onStop: function(e){
  52352. var sm = Ext.dd.ScrollManager;
  52353. sm.dragEl = null;
  52354. sm.clearProc();
  52355. },
  52356. triggerRefresh: function() {
  52357. if (this.ddmInstance.dragCurrent) {
  52358. this.ddmInstance.refreshCache(this.ddmInstance.dragCurrent.groups);
  52359. }
  52360. },
  52361. doScroll: function() {
  52362. if (this.ddmInstance.dragCurrent) {
  52363. var proc = this.proc,
  52364. procEl = proc.el,
  52365. ddScrollConfig = proc.el.ddScrollConfig,
  52366. inc = ddScrollConfig ? ddScrollConfig.increment : this.increment;
  52367. if (!this.animate) {
  52368. if (procEl.scroll(proc.dir, inc)) {
  52369. this.triggerRefresh();
  52370. }
  52371. } else {
  52372. procEl.scroll(proc.dir, inc, true, this.animDuration, this.triggerRefresh);
  52373. }
  52374. }
  52375. },
  52376. clearProc: function() {
  52377. var proc = this.proc;
  52378. if (proc.id) {
  52379. clearInterval(proc.id);
  52380. }
  52381. proc.id = 0;
  52382. proc.el = null;
  52383. proc.dir = "";
  52384. },
  52385. startProc: function(el, dir) {
  52386. this.clearProc();
  52387. this.proc.el = el;
  52388. this.proc.dir = dir;
  52389. var group = el.ddScrollConfig ? el.ddScrollConfig.ddGroup : undefined,
  52390. freq = (el.ddScrollConfig && el.ddScrollConfig.frequency)
  52391. ? el.ddScrollConfig.frequency
  52392. : this.frequency;
  52393. if (group === undefined || this.ddmInstance.dragCurrent.ddGroup == group) {
  52394. this.proc.id = setInterval(this.doScroll, freq);
  52395. }
  52396. },
  52397. onFire: function(e, isDrop) {
  52398. if (isDrop || !this.ddmInstance.dragCurrent) {
  52399. return;
  52400. }
  52401. if (!this.dragEl || this.dragEl != this.ddmInstance.dragCurrent) {
  52402. this.dragEl = this.ddmInstance.dragCurrent;
  52403. this.refreshCache();
  52404. }
  52405. var xy = e.getXY(),
  52406. pt = e.getPoint(),
  52407. proc = this.proc,
  52408. els = this.els,
  52409. id, el, r, c;
  52410. for (id in els) {
  52411. el = els[id];
  52412. r = el._region;
  52413. c = el.ddScrollConfig ? el.ddScrollConfig : this;
  52414. if (r && r.contains(pt) && el.isScrollable()) {
  52415. if (r.bottom - pt.y <= c.vthresh) {
  52416. if(proc.el != el){
  52417. this.startProc(el, "down");
  52418. }
  52419. return;
  52420. }else if (r.right - pt.x <= c.hthresh) {
  52421. if (proc.el != el) {
  52422. this.startProc(el, "left");
  52423. }
  52424. return;
  52425. } else if(pt.y - r.top <= c.vthresh) {
  52426. if (proc.el != el) {
  52427. this.startProc(el, "up");
  52428. }
  52429. return;
  52430. } else if(pt.x - r.left <= c.hthresh) {
  52431. if (proc.el != el) {
  52432. this.startProc(el, "right");
  52433. }
  52434. return;
  52435. }
  52436. }
  52437. }
  52438. this.clearProc();
  52439. },
  52440. register : function(el){
  52441. if (Ext.isArray(el)) {
  52442. for(var i = 0, len = el.length; i < len; i++) {
  52443. this.register(el[i]);
  52444. }
  52445. } else {
  52446. el = Ext.get(el);
  52447. this.els[el.id] = el;
  52448. }
  52449. },
  52450. unregister : function(el){
  52451. if(Ext.isArray(el)){
  52452. for (var i = 0, len = el.length; i < len; i++) {
  52453. this.unregister(el[i]);
  52454. }
  52455. }else{
  52456. el = Ext.get(el);
  52457. delete this.els[el.id];
  52458. }
  52459. },
  52460. vthresh : 25,
  52461. hthresh : 25,
  52462. increment : 100,
  52463. frequency : 500,
  52464. animate: true,
  52465. animDuration: 0.4,
  52466. ddGroup: undefined,
  52467. refreshCache : function(){
  52468. var els = this.els,
  52469. id;
  52470. for (id in els) {
  52471. if(typeof els[id] == 'object'){
  52472. els[id]._region = els[id].getRegion();
  52473. }
  52474. }
  52475. }
  52476. });
  52477. Ext.define('Ext.dd.DropTarget', {
  52478. extend: 'Ext.dd.DDTarget',
  52479. requires: ['Ext.dd.ScrollManager'],
  52480. constructor : function(el, config){
  52481. this.el = Ext.get(el);
  52482. Ext.apply(this, config);
  52483. if(this.containerScroll){
  52484. Ext.dd.ScrollManager.register(this.el);
  52485. }
  52486. this.callParent([this.el.dom, this.ddGroup || this.group,
  52487. {isTarget: true}]);
  52488. },
  52489. dropAllowed : Ext.baseCSSPrefix + 'dd-drop-ok',
  52490. dropNotAllowed : Ext.baseCSSPrefix + 'dd-drop-nodrop',
  52491. isTarget : true,
  52492. isNotifyTarget : true,
  52493. notifyEnter : function(dd, e, data){
  52494. if(this.overClass){
  52495. this.el.addCls(this.overClass);
  52496. }
  52497. return this.dropAllowed;
  52498. },
  52499. notifyOver : function(dd, e, data){
  52500. return this.dropAllowed;
  52501. },
  52502. notifyOut : function(dd, e, data){
  52503. if(this.overClass){
  52504. this.el.removeCls(this.overClass);
  52505. }
  52506. },
  52507. notifyDrop : function(dd, e, data){
  52508. return false;
  52509. },
  52510. destroy : function(){
  52511. this.callParent();
  52512. if(this.containerScroll){
  52513. Ext.dd.ScrollManager.unregister(this.el);
  52514. }
  52515. }
  52516. });
  52517. Ext.define('Ext.dd.Registry', {
  52518. singleton: true,
  52519. constructor: function() {
  52520. this.elements = {};
  52521. this.handles = {};
  52522. this.autoIdSeed = 0;
  52523. },
  52524. getId: function(el, autogen){
  52525. if(typeof el == "string"){
  52526. return el;
  52527. }
  52528. var id = el.id;
  52529. if(!id && autogen !== false){
  52530. id = "extdd-" + (++this.autoIdSeed);
  52531. el.id = id;
  52532. }
  52533. return id;
  52534. },
  52535. register : function(el, data){
  52536. data = data || {};
  52537. if (typeof el == "string") {
  52538. el = document.getElementById(el);
  52539. }
  52540. data.ddel = el;
  52541. this.elements[this.getId(el)] = data;
  52542. if (data.isHandle !== false) {
  52543. this.handles[data.ddel.id] = data;
  52544. }
  52545. if (data.handles) {
  52546. var hs = data.handles,
  52547. i, len;
  52548. for (i = 0, len = hs.length; i < len; i++) {
  52549. this.handles[this.getId(hs[i])] = data;
  52550. }
  52551. }
  52552. },
  52553. unregister : function(el){
  52554. var id = this.getId(el, false),
  52555. data = this.elements[id],
  52556. hs, i, len;
  52557. if(data){
  52558. delete this.elements[id];
  52559. if(data.handles){
  52560. hs = data.handles;
  52561. for (i = 0, len = hs.length; i < len; i++) {
  52562. delete this.handles[this.getId(hs[i], false)];
  52563. }
  52564. }
  52565. }
  52566. },
  52567. getHandle : function(id){
  52568. if(typeof id != "string"){
  52569. id = id.id;
  52570. }
  52571. return this.handles[id];
  52572. },
  52573. getHandleFromEvent : function(e){
  52574. var t = e.getTarget();
  52575. return t ? this.handles[t.id] : null;
  52576. },
  52577. getTarget : function(id){
  52578. if(typeof id != "string"){
  52579. id = id.id;
  52580. }
  52581. return this.elements[id];
  52582. },
  52583. getTargetFromEvent : function(e){
  52584. var t = e.getTarget();
  52585. return t ? this.elements[t.id] || this.handles[t.id] : null;
  52586. }
  52587. });
  52588. Ext.define('Ext.dd.DropZone', {
  52589. extend: 'Ext.dd.DropTarget',
  52590. requires: ['Ext.dd.Registry'],
  52591. getTargetFromEvent : function(e){
  52592. return Ext.dd.Registry.getTargetFromEvent(e);
  52593. },
  52594. onNodeEnter : function(n, dd, e, data){
  52595. },
  52596. onNodeOver : function(n, dd, e, data){
  52597. return this.dropAllowed;
  52598. },
  52599. onNodeOut : function(n, dd, e, data){
  52600. },
  52601. onNodeDrop : function(n, dd, e, data){
  52602. return false;
  52603. },
  52604. onContainerOver : function(dd, e, data){
  52605. return this.dropNotAllowed;
  52606. },
  52607. onContainerDrop : function(dd, e, data){
  52608. return false;
  52609. },
  52610. notifyEnter : function(dd, e, data){
  52611. return this.dropNotAllowed;
  52612. },
  52613. notifyOver : function(dd, e, data){
  52614. var n = this.getTargetFromEvent(e);
  52615. if(!n) {
  52616. if(this.lastOverNode){
  52617. this.onNodeOut(this.lastOverNode, dd, e, data);
  52618. this.lastOverNode = null;
  52619. }
  52620. return this.onContainerOver(dd, e, data);
  52621. }
  52622. if(this.lastOverNode != n){
  52623. if(this.lastOverNode){
  52624. this.onNodeOut(this.lastOverNode, dd, e, data);
  52625. }
  52626. this.onNodeEnter(n, dd, e, data);
  52627. this.lastOverNode = n;
  52628. }
  52629. return this.onNodeOver(n, dd, e, data);
  52630. },
  52631. notifyOut : function(dd, e, data){
  52632. if(this.lastOverNode){
  52633. this.onNodeOut(this.lastOverNode, dd, e, data);
  52634. this.lastOverNode = null;
  52635. }
  52636. },
  52637. notifyDrop : function(dd, e, data){
  52638. if(this.lastOverNode){
  52639. this.onNodeOut(this.lastOverNode, dd, e, data);
  52640. this.lastOverNode = null;
  52641. }
  52642. var n = this.getTargetFromEvent(e);
  52643. return n ?
  52644. this.onNodeDrop(n, dd, e, data) :
  52645. this.onContainerDrop(dd, e, data);
  52646. },
  52647. triggerCacheRefresh : function() {
  52648. Ext.dd.DDM.refreshCache(this.groups);
  52649. }
  52650. });
  52651. Ext.define('Ext.direct.Event', {
  52652. alias: 'direct.event',
  52653. requires: ['Ext.direct.Manager'],
  52654. status: true,
  52655. constructor: function(config) {
  52656. Ext.apply(this, config);
  52657. },
  52658. getData: function(){
  52659. return this.data;
  52660. }
  52661. });
  52662. Ext.define('Ext.direct.RemotingEvent', {
  52663. extend: 'Ext.direct.Event',
  52664. alias: 'direct.rpc',
  52665. getTransaction: function(){
  52666. return this.transaction || Ext.direct.Manager.getTransaction(this.tid);
  52667. }
  52668. });
  52669. Ext.define('Ext.direct.ExceptionEvent', {
  52670. extend: 'Ext.direct.RemotingEvent',
  52671. alias: 'direct.exception',
  52672. status: false
  52673. });
  52674. Ext.define('Ext.direct.Provider', {
  52675. alias: 'direct.provider',
  52676. mixins: {
  52677. observable: 'Ext.util.Observable'
  52678. },
  52679. constructor : function(config){
  52680. var me = this;
  52681. Ext.apply(me, config);
  52682. me.addEvents(
  52683. 'connect',
  52684. 'disconnect',
  52685. 'data',
  52686. 'exception'
  52687. );
  52688. me.mixins.observable.constructor.call(me, config);
  52689. },
  52690. isConnected: function(){
  52691. return false;
  52692. },
  52693. connect: Ext.emptyFn,
  52694. disconnect: Ext.emptyFn
  52695. });
  52696. Ext.define('Ext.direct.JsonProvider', {
  52697. extend: 'Ext.direct.Provider',
  52698. alias: 'direct.jsonprovider',
  52699. uses: ['Ext.direct.ExceptionEvent'],
  52700. parseResponse: function(response){
  52701. if (!Ext.isEmpty(response.responseText)) {
  52702. if (Ext.isObject(response.responseText)) {
  52703. return response.responseText;
  52704. }
  52705. return Ext.decode(response.responseText);
  52706. }
  52707. return null;
  52708. },
  52709. createEvents: function(response){
  52710. var data = null,
  52711. events = [],
  52712. event,
  52713. i = 0,
  52714. len;
  52715. try{
  52716. data = this.parseResponse(response);
  52717. } catch(e) {
  52718. event = new Ext.direct.ExceptionEvent({
  52719. data: e,
  52720. xhr: response,
  52721. code: Ext.direct.Manager.exceptions.PARSE,
  52722. message: 'Error parsing json response: \n\n ' + data
  52723. });
  52724. return [event];
  52725. }
  52726. if (Ext.isArray(data)) {
  52727. for (len = data.length; i < len; ++i) {
  52728. events.push(this.createEvent(data[i]));
  52729. }
  52730. } else {
  52731. events.push(this.createEvent(data));
  52732. }
  52733. return events;
  52734. },
  52735. createEvent: function(response){
  52736. return Ext.create('direct.' + response.type, response);
  52737. }
  52738. });
  52739. Ext.define('Ext.direct.PollingProvider', {
  52740. extend: 'Ext.direct.JsonProvider',
  52741. alias: 'direct.pollingprovider',
  52742. uses: ['Ext.direct.ExceptionEvent'],
  52743. requires: ['Ext.Ajax', 'Ext.util.DelayedTask'],
  52744. interval: 3000,
  52745. constructor : function(config){
  52746. this.callParent(arguments);
  52747. this.addEvents(
  52748. 'beforepoll',
  52749. 'poll'
  52750. );
  52751. },
  52752. isConnected: function(){
  52753. return !!this.pollTask;
  52754. },
  52755. connect: function(){
  52756. var me = this, url = me.url;
  52757. if (url && !me.pollTask) {
  52758. me.pollTask = Ext.TaskManager.start({
  52759. run: function(){
  52760. if (me.fireEvent('beforepoll', me) !== false) {
  52761. if (Ext.isFunction(url)) {
  52762. url(me.baseParams);
  52763. } else {
  52764. Ext.Ajax.request({
  52765. url: url,
  52766. callback: me.onData,
  52767. scope: me,
  52768. params: me.baseParams
  52769. });
  52770. }
  52771. }
  52772. },
  52773. interval: me.interval,
  52774. scope: me
  52775. });
  52776. me.fireEvent('connect', me);
  52777. } else if (!url) {
  52778. }
  52779. },
  52780. disconnect: function(){
  52781. var me = this;
  52782. if (me.pollTask) {
  52783. Ext.TaskManager.stop(me.pollTask);
  52784. delete me.pollTask;
  52785. me.fireEvent('disconnect', me);
  52786. }
  52787. },
  52788. onData: function(opt, success, response){
  52789. var me = this,
  52790. i = 0,
  52791. len,
  52792. events;
  52793. if (success) {
  52794. events = me.createEvents(response);
  52795. for (len = events.length; i < len; ++i) {
  52796. me.fireEvent('data', me, events[i]);
  52797. }
  52798. } else {
  52799. me.fireEvent('data', me, new Ext.direct.ExceptionEvent({
  52800. data: null,
  52801. code: Ext.direct.Manager.exceptions.TRANSPORT,
  52802. message: 'Unable to connect to the server.',
  52803. xhr: response
  52804. }));
  52805. }
  52806. }
  52807. });
  52808. Ext.define('Ext.direct.RemotingMethod', {
  52809. constructor: function(config){
  52810. var me = this,
  52811. params = Ext.isDefined(config.params) ? config.params : config.len,
  52812. name, pLen, p, param;
  52813. me.name = config.name;
  52814. me.formHandler = config.formHandler;
  52815. if (Ext.isNumber(params)) {
  52816. me.len = params;
  52817. me.ordered = true;
  52818. } else {
  52819. me.params = [];
  52820. pLen = params.length;
  52821. for (p = 0; p < pLen; p++) {
  52822. param = params[p];
  52823. name = Ext.isObject(param) ? param.name : param;
  52824. me.params.push(name);
  52825. }
  52826. }
  52827. },
  52828. getArgs: function(params, paramOrder, paramsAsHash){
  52829. var args = [],
  52830. i,
  52831. len;
  52832. if (this.ordered) {
  52833. if (this.len > 0) {
  52834. if (paramOrder) {
  52835. for (i = 0, len = paramOrder.length; i < len; i++) {
  52836. args.push(params[paramOrder[i]]);
  52837. }
  52838. } else if (paramsAsHash) {
  52839. args.push(params);
  52840. }
  52841. }
  52842. } else {
  52843. args.push(params);
  52844. }
  52845. return args;
  52846. },
  52847. getCallData: function(args){
  52848. var me = this,
  52849. data = null,
  52850. len = me.len,
  52851. params = me.params,
  52852. callback,
  52853. scope,
  52854. name;
  52855. if (me.ordered) {
  52856. callback = args[len];
  52857. scope = args[len + 1];
  52858. if (len !== 0) {
  52859. data = args.slice(0, len);
  52860. }
  52861. } else {
  52862. data = Ext.apply({}, args[0]);
  52863. callback = args[1];
  52864. scope = args[2];
  52865. for (name in data) {
  52866. if (data.hasOwnProperty(name)) {
  52867. if (!Ext.Array.contains(params, name)) {
  52868. delete data[name];
  52869. }
  52870. }
  52871. }
  52872. }
  52873. return {
  52874. data: data,
  52875. callback: callback,
  52876. scope: scope
  52877. };
  52878. }
  52879. });
  52880. Ext.define('Ext.direct.Transaction', {
  52881. alias: 'direct.transaction',
  52882. alternateClassName: 'Ext.Direct.Transaction',
  52883. statics: {
  52884. TRANSACTION_ID: 0
  52885. },
  52886. constructor: function(config){
  52887. var me = this;
  52888. Ext.apply(me, config);
  52889. me.id = me.tid = ++me.self.TRANSACTION_ID;
  52890. me.retryCount = 0;
  52891. },
  52892. send: function(){
  52893. this.provider.queueTransaction(this);
  52894. },
  52895. retry: function(){
  52896. this.retryCount++;
  52897. this.send();
  52898. },
  52899. getProvider: function(){
  52900. return this.provider;
  52901. }
  52902. });
  52903. Ext.define('Ext.direct.RemotingProvider', {
  52904. alias: 'direct.remotingprovider',
  52905. extend: 'Ext.direct.JsonProvider',
  52906. requires: [
  52907. 'Ext.util.MixedCollection',
  52908. 'Ext.util.DelayedTask',
  52909. 'Ext.direct.Transaction',
  52910. 'Ext.direct.RemotingMethod'
  52911. ],
  52912. enableBuffer: 10,
  52913. maxRetries: 1,
  52914. timeout: undefined,
  52915. constructor : function(config){
  52916. var me = this;
  52917. me.callParent(arguments);
  52918. me.addEvents(
  52919. 'beforecall',
  52920. 'call'
  52921. );
  52922. me.namespace = (Ext.isString(me.namespace)) ? Ext.ns(me.namespace) : me.namespace || window;
  52923. me.transactions = new Ext.util.MixedCollection();
  52924. me.callBuffer = [];
  52925. },
  52926. initAPI : function(){
  52927. var actions = this.actions,
  52928. namespace = this.namespace,
  52929. action,
  52930. cls,
  52931. methods,
  52932. i,
  52933. len,
  52934. method;
  52935. for (action in actions) {
  52936. if (actions.hasOwnProperty(action)) {
  52937. cls = namespace[action];
  52938. if (!cls) {
  52939. cls = namespace[action] = {};
  52940. }
  52941. methods = actions[action];
  52942. for (i = 0, len = methods.length; i < len; ++i) {
  52943. method = new Ext.direct.RemotingMethod(methods[i]);
  52944. cls[method.name] = this.createHandler(action, method);
  52945. }
  52946. }
  52947. }
  52948. },
  52949. createHandler : function(action, method){
  52950. var me = this,
  52951. handler;
  52952. if (!method.formHandler) {
  52953. handler = function(){
  52954. me.configureRequest(action, method, Array.prototype.slice.call(arguments, 0));
  52955. };
  52956. } else {
  52957. handler = function(form, callback, scope){
  52958. me.configureFormRequest(action, method, form, callback, scope);
  52959. };
  52960. }
  52961. handler.directCfg = {
  52962. action: action,
  52963. method: method
  52964. };
  52965. return handler;
  52966. },
  52967. isConnected: function(){
  52968. return !!this.connected;
  52969. },
  52970. connect: function(){
  52971. var me = this;
  52972. if (me.url) {
  52973. me.initAPI();
  52974. me.connected = true;
  52975. me.fireEvent('connect', me);
  52976. } else if(!me.url) {
  52977. }
  52978. },
  52979. disconnect: function(){
  52980. var me = this;
  52981. if (me.connected) {
  52982. me.connected = false;
  52983. me.fireEvent('disconnect', me);
  52984. }
  52985. },
  52986. runCallback: function(transaction, event){
  52987. var success = !!event.status,
  52988. funcName = success ? 'success' : 'failure',
  52989. callback,
  52990. result;
  52991. if (transaction && transaction.callback) {
  52992. callback = transaction.callback;
  52993. result = Ext.isDefined(event.result) ? event.result : event.data;
  52994. if (Ext.isFunction(callback)) {
  52995. callback(result, event, success);
  52996. } else {
  52997. Ext.callback(callback[funcName], callback.scope, [result, event, success]);
  52998. Ext.callback(callback.callback, callback.scope, [result, event, success]);
  52999. }
  53000. }
  53001. },
  53002. onData: function(options, success, response){
  53003. var me = this,
  53004. i = 0,
  53005. len,
  53006. events,
  53007. event,
  53008. transaction,
  53009. transactions;
  53010. if (success) {
  53011. events = me.createEvents(response);
  53012. for (len = events.length; i < len; ++i) {
  53013. event = events[i];
  53014. transaction = me.getTransaction(event);
  53015. me.fireEvent('data', me, event);
  53016. if (transaction) {
  53017. me.runCallback(transaction, event, true);
  53018. Ext.direct.Manager.removeTransaction(transaction);
  53019. }
  53020. }
  53021. } else {
  53022. transactions = [].concat(options.transaction);
  53023. for (len = transactions.length; i < len; ++i) {
  53024. transaction = me.getTransaction(transactions[i]);
  53025. if (transaction && transaction.retryCount < me.maxRetries) {
  53026. transaction.retry();
  53027. } else {
  53028. event = new Ext.direct.ExceptionEvent({
  53029. data: null,
  53030. transaction: transaction,
  53031. code: Ext.direct.Manager.exceptions.TRANSPORT,
  53032. message: 'Unable to connect to the server.',
  53033. xhr: response
  53034. });
  53035. me.fireEvent('data', me, event);
  53036. if (transaction) {
  53037. me.runCallback(transaction, event, false);
  53038. Ext.direct.Manager.removeTransaction(transaction);
  53039. }
  53040. }
  53041. }
  53042. }
  53043. },
  53044. getTransaction: function(options){
  53045. return options && options.tid ? Ext.direct.Manager.getTransaction(options.tid) : null;
  53046. },
  53047. configureRequest: function(action, method, args){
  53048. var me = this,
  53049. callData = method.getCallData(args),
  53050. data = callData.data,
  53051. callback = callData.callback,
  53052. scope = callData.scope,
  53053. transaction;
  53054. transaction = new Ext.direct.Transaction({
  53055. provider: me,
  53056. args: args,
  53057. action: action,
  53058. method: method.name,
  53059. data: data,
  53060. callback: scope && Ext.isFunction(callback) ? Ext.Function.bind(callback, scope) : callback
  53061. });
  53062. if (me.fireEvent('beforecall', me, transaction, method) !== false) {
  53063. Ext.direct.Manager.addTransaction(transaction);
  53064. me.queueTransaction(transaction);
  53065. me.fireEvent('call', me, transaction, method);
  53066. }
  53067. },
  53068. getCallData: function(transaction){
  53069. return {
  53070. action: transaction.action,
  53071. method: transaction.method,
  53072. data: transaction.data,
  53073. type: 'rpc',
  53074. tid: transaction.id
  53075. };
  53076. },
  53077. sendRequest : function(data){
  53078. var me = this,
  53079. request = {
  53080. url: me.url,
  53081. callback: me.onData,
  53082. scope: me,
  53083. transaction: data,
  53084. timeout: me.timeout
  53085. }, callData,
  53086. enableUrlEncode = me.enableUrlEncode,
  53087. i = 0,
  53088. len,
  53089. params;
  53090. if (Ext.isArray(data)) {
  53091. callData = [];
  53092. for (len = data.length; i < len; ++i) {
  53093. callData.push(me.getCallData(data[i]));
  53094. }
  53095. } else {
  53096. callData = me.getCallData(data);
  53097. }
  53098. if (enableUrlEncode) {
  53099. params = {};
  53100. params[Ext.isString(enableUrlEncode) ? enableUrlEncode : 'data'] = Ext.encode(callData);
  53101. request.params = params;
  53102. } else {
  53103. request.jsonData = callData;
  53104. }
  53105. Ext.Ajax.request(request);
  53106. },
  53107. queueTransaction: function(transaction){
  53108. var me = this,
  53109. enableBuffer = me.enableBuffer;
  53110. if (transaction.form) {
  53111. me.sendFormRequest(transaction);
  53112. return;
  53113. }
  53114. me.callBuffer.push(transaction);
  53115. if (enableBuffer) {
  53116. if (!me.callTask) {
  53117. me.callTask = new Ext.util.DelayedTask(me.combineAndSend, me);
  53118. }
  53119. me.callTask.delay(Ext.isNumber(enableBuffer) ? enableBuffer : 10);
  53120. } else {
  53121. me.combineAndSend();
  53122. }
  53123. },
  53124. combineAndSend : function(){
  53125. var buffer = this.callBuffer,
  53126. len = buffer.length;
  53127. if (len > 0) {
  53128. this.sendRequest(len == 1 ? buffer[0] : buffer);
  53129. this.callBuffer = [];
  53130. }
  53131. },
  53132. configureFormRequest : function(action, method, form, callback, scope){
  53133. var me = this,
  53134. transaction = new Ext.direct.Transaction({
  53135. provider: me,
  53136. action: action,
  53137. method: method.name,
  53138. args: [form, callback, scope],
  53139. callback: scope && Ext.isFunction(callback) ? Ext.Function.bind(callback, scope) : callback,
  53140. isForm: true
  53141. }),
  53142. isUpload,
  53143. params;
  53144. if (me.fireEvent('beforecall', me, transaction, method) !== false) {
  53145. Ext.direct.Manager.addTransaction(transaction);
  53146. isUpload = String(form.getAttribute("enctype")).toLowerCase() == 'multipart/form-data';
  53147. params = {
  53148. extTID: transaction.id,
  53149. extAction: action,
  53150. extMethod: method.name,
  53151. extType: 'rpc',
  53152. extUpload: String(isUpload)
  53153. };
  53154. Ext.apply(transaction, {
  53155. form: Ext.getDom(form),
  53156. isUpload: isUpload,
  53157. params: callback && Ext.isObject(callback.params) ? Ext.apply(params, callback.params) : params
  53158. });
  53159. me.fireEvent('call', me, transaction, method);
  53160. me.sendFormRequest(transaction);
  53161. }
  53162. },
  53163. sendFormRequest: function(transaction){
  53164. Ext.Ajax.request({
  53165. url: this.url,
  53166. params: transaction.params,
  53167. callback: this.onData,
  53168. scope: this,
  53169. form: transaction.form,
  53170. isUpload: transaction.isUpload,
  53171. transaction: transaction
  53172. });
  53173. }
  53174. });
  53175. Ext.define('Ext.draw.Matrix', {
  53176. requires: ['Ext.draw.Draw'],
  53177. constructor: function(a, b, c, d, e, f) {
  53178. if (a != null) {
  53179. this.matrix = [[a, c, e], [b, d, f], [0, 0, 1]];
  53180. }
  53181. else {
  53182. this.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
  53183. }
  53184. },
  53185. add: function(a, b, c, d, e, f) {
  53186. var me = this,
  53187. out = [[], [], []],
  53188. matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
  53189. x,
  53190. y,
  53191. z,
  53192. res;
  53193. for (x = 0; x < 3; x++) {
  53194. for (y = 0; y < 3; y++) {
  53195. res = 0;
  53196. for (z = 0; z < 3; z++) {
  53197. res += me.matrix[x][z] * matrix[z][y];
  53198. }
  53199. out[x][y] = res;
  53200. }
  53201. }
  53202. me.matrix = out;
  53203. },
  53204. prepend: function(a, b, c, d, e, f) {
  53205. var me = this,
  53206. out = [[], [], []],
  53207. matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
  53208. x,
  53209. y,
  53210. z,
  53211. res;
  53212. for (x = 0; x < 3; x++) {
  53213. for (y = 0; y < 3; y++) {
  53214. res = 0;
  53215. for (z = 0; z < 3; z++) {
  53216. res += matrix[x][z] * me.matrix[z][y];
  53217. }
  53218. out[x][y] = res;
  53219. }
  53220. }
  53221. me.matrix = out;
  53222. },
  53223. invert: function() {
  53224. var matrix = this.matrix,
  53225. a = matrix[0][0],
  53226. b = matrix[1][0],
  53227. c = matrix[0][1],
  53228. d = matrix[1][1],
  53229. e = matrix[0][2],
  53230. f = matrix[1][2],
  53231. x = a * d - b * c;
  53232. return new Ext.draw.Matrix(d / x, -b / x, -c / x, a / x, (c * f - d * e) / x, (b * e - a * f) / x);
  53233. },
  53234. clone: function() {
  53235. var matrix = this.matrix,
  53236. a = matrix[0][0],
  53237. b = matrix[1][0],
  53238. c = matrix[0][1],
  53239. d = matrix[1][1],
  53240. e = matrix[0][2],
  53241. f = matrix[1][2];
  53242. return new Ext.draw.Matrix(a, b, c, d, e, f);
  53243. },
  53244. translate: function(x, y) {
  53245. this.prepend(1, 0, 0, 1, x, y);
  53246. },
  53247. scale: function(x, y, cx, cy) {
  53248. var me = this;
  53249. if (y == null) {
  53250. y = x;
  53251. }
  53252. me.add(x, 0, 0, y, cx * (1 - x), cy * (1 - y));
  53253. },
  53254. rotate: function(a, x, y) {
  53255. a = Ext.draw.Draw.rad(a);
  53256. var me = this,
  53257. cos = +Math.cos(a).toFixed(9),
  53258. sin = +Math.sin(a).toFixed(9);
  53259. me.add(cos, sin, -sin, cos, x - cos * x + sin * y, -(sin * x) + y - cos * y);
  53260. },
  53261. x: function(x, y) {
  53262. var matrix = this.matrix;
  53263. return x * matrix[0][0] + y * matrix[0][1] + matrix[0][2];
  53264. },
  53265. y: function(x, y) {
  53266. var matrix = this.matrix;
  53267. return x * matrix[1][0] + y * matrix[1][1] + matrix[1][2];
  53268. },
  53269. get: function(i, j) {
  53270. return + this.matrix[i][j].toFixed(4);
  53271. },
  53272. toString: function() {
  53273. var me = this;
  53274. return [me.get(0, 0), me.get(0, 1), me.get(1, 0), me.get(1, 1), 0, 0].join();
  53275. },
  53276. toSvg: function() {
  53277. var me = this;
  53278. return "matrix(" + [me.get(0, 0), me.get(1, 0), me.get(0, 1), me.get(1, 1), me.get(0, 2), me.get(1, 2)].join() + ")";
  53279. },
  53280. toFilter: function(dx, dy) {
  53281. var me = this;
  53282. dx = dx || 0;
  53283. dy = dy || 0;
  53284. return "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', filterType='bilinear', M11=" + me.get(0, 0) +
  53285. ", M12=" + me.get(0, 1) + ", M21=" + me.get(1, 0) + ", M22=" + me.get(1, 1) +
  53286. ", Dx=" + (me.get(0, 2) + dx) + ", Dy=" + (me.get(1, 2) + dy) + ")";
  53287. },
  53288. offset: function() {
  53289. var matrix = this.matrix;
  53290. return [(matrix[0][2] || 0).toFixed(4), (matrix[1][2] || 0).toFixed(4)];
  53291. },
  53292. split: function () {
  53293. function norm(a) {
  53294. return a[0] * a[0] + a[1] * a[1];
  53295. }
  53296. function normalize(a) {
  53297. var mag = Math.sqrt(norm(a));
  53298. a[0] /= mag;
  53299. a[1] /= mag;
  53300. }
  53301. var matrix = this.matrix,
  53302. out = {
  53303. translateX: matrix[0][2],
  53304. translateY: matrix[1][2]
  53305. },
  53306. row;
  53307. row = [[matrix[0][0], matrix[0][1]], [matrix[1][1], matrix[1][1]]];
  53308. out.scaleX = Math.sqrt(norm(row[0]));
  53309. normalize(row[0]);
  53310. out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];
  53311. row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];
  53312. out.scaleY = Math.sqrt(norm(row[1]));
  53313. normalize(row[1]);
  53314. out.shear /= out.scaleY;
  53315. out.rotate = Math.asin(-row[0][1]);
  53316. out.isSimple = !+out.shear.toFixed(9) && (out.scaleX.toFixed(9) == out.scaleY.toFixed(9) || !out.rotate);
  53317. return out;
  53318. }
  53319. });
  53320. Ext.define('Ext.draw.SpriteDD', {
  53321. extend: 'Ext.dd.DragSource',
  53322. constructor : function(sprite, cfg){
  53323. var me = this,
  53324. el = sprite.el;
  53325. me.sprite = sprite;
  53326. me.el = el;
  53327. me.dragData = {el: el, sprite: sprite};
  53328. me.callParent([el, cfg]);
  53329. me.sprite.setStyle('cursor', 'move');
  53330. },
  53331. showFrame: Ext.emptyFn,
  53332. createFrame : Ext.emptyFn,
  53333. getDragEl : function(e){
  53334. return this.el;
  53335. },
  53336. getRegion: function() {
  53337. var me = this,
  53338. el = me.el,
  53339. pos, x1, x2, y1, y2, t, r, b, l, bbox, sprite;
  53340. sprite = me.sprite;
  53341. bbox = sprite.getBBox();
  53342. try {
  53343. pos = Ext.Element.getXY(el);
  53344. } catch (e) { }
  53345. if (!pos) {
  53346. return null;
  53347. }
  53348. x1 = pos[0];
  53349. x2 = x1 + bbox.width;
  53350. y1 = pos[1];
  53351. y2 = y1 + bbox.height;
  53352. return new Ext.util.Region(y1, x2, y2, x1);
  53353. },
  53354. startDrag: function(x, y) {
  53355. var me = this,
  53356. attr = me.sprite.attr;
  53357. me.prev = me.sprite.surface.transformToViewBox(x, y);
  53358. },
  53359. onDrag: function(e) {
  53360. var xy = e.getXY(),
  53361. me = this,
  53362. sprite = me.sprite,
  53363. attr = sprite.attr, dx, dy;
  53364. xy = me.sprite.surface.transformToViewBox(xy[0], xy[1]);
  53365. dx = xy[0] - me.prev[0];
  53366. dy = xy[1] - me.prev[1];
  53367. sprite.setAttributes({
  53368. translate: {
  53369. x: attr.translation.x + dx,
  53370. y: attr.translation.y + dy
  53371. }
  53372. }, true);
  53373. me.prev = xy;
  53374. },
  53375. setDragElPos: function () {
  53376. return false;
  53377. }
  53378. });
  53379. Ext.define('Ext.draw.Sprite', {
  53380. mixins: {
  53381. observable: 'Ext.util.Observable',
  53382. animate: 'Ext.util.Animate'
  53383. },
  53384. requires: ['Ext.draw.SpriteDD'],
  53385. dirty: false,
  53386. dirtyHidden: false,
  53387. dirtyTransform: false,
  53388. dirtyPath: true,
  53389. dirtyFont: true,
  53390. zIndexDirty: true,
  53391. isSprite: true,
  53392. zIndex: 0,
  53393. fontProperties: [
  53394. 'font',
  53395. 'font-size',
  53396. 'font-weight',
  53397. 'font-style',
  53398. 'font-family',
  53399. 'text-anchor',
  53400. 'text'
  53401. ],
  53402. pathProperties: [
  53403. 'x',
  53404. 'y',
  53405. 'd',
  53406. 'path',
  53407. 'height',
  53408. 'width',
  53409. 'radius',
  53410. 'r',
  53411. 'rx',
  53412. 'ry',
  53413. 'cx',
  53414. 'cy'
  53415. ],
  53416. constructor: function(config) {
  53417. var me = this;
  53418. config = Ext.merge({}, config || {});
  53419. me.id = Ext.id(null, 'ext-sprite-');
  53420. me.transformations = [];
  53421. Ext.copyTo(this, config, 'surface,group,type,draggable');
  53422. me.bbox = {};
  53423. me.attr = {
  53424. zIndex: 0,
  53425. translation: {
  53426. x: null,
  53427. y: null
  53428. },
  53429. rotation: {
  53430. degrees: null,
  53431. x: null,
  53432. y: null
  53433. },
  53434. scaling: {
  53435. x: null,
  53436. y: null,
  53437. cx: null,
  53438. cy: null
  53439. }
  53440. };
  53441. delete config.surface;
  53442. delete config.group;
  53443. delete config.type;
  53444. delete config.draggable;
  53445. me.setAttributes(config);
  53446. me.addEvents(
  53447. 'beforedestroy',
  53448. 'destroy',
  53449. 'render',
  53450. 'mousedown',
  53451. 'mouseup',
  53452. 'mouseover',
  53453. 'mouseout',
  53454. 'mousemove',
  53455. 'click'
  53456. );
  53457. me.mixins.observable.constructor.apply(this, arguments);
  53458. },
  53459. initDraggable: function() {
  53460. var me = this;
  53461. me.draggable = true;
  53462. if (!me.el) {
  53463. me.surface.createSpriteElement(me);
  53464. }
  53465. me.dd = new Ext.draw.SpriteDD(me, Ext.isBoolean(me.draggable) ? null : me.draggable);
  53466. me.on('beforedestroy', me.dd.destroy, me.dd);
  53467. },
  53468. setAttributes: function(attrs, redraw) {
  53469. var me = this,
  53470. fontProps = me.fontProperties,
  53471. fontPropsLength = fontProps.length,
  53472. pathProps = me.pathProperties,
  53473. pathPropsLength = pathProps.length,
  53474. hasSurface = !!me.surface,
  53475. custom = hasSurface && me.surface.customAttributes || {},
  53476. spriteAttrs = me.attr,
  53477. dirtyBBox = false,
  53478. attr, i, newTranslation, translation, newRotate, rotation, newScaling, scaling;
  53479. attrs = Ext.apply({}, attrs);
  53480. for (attr in custom) {
  53481. if (attrs.hasOwnProperty(attr) && typeof custom[attr] == "function") {
  53482. Ext.apply(attrs, custom[attr].apply(me, [].concat(attrs[attr])));
  53483. }
  53484. }
  53485. if (!!attrs.hidden !== !!spriteAttrs.hidden) {
  53486. me.dirtyHidden = true;
  53487. }
  53488. for (i = 0; i < pathPropsLength; i++) {
  53489. attr = pathProps[i];
  53490. if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
  53491. me.dirtyPath = true;
  53492. dirtyBBox = true;
  53493. break;
  53494. }
  53495. }
  53496. if ('zIndex' in attrs) {
  53497. me.zIndexDirty = true;
  53498. }
  53499. if ('text' in attrs) {
  53500. me.dirtyFont = true;
  53501. dirtyBBox = true;
  53502. }
  53503. for (i = 0; i < fontPropsLength; i++) {
  53504. attr = fontProps[i];
  53505. if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
  53506. me.dirtyFont = true;
  53507. dirtyBBox = true;
  53508. break;
  53509. }
  53510. }
  53511. newTranslation = attrs.translation || attrs.translate;
  53512. delete attrs.translate;
  53513. delete attrs.translation;
  53514. translation = spriteAttrs.translation;
  53515. if (newTranslation) {
  53516. if (('x' in newTranslation && newTranslation.x !== translation.x) ||
  53517. ('y' in newTranslation && newTranslation.y !== translation.y)) {
  53518. me.dirtyTransform = true;
  53519. translation.x = newTranslation.x;
  53520. translation.y = newTranslation.y;
  53521. }
  53522. }
  53523. newRotate = attrs.rotation || attrs.rotate;
  53524. rotation = spriteAttrs.rotation;
  53525. delete attrs.rotate;
  53526. delete attrs.rotation;
  53527. if (newRotate) {
  53528. if (('x' in newRotate && newRotate.x !== rotation.x) ||
  53529. ('y' in newRotate && newRotate.y !== rotation.y) ||
  53530. ('degrees' in newRotate && newRotate.degrees !== rotation.degrees)) {
  53531. me.dirtyTransform = true;
  53532. rotation.x = newRotate.x;
  53533. rotation.y = newRotate.y;
  53534. rotation.degrees = newRotate.degrees;
  53535. }
  53536. }
  53537. newScaling = attrs.scaling || attrs.scale;
  53538. scaling = spriteAttrs.scaling;
  53539. delete attrs.scale;
  53540. delete attrs.scaling;
  53541. if (newScaling) {
  53542. if (('x' in newScaling && newScaling.x !== scaling.x) ||
  53543. ('y' in newScaling && newScaling.y !== scaling.y) ||
  53544. ('cx' in newScaling && newScaling.cx !== scaling.cx) ||
  53545. ('cy' in newScaling && newScaling.cy !== scaling.cy)) {
  53546. me.dirtyTransform = true;
  53547. scaling.x = newScaling.x;
  53548. scaling.y = newScaling.y;
  53549. scaling.cx = newScaling.cx;
  53550. scaling.cy = newScaling.cy;
  53551. }
  53552. }
  53553. if (!me.dirtyTransform && dirtyBBox) {
  53554. if (spriteAttrs.scaling.x === null ||
  53555. spriteAttrs.scaling.y === null ||
  53556. spriteAttrs.rotation.y === null ||
  53557. spriteAttrs.rotation.y === null) {
  53558. me.dirtyTransform = true;
  53559. }
  53560. }
  53561. Ext.apply(spriteAttrs, attrs);
  53562. me.dirty = true;
  53563. if (redraw === true && hasSurface) {
  53564. me.redraw();
  53565. }
  53566. return this;
  53567. },
  53568. getBBox: function() {
  53569. return this.surface.getBBox(this);
  53570. },
  53571. setText: function(text) {
  53572. return this.surface.setText(this, text);
  53573. },
  53574. hide: function(redraw) {
  53575. this.setAttributes({
  53576. hidden: true
  53577. }, redraw);
  53578. return this;
  53579. },
  53580. show: function(redraw) {
  53581. this.setAttributes({
  53582. hidden: false
  53583. }, redraw);
  53584. return this;
  53585. },
  53586. remove: function() {
  53587. if (this.surface) {
  53588. this.surface.remove(this);
  53589. return true;
  53590. }
  53591. return false;
  53592. },
  53593. onRemove: function() {
  53594. this.surface.onRemove(this);
  53595. },
  53596. destroy: function() {
  53597. var me = this;
  53598. if (me.fireEvent('beforedestroy', me) !== false) {
  53599. me.remove();
  53600. me.surface.onDestroy(me);
  53601. me.clearListeners();
  53602. me.fireEvent('destroy');
  53603. }
  53604. },
  53605. redraw: function() {
  53606. this.surface.renderItem(this);
  53607. return this;
  53608. },
  53609. setStyle: function() {
  53610. this.el.setStyle.apply(this.el, arguments);
  53611. return this;
  53612. },
  53613. addCls: function(obj) {
  53614. this.surface.addCls(this, obj);
  53615. return this;
  53616. },
  53617. removeCls: function(obj) {
  53618. this.surface.removeCls(this, obj);
  53619. return this;
  53620. }
  53621. });
  53622. Ext.define('Ext.draw.Text', {
  53623. extend: 'Ext.draw.Component',
  53624. uses: ['Ext.util.CSS'],
  53625. alias: 'widget.text',
  53626. text: '',
  53627. focusable: false,
  53628. viewBox: false,
  53629. autoSize: true,
  53630. baseCls: Ext.baseCSSPrefix + 'surface ' + Ext.baseCSSPrefix + 'draw-text',
  53631. initComponent: function() {
  53632. var me = this;
  53633. me.textConfig = Ext.apply({
  53634. type: 'text',
  53635. text: me.text,
  53636. rotate: {
  53637. degrees: me.degrees || 0
  53638. }
  53639. }, me.textStyle);
  53640. Ext.apply(me.textConfig, me.getStyles(me.styleSelectors || me.styleSelector));
  53641. me.initialConfig.items = [me.textConfig];
  53642. me.callParent(arguments);
  53643. },
  53644. getStyles: function(selectors) {
  53645. selectors = Ext.Array.from(selectors);
  53646. var i = 0,
  53647. len = selectors.length,
  53648. rule,
  53649. style,
  53650. prop,
  53651. result = {};
  53652. for (; i < len; i++) {
  53653. rule = Ext.util.CSS.getRule(selectors[i]);
  53654. if (rule) {
  53655. style = rule.style;
  53656. if (style) {
  53657. Ext.apply(result, {
  53658. 'font-family': style.fontFamily,
  53659. 'font-weight': style.fontWeight,
  53660. 'line-height': style.lineHeight,
  53661. 'font-size': style.fontSize,
  53662. fill: style.color
  53663. });
  53664. }
  53665. }
  53666. }
  53667. return result;
  53668. },
  53669. setAngle: function(degrees) {
  53670. var me = this,
  53671. surface,
  53672. sprite;
  53673. if (me.rendered) {
  53674. surface = me.surface;
  53675. sprite = surface.items.items[0];
  53676. me.degrees = degrees;
  53677. sprite.setAttributes({
  53678. rotate: {
  53679. degrees: degrees
  53680. }
  53681. }, true);
  53682. if (me.autoSize || me.viewBox) {
  53683. me.updateLayout();
  53684. }
  53685. } else {
  53686. me.degrees = degrees;
  53687. }
  53688. },
  53689. setText: function(text) {
  53690. var me = this,
  53691. surface,
  53692. sprite;
  53693. if (me.rendered) {
  53694. surface = me.surface;
  53695. sprite = surface.items.items[0];
  53696. me.text = text || '';
  53697. surface.remove(sprite);
  53698. me.textConfig.type = 'text';
  53699. me.textConfig.text = me.text;
  53700. sprite = surface.add(me.textConfig);
  53701. sprite.setAttributes({
  53702. rotate: {
  53703. degrees: me.degrees
  53704. }
  53705. }, true);
  53706. if (me.autoSize || me.viewBox) {
  53707. me.updateLayout();
  53708. }
  53709. } else {
  53710. me.on({
  53711. render: function() {
  53712. me.setText(text);
  53713. },
  53714. single: true
  53715. });
  53716. }
  53717. }
  53718. });
  53719. Ext.define('Ext.draw.engine.ImageExporter', {
  53720. singleton: true,
  53721. defaultUrl: 'http://svg.sencha.io',
  53722. supportedTypes: ['image/png', 'image/jpeg'],
  53723. widthParam: 'width',
  53724. heightParam: 'height',
  53725. typeParam: 'type',
  53726. svgParam: 'svg',
  53727. formCls: Ext.baseCSSPrefix + 'hide-display',
  53728. generate: function(surface, config) {
  53729. config = config || {};
  53730. var me = this,
  53731. type = config.type,
  53732. form;
  53733. if (Ext.Array.indexOf(me.supportedTypes, type) === -1) {
  53734. return false;
  53735. }
  53736. form = Ext.getBody().createChild({
  53737. tag: 'form',
  53738. method: 'POST',
  53739. action: config.url || me.defaultUrl,
  53740. cls: me.formCls,
  53741. children: [{
  53742. tag: 'input',
  53743. type: 'hidden',
  53744. name: config.widthParam || me.widthParam,
  53745. value: config.width || surface.width
  53746. }, {
  53747. tag: 'input',
  53748. type: 'hidden',
  53749. name: config.heightParam || me.heightParam,
  53750. value: config.height || surface.height
  53751. }, {
  53752. tag: 'input',
  53753. type: 'hidden',
  53754. name: config.typeParam || me.typeParam,
  53755. value: type
  53756. }, {
  53757. tag: 'input',
  53758. type: 'hidden',
  53759. name: config.svgParam || me.svgParam
  53760. }]
  53761. });
  53762. form.last(null, true).value = Ext.draw.engine.SvgExporter.generate(surface);
  53763. form.dom.submit();
  53764. form.remove();
  53765. return true;
  53766. }
  53767. });
  53768. Ext.define('Ext.draw.engine.Svg', {
  53769. extend: 'Ext.draw.Surface',
  53770. requires: ['Ext.draw.Draw', 'Ext.draw.Sprite', 'Ext.draw.Matrix', 'Ext.Element'],
  53771. engine: 'Svg',
  53772. trimRe: /^\s+|\s+$/g,
  53773. spacesRe: /\s+/,
  53774. xlink: "http:/" + "/www.w3.org/1999/xlink",
  53775. translateAttrs: {
  53776. radius: "r",
  53777. radiusX: "rx",
  53778. radiusY: "ry",
  53779. path: "d",
  53780. lineWidth: "stroke-width",
  53781. fillOpacity: "fill-opacity",
  53782. strokeOpacity: "stroke-opacity",
  53783. strokeLinejoin: "stroke-linejoin"
  53784. },
  53785. parsers: {},
  53786. minDefaults: {
  53787. circle: {
  53788. cx: 0,
  53789. cy: 0,
  53790. r: 0,
  53791. fill: "none",
  53792. stroke: null,
  53793. "stroke-width": null,
  53794. opacity: null,
  53795. "fill-opacity": null,
  53796. "stroke-opacity": null
  53797. },
  53798. ellipse: {
  53799. cx: 0,
  53800. cy: 0,
  53801. rx: 0,
  53802. ry: 0,
  53803. fill: "none",
  53804. stroke: null,
  53805. "stroke-width": null,
  53806. opacity: null,
  53807. "fill-opacity": null,
  53808. "stroke-opacity": null
  53809. },
  53810. rect: {
  53811. x: 0,
  53812. y: 0,
  53813. width: 0,
  53814. height: 0,
  53815. rx: 0,
  53816. ry: 0,
  53817. fill: "none",
  53818. stroke: null,
  53819. "stroke-width": null,
  53820. opacity: null,
  53821. "fill-opacity": null,
  53822. "stroke-opacity": null
  53823. },
  53824. text: {
  53825. x: 0,
  53826. y: 0,
  53827. "text-anchor": "start",
  53828. "font-family": null,
  53829. "font-size": null,
  53830. "font-weight": null,
  53831. "font-style": null,
  53832. fill: "#000",
  53833. stroke: null,
  53834. "stroke-width": null,
  53835. opacity: null,
  53836. "fill-opacity": null,
  53837. "stroke-opacity": null
  53838. },
  53839. path: {
  53840. d: "M0,0",
  53841. fill: "none",
  53842. stroke: null,
  53843. "stroke-width": null,
  53844. opacity: null,
  53845. "fill-opacity": null,
  53846. "stroke-opacity": null
  53847. },
  53848. image: {
  53849. x: 0,
  53850. y: 0,
  53851. width: 0,
  53852. height: 0,
  53853. preserveAspectRatio: "none",
  53854. opacity: null
  53855. }
  53856. },
  53857. createSvgElement: function(type, attrs) {
  53858. var el = this.domRef.createElementNS("http:/" + "/www.w3.org/2000/svg", type),
  53859. key;
  53860. if (attrs) {
  53861. for (key in attrs) {
  53862. el.setAttribute(key, String(attrs[key]));
  53863. }
  53864. }
  53865. return el;
  53866. },
  53867. createSpriteElement: function(sprite) {
  53868. var el = this.createSvgElement(sprite.type);
  53869. el.id = sprite.id;
  53870. if (el.style) {
  53871. el.style.webkitTapHighlightColor = "rgba(0,0,0,0)";
  53872. }
  53873. sprite.el = Ext.get(el);
  53874. this.applyZIndex(sprite);
  53875. sprite.matrix = new Ext.draw.Matrix();
  53876. sprite.bbox = {
  53877. plain: 0,
  53878. transform: 0
  53879. };
  53880. this.applyAttrs(sprite);
  53881. this.applyTransformations(sprite);
  53882. sprite.fireEvent("render", sprite);
  53883. return el;
  53884. },
  53885. getBBoxText: function (sprite) {
  53886. var bbox = {},
  53887. bb, height, width, i, ln, el;
  53888. if (sprite && sprite.el) {
  53889. el = sprite.el.dom;
  53890. try {
  53891. bbox = el.getBBox();
  53892. return bbox;
  53893. } catch(e) {
  53894. }
  53895. bbox = {x: bbox.x, y: Infinity, width: 0, height: 0};
  53896. ln = el.getNumberOfChars();
  53897. for (i = 0; i < ln; i++) {
  53898. bb = el.getExtentOfChar(i);
  53899. bbox.y = Math.min(bb.y, bbox.y);
  53900. height = bb.y + bb.height - bbox.y;
  53901. bbox.height = Math.max(bbox.height, height);
  53902. width = bb.x + bb.width - bbox.x;
  53903. bbox.width = Math.max(bbox.width, width);
  53904. }
  53905. return bbox;
  53906. }
  53907. },
  53908. hide: function() {
  53909. Ext.get(this.el).hide();
  53910. },
  53911. show: function() {
  53912. Ext.get(this.el).show();
  53913. },
  53914. hidePrim: function(sprite) {
  53915. this.addCls(sprite, Ext.baseCSSPrefix + 'hide-visibility');
  53916. },
  53917. showPrim: function(sprite) {
  53918. this.removeCls(sprite, Ext.baseCSSPrefix + 'hide-visibility');
  53919. },
  53920. getDefs: function() {
  53921. return this._defs || (this._defs = this.createSvgElement("defs"));
  53922. },
  53923. transform: function(sprite, matrixOnly) {
  53924. var me = this,
  53925. matrix = new Ext.draw.Matrix(),
  53926. transforms = sprite.transformations,
  53927. transformsLength = transforms.length,
  53928. i = 0,
  53929. transform, type;
  53930. for (; i < transformsLength; i++) {
  53931. transform = transforms[i];
  53932. type = transform.type;
  53933. if (type == "translate") {
  53934. matrix.translate(transform.x, transform.y);
  53935. }
  53936. else if (type == "rotate") {
  53937. matrix.rotate(transform.degrees, transform.x, transform.y);
  53938. }
  53939. else if (type == "scale") {
  53940. matrix.scale(transform.x, transform.y, transform.centerX, transform.centerY);
  53941. }
  53942. }
  53943. sprite.matrix = matrix;
  53944. if (!matrixOnly) {
  53945. sprite.el.set({transform: matrix.toSvg()});
  53946. }
  53947. },
  53948. setSize: function(width, height) {
  53949. var me = this,
  53950. el = me.el;
  53951. width = +width || me.width;
  53952. height = +height || me.height;
  53953. me.width = width;
  53954. me.height = height;
  53955. el.setSize(width, height);
  53956. el.set({
  53957. width: width,
  53958. height: height
  53959. });
  53960. me.callParent([width, height]);
  53961. },
  53962. getRegion: function() {
  53963. var svgXY = this.el.getXY(),
  53964. rectXY = this.bgRect.getXY(),
  53965. max = Math.max,
  53966. x = max(svgXY[0], rectXY[0]),
  53967. y = max(svgXY[1], rectXY[1]);
  53968. return {
  53969. left: x,
  53970. top: y,
  53971. right: x + this.width,
  53972. bottom: y + this.height
  53973. };
  53974. },
  53975. onRemove: function(sprite) {
  53976. if (sprite.el) {
  53977. sprite.el.destroy();
  53978. delete sprite.el;
  53979. }
  53980. this.callParent(arguments);
  53981. },
  53982. setViewBox: function(x, y, width, height) {
  53983. if (isFinite(x) && isFinite(y) && isFinite(width) && isFinite(height)) {
  53984. this.callParent(arguments);
  53985. this.el.dom.setAttribute("viewBox", [x, y, width, height].join(" "));
  53986. }
  53987. },
  53988. render: function (container) {
  53989. var me = this,
  53990. width,
  53991. height,
  53992. el,
  53993. defs,
  53994. bgRect,
  53995. webkitRect;
  53996. if (!me.el) {
  53997. width = me.width || 0;
  53998. height = me.height || 0;
  53999. el = me.createSvgElement('svg', {
  54000. xmlns: "http:/" + "/www.w3.org/2000/svg",
  54001. version: 1.1,
  54002. width: width,
  54003. height: height
  54004. });
  54005. defs = me.getDefs();
  54006. bgRect = me.createSvgElement("rect", {
  54007. width: "100%",
  54008. height: "100%",
  54009. fill: "#000",
  54010. stroke: "none",
  54011. opacity: 0
  54012. });
  54013. if (Ext.isSafari3) {
  54014. webkitRect = me.createSvgElement("rect", {
  54015. x: -10,
  54016. y: -10,
  54017. width: "110%",
  54018. height: "110%",
  54019. fill: "none",
  54020. stroke: "#000"
  54021. });
  54022. }
  54023. el.appendChild(defs);
  54024. if (Ext.isSafari3) {
  54025. el.appendChild(webkitRect);
  54026. }
  54027. el.appendChild(bgRect);
  54028. container.appendChild(el);
  54029. me.el = Ext.get(el);
  54030. me.bgRect = Ext.get(bgRect);
  54031. if (Ext.isSafari3) {
  54032. me.webkitRect = Ext.get(webkitRect);
  54033. me.webkitRect.hide();
  54034. }
  54035. me.el.on({
  54036. scope: me,
  54037. mouseup: me.onMouseUp,
  54038. mousedown: me.onMouseDown,
  54039. mouseover: me.onMouseOver,
  54040. mouseout: me.onMouseOut,
  54041. mousemove: me.onMouseMove,
  54042. mouseenter: me.onMouseEnter,
  54043. mouseleave: me.onMouseLeave,
  54044. click: me.onClick,
  54045. dblclick: me.onDblClick
  54046. });
  54047. }
  54048. me.renderAll();
  54049. },
  54050. onMouseEnter: function(e) {
  54051. if (this.el.parent().getRegion().contains(e.getPoint())) {
  54052. this.fireEvent('mouseenter', e);
  54053. }
  54054. },
  54055. onMouseLeave: function(e) {
  54056. if (!this.el.parent().getRegion().contains(e.getPoint())) {
  54057. this.fireEvent('mouseleave', e);
  54058. }
  54059. },
  54060. processEvent: function(name, e) {
  54061. var target = e.getTarget(),
  54062. surface = this.surface,
  54063. sprite;
  54064. this.fireEvent(name, e);
  54065. if (target.nodeName == "tspan" && target.parentNode) {
  54066. target = target.parentNode;
  54067. }
  54068. sprite = this.items.get(target.id);
  54069. if (sprite) {
  54070. sprite.fireEvent(name, sprite, e);
  54071. }
  54072. },
  54073. tuneText: function (sprite, attrs) {
  54074. var el = sprite.el.dom,
  54075. tspans = [],
  54076. height, tspan, text, i, ln, texts, factor, x;
  54077. if (attrs.hasOwnProperty("text")) {
  54078. text = sprite.tspans && Ext.Array.map(sprite.tspans, function(t) { return t.textContent; }).join('');
  54079. if (!sprite.tspans || attrs.text != text) {
  54080. tspans = this.setText(sprite, attrs.text);
  54081. sprite.tspans = tspans;
  54082. } else {
  54083. tspans = sprite.tspans || [];
  54084. }
  54085. }
  54086. if (tspans.length) {
  54087. height = this.getBBoxText(sprite).height;
  54088. x = sprite.el.dom.getAttribute("x");
  54089. for (i = 0, ln = tspans.length; i < ln; i++) {
  54090. factor = (Ext.isFF3_0 || Ext.isFF3_5) ? 2 : 4;
  54091. tspans[i].setAttribute("x", x);
  54092. tspans[i].setAttribute("dy", i ? height * 1.2 : height / factor);
  54093. }
  54094. sprite.dirty = true;
  54095. }
  54096. },
  54097. setText: function(sprite, textString) {
  54098. var me = this,
  54099. el = sprite.el.dom,
  54100. tspans = [],
  54101. height, tspan, text, i, ln, texts;
  54102. while (el.firstChild) {
  54103. el.removeChild(el.firstChild);
  54104. }
  54105. texts = String(textString).split("\n");
  54106. for (i = 0, ln = texts.length; i < ln; i++) {
  54107. text = texts[i];
  54108. if (text) {
  54109. tspan = me.createSvgElement("tspan");
  54110. tspan.appendChild(document.createTextNode(Ext.htmlDecode(text)));
  54111. el.appendChild(tspan);
  54112. tspans[i] = tspan;
  54113. }
  54114. }
  54115. return tspans;
  54116. },
  54117. renderAll: function() {
  54118. this.items.each(this.renderItem, this);
  54119. },
  54120. renderItem: function (sprite) {
  54121. if (!this.el) {
  54122. return;
  54123. }
  54124. if (!sprite.el) {
  54125. this.createSpriteElement(sprite);
  54126. }
  54127. if (sprite.zIndexDirty) {
  54128. this.applyZIndex(sprite);
  54129. }
  54130. if (sprite.dirty) {
  54131. this.applyAttrs(sprite);
  54132. if (sprite.dirtyTransform) {
  54133. this.applyTransformations(sprite);
  54134. }
  54135. }
  54136. },
  54137. redraw: function(sprite) {
  54138. sprite.dirty = sprite.zIndexDirty = true;
  54139. this.renderItem(sprite);
  54140. },
  54141. applyAttrs: function (sprite) {
  54142. var me = this,
  54143. el = sprite.el,
  54144. group = sprite.group,
  54145. sattr = sprite.attr,
  54146. parsers = me.parsers,
  54147. gradientsMap = me.gradientsMap || {},
  54148. safariFix = Ext.isSafari && !Ext.isStrict,
  54149. groups, i, ln, attrs, font, key, style, name, rect;
  54150. if (group) {
  54151. groups = [].concat(group);
  54152. ln = groups.length;
  54153. for (i = 0; i < ln; i++) {
  54154. group = groups[i];
  54155. me.getGroup(group).add(sprite);
  54156. }
  54157. delete sprite.group;
  54158. }
  54159. attrs = me.scrubAttrs(sprite) || {};
  54160. sprite.bbox.plain = 0;
  54161. sprite.bbox.transform = 0;
  54162. if (sprite.type == "circle" || sprite.type == "ellipse") {
  54163. attrs.cx = attrs.cx || attrs.x;
  54164. attrs.cy = attrs.cy || attrs.y;
  54165. }
  54166. else if (sprite.type == "rect") {
  54167. attrs.rx = attrs.ry = attrs.r;
  54168. }
  54169. else if (sprite.type == "path" && attrs.d) {
  54170. attrs.d = Ext.draw.Draw.pathToString(Ext.draw.Draw.pathToAbsolute(attrs.d));
  54171. }
  54172. sprite.dirtyPath = false;
  54173. if (attrs['clip-rect']) {
  54174. me.setClip(sprite, attrs);
  54175. delete attrs['clip-rect'];
  54176. }
  54177. if (sprite.type == 'text' && attrs.font && sprite.dirtyFont) {
  54178. el.set({ style: "font: " + attrs.font});
  54179. }
  54180. if (sprite.type == "image") {
  54181. el.dom.setAttributeNS(me.xlink, "href", attrs.src);
  54182. }
  54183. Ext.applyIf(attrs, me.minDefaults[sprite.type]);
  54184. if (sprite.dirtyHidden) {
  54185. (sattr.hidden) ? me.hidePrim(sprite) : me.showPrim(sprite);
  54186. sprite.dirtyHidden = false;
  54187. }
  54188. for (key in attrs) {
  54189. if (attrs.hasOwnProperty(key) && attrs[key] != null) {
  54190. if (safariFix && ('color|stroke|fill'.indexOf(key) > -1) && (attrs[key] in gradientsMap)) {
  54191. attrs[key] = gradientsMap[attrs[key]];
  54192. }
  54193. if (key == 'hidden' && sprite.type == 'text') {
  54194. continue;
  54195. }
  54196. if (key in parsers) {
  54197. el.dom.setAttribute(key, parsers[key](attrs[key], sprite, me));
  54198. } else {
  54199. el.dom.setAttribute(key, attrs[key]);
  54200. }
  54201. }
  54202. }
  54203. if (sprite.type == 'text') {
  54204. me.tuneText(sprite, attrs);
  54205. }
  54206. sprite.dirtyFont = false;
  54207. style = sattr.style;
  54208. if (style) {
  54209. el.setStyle(style);
  54210. }
  54211. sprite.dirty = false;
  54212. if (Ext.isSafari3) {
  54213. me.webkitRect.show();
  54214. setTimeout(function () {
  54215. me.webkitRect.hide();
  54216. });
  54217. }
  54218. },
  54219. setClip: function(sprite, params) {
  54220. var me = this,
  54221. rect = params["clip-rect"],
  54222. clipEl, clipPath;
  54223. if (rect) {
  54224. if (sprite.clip) {
  54225. sprite.clip.parentNode.parentNode.removeChild(sprite.clip.parentNode);
  54226. }
  54227. clipEl = me.createSvgElement('clipPath');
  54228. clipPath = me.createSvgElement('rect');
  54229. clipEl.id = Ext.id(null, 'ext-clip-');
  54230. clipPath.setAttribute("x", rect.x);
  54231. clipPath.setAttribute("y", rect.y);
  54232. clipPath.setAttribute("width", rect.width);
  54233. clipPath.setAttribute("height", rect.height);
  54234. clipEl.appendChild(clipPath);
  54235. me.getDefs().appendChild(clipEl);
  54236. sprite.el.dom.setAttribute("clip-path", "url(#" + clipEl.id + ")");
  54237. sprite.clip = clipPath;
  54238. }
  54239. },
  54240. applyZIndex: function(sprite) {
  54241. var me = this,
  54242. items = me.items,
  54243. idx = items.indexOf(sprite),
  54244. el = sprite.el,
  54245. prevEl;
  54246. if (me.el.dom.childNodes[idx + 2] !== el.dom) {
  54247. if (idx > 0) {
  54248. do {
  54249. prevEl = items.getAt(--idx).el;
  54250. } while (!prevEl && idx > 0);
  54251. }
  54252. el.insertAfter(prevEl || me.bgRect);
  54253. }
  54254. sprite.zIndexDirty = false;
  54255. },
  54256. createItem: function (config) {
  54257. var sprite = new Ext.draw.Sprite(config);
  54258. sprite.surface = this;
  54259. return sprite;
  54260. },
  54261. addGradient: function(gradient) {
  54262. gradient = Ext.draw.Draw.parseGradient(gradient);
  54263. var me = this,
  54264. ln = gradient.stops.length,
  54265. vector = gradient.vector,
  54266. usePlain = Ext.isSafari && !Ext.isStrict,
  54267. gradientEl, stop, stopEl, i, gradientsMap;
  54268. gradientsMap = me.gradientsMap || {};
  54269. if (!usePlain) {
  54270. if (gradient.type == "linear") {
  54271. gradientEl = me.createSvgElement("linearGradient");
  54272. gradientEl.setAttribute("x1", vector[0]);
  54273. gradientEl.setAttribute("y1", vector[1]);
  54274. gradientEl.setAttribute("x2", vector[2]);
  54275. gradientEl.setAttribute("y2", vector[3]);
  54276. }
  54277. else {
  54278. gradientEl = me.createSvgElement("radialGradient");
  54279. gradientEl.setAttribute("cx", gradient.centerX);
  54280. gradientEl.setAttribute("cy", gradient.centerY);
  54281. gradientEl.setAttribute("r", gradient.radius);
  54282. if (Ext.isNumber(gradient.focalX) && Ext.isNumber(gradient.focalY)) {
  54283. gradientEl.setAttribute("fx", gradient.focalX);
  54284. gradientEl.setAttribute("fy", gradient.focalY);
  54285. }
  54286. }
  54287. gradientEl.id = gradient.id;
  54288. me.getDefs().appendChild(gradientEl);
  54289. for (i = 0; i < ln; i++) {
  54290. stop = gradient.stops[i];
  54291. stopEl = me.createSvgElement("stop");
  54292. stopEl.setAttribute("offset", stop.offset + "%");
  54293. stopEl.setAttribute("stop-color", stop.color);
  54294. stopEl.setAttribute("stop-opacity",stop.opacity);
  54295. gradientEl.appendChild(stopEl);
  54296. }
  54297. } else {
  54298. gradientsMap['url(#' + gradient.id + ')'] = gradient.stops[0].color;
  54299. }
  54300. me.gradientsMap = gradientsMap;
  54301. },
  54302. hasCls: function(sprite, className) {
  54303. return className && (' ' + (sprite.el.dom.getAttribute('class') || '') + ' ').indexOf(' ' + className + ' ') != -1;
  54304. },
  54305. addCls: function(sprite, className) {
  54306. var el = sprite.el,
  54307. i,
  54308. len,
  54309. v,
  54310. cls = [],
  54311. curCls = el.getAttribute('class') || '';
  54312. if (!Ext.isArray(className)) {
  54313. if (typeof className == 'string' && !this.hasCls(sprite, className)) {
  54314. el.set({ 'class': curCls + ' ' + className });
  54315. }
  54316. }
  54317. else {
  54318. for (i = 0, len = className.length; i < len; i++) {
  54319. v = className[i];
  54320. if (typeof v == 'string' && (' ' + curCls + ' ').indexOf(' ' + v + ' ') == -1) {
  54321. cls.push(v);
  54322. }
  54323. }
  54324. if (cls.length) {
  54325. el.set({ 'class': ' ' + cls.join(' ') });
  54326. }
  54327. }
  54328. },
  54329. removeCls: function(sprite, className) {
  54330. var me = this,
  54331. el = sprite.el,
  54332. curCls = el.getAttribute('class') || '',
  54333. i, idx, len, cls, elClasses;
  54334. if (!Ext.isArray(className)){
  54335. className = [className];
  54336. }
  54337. if (curCls) {
  54338. elClasses = curCls.replace(me.trimRe, ' ').split(me.spacesRe);
  54339. for (i = 0, len = className.length; i < len; i++) {
  54340. cls = className[i];
  54341. if (typeof cls == 'string') {
  54342. cls = cls.replace(me.trimRe, '');
  54343. idx = Ext.Array.indexOf(elClasses, cls);
  54344. if (idx != -1) {
  54345. Ext.Array.erase(elClasses, idx, 1);
  54346. }
  54347. }
  54348. }
  54349. el.set({ 'class': elClasses.join(' ') });
  54350. }
  54351. },
  54352. destroy: function() {
  54353. var me = this;
  54354. me.callParent();
  54355. if (me.el) {
  54356. me.el.remove();
  54357. }
  54358. if (me._defs) {
  54359. Ext.get(me._defs).destroy();
  54360. }
  54361. if (me.bgRect) {
  54362. Ext.get(me.bgRect).destroy();
  54363. }
  54364. if (me.webkitRect) {
  54365. Ext.get(me.webkitRect).destroy();
  54366. }
  54367. delete me.el;
  54368. }
  54369. });
  54370. Ext.define('Ext.draw.engine.SvgExporter', function(){
  54371. var commaRe = /,/g,
  54372. fontRegex = /(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)\s('*.*'*)/,
  54373. rgbColorRe = /rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,
  54374. rgbaColorRe = /rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,([\d\.]+)\)/g,
  54375. surface, len, width, height,
  54376. init = function(s){
  54377. surface = s;
  54378. len = surface.length;
  54379. width = surface.width;
  54380. height = surface.height;
  54381. },
  54382. spriteProcessor = {
  54383. path: function(sprite){
  54384. var attr = sprite.attr,
  54385. path = attr.path,
  54386. pathString = '',
  54387. props, p, pLen;
  54388. if (Ext.isArray(path[0])) {
  54389. pLen = path.length;
  54390. for (p = 0; p < pLen; p++) {
  54391. pathString += path[p].join(' ');
  54392. }
  54393. } else if (Ext.isArray(path)) {
  54394. pathString = path.join(' ');
  54395. } else {
  54396. pathString = path.replace(commaRe,' ');
  54397. }
  54398. props = toPropertyString({
  54399. d: pathString,
  54400. fill: attr.fill || 'none',
  54401. stroke: attr.stroke,
  54402. 'fill-opacity': attr.opacity,
  54403. 'stroke-width': attr['stroke-width'],
  54404. 'stroke-opacity': attr['stroke-opacity'],
  54405. "z-index": attr.zIndex,
  54406. transform: sprite.matrix.toSvg()
  54407. });
  54408. return '<path ' + props + '/>';
  54409. },
  54410. text: function(sprite){
  54411. var attr = sprite.attr,
  54412. match = fontRegex.exec(attr.font),
  54413. size = (match && match[1]) || "12",
  54414. family = (match && match[3]) || 'Arial',
  54415. text = attr.text,
  54416. factor = (Ext.isFF3_0 || Ext.isFF3_5) ? 2 : 4,
  54417. tspanString = '',
  54418. props;
  54419. sprite.getBBox();
  54420. tspanString += '<tspan x="' + (attr.x || '') + '" dy="';
  54421. tspanString += (size/factor)+'">';
  54422. tspanString += Ext.htmlEncode(text) + '</tspan>';
  54423. props = toPropertyString({
  54424. x: attr.x,
  54425. y: attr.y,
  54426. 'font-size': size,
  54427. 'font-family': family,
  54428. 'font-weight': attr['font-weight'],
  54429. 'text-anchor': attr['text-anchor'],
  54430. fill: attr.fill || '#000',
  54431. 'fill-opacity': attr.opacity,
  54432. transform: sprite.matrix.toSvg()
  54433. });
  54434. return '<text '+ props + '>' + tspanString + '</text>';
  54435. },
  54436. rect: function(sprite){
  54437. var attr = sprite.attr,
  54438. props = toPropertyString({
  54439. x: attr.x,
  54440. y: attr.y,
  54441. rx: attr.rx,
  54442. ry: attr.ry,
  54443. width: attr.width,
  54444. height: attr.height,
  54445. fill: attr.fill || 'none',
  54446. 'fill-opacity': attr.opacity,
  54447. stroke: attr.stroke,
  54448. 'stroke-opacity': attr['stroke-opacity'],
  54449. 'stroke-width':attr['stroke-width'],
  54450. transform: sprite.matrix && sprite.matrix.toSvg()
  54451. });
  54452. return '<rect ' + props + '/>';
  54453. },
  54454. circle: function(sprite){
  54455. var attr = sprite.attr,
  54456. props = toPropertyString({
  54457. cx: attr.x,
  54458. cy: attr.y,
  54459. r: attr.radius,
  54460. fill: attr.translation.fill || attr.fill || 'none',
  54461. 'fill-opacity': attr.opacity,
  54462. stroke: attr.stroke,
  54463. 'stroke-opacity': attr['stroke-opacity'],
  54464. 'stroke-width':attr['stroke-width'],
  54465. transform: sprite.matrix.toSvg()
  54466. });
  54467. return '<circle ' + props + ' />';
  54468. },
  54469. image: function(sprite){
  54470. var attr = sprite.attr,
  54471. props = toPropertyString({
  54472. x: attr.x - (attr.width/2 >> 0),
  54473. y: attr.y - (attr.height/2 >> 0),
  54474. width: attr.width,
  54475. height: attr.height,
  54476. 'xlink:href': attr.src,
  54477. transform: sprite.matrix.toSvg()
  54478. });
  54479. return '<image ' + props + ' />';
  54480. }
  54481. },
  54482. svgHeader = function(){
  54483. var svg = '<?xml version="1.0" standalone="yes"?>';
  54484. svg += '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">';
  54485. return svg;
  54486. },
  54487. svgContent = function(){
  54488. var svg = '<svg width="'+width+'px" height="'+height+'px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">',
  54489. defs = '', item, itemsLen, items, gradient,
  54490. getSvgString, colorstops, stop,
  54491. coll, keys, colls, k, kLen, key, collI, i, j, stopsLen, sortedItems, za, zb;
  54492. items = surface.items.items;
  54493. itemsLen = items.length;
  54494. getSvgString = function(node){
  54495. var childs = node.childNodes,
  54496. childLength = childs.length,
  54497. i = 0,
  54498. attrLength,
  54499. j,
  54500. svgString = '', child, attr, tagName, attrItem;
  54501. for(; i < childLength; i++){
  54502. child = childs[i];
  54503. attr = child.attributes;
  54504. tagName = child.tagName;
  54505. svgString += '<' +tagName;
  54506. for(j = 0, attrLength = attr.length; j < attrLength; j++){
  54507. attrItem = attr.item(j);
  54508. svgString += ' '+attrItem.name+'="'+attrItem.value+'"';
  54509. }
  54510. svgString += '>';
  54511. if(child.childNodes.length > 0){
  54512. svgString += getSvgString(child);
  54513. }
  54514. svgString += '</' + tagName + '>';
  54515. }
  54516. return svgString;
  54517. };
  54518. if(surface.getDefs){
  54519. defs = getSvgString(surface.getDefs());
  54520. }else{
  54521. coll = surface.gradientsColl;
  54522. if (coll) {
  54523. keys = coll.keys;
  54524. colls = coll.items;
  54525. k = 0;
  54526. kLen = keys.length;
  54527. }
  54528. for (; k < kLen; k++) {
  54529. key = keys[k];
  54530. collI = colls[k];
  54531. gradient = surface.gradientsColl.getByKey(key);
  54532. defs += '<linearGradient id="' + key + '" x1="0" y1="0" x2="1" y2="1">';
  54533. var color = gradient.colors.replace(rgbColorRe, 'rgb($1|$2|$3)');
  54534. color = color.replace(rgbaColorRe, 'rgba($1|$2|$3|$4)')
  54535. colorstops = color.split(',');
  54536. for(i=0, stopsLen = colorstops.length; i < stopsLen; i++){
  54537. stop = colorstops[i].split(' ');
  54538. color = Ext.draw.Color.fromString(stop[1].replace(/\|/g,','));
  54539. defs += '<stop offset="'+stop[0]+'" stop-color="' + color.toString() + '" stop-opacity="1"></stop>';
  54540. }
  54541. defs += '</linearGradient>';
  54542. }
  54543. }
  54544. svg += '<defs>' + defs + '</defs>';
  54545. svg += spriteProcessor.rect({
  54546. attr: {
  54547. width: '100%',
  54548. height: '100%',
  54549. fill: '#fff',
  54550. stroke: 'none',
  54551. opacity: '0'
  54552. }
  54553. });
  54554. sortedItems = new Array(itemsLen);
  54555. for(i = 0; i < itemsLen; i++){
  54556. sortedItems[i] = i;
  54557. }
  54558. sortedItems.sort(function (a, b) {
  54559. za = items[a].attr.zIndex || 0;
  54560. zb = items[b].attr.zIndex || 0;
  54561. if (za == zb) {
  54562. return a - b;
  54563. }
  54564. return za - zb;
  54565. });
  54566. for(i = 0; i < itemsLen; i++){
  54567. item = items[sortedItems[i]];
  54568. if(!item.attr.hidden){
  54569. svg += spriteProcessor[item.type](item);
  54570. }
  54571. }
  54572. svg += '</svg>';
  54573. return svg;
  54574. },
  54575. toPropertyString = function(obj){
  54576. var propString = '',
  54577. key;
  54578. for(key in obj){
  54579. if(obj.hasOwnProperty(key) && obj[key] != null){
  54580. propString += key +'="'+ obj[key]+'" ';
  54581. }
  54582. }
  54583. return propString;
  54584. };
  54585. return {
  54586. singleton: true,
  54587. generate: function(surface, config){
  54588. config = config || {};
  54589. init(surface);
  54590. return svgHeader() + svgContent();
  54591. }
  54592. };
  54593. });
  54594. Ext.define('Ext.draw.engine.Vml', {
  54595. extend: 'Ext.draw.Surface',
  54596. requires: ['Ext.draw.Draw', 'Ext.draw.Color', 'Ext.draw.Sprite', 'Ext.draw.Matrix', 'Ext.Element'],
  54597. engine: 'Vml',
  54598. map: {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
  54599. bitesRe: /([clmz]),?([^clmz]*)/gi,
  54600. valRe: /-?[^,\s\-]+/g,
  54601. fillUrlRe: /^url\(\s*['"]?([^\)]+?)['"]?\s*\)$/i,
  54602. pathlike: /^(path|rect)$/,
  54603. NonVmlPathRe: /[ahqstv]/ig, // Non-VML Pathing ops
  54604. partialPathRe: /[clmz]/g,
  54605. fontFamilyRe: /^['"]+|['"]+$/g,
  54606. baseVmlCls: Ext.baseCSSPrefix + 'vml-base',
  54607. vmlGroupCls: Ext.baseCSSPrefix + 'vml-group',
  54608. spriteCls: Ext.baseCSSPrefix + 'vml-sprite',
  54609. measureSpanCls: Ext.baseCSSPrefix + 'vml-measure-span',
  54610. zoom: 21600,
  54611. coordsize: 1000,
  54612. coordorigin: '0 0',
  54613. zIndexShift: 0,
  54614. // VML uses CSS z-index and therefore doesn't need sprites to be kept in zIndex order
  54615. orderSpritesByZIndex: false,
  54616. path2vml: function (path) {
  54617. var me = this,
  54618. nonVML = me.NonVmlPathRe,
  54619. map = me.map,
  54620. val = me.valRe,
  54621. zoom = me.zoom,
  54622. bites = me.bitesRe,
  54623. command = Ext.Function.bind(Ext.draw.Draw.pathToAbsolute, Ext.draw.Draw),
  54624. res, pa, p, r, i, ii, j, jj;
  54625. if (String(path).match(nonVML)) {
  54626. command = Ext.Function.bind(Ext.draw.Draw.path2curve, Ext.draw.Draw);
  54627. } else if (!String(path).match(me.partialPathRe)) {
  54628. res = String(path).replace(bites, function (all, command, args) {
  54629. var vals = [],
  54630. isMove = command.toLowerCase() == "m",
  54631. res = map[command];
  54632. args.replace(val, function (value) {
  54633. if (isMove && vals.length === 2) {
  54634. res += vals + map[command == "m" ? "l" : "L"];
  54635. vals = [];
  54636. }
  54637. vals.push(Math.round(value * zoom));
  54638. });
  54639. return res + vals;
  54640. });
  54641. return res;
  54642. }
  54643. pa = command(path);
  54644. res = [];
  54645. for (i = 0, ii = pa.length; i < ii; i++) {
  54646. p = pa[i];
  54647. r = pa[i][0].toLowerCase();
  54648. if (r == "z") {
  54649. r = "x";
  54650. }
  54651. for (j = 1, jj = p.length; j < jj; j++) {
  54652. r += Math.round(p[j] * me.zoom) + (j != jj - 1 ? "," : "");
  54653. }
  54654. res.push(r);
  54655. }
  54656. return res.join(" ");
  54657. },
  54658. translateAttrs: {
  54659. radius: "r",
  54660. radiusX: "rx",
  54661. radiusY: "ry",
  54662. lineWidth: "stroke-width",
  54663. fillOpacity: "fill-opacity",
  54664. strokeOpacity: "stroke-opacity",
  54665. strokeLinejoin: "stroke-linejoin"
  54666. },
  54667. minDefaults: {
  54668. circle: {
  54669. fill: "none",
  54670. stroke: null,
  54671. "stroke-width": null,
  54672. opacity: null,
  54673. "fill-opacity": null,
  54674. "stroke-opacity": null
  54675. },
  54676. ellipse: {
  54677. cx: 0,
  54678. cy: 0,
  54679. rx: 0,
  54680. ry: 0,
  54681. fill: "none",
  54682. stroke: null,
  54683. "stroke-width": null,
  54684. opacity: null,
  54685. "fill-opacity": null,
  54686. "stroke-opacity": null
  54687. },
  54688. rect: {
  54689. x: 0,
  54690. y: 0,
  54691. width: 0,
  54692. height: 0,
  54693. rx: 0,
  54694. ry: 0,
  54695. fill: "none",
  54696. stroke: null,
  54697. "stroke-width": null,
  54698. opacity: null,
  54699. "fill-opacity": null,
  54700. "stroke-opacity": null
  54701. },
  54702. text: {
  54703. x: 0,
  54704. y: 0,
  54705. "text-anchor": "start",
  54706. font: '10px "Arial"',
  54707. fill: "#000",
  54708. stroke: null,
  54709. "stroke-width": null,
  54710. opacity: null,
  54711. "fill-opacity": null,
  54712. "stroke-opacity": null
  54713. },
  54714. path: {
  54715. d: "M0,0",
  54716. fill: "none",
  54717. stroke: null,
  54718. "stroke-width": null,
  54719. opacity: null,
  54720. "fill-opacity": null,
  54721. "stroke-opacity": null
  54722. },
  54723. image: {
  54724. x: 0,
  54725. y: 0,
  54726. width: 0,
  54727. height: 0,
  54728. preserveAspectRatio: "none",
  54729. opacity: null
  54730. }
  54731. },
  54732. onMouseEnter: function (e) {
  54733. this.fireEvent("mouseenter", e);
  54734. },
  54735. onMouseLeave: function (e) {
  54736. this.fireEvent("mouseleave", e);
  54737. },
  54738. processEvent: function (name, e) {
  54739. var target = e.getTarget(),
  54740. surface = this.surface,
  54741. sprite;
  54742. this.fireEvent(name, e);
  54743. sprite = this.items.get(target.id);
  54744. if (sprite) {
  54745. sprite.fireEvent(name, sprite, e);
  54746. }
  54747. },
  54748. createSpriteElement: function (sprite) {
  54749. var me = this,
  54750. attr = sprite.attr,
  54751. type = sprite.type,
  54752. zoom = me.zoom,
  54753. vml = sprite.vml || (sprite.vml = {}),
  54754. round = Math.round,
  54755. el = (type === 'image') ? me.createNode('image') : me.createNode('shape'),
  54756. path, skew, textPath;
  54757. el.coordsize = zoom + ' ' + zoom;
  54758. el.coordorigin = attr.coordorigin || "0 0";
  54759. Ext.get(el).addCls(me.spriteCls);
  54760. if (type == "text") {
  54761. vml.path = path = me.createNode("path");
  54762. path.textpathok = true;
  54763. vml.textpath = textPath = me.createNode("textpath");
  54764. textPath.on = true;
  54765. el.appendChild(textPath);
  54766. el.appendChild(path);
  54767. }
  54768. el.id = sprite.id;
  54769. sprite.el = Ext.get(el);
  54770. sprite.el.setStyle('zIndex', -me.zIndexShift);
  54771. me.el.appendChild(el);
  54772. if (type !== 'image') {
  54773. skew = me.createNode("skew");
  54774. skew.on = true;
  54775. el.appendChild(skew);
  54776. sprite.skew = skew;
  54777. }
  54778. sprite.matrix = new Ext.draw.Matrix();
  54779. sprite.bbox = {
  54780. plain: null,
  54781. transform: null
  54782. };
  54783. this.applyAttrs(sprite);
  54784. this.applyTransformations(sprite);
  54785. sprite.fireEvent("render", sprite);
  54786. return sprite.el;
  54787. },
  54788. getBBoxText: function (sprite) {
  54789. var vml = sprite.vml;
  54790. return {
  54791. x: vml.X + (vml.bbx || 0) - vml.W / 2,
  54792. y: vml.Y - vml.H / 2,
  54793. width: vml.W,
  54794. height: vml.H
  54795. };
  54796. },
  54797. applyAttrs: function (sprite) {
  54798. var me = this,
  54799. vml = sprite.vml,
  54800. group = sprite.group,
  54801. spriteAttr = sprite.attr,
  54802. el = sprite.el,
  54803. dom = el.dom,
  54804. style, name, groups, i, ln, scrubbedAttrs, font, key,
  54805. cx, cy, rx, ry;
  54806. if (group) {
  54807. groups = [].concat(group);
  54808. ln = groups.length;
  54809. for (i = 0; i < ln; i++) {
  54810. group = groups[i];
  54811. me.getGroup(group).add(sprite);
  54812. }
  54813. delete sprite.group;
  54814. }
  54815. scrubbedAttrs = me.scrubAttrs(sprite) || {};
  54816. if (sprite.zIndexDirty) {
  54817. me.setZIndex(sprite);
  54818. }
  54819. Ext.applyIf(scrubbedAttrs, me.minDefaults[sprite.type]);
  54820. if (sprite.type == 'image') {
  54821. Ext.apply(sprite.attr, {
  54822. x: scrubbedAttrs.x,
  54823. y: scrubbedAttrs.y,
  54824. width: scrubbedAttrs.width,
  54825. height: scrubbedAttrs.height
  54826. });
  54827. el.setStyle({
  54828. width: scrubbedAttrs.width + 'px',
  54829. height: scrubbedAttrs.height + 'px'
  54830. });
  54831. dom.src = scrubbedAttrs.src;
  54832. }
  54833. if (dom.href) {
  54834. dom.href = scrubbedAttrs.href;
  54835. }
  54836. if (dom.title) {
  54837. dom.title = scrubbedAttrs.title;
  54838. }
  54839. if (dom.target) {
  54840. dom.target = scrubbedAttrs.target;
  54841. }
  54842. if (dom.cursor) {
  54843. dom.cursor = scrubbedAttrs.cursor;
  54844. }
  54845. if (sprite.dirtyHidden) {
  54846. (scrubbedAttrs.hidden) ? me.hidePrim(sprite) : me.showPrim(sprite);
  54847. sprite.dirtyHidden = false;
  54848. }
  54849. if (sprite.dirtyPath) {
  54850. if (sprite.type == "circle" || sprite.type == "ellipse") {
  54851. cx = scrubbedAttrs.x;
  54852. cy = scrubbedAttrs.y;
  54853. rx = scrubbedAttrs.rx || scrubbedAttrs.r || 0;
  54854. ry = scrubbedAttrs.ry || scrubbedAttrs.r || 0;
  54855. dom.path = Ext.String.format("ar{0},{1},{2},{3},{4},{1},{4},{1}",
  54856. Math.round((cx - rx) * me.zoom),
  54857. Math.round((cy - ry) * me.zoom),
  54858. Math.round((cx + rx) * me.zoom),
  54859. Math.round((cy + ry) * me.zoom),
  54860. Math.round(cx * me.zoom));
  54861. sprite.dirtyPath = false;
  54862. }
  54863. else if (sprite.type !== "text" && sprite.type !== 'image') {
  54864. sprite.attr.path = scrubbedAttrs.path = me.setPaths(sprite, scrubbedAttrs) || scrubbedAttrs.path;
  54865. dom.path = me.path2vml(scrubbedAttrs.path);
  54866. sprite.dirtyPath = false;
  54867. }
  54868. }
  54869. if ("clip-rect" in scrubbedAttrs) {
  54870. me.setClip(sprite, scrubbedAttrs);
  54871. }
  54872. if (sprite.type == "text") {
  54873. me.setTextAttributes(sprite, scrubbedAttrs);
  54874. }
  54875. if (scrubbedAttrs.opacity || scrubbedAttrs['stroke-opacity'] || scrubbedAttrs.fill) {
  54876. me.setFill(sprite, scrubbedAttrs);
  54877. }
  54878. if (scrubbedAttrs.stroke || scrubbedAttrs['stroke-opacity'] || scrubbedAttrs.fill) {
  54879. me.setStroke(sprite, scrubbedAttrs);
  54880. }
  54881. style = spriteAttr.style;
  54882. if (style) {
  54883. el.setStyle(style);
  54884. }
  54885. sprite.dirty = false;
  54886. },
  54887. setZIndex: function (sprite) {
  54888. var me = this,
  54889. zIndex = sprite.attr.zIndex,
  54890. shift = me.zIndexShift,
  54891. items, iLen, item, i;
  54892. if (zIndex < shift) {
  54893. items = me.items.items;
  54894. iLen = items.length;
  54895. for (i = 0; i < iLen; i++) {
  54896. if ((zIndex = items[i].attr.zIndex) && zIndex < shift) {
  54897. shift = zIndex;
  54898. }
  54899. }
  54900. me.zIndexShift = shift;
  54901. for (i = 0; i < iLen; i++) {
  54902. item = items[i];
  54903. if (item.el) {
  54904. item.el.setStyle('zIndex', item.attr.zIndex - shift);
  54905. }
  54906. item.zIndexDirty = false;
  54907. }
  54908. } else if (sprite.el) {
  54909. sprite.el.setStyle('zIndex', zIndex - shift);
  54910. sprite.zIndexDirty = false;
  54911. }
  54912. },
  54913. setPaths: function (sprite, params) {
  54914. var spriteAttr = sprite.attr, thickness = sprite.attr['stroke-width'] || 1;
  54915. sprite.bbox.plain = null;
  54916. sprite.bbox.transform = null;
  54917. if (sprite.type == 'circle') {
  54918. spriteAttr.rx = spriteAttr.ry = params.r;
  54919. return Ext.draw.Draw.ellipsePath(sprite);
  54920. }
  54921. else if (sprite.type == 'ellipse') {
  54922. spriteAttr.rx = params.rx;
  54923. spriteAttr.ry = params.ry;
  54924. return Ext.draw.Draw.ellipsePath(sprite);
  54925. }
  54926. else if (sprite.type == 'rect') {
  54927. spriteAttr.rx = spriteAttr.ry = params.r;
  54928. return Ext.draw.Draw.rectPath(sprite);
  54929. }
  54930. else if (sprite.type == 'path' && spriteAttr.path) {
  54931. return Ext.draw.Draw.pathToAbsolute(spriteAttr.path);
  54932. }
  54933. return false;
  54934. },
  54935. setFill: function (sprite, params) {
  54936. var me = this,
  54937. el = sprite.el.dom,
  54938. fillEl = el.fill,
  54939. newfill = false,
  54940. opacity, gradient, fillUrl, rotation, angle;
  54941. if (!fillEl) {
  54942. fillEl = el.fill = me.createNode("fill");
  54943. newfill = true;
  54944. }
  54945. if (Ext.isArray(params.fill)) {
  54946. params.fill = params.fill[0];
  54947. }
  54948. if (params.fill == "none") {
  54949. fillEl.on = false;
  54950. }
  54951. else {
  54952. if (typeof params.opacity == "number") {
  54953. fillEl.opacity = params.opacity;
  54954. }
  54955. if (typeof params["fill-opacity"] == "number") {
  54956. fillEl.opacity = params["fill-opacity"];
  54957. }
  54958. fillEl.on = true;
  54959. if (typeof params.fill == "string") {
  54960. fillUrl = params.fill.match(me.fillUrlRe);
  54961. if (fillUrl) {
  54962. fillUrl = fillUrl[1];
  54963. if (fillUrl.charAt(0) == "#") {
  54964. gradient = me.gradientsColl.getByKey(fillUrl.substring(1));
  54965. }
  54966. if (gradient) {
  54967. rotation = params.rotation;
  54968. angle = -(gradient.angle + 270 + (rotation ? rotation.degrees : 0)) % 360;
  54969. if (angle === 0) {
  54970. angle = 180;
  54971. }
  54972. fillEl.angle = angle;
  54973. fillEl.type = "gradient";
  54974. fillEl.method = "sigma";
  54975. if (fillEl.colors) {
  54976. fillEl.colors.value = gradient.colors;
  54977. } else {
  54978. fillEl.colors = gradient.colors;
  54979. }
  54980. }
  54981. else {
  54982. fillEl.src = fillUrl;
  54983. fillEl.type = "tile";
  54984. }
  54985. }
  54986. else {
  54987. fillEl.color = Ext.draw.Color.toHex(params.fill);
  54988. fillEl.src = "";
  54989. fillEl.type = "solid";
  54990. }
  54991. }
  54992. }
  54993. if (newfill) {
  54994. el.appendChild(fillEl);
  54995. }
  54996. },
  54997. setStroke: function (sprite, params) {
  54998. var me = this,
  54999. el = sprite.el.dom,
  55000. strokeEl = sprite.strokeEl,
  55001. newStroke = false,
  55002. width, opacity;
  55003. if (!strokeEl) {
  55004. strokeEl = sprite.strokeEl = me.createNode("stroke");
  55005. newStroke = true;
  55006. }
  55007. if (Ext.isArray(params.stroke)) {
  55008. params.stroke = params.stroke[0];
  55009. }
  55010. if (!params.stroke || params.stroke == "none" || params.stroke == 0 || params["stroke-width"] == 0) {
  55011. strokeEl.on = false;
  55012. }
  55013. else {
  55014. strokeEl.on = true;
  55015. if (params.stroke && !params.stroke.match(me.fillUrlRe)) {
  55016. strokeEl.color = Ext.draw.Color.toHex(params.stroke);
  55017. }
  55018. strokeEl.dashstyle = params["stroke-dasharray"] ? "dash" : "solid";
  55019. strokeEl.joinstyle = params["stroke-linejoin"];
  55020. strokeEl.endcap = params["stroke-linecap"] || "round";
  55021. strokeEl.miterlimit = params["stroke-miterlimit"] || 8;
  55022. width = parseFloat(params["stroke-width"] || 1) * 0.75;
  55023. opacity = params["stroke-opacity"] || 1;
  55024. if (Ext.isNumber(width) && width < 1) {
  55025. strokeEl.weight = 1;
  55026. strokeEl.opacity = opacity * width;
  55027. }
  55028. else {
  55029. strokeEl.weight = width;
  55030. strokeEl.opacity = opacity;
  55031. }
  55032. }
  55033. if (newStroke) {
  55034. el.appendChild(strokeEl);
  55035. }
  55036. },
  55037. setClip: function (sprite, params) {
  55038. var me = this,
  55039. el = sprite.el,
  55040. clipEl = sprite.clipEl,
  55041. rect = String(params["clip-rect"]).split(me.separatorRe);
  55042. if (!clipEl) {
  55043. clipEl = sprite.clipEl = me.el.insertFirst(Ext.getDoc().dom.createElement("div"));
  55044. clipEl.addCls(Ext.baseCSSPrefix + 'vml-sprite');
  55045. }
  55046. if (rect.length == 4) {
  55047. rect[2] = +rect[2] + (+rect[0]);
  55048. rect[3] = +rect[3] + (+rect[1]);
  55049. clipEl.setStyle("clip", Ext.String.format("rect({1}px {2}px {3}px {0}px)", rect[0], rect[1], rect[2], rect[3]));
  55050. clipEl.setSize(me.el.width, me.el.height);
  55051. }
  55052. else {
  55053. clipEl.setStyle("clip", "");
  55054. }
  55055. },
  55056. setTextAttributes: function (sprite, params) {
  55057. var me = this,
  55058. vml = sprite.vml,
  55059. textStyle = vml.textpath.style,
  55060. spanCacheStyle = me.span.style,
  55061. zoom = me.zoom,
  55062. round = Math.round,
  55063. fontObj = {
  55064. fontSize: "font-size",
  55065. fontWeight: "font-weight",
  55066. fontStyle: "font-style"
  55067. },
  55068. fontProp,
  55069. paramProp;
  55070. if (sprite.dirtyFont) {
  55071. if (params.font) {
  55072. textStyle.font = spanCacheStyle.font = params.font;
  55073. }
  55074. if (params["font-family"]) {
  55075. textStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(me.fontFamilyRe, "") + '"';
  55076. spanCacheStyle.fontFamily = params["font-family"];
  55077. }
  55078. for (fontProp in fontObj) {
  55079. paramProp = params[fontObj[fontProp]];
  55080. if (paramProp) {
  55081. textStyle[fontProp] = spanCacheStyle[fontProp] = paramProp;
  55082. }
  55083. }
  55084. me.setText(sprite, params.text);
  55085. if (vml.textpath.string) {
  55086. me.span.innerHTML = String(vml.textpath.string).replace(/</g, "&#60;").replace(/&/g, "&#38;").replace(/\n/g, "<br/>");
  55087. }
  55088. vml.W = me.span.offsetWidth;
  55089. vml.H = me.span.offsetHeight + 2;
  55090. if (params["text-anchor"] == "middle") {
  55091. textStyle["v-text-align"] = "center";
  55092. }
  55093. else if (params["text-anchor"] == "end") {
  55094. textStyle["v-text-align"] = "right";
  55095. vml.bbx = -Math.round(vml.W / 2);
  55096. }
  55097. else {
  55098. textStyle["v-text-align"] = "left";
  55099. vml.bbx = Math.round(vml.W / 2);
  55100. }
  55101. }
  55102. vml.X = params.x;
  55103. vml.Y = params.y;
  55104. vml.path.v = Ext.String.format("m{0},{1}l{2},{1}", Math.round(vml.X * zoom), Math.round(vml.Y * zoom), Math.round(vml.X * zoom) + 1);
  55105. sprite.bbox.plain = null;
  55106. sprite.bbox.transform = null;
  55107. sprite.dirtyFont = false;
  55108. },
  55109. setText: function (sprite, text) {
  55110. sprite.vml.textpath.string = Ext.htmlDecode(text);
  55111. },
  55112. hide: function () {
  55113. this.el.hide();
  55114. },
  55115. show: function () {
  55116. this.el.show();
  55117. },
  55118. hidePrim: function (sprite) {
  55119. sprite.el.addCls(Ext.baseCSSPrefix + 'hide-visibility');
  55120. },
  55121. showPrim: function (sprite) {
  55122. sprite.el.removeCls(Ext.baseCSSPrefix + 'hide-visibility');
  55123. },
  55124. setSize: function (width, height) {
  55125. var me = this;
  55126. width = width || me.width;
  55127. height = height || me.height;
  55128. me.width = width;
  55129. me.height = height;
  55130. if (me.el) {
  55131. if (width != undefined) {
  55132. me.el.setWidth(width);
  55133. }
  55134. if (height != undefined) {
  55135. me.el.setHeight(height);
  55136. }
  55137. }
  55138. me.callParent(arguments);
  55139. },
  55140. applyViewBox: function () {
  55141. var me = this,
  55142. viewBox = me.viewBox,
  55143. width = me.width,
  55144. height = me.height,
  55145. items,
  55146. iLen,
  55147. i;
  55148. me.callParent();
  55149. if (viewBox && (width || height)) {
  55150. items = me.items.items;
  55151. iLen = items.length;
  55152. for (i = 0; i < iLen; i++) {
  55153. me.applyTransformations(items[i]);
  55154. }
  55155. }
  55156. },
  55157. onAdd: function (item) {
  55158. this.callParent(arguments);
  55159. if (this.el) {
  55160. this.renderItem(item);
  55161. }
  55162. },
  55163. onRemove: function (sprite) {
  55164. if (sprite.el) {
  55165. sprite.el.remove();
  55166. delete sprite.el;
  55167. }
  55168. this.callParent(arguments);
  55169. },
  55170. render: function (container) {
  55171. var me = this,
  55172. doc = Ext.getDoc().dom,
  55173. el;
  55174. if (!me.createNode) {
  55175. try {
  55176. if (!doc.namespaces.rvml) {
  55177. doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
  55178. }
  55179. me.createNode = function (tagName) {
  55180. return doc.createElement("<rvml:" + tagName + ' class="rvml">');
  55181. };
  55182. } catch (e) {
  55183. me.createNode = function (tagName) {
  55184. return doc.createElement("<" + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
  55185. };
  55186. }
  55187. }
  55188. if (!me.el) {
  55189. el = doc.createElement("div");
  55190. me.el = Ext.get(el);
  55191. me.el.addCls(me.baseVmlCls);
  55192. me.span = doc.createElement("span");
  55193. Ext.get(me.span).addCls(me.measureSpanCls);
  55194. el.appendChild(me.span);
  55195. me.el.setSize(me.width || 0, me.height || 0);
  55196. container.appendChild(el);
  55197. me.el.on({
  55198. scope: me,
  55199. mouseup: me.onMouseUp,
  55200. mousedown: me.onMouseDown,
  55201. mouseover: me.onMouseOver,
  55202. mouseout: me.onMouseOut,
  55203. mousemove: me.onMouseMove,
  55204. mouseenter: me.onMouseEnter,
  55205. mouseleave: me.onMouseLeave,
  55206. click: me.onClick,
  55207. dblclick: me.onDblClick
  55208. });
  55209. }
  55210. me.renderAll();
  55211. },
  55212. renderAll: function () {
  55213. this.items.each(this.renderItem, this);
  55214. },
  55215. redraw: function (sprite) {
  55216. sprite.dirty = true;
  55217. this.renderItem(sprite);
  55218. },
  55219. renderItem: function (sprite) {
  55220. if (!this.el) {
  55221. return;
  55222. }
  55223. if (!sprite.el) {
  55224. this.createSpriteElement(sprite);
  55225. }
  55226. if (sprite.dirty) {
  55227. this.applyAttrs(sprite);
  55228. if (sprite.dirtyTransform) {
  55229. this.applyTransformations(sprite);
  55230. }
  55231. }
  55232. },
  55233. rotationCompensation: function (deg, dx, dy) {
  55234. var matrix = new Ext.draw.Matrix();
  55235. matrix.rotate(-deg, 0.5, 0.5);
  55236. return {
  55237. x: matrix.x(dx, dy),
  55238. y: matrix.y(dx, dy)
  55239. };
  55240. },
  55241. transform: function (sprite, matrixOnly) {
  55242. var me = this,
  55243. bbox = me.getBBox(sprite, true),
  55244. cx = bbox.x + bbox.width * 0.5,
  55245. cy = bbox.y + bbox.height * 0.5,
  55246. matrix = new Ext.draw.Matrix(),
  55247. transforms = sprite.transformations,
  55248. transformsLength = transforms.length,
  55249. i = 0,
  55250. deltaDegrees = 0,
  55251. deltaScaleX = 1,
  55252. deltaScaleY = 1,
  55253. flip = "",
  55254. el = sprite.el,
  55255. dom = el.dom,
  55256. domStyle = dom.style,
  55257. zoom = me.zoom,
  55258. skew = sprite.skew,
  55259. shift = me.viewBoxShift,
  55260. deltaX, deltaY, transform, type, compensate, y, fill, newAngle, zoomScaleX, zoomScaleY, newOrigin, offset;
  55261. for (; i < transformsLength; i++) {
  55262. transform = transforms[i];
  55263. type = transform.type;
  55264. if (type == "translate") {
  55265. matrix.translate(transform.x, transform.y);
  55266. }
  55267. else if (type == "rotate") {
  55268. matrix.rotate(transform.degrees, transform.x, transform.y);
  55269. deltaDegrees += transform.degrees;
  55270. }
  55271. else if (type == "scale") {
  55272. matrix.scale(transform.x, transform.y, transform.centerX, transform.centerY);
  55273. deltaScaleX *= transform.x;
  55274. deltaScaleY *= transform.y;
  55275. }
  55276. }
  55277. sprite.matrix = matrix.clone();
  55278. if (matrixOnly) {
  55279. return;
  55280. }
  55281. if (shift) {
  55282. matrix.prepend(shift.scale, 0, 0, shift.scale, shift.dx * shift.scale, shift.dy * shift.scale);
  55283. }
  55284. if (sprite.type != "image" && skew) {
  55285. skew.origin = "0,0";
  55286. skew.matrix = matrix.toString();
  55287. offset = matrix.offset();
  55288. if (offset[0] > 32767) {
  55289. offset[0] = 32767;
  55290. } else if (offset[0] < -32768) {
  55291. offset[0] = -32768;
  55292. }
  55293. if (offset[1] > 32767) {
  55294. offset[1] = 32767;
  55295. } else if (offset[1] < -32768) {
  55296. offset[1] = -32768;
  55297. }
  55298. skew.offset = offset;
  55299. }
  55300. else {
  55301. domStyle.filter = matrix.toFilter();
  55302. domStyle.left = Math.min(
  55303. matrix.x(bbox.x, bbox.y),
  55304. matrix.x(bbox.x + bbox.width, bbox.y),
  55305. matrix.x(bbox.x, bbox.y + bbox.height),
  55306. matrix.x(bbox.x + bbox.width, bbox.y + bbox.height)) + 'px';
  55307. domStyle.top = Math.min(
  55308. matrix.y(bbox.x, bbox.y),
  55309. matrix.y(bbox.x + bbox.width, bbox.y),
  55310. matrix.y(bbox.x, bbox.y + bbox.height),
  55311. matrix.y(bbox.x + bbox.width, bbox.y + bbox.height)) + 'px';
  55312. }
  55313. },
  55314. createItem: function (config) {
  55315. return Ext.create('Ext.draw.Sprite', config);
  55316. },
  55317. getRegion: function () {
  55318. return this.el.getRegion();
  55319. },
  55320. addCls: function (sprite, className) {
  55321. if (sprite && sprite.el) {
  55322. sprite.el.addCls(className);
  55323. }
  55324. },
  55325. removeCls: function (sprite, className) {
  55326. if (sprite && sprite.el) {
  55327. sprite.el.removeCls(className);
  55328. }
  55329. },
  55330. addGradient: function (gradient) {
  55331. var gradients = this.gradientsColl || (this.gradientsColl = Ext.create('Ext.util.MixedCollection')),
  55332. colors = [],
  55333. stops = Ext.create('Ext.util.MixedCollection'),
  55334. keys,
  55335. items,
  55336. iLen,
  55337. key,
  55338. item,
  55339. i;
  55340. stops.addAll(gradient.stops);
  55341. stops.sortByKey("ASC", function (a, b) {
  55342. a = parseInt(a, 10);
  55343. b = parseInt(b, 10);
  55344. return a > b ? 1 : (a < b ? -1 : 0);
  55345. });
  55346. keys = stops.keys;
  55347. items = stops.items;
  55348. iLen = keys.length;
  55349. for (i = 0; i < iLen; i++) {
  55350. key = keys[i];
  55351. item = items[i];
  55352. colors.push(key + '% ' + item.color);
  55353. }
  55354. gradients.add(gradient.id, {
  55355. colors: colors.join(","),
  55356. angle: gradient.angle
  55357. });
  55358. },
  55359. destroy: function () {
  55360. var me = this;
  55361. me.callParent(arguments);
  55362. if (me.el) {
  55363. me.el.remove();
  55364. }
  55365. delete me.el;
  55366. }
  55367. });
  55368. Ext.define('Ext.flash.Component', {
  55369. extend: 'Ext.Component',
  55370. alternateClassName: 'Ext.FlashComponent',
  55371. alias: 'widget.flash',
  55372. flashVersion : '9.0.115',
  55373. backgroundColor: '#ffffff',
  55374. wmode: 'opaque',
  55375. swfWidth: '100%',
  55376. swfHeight: '100%',
  55377. expressInstall: false,
  55378. renderTpl: ['<div id="{swfId}"></div>'],
  55379. initComponent: function() {
  55380. this.callParent();
  55381. this.addEvents(
  55382. 'success',
  55383. 'failure'
  55384. );
  55385. },
  55386. beforeRender: function(){
  55387. this.callParent();
  55388. Ext.applyIf(this.renderData, {
  55389. swfId: this.getSwfId()
  55390. });
  55391. },
  55392. afterRender: function() {
  55393. var me = this,
  55394. flashParams = Ext.apply({}, me.flashParams),
  55395. flashVars = Ext.apply({}, me.flashVars);
  55396. me.callParent();
  55397. flashParams = Ext.apply({
  55398. allowScriptAccess: 'always',
  55399. bgcolor: me.backgroundColor,
  55400. wmode: me.wmode
  55401. }, flashParams);
  55402. flashVars = Ext.apply({
  55403. allowedDomain: document.location.hostname
  55404. }, flashVars);
  55405. new swfobject.embedSWF(
  55406. me.url,
  55407. me.getSwfId(),
  55408. me.swfWidth,
  55409. me.swfHeight,
  55410. me.flashVersion,
  55411. me.expressInstall ? me.statics.EXPRESS_INSTALL_URL : undefined,
  55412. flashVars,
  55413. flashParams,
  55414. me.flashAttributes,
  55415. Ext.bind(me.swfCallback, me)
  55416. );
  55417. },
  55418. swfCallback: function(e) {
  55419. var me = this;
  55420. if (e.success) {
  55421. me.swf = Ext.get(e.ref);
  55422. me.onSuccess();
  55423. me.fireEvent('success', me);
  55424. } else {
  55425. me.onFailure();
  55426. me.fireEvent('failure', me);
  55427. }
  55428. },
  55429. getSwfId: function() {
  55430. return this.swfId || (this.swfId = "extswf" + this.getAutoId());
  55431. },
  55432. onSuccess: function() {
  55433. this.swf.setStyle('visibility', 'inherit');
  55434. },
  55435. onFailure: Ext.emptyFn,
  55436. beforeDestroy: function() {
  55437. var me = this,
  55438. swf = me.swf;
  55439. if (swf) {
  55440. swfobject.removeSWF(me.getSwfId());
  55441. Ext.destroy(swf);
  55442. delete me.swf;
  55443. }
  55444. me.callParent();
  55445. },
  55446. statics: {
  55447. EXPRESS_INSTALL_URL: 'http:/' + '/swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf'
  55448. }
  55449. });
  55450. Ext.define('Ext.form.action.Action', {
  55451. alternateClassName: 'Ext.form.Action',
  55452. submitEmptyText : true,
  55453. constructor: function(config) {
  55454. if (config) {
  55455. Ext.apply(this, config);
  55456. }
  55457. var params = config.params;
  55458. if (Ext.isString(params)) {
  55459. this.params = Ext.Object.fromQueryString(params);
  55460. }
  55461. },
  55462. run: Ext.emptyFn,
  55463. onFailure : function(response){
  55464. this.response = response;
  55465. this.failureType = Ext.form.action.Action.CONNECT_FAILURE;
  55466. this.form.afterAction(this, false);
  55467. },
  55468. processResponse : function(response){
  55469. this.response = response;
  55470. if (!response.responseText && !response.responseXML) {
  55471. return true;
  55472. }
  55473. return (this.result = this.handleResponse(response));
  55474. },
  55475. getUrl: function() {
  55476. return this.url || this.form.url;
  55477. },
  55478. getMethod: function() {
  55479. return (this.method || this.form.method || 'POST').toUpperCase();
  55480. },
  55481. getParams: function() {
  55482. return Ext.apply({}, this.params, this.form.baseParams);
  55483. },
  55484. createCallback: function() {
  55485. var me = this,
  55486. undef,
  55487. form = me.form;
  55488. return {
  55489. success: me.onSuccess,
  55490. failure: me.onFailure,
  55491. scope: me,
  55492. timeout: (this.timeout * 1000) || (form.timeout * 1000),
  55493. upload: form.fileUpload ? me.onSuccess : undef
  55494. };
  55495. },
  55496. statics: {
  55497. CLIENT_INVALID: 'client',
  55498. SERVER_INVALID: 'server',
  55499. CONNECT_FAILURE: 'connect',
  55500. LOAD_FAILURE: 'load'
  55501. }
  55502. });
  55503. Ext.define('Ext.form.action.Load', {
  55504. extend:'Ext.form.action.Action',
  55505. requires: ['Ext.data.Connection'],
  55506. alternateClassName: 'Ext.form.Action.Load',
  55507. alias: 'formaction.load',
  55508. type: 'load',
  55509. run: function() {
  55510. Ext.Ajax.request(Ext.apply(
  55511. this.createCallback(),
  55512. {
  55513. method: this.getMethod(),
  55514. url: this.getUrl(),
  55515. headers: this.headers,
  55516. params: this.getParams()
  55517. }
  55518. ));
  55519. },
  55520. onSuccess: function(response){
  55521. var result = this.processResponse(response),
  55522. form = this.form;
  55523. if (result === true || !result.success || !result.data) {
  55524. this.failureType = Ext.form.action.Action.LOAD_FAILURE;
  55525. form.afterAction(this, false);
  55526. return;
  55527. }
  55528. form.clearInvalid();
  55529. form.setValues(result.data);
  55530. form.afterAction(this, true);
  55531. },
  55532. handleResponse: function(response) {
  55533. var reader = this.form.reader,
  55534. rs, data;
  55535. if (reader) {
  55536. rs = reader.read(response);
  55537. data = rs.records && rs.records[0] ? rs.records[0].data : null;
  55538. return {
  55539. success : rs.success,
  55540. data : data
  55541. };
  55542. }
  55543. return Ext.decode(response.responseText);
  55544. }
  55545. });
  55546. Ext.define('Ext.form.action.Submit', {
  55547. extend:'Ext.form.action.Action',
  55548. alternateClassName: 'Ext.form.Action.Submit',
  55549. alias: 'formaction.submit',
  55550. type: 'submit',
  55551. run : function(){
  55552. var form = this.form;
  55553. if (this.clientValidation === false || form.isValid()) {
  55554. this.doSubmit();
  55555. } else {
  55556. this.failureType = Ext.form.action.Action.CLIENT_INVALID;
  55557. form.afterAction(this, false);
  55558. }
  55559. },
  55560. doSubmit: function() {
  55561. var formEl,
  55562. ajaxOptions = Ext.apply(this.createCallback(), {
  55563. url: this.getUrl(),
  55564. method: this.getMethod(),
  55565. headers: this.headers
  55566. });
  55567. if (this.form.hasUpload()) {
  55568. formEl = ajaxOptions.form = this.buildForm();
  55569. ajaxOptions.isUpload = true;
  55570. } else {
  55571. ajaxOptions.params = this.getParams();
  55572. }
  55573. Ext.Ajax.request(ajaxOptions);
  55574. if (formEl) {
  55575. Ext.removeNode(formEl);
  55576. }
  55577. },
  55578. getParams: function() {
  55579. var nope = false,
  55580. configParams = this.callParent(),
  55581. fieldParams = this.form.getValues(nope, nope, this.submitEmptyText !== nope);
  55582. return Ext.apply({}, fieldParams, configParams);
  55583. },
  55584. buildForm: function() {
  55585. var fieldsSpec = [],
  55586. formSpec,
  55587. formEl,
  55588. basicForm = this.form,
  55589. params = this.getParams(),
  55590. uploadFields = [],
  55591. fields = basicForm.getFields().items,
  55592. f,
  55593. fLen = fields.length,
  55594. field, key, value, v, vLen,
  55595. u, uLen;
  55596. for (f = 0; f < fLen; f++) {
  55597. field = fields[f];
  55598. if (field.isFileUpload()) {
  55599. uploadFields.push(field);
  55600. }
  55601. }
  55602. function addField(name, val) {
  55603. fieldsSpec.push({
  55604. tag: 'input',
  55605. type: 'hidden',
  55606. name: name,
  55607. value: Ext.String.htmlEncode(val)
  55608. });
  55609. }
  55610. for (key in params) {
  55611. if (params.hasOwnProperty(key)) {
  55612. value = params[key];
  55613. if (Ext.isArray(value)) {
  55614. vLen = value.length;
  55615. for (v = 0; v < vLen; v++) {
  55616. addField(key, value[v]);
  55617. }
  55618. } else {
  55619. addField(key, value);
  55620. }
  55621. }
  55622. }
  55623. formSpec = {
  55624. tag: 'form',
  55625. action: this.getUrl(),
  55626. method: this.getMethod(),
  55627. target: this.target || '_self',
  55628. style: 'display:none',
  55629. cn: fieldsSpec
  55630. };
  55631. if (uploadFields.length) {
  55632. formSpec.encoding = formSpec.enctype = 'multipart/form-data';
  55633. }
  55634. formEl = Ext.DomHelper.append(Ext.getBody(), formSpec);
  55635. uLen = uploadFields.length;
  55636. for (u = 0; u < uLen; u++) {
  55637. field = uploadFields[u];
  55638. if (field.rendered) {
  55639. formEl.appendChild(field.extractFileInput());
  55640. }
  55641. }
  55642. return formEl;
  55643. },
  55644. onSuccess: function(response) {
  55645. var form = this.form,
  55646. success = true,
  55647. result = this.processResponse(response);
  55648. if (result !== true && !result.success) {
  55649. if (result.errors) {
  55650. form.markInvalid(result.errors);
  55651. }
  55652. this.failureType = Ext.form.action.Action.SERVER_INVALID;
  55653. success = false;
  55654. }
  55655. form.afterAction(this, success);
  55656. },
  55657. handleResponse: function(response) {
  55658. var form = this.form,
  55659. errorReader = form.errorReader,
  55660. rs, errors, i, len, records;
  55661. if (errorReader) {
  55662. rs = errorReader.read(response);
  55663. records = rs.records;
  55664. errors = [];
  55665. if (records) {
  55666. for(i = 0, len = records.length; i < len; i++) {
  55667. errors[i] = records[i].data;
  55668. }
  55669. }
  55670. if (errors.length < 1) {
  55671. errors = null;
  55672. }
  55673. return {
  55674. success : rs.success,
  55675. errors : errors
  55676. };
  55677. }
  55678. return Ext.decode(response.responseText);
  55679. }
  55680. });
  55681. Ext.define('Ext.util.ComponentDragger', {
  55682. extend: 'Ext.dd.DragTracker',
  55683. autoStart: 500,
  55684. constructor: function(comp, config) {
  55685. this.comp = comp;
  55686. this.initialConstrainTo = config.constrainTo;
  55687. this.callParent([ config ]);
  55688. },
  55689. onStart: function(e) {
  55690. var me = this,
  55691. comp = me.comp;
  55692. this.startPosition = comp.el.getXY();
  55693. if (comp.ghost && !comp.liveDrag) {
  55694. me.proxy = comp.ghost();
  55695. me.dragTarget = me.proxy.header.el;
  55696. }
  55697. if (me.constrain || me.constrainDelegate) {
  55698. me.constrainTo = me.calculateConstrainRegion();
  55699. }
  55700. if (comp.beginDrag) {
  55701. comp.beginDrag();
  55702. }
  55703. },
  55704. calculateConstrainRegion: function() {
  55705. var me = this,
  55706. comp = me.comp,
  55707. c = me.initialConstrainTo,
  55708. delegateRegion,
  55709. elRegion,
  55710. dragEl = me.proxy ? me.proxy.el : comp.el,
  55711. shadowSize = (!me.constrainDelegate && dragEl.shadow && !dragEl.shadowDisabled) ? dragEl.shadow.getShadowSize() : 0;
  55712. if (!(c instanceof Ext.util.Region)) {
  55713. c = Ext.fly(c).getViewRegion();
  55714. }
  55715. if (shadowSize) {
  55716. c.adjust(shadowSize[0], -shadowSize[1], -shadowSize[2], shadowSize[3]);
  55717. }
  55718. if (!me.constrainDelegate) {
  55719. delegateRegion = Ext.fly(me.dragTarget).getRegion();
  55720. elRegion = dragEl.getRegion();
  55721. c.adjust(
  55722. delegateRegion.top - elRegion.top,
  55723. delegateRegion.right - elRegion.right,
  55724. delegateRegion.bottom - elRegion.bottom,
  55725. delegateRegion.left - elRegion.left
  55726. );
  55727. }
  55728. return c;
  55729. },
  55730. onDrag: function(e) {
  55731. var me = this,
  55732. comp = (me.proxy && !me.comp.liveDrag) ? me.proxy : me.comp,
  55733. offset = me.getOffset(me.constrain || me.constrainDelegate ? 'dragTarget' : null);
  55734. comp.setPagePosition(me.startPosition[0] + offset[0], me.startPosition[1] + offset[1]);
  55735. },
  55736. onEnd: function(e) {
  55737. var comp = this.comp;
  55738. if (this.proxy && !comp.liveDrag) {
  55739. comp.unghost();
  55740. }
  55741. if (comp.endDrag) {
  55742. comp.endDrag();
  55743. }
  55744. }
  55745. });
  55746. Ext.define('Ext.window.Window', {
  55747. extend: 'Ext.panel.Panel',
  55748. alternateClassName: 'Ext.Window',
  55749. requires: ['Ext.util.ComponentDragger', 'Ext.util.Region', 'Ext.EventManager'],
  55750. alias: 'widget.window',
  55751. baseCls: Ext.baseCSSPrefix + 'window',
  55752. resizable: true,
  55753. draggable: true,
  55754. constrain: false,
  55755. constrainHeader: false,
  55756. plain: false,
  55757. minimizable: false,
  55758. maximizable: false,
  55759. minHeight: 50,
  55760. minWidth: 50,
  55761. expandOnShow: true,
  55762. collapsible: false,
  55763. closable: true,
  55764. hidden: true,
  55765. autoRender: true,
  55766. hideMode: 'offsets',
  55767. floating: true,
  55768. ariaRole: 'alertdialog',
  55769. itemCls: Ext.baseCSSPrefix + 'window-item',
  55770. initialAlphaNum: /^[a-z0-9]/,
  55771. overlapHeader: true,
  55772. ignoreHeaderBorderManagement: true,
  55773. alwaysFramed: true,
  55774. isWindow: true,
  55775. initComponent: function() {
  55776. var me = this;
  55777. me.frame = false;
  55778. me.callParent();
  55779. me.addEvents(
  55780. 'resize',
  55781. 'maximize',
  55782. 'minimize',
  55783. 'restore'
  55784. );
  55785. if (me.plain) {
  55786. me.addClsWithUI('plain');
  55787. }
  55788. if (me.modal) {
  55789. me.ariaRole = 'dialog';
  55790. }
  55791. if (me.floating) {
  55792. me.on({
  55793. element: 'el',
  55794. mousedown: me.onMouseDown,
  55795. scope: me
  55796. });
  55797. }
  55798. me.addStateEvents(['maximize', 'restore', 'resize', 'dragend']);
  55799. },
  55800. getElConfig: function () {
  55801. var me = this,
  55802. elConfig;
  55803. elConfig = me.callParent();
  55804. elConfig.tabIndex = -1;
  55805. return elConfig;
  55806. },
  55807. getState: function() {
  55808. var me = this,
  55809. state = me.callParent() || {},
  55810. maximized = !!me.maximized;
  55811. state.maximized = maximized;
  55812. Ext.apply(state, {
  55813. size: maximized ? me.restoreSize : me.getSize(),
  55814. pos: maximized ? me.restorePos : me.getPosition()
  55815. });
  55816. return state;
  55817. },
  55818. applyState: function(state){
  55819. var me = this;
  55820. if (state) {
  55821. me.maximized = state.maximized;
  55822. if (me.maximized) {
  55823. me.hasSavedRestore = true;
  55824. me.restoreSize = state.size;
  55825. me.restorePos = state.pos;
  55826. } else {
  55827. Ext.apply(me, {
  55828. width: state.size.width,
  55829. height: state.size.height,
  55830. x: state.pos[0],
  55831. y: state.pos[1]
  55832. });
  55833. }
  55834. }
  55835. },
  55836. onMouseDown: function (e) {
  55837. var preventFocus;
  55838. if (this.floating) {
  55839. if (Ext.fly(e.getTarget()).focusable()) {
  55840. preventFocus = true;
  55841. }
  55842. this.toFront(preventFocus);
  55843. }
  55844. },
  55845. onRender: function(ct, position) {
  55846. var me = this;
  55847. me.callParent(arguments);
  55848. me.focusEl = me.el;
  55849. if (me.maximizable) {
  55850. me.header.on({
  55851. scope: me,
  55852. dblclick: me.toggleMaximize
  55853. });
  55854. }
  55855. },
  55856. afterRender: function() {
  55857. var me = this,
  55858. keyMap;
  55859. me.callParent();
  55860. if (me.maximized) {
  55861. me.maximized = false;
  55862. me.maximize();
  55863. }
  55864. if (me.closable) {
  55865. keyMap = me.getKeyMap();
  55866. keyMap.on(27, me.onEsc, me);
  55867. } else {
  55868. keyMap = me.keyMap;
  55869. }
  55870. if (keyMap && me.hidden) {
  55871. keyMap.disable();
  55872. }
  55873. },
  55874. initDraggable: function() {
  55875. var me = this,
  55876. ddConfig;
  55877. if (!me.header) {
  55878. me.updateHeader(true);
  55879. }
  55880. if (me.header) {
  55881. ddConfig = Ext.applyIf({
  55882. el: me.el,
  55883. delegate: '#' + Ext.escapeId(me.header.id)
  55884. }, me.draggable);
  55885. if (me.constrain || me.constrainHeader) {
  55886. ddConfig.constrain = me.constrain;
  55887. ddConfig.constrainDelegate = me.constrainHeader;
  55888. ddConfig.constrainTo = me.constrainTo || me.container;
  55889. }
  55890. me.dd = new Ext.util.ComponentDragger(this, ddConfig);
  55891. me.relayEvents(me.dd, ['dragstart', 'drag', 'dragend']);
  55892. }
  55893. },
  55894. onEsc: function(k, e) {
  55895. if (!Ext.FocusManager || !Ext.FocusManager.enabled || Ext.FocusManager.focusedCmp === this) {
  55896. e.stopEvent();
  55897. this.close();
  55898. }
  55899. },
  55900. beforeDestroy: function() {
  55901. var me = this;
  55902. if (me.rendered) {
  55903. delete this.animateTarget;
  55904. me.hide();
  55905. Ext.destroy(
  55906. me.keyMap
  55907. );
  55908. }
  55909. me.callParent();
  55910. },
  55911. addTools: function() {
  55912. var me = this;
  55913. me.callParent();
  55914. if (me.minimizable) {
  55915. me.addTool({
  55916. type: 'minimize',
  55917. handler: Ext.Function.bind(me.minimize, me, [])
  55918. });
  55919. }
  55920. if (me.maximizable) {
  55921. me.addTool({
  55922. type: 'maximize',
  55923. handler: Ext.Function.bind(me.maximize, me, [])
  55924. });
  55925. me.addTool({
  55926. type: 'restore',
  55927. handler: Ext.Function.bind(me.restore, me, []),
  55928. hidden: true
  55929. });
  55930. }
  55931. },
  55932. getFocusEl: function() {
  55933. return this.getDefaultFocus();
  55934. },
  55935. getDefaultFocus: function() {
  55936. var me = this,
  55937. result,
  55938. defaultComp = me.defaultButton || me.defaultFocus,
  55939. selector;
  55940. if (defaultComp !== undefined) {
  55941. if (Ext.isNumber(defaultComp)) {
  55942. result = me.query('button')[defaultComp];
  55943. }
  55944. else if (Ext.isString(defaultComp)) {
  55945. selector = defaultComp;
  55946. if (selector.match(me.initialAlphaNum)) {
  55947. result = me.down('#' + selector);
  55948. }
  55949. if (!result) {
  55950. result = me.down(selector);
  55951. }
  55952. }
  55953. else if (defaultComp.focus) {
  55954. result = defaultComp;
  55955. }
  55956. }
  55957. return result || me.el;
  55958. },
  55959. onFocus: function() {
  55960. var me = this,
  55961. focusDescendant;
  55962. if ((Ext.FocusManager && Ext.FocusManager.enabled) || ((focusDescendant = me.getDefaultFocus()) === me)) {
  55963. me.callParent(arguments);
  55964. } else {
  55965. focusDescendant.focus();
  55966. }
  55967. },
  55968. beforeLayout: function () {
  55969. var shadow = this.el.shadow;
  55970. this.callParent();
  55971. if (shadow) {
  55972. shadow.hide();
  55973. }
  55974. },
  55975. onShow: function() {
  55976. var me = this;
  55977. me.callParent(arguments);
  55978. if (me.expandOnShow) {
  55979. me.expand(false);
  55980. }
  55981. me.syncMonitorWindowResize();
  55982. if (me.keyMap) {
  55983. me.keyMap.enable();
  55984. }
  55985. },
  55986. doClose: function() {
  55987. var me = this;
  55988. if (me.hidden) {
  55989. me.fireEvent('close', me);
  55990. if (me.closeAction == 'destroy') {
  55991. this.destroy();
  55992. }
  55993. } else {
  55994. me.hide(me.animateTarget, me.doClose, me);
  55995. }
  55996. },
  55997. afterHide: function() {
  55998. var me = this;
  55999. me.syncMonitorWindowResize();
  56000. if (me.keyMap) {
  56001. me.keyMap.disable();
  56002. }
  56003. me.callParent(arguments);
  56004. },
  56005. onWindowResize: function() {
  56006. var me = this,
  56007. sizeModel;
  56008. if (me.maximized) {
  56009. me.fitContainer();
  56010. } else {
  56011. sizeModel = me.getSizeModel();
  56012. if (sizeModel.width.natural || sizeModel.height.natural) {
  56013. me.updateLayout();
  56014. }
  56015. }
  56016. me.doConstrain();
  56017. },
  56018. minimize: function() {
  56019. this.fireEvent('minimize', this);
  56020. return this;
  56021. },
  56022. afterCollapse: function() {
  56023. var me = this;
  56024. if (me.maximizable) {
  56025. me.tools.maximize.hide();
  56026. me.tools.restore.hide();
  56027. }
  56028. if (me.resizer) {
  56029. me.resizer.disable();
  56030. }
  56031. me.callParent(arguments);
  56032. },
  56033. afterExpand: function() {
  56034. var me = this;
  56035. if (me.maximized) {
  56036. me.tools.restore.show();
  56037. } else if (me.maximizable) {
  56038. me.tools.maximize.show();
  56039. }
  56040. if (me.resizer) {
  56041. me.resizer.enable();
  56042. }
  56043. me.callParent(arguments);
  56044. },
  56045. maximize: function() {
  56046. var me = this;
  56047. if (!me.maximized) {
  56048. me.expand(false);
  56049. if (!me.hasSavedRestore) {
  56050. me.restoreSize = me.getSize();
  56051. me.restorePos = me.getPosition(true);
  56052. }
  56053. if (me.maximizable) {
  56054. me.tools.maximize.hide();
  56055. me.tools.restore.show();
  56056. }
  56057. me.maximized = true;
  56058. me.el.disableShadow();
  56059. if (me.dd) {
  56060. me.dd.disable();
  56061. }
  56062. if (me.resizer) {
  56063. me.resizer.disable();
  56064. }
  56065. if (me.collapseTool) {
  56066. me.collapseTool.hide();
  56067. }
  56068. me.el.addCls(Ext.baseCSSPrefix + 'window-maximized');
  56069. me.container.addCls(Ext.baseCSSPrefix + 'window-maximized-ct');
  56070. me.syncMonitorWindowResize();
  56071. me.fitContainer();
  56072. me.fireEvent('maximize', me);
  56073. }
  56074. return me;
  56075. },
  56076. restore: function() {
  56077. var me = this,
  56078. tools = me.tools;
  56079. if (me.maximized) {
  56080. delete me.hasSavedRestore;
  56081. me.removeCls(Ext.baseCSSPrefix + 'window-maximized');
  56082. if (tools.restore) {
  56083. tools.restore.hide();
  56084. }
  56085. if (tools.maximize) {
  56086. tools.maximize.show();
  56087. }
  56088. if (me.collapseTool) {
  56089. me.collapseTool.show();
  56090. }
  56091. me.maximized = false;
  56092. me.setPosition(me.restorePos);
  56093. me.setSize(me.restoreSize);
  56094. delete me.restorePos;
  56095. delete me.restoreSize;
  56096. me.el.enableShadow(true);
  56097. if (me.dd) {
  56098. me.dd.enable();
  56099. }
  56100. if (me.resizer) {
  56101. me.resizer.enable();
  56102. }
  56103. me.container.removeCls(Ext.baseCSSPrefix + 'window-maximized-ct');
  56104. me.syncMonitorWindowResize();
  56105. me.doConstrain();
  56106. me.fireEvent('restore', me);
  56107. }
  56108. return me;
  56109. },
  56110. syncMonitorWindowResize: function () {
  56111. var me = this,
  56112. currentlyMonitoring = me._monitoringResize,
  56113. yes = me.monitorResize || me.constrain || me.constrainHeader || me.maximized,
  56114. veto = me.hidden || me.destroying || me.isDestroyed;
  56115. if (yes && !veto) {
  56116. if (!currentlyMonitoring) {
  56117. Ext.EventManager.onWindowResize(me.onWindowResize, me);
  56118. me._monitoringResize = true;
  56119. }
  56120. } else if (currentlyMonitoring) {
  56121. Ext.EventManager.removeResizeListener(me.onWindowResize, me);
  56122. me._monitoringResize = false;
  56123. }
  56124. },
  56125. toggleMaximize: function() {
  56126. return this[this.maximized ? 'restore': 'maximize']();
  56127. }
  56128. });
  56129. Ext.define('Ext.layout.component.field.Field', {
  56130. extend: 'Ext.layout.component.Auto',
  56131. alias: 'layout.field',
  56132. uses: ['Ext.tip.QuickTip', 'Ext.util.TextMetrics', 'Ext.util.CSS'],
  56133. type: 'field',
  56134. naturalSizingProp: 'size',
  56135. beginLayout: function(ownerContext) {
  56136. var me = this,
  56137. owner = me.owner,
  56138. widthModel = ownerContext.widthModel,
  56139. ownerNaturalSize = owner[me.naturalSizingProp],
  56140. width;
  56141. me.callParent(arguments);
  56142. ownerContext.labelStrategy = me.getLabelStrategy();
  56143. ownerContext.errorStrategy = me.getErrorStrategy();
  56144. ownerContext.labelContext = ownerContext.getEl('labelEl');
  56145. ownerContext.bodyCellContext = ownerContext.getEl('bodyEl');
  56146. ownerContext.inputContext = ownerContext.getEl('inputEl');
  56147. ownerContext.errorContext = ownerContext.getEl('errorEl');
  56148. if ((Ext.isIE6 || Ext.isIE7) && Ext.isStrict && ownerContext.inputContext) {
  56149. me.ieInputWidthAdjustment = ownerContext.inputContext.getPaddingInfo().width + ownerContext.inputContext.getBorderInfo().width;
  56150. }
  56151. ownerContext.labelStrategy.prepare(ownerContext, owner);
  56152. ownerContext.errorStrategy.prepare(ownerContext, owner);
  56153. if (widthModel.shrinkWrap) {
  56154. me.beginLayoutShrinkWrap(ownerContext);
  56155. } else if (widthModel.natural) {
  56156. if (typeof ownerNaturalSize == 'number' && !owner.inputWidth) {
  56157. me.beginLayoutFixed(ownerContext, (width = ownerNaturalSize * 6.5 + 20), 'px');
  56158. }
  56159. else {
  56160. me.beginLayoutShrinkWrap(ownerContext);
  56161. }
  56162. ownerContext.setWidth(width, false);
  56163. } else {
  56164. me.beginLayoutFixed(ownerContext, '100', '%');
  56165. }
  56166. },
  56167. beginLayoutFixed: function (ownerContext, width, suffix) {
  56168. var owner = ownerContext.target,
  56169. inputEl = owner.inputEl,
  56170. inputWidth = owner.inputWidth;
  56171. owner.el.setStyle('table-layout', 'fixed');
  56172. owner.bodyEl.setStyle('width', width + suffix);
  56173. if (inputEl && inputWidth) {
  56174. inputEl.setStyle('width', inputWidth + 'px');
  56175. }
  56176. ownerContext.isFixed = true;
  56177. },
  56178. beginLayoutShrinkWrap: function (ownerContext) {
  56179. var owner = ownerContext.target,
  56180. inputEl = owner.inputEl,
  56181. inputWidth = owner.inputWidth;
  56182. if (inputEl && inputEl.dom) {
  56183. inputEl.dom.removeAttribute('size');
  56184. if (inputWidth) {
  56185. inputEl.setStyle('width', inputWidth + 'px');
  56186. }
  56187. }
  56188. owner.el.setStyle('table-layout', 'auto');
  56189. owner.bodyEl.setStyle('width', '');
  56190. },
  56191. finishedLayout: function(ownerContext){
  56192. var owner = this.owner;
  56193. this.callParent(arguments);
  56194. ownerContext.labelStrategy.finishedLayout(ownerContext, owner);
  56195. ownerContext.errorStrategy.finishedLayout(ownerContext, owner);
  56196. },
  56197. calculateOwnerHeightFromContentHeight: function(ownerContext, contentHeight) {
  56198. return contentHeight;
  56199. },
  56200. measureContentHeight: function (ownerContext) {
  56201. return ownerContext.el.getHeight();
  56202. },
  56203. measureContentWidth: function (ownerContext) {
  56204. return ownerContext.el.getWidth();
  56205. },
  56206. measureLabelErrorHeight: function (ownerContext) {
  56207. return ownerContext.labelStrategy.getHeight(ownerContext) +
  56208. ownerContext.errorStrategy.getHeight(ownerContext);
  56209. },
  56210. onFocus: function() {
  56211. this.getErrorStrategy().onFocus(this.owner);
  56212. },
  56213. getLabelStrategy: function() {
  56214. var me = this,
  56215. strategies = me.labelStrategies,
  56216. labelAlign = me.owner.labelAlign;
  56217. return strategies[labelAlign] || strategies.base;
  56218. },
  56219. getErrorStrategy: function() {
  56220. var me = this,
  56221. owner = me.owner,
  56222. strategies = me.errorStrategies,
  56223. msgTarget = owner.msgTarget;
  56224. return !owner.preventMark && Ext.isString(msgTarget) ?
  56225. (strategies[msgTarget] || strategies.elementId) :
  56226. strategies.none;
  56227. },
  56228. labelStrategies: (function() {
  56229. var base = {
  56230. prepare: function(ownerContext, owner) {
  56231. var cls = owner.labelCls + '-' + owner.labelAlign,
  56232. labelEl = owner.labelEl;
  56233. if (labelEl) {
  56234. labelEl.addCls(cls);
  56235. }
  56236. },
  56237. getHeight: function () {
  56238. return 0;
  56239. },
  56240. finishedLayout: Ext.emptyFn
  56241. };
  56242. return {
  56243. base: base,
  56244. top: Ext.applyIf({
  56245. getHeight: function (ownerContext) {
  56246. var labelContext = ownerContext.labelContext,
  56247. props = labelContext.props,
  56248. height = props.height;
  56249. if (height === undefined) {
  56250. props.height = height = labelContext.el.getHeight();
  56251. }
  56252. return height;
  56253. }
  56254. }, base),
  56255. left: base,
  56256. right: base
  56257. };
  56258. }()),
  56259. errorStrategies: (function() {
  56260. function showTip(owner) {
  56261. var tip = Ext.layout.component.field.Field.tip,
  56262. target;
  56263. if (tip && tip.isVisible()) {
  56264. target = tip.activeTarget;
  56265. if (target && target.el === owner.getActionEl().dom) {
  56266. tip.toFront(true);
  56267. }
  56268. }
  56269. }
  56270. var applyIf = Ext.applyIf,
  56271. emptyFn = Ext.emptyFn,
  56272. iconCls = Ext.baseCSSPrefix + 'form-invalid-icon',
  56273. iconWidth,
  56274. base = {
  56275. prepare: function(ownerContext, owner) {
  56276. var el = owner.errorEl;
  56277. if (el) {
  56278. el.setDisplayed(false);
  56279. }
  56280. },
  56281. getHeight: function () {
  56282. return 0;
  56283. },
  56284. onFocus: emptyFn,
  56285. finishedLayout: emptyFn
  56286. };
  56287. return {
  56288. none: base,
  56289. side: applyIf({
  56290. prepare: function(ownerContext, owner) {
  56291. var errorEl = owner.errorEl,
  56292. sideErrorCell = owner.sideErrorCell,
  56293. displayError = owner.hasActiveError(),
  56294. tempEl;
  56295. if (!iconWidth) {
  56296. iconWidth = (tempEl = Ext.getBody().createChild({style: 'position:absolute', cls: iconCls})).getWidth();
  56297. tempEl.remove();
  56298. }
  56299. errorEl.addCls(iconCls);
  56300. errorEl.set({'data-errorqtip': owner.getActiveError() || ''});
  56301. if (owner.autoFitErrors) {
  56302. errorEl.setDisplayed(displayError);
  56303. }
  56304. else {
  56305. errorEl.setVisible(displayError);
  56306. }
  56307. if (sideErrorCell && owner.autoFitErrors) {
  56308. sideErrorCell.setDisplayed(displayError);
  56309. }
  56310. owner.bodyEl.dom.colSpan = owner.getBodyColspan();
  56311. Ext.layout.component.field.Field.initTip();
  56312. },
  56313. onFocus: showTip
  56314. }, base),
  56315. under: applyIf({
  56316. prepare: function(ownerContext, owner) {
  56317. var errorEl = owner.errorEl,
  56318. cls = Ext.baseCSSPrefix + 'form-invalid-under';
  56319. errorEl.addCls(cls);
  56320. errorEl.setDisplayed(owner.hasActiveError());
  56321. },
  56322. getHeight: function (ownerContext) {
  56323. var height = 0,
  56324. errorContext, props;
  56325. if (ownerContext.target.hasActiveError()) {
  56326. errorContext = ownerContext.errorContext;
  56327. props = errorContext.props;
  56328. height = props.height;
  56329. if (height === undefined) {
  56330. props.height = height = errorContext.el.getHeight();
  56331. }
  56332. }
  56333. return height;
  56334. }
  56335. }, base),
  56336. qtip: applyIf({
  56337. prepare: function(ownerContext, owner) {
  56338. Ext.layout.component.field.Field.initTip();
  56339. owner.getActionEl().set({'data-errorqtip': owner.getActiveError() || ''});
  56340. },
  56341. onFocus: showTip
  56342. }, base),
  56343. title: applyIf({
  56344. prepare: function(ownerContext, owner) {
  56345. owner.el.set({'title': owner.getActiveError() || ''});
  56346. }
  56347. }, base),
  56348. elementId: applyIf({
  56349. prepare: function(ownerContext, owner) {
  56350. var targetEl = Ext.fly(owner.msgTarget);
  56351. if (targetEl) {
  56352. targetEl.dom.innerHTML = owner.getActiveError() || '';
  56353. targetEl.setDisplayed(owner.hasActiveError());
  56354. }
  56355. }
  56356. }, base)
  56357. };
  56358. }()),
  56359. statics: {
  56360. initTip: function() {
  56361. var tip = this.tip;
  56362. if (!tip) {
  56363. tip = this.tip = Ext.create('Ext.tip.QuickTip', {
  56364. baseCls: Ext.baseCSSPrefix + 'form-invalid-tip'
  56365. });
  56366. tip.tagConfig = Ext.apply({}, {attribute: 'errorqtip'}, tip.tagConfig);
  56367. }
  56368. },
  56369. destroyTip: function() {
  56370. var tip = this.tip;
  56371. if (tip) {
  56372. tip.destroy();
  56373. delete this.tip;
  56374. }
  56375. }
  56376. }
  56377. });
  56378. Ext.define('Ext.layout.component.field.Text', {
  56379. extend: 'Ext.layout.component.field.Field',
  56380. alias: 'layout.textfield',
  56381. requires: ['Ext.util.TextMetrics'],
  56382. type: 'textfield',
  56383. canGrowWidth: true,
  56384. beginLayoutCycle: function(ownerContext) {
  56385. var me = this;
  56386. me.callParent(arguments);
  56387. if (ownerContext.shrinkWrap) {
  56388. ownerContext.inputContext.el.setStyle('height', '');
  56389. }
  56390. },
  56391. measureContentWidth: function (ownerContext) {
  56392. var me = this,
  56393. owner = me.owner,
  56394. width = me.callParent(arguments),
  56395. inputContext = ownerContext.inputContext,
  56396. inputEl, value, calcWidth, max, min;
  56397. if (owner.grow && me.canGrowWidth && !ownerContext.state.growHandled) {
  56398. inputEl = owner.inputEl;
  56399. value = Ext.util.Format.htmlEncode(inputEl.dom.value || (owner.hasFocus ? '' : owner.emptyText) || '');
  56400. value += owner.growAppend;
  56401. calcWidth = inputEl.getTextWidth(value) + inputContext.getFrameInfo().width;
  56402. max = owner.growMax;
  56403. min = Math.min(max, width);
  56404. max = Math.max(owner.growMin, max, min);
  56405. calcWidth = Ext.Number.constrain(calcWidth, owner.growMin, max);
  56406. inputContext.setWidth(calcWidth);
  56407. ownerContext.state.growHandled = true;
  56408. inputContext.domBlock(me, 'width');
  56409. width = NaN;
  56410. }
  56411. return width;
  56412. },
  56413. publishInnerHeight: function(ownerContext, height) {
  56414. ownerContext.inputContext.setHeight(height - this.measureLabelErrorHeight(ownerContext));
  56415. },
  56416. beginLayoutFixed: function(ownerContext, width, suffix) {
  56417. var me = this,
  56418. ieInputWidthAdjustment = me.ieInputWidthAdjustment;
  56419. if (ieInputWidthAdjustment) {
  56420. me.owner.bodyEl.setStyle('padding-right', ieInputWidthAdjustment + 'px');
  56421. if(suffix === 'px') {
  56422. width -= ieInputWidthAdjustment;
  56423. }
  56424. }
  56425. me.callParent(arguments);
  56426. }
  56427. });
  56428. Ext.define("Ext.form.Labelable", {
  56429. requires: ['Ext.XTemplate'],
  56430. autoEl: {
  56431. tag: 'table',
  56432. cellpadding: 0
  56433. },
  56434. childEls: [
  56435. 'labelCell',
  56436. 'labelEl',
  56437. 'bodyEl',
  56438. 'sideErrorCell',
  56439. 'errorEl',
  56440. 'inputRow',
  56441. 'bottomPlaceHolder'
  56442. ],
  56443. labelableRenderTpl: [
  56444. '<tr id="{id}-inputRow" <tpl if="inFormLayout">id="{id}"</tpl>>',
  56445. '<tpl if="labelOnLeft">',
  56446. '<td id="{id}-labelCell" style="{labelCellStyle}" {labelCellAttrs}>',
  56447. '{beforeLabelTpl}',
  56448. '<label id="{id}-labelEl" {labelAttrTpl}<tpl if="inputId"> for="{inputId}"</tpl> class="{labelCls}"',
  56449. '<tpl if="labelStyle"> style="{labelStyle}"</tpl>>',
  56450. '{beforeLabelTextTpl}',
  56451. '<tpl if="fieldLabel">{fieldLabel}{labelSeparator}</tpl>',
  56452. '{afterLabelTextTpl}',
  56453. '</label>',
  56454. '{afterLabelTpl}',
  56455. '</td>',
  56456. '</tpl>',
  56457. '<td class="{baseBodyCls} {fieldBodyCls}" id="{id}-bodyEl" colspan="{bodyColspan}" role="presentation">',
  56458. '{beforeBodyEl}',
  56459. '<tpl if="labelAlign==\'top\'">',
  56460. '{beforeLabelTpl}',
  56461. '<div id="{id}-labelCell" style="{labelCellStyle}">',
  56462. '<label id="{id}-labelEl" {labelAttrTpl}<tpl if="inputId"> for="{inputId}"</tpl> class="{labelCls}"',
  56463. '<tpl if="labelStyle"> style="{labelStyle}"</tpl>>',
  56464. '{beforeLabelTextTpl}',
  56465. '<tpl if="fieldLabel">{fieldLabel}{labelSeparator}</tpl>',
  56466. '{afterLabelTextTpl}',
  56467. '</label>',
  56468. '</div>',
  56469. '{afterLabelTpl}',
  56470. '</tpl>',
  56471. '{beforeSubTpl}',
  56472. '{[values.$comp.getSubTplMarkup()]}',
  56473. '{afterSubTpl}',
  56474. '<tpl if="msgTarget===\'side\'">',
  56475. '{afterBodyEl}',
  56476. '</td>',
  56477. '<td id="{id}-sideErrorCell" vAlign="{[values.labelAlign===\'top\' && !values.hideLabel ? \'bottom\' : \'middle\']}" style="{[values.autoFitErrors ? \'display:none\' : \'\']}" width="{errorIconWidth}">',
  56478. '<div id="{id}-errorEl" class="{errorMsgCls}" style="display:none;width:{errorIconWidth}px"></div>',
  56479. '</td>',
  56480. '<tpl elseif="msgTarget==\'under\'">',
  56481. '<div id="{id}-errorEl" class="{errorMsgClass}" colspan="2" style="display:none"></div>',
  56482. '{afterBodyEl}',
  56483. '</td>',
  56484. '</tpl>',
  56485. '</tr>',
  56486. {
  56487. disableFormats: true
  56488. }
  56489. ],
  56490. activeErrorsTpl: [
  56491. '<tpl if="errors && errors.length">',
  56492. '<ul><tpl for="errors"><li>{.}</li></tpl></ul>',
  56493. '</tpl>'
  56494. ],
  56495. isFieldLabelable: true,
  56496. formItemCls: Ext.baseCSSPrefix + 'form-item',
  56497. labelCls: Ext.baseCSSPrefix + 'form-item-label',
  56498. errorMsgCls: Ext.baseCSSPrefix + 'form-error-msg',
  56499. baseBodyCls: Ext.baseCSSPrefix + 'form-item-body',
  56500. fieldBodyCls: '',
  56501. clearCls: Ext.baseCSSPrefix + 'clear',
  56502. invalidCls : Ext.baseCSSPrefix + 'form-invalid',
  56503. fieldLabel: undefined,
  56504. labelAlign : 'left',
  56505. labelWidth: 100,
  56506. labelPad : 5,
  56507. labelSeparator : ':',
  56508. hideLabel: false,
  56509. hideEmptyLabel: true,
  56510. preventMark: false,
  56511. autoFitErrors: true,
  56512. msgTarget: 'qtip',
  56513. noWrap: true,
  56514. labelableInsertions: [
  56515. 'beforeBodyEl',
  56516. 'afterBodyEl',
  56517. 'beforeLabelTpl',
  56518. 'afterLabelTpl',
  56519. 'beforeSubTpl',
  56520. 'afterSubTpl',
  56521. 'beforeLabelTextTpl',
  56522. 'afterLabelTextTpl',
  56523. 'labelAttrTpl'
  56524. ],
  56525. labelableRenderProps: [ 'allowBlank', 'id', 'labelAlign', 'fieldBodyCls', 'baseBodyCls',
  56526. 'clearCls', 'labelSeparator', 'msgTarget' ],
  56527. initLabelable: function() {
  56528. var me = this,
  56529. padding = me.padding;
  56530. if (padding) {
  56531. me.padding = undefined;
  56532. me.extraMargins = Ext.Element.parseBox(padding);
  56533. }
  56534. me.addCls(me.formItemCls);
  56535. me.lastActiveError = '';
  56536. me.addEvents(
  56537. 'errorchange'
  56538. );
  56539. },
  56540. trimLabelSeparator: function() {
  56541. var me = this,
  56542. separator = me.labelSeparator,
  56543. label = me.fieldLabel || '',
  56544. lastChar = label.substr(label.length - 1);
  56545. return lastChar === separator ? label.slice(0, -1) : label;
  56546. },
  56547. getFieldLabel: function() {
  56548. return this.trimLabelSeparator();
  56549. },
  56550. setFieldLabel: function(label){
  56551. label = label || '';
  56552. var me = this,
  56553. separator = me.labelSeparator,
  56554. labelEl = me.labelEl;
  56555. me.fieldLabel = label;
  56556. if (me.rendered) {
  56557. if (Ext.isEmpty(label) && me.hideEmptyLabel) {
  56558. labelEl.parent().setDisplayed('none');
  56559. } else {
  56560. if (separator) {
  56561. label = me.trimLabelSeparator() + separator;
  56562. }
  56563. labelEl.update(label);
  56564. labelEl.parent().setDisplayed('');
  56565. }
  56566. me.updateLayout();
  56567. }
  56568. },
  56569. getInsertionRenderData: function (data, names) {
  56570. var i = names.length,
  56571. name, value;
  56572. while (i--) {
  56573. name = names[i];
  56574. value = this[name];
  56575. if (value) {
  56576. if (typeof value != 'string') {
  56577. if (!value.isTemplate) {
  56578. value = Ext.XTemplate.getTpl(this, name);
  56579. }
  56580. value = value.apply(data);
  56581. }
  56582. }
  56583. data[name] = value || '';
  56584. }
  56585. return data;
  56586. },
  56587. getLabelableRenderData: function() {
  56588. var me = this,
  56589. data,
  56590. tempEl,
  56591. topLabel = me.labelAlign === 'top';
  56592. if (!Ext.form.Labelable.errorIconWidth) {
  56593. Ext.form.Labelable.errorIconWidth = (tempEl = Ext.resetElement.createChild({style: 'position:absolute', cls: Ext.baseCSSPrefix + 'form-invalid-icon'})).getWidth();
  56594. tempEl.remove();
  56595. }
  56596. data = Ext.copyTo({
  56597. inFormLayout : me.ownerLayout && me.ownerLayout.type === 'form',
  56598. inputId : me.getInputId(),
  56599. labelOnLeft : !topLabel,
  56600. hideLabel : !me.hasVisibleLabel(),
  56601. fieldLabel : me.getFieldLabel(),
  56602. labelCellStyle : me.getLabelCellStyle(),
  56603. labelCellAttrs : me.getLabelCellAttrs(),
  56604. labelCls : me.getLabelCls(),
  56605. labelStyle : me.getLabelStyle(),
  56606. bodyColspan : me.getBodyColspan(),
  56607. externalError : !me.autoFitErrors,
  56608. errorMsgCls : me.getErrorMsgCls(),
  56609. errorIconWidth : Ext.form.Labelable.errorIconWidth
  56610. },
  56611. me, me.labelableRenderProps, true);
  56612. me.getInsertionRenderData(data, me.labelableInsertions);
  56613. return data;
  56614. },
  56615. beforeLabelableRender: function() {
  56616. var me = this;
  56617. if (me.ownerLayout) {
  56618. me.addCls(Ext.baseCSSPrefix + me.ownerLayout.type + '-form-item');
  56619. }
  56620. },
  56621. onLabelableRender: function() {
  56622. var me = this,
  56623. margins,
  56624. side,
  56625. style = {};
  56626. if (me.extraMargins) {
  56627. margins = me.el.getMargin();
  56628. for (side in margins) {
  56629. if (margins.hasOwnProperty(side)) {
  56630. style['margin-' + side] = (margins[side] + me.extraMargins[side]) + 'px';
  56631. }
  56632. }
  56633. me.el.setStyle(style);
  56634. }
  56635. },
  56636. hasVisibleLabel: function(){
  56637. if (this.hideLabel) {
  56638. return false;
  56639. }
  56640. return !(this.hideEmptyLabel && !this.getFieldLabel());
  56641. },
  56642. getBodyColspan: function() {
  56643. var me = this,
  56644. result;
  56645. if (me.msgTarget === 'side' && (!me.autoFitErrors || me.hasActiveError())) {
  56646. result = 1;
  56647. } else {
  56648. result = 2;
  56649. }
  56650. if (me.labelAlign !== 'top' && !me.hasVisibleLabel()) {
  56651. result++;
  56652. }
  56653. return result;
  56654. },
  56655. getLabelCls: function() {
  56656. var labelCls = this.labelCls,
  56657. labelClsExtra = this.labelClsExtra;
  56658. if (this.labelAlign === 'top') {
  56659. labelCls += '-top';
  56660. }
  56661. return labelClsExtra ? labelCls + ' ' + labelClsExtra : labelCls;
  56662. },
  56663. getLabelCellStyle: function() {
  56664. var me = this,
  56665. hideLabelCell = me.hideLabel || (!me.fieldLabel && me.hideEmptyLabel);
  56666. return hideLabelCell ? 'display:none;' : '';
  56667. },
  56668. getErrorMsgCls: function() {
  56669. var me = this,
  56670. hideLabelCell = (me.hideLabel || (!me.fieldLabel && me.hideEmptyLabel));
  56671. return me.errorMsgCls + (!hideLabelCell && me.labelAlign === 'top' ? ' ' + Ext.baseCSSPrefix + 'lbl-top-err-icon' : '');
  56672. },
  56673. getLabelCellAttrs: function() {
  56674. var me = this,
  56675. labelAlign = me.labelAlign,
  56676. result = '';
  56677. if (labelAlign !== 'top') {
  56678. result = 'valign="top" halign="' + labelAlign + '" width="' + (me.labelWidth + me.labelPad) + '"';
  56679. }
  56680. return result + ' class="' + Ext.baseCSSPrefix + 'field-label-cell"';
  56681. },
  56682. getLabelStyle: function(){
  56683. var me = this,
  56684. labelPad = me.labelPad,
  56685. labelStyle = '';
  56686. if (me.labelAlign !== 'top') {
  56687. if (me.labelWidth) {
  56688. labelStyle = 'width:' + me.labelWidth + 'px;';
  56689. }
  56690. labelStyle += 'margin-right:' + labelPad + 'px;';
  56691. }
  56692. return labelStyle + (me.labelStyle || '');
  56693. },
  56694. getSubTplMarkup: function() {
  56695. return '';
  56696. },
  56697. getInputId: function() {
  56698. return '';
  56699. },
  56700. getActiveError : function() {
  56701. return this.activeError || '';
  56702. },
  56703. hasActiveError: function() {
  56704. return !!this.getActiveError();
  56705. },
  56706. setActiveError: function(msg) {
  56707. this.setActiveErrors(msg);
  56708. },
  56709. getActiveErrors: function() {
  56710. return this.activeErrors || [];
  56711. },
  56712. setActiveErrors: function(errors) {
  56713. errors = Ext.Array.from(errors);
  56714. this.activeError = errors[0];
  56715. this.activeErrors = errors;
  56716. this.activeError = this.getTpl('activeErrorsTpl').apply({errors: errors});
  56717. this.renderActiveError();
  56718. },
  56719. unsetActiveError: function() {
  56720. delete this.activeError;
  56721. delete this.activeErrors;
  56722. this.renderActiveError();
  56723. },
  56724. renderActiveError: function() {
  56725. var me = this,
  56726. activeError = me.getActiveError(),
  56727. hasError = !!activeError;
  56728. if (activeError !== me.lastActiveError) {
  56729. me.fireEvent('errorchange', me, activeError);
  56730. me.lastActiveError = activeError;
  56731. }
  56732. if (me.rendered && !me.isDestroyed && !me.preventMark) {
  56733. me.el[hasError ? 'addCls' : 'removeCls'](me.invalidCls);
  56734. me.getActionEl().dom.setAttribute('aria-invalid', hasError);
  56735. if (me.errorEl) {
  56736. me.errorEl.dom.innerHTML = activeError;
  56737. }
  56738. }
  56739. },
  56740. setFieldDefaults: function(defaults) {
  56741. var me = this,
  56742. val, key;
  56743. for (key in defaults) {
  56744. if (defaults.hasOwnProperty(key)) {
  56745. val = defaults[key];
  56746. if (!me.hasOwnProperty(key)) {
  56747. me[key] = val;
  56748. }
  56749. }
  56750. }
  56751. }
  56752. });
  56753. Ext.define('Ext.form.field.Field', {
  56754. isFormField : true,
  56755. disabled : false,
  56756. submitValue: true,
  56757. validateOnChange: true,
  56758. suspendCheckChange: 0,
  56759. initField: function() {
  56760. this.addEvents(
  56761. 'change',
  56762. 'validitychange',
  56763. 'dirtychange'
  56764. );
  56765. this.initValue();
  56766. },
  56767. initValue: function() {
  56768. var me = this;
  56769. me.value = me.transformOriginalValue(me.value);
  56770. me.originalValue = me.lastValue = me.value;
  56771. me.suspendCheckChange++;
  56772. me.setValue(me.value);
  56773. me.suspendCheckChange--;
  56774. },
  56775. transformOriginalValue: function(value){
  56776. return value;
  56777. },
  56778. getName: function() {
  56779. return this.name;
  56780. },
  56781. getValue: function() {
  56782. return this.value;
  56783. },
  56784. setValue: function(value) {
  56785. var me = this;
  56786. me.value = value;
  56787. me.checkChange();
  56788. return me;
  56789. },
  56790. isEqual: function(value1, value2) {
  56791. return String(value1) === String(value2);
  56792. },
  56793. isEqualAsString: function(value1, value2){
  56794. return String(Ext.value(value1, '')) === String(Ext.value(value2, ''));
  56795. },
  56796. getSubmitData: function() {
  56797. var me = this,
  56798. data = null;
  56799. if (!me.disabled && me.submitValue && !me.isFileUpload()) {
  56800. data = {};
  56801. data[me.getName()] = '' + me.getValue();
  56802. }
  56803. return data;
  56804. },
  56805. getModelData: function() {
  56806. var me = this,
  56807. data = null;
  56808. if (!me.disabled && !me.isFileUpload()) {
  56809. data = {};
  56810. data[me.getName()] = me.getValue();
  56811. }
  56812. return data;
  56813. },
  56814. reset : function(){
  56815. var me = this;
  56816. me.beforeReset();
  56817. me.setValue(me.originalValue);
  56818. me.clearInvalid();
  56819. delete me.wasValid;
  56820. },
  56821. beforeReset: Ext.emptyFn,
  56822. resetOriginalValue: function() {
  56823. this.originalValue = this.getValue();
  56824. this.checkDirty();
  56825. },
  56826. checkChange: function() {
  56827. if (!this.suspendCheckChange) {
  56828. var me = this,
  56829. newVal = me.getValue(),
  56830. oldVal = me.lastValue;
  56831. if (!me.isEqual(newVal, oldVal) && !me.isDestroyed) {
  56832. me.lastValue = newVal;
  56833. me.fireEvent('change', me, newVal, oldVal);
  56834. me.onChange(newVal, oldVal);
  56835. }
  56836. }
  56837. },
  56838. onChange: function(newVal, oldVal) {
  56839. if (this.validateOnChange) {
  56840. this.validate();
  56841. }
  56842. this.checkDirty();
  56843. },
  56844. isDirty : function() {
  56845. var me = this;
  56846. return !me.disabled && !me.isEqual(me.getValue(), me.originalValue);
  56847. },
  56848. checkDirty: function() {
  56849. var me = this,
  56850. isDirty = me.isDirty();
  56851. if (isDirty !== me.wasDirty) {
  56852. me.fireEvent('dirtychange', me, isDirty);
  56853. me.onDirtyChange(isDirty);
  56854. me.wasDirty = isDirty;
  56855. }
  56856. },
  56857. onDirtyChange: Ext.emptyFn,
  56858. getErrors: function(value) {
  56859. return [];
  56860. },
  56861. isValid : function() {
  56862. var me = this;
  56863. return me.disabled || Ext.isEmpty(me.getErrors());
  56864. },
  56865. validate : function() {
  56866. var me = this,
  56867. isValid = me.isValid();
  56868. if (isValid !== me.wasValid) {
  56869. me.wasValid = isValid;
  56870. me.fireEvent('validitychange', me, isValid);
  56871. }
  56872. return isValid;
  56873. },
  56874. batchChanges: function(fn) {
  56875. try {
  56876. this.suspendCheckChange++;
  56877. fn();
  56878. } catch(e){
  56879. throw e;
  56880. } finally {
  56881. this.suspendCheckChange--;
  56882. }
  56883. this.checkChange();
  56884. },
  56885. isFileUpload: function() {
  56886. return false;
  56887. },
  56888. extractFileInput: function() {
  56889. return null;
  56890. },
  56891. markInvalid: Ext.emptyFn,
  56892. clearInvalid: Ext.emptyFn
  56893. });
  56894. Ext.define('Ext.form.field.Base', {
  56895. extend: 'Ext.Component',
  56896. mixins: {
  56897. labelable: 'Ext.form.Labelable',
  56898. field: 'Ext.form.field.Field'
  56899. },
  56900. alias: 'widget.field',
  56901. alternateClassName: ['Ext.form.Field', 'Ext.form.BaseField'],
  56902. requires: ['Ext.util.DelayedTask', 'Ext.XTemplate', 'Ext.layout.component.field.Field'],
  56903. fieldSubTpl: [
  56904. '<input id="{id}" type="{type}" {inputAttrTpl}',
  56905. ' size="1"',
  56906. '<tpl if="name"> name="{name}"</tpl>',
  56907. '<tpl if="value"> value="{[Ext.util.Format.htmlEncode(values.value)]}"</tpl>',
  56908. '<tpl if="placeholder"> placeholder="{placeholder}"</tpl>',
  56909. '{%if (values.maxLength !== undefined){%} maxlength="{maxLength}"{%}%}',
  56910. '<tpl if="readOnly"> readonly="readonly"</tpl>',
  56911. '<tpl if="disabled"> disabled="disabled"</tpl>',
  56912. '<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>',
  56913. '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',
  56914. ' class="{fieldCls} {typeCls} {editableCls}" autocomplete="off"/>',
  56915. {
  56916. disableFormats: true
  56917. }
  56918. ],
  56919. subTplInsertions: [
  56920. 'inputAttrTpl'
  56921. ],
  56922. inputType: 'text',
  56923. invalidText : 'The value in this field is invalid',
  56924. fieldCls : Ext.baseCSSPrefix + 'form-field',
  56925. focusCls : 'form-focus',
  56926. dirtyCls : Ext.baseCSSPrefix + 'form-dirty',
  56927. checkChangeEvents: Ext.isIE && (!document.documentMode || document.documentMode < 9) ?
  56928. ['change', 'propertychange'] :
  56929. ['change', 'input', 'textInput', 'keyup', 'dragdrop'],
  56930. checkChangeBuffer: 50,
  56931. componentLayout: 'field',
  56932. readOnly : false,
  56933. readOnlyCls: Ext.baseCSSPrefix + 'form-readonly',
  56934. validateOnBlur: true,
  56935. hasFocus : false,
  56936. baseCls: Ext.baseCSSPrefix + 'field',
  56937. maskOnDisable: false,
  56938. initComponent : function() {
  56939. var me = this;
  56940. me.callParent();
  56941. me.subTplData = me.subTplData || {};
  56942. me.addEvents(
  56943. 'specialkey',
  56944. 'writeablechange'
  56945. );
  56946. me.initLabelable();
  56947. me.initField();
  56948. if (!me.name) {
  56949. me.name = me.getInputId();
  56950. }
  56951. },
  56952. beforeRender: function(){
  56953. var me = this;
  56954. me.callParent(arguments);
  56955. me.beforeLabelableRender(arguments);
  56956. if (me.readOnly) {
  56957. me.addCls(me.readOnlyCls);
  56958. }
  56959. },
  56960. getInputId: function() {
  56961. return this.inputId || (this.inputId = this.id + '-inputEl');
  56962. },
  56963. getSubTplData: function() {
  56964. var me = this,
  56965. type = me.inputType,
  56966. inputId = me.getInputId(),
  56967. data;
  56968. data = Ext.apply({
  56969. id : inputId,
  56970. cmpId : me.id,
  56971. name : me.name || inputId,
  56972. disabled : me.disabled,
  56973. readOnly : me.readOnly,
  56974. value : me.getRawValue(),
  56975. type : type,
  56976. fieldCls : me.fieldCls,
  56977. fieldStyle : me.getFieldStyle(),
  56978. tabIdx : me.tabIndex,
  56979. typeCls : Ext.baseCSSPrefix + 'form-' + (type === 'password' ? 'text' : type)
  56980. }, me.subTplData);
  56981. me.getInsertionRenderData(data, me.subTplInsertions);
  56982. return data;
  56983. },
  56984. afterFirstLayout: function() {
  56985. this.callParent();
  56986. var el = this.inputEl;
  56987. if (el) {
  56988. el.selectable();
  56989. }
  56990. },
  56991. applyRenderSelectors: function() {
  56992. var me = this;
  56993. me.callParent();
  56994. me.inputEl = me.el.getById(me.getInputId());
  56995. },
  56996. getSubTplMarkup: function() {
  56997. return this.getTpl('fieldSubTpl').apply(this.getSubTplData());
  56998. },
  56999. initRenderTpl: function() {
  57000. var me = this;
  57001. if (!me.hasOwnProperty('renderTpl')) {
  57002. me.renderTpl = me.getTpl('labelableRenderTpl');
  57003. }
  57004. return me.callParent();
  57005. },
  57006. initRenderData: function() {
  57007. return Ext.applyIf(this.callParent(), this.getLabelableRenderData());
  57008. },
  57009. setFieldStyle: function(style) {
  57010. var me = this,
  57011. inputEl = me.inputEl;
  57012. if (inputEl) {
  57013. inputEl.applyStyles(style);
  57014. }
  57015. me.fieldStyle = style;
  57016. },
  57017. getFieldStyle: function() {
  57018. return 'width:100%;' + (Ext.isObject(this.fieldStyle) ? Ext.DomHelper.generateStyles(this.fieldStyle) : this.fieldStyle ||'');
  57019. },
  57020. onRender : function() {
  57021. var me = this;
  57022. me.callParent(arguments);
  57023. me.onLabelableRender();
  57024. me.renderActiveError();
  57025. },
  57026. getFocusEl: function() {
  57027. return this.inputEl;
  57028. },
  57029. isFileUpload: function() {
  57030. return this.inputType === 'file';
  57031. },
  57032. extractFileInput: function() {
  57033. var me = this,
  57034. fileInput = me.isFileUpload() ? me.inputEl.dom : null,
  57035. clone;
  57036. if (fileInput) {
  57037. clone = fileInput.cloneNode(true);
  57038. fileInput.parentNode.replaceChild(clone, fileInput);
  57039. me.inputEl = Ext.get(clone);
  57040. }
  57041. return fileInput;
  57042. },
  57043. getSubmitData: function() {
  57044. var me = this,
  57045. data = null,
  57046. val;
  57047. if (!me.disabled && me.submitValue && !me.isFileUpload()) {
  57048. val = me.getSubmitValue();
  57049. if (val !== null) {
  57050. data = {};
  57051. data[me.getName()] = val;
  57052. }
  57053. }
  57054. return data;
  57055. },
  57056. getSubmitValue: function() {
  57057. return this.processRawValue(this.getRawValue());
  57058. },
  57059. getRawValue: function() {
  57060. var me = this,
  57061. v = (me.inputEl ? me.inputEl.getValue() : Ext.value(me.rawValue, ''));
  57062. me.rawValue = v;
  57063. return v;
  57064. },
  57065. setRawValue: function(value) {
  57066. var me = this;
  57067. value = Ext.value(me.transformRawValue(value), '');
  57068. me.rawValue = value;
  57069. if (me.inputEl) {
  57070. me.inputEl.dom.value = value;
  57071. }
  57072. return value;
  57073. },
  57074. transformRawValue: function(value) {
  57075. return value;
  57076. },
  57077. valueToRaw: function(value) {
  57078. return '' + Ext.value(value, '');
  57079. },
  57080. rawToValue: function(rawValue) {
  57081. return rawValue;
  57082. },
  57083. processRawValue: function(value) {
  57084. return value;
  57085. },
  57086. getValue: function() {
  57087. var me = this,
  57088. val = me.rawToValue(me.processRawValue(me.getRawValue()));
  57089. me.value = val;
  57090. return val;
  57091. },
  57092. setValue: function(value) {
  57093. var me = this;
  57094. me.setRawValue(me.valueToRaw(value));
  57095. return me.mixins.field.setValue.call(me, value);
  57096. },
  57097. onBoxReady: function() {
  57098. var me = this;
  57099. me.callParent();
  57100. if (me.setReadOnlyOnBoxReady) {
  57101. me.setReadOnly(me.readOnly);
  57102. }
  57103. },
  57104. onDisable: function() {
  57105. var me = this,
  57106. inputEl = me.inputEl;
  57107. me.callParent();
  57108. if (inputEl) {
  57109. inputEl.dom.disabled = true;
  57110. if (me.hasActiveError()) {
  57111. me.clearInvalid();
  57112. me.needsValidateOnEnable = true;
  57113. }
  57114. }
  57115. },
  57116. onEnable: function() {
  57117. var me = this,
  57118. inputEl = me.inputEl;
  57119. me.callParent();
  57120. if (inputEl) {
  57121. inputEl.dom.disabled = false;
  57122. if (me.needsValidateOnEnable) {
  57123. delete me.needsValidateOnEnable;
  57124. me.forceValidation = true;
  57125. me.isValid();
  57126. delete me.forceValidation;
  57127. }
  57128. }
  57129. },
  57130. setReadOnly: function(readOnly) {
  57131. var me = this,
  57132. inputEl = me.inputEl;
  57133. readOnly = !!readOnly;
  57134. me[readOnly ? 'addCls' : 'removeCls'](me.readOnlyCls);
  57135. me.readOnly = readOnly;
  57136. if (inputEl) {
  57137. inputEl.dom.readOnly = readOnly;
  57138. } else if (me.rendering) {
  57139. me.setReadOnlyOnBoxReady = true;
  57140. }
  57141. me.fireEvent('writeablechange', me, readOnly);
  57142. },
  57143. fireKey: function(e){
  57144. if(e.isSpecialKey()){
  57145. this.fireEvent('specialkey', this, new Ext.EventObjectImpl(e));
  57146. }
  57147. },
  57148. initEvents : function(){
  57149. var me = this,
  57150. inputEl = me.inputEl,
  57151. onChangeTask,
  57152. onChangeEvent,
  57153. events = me.checkChangeEvents,
  57154. e,
  57155. eLen = events.length,
  57156. event;
  57157. if (me.inEditor) {
  57158. me.onBlur = Ext.Function.createBuffered(me.onBlur, 10);
  57159. }
  57160. if (inputEl) {
  57161. me.mon(inputEl, Ext.EventManager.getKeyEvent(), me.fireKey, me);
  57162. onChangeTask = new Ext.util.DelayedTask(me.checkChange, me);
  57163. me.onChangeEvent = onChangeEvent = function() {
  57164. onChangeTask.delay(me.checkChangeBuffer);
  57165. };
  57166. for (e = 0; e < eLen; e++) {
  57167. event = events[e];
  57168. if (event === 'propertychange') {
  57169. me.usesPropertychange = true;
  57170. }
  57171. me.mon(inputEl, event, onChangeEvent);
  57172. }
  57173. }
  57174. me.callParent();
  57175. },
  57176. doComponentLayout: function() {
  57177. var me = this,
  57178. inputEl = me.inputEl,
  57179. usesPropertychange = me.usesPropertychange,
  57180. ename = 'propertychange',
  57181. onChangeEvent = me.onChangeEvent;
  57182. if (usesPropertychange) {
  57183. me.mun(inputEl, ename, onChangeEvent);
  57184. }
  57185. me.callParent(arguments);
  57186. if (usesPropertychange) {
  57187. me.mon(inputEl, ename, onChangeEvent);
  57188. }
  57189. },
  57190. onDirtyChange: function(isDirty) {
  57191. this[isDirty ? 'addCls' : 'removeCls'](this.dirtyCls);
  57192. },
  57193. isValid : function() {
  57194. var me = this,
  57195. disabled = me.disabled,
  57196. validate = me.forceValidation || !disabled;
  57197. return validate ? me.validateValue(me.processRawValue(me.getRawValue())) : disabled;
  57198. },
  57199. validateValue: function(value) {
  57200. var me = this,
  57201. errors = me.getErrors(value),
  57202. isValid = Ext.isEmpty(errors);
  57203. if (!me.preventMark) {
  57204. if (isValid) {
  57205. me.clearInvalid();
  57206. } else {
  57207. me.markInvalid(errors);
  57208. }
  57209. }
  57210. return isValid;
  57211. },
  57212. markInvalid : function(errors) {
  57213. var me = this,
  57214. oldMsg = me.getActiveError();
  57215. me.setActiveErrors(Ext.Array.from(errors));
  57216. if (oldMsg !== me.getActiveError()) {
  57217. me.updateLayout();
  57218. }
  57219. },
  57220. clearInvalid : function() {
  57221. var me = this,
  57222. hadError = me.hasActiveError();
  57223. me.unsetActiveError();
  57224. if (hadError) {
  57225. me.updateLayout();
  57226. }
  57227. },
  57228. renderActiveError: function() {
  57229. var me = this,
  57230. hasError = me.hasActiveError();
  57231. if (me.inputEl) {
  57232. me.inputEl[hasError ? 'addCls' : 'removeCls'](me.invalidCls + '-field');
  57233. }
  57234. me.mixins.labelable.renderActiveError.call(me);
  57235. },
  57236. getActionEl: function() {
  57237. return this.inputEl || this.el;
  57238. }
  57239. });
  57240. Ext.define('Ext.form.field.VTypes', (function(){
  57241. var alpha = /^[a-zA-Z_]+$/,
  57242. alphanum = /^[a-zA-Z0-9_]+$/,
  57243. email = /^(\w+)([\-+.][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,
  57244. url = /(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
  57245. return {
  57246. singleton: true,
  57247. alternateClassName: 'Ext.form.VTypes',
  57248. 'email' : function(v){
  57249. return email.test(v);
  57250. },
  57251. 'emailText' : 'This field should be an e-mail address in the format "user@example.com"',
  57252. 'emailMask' : /[a-z0-9_\.\-@\+]/i,
  57253. 'url' : function(v){
  57254. return url.test(v);
  57255. },
  57256. 'urlText' : 'This field should be a URL in the format "http:/'+'/www.example.com"',
  57257. 'alpha' : function(v){
  57258. return alpha.test(v);
  57259. },
  57260. 'alphaText' : 'This field should only contain letters and _',
  57261. 'alphaMask' : /[a-z_]/i,
  57262. 'alphanum' : function(v){
  57263. return alphanum.test(v);
  57264. },
  57265. 'alphanumText' : 'This field should only contain letters, numbers and _',
  57266. 'alphanumMask' : /[a-z0-9_]/i
  57267. };
  57268. }()));
  57269. Ext.define('Ext.form.field.Text', {
  57270. extend:'Ext.form.field.Base',
  57271. alias: 'widget.textfield',
  57272. requires: ['Ext.form.field.VTypes', 'Ext.layout.component.field.Text'],
  57273. alternateClassName: ['Ext.form.TextField', 'Ext.form.Text'],
  57274. size: 20,
  57275. growMin : 30,
  57276. growMax : 800,
  57277. growAppend: 'W',
  57278. allowBlank : true,
  57279. minLength : 0,
  57280. maxLength : Number.MAX_VALUE,
  57281. minLengthText : 'The minimum length for this field is {0}',
  57282. maxLengthText : 'The maximum length for this field is {0}',
  57283. blankText : 'This field is required',
  57284. regexText : '',
  57285. emptyCls : Ext.baseCSSPrefix + 'form-empty-field',
  57286. requiredCls : Ext.baseCSSPrefix + 'form-required-field',
  57287. componentLayout: 'textfield',
  57288. valueContainsPlaceholder : false,
  57289. initComponent: function () {
  57290. var me = this;
  57291. me.callParent();
  57292. me.addEvents(
  57293. 'autosize',
  57294. 'keydown',
  57295. 'keyup',
  57296. 'keypress'
  57297. );
  57298. me.addStateEvents('change');
  57299. me.setGrowSizePolicy();
  57300. },
  57301. setGrowSizePolicy: function(){
  57302. if (this.grow) {
  57303. this.shrinkWrap |= 1;
  57304. }
  57305. },
  57306. initEvents : function(){
  57307. var me = this,
  57308. el = me.inputEl;
  57309. me.callParent();
  57310. if(me.selectOnFocus || me.emptyText){
  57311. me.mon(el, 'mousedown', me.onMouseDown, me);
  57312. }
  57313. if(me.maskRe || (me.vtype && me.disableKeyFilter !== true && (me.maskRe = Ext.form.field.VTypes[me.vtype+'Mask']))){
  57314. me.mon(el, 'keypress', me.filterKeys, me);
  57315. }
  57316. if (me.enableKeyEvents) {
  57317. me.mon(el, {
  57318. scope: me,
  57319. keyup: me.onKeyUp,
  57320. keydown: me.onKeyDown,
  57321. keypress: me.onKeyPress
  57322. });
  57323. }
  57324. },
  57325. isEqual: function(value1, value2) {
  57326. return this.isEqualAsString(value1, value2);
  57327. },
  57328. onChange: function() {
  57329. this.callParent();
  57330. this.autoSize();
  57331. },
  57332. getSubTplData: function() {
  57333. var me = this,
  57334. value = me.getRawValue(),
  57335. isEmpty = me.emptyText && value.length < 1,
  57336. maxLength = me.maxLength,
  57337. placeholder;
  57338. if (me.enforceMaxLength) {
  57339. if (maxLength === Number.MAX_VALUE) {
  57340. maxLength = undefined;
  57341. }
  57342. } else {
  57343. maxLength = undefined;
  57344. }
  57345. if (isEmpty) {
  57346. if (Ext.supports.Placeholder) {
  57347. placeholder = me.emptyText;
  57348. } else {
  57349. value = me.emptyText;
  57350. me.valueContainsPlaceholder = true;
  57351. }
  57352. }
  57353. return Ext.apply(me.callParent(), {
  57354. maxLength : maxLength,
  57355. readOnly : me.readOnly,
  57356. placeholder : placeholder,
  57357. value : value,
  57358. fieldCls : me.fieldCls + ((isEmpty && (placeholder || value)) ? ' ' + me.emptyCls : '') + (me.allowBlank ? '' : ' ' + me.requiredCls)
  57359. });
  57360. },
  57361. afterRender: function(){
  57362. this.autoSize();
  57363. this.callParent();
  57364. },
  57365. onMouseDown: function(e){
  57366. var me = this;
  57367. if(!me.hasFocus){
  57368. me.mon(me.inputEl, 'mouseup', Ext.emptyFn, me, { single: true, preventDefault: true });
  57369. }
  57370. },
  57371. processRawValue: function(value) {
  57372. var me = this,
  57373. stripRe = me.stripCharsRe,
  57374. newValue;
  57375. if (stripRe) {
  57376. newValue = value.replace(stripRe, '');
  57377. if (newValue !== value) {
  57378. me.setRawValue(newValue);
  57379. value = newValue;
  57380. }
  57381. }
  57382. return value;
  57383. },
  57384. onDisable: function(){
  57385. this.callParent();
  57386. if (Ext.isIE) {
  57387. this.inputEl.dom.unselectable = 'on';
  57388. }
  57389. },
  57390. onEnable: function(){
  57391. this.callParent();
  57392. if (Ext.isIE) {
  57393. this.inputEl.dom.unselectable = '';
  57394. }
  57395. },
  57396. onKeyDown: function(e) {
  57397. this.fireEvent('keydown', this, e);
  57398. },
  57399. onKeyUp: function(e) {
  57400. this.fireEvent('keyup', this, e);
  57401. },
  57402. onKeyPress: function(e) {
  57403. this.fireEvent('keypress', this, e);
  57404. },
  57405. reset : function(){
  57406. this.callParent();
  57407. this.applyEmptyText();
  57408. },
  57409. applyEmptyText : function(){
  57410. var me = this,
  57411. emptyText = me.emptyText,
  57412. isEmpty;
  57413. if (me.rendered && emptyText) {
  57414. isEmpty = me.getRawValue().length < 1 && !me.hasFocus;
  57415. if (Ext.supports.Placeholder) {
  57416. me.inputEl.dom.placeholder = emptyText;
  57417. } else if (isEmpty) {
  57418. me.setRawValue(emptyText);
  57419. me.valueContainsPlaceholder = true;
  57420. }
  57421. if (isEmpty) {
  57422. me.inputEl.addCls(me.emptyCls);
  57423. }
  57424. me.autoSize();
  57425. }
  57426. },
  57427. afterFirstLayout: function() {
  57428. this.callParent();
  57429. if (Ext.isIE && this.disabled) {
  57430. var el = this.inputEl;
  57431. if (el) {
  57432. el.dom.unselectable = 'on';
  57433. }
  57434. }
  57435. },
  57436. preFocus : function(){
  57437. var me = this,
  57438. inputEl = me.inputEl,
  57439. emptyText = me.emptyText,
  57440. isEmpty;
  57441. me.callParent(arguments);
  57442. if ((emptyText && !Ext.supports.Placeholder) && (inputEl.dom.value === me.emptyText && me.valueContainsPlaceholder)) {
  57443. me.setRawValue('');
  57444. isEmpty = true;
  57445. inputEl.removeCls(me.emptyCls);
  57446. me.valueContainsPlaceholder = false;
  57447. } else if (Ext.supports.Placeholder) {
  57448. me.inputEl.removeCls(me.emptyCls);
  57449. }
  57450. if (me.selectOnFocus || isEmpty) {
  57451. inputEl.dom.select();
  57452. }
  57453. },
  57454. onFocus: function() {
  57455. var me = this;
  57456. me.callParent(arguments);
  57457. if (me.emptyText) {
  57458. me.autoSize();
  57459. }
  57460. },
  57461. postBlur : function(){
  57462. this.callParent(arguments);
  57463. this.applyEmptyText();
  57464. },
  57465. filterKeys : function(e){
  57466. if (e.ctrlKey && !e.altKey) {
  57467. return;
  57468. }
  57469. var key = e.getKey(),
  57470. charCode = String.fromCharCode(e.getCharCode());
  57471. if((Ext.isGecko || Ext.isOpera) && (e.isNavKeyPress() || key === e.BACKSPACE || (key === e.DELETE && e.button === -1))){
  57472. return;
  57473. }
  57474. if((!Ext.isGecko && !Ext.isOpera) && e.isSpecialKey() && !charCode){
  57475. return;
  57476. }
  57477. if(!this.maskRe.test(charCode)){
  57478. e.stopEvent();
  57479. }
  57480. },
  57481. getState: function() {
  57482. return this.addPropertyToState(this.callParent(), 'value');
  57483. },
  57484. applyState: function(state) {
  57485. this.callParent(arguments);
  57486. if(state.hasOwnProperty('value')) {
  57487. this.setValue(state.value);
  57488. }
  57489. },
  57490. getRawValue: function() {
  57491. var me = this,
  57492. v = me.callParent();
  57493. if (v === me.emptyText && me.valueContainsPlaceholder) {
  57494. v = '';
  57495. }
  57496. return v;
  57497. },
  57498. setValue: function(value) {
  57499. var me = this,
  57500. inputEl = me.inputEl;
  57501. if (inputEl && me.emptyText && !Ext.isEmpty(value)) {
  57502. inputEl.removeCls(me.emptyCls);
  57503. me.valueContainsPlaceholder = false;
  57504. }
  57505. me.callParent(arguments);
  57506. me.applyEmptyText();
  57507. return me;
  57508. },
  57509. getErrors: function(value) {
  57510. var me = this,
  57511. errors = me.callParent(arguments),
  57512. validator = me.validator,
  57513. emptyText = me.emptyText,
  57514. allowBlank = me.allowBlank,
  57515. vtype = me.vtype,
  57516. vtypes = Ext.form.field.VTypes,
  57517. regex = me.regex,
  57518. format = Ext.String.format,
  57519. msg;
  57520. value = value || me.processRawValue(me.getRawValue());
  57521. if (Ext.isFunction(validator)) {
  57522. msg = validator.call(me, value);
  57523. if (msg !== true) {
  57524. errors.push(msg);
  57525. }
  57526. }
  57527. if (value.length < 1 || (value === me.emptyText && me.valueContainsPlaceholder)) {
  57528. if (!allowBlank) {
  57529. errors.push(me.blankText);
  57530. }
  57531. return errors;
  57532. }
  57533. if (value.length < me.minLength) {
  57534. errors.push(format(me.minLengthText, me.minLength));
  57535. }
  57536. if (value.length > me.maxLength) {
  57537. errors.push(format(me.maxLengthText, me.maxLength));
  57538. }
  57539. if (vtype) {
  57540. if(!vtypes[vtype](value, me)){
  57541. errors.push(me.vtypeText || vtypes[vtype +'Text']);
  57542. }
  57543. }
  57544. if (regex && !regex.test(value)) {
  57545. errors.push(me.regexText || me.invalidText);
  57546. }
  57547. return errors;
  57548. },
  57549. selectText : function(start, end){
  57550. var me = this,
  57551. v = me.getRawValue(),
  57552. doFocus = true,
  57553. el = me.inputEl.dom,
  57554. undef,
  57555. range;
  57556. if (v.length > 0) {
  57557. start = start === undef ? 0 : start;
  57558. end = end === undef ? v.length : end;
  57559. if (el.setSelectionRange) {
  57560. el.setSelectionRange(start, end);
  57561. }
  57562. else if(el.createTextRange) {
  57563. range = el.createTextRange();
  57564. range.moveStart('character', start);
  57565. range.moveEnd('character', end - v.length);
  57566. range.select();
  57567. }
  57568. doFocus = Ext.isGecko || Ext.isOpera;
  57569. }
  57570. if (doFocus) {
  57571. me.focus();
  57572. }
  57573. },
  57574. autoSize: function() {
  57575. var me = this;
  57576. if (me.grow && me.rendered) {
  57577. me.autoSizing = true;
  57578. me.updateLayout();
  57579. }
  57580. },
  57581. afterComponentLayout: function() {
  57582. var me = this,
  57583. width;
  57584. me.callParent(arguments);
  57585. if (me.autoSizing) {
  57586. width = me.inputEl.getWidth();
  57587. if (width !== me.lastInputWidth) {
  57588. me.fireEvent('autosize', me, width);
  57589. me.lastInputWidth = width;
  57590. delete me.autoSizing;
  57591. }
  57592. }
  57593. }
  57594. });
  57595. Ext.define('Ext.layout.component.field.TextArea', {
  57596. extend: 'Ext.layout.component.field.Text',
  57597. alias: 'layout.textareafield',
  57598. type: 'textareafield',
  57599. canGrowWidth: false,
  57600. naturalSizingProp: 'cols',
  57601. beginLayout: function(ownerContext){
  57602. this.callParent(arguments);
  57603. ownerContext.target.inputEl.setStyle('height', '');
  57604. },
  57605. measureContentHeight: function (ownerContext) {
  57606. var me = this,
  57607. owner = me.owner,
  57608. height = me.callParent(arguments),
  57609. inputContext, inputEl, value, max, curWidth, calcHeight;
  57610. if (owner.grow && !ownerContext.state.growHandled) {
  57611. inputContext = ownerContext.inputContext;
  57612. inputEl = owner.inputEl;
  57613. curWidth = inputEl.getWidth(true);
  57614. value = Ext.util.Format.htmlEncode(inputEl.dom.value) || '&#160;';
  57615. value += owner.growAppend;
  57616. value = value.replace(/\n/g, '<br/>');
  57617. calcHeight = Ext.util.TextMetrics.measure(inputEl, value, curWidth).height +
  57618. inputContext.getBorderInfo().height + inputContext.getPaddingInfo().height;
  57619. calcHeight = Ext.Number.constrain(calcHeight, owner.growMin, owner.growMax);
  57620. inputContext.setHeight(calcHeight);
  57621. ownerContext.state.growHandled = true;
  57622. inputContext.domBlock(me, 'height');
  57623. height = NaN;
  57624. }
  57625. return height;
  57626. }
  57627. });
  57628. Ext.define('Ext.form.field.TextArea', {
  57629. extend:'Ext.form.field.Text',
  57630. alias: ['widget.textareafield', 'widget.textarea'],
  57631. alternateClassName: 'Ext.form.TextArea',
  57632. requires: [
  57633. 'Ext.XTemplate',
  57634. 'Ext.layout.component.field.TextArea',
  57635. 'Ext.util.DelayedTask'
  57636. ],
  57637. fieldSubTpl: [
  57638. '<textarea id="{id}" {inputAttrTpl}',
  57639. '<tpl if="name"> name="{name}"</tpl>',
  57640. '<tpl if="rows"> rows="{rows}" </tpl>',
  57641. '<tpl if="cols"> cols="{cols}" </tpl>',
  57642. '<tpl if="placeholder"> placeholder="{placeholder}"</tpl>',
  57643. '<tpl if="size"> size="{size}"</tpl>',
  57644. '<tpl if="maxLength !== undefined"> maxlength="{maxLength}"</tpl>',
  57645. '<tpl if="readOnly"> readonly="readonly"</tpl>',
  57646. '<tpl if="disabled"> disabled="disabled"</tpl>',
  57647. '<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>',
  57648. ' class="{fieldCls} {typeCls}" ',
  57649. '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',
  57650. ' autocomplete="off">\n',
  57651. '<tpl if="value">{[Ext.util.Format.htmlEncode(values.value)]}</tpl>',
  57652. '</textarea>',
  57653. {
  57654. disableFormats: true
  57655. }
  57656. ],
  57657. growMin: 60,
  57658. growMax: 1000,
  57659. growAppend: '\n-',
  57660. cols: 20,
  57661. rows: 4,
  57662. enterIsSpecial: false,
  57663. preventScrollbars: false,
  57664. componentLayout: 'textareafield',
  57665. setGrowSizePolicy: Ext.emptyFn,
  57666. returnRe: /\r/g,
  57667. getSubTplData: function() {
  57668. var me = this,
  57669. fieldStyle = me.getFieldStyle(),
  57670. ret = me.callParent();
  57671. if (me.grow) {
  57672. if (me.preventScrollbars) {
  57673. ret.fieldStyle = (fieldStyle||'') + ';overflow:hidden;height:' + me.growMin + 'px';
  57674. }
  57675. }
  57676. Ext.applyIf(ret, {
  57677. cols: me.cols,
  57678. rows: me.rows
  57679. });
  57680. return ret;
  57681. },
  57682. afterRender: function () {
  57683. var me = this;
  57684. me.callParent(arguments);
  57685. me.needsMaxCheck = me.enforceMaxLength && me.maxLength !== Number.MAX_VALUE && !Ext.supports.TextAreaMaxLength;
  57686. if (me.needsMaxCheck) {
  57687. me.inputEl.on('paste', me.onPaste, me);
  57688. }
  57689. },
  57690. transformRawValue: function(value){
  57691. return this.stripReturns(value);
  57692. },
  57693. transformOriginalValue: function(value){
  57694. return this.stripReturns(value);
  57695. },
  57696. valueToRaw: function(value){
  57697. value = this.stripReturns(value);
  57698. return this.callParent([value]);
  57699. },
  57700. stripReturns: function(value){
  57701. if (value) {
  57702. value = value.replace(this.returnRe, '');
  57703. }
  57704. return value;
  57705. },
  57706. onPaste: function(e){
  57707. var me = this;
  57708. if (!me.pasteTask) {
  57709. me.pasteTask = new Ext.util.DelayedTask(me.pasteCheck, me);
  57710. }
  57711. me.pasteTask.delay(1);
  57712. },
  57713. pasteCheck: function(){
  57714. var me = this,
  57715. value = me.getValue(),
  57716. max = me.maxLength;
  57717. if (value.length > max) {
  57718. value = value.substr(0, max);
  57719. me.setValue(value);
  57720. }
  57721. },
  57722. fireKey: function(e) {
  57723. var me = this,
  57724. key = e.getKey(),
  57725. value;
  57726. if (e.isSpecialKey() && (me.enterIsSpecial || (key !== e.ENTER || e.hasModifier()))) {
  57727. me.fireEvent('specialkey', me, e);
  57728. }
  57729. if (me.needsMaxCheck && key !== e.BACKSPACE && key !== e.DELETE && !e.isNavKeyPress() && !me.isCutCopyPasteSelectAll(e, key)) {
  57730. value = me.getValue();
  57731. if (value.length >= me.maxLength) {
  57732. e.stopEvent();
  57733. }
  57734. }
  57735. },
  57736. isCutCopyPasteSelectAll: function(e, key) {
  57737. if (e.CTRL) {
  57738. return key === e.A || key === e.C || key === e.V || key === e.X;
  57739. }
  57740. return false;
  57741. },
  57742. autoSize: function() {
  57743. var me = this,
  57744. height;
  57745. if (me.grow && me.rendered) {
  57746. me.updateLayout();
  57747. height = me.inputEl.getHeight();
  57748. if (height !== me.lastInputHeight) {
  57749. me.fireEvent('autosize', me, height);
  57750. me.lastInputHeight = height;
  57751. }
  57752. }
  57753. },
  57754. initAria: function() {
  57755. this.callParent(arguments);
  57756. this.getActionEl().dom.setAttribute('aria-multiline', true);
  57757. },
  57758. beforeDestroy: function(){
  57759. var task = this.pasteTask;
  57760. if (task) {
  57761. task.delay();
  57762. }
  57763. this.callParent();
  57764. }
  57765. });
  57766. Ext.define('Ext.form.field.Display', {
  57767. extend:'Ext.form.field.Base',
  57768. alias: 'widget.displayfield',
  57769. requires: ['Ext.util.Format', 'Ext.XTemplate'],
  57770. alternateClassName: ['Ext.form.DisplayField', 'Ext.form.Display'],
  57771. fieldSubTpl: [
  57772. '<div id="{id}"',
  57773. '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',
  57774. ' class="{fieldCls}">{value}</div>',
  57775. {
  57776. compiled: true,
  57777. disableFormats: true
  57778. }
  57779. ],
  57780. fieldCls: Ext.baseCSSPrefix + 'form-display-field',
  57781. htmlEncode: false,
  57782. validateOnChange: false,
  57783. initEvents: Ext.emptyFn,
  57784. submitValue: false,
  57785. isDirty: function(){
  57786. return false;
  57787. },
  57788. isValid: function() {
  57789. return true;
  57790. },
  57791. validate: function() {
  57792. return true;
  57793. },
  57794. getRawValue: function() {
  57795. return this.rawValue;
  57796. },
  57797. setRawValue: function(value) {
  57798. var me = this,
  57799. display;
  57800. value = Ext.value(value, '');
  57801. me.rawValue = value;
  57802. if (me.rendered) {
  57803. me.inputEl.dom.innerHTML = me.getDisplayValue();
  57804. me.updateLayout();
  57805. }
  57806. return value;
  57807. },
  57808. getDisplayValue: function() {
  57809. var me = this,
  57810. value = this.getRawValue(),
  57811. display;
  57812. if (me.renderer) {
  57813. display = me.renderer.call(me.scope || me, value, me);
  57814. } else {
  57815. display = me.htmlEncode ? Ext.util.Format.htmlEncode(value) : value;
  57816. }
  57817. return display;
  57818. },
  57819. getSubTplData: function() {
  57820. var ret = this.callParent(arguments);
  57821. ret.value = this.getDisplayValue();
  57822. return ret;
  57823. }
  57824. });
  57825. Ext.define('Ext.layout.container.Anchor', {
  57826. alias: 'layout.anchor',
  57827. extend: 'Ext.layout.container.Container',
  57828. alternateClassName: 'Ext.layout.AnchorLayout',
  57829. type: 'anchor',
  57830. manageOverflow: 2,
  57831. renderTpl: [
  57832. '{%this.renderBody(out,values);this.renderPadder(out,values)%}'
  57833. ],
  57834. defaultAnchor: '100%',
  57835. parseAnchorRE: /^(r|right|b|bottom)$/i,
  57836. beginLayout: function (ownerContext) {
  57837. var me = this,
  57838. dimensions = 0,
  57839. anchorSpec, childContext, childItems, i, length, target;
  57840. me.callParent(arguments);
  57841. childItems = ownerContext.childItems;
  57842. length = childItems.length;
  57843. for (i = 0; i < length; ++i) {
  57844. childContext = childItems[i];
  57845. anchorSpec = childContext.target.anchorSpec;
  57846. if (anchorSpec) {
  57847. if (childContext.widthModel.calculated && anchorSpec.right) {
  57848. dimensions |= 1;
  57849. }
  57850. if (childContext.heightModel.calculated && anchorSpec.bottom) {
  57851. dimensions |= 2;
  57852. }
  57853. if (dimensions == 3) {
  57854. break;
  57855. }
  57856. }
  57857. }
  57858. ownerContext.anchorDimensions = dimensions;
  57859. if (!Ext.supports.RightMargin && !me.rightMarginCleanerFn) {
  57860. target = ownerContext.targetContext.el;
  57861. me.rightMarginCleanerFn = Ext.Element.getRightMarginFixCleaner(target);
  57862. target.addCls(Ext.baseCSSPrefix + 'inline-children');
  57863. }
  57864. },
  57865. calculate: function (ownerContext) {
  57866. var me = this,
  57867. containerSize = me.getContainerSize(ownerContext);
  57868. if (ownerContext.anchorDimensions !== ownerContext.state.calculatedAnchors) {
  57869. me.calculateAnchors(ownerContext, containerSize);
  57870. }
  57871. if (ownerContext.hasDomProp('containerChildrenDone')) {
  57872. if (!containerSize.gotAll) {
  57873. me.done = false;
  57874. }
  57875. me.calculateContentSize(ownerContext, ownerContext.anchorDimensions);
  57876. if (me.done) {
  57877. me.calculateOverflow(ownerContext, containerSize, ownerContext.anchorDimensions);
  57878. return;
  57879. }
  57880. }
  57881. me.done = false;
  57882. },
  57883. calculateAnchors: function (ownerContext, containerSize) {
  57884. var me = this,
  57885. childItems = ownerContext.childItems,
  57886. length = childItems.length,
  57887. gotHeight = containerSize.gotHeight,
  57888. gotWidth = containerSize.gotWidth,
  57889. ownerHeight = containerSize.height,
  57890. ownerWidth = containerSize.width,
  57891. state = ownerContext.state,
  57892. calculatedAnchors = (gotWidth ? 1 : 0) | (gotHeight ? 2 : 0),
  57893. anchorSpec, childContext, childMargins, height, i, width;
  57894. state.calculatedAnchors = (state.calculatedAnchors || 0) | calculatedAnchors;
  57895. for (i = 0; i < length; i++) {
  57896. childContext = childItems[i];
  57897. childMargins = childContext.getMarginInfo();
  57898. anchorSpec = childContext.target.anchorSpec;
  57899. if (gotWidth && childContext.widthModel.calculated) {
  57900. width = anchorSpec.right(ownerWidth) - childMargins.width;
  57901. width = me.adjustWidthAnchor(width, childContext);
  57902. childContext.setWidth(width);
  57903. }
  57904. if (gotHeight && childContext.heightModel.calculated) {
  57905. height = anchorSpec.bottom(ownerHeight) - childMargins.height;
  57906. height = me.adjustHeightAnchor(height, childContext);
  57907. childContext.setHeight(height);
  57908. }
  57909. }
  57910. },
  57911. finishedLayout: function (ownerContext) {
  57912. var cleanerFn = this.rightMarginCleanerFn;
  57913. if (cleanerFn) {
  57914. delete this.rightMarginCleanerFn;
  57915. ownerContext.targetContext.el.removeCls(Ext.baseCSSPrefix + 'inline-children');
  57916. cleanerFn();
  57917. }
  57918. },
  57919. anchorFactory: {
  57920. offset: function (delta) {
  57921. return function(v) {
  57922. return v + delta;
  57923. };
  57924. },
  57925. ratio: function (ratio) {
  57926. return function(v) {
  57927. return Math.floor(v * ratio);
  57928. };
  57929. },
  57930. standard: function (diff) {
  57931. return function(v) {
  57932. return v - diff;
  57933. };
  57934. }
  57935. },
  57936. parseAnchor: function(a, start, cstart) {
  57937. if (a && a != 'none') {
  57938. var factory = this.anchorFactory,
  57939. delta;
  57940. if (this.parseAnchorRE.test(a)) {
  57941. return factory.standard(cstart - start);
  57942. }
  57943. if (a.indexOf('%') != -1) {
  57944. return factory.ratio(parseFloat(a.replace('%', '')) * 0.01);
  57945. }
  57946. delta = parseInt(a, 10);
  57947. if (!isNaN(delta)) {
  57948. return factory.offset(delta);
  57949. }
  57950. }
  57951. return null;
  57952. },
  57953. adjustWidthAnchor: function(value, childContext) {
  57954. return value;
  57955. },
  57956. adjustHeightAnchor: function(value, childContext) {
  57957. return value;
  57958. },
  57959. configureItem: function(item) {
  57960. var me = this,
  57961. owner = me.owner,
  57962. anchor= item.anchor,
  57963. anchorsArray,
  57964. anchorWidth,
  57965. anchorHeight;
  57966. me.callParent(arguments);
  57967. if (!item.anchor && item.items && !Ext.isNumber(item.width) && !(Ext.isIE6 && Ext.isStrict)) {
  57968. item.anchor = anchor = me.defaultAnchor;
  57969. }
  57970. if (owner.anchorSize) {
  57971. if (typeof owner.anchorSize == 'number') {
  57972. anchorWidth = owner.anchorSize;
  57973. } else {
  57974. anchorWidth = owner.anchorSize.width;
  57975. anchorHeight = owner.anchorSize.height;
  57976. }
  57977. } else {
  57978. anchorWidth = owner.initialConfig.width;
  57979. anchorHeight = owner.initialConfig.height;
  57980. }
  57981. if (anchor) {
  57982. anchorsArray = anchor.split(' ');
  57983. item.anchorSpec = {
  57984. right: me.parseAnchor(anchorsArray[0], item.initialConfig.width, anchorWidth),
  57985. bottom: me.parseAnchor(anchorsArray[1], item.initialConfig.height, anchorHeight)
  57986. };
  57987. }
  57988. },
  57989. sizePolicy: {
  57990. '': {
  57991. setsWidth: 0,
  57992. setsHeight: 0
  57993. },
  57994. b: {
  57995. setsWidth: 0,
  57996. setsHeight: 1
  57997. },
  57998. r: {
  57999. '': {
  58000. setsWidth: 1,
  58001. setsHeight: 0
  58002. },
  58003. b: {
  58004. setsWidth: 1,
  58005. setsHeight: 1
  58006. }
  58007. }
  58008. },
  58009. getItemSizePolicy: function (item) {
  58010. var anchorSpec = item.anchorSpec,
  58011. key = '',
  58012. policy = this.sizePolicy,
  58013. sizeModel;
  58014. if (anchorSpec) {
  58015. sizeModel = this.owner.getSizeModel();
  58016. if (anchorSpec.right && !sizeModel.width.shrinkWrap) {
  58017. policy = policy.r;
  58018. }
  58019. if (anchorSpec.bottom && !sizeModel.height.shrinkWrap) {
  58020. key = 'b';
  58021. }
  58022. }
  58023. return policy[key];
  58024. }
  58025. });
  58026. Ext.define('Ext.window.MessageBox', {
  58027. extend: 'Ext.window.Window',
  58028. requires: [
  58029. 'Ext.toolbar.Toolbar',
  58030. 'Ext.form.field.Text',
  58031. 'Ext.form.field.TextArea',
  58032. 'Ext.form.field.Display',
  58033. 'Ext.button.Button',
  58034. 'Ext.layout.container.Anchor',
  58035. 'Ext.layout.container.HBox',
  58036. 'Ext.ProgressBar'
  58037. ],
  58038. alias: 'widget.messagebox',
  58039. OK : 1,
  58040. YES : 2,
  58041. NO : 4,
  58042. CANCEL : 8,
  58043. OKCANCEL : 9,
  58044. YESNO : 6,
  58045. YESNOCANCEL : 14,
  58046. INFO : Ext.baseCSSPrefix + 'message-box-info',
  58047. WARNING : Ext.baseCSSPrefix + 'message-box-warning',
  58048. QUESTION : Ext.baseCSSPrefix + 'message-box-question',
  58049. ERROR : Ext.baseCSSPrefix + 'message-box-error',
  58050. hideMode: 'offsets',
  58051. closeAction: 'hide',
  58052. resizable: false,
  58053. title: '&#160;',
  58054. width: 600,
  58055. height: 500,
  58056. minWidth: 250,
  58057. maxWidth: 600,
  58058. minHeight: 110,
  58059. maxHeight: 500,
  58060. constrain: true,
  58061. cls: Ext.baseCSSPrefix + 'message-box',
  58062. layout: {
  58063. type: 'vbox',
  58064. align: 'stretch'
  58065. },
  58066. defaultTextHeight : 75,
  58067. minProgressWidth : 250,
  58068. minPromptWidth: 250,
  58069. buttonText: {
  58070. ok: 'OK',
  58071. yes: 'Yes',
  58072. no: 'No',
  58073. cancel: 'Cancel'
  58074. },
  58075. buttonIds: [
  58076. 'ok', 'yes', 'no', 'cancel'
  58077. ],
  58078. titleText: {
  58079. confirm: 'Confirm',
  58080. prompt: 'Prompt',
  58081. wait: 'Loading...',
  58082. alert: 'Attention'
  58083. },
  58084. iconHeight: 35,
  58085. makeButton: function(btnIdx) {
  58086. var btnId = this.buttonIds[btnIdx];
  58087. return new Ext.button.Button({
  58088. handler: this.btnCallback,
  58089. itemId: btnId,
  58090. scope: this,
  58091. text: this.buttonText[btnId],
  58092. minWidth: 75
  58093. });
  58094. },
  58095. btnCallback: function(btn) {
  58096. var me = this,
  58097. value,
  58098. field;
  58099. if (me.cfg.prompt || me.cfg.multiline) {
  58100. if (me.cfg.multiline) {
  58101. field = me.textArea;
  58102. } else {
  58103. field = me.textField;
  58104. }
  58105. value = field.getValue();
  58106. field.reset();
  58107. }
  58108. btn.blur();
  58109. me.hide();
  58110. me.userCallback(btn.itemId, value, me.cfg);
  58111. },
  58112. hide: function() {
  58113. var me = this;
  58114. me.dd.endDrag();
  58115. me.progressBar.reset();
  58116. me.removeCls(me.cfg.cls);
  58117. me.callParent(arguments);
  58118. },
  58119. initComponent: function() {
  58120. var me = this,
  58121. baseId = me.id,
  58122. i, button,
  58123. tbLayout;
  58124. me.title = '&#160;';
  58125. me.topContainer = new Ext.container.Container({
  58126. layout: 'hbox',
  58127. style: {
  58128. padding: '10px',
  58129. overflow: 'hidden'
  58130. },
  58131. items: [
  58132. me.iconComponent = new Ext.Component({
  58133. cls: me.baseCls + '-icon',
  58134. width: 50,
  58135. height: me.iconHeight
  58136. }),
  58137. me.promptContainer = new Ext.container.Container({
  58138. flex: 1,
  58139. layout: {
  58140. type: 'anchor'
  58141. },
  58142. items: [
  58143. me.msg = new Ext.form.field.Display({
  58144. id: baseId + '-displayfield',
  58145. cls: me.baseCls + '-text'
  58146. }),
  58147. me.textField = new Ext.form.field.Text({
  58148. id: baseId + '-testfield',
  58149. anchor: '100%',
  58150. enableKeyEvents: true,
  58151. listeners: {
  58152. keydown: me.onPromptKey,
  58153. scope: me
  58154. }
  58155. }),
  58156. me.textArea = new Ext.form.field.TextArea({
  58157. id: baseId + '-textarea',
  58158. anchor: '100%',
  58159. height: 75
  58160. })
  58161. ]
  58162. })
  58163. ]
  58164. });
  58165. me.progressBar = new Ext.ProgressBar({
  58166. id: baseId + '-progressbar',
  58167. margins: '0 10 0 10'
  58168. });
  58169. me.items = [me.topContainer, me.progressBar];
  58170. me.msgButtons = [];
  58171. for (i = 0; i < 4; i++) {
  58172. button = me.makeButton(i);
  58173. me.msgButtons[button.itemId] = button;
  58174. me.msgButtons.push(button);
  58175. }
  58176. me.bottomTb = new Ext.toolbar.Toolbar({
  58177. id: baseId + '-toolbar',
  58178. ui: 'footer',
  58179. dock: 'bottom',
  58180. layout: {
  58181. pack: 'center'
  58182. },
  58183. items: [
  58184. me.msgButtons[0],
  58185. me.msgButtons[1],
  58186. me.msgButtons[2],
  58187. me.msgButtons[3]
  58188. ]
  58189. });
  58190. me.dockedItems = [me.bottomTb];
  58191. tbLayout = me.bottomTb.getLayout();
  58192. tbLayout.finishedLayout = Ext.Function.createInterceptor(tbLayout.finishedLayout, function(ownerContext) {
  58193. me.tbWidth = ownerContext.getProp('contentWidth');
  58194. });
  58195. me.on('close', me.onClose, me);
  58196. me.callParent();
  58197. },
  58198. onClose: function(){
  58199. var btn = this.header.child('[type=close]');
  58200. btn.itemId = 'cancel';
  58201. this.btnCallback(btn);
  58202. delete btn.itemId;
  58203. },
  58204. onPromptKey: function(textField, e) {
  58205. var me = this,
  58206. blur;
  58207. if (e.keyCode === Ext.EventObject.RETURN || e.keyCode === 10) {
  58208. if (me.msgButtons.ok.isVisible()) {
  58209. blur = true;
  58210. me.msgButtons.ok.handler.call(me, me.msgButtons.ok);
  58211. } else if (me.msgButtons.yes.isVisible()) {
  58212. me.msgButtons.yes.handler.call(me, me.msgButtons.yes);
  58213. blur = true;
  58214. }
  58215. if (blur) {
  58216. me.textField.blur();
  58217. }
  58218. }
  58219. },
  58220. reconfigure: function(cfg) {
  58221. var me = this,
  58222. buttons = 0,
  58223. hideToolbar = true,
  58224. initialWidth = me.maxWidth,
  58225. oldButtonText = me.buttonText,
  58226. i;
  58227. me.updateButtonText();
  58228. cfg = cfg || {};
  58229. me.cfg = cfg;
  58230. if (cfg.width) {
  58231. initialWidth = cfg.width;
  58232. }
  58233. delete me.defaultFocus;
  58234. me.animateTarget = cfg.animateTarget || undefined;
  58235. me.modal = cfg.modal !== false;
  58236. if (cfg.title) {
  58237. me.setTitle(cfg.title||'&#160;');
  58238. }
  58239. if (Ext.isObject(cfg.buttons)) {
  58240. me.buttonText = cfg.buttons;
  58241. buttons = 0;
  58242. } else {
  58243. me.buttonText = cfg.buttonText || me.buttonText;
  58244. buttons = Ext.isNumber(cfg.buttons) ? cfg.buttons : 0;
  58245. }
  58246. buttons = buttons | me.updateButtonText();
  58247. me.buttonText = oldButtonText;
  58248. Ext.suspendLayouts();
  58249. me.hidden = false;
  58250. if (!me.rendered) {
  58251. me.width = initialWidth;
  58252. me.render(Ext.getBody());
  58253. } else {
  58254. me.setSize(initialWidth, me.maxHeight);
  58255. }
  58256. me.closable = cfg.closable && !cfg.wait;
  58257. me.header.child('[type=close]').setVisible(cfg.closable !== false);
  58258. if (!cfg.title && !me.closable) {
  58259. me.header.hide();
  58260. } else {
  58261. me.header.show();
  58262. }
  58263. me.liveDrag = !cfg.proxyDrag;
  58264. me.userCallback = Ext.Function.bind(cfg.callback ||cfg.fn || Ext.emptyFn, cfg.scope || Ext.global);
  58265. me.setIcon(cfg.icon);
  58266. if (cfg.msg) {
  58267. me.msg.setValue(cfg.msg);
  58268. me.msg.show();
  58269. } else {
  58270. me.msg.hide();
  58271. }
  58272. Ext.resumeLayouts(true);
  58273. Ext.suspendLayouts();
  58274. if (cfg.prompt || cfg.multiline) {
  58275. me.multiline = cfg.multiline;
  58276. if (cfg.multiline) {
  58277. me.textArea.setValue(cfg.value);
  58278. me.textArea.setHeight(cfg.defaultTextHeight || me.defaultTextHeight);
  58279. me.textArea.show();
  58280. me.textField.hide();
  58281. me.defaultFocus = me.textArea;
  58282. } else {
  58283. me.textField.setValue(cfg.value);
  58284. me.textArea.hide();
  58285. me.textField.show();
  58286. me.defaultFocus = me.textField;
  58287. }
  58288. } else {
  58289. me.textArea.hide();
  58290. me.textField.hide();
  58291. }
  58292. if (cfg.progress || cfg.wait) {
  58293. me.progressBar.show();
  58294. me.updateProgress(0, cfg.progressText);
  58295. if(cfg.wait === true){
  58296. me.progressBar.wait(cfg.waitConfig);
  58297. }
  58298. } else {
  58299. me.progressBar.hide();
  58300. }
  58301. for (i = 0; i < 4; i++) {
  58302. if (buttons & Math.pow(2, i)) {
  58303. if (!me.defaultFocus) {
  58304. me.defaultFocus = me.msgButtons[i];
  58305. }
  58306. me.msgButtons[i].show();
  58307. hideToolbar = false;
  58308. } else {
  58309. me.msgButtons[i].hide();
  58310. }
  58311. }
  58312. if (hideToolbar) {
  58313. me.bottomTb.hide();
  58314. } else {
  58315. me.bottomTb.show();
  58316. }
  58317. Ext.resumeLayouts(true);
  58318. },
  58319. updateButtonText: function() {
  58320. var me = this,
  58321. buttonText = me.buttonText,
  58322. buttons = 0,
  58323. btnId,
  58324. btn;
  58325. for (btnId in buttonText) {
  58326. if (buttonText.hasOwnProperty(btnId)) {
  58327. btn = me.msgButtons[btnId];
  58328. if (btn) {
  58329. if (me.cfg && me.cfg.buttonText) {
  58330. buttons = buttons | Math.pow(2, Ext.Array.indexOf(me.buttonIds, btnId));
  58331. }
  58332. if (btn.text != buttonText[btnId]) {
  58333. btn.setText(buttonText[btnId]);
  58334. }
  58335. }
  58336. }
  58337. }
  58338. return buttons;
  58339. },
  58340. show: function(cfg) {
  58341. var me = this;
  58342. me.reconfigure(cfg);
  58343. me.addCls(cfg.cls);
  58344. me.doAutoSize();
  58345. me.hidden = true;
  58346. me.callParent();
  58347. return me;
  58348. },
  58349. onShow: function() {
  58350. this.callParent(arguments);
  58351. this.center();
  58352. },
  58353. doAutoSize: function() {
  58354. var me = this,
  58355. headerVisible = me.header.rendered && me.header.isVisible(),
  58356. footerVisible = me.bottomTb.rendered && me.bottomTb.isVisible(),
  58357. width,
  58358. height;
  58359. if (!Ext.isDefined(me.frameWidth)) {
  58360. me.frameWidth = me.el.getWidth() - me.body.getWidth();
  58361. }
  58362. me.minWidth = me.cfg.minWidth || Ext.getClass(this).prototype.minWidth;
  58363. width = Math.max(
  58364. headerVisible ? me.header.getMinWidth() : 0,
  58365. me.cfg.width || me.msg.getWidth() + me.iconComponent.getWidth() + 25,
  58366. (footerVisible ? me.tbWidth : 0)
  58367. );
  58368. height = (headerVisible ? me.header.getHeight() : 0) +
  58369. me.topContainer.getHeight() +
  58370. me.progressBar.getHeight() +
  58371. (footerVisible ? me.bottomTb.getHeight() + me.bottomTb.el.getMargin('tb') : 0);
  58372. me.setSize(width + me.frameWidth, height + me.frameWidth);
  58373. return me;
  58374. },
  58375. updateText: function(text) {
  58376. this.msg.setValue(text);
  58377. return this.doAutoSize(true);
  58378. },
  58379. setIcon : function(icon) {
  58380. var me = this;
  58381. me.iconComponent.removeCls(me.messageIconCls);
  58382. if (icon) {
  58383. me.iconComponent.show();
  58384. me.iconComponent.addCls(Ext.baseCSSPrefix + 'dlg-icon');
  58385. me.iconComponent.addCls(me.messageIconCls = icon);
  58386. } else {
  58387. me.iconComponent.removeCls(Ext.baseCSSPrefix + 'dlg-icon');
  58388. me.iconComponent.hide();
  58389. }
  58390. return me;
  58391. },
  58392. updateProgress : function(value, progressText, msg){
  58393. this.progressBar.updateProgress(value, progressText);
  58394. if (msg){
  58395. this.updateText(msg);
  58396. }
  58397. return this;
  58398. },
  58399. onEsc: function() {
  58400. if (this.closable !== false) {
  58401. this.callParent(arguments);
  58402. }
  58403. },
  58404. confirm: function(cfg, msg, fn, scope) {
  58405. if (Ext.isString(cfg)) {
  58406. cfg = {
  58407. title: cfg,
  58408. icon: this.QUESTION,
  58409. msg: msg,
  58410. buttons: this.YESNO,
  58411. callback: fn,
  58412. scope: scope
  58413. };
  58414. }
  58415. return this.show(cfg);
  58416. },
  58417. prompt : function(cfg, msg, fn, scope, multiline, value){
  58418. if (Ext.isString(cfg)) {
  58419. cfg = {
  58420. prompt: true,
  58421. title: cfg,
  58422. minWidth: this.minPromptWidth,
  58423. msg: msg,
  58424. buttons: this.OKCANCEL,
  58425. callback: fn,
  58426. scope: scope,
  58427. multiline: multiline,
  58428. value: value
  58429. };
  58430. }
  58431. return this.show(cfg);
  58432. },
  58433. wait : function(cfg, title, config){
  58434. if (Ext.isString(cfg)) {
  58435. cfg = {
  58436. title : title,
  58437. msg : cfg,
  58438. closable: false,
  58439. wait: true,
  58440. modal: true,
  58441. minWidth: this.minProgressWidth,
  58442. waitConfig: config
  58443. };
  58444. }
  58445. return this.show(cfg);
  58446. },
  58447. alert: function(cfg, msg, fn, scope) {
  58448. if (Ext.isString(cfg)) {
  58449. cfg = {
  58450. title : cfg,
  58451. msg : msg,
  58452. buttons: this.OK,
  58453. fn: fn,
  58454. scope : scope,
  58455. minWidth: this.minWidth
  58456. };
  58457. }
  58458. return this.show(cfg);
  58459. },
  58460. progress : function(cfg, msg, progressText){
  58461. if (Ext.isString(cfg)) {
  58462. cfg = {
  58463. title: cfg,
  58464. msg: msg,
  58465. progress: true,
  58466. progressText: progressText
  58467. };
  58468. }
  58469. return this.show(cfg);
  58470. }
  58471. }, function() {
  58472. Ext.MessageBox = Ext.Msg = new this();
  58473. });
  58474. Ext.define('Ext.form.Basic', {
  58475. extend: 'Ext.util.Observable',
  58476. alternateClassName: 'Ext.form.BasicForm',
  58477. requires: ['Ext.util.MixedCollection', 'Ext.form.action.Load', 'Ext.form.action.Submit',
  58478. 'Ext.window.MessageBox', 'Ext.data.Errors', 'Ext.util.DelayedTask'],
  58479. constructor: function(owner, config) {
  58480. var me = this,
  58481. onItemAddOrRemove = me.onItemAddOrRemove,
  58482. api,
  58483. fn;
  58484. me.owner = owner;
  58485. me.mon(owner, {
  58486. add: onItemAddOrRemove,
  58487. remove: onItemAddOrRemove,
  58488. scope: me
  58489. });
  58490. Ext.apply(me, config);
  58491. if (Ext.isString(me.paramOrder)) {
  58492. me.paramOrder = me.paramOrder.split(/[\s,|]/);
  58493. }
  58494. if (me.api) {
  58495. api = me.api = Ext.apply({}, me.api);
  58496. for (fn in api) {
  58497. if (api.hasOwnProperty(fn)) {
  58498. api[fn] = Ext.direct.Manager.parseMethod(api[fn]);
  58499. }
  58500. }
  58501. }
  58502. me.checkValidityTask = new Ext.util.DelayedTask(me.checkValidity, me);
  58503. me.addEvents(
  58504. 'beforeaction',
  58505. 'actionfailed',
  58506. 'actioncomplete',
  58507. 'validitychange',
  58508. 'dirtychange'
  58509. );
  58510. me.callParent();
  58511. },
  58512. initialize : function() {
  58513. var me = this;
  58514. me.initialized = true;
  58515. me.onValidityChange(!me.hasInvalidField());
  58516. },
  58517. timeout: 30,
  58518. paramsAsHash: false,
  58519. waitTitle: 'Please Wait...',
  58520. trackResetOnLoad: false,
  58521. wasDirty: false,
  58522. destroy: function() {
  58523. this.clearListeners();
  58524. this.checkValidityTask.cancel();
  58525. },
  58526. onItemAddOrRemove: function(parent, child) {
  58527. var me = this,
  58528. isAdding = !!child.ownerCt,
  58529. isContainer = child.isContainer;
  58530. function handleField(field) {
  58531. me[isAdding ? 'mon' : 'mun'](field, {
  58532. validitychange: me.checkValidity,
  58533. dirtychange: me.checkDirty,
  58534. scope: me,
  58535. buffer: 100
  58536. });
  58537. delete me._fields;
  58538. }
  58539. if (child.isFormField) {
  58540. handleField(child);
  58541. } else if (isContainer) {
  58542. if (child.isDestroyed || child.destroying) {
  58543. delete me._fields;
  58544. } else {
  58545. Ext.Array.forEach(child.query('[isFormField]'), handleField);
  58546. }
  58547. }
  58548. delete this._boundItems;
  58549. if (me.initialized) {
  58550. me.checkValidityTask.delay(10);
  58551. }
  58552. },
  58553. getFields: function() {
  58554. var fields = this._fields;
  58555. if (!fields) {
  58556. fields = this._fields = new Ext.util.MixedCollection();
  58557. fields.addAll(this.owner.query('[isFormField]'));
  58558. }
  58559. return fields;
  58560. },
  58561. getBoundItems: function() {
  58562. var boundItems = this._boundItems;
  58563. if (!boundItems || boundItems.getCount() === 0) {
  58564. boundItems = this._boundItems = new Ext.util.MixedCollection();
  58565. boundItems.addAll(this.owner.query('[formBind]'));
  58566. }
  58567. return boundItems;
  58568. },
  58569. hasInvalidField: function() {
  58570. return !!this.getFields().findBy(function(field) {
  58571. var preventMark = field.preventMark,
  58572. isValid;
  58573. field.preventMark = true;
  58574. isValid = field.isValid();
  58575. field.preventMark = preventMark;
  58576. return !isValid;
  58577. });
  58578. },
  58579. isValid: function() {
  58580. var me = this,
  58581. invalid;
  58582. Ext.suspendLayouts();
  58583. invalid = me.getFields().filterBy(function(field) {
  58584. return !field.validate();
  58585. });
  58586. Ext.resumeLayouts(true);
  58587. return invalid.length < 1;
  58588. },
  58589. checkValidity: function() {
  58590. var me = this,
  58591. valid = !me.hasInvalidField();
  58592. if (valid !== me.wasValid) {
  58593. me.onValidityChange(valid);
  58594. me.fireEvent('validitychange', me, valid);
  58595. me.wasValid = valid;
  58596. }
  58597. },
  58598. onValidityChange: function(valid) {
  58599. var boundItems = this.getBoundItems(),
  58600. items, i, iLen, cmp;
  58601. if (boundItems) {
  58602. items = boundItems.items;
  58603. iLen = items.length;
  58604. for (i = 0; i < iLen; i++) {
  58605. cmp = items[i];
  58606. if (cmp.disabled === valid) {
  58607. cmp.setDisabled(!valid);
  58608. }
  58609. }
  58610. }
  58611. },
  58612. isDirty: function() {
  58613. return !!this.getFields().findBy(function(f) {
  58614. return f.isDirty();
  58615. });
  58616. },
  58617. checkDirty: function() {
  58618. var dirty = this.isDirty();
  58619. if (dirty !== this.wasDirty) {
  58620. this.fireEvent('dirtychange', this, dirty);
  58621. this.wasDirty = dirty;
  58622. }
  58623. },
  58624. hasUpload: function() {
  58625. return !!this.getFields().findBy(function(f) {
  58626. return f.isFileUpload();
  58627. });
  58628. },
  58629. doAction: function(action, options) {
  58630. if (Ext.isString(action)) {
  58631. action = Ext.ClassManager.instantiateByAlias('formaction.' + action, Ext.apply({}, options, {form: this}));
  58632. }
  58633. if (this.fireEvent('beforeaction', this, action) !== false) {
  58634. this.beforeAction(action);
  58635. Ext.defer(action.run, 100, action);
  58636. }
  58637. return this;
  58638. },
  58639. submit: function(options) {
  58640. options = options || {};
  58641. var me = this,
  58642. action;
  58643. if (options.standardSubmit || me.standardSubmit) {
  58644. action = 'standardsubmit';
  58645. } else {
  58646. action = me.api ? 'directsubmit' : 'submit';
  58647. }
  58648. return me.doAction(action, options);
  58649. },
  58650. load: function(options) {
  58651. return this.doAction(this.api ? 'directload' : 'load', options);
  58652. },
  58653. updateRecord: function(record) {
  58654. record = record || this._record;
  58655. var fields = record.fields.items,
  58656. values = this.getFieldValues(),
  58657. obj = {},
  58658. i = 0,
  58659. len = fields.length,
  58660. name;
  58661. for (; i < len; ++i) {
  58662. name = fields[i].name;
  58663. if (values.hasOwnProperty(name)) {
  58664. obj[name] = values[name];
  58665. }
  58666. }
  58667. record.beginEdit();
  58668. record.set(obj);
  58669. record.endEdit();
  58670. return this;
  58671. },
  58672. loadRecord: function(record) {
  58673. this._record = record;
  58674. return this.setValues(record.data);
  58675. },
  58676. getRecord: function() {
  58677. return this._record;
  58678. },
  58679. beforeAction: function(action) {
  58680. var waitMsg = action.waitMsg,
  58681. maskCls = Ext.baseCSSPrefix + 'mask-loading',
  58682. fields = this.getFields().items,
  58683. f,
  58684. fLen = fields.length,
  58685. field, waitMsgTarget;
  58686. for (f = 0; f < fLen; f++) {
  58687. field = fields[f];
  58688. if (field.isFormField && field.syncValue) {
  58689. field.syncValue();
  58690. }
  58691. }
  58692. if (waitMsg) {
  58693. waitMsgTarget = this.waitMsgTarget;
  58694. if (waitMsgTarget === true) {
  58695. this.owner.el.mask(waitMsg, maskCls);
  58696. } else if (waitMsgTarget) {
  58697. waitMsgTarget = this.waitMsgTarget = Ext.get(waitMsgTarget);
  58698. waitMsgTarget.mask(waitMsg, maskCls);
  58699. } else {
  58700. Ext.MessageBox.wait(waitMsg, action.waitTitle || this.waitTitle);
  58701. }
  58702. }
  58703. },
  58704. afterAction: function(action, success) {
  58705. if (action.waitMsg) {
  58706. var messageBox = Ext.MessageBox,
  58707. waitMsgTarget = this.waitMsgTarget;
  58708. if (waitMsgTarget === true) {
  58709. this.owner.el.unmask();
  58710. } else if (waitMsgTarget) {
  58711. waitMsgTarget.unmask();
  58712. } else {
  58713. messageBox.suspendEvents();
  58714. messageBox.hide();
  58715. messageBox.resumeEvents();
  58716. }
  58717. }
  58718. if (success) {
  58719. if (action.reset) {
  58720. this.reset();
  58721. }
  58722. Ext.callback(action.success, action.scope || action, [this, action]);
  58723. this.fireEvent('actioncomplete', this, action);
  58724. } else {
  58725. Ext.callback(action.failure, action.scope || action, [this, action]);
  58726. this.fireEvent('actionfailed', this, action);
  58727. }
  58728. },
  58729. findField: function(id) {
  58730. return this.getFields().findBy(function(f) {
  58731. return f.id === id || f.getName() === id;
  58732. });
  58733. },
  58734. markInvalid: function(errors) {
  58735. var me = this,
  58736. e, eLen, error, value,
  58737. key;
  58738. function mark(fieldId, msg) {
  58739. var field = me.findField(fieldId);
  58740. if (field) {
  58741. field.markInvalid(msg);
  58742. }
  58743. }
  58744. if (Ext.isArray(errors)) {
  58745. eLen = errors.length;
  58746. for (e = 0; e < eLen; e++) {
  58747. error = errors[e];
  58748. mark(error.id, error.msg);
  58749. }
  58750. } else if (errors instanceof Ext.data.Errors) {
  58751. eLen = errors.items.length;
  58752. for (e = 0; e < eLen; e++) {
  58753. error = errors.items[e];
  58754. mark(error.field, error.message);
  58755. }
  58756. } else {
  58757. for (key in errors) {
  58758. if (errors.hasOwnProperty(key)) {
  58759. value = errors[key];
  58760. mark(key, value, errors);
  58761. }
  58762. }
  58763. }
  58764. return this;
  58765. },
  58766. setValues: function(values) {
  58767. var me = this,
  58768. v, vLen, val, field;
  58769. function setVal(fieldId, val) {
  58770. var field = me.findField(fieldId);
  58771. if (field) {
  58772. field.setValue(val);
  58773. if (me.trackResetOnLoad) {
  58774. field.resetOriginalValue();
  58775. }
  58776. }
  58777. }
  58778. if (Ext.isArray(values)) {
  58779. vLen = values.length;
  58780. for (v = 0; v < vLen; v++) {
  58781. val = values[v];
  58782. setVal(val.id, val.value);
  58783. }
  58784. } else {
  58785. Ext.iterate(values, setVal);
  58786. }
  58787. return this;
  58788. },
  58789. getValues: function(asString, dirtyOnly, includeEmptyText, useDataValues) {
  58790. var values = {},
  58791. fields = this.getFields().items,
  58792. f,
  58793. fLen = fields.length,
  58794. isArray = Ext.isArray,
  58795. field, data, val, bucket, name;
  58796. for (f = 0; f < fLen; f++) {
  58797. field = fields[f];
  58798. if (!dirtyOnly || field.isDirty()) {
  58799. data = field[useDataValues ? 'getModelData' : 'getSubmitData'](includeEmptyText);
  58800. if (Ext.isObject(data)) {
  58801. for (name in data) {
  58802. if (data.hasOwnProperty(name)) {
  58803. val = data[name];
  58804. if (includeEmptyText && val === '') {
  58805. val = field.emptyText || '';
  58806. }
  58807. if (values.hasOwnProperty(name)) {
  58808. bucket = values[name];
  58809. if (!isArray(bucket)) {
  58810. bucket = values[name] = [bucket];
  58811. }
  58812. if (isArray(val)) {
  58813. values[name] = values[name] = bucket.concat(val);
  58814. } else {
  58815. bucket.push(val);
  58816. }
  58817. } else {
  58818. values[name] = val;
  58819. }
  58820. }
  58821. }
  58822. }
  58823. }
  58824. }
  58825. if (asString) {
  58826. values = Ext.Object.toQueryString(values);
  58827. }
  58828. return values;
  58829. },
  58830. getFieldValues: function(dirtyOnly) {
  58831. return this.getValues(false, dirtyOnly, false, true);
  58832. },
  58833. clearInvalid: function() {
  58834. Ext.suspendLayouts();
  58835. var me = this,
  58836. fields = me.getFields().items,
  58837. f,
  58838. fLen = fields.length;
  58839. for (f = 0; f < fLen; f++) {
  58840. fields[f].clearInvalid();
  58841. }
  58842. Ext.resumeLayouts(true);
  58843. return me;
  58844. },
  58845. reset: function() {
  58846. Ext.suspendLayouts();
  58847. var me = this,
  58848. fields = me.getFields().items,
  58849. f,
  58850. fLen = fields.length;
  58851. for (f = 0; f < fLen; f++) {
  58852. fields[f].reset();
  58853. }
  58854. Ext.resumeLayouts(true);
  58855. return me;
  58856. },
  58857. applyToFields: function(obj) {
  58858. var fields = this.getFields().items,
  58859. f,
  58860. fLen = fields.length;
  58861. for (f = 0; f < fLen; f++) {
  58862. Ext.apply(fields[f], obj);
  58863. }
  58864. return this;
  58865. },
  58866. applyIfToFields: function(obj) {
  58867. var fields = this.getFields().items,
  58868. f,
  58869. fLen = fields.length;
  58870. for (f = 0; f < fLen; f++) {
  58871. Ext.applyIf(fields[f], obj);
  58872. }
  58873. return this;
  58874. }
  58875. });
  58876. Ext.define('Ext.layout.container.CheckboxGroup', {
  58877. extend: 'Ext.layout.container.Container',
  58878. alias: ['layout.checkboxgroup'],
  58879. autoFlex: true,
  58880. type: 'checkboxgroup',
  58881. childEls: [
  58882. 'innerCt'
  58883. ],
  58884. renderTpl: [
  58885. '<table id="{ownerId}-innerCt" role="presentation" style="{tableStyle}"><tbody><tr>',
  58886. '<tpl for="columns">',
  58887. '<td class="{parent.colCls}" valign="top" style="{style}">',
  58888. '{% this.renderColumn(out,parent,xindex-1) %}',
  58889. '</td>',
  58890. '</tpl>',
  58891. '</tr></tbody></table>'
  58892. ],
  58893. lastOwnerItemsGeneration : null,
  58894. beginLayout: function(ownerContext) {
  58895. var me = this,
  58896. columns,
  58897. numCols,
  58898. i, width, cwidth,
  58899. totalFlex = 0, flexedCols = 0,
  58900. autoFlex = me.autoFlex,
  58901. innerCtStyle = me.innerCt.dom.style;
  58902. me.callParent(arguments);
  58903. columns = me.columnNodes;
  58904. ownerContext.innerCtContext = ownerContext.getEl('innerCt', me);
  58905. if (!ownerContext.widthModel.shrinkWrap) {
  58906. numCols = columns.length;
  58907. if (me.columnsArray) {
  58908. for (i = 0; i < numCols; i++) {
  58909. width = me.owner.columns[i];
  58910. if (width < 1) {
  58911. totalFlex += width;
  58912. flexedCols++;
  58913. }
  58914. }
  58915. for (i = 0; i < numCols; i++) {
  58916. width = me.owner.columns[i];
  58917. if (width < 1) {
  58918. cwidth = ((width / totalFlex) * 100) + '%';
  58919. } else {
  58920. cwidth = width + 'px';
  58921. }
  58922. columns[i].style.width = cwidth;
  58923. }
  58924. }
  58925. else {
  58926. for (i = 0; i < numCols; i++) {
  58927. cwidth = autoFlex
  58928. ? (1 / numCols * 100) + '%'
  58929. : '';
  58930. columns[i].style.width = cwidth;
  58931. flexedCols++;
  58932. }
  58933. }
  58934. if (!flexedCols) {
  58935. innerCtStyle.tableLayout = 'fixed';
  58936. innerCtStyle.width = '';
  58937. } else if (flexedCols < numCols) {
  58938. innerCtStyle.tableLayout = 'fixed';
  58939. innerCtStyle.width = '100%';
  58940. } else {
  58941. innerCtStyle.tableLayout = 'auto';
  58942. if (autoFlex) {
  58943. innerCtStyle.width = '100%';
  58944. } else {
  58945. innerCtStyle.width = '';
  58946. }
  58947. }
  58948. } else {
  58949. innerCtStyle.tableLayout = 'auto';
  58950. innerCtStyle.width = '';
  58951. }
  58952. },
  58953. cacheElements: function () {
  58954. var me = this;
  58955. me.callParent();
  58956. me.rowEl = me.innerCt.down('tr');
  58957. me.columnNodes = me.rowEl.dom.childNodes;
  58958. },
  58959. calculate: function(ownerContext) {
  58960. var me = this,
  58961. targetContext, widthShrinkWrap, heightShrinkWrap, shrinkWrap, table, targetPadding;
  58962. if (!ownerContext.getDomProp('containerChildrenDone')) {
  58963. me.done = false;
  58964. } else {
  58965. targetContext = ownerContext.innerCtContext;
  58966. widthShrinkWrap = ownerContext.widthModel.shrinkWrap;
  58967. heightShrinkWrap = ownerContext.heightModel.shrinkWrap;
  58968. shrinkWrap = heightShrinkWrap || widthShrinkWrap;
  58969. table = targetContext.el.dom;
  58970. targetPadding = shrinkWrap && targetContext.getPaddingInfo();
  58971. if (widthShrinkWrap) {
  58972. ownerContext.setContentWidth(table.offsetWidth + targetPadding.width, true);
  58973. }
  58974. if (heightShrinkWrap) {
  58975. ownerContext.setContentHeight(table.offsetHeight + targetPadding.height, true);
  58976. }
  58977. }
  58978. },
  58979. doRenderColumn: function (out, renderData, columnIndex) {
  58980. var me = renderData.$layout,
  58981. owner = me.owner,
  58982. columnCount = renderData.columnCount,
  58983. items = owner.items.items,
  58984. itemCount = items.length,
  58985. item, itemIndex, rowCount, increment, tree;
  58986. if (owner.vertical) {
  58987. rowCount = Math.ceil(itemCount / columnCount);
  58988. itemIndex = columnIndex * rowCount;
  58989. itemCount = Math.min(itemCount, itemIndex + rowCount);
  58990. increment = 1;
  58991. } else {
  58992. itemIndex = columnIndex;
  58993. increment = columnCount;
  58994. }
  58995. for ( ; itemIndex < itemCount; itemIndex += increment) {
  58996. item = items[itemIndex];
  58997. me.configureItem(item);
  58998. tree = item.getRenderTree();
  58999. Ext.DomHelper.generateMarkup(tree, out);
  59000. }
  59001. },
  59002. getColumnCount: function() {
  59003. var me = this,
  59004. owner = me.owner,
  59005. ownerColumns = owner.columns;
  59006. if (me.columnsArray) {
  59007. return ownerColumns.length;
  59008. }
  59009. if (Ext.isNumber(ownerColumns)) {
  59010. return ownerColumns;
  59011. }
  59012. return owner.items.length;
  59013. },
  59014. getItemSizePolicy: function (item) {
  59015. return this.autoSizePolicy;
  59016. },
  59017. getRenderData: function () {
  59018. var me = this,
  59019. data = me.callParent(),
  59020. owner = me.owner,
  59021. i, columns = me.getColumnCount(),
  59022. width, column, cwidth,
  59023. autoFlex = me.autoFlex,
  59024. totalFlex = 0, flexedCols = 0;
  59025. if (me.columnsArray) {
  59026. for (i=0; i < columns; i++) {
  59027. width = me.owner.columns[i];
  59028. if (width < 1) {
  59029. totalFlex += width;
  59030. flexedCols++;
  59031. }
  59032. }
  59033. }
  59034. data.colCls = owner.groupCls;
  59035. data.columnCount = columns;
  59036. data.columns = [];
  59037. for (i = 0; i < columns; i++) {
  59038. column = (data.columns[i] = {});
  59039. if (me.columnsArray) {
  59040. width = me.owner.columns[i];
  59041. if (width < 1) {
  59042. cwidth = ((width / totalFlex) * 100) + '%';
  59043. } else {
  59044. cwidth = width + 'px';
  59045. }
  59046. column.style = 'width:' + cwidth;
  59047. } else {
  59048. column.style = 'width:' + (1 / columns * 100) + '%';
  59049. flexedCols++;
  59050. }
  59051. }
  59052. data.tableStyle =
  59053. !flexedCols ? 'table-layout:fixed;' :
  59054. (flexedCols < columns) ? 'table-layout:fixed;width:100%' :
  59055. (autoFlex) ? 'table-layout:auto;width:100%' : 'table-layout:auto;';
  59056. return data;
  59057. },
  59058. initLayout: function () {
  59059. var me = this,
  59060. owner = me.owner;
  59061. me.columnsArray = Ext.isArray(owner.columns);
  59062. me.autoColumns = !owner.columns || owner.columns === 'auto';
  59063. me.vertical = owner.vertical;
  59064. me.callParent();
  59065. },
  59066. isValidParent: function() {
  59067. return true;
  59068. },
  59069. setupRenderTpl: function (renderTpl) {
  59070. this.callParent(arguments);
  59071. renderTpl.renderColumn = this.doRenderColumn;
  59072. },
  59073. renderChildren: function () {
  59074. var me = this,
  59075. generation = me.owner.items.generation;
  59076. if (me.lastOwnerItemsGeneration !== generation) {
  59077. me.lastOwnerItemsGeneration = generation;
  59078. me.renderItems(me.getLayoutItems());
  59079. }
  59080. },
  59081. renderItems : function(items) {
  59082. var me = this,
  59083. itemCount = items.length,
  59084. i,
  59085. item,
  59086. rowCount,
  59087. columnCount,
  59088. rowIndex,
  59089. columnIndex;
  59090. if (itemCount) {
  59091. Ext.suspendLayouts();
  59092. if (me.autoColumns) {
  59093. me.addMissingColumns(itemCount);
  59094. }
  59095. columnCount = me.columnNodes.length;
  59096. rowCount = Math.ceil(itemCount / columnCount);
  59097. for (i = 0; i < itemCount; i++) {
  59098. item = items[i];
  59099. rowIndex = me.getRenderRowIndex(i, rowCount, columnCount);
  59100. columnIndex = me.getRenderColumnIndex(i, rowCount, columnCount);
  59101. if (!item.rendered) {
  59102. me.renderItem(item, rowIndex, columnIndex);
  59103. } else if (!me.isItemAtPosition(item, rowIndex, columnIndex)) {
  59104. me.moveItem(item, rowIndex, columnIndex);
  59105. }
  59106. }
  59107. if (me.autoColumns) {
  59108. me.removeExceedingColumns(itemCount);
  59109. }
  59110. Ext.resumeLayouts(true);
  59111. }
  59112. },
  59113. isItemAtPosition : function(item, rowIndex, columnIndex) {
  59114. return item.el.dom === this.getNodeAt(rowIndex, columnIndex);
  59115. },
  59116. getRenderColumnIndex : function(itemIndex, rowCount, columnCount) {
  59117. if (this.vertical) {
  59118. return Math.floor(itemIndex / rowCount);
  59119. } else {
  59120. return itemIndex % columnCount;
  59121. }
  59122. },
  59123. getRenderRowIndex : function(itemIndex, rowCount, columnCount) {
  59124. var me = this;
  59125. if (me.vertical) {
  59126. return itemIndex % rowCount;
  59127. } else {
  59128. return Math.floor(itemIndex / columnCount);
  59129. }
  59130. },
  59131. getNodeAt : function(rowIndex, columnIndex) {
  59132. return this.columnNodes[columnIndex].childNodes[rowIndex];
  59133. },
  59134. addMissingColumns : function(itemsCount) {
  59135. var me = this,
  59136. existingColumnsCount = me.columnNodes.length,
  59137. missingColumnsCount,
  59138. row,
  59139. cls,
  59140. i;
  59141. if (existingColumnsCount < itemsCount) {
  59142. missingColumnsCount = itemsCount - existingColumnsCount;
  59143. row = me.rowEl;
  59144. cls = me.owner.groupCls;
  59145. for (i = 0; i < missingColumnsCount; i++) {
  59146. row.createChild({
  59147. cls: cls,
  59148. tag: 'td',
  59149. vAlign: 'top'
  59150. });
  59151. }
  59152. }
  59153. },
  59154. removeExceedingColumns : function(itemsCount) {
  59155. var me = this,
  59156. existingColumnsCount = me.columnNodes.length,
  59157. exceedingColumnsCount,
  59158. row,
  59159. i;
  59160. if (existingColumnsCount > itemsCount) {
  59161. exceedingColumnsCount = existingColumnsCount - itemsCount;
  59162. row = me.rowEl;
  59163. for (i = 0; i < exceedingColumnsCount; i++) {
  59164. row.last().remove();
  59165. }
  59166. }
  59167. },
  59168. renderItem : function(item, rowIndex, columnIndex) {
  59169. var me = this;
  59170. me.configureItem(item);
  59171. item.render(Ext.get(me.columnNodes[columnIndex]), rowIndex);
  59172. me.afterRenderItem(item);
  59173. },
  59174. moveItem : function(item, rowIndex, columnIndex) {
  59175. var me = this,
  59176. column = me.columnNodes[columnIndex],
  59177. targetNode = column.childNodes[rowIndex];
  59178. column.insertBefore(item.el.dom, targetNode || null);
  59179. }
  59180. });
  59181. Ext.define('Ext.layout.component.field.FieldContainer', {
  59182. extend: 'Ext.layout.component.field.Field',
  59183. alias: 'layout.fieldcontainer',
  59184. type: 'fieldcontainer',
  59185. waitForOuterHeightInDom: true,
  59186. waitForOuterWidthInDom: true,
  59187. beginLayout: function(ownerContext) {
  59188. this.callParent(arguments);
  59189. ownerContext.hasRawContent = true;
  59190. ownerContext.target.bodyEl.setStyle('height', '');
  59191. },
  59192. measureContentHeight: function (ownerContext) {
  59193. return ownerContext.hasDomProp('containerLayoutDone') ? this.callParent(arguments) : NaN;
  59194. },
  59195. measureContentWidth: function (ownerContext) {
  59196. return ownerContext.hasDomProp('containerLayoutDone') ? this.callParent(arguments) : NaN;
  59197. },
  59198. publishInnerWidth: function (ownerContext, width) {
  59199. var bodyContext = ownerContext.bodyCellContext;
  59200. bodyContext.setWidth(bodyContext.el.getWidth(), false);
  59201. },
  59202. publishInnerHeight: function (ownerContext, height) {
  59203. var bodyContext = ownerContext.bodyCellContext;
  59204. bodyContext.setHeight(height - this.measureLabelErrorHeight(ownerContext));
  59205. }
  59206. });
  59207. Ext.define('Ext.form.FieldAncestor', {
  59208. initFieldAncestor: function() {
  59209. var me = this,
  59210. onSubtreeChange = me.onFieldAncestorSubtreeChange;
  59211. me.addEvents(
  59212. 'fieldvaliditychange',
  59213. 'fielderrorchange'
  59214. );
  59215. me.on('add', onSubtreeChange, me);
  59216. me.on('remove', onSubtreeChange, me);
  59217. me.initFieldDefaults();
  59218. },
  59219. initFieldDefaults: function() {
  59220. if (!this.fieldDefaults) {
  59221. this.fieldDefaults = {};
  59222. }
  59223. },
  59224. onFieldAncestorSubtreeChange: function(parent, child) {
  59225. var me = this,
  59226. isAdding = !!child.ownerCt;
  59227. function handleCmp(cmp) {
  59228. var isLabelable = cmp.isFieldLabelable,
  59229. isField = cmp.isFormField;
  59230. if (isLabelable || isField) {
  59231. if (isLabelable) {
  59232. me['onLabelable' + (isAdding ? 'Added' : 'Removed')](cmp);
  59233. }
  59234. if (isField) {
  59235. me['onField' + (isAdding ? 'Added' : 'Removed')](cmp);
  59236. }
  59237. }
  59238. else if (cmp.isContainer) {
  59239. Ext.Array.forEach(cmp.getRefItems(), handleCmp);
  59240. }
  59241. }
  59242. handleCmp(child);
  59243. },
  59244. onLabelableAdded: function(labelable) {
  59245. var me = this;
  59246. me.mon(labelable, 'errorchange', me.handleFieldErrorChange, me, {buffer: 10});
  59247. labelable.setFieldDefaults(me.fieldDefaults);
  59248. },
  59249. onFieldAdded: function(field) {
  59250. var me = this;
  59251. me.mon(field, 'validitychange', me.handleFieldValidityChange, me);
  59252. },
  59253. onLabelableRemoved: function(labelable) {
  59254. var me = this;
  59255. me.mun(labelable, 'errorchange', me.handleFieldErrorChange, me);
  59256. },
  59257. onFieldRemoved: function(field) {
  59258. var me = this;
  59259. me.mun(field, 'validitychange', me.handleFieldValidityChange, me);
  59260. },
  59261. handleFieldValidityChange: function(field, isValid) {
  59262. var me = this;
  59263. me.fireEvent('fieldvaliditychange', me, field, isValid);
  59264. me.onFieldValidityChange(field, isValid);
  59265. },
  59266. handleFieldErrorChange: function(labelable, activeError) {
  59267. var me = this;
  59268. me.fireEvent('fielderrorchange', me, labelable, activeError);
  59269. me.onFieldErrorChange(labelable, activeError);
  59270. },
  59271. onFieldValidityChange: Ext.emptyFn,
  59272. onFieldErrorChange: Ext.emptyFn
  59273. });
  59274. Ext.define('Ext.form.FieldContainer', {
  59275. extend: 'Ext.container.Container',
  59276. mixins: {
  59277. labelable: 'Ext.form.Labelable',
  59278. fieldAncestor: 'Ext.form.FieldAncestor'
  59279. },
  59280. requires: 'Ext.layout.component.field.FieldContainer',
  59281. alias: 'widget.fieldcontainer',
  59282. componentLayout: 'fieldcontainer',
  59283. componentCls: Ext.baseCSSPrefix + 'form-fieldcontainer',
  59284. combineLabels: false,
  59285. labelConnector: ', ',
  59286. combineErrors: false,
  59287. maskOnDisable: false,
  59288. fieldSubTpl: '{%this.renderContainer(out,values)%}',
  59289. initComponent: function() {
  59290. var me = this;
  59291. me.initLabelable();
  59292. me.initFieldAncestor();
  59293. me.callParent();
  59294. },
  59295. beforeRender: function(){
  59296. this.callParent(arguments);
  59297. this.beforeLabelableRender(arguments);
  59298. },
  59299. onLabelableAdded: function(labelable) {
  59300. var me = this;
  59301. me.mixins.fieldAncestor.onLabelableAdded.call(this, labelable);
  59302. me.updateLabel();
  59303. },
  59304. onLabelableRemoved: function(labelable) {
  59305. var me = this;
  59306. me.mixins.fieldAncestor.onLabelableRemoved.call(this, labelable);
  59307. me.updateLabel();
  59308. },
  59309. initRenderTpl: function() {
  59310. var me = this;
  59311. if (!me.hasOwnProperty('renderTpl')) {
  59312. me.renderTpl = me.getTpl('labelableRenderTpl');
  59313. }
  59314. return me.callParent();
  59315. },
  59316. initRenderData: function() {
  59317. return Ext.applyIf(this.callParent(), this.getLabelableRenderData());
  59318. },
  59319. getFieldLabel: function() {
  59320. var label = this.fieldLabel || '';
  59321. if (!label && this.combineLabels) {
  59322. label = Ext.Array.map(this.query('[isFieldLabelable]'), function(field) {
  59323. return field.getFieldLabel();
  59324. }).join(this.labelConnector);
  59325. }
  59326. return label;
  59327. },
  59328. getSubTplData: function() {
  59329. var ret = this.initRenderData();
  59330. Ext.apply(ret, this.subTplData);
  59331. return ret;
  59332. },
  59333. getSubTplMarkup: function() {
  59334. var me = this,
  59335. tpl = me.getTpl('fieldSubTpl'),
  59336. html;
  59337. if (!tpl.renderContent) {
  59338. me.setupRenderTpl(tpl);
  59339. }
  59340. html = tpl.apply(me.getSubTplData());
  59341. return html;
  59342. },
  59343. updateLabel: function() {
  59344. var me = this,
  59345. label = me.labelEl;
  59346. if (label) {
  59347. me.setFieldLabel(me.getFieldLabel());
  59348. }
  59349. },
  59350. onFieldErrorChange: function(field, activeError) {
  59351. if (this.combineErrors) {
  59352. var me = this,
  59353. oldError = me.getActiveError(),
  59354. invalidFields = Ext.Array.filter(me.query('[isFormField]'), function(field) {
  59355. return field.hasActiveError();
  59356. }),
  59357. newErrors = me.getCombinedErrors(invalidFields);
  59358. if (newErrors) {
  59359. me.setActiveErrors(newErrors);
  59360. } else {
  59361. me.unsetActiveError();
  59362. }
  59363. if (oldError !== me.getActiveError()) {
  59364. me.doComponentLayout();
  59365. }
  59366. }
  59367. },
  59368. getCombinedErrors: function(invalidFields) {
  59369. var errors = [],
  59370. f,
  59371. fLen = invalidFields.length,
  59372. field,
  59373. activeErrors, a, aLen,
  59374. error, label;
  59375. for (f = 0; f < fLen; f++) {
  59376. field = invalidFields[f];
  59377. activeErrors = field.getActiveErrors();
  59378. aLen = activeErrors.length;
  59379. for (a = 0; a < aLen; a++) {
  59380. error = activeErrors[a];
  59381. label = field.getFieldLabel();
  59382. errors.push((label ? label + ': ' : '') + error);
  59383. }
  59384. }
  59385. return errors;
  59386. },
  59387. getTargetEl: function() {
  59388. return this.bodyEl || this.callParent();
  59389. }
  59390. });
  59391. Ext.define('Ext.form.CheckboxGroup', {
  59392. extend:'Ext.form.FieldContainer',
  59393. mixins: {
  59394. field: 'Ext.form.field.Field'
  59395. },
  59396. alias: 'widget.checkboxgroup',
  59397. requires: ['Ext.layout.container.CheckboxGroup', 'Ext.form.field.Base'],
  59398. columns : 'auto',
  59399. vertical : false,
  59400. allowBlank : true,
  59401. blankText : "You must select at least one item in this group",
  59402. defaultType : 'checkboxfield',
  59403. groupCls : Ext.baseCSSPrefix + 'form-check-group',
  59404. fieldBodyCls: Ext.baseCSSPrefix + 'form-checkboxgroup-body',
  59405. layout: 'checkboxgroup',
  59406. initComponent: function() {
  59407. var me = this;
  59408. me.callParent();
  59409. me.initField();
  59410. },
  59411. initValue: function() {
  59412. var me = this,
  59413. valueCfg = me.value;
  59414. me.originalValue = me.lastValue = valueCfg || me.getValue();
  59415. if (valueCfg) {
  59416. me.setValue(valueCfg);
  59417. }
  59418. },
  59419. onFieldAdded: function(field) {
  59420. var me = this;
  59421. if (field.isCheckbox) {
  59422. me.mon(field, 'change', me.checkChange, me);
  59423. }
  59424. me.callParent(arguments);
  59425. },
  59426. onFieldRemoved: function(field) {
  59427. var me = this;
  59428. if (field.isCheckbox) {
  59429. me.mun(field, 'change', me.checkChange, me);
  59430. }
  59431. me.callParent(arguments);
  59432. },
  59433. isEqual: function(value1, value2) {
  59434. var toQueryString = Ext.Object.toQueryString;
  59435. return toQueryString(value1) === toQueryString(value2);
  59436. },
  59437. getErrors: function() {
  59438. var errors = [];
  59439. if (!this.allowBlank && Ext.isEmpty(this.getChecked())) {
  59440. errors.push(this.blankText);
  59441. }
  59442. return errors;
  59443. },
  59444. getBoxes: function(query) {
  59445. return this.query('[isCheckbox]' + (query||''));
  59446. },
  59447. eachBox: function(fn, scope) {
  59448. Ext.Array.forEach(this.getBoxes(), fn, scope || this);
  59449. },
  59450. getChecked: function() {
  59451. return this.getBoxes('[checked]');
  59452. },
  59453. isDirty: function(){
  59454. var boxes = this.getBoxes(),
  59455. b ,
  59456. bLen = boxes.length;
  59457. for (b = 0; b < bLen; b++) {
  59458. if (boxes[b].isDirty()) {
  59459. return true;
  59460. }
  59461. }
  59462. },
  59463. setReadOnly: function(readOnly) {
  59464. var boxes = this.getBoxes(),
  59465. b,
  59466. bLen = boxes.length;
  59467. for (b = 0; b < bLen; b++) {
  59468. boxes[b].setReadOnly(readOnly);
  59469. }
  59470. this.readOnly = readOnly;
  59471. },
  59472. reset: function() {
  59473. var me = this,
  59474. hadError = me.hasActiveError(),
  59475. preventMark = me.preventMark;
  59476. me.preventMark = true;
  59477. me.batchChanges(function() {
  59478. var boxes = me.getBoxes(),
  59479. b,
  59480. bLen = boxes.length;
  59481. for (b = 0; b < bLen; b++) {
  59482. boxes[b].reset();
  59483. }
  59484. });
  59485. me.preventMark = preventMark;
  59486. me.unsetActiveError();
  59487. if (hadError) {
  59488. me.updateLayout();
  59489. }
  59490. },
  59491. resetOriginalValue: function(){
  59492. var me = this,
  59493. boxes = me.getBoxes(),
  59494. b,
  59495. bLen = boxes.length;
  59496. for (b = 0; b < bLen; b++) {
  59497. boxes[b].resetOriginalValue();
  59498. }
  59499. me.originalValue = me.getValue();
  59500. me.checkDirty();
  59501. },
  59502. setValue: function(value) {
  59503. var me = this,
  59504. boxes = me.getBoxes(),
  59505. b,
  59506. bLen = boxes.length,
  59507. box, name,
  59508. cbValue;
  59509. me.batchChanges(function() {
  59510. for (b = 0; b < bLen; b++) {
  59511. box = boxes[b];
  59512. name = box.getName();
  59513. cbValue = false;
  59514. if (value && value.hasOwnProperty(name)) {
  59515. if (Ext.isArray(value[name])) {
  59516. cbValue = Ext.Array.contains(value[name], box.inputValue);
  59517. } else {
  59518. cbValue = value[name];
  59519. }
  59520. }
  59521. box.setValue(cbValue);
  59522. }
  59523. });
  59524. return me;
  59525. },
  59526. getValue: function() {
  59527. var values = {},
  59528. boxes = this.getBoxes(),
  59529. b,
  59530. bLen = boxes.length,
  59531. box, name, inputValue, bucket;
  59532. for (b = 0; b < bLen; b++) {
  59533. box = boxes[b];
  59534. name = box.getName();
  59535. inputValue = box.inputValue;
  59536. if (box.getValue()) {
  59537. if (values.hasOwnProperty(name)) {
  59538. bucket = values[name];
  59539. if (!Ext.isArray(bucket)) {
  59540. bucket = values[name] = [bucket];
  59541. }
  59542. bucket.push(inputValue);
  59543. } else {
  59544. values[name] = inputValue;
  59545. }
  59546. }
  59547. }
  59548. return values;
  59549. },
  59550. getSubmitData: function() {
  59551. return null;
  59552. },
  59553. getModelData: function() {
  59554. return null;
  59555. },
  59556. validate: function() {
  59557. var me = this,
  59558. errors,
  59559. isValid,
  59560. wasValid;
  59561. if (me.disabled) {
  59562. isValid = true;
  59563. } else {
  59564. errors = me.getErrors();
  59565. isValid = Ext.isEmpty(errors);
  59566. wasValid = !me.hasActiveError();
  59567. if (isValid) {
  59568. me.unsetActiveError();
  59569. } else {
  59570. me.setActiveError(errors);
  59571. }
  59572. }
  59573. if (isValid !== wasValid) {
  59574. me.fireEvent('validitychange', me, isValid);
  59575. me.updateLayout();
  59576. }
  59577. return isValid;
  59578. }
  59579. }, function() {
  59580. this.borrow(Ext.form.field.Base, ['markInvalid', 'clearInvalid']);
  59581. });
  59582. Ext.define('Ext.form.CheckboxManager', {
  59583. extend: 'Ext.util.MixedCollection',
  59584. singleton: true,
  59585. getByName: function(name) {
  59586. return this.filterBy(function(item) {
  59587. return item.name == name;
  59588. });
  59589. },
  59590. getWithValue: function(name, value) {
  59591. return this.filterBy(function(item) {
  59592. return item.name == name && item.inputValue == value;
  59593. });
  59594. },
  59595. getChecked: function(name) {
  59596. return this.filterBy(function(item) {
  59597. return item.name == name && item.checked;
  59598. });
  59599. }
  59600. });
  59601. Ext.define('Ext.layout.component.FieldSet', {
  59602. extend: 'Ext.layout.component.Body',
  59603. alias: ['layout.fieldset'],
  59604. type: 'fieldset',
  59605. beforeLayoutCycle: function (ownerContext) {
  59606. if (ownerContext.target.collapsed) {
  59607. ownerContext.heightModel = this.sizeModels.shrinkWrap;
  59608. }
  59609. },
  59610. beginLayoutCycle: function (ownerContext) {
  59611. var target = ownerContext.target,
  59612. lastSize;
  59613. this.callParent(arguments);
  59614. if (target.collapsed) {
  59615. ownerContext.setContentHeight(0);
  59616. if (ownerContext.widthModel.shrinkWrap) {
  59617. lastSize = target.lastComponentSize;
  59618. ownerContext.setContentWidth((lastSize && lastSize.contentWidth) || 100);
  59619. }
  59620. }
  59621. },
  59622. calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
  59623. var border = ownerContext.getBorderInfo(),
  59624. legend = ownerContext.target.legend;
  59625. return ownerContext.getProp('contentHeight') + ownerContext.getPaddingInfo().height + (legend ? legend.getHeight() : border.top) + border.bottom;
  59626. },
  59627. publishInnerHeight: function (ownerContext, height) {
  59628. var legend = ownerContext.target.legend;
  59629. if (legend) {
  59630. height -= legend.getHeight();
  59631. }
  59632. this.callParent([ownerContext, height]);
  59633. },
  59634. getLayoutItems : function() {
  59635. var legend = this.owner.legend;
  59636. if (legend) {
  59637. return [legend];
  59638. }
  59639. return [];
  59640. }
  59641. });
  59642. Ext.define('Ext.form.FieldSet', {
  59643. extend: 'Ext.container.Container',
  59644. alias: 'widget.fieldset',
  59645. uses: ['Ext.form.field.Checkbox', 'Ext.panel.Tool', 'Ext.layout.container.Anchor', 'Ext.layout.component.FieldSet'],
  59646. collapsed: false,
  59647. toggleOnTitleClick : true,
  59648. baseCls: Ext.baseCSSPrefix + 'fieldset',
  59649. layout: 'anchor',
  59650. border: 1,
  59651. componentLayout: 'fieldset',
  59652. autoEl: 'fieldset',
  59653. childEls: [
  59654. 'body'
  59655. ],
  59656. renderTpl: [
  59657. '{%this.renderLegend(out,values);%}',
  59658. '<div id="{id}-body" class="{baseCls}-body">',
  59659. '{%this.renderContainer(out,values);%}',
  59660. '</div>'
  59661. ],
  59662. stateEvents : [ 'collapse', 'expand' ],
  59663. maskOnDisable: false,
  59664. beforeDestroy: function(){
  59665. var me = this,
  59666. legend = me.legend;
  59667. if (legend) {
  59668. delete legend.ownerCt;
  59669. legend.destroy();
  59670. me.legend = null;
  59671. }
  59672. me.callParent();
  59673. },
  59674. initComponent: function() {
  59675. var me = this,
  59676. baseCls = me.baseCls;
  59677. me.callParent();
  59678. me.addEvents(
  59679. "beforeexpand",
  59680. "beforecollapse",
  59681. "expand",
  59682. "collapse"
  59683. );
  59684. if (me.collapsed) {
  59685. me.addCls(baseCls + '-collapsed');
  59686. me.collapse();
  59687. }
  59688. if (me.title) {
  59689. me.addCls(baseCls + '-with-title');
  59690. }
  59691. if (me.title || me.checkboxToggle || me.collapsible) {
  59692. me.addCls(baseCls + '-with-legend');
  59693. me.legend = Ext.widget(me.createLegendCt());
  59694. }
  59695. },
  59696. initRenderData: function() {
  59697. var data = this.callParent();
  59698. data.baseCls = this.baseCls;
  59699. return data;
  59700. },
  59701. getState: function () {
  59702. var state = this.callParent();
  59703. state = this.addPropertyToState(state, 'collapsed');
  59704. return state;
  59705. },
  59706. afterCollapse: Ext.emptyFn,
  59707. afterExpand: Ext.emptyFn,
  59708. collapsedHorizontal: function () {
  59709. return true;
  59710. },
  59711. collapsedVertical: function () {
  59712. return true;
  59713. },
  59714. createLegendCt: function () {
  59715. var me = this,
  59716. items = [],
  59717. legend = {
  59718. xtype: 'container',
  59719. baseCls: me.baseCls + '-header',
  59720. id: me.id + '-legend',
  59721. autoEl: 'legend',
  59722. items: items,
  59723. ownerCt: me,
  59724. ownerLayout: me.componentLayout
  59725. };
  59726. if (me.checkboxToggle) {
  59727. items.push(me.createCheckboxCmp());
  59728. } else if (me.collapsible) {
  59729. items.push(me.createToggleCmp());
  59730. }
  59731. items.push(me.createTitleCmp());
  59732. return legend;
  59733. },
  59734. createTitleCmp: function() {
  59735. var me = this,
  59736. cfg = {
  59737. xtype : 'component',
  59738. html : me.title,
  59739. cls : me.baseCls + '-header-text',
  59740. id : me.id + '-legendTitle'
  59741. };
  59742. if (me.collapsible && me.toggleOnTitleClick) {
  59743. cfg.listeners = {
  59744. el : {
  59745. scope : me,
  59746. click : me.toggle
  59747. }
  59748. };
  59749. cfg.cls += ' ' + me.baseCls + '-header-text-collapsible';
  59750. }
  59751. return (me.titleCmp = Ext.widget(cfg));
  59752. },
  59753. createCheckboxCmp: function() {
  59754. var me = this,
  59755. suffix = '-checkbox';
  59756. me.checkboxCmp = Ext.widget({
  59757. xtype: 'checkbox',
  59758. hideEmptyLabel: true,
  59759. name: me.checkboxName || me.id + suffix,
  59760. cls: me.baseCls + '-header' + suffix,
  59761. id: me.id + '-legendChk',
  59762. checked: !me.collapsed,
  59763. listeners: {
  59764. change: me.onCheckChange,
  59765. scope: me
  59766. }
  59767. });
  59768. return me.checkboxCmp;
  59769. },
  59770. createToggleCmp: function() {
  59771. var me = this;
  59772. me.toggleCmp = Ext.widget({
  59773. xtype: 'tool',
  59774. type: 'toggle',
  59775. handler: me.toggle,
  59776. id: me.id + '-legendToggle',
  59777. scope: me
  59778. });
  59779. return me.toggleCmp;
  59780. },
  59781. doRenderLegend: function (out, renderData) {
  59782. var me = renderData.$comp,
  59783. legend = me.legend,
  59784. tree;
  59785. if (legend) {
  59786. legend.ownerLayout.configureItem(legend);
  59787. tree = legend.getRenderTree();
  59788. Ext.DomHelper.generateMarkup(tree, out);
  59789. }
  59790. },
  59791. finishRender: function () {
  59792. var legend = this.legend;
  59793. this.callParent();
  59794. if (legend) {
  59795. legend.finishRender();
  59796. }
  59797. },
  59798. getCollapsed: function () {
  59799. return this.collapsed ? 'top' : false;
  59800. },
  59801. getCollapsedDockedItems: function () {
  59802. var legend = this.legend;
  59803. return legend ? [ legend ] : [];
  59804. },
  59805. setTitle: function(title) {
  59806. var me = this,
  59807. legend = me.legend;
  59808. me.title = title;
  59809. if (me.rendered) {
  59810. if (!me.legend) {
  59811. me.legend = legend = Ext.widget(me.createLegendCt());
  59812. legend.ownerLayout.configureItem(legend);
  59813. legend.render(me.el, 0);
  59814. }
  59815. me.titleCmp.update(title);
  59816. }
  59817. return me;
  59818. },
  59819. getTargetEl : function() {
  59820. return this.body || this.frameBody || this.el;
  59821. },
  59822. getContentTarget: function() {
  59823. return this.body;
  59824. },
  59825. expand : function(){
  59826. return this.setExpanded(true);
  59827. },
  59828. collapse : function() {
  59829. return this.setExpanded(false);
  59830. },
  59831. setExpanded: function(expanded) {
  59832. var me = this,
  59833. checkboxCmp = me.checkboxCmp,
  59834. operation = expanded ? 'expand' : 'collapse';
  59835. if (!me.rendered || me.fireEvent('before' + operation, me) !== false) {
  59836. expanded = !!expanded;
  59837. if (checkboxCmp) {
  59838. checkboxCmp.setValue(expanded);
  59839. }
  59840. if (expanded) {
  59841. me.removeCls(me.baseCls + '-collapsed');
  59842. } else {
  59843. me.addCls(me.baseCls + '-collapsed');
  59844. }
  59845. me.collapsed = !expanded;
  59846. if (me.rendered) {
  59847. me.updateLayout({ isRoot: false });
  59848. me.fireEvent(operation, me);
  59849. }
  59850. }
  59851. return me;
  59852. },
  59853. getRefItems: function(deep) {
  59854. var refItems = this.callParent(arguments),
  59855. legend = this.legend;
  59856. if (legend) {
  59857. refItems.unshift(legend);
  59858. if (deep) {
  59859. refItems.unshift.apply(refItems, legend.getRefItems(true));
  59860. }
  59861. }
  59862. return refItems;
  59863. },
  59864. toggle: function() {
  59865. this.setExpanded(!!this.collapsed);
  59866. },
  59867. onCheckChange: function(cmp, checked) {
  59868. this.setExpanded(checked);
  59869. },
  59870. setupRenderTpl: function (renderTpl) {
  59871. this.callParent(arguments);
  59872. renderTpl.renderLegend = this.doRenderLegend;
  59873. }
  59874. });
  59875. Ext.define('Ext.form.Label', {
  59876. extend:'Ext.Component',
  59877. alias: 'widget.label',
  59878. requires: ['Ext.util.Format'],
  59879. autoEl: 'label',
  59880. maskOnDisable: false,
  59881. getElConfig: function(){
  59882. var me = this;
  59883. me.html = me.text ? Ext.util.Format.htmlEncode(me.text) : (me.html || '');
  59884. return Ext.apply(me.callParent(), {
  59885. htmlFor: me.forId || ''
  59886. });
  59887. },
  59888. setText : function(text, encode){
  59889. var me = this;
  59890. encode = encode !== false;
  59891. if(encode) {
  59892. me.text = text;
  59893. delete me.html;
  59894. } else {
  59895. me.html = text;
  59896. delete me.text;
  59897. }
  59898. if(me.rendered){
  59899. me.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(text) : text;
  59900. me.updateLayout();
  59901. }
  59902. return me;
  59903. }
  59904. });
  59905. Ext.define('Ext.form.Panel', {
  59906. extend:'Ext.panel.Panel',
  59907. mixins: {
  59908. fieldAncestor: 'Ext.form.FieldAncestor'
  59909. },
  59910. alias: 'widget.form',
  59911. alternateClassName: ['Ext.FormPanel', 'Ext.form.FormPanel'],
  59912. requires: ['Ext.form.Basic', 'Ext.util.TaskRunner'],
  59913. layout: 'anchor',
  59914. ariaRole: 'form',
  59915. basicFormConfigs: [
  59916. 'api',
  59917. 'baseParams',
  59918. 'errorReader',
  59919. 'method',
  59920. 'paramOrder',
  59921. 'paramsAsHash',
  59922. 'reader',
  59923. 'standardSubmit',
  59924. 'timeout',
  59925. 'trackResetOnLoad',
  59926. 'url',
  59927. 'waitMsgTarget',
  59928. 'waitTitle'
  59929. ],
  59930. initComponent: function() {
  59931. var me = this;
  59932. if (me.frame) {
  59933. me.border = false;
  59934. }
  59935. me.initFieldAncestor();
  59936. me.callParent();
  59937. me.relayEvents(me.form, [
  59938. 'beforeaction',
  59939. 'actionfailed',
  59940. 'actioncomplete',
  59941. 'validitychange',
  59942. 'dirtychange'
  59943. ]);
  59944. if (me.pollForChanges) {
  59945. me.startPolling(me.pollInterval || 500);
  59946. }
  59947. },
  59948. initItems: function() {
  59949. var me = this;
  59950. me.form = me.createForm();
  59951. me.callParent();
  59952. },
  59953. afterFirstLayout: function() {
  59954. this.callParent();
  59955. this.form.initialize();
  59956. },
  59957. createForm: function() {
  59958. var cfg = {},
  59959. props = this.basicFormConfigs,
  59960. len = props.length,
  59961. i = 0,
  59962. prop;
  59963. for (; i < len; ++i) {
  59964. prop = props[i];
  59965. cfg[prop] = this[prop];
  59966. }
  59967. return new Ext.form.Basic(this, cfg);
  59968. },
  59969. getForm: function() {
  59970. return this.form;
  59971. },
  59972. loadRecord: function(record) {
  59973. return this.getForm().loadRecord(record);
  59974. },
  59975. getRecord: function() {
  59976. return this.getForm().getRecord();
  59977. },
  59978. getValues: function(asString, dirtyOnly, includeEmptyText, useDataValues) {
  59979. return this.getForm().getValues(asString, dirtyOnly, includeEmptyText, useDataValues);
  59980. },
  59981. beforeDestroy: function() {
  59982. this.stopPolling();
  59983. this.form.destroy();
  59984. this.callParent();
  59985. },
  59986. load: function(options) {
  59987. this.form.load(options);
  59988. },
  59989. submit: function(options) {
  59990. this.form.submit(options);
  59991. },
  59992. startPolling: function(interval) {
  59993. this.stopPolling();
  59994. var task = new Ext.util.TaskRunner(interval);
  59995. task.start({
  59996. interval: 0,
  59997. run: this.checkChange,
  59998. scope: this
  59999. });
  60000. this.pollTask = task;
  60001. },
  60002. stopPolling: function() {
  60003. var task = this.pollTask;
  60004. if (task) {
  60005. task.stopAll();
  60006. delete this.pollTask;
  60007. }
  60008. },
  60009. checkChange: function() {
  60010. var fields = this.form.getFields().items,
  60011. f,
  60012. fLen = fields.length,
  60013. field;
  60014. for (f = 0; f < fLen; f++) {
  60015. fields[f].checkChange();
  60016. }
  60017. }
  60018. });
  60019. Ext.define('Ext.form.RadioGroup', {
  60020. extend: 'Ext.form.CheckboxGroup',
  60021. alias: 'widget.radiogroup',
  60022. allowBlank : true,
  60023. blankText : 'You must select one item in this group',
  60024. defaultType : 'radiofield',
  60025. groupCls : Ext.baseCSSPrefix + 'form-radio-group',
  60026. getBoxes: function(query) {
  60027. return this.query('[isRadio]' + (query||''));
  60028. },
  60029. checkChange: function() {
  60030. var value = this.getValue(),
  60031. key = Ext.Object.getKeys(value)[0];
  60032. if (Ext.isArray(value[key])) {
  60033. return;
  60034. }
  60035. this.callParent(arguments);
  60036. },
  60037. setValue: function(value) {
  60038. var cbValue, first, formId, radios,
  60039. i, len, name;
  60040. if (Ext.isObject(value)) {
  60041. for (name in value) {
  60042. if (value.hasOwnProperty(name)) {
  60043. cbValue = value[name];
  60044. first = this.items.first();
  60045. formId = first ? first.getFormId() : null;
  60046. radios = Ext.form.RadioManager.getWithValue(name, cbValue, formId).items;
  60047. len = radios.length;
  60048. for (i = 0; i < len; ++i) {
  60049. radios[i].setValue(true);
  60050. }
  60051. }
  60052. }
  60053. }
  60054. return this;
  60055. }
  60056. });
  60057. Ext.define('Ext.form.RadioManager', {
  60058. extend: 'Ext.util.MixedCollection',
  60059. singleton: true,
  60060. getByName: function(name, formId) {
  60061. return this.filterBy(function(item) {
  60062. return item.name == name && item.getFormId() == formId;
  60063. });
  60064. },
  60065. getWithValue: function(name, value, formId) {
  60066. return this.filterBy(function(item) {
  60067. return item.name == name && item.inputValue == value && item.getFormId() == formId;
  60068. });
  60069. },
  60070. getChecked: function(name, formId) {
  60071. return this.findBy(function(item) {
  60072. return item.name == name && item.checked && item.getFormId() == formId;
  60073. });
  60074. }
  60075. });
  60076. Ext.define('Ext.form.action.DirectLoad', {
  60077. extend:'Ext.form.action.Load',
  60078. requires: ['Ext.direct.Manager'],
  60079. alternateClassName: 'Ext.form.Action.DirectLoad',
  60080. alias: 'formaction.directload',
  60081. type: 'directload',
  60082. run: function() {
  60083. var me = this,
  60084. form = me.form,
  60085. fn = form.api.load,
  60086. method = fn.directCfg.method,
  60087. args = method.getArgs(me.getParams(), form.paramOrder, form.paramsAsHash);
  60088. args.push(me.onComplete, me);
  60089. fn.apply(window, args);
  60090. },
  60091. processResponse: function(result) {
  60092. return (this.result = result);
  60093. },
  60094. onComplete: function(data, response) {
  60095. if (data) {
  60096. this.onSuccess(data);
  60097. } else {
  60098. this.onFailure(null);
  60099. }
  60100. }
  60101. });
  60102. Ext.define('Ext.form.action.DirectSubmit', {
  60103. extend:'Ext.form.action.Submit',
  60104. requires: ['Ext.direct.Manager'],
  60105. alternateClassName: 'Ext.form.Action.DirectSubmit',
  60106. alias: 'formaction.directsubmit',
  60107. type: 'directsubmit',
  60108. doSubmit: function() {
  60109. var me = this,
  60110. callback = Ext.Function.bind(me.onComplete, me),
  60111. formEl = me.buildForm();
  60112. me.form.api.submit(formEl, callback, me);
  60113. Ext.removeNode(formEl);
  60114. },
  60115. processResponse: function(result) {
  60116. return (this.result = result);
  60117. },
  60118. onComplete: function(data, response){
  60119. if (data) {
  60120. this.onSuccess(data);
  60121. } else {
  60122. this.onFailure(null);
  60123. }
  60124. }
  60125. });
  60126. Ext.define('Ext.form.action.StandardSubmit', {
  60127. extend:'Ext.form.action.Submit',
  60128. alias: 'formaction.standardsubmit',
  60129. doSubmit: function() {
  60130. var form = this.buildForm();
  60131. form.submit();
  60132. Ext.removeNode(form);
  60133. }
  60134. });
  60135. Ext.define('Ext.form.field.Checkbox', {
  60136. extend: 'Ext.form.field.Base',
  60137. alias: ['widget.checkboxfield', 'widget.checkbox'],
  60138. alternateClassName: 'Ext.form.Checkbox',
  60139. requires: ['Ext.XTemplate', 'Ext.form.CheckboxManager' ],
  60140. componentLayout: 'field',
  60141. childEls: [
  60142. 'boxLabelEl'
  60143. ],
  60144. fieldSubTpl: [
  60145. '<tpl if="boxLabel && boxLabelAlign == \'before\'">',
  60146. '{beforeBoxLabelTpl}',
  60147. '<label id="{cmpId}-boxLabelEl" {boxLabelAttrTpl} class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">',
  60148. '{beforeBoxLabelTextTpl}',
  60149. '{boxLabel}',
  60150. '{afterBoxLabelTextTpl}',
  60151. '</label>',
  60152. '{afterBoxLabelTpl}',
  60153. '</tpl>',
  60154. '<input type="button" id="{id}" {inputAttrTpl}',
  60155. '<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>',
  60156. '<tpl if="disabled"> disabled="disabled"</tpl>',
  60157. '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',
  60158. ' class="{fieldCls} {typeCls}" autocomplete="off" hidefocus="true" />',
  60159. '<tpl if="boxLabel && boxLabelAlign == \'after\'">',
  60160. '{beforeBoxLabelTpl}',
  60161. '<label id="{cmpId}-boxLabelEl" {boxLabelAttrTpl} class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">',
  60162. '{beforeBoxLabelTextTpl}',
  60163. '{boxLabel}',
  60164. '{afterBoxLabelTextTpl}',
  60165. '</label>',
  60166. '{afterBoxLabelTpl}',
  60167. '</tpl>',
  60168. {
  60169. disableFormats: true,
  60170. compiled: true
  60171. }
  60172. ],
  60173. subTplInsertions: [
  60174. 'beforeBoxLabelTpl',
  60175. 'afterBoxLabelTpl',
  60176. 'beforeBoxLabelTextTpl',
  60177. 'afterBoxLabelTextTpl',
  60178. 'boxLabelAttrTpl',
  60179. 'inputAttrTpl'
  60180. ],
  60181. isCheckbox: true,
  60182. focusCls: 'form-cb-focus',
  60183. fieldBodyCls: Ext.baseCSSPrefix + 'form-cb-wrap',
  60184. checked: false,
  60185. checkedCls: Ext.baseCSSPrefix + 'form-cb-checked',
  60186. boxLabelCls: Ext.baseCSSPrefix + 'form-cb-label',
  60187. boxLabelAlign: 'after',
  60188. inputValue: 'on',
  60189. checkChangeEvents: [],
  60190. inputType: 'checkbox',
  60191. onRe: /^on$/i,
  60192. initComponent: function() {
  60193. this.callParent(arguments);
  60194. this.getManager().add(this);
  60195. },
  60196. initValue: function() {
  60197. var me = this,
  60198. checked = !!me.checked;
  60199. me.originalValue = me.lastValue = checked;
  60200. me.setValue(checked);
  60201. },
  60202. getElConfig: function() {
  60203. var me = this;
  60204. if (me.isChecked(me.rawValue, me.inputValue)) {
  60205. me.addCls(me.checkedCls);
  60206. }
  60207. return me.callParent();
  60208. },
  60209. getFieldStyle: function() {
  60210. return Ext.isObject(this.fieldStyle) ? Ext.DomHelper.generateStyles(this.fieldStyle) : this.fieldStyle ||'';
  60211. },
  60212. getSubTplData: function() {
  60213. var me = this;
  60214. return Ext.apply(me.callParent(), {
  60215. disabled : me.readOnly || me.disabled,
  60216. boxLabel : me.boxLabel,
  60217. boxLabelCls : me.boxLabelCls,
  60218. boxLabelAlign : me.boxLabelAlign
  60219. });
  60220. },
  60221. initEvents: function() {
  60222. var me = this;
  60223. me.callParent();
  60224. me.mon(me.inputEl, 'click', me.onBoxClick, me);
  60225. },
  60226. onBoxClick: function(e) {
  60227. var me = this;
  60228. if (!me.disabled && !me.readOnly) {
  60229. this.setValue(!this.checked);
  60230. }
  60231. },
  60232. getRawValue: function() {
  60233. return this.checked;
  60234. },
  60235. getValue: function() {
  60236. return this.checked;
  60237. },
  60238. getSubmitValue: function() {
  60239. var unchecked = this.uncheckedValue,
  60240. uncheckedVal = Ext.isDefined(unchecked) ? unchecked : null;
  60241. return this.checked ? this.inputValue : uncheckedVal;
  60242. },
  60243. isChecked: function(rawValue, inputValue) {
  60244. return (rawValue === true || rawValue === 'true' || rawValue === '1' || rawValue === 1 ||
  60245. (((Ext.isString(rawValue) || Ext.isNumber(rawValue)) && inputValue) ? rawValue == inputValue : this.onRe.test(rawValue)));
  60246. },
  60247. setRawValue: function(value) {
  60248. var me = this,
  60249. inputEl = me.inputEl,
  60250. checked = me.isChecked(value, me.inputValue);
  60251. if (inputEl) {
  60252. me[checked ? 'addCls' : 'removeCls'](me.checkedCls);
  60253. }
  60254. me.checked = me.rawValue = checked;
  60255. return checked;
  60256. },
  60257. setValue: function(checked) {
  60258. var me = this,
  60259. boxes, i, len, box;
  60260. if (Ext.isArray(checked)) {
  60261. boxes = me.getManager().getByName(me.name, me.getFormId()).items;
  60262. len = boxes.length;
  60263. for (i = 0; i < len; ++i) {
  60264. box = boxes[i];
  60265. box.setValue(Ext.Array.contains(checked, box.inputValue));
  60266. }
  60267. } else {
  60268. me.callParent(arguments);
  60269. }
  60270. return me;
  60271. },
  60272. valueToRaw: function(value) {
  60273. return value;
  60274. },
  60275. onChange: function(newVal, oldVal) {
  60276. var me = this,
  60277. handler = me.handler;
  60278. if (handler) {
  60279. handler.call(me.scope || me, me, newVal);
  60280. }
  60281. me.callParent(arguments);
  60282. },
  60283. resetOriginalValue: function( fromBoxInGroup){
  60284. var me = this,
  60285. boxes,
  60286. box,
  60287. len,
  60288. i;
  60289. if (!fromBoxInGroup) {
  60290. boxes = me.getManager().getByName(me.name, me.getFormId()).items;
  60291. len = boxes.length;
  60292. for (i = 0; i < len; ++i) {
  60293. box = boxes[i];
  60294. if (box !== me) {
  60295. boxes[i].resetOriginalValue(true);
  60296. }
  60297. }
  60298. }
  60299. me.callParent();
  60300. },
  60301. beforeDestroy: function(){
  60302. this.callParent();
  60303. this.getManager().removeAtKey(this.id);
  60304. },
  60305. getManager: function() {
  60306. return Ext.form.CheckboxManager;
  60307. },
  60308. onEnable: function() {
  60309. var me = this,
  60310. inputEl = me.inputEl;
  60311. me.callParent();
  60312. if (inputEl) {
  60313. inputEl.dom.disabled = me.readOnly;
  60314. }
  60315. },
  60316. setReadOnly: function(readOnly) {
  60317. var me = this,
  60318. inputEl = me.inputEl;
  60319. if (inputEl) {
  60320. inputEl.dom.disabled = !!readOnly || me.disabled;
  60321. }
  60322. me.callParent(arguments);
  60323. },
  60324. getFormId: function(){
  60325. var me = this,
  60326. form;
  60327. if (!me.formId) {
  60328. form = me.up('form');
  60329. if (form) {
  60330. me.formId = form.id;
  60331. }
  60332. }
  60333. return me.formId;
  60334. }
  60335. });
  60336. Ext.define('Ext.layout.component.field.Trigger', {
  60337. alias: 'layout.triggerfield',
  60338. extend: 'Ext.layout.component.field.Field',
  60339. type: 'triggerfield',
  60340. beginLayout: function(ownerContext) {
  60341. var me = this,
  60342. owner = me.owner,
  60343. flags;
  60344. ownerContext.triggerWrap = ownerContext.getEl('triggerWrap');
  60345. me.callParent(arguments);
  60346. flags = owner.getTriggerStateFlags();
  60347. if (flags != owner.lastTriggerStateFlags) {
  60348. owner.lastTriggerStateFlags = flags;
  60349. me.updateEditState();
  60350. }
  60351. },
  60352. beginLayoutFixed: function (ownerContext, width, suffix) {
  60353. var me = this,
  60354. owner = ownerContext.target,
  60355. ieInputWidthAdjustment = me.ieInputWidthAdjustment || 0,
  60356. inputWidth = '100%',
  60357. triggerWrap = owner.triggerWrap;
  60358. me.callParent(arguments);
  60359. owner.inputCell.setStyle('width', '100%');
  60360. if(ieInputWidthAdjustment) {
  60361. owner.inputCell.setStyle('padding-right', ieInputWidthAdjustment + 'px');
  60362. if(suffix === 'px') {
  60363. if (owner.inputWidth) {
  60364. inputWidth = owner.inputWidth - owner.getTriggerWidth();
  60365. } else {
  60366. inputWidth = width - ieInputWidthAdjustment - owner.getTriggerWidth();
  60367. }
  60368. inputWidth += 'px';
  60369. }
  60370. }
  60371. owner.inputEl.setStyle('width', inputWidth);
  60372. inputWidth = owner.inputWidth;
  60373. if (inputWidth) {
  60374. triggerWrap.setStyle('width', inputWidth + (ieInputWidthAdjustment) + 'px');
  60375. } else {
  60376. triggerWrap.setStyle('width', width + suffix);
  60377. }
  60378. triggerWrap.setStyle('table-layout', 'fixed');
  60379. },
  60380. beginLayoutShrinkWrap: function (ownerContext) {
  60381. var owner = ownerContext.target,
  60382. emptyString = '',
  60383. inputWidth = owner.inputWidth,
  60384. triggerWrap = owner.triggerWrap,
  60385. ieInputWidthAdjustment = this.ieInputWidthAdjustment || 0;
  60386. this.callParent(arguments);
  60387. if (inputWidth) {
  60388. triggerWrap.setStyle('width', inputWidth + 'px');
  60389. inputWidth = (inputWidth - owner.getTriggerWidth()) + 'px';
  60390. owner.inputEl.setStyle('width', inputWidth);
  60391. owner.inputCell.setStyle('width', inputWidth);
  60392. } else {
  60393. owner.inputCell.setStyle('width', emptyString);
  60394. owner.inputEl.setStyle('width', emptyString);
  60395. triggerWrap.setStyle('width', emptyString);
  60396. triggerWrap.setStyle('table-layout', 'auto');
  60397. }
  60398. },
  60399. getTextWidth: function () {
  60400. var me = this,
  60401. owner = me.owner,
  60402. inputEl = owner.inputEl,
  60403. value;
  60404. value = (inputEl.dom.value || (owner.hasFocus ? '' : owner.emptyText) || '') + owner.growAppend;
  60405. return inputEl.getTextWidth(value);
  60406. },
  60407. measureContentWidth: function (ownerContext) {
  60408. var me = this,
  60409. owner = me.owner,
  60410. width = me.callParent(arguments),
  60411. inputContext = ownerContext.inputContext,
  60412. calcWidth, max, min;
  60413. if (owner.grow && !ownerContext.state.growHandled) {
  60414. calcWidth = me.getTextWidth() + ownerContext.inputContext.getFrameInfo().width;
  60415. max = owner.growMax;
  60416. min = Math.min(max, width);
  60417. max = Math.max(owner.growMin, max, min);
  60418. calcWidth = Ext.Number.constrain(calcWidth, owner.growMin, max);
  60419. inputContext.setWidth(calcWidth);
  60420. ownerContext.state.growHandled = true;
  60421. inputContext.domBlock(me, 'width');
  60422. width = NaN;
  60423. }
  60424. return width;
  60425. },
  60426. updateEditState: function() {
  60427. var me = this,
  60428. owner = me.owner,
  60429. inputEl = owner.inputEl,
  60430. noeditCls = Ext.baseCSSPrefix + 'trigger-noedit',
  60431. displayed,
  60432. readOnly;
  60433. if (me.owner.readOnly) {
  60434. inputEl.addCls(noeditCls);
  60435. readOnly = true;
  60436. displayed = false;
  60437. } else {
  60438. if (me.owner.editable) {
  60439. inputEl.removeCls(noeditCls);
  60440. readOnly = false;
  60441. } else {
  60442. inputEl.addCls(noeditCls);
  60443. readOnly = true;
  60444. }
  60445. displayed = !me.owner.hideTrigger;
  60446. }
  60447. owner.triggerCell.setDisplayed(displayed);
  60448. inputEl.dom.readOnly = readOnly;
  60449. }
  60450. });
  60451. Ext.define('Ext.layout.component.field.ComboBox', {
  60452. extend: 'Ext.layout.component.field.Trigger',
  60453. alias: 'layout.combobox',
  60454. requires: ['Ext.util.TextMetrics'],
  60455. type: 'combobox',
  60456. startingWidth: null,
  60457. getTextWidth: function () {
  60458. var me = this,
  60459. owner = me.owner,
  60460. store = owner.store,
  60461. field = owner.displayField,
  60462. storeLn = store.data.length,
  60463. value = '',
  60464. i = 0, n = 0, ln, item, width;
  60465. for (; i < storeLn; i++) {
  60466. item = store.getAt(i).data[field];
  60467. ln = item.length;
  60468. if (ln > n) {
  60469. n = ln;
  60470. value = item;
  60471. }
  60472. }
  60473. width = Math.max(me.callParent(arguments), owner.inputEl.getTextWidth(value + owner.growAppend));
  60474. if (!me.startingWidth || owner.removingRecords) {
  60475. me.startingWidth = width;
  60476. if (width < owner.growMin) {
  60477. owner.defaultListConfig.minWidth = owner.growMin;
  60478. }
  60479. owner.removingRecords = false;
  60480. }
  60481. return (width < me.startingWidth) ? me.startingWidth : width;
  60482. }
  60483. });
  60484. Ext.define('Ext.form.field.Trigger', {
  60485. extend:'Ext.form.field.Text',
  60486. alias: ['widget.triggerfield', 'widget.trigger'],
  60487. requires: ['Ext.DomHelper', 'Ext.util.ClickRepeater', 'Ext.layout.component.field.Trigger'],
  60488. alternateClassName: ['Ext.form.TriggerField', 'Ext.form.TwinTriggerField', 'Ext.form.Trigger'],
  60489. childEls: [
  60490. { name: 'triggerCell', select: '.' + Ext.baseCSSPrefix + 'trigger-cell' },
  60491. { name: 'triggerEl', select: '.' + Ext.baseCSSPrefix + 'form-trigger' },
  60492. 'triggerWrap',
  60493. 'inputCell'
  60494. ],
  60495. triggerBaseCls: Ext.baseCSSPrefix + 'form-trigger',
  60496. triggerWrapCls: Ext.baseCSSPrefix + 'form-trigger-wrap',
  60497. triggerNoEditCls: Ext.baseCSSPrefix + 'trigger-noedit',
  60498. hideTrigger: false,
  60499. editable: true,
  60500. readOnly: false,
  60501. repeatTriggerClick: false,
  60502. autoSize: Ext.emptyFn,
  60503. monitorTab: true,
  60504. mimicing: false,
  60505. triggerIndexRe: /trigger-index-(\d+)/,
  60506. componentLayout: 'triggerfield',
  60507. initComponent: function() {
  60508. this.wrapFocusCls = this.triggerWrapCls + '-focus';
  60509. this.callParent(arguments);
  60510. },
  60511. getSubTplMarkup: function() {
  60512. var me = this,
  60513. field = me.callParent(arguments);
  60514. return '<table id="' + me.id + '-triggerWrap" class="' + Ext.baseCSSPrefix + 'form-trigger-wrap" cellpadding="0" cellspacing="0"><tbody><tr>' +
  60515. '<td id="' + me.id + '-inputCell" class="' + Ext.baseCSSPrefix + 'form-trigger-input-cell">' + field + '</td>' +
  60516. me.getTriggerMarkup() +
  60517. '</tr></tbody></table>';
  60518. },
  60519. getSubTplData: function(){
  60520. var me = this,
  60521. data = me.callParent(),
  60522. readOnly = me.readOnly === true,
  60523. editable = me.editable !== false;
  60524. return Ext.apply(data, {
  60525. editableCls: (readOnly || !editable) ? ' ' + me.triggerNoEditCls : '',
  60526. readOnly: !editable || readOnly
  60527. });
  60528. },
  60529. getLabelableRenderData: function() {
  60530. var me = this,
  60531. triggerWrapCls = me.triggerWrapCls,
  60532. result = me.callParent(arguments);
  60533. return Ext.applyIf(result, {
  60534. triggerWrapCls: triggerWrapCls,
  60535. triggerMarkup: me.getTriggerMarkup()
  60536. });
  60537. },
  60538. getTriggerMarkup: function() {
  60539. var me = this,
  60540. i = 0,
  60541. hideTrigger = (me.readOnly || me.hideTrigger),
  60542. triggerCls,
  60543. triggerBaseCls = me.triggerBaseCls,
  60544. triggerConfigs = [];
  60545. if (!me.trigger1Cls) {
  60546. me.trigger1Cls = me.triggerCls;
  60547. }
  60548. for (i = 0; (triggerCls = me['trigger' + (i + 1) + 'Cls']) || i < 1; i++) {
  60549. triggerConfigs.push({
  60550. tag: 'td',
  60551. valign: 'top',
  60552. cls: Ext.baseCSSPrefix + 'trigger-cell',
  60553. style: 'width:' + me.triggerWidth + (hideTrigger ? 'px;display:none' : 'px'),
  60554. cn: {
  60555. cls: [Ext.baseCSSPrefix + 'trigger-index-' + i, triggerBaseCls, triggerCls].join(' '),
  60556. role: 'button'
  60557. }
  60558. });
  60559. }
  60560. triggerConfigs[i - 1].cn.cls += ' ' + triggerBaseCls + '-last';
  60561. return Ext.DomHelper.markup(triggerConfigs);
  60562. },
  60563. disableCheck: function() {
  60564. return !this.disabled;
  60565. },
  60566. beforeRender: function() {
  60567. var me = this,
  60568. triggerBaseCls = me.triggerBaseCls,
  60569. tempEl;
  60570. if (!me.triggerWidth) {
  60571. tempEl = Ext.resetElement.createChild({
  60572. style: 'position: absolute;',
  60573. cls: Ext.baseCSSPrefix + 'form-trigger'
  60574. });
  60575. Ext.form.field.Trigger.prototype.triggerWidth = tempEl.getWidth();
  60576. tempEl.remove();
  60577. }
  60578. me.callParent();
  60579. if (triggerBaseCls != Ext.baseCSSPrefix + 'form-trigger') {
  60580. me.addChildEls({ name: 'triggerEl', select: '.' + triggerBaseCls });
  60581. }
  60582. me.lastTriggerStateFlags = me.getTriggerStateFlags();
  60583. },
  60584. onRender: function() {
  60585. var me = this;
  60586. me.callParent(arguments);
  60587. me.doc = Ext.getDoc();
  60588. me.initTrigger();
  60589. me.triggerEl.unselectable();
  60590. },
  60591. getTriggerWidth: function() {
  60592. var me = this,
  60593. totalTriggerWidth = 0;
  60594. if (me.triggerWrap && !me.hideTrigger && !me.readOnly) {
  60595. totalTriggerWidth = me.triggerEl.getCount() * me.triggerWidth;
  60596. }
  60597. return totalTriggerWidth;
  60598. },
  60599. setHideTrigger: function(hideTrigger) {
  60600. if (hideTrigger != this.hideTrigger) {
  60601. this.hideTrigger = hideTrigger;
  60602. this.updateLayout();
  60603. }
  60604. },
  60605. setEditable: function(editable) {
  60606. if (editable != this.editable) {
  60607. this.editable = editable;
  60608. this.updateLayout();
  60609. }
  60610. },
  60611. setReadOnly: function(readOnly) {
  60612. if (readOnly != this.readOnly) {
  60613. this.readOnly = readOnly;
  60614. this.updateLayout();
  60615. }
  60616. },
  60617. initTrigger: function() {
  60618. var me = this,
  60619. triggerWrap = me.triggerWrap,
  60620. triggerEl = me.triggerEl,
  60621. disableCheck = me.disableCheck,
  60622. els, eLen, el, e, idx;
  60623. if (me.repeatTriggerClick) {
  60624. me.triggerRepeater = new Ext.util.ClickRepeater(triggerWrap, {
  60625. preventDefault: true,
  60626. handler: me.onTriggerWrapClick,
  60627. listeners: {
  60628. mouseup: me.onTriggerWrapMouseup,
  60629. scope: me
  60630. },
  60631. scope: me
  60632. });
  60633. } else {
  60634. me.mon(triggerWrap, {
  60635. click: me.onTriggerWrapClick,
  60636. mouseup: me.onTriggerWrapMouseup,
  60637. scope: me
  60638. });
  60639. }
  60640. triggerEl.setVisibilityMode(Ext.Element.DISPLAY);
  60641. triggerEl.addClsOnOver(me.triggerBaseCls + '-over', disableCheck, me);
  60642. els = triggerEl.elements;
  60643. eLen = els.length;
  60644. for (e = 0; e < eLen; e++) {
  60645. el = els[e];
  60646. idx = e+1;
  60647. el.addClsOnOver(me['trigger' + (idx) + 'Cls'] + '-over', disableCheck, me);
  60648. el.addClsOnClick(me['trigger' + (idx) + 'Cls'] + '-click', disableCheck, me);
  60649. }
  60650. triggerEl.addClsOnClick(me.triggerBaseCls + '-click', disableCheck, me);
  60651. },
  60652. onDestroy: function() {
  60653. var me = this;
  60654. Ext.destroyMembers(me, 'triggerRepeater', 'triggerWrap', 'triggerEl');
  60655. delete me.doc;
  60656. me.callParent();
  60657. },
  60658. onFocus: function() {
  60659. var me = this;
  60660. me.callParent(arguments);
  60661. if (!me.mimicing) {
  60662. me.bodyEl.addCls(me.wrapFocusCls);
  60663. me.mimicing = true;
  60664. me.mon(me.doc, 'mousedown', me.mimicBlur, me, {
  60665. delay: 10
  60666. });
  60667. if (me.monitorTab) {
  60668. me.on('specialkey', me.checkTab, me);
  60669. }
  60670. }
  60671. },
  60672. checkTab: function(me, e) {
  60673. if (!this.ignoreMonitorTab && e.getKey() == e.TAB) {
  60674. this.triggerBlur();
  60675. }
  60676. },
  60677. getTriggerStateFlags: function () {
  60678. var me = this,
  60679. state = 0;
  60680. if (me.readOnly) {
  60681. state += 1;
  60682. }
  60683. if (me.editable) {
  60684. state += 2;
  60685. }
  60686. if (me.hideTrigger) {
  60687. state += 4;
  60688. }
  60689. return state;
  60690. },
  60691. onBlur: Ext.emptyFn,
  60692. mimicBlur: function(e) {
  60693. if (!this.isDestroyed && !this.bodyEl.contains(e.target) && this.validateBlur(e)) {
  60694. this.triggerBlur(e);
  60695. }
  60696. },
  60697. triggerBlur: function(e) {
  60698. var me = this;
  60699. me.mimicing = false;
  60700. me.mun(me.doc, 'mousedown', me.mimicBlur, me);
  60701. if (me.monitorTab && me.inputEl) {
  60702. me.un('specialkey', me.checkTab, me);
  60703. }
  60704. Ext.form.field.Trigger.superclass.onBlur.call(me, e);
  60705. if (me.bodyEl) {
  60706. me.bodyEl.removeCls(me.wrapFocusCls);
  60707. }
  60708. },
  60709. validateBlur: function(e) {
  60710. return true;
  60711. },
  60712. onTriggerWrapClick: function() {
  60713. var me = this,
  60714. targetEl, match,
  60715. triggerClickMethod,
  60716. event;
  60717. event = arguments[me.triggerRepeater ? 1 : 0];
  60718. if (event && !me.readOnly && !me.disabled) {
  60719. targetEl = event.getTarget('.' + me.triggerBaseCls, null);
  60720. match = targetEl && targetEl.className.match(me.triggerIndexRe);
  60721. if (match) {
  60722. triggerClickMethod = me['onTrigger' + (parseInt(match[1], 10) + 1) + 'Click'] || me.onTriggerClick;
  60723. if (triggerClickMethod) {
  60724. triggerClickMethod.call(me, event);
  60725. }
  60726. }
  60727. }
  60728. },
  60729. onTriggerWrapMouseup: Ext.emptyFn,
  60730. onTriggerClick: Ext.emptyFn
  60731. });
  60732. Ext.define('Ext.form.field.Picker', {
  60733. extend: 'Ext.form.field.Trigger',
  60734. alias: 'widget.pickerfield',
  60735. alternateClassName: 'Ext.form.Picker',
  60736. requires: ['Ext.util.KeyNav'],
  60737. matchFieldWidth: true,
  60738. pickerAlign: 'tl-bl?',
  60739. openCls: Ext.baseCSSPrefix + 'pickerfield-open',
  60740. editable: true,
  60741. initComponent: function() {
  60742. this.callParent();
  60743. this.addEvents(
  60744. 'expand',
  60745. 'collapse',
  60746. 'select'
  60747. );
  60748. },
  60749. initEvents: function() {
  60750. var me = this;
  60751. me.callParent();
  60752. me.keyNav = new Ext.util.KeyNav(me.inputEl, {
  60753. down: me.onDownArrow,
  60754. esc: {
  60755. handler: me.onEsc,
  60756. scope: me,
  60757. defaultEventAction: false
  60758. },
  60759. scope: me,
  60760. forceKeyDown: true
  60761. });
  60762. if (!me.editable) {
  60763. me.mon(me.inputEl, 'click', me.onTriggerClick, me);
  60764. }
  60765. if (Ext.isGecko) {
  60766. me.inputEl.dom.setAttribute('autocomplete', 'off');
  60767. }
  60768. },
  60769. onEsc: function(e) {
  60770. var me = this;
  60771. if (me.isExpanded) {
  60772. me.collapse();
  60773. e.stopEvent();
  60774. } else {
  60775. if (me.up('window')) {
  60776. me.blur();
  60777. }
  60778. else if ((!Ext.FocusManager || !Ext.FocusManager.enabled)) {
  60779. e.stopEvent();
  60780. }
  60781. }
  60782. },
  60783. onDownArrow: function(e) {
  60784. if (!this.isExpanded) {
  60785. this.onTriggerClick();
  60786. }
  60787. },
  60788. expand: function() {
  60789. var me = this,
  60790. bodyEl, picker, collapseIf;
  60791. if (me.rendered && !me.isExpanded && !me.isDestroyed) {
  60792. bodyEl = me.bodyEl;
  60793. picker = me.getPicker();
  60794. collapseIf = me.collapseIf;
  60795. picker.show();
  60796. me.isExpanded = true;
  60797. me.alignPicker();
  60798. bodyEl.addCls(me.openCls);
  60799. me.mon(Ext.getDoc(), {
  60800. mousewheel: collapseIf,
  60801. mousedown: collapseIf,
  60802. scope: me
  60803. });
  60804. Ext.EventManager.onWindowResize(me.alignPicker, me);
  60805. me.fireEvent('expand', me);
  60806. me.onExpand();
  60807. }
  60808. },
  60809. onExpand: Ext.emptyFn,
  60810. alignPicker: function() {
  60811. var me = this,
  60812. picker = me.getPicker();
  60813. if (me.isExpanded) {
  60814. if (me.matchFieldWidth) {
  60815. picker.setWidth(me.bodyEl.getWidth());
  60816. }
  60817. if (picker.isFloating()) {
  60818. me.doAlign();
  60819. }
  60820. }
  60821. },
  60822. doAlign: function(){
  60823. var me = this,
  60824. picker = me.picker,
  60825. aboveSfx = '-above',
  60826. isAbove;
  60827. me.picker.alignTo(me.inputEl, me.pickerAlign, me.pickerOffset);
  60828. isAbove = picker.el.getY() < me.inputEl.getY();
  60829. me.bodyEl[isAbove ? 'addCls' : 'removeCls'](me.openCls + aboveSfx);
  60830. picker[isAbove ? 'addCls' : 'removeCls'](picker.baseCls + aboveSfx);
  60831. },
  60832. collapse: function() {
  60833. if (this.isExpanded && !this.isDestroyed) {
  60834. var me = this,
  60835. openCls = me.openCls,
  60836. picker = me.picker,
  60837. doc = Ext.getDoc(),
  60838. collapseIf = me.collapseIf,
  60839. aboveSfx = '-above';
  60840. picker.hide();
  60841. me.isExpanded = false;
  60842. me.bodyEl.removeCls([openCls, openCls + aboveSfx]);
  60843. picker.el.removeCls(picker.baseCls + aboveSfx);
  60844. doc.un('mousewheel', collapseIf, me);
  60845. doc.un('mousedown', collapseIf, me);
  60846. Ext.EventManager.removeResizeListener(me.alignPicker, me);
  60847. me.fireEvent('collapse', me);
  60848. me.onCollapse();
  60849. }
  60850. },
  60851. onCollapse: Ext.emptyFn,
  60852. collapseIf: function(e) {
  60853. var me = this;
  60854. if (!me.isDestroyed && !e.within(me.bodyEl, false, true) && !e.within(me.picker.el, false, true) && !me.isEventWithinPickerLoadMask(e)) {
  60855. me.collapse();
  60856. }
  60857. },
  60858. getPicker: function() {
  60859. var me = this;
  60860. return me.picker || (me.picker = me.createPicker());
  60861. },
  60862. createPicker: Ext.emptyFn,
  60863. onTriggerClick: function() {
  60864. var me = this;
  60865. if (!me.readOnly && !me.disabled) {
  60866. if (me.isExpanded) {
  60867. me.collapse();
  60868. } else {
  60869. me.expand();
  60870. }
  60871. me.inputEl.focus();
  60872. }
  60873. },
  60874. mimicBlur: function(e) {
  60875. var me = this,
  60876. picker = me.picker;
  60877. if (!picker || !e.within(picker.el, false, true) && !me.isEventWithinPickerLoadMask(e)) {
  60878. me.callParent(arguments);
  60879. }
  60880. },
  60881. onDestroy : function(){
  60882. var me = this,
  60883. picker = me.picker;
  60884. Ext.EventManager.removeResizeListener(me.alignPicker, me);
  60885. Ext.destroy(me.keyNav);
  60886. if (picker) {
  60887. delete picker.pickerField;
  60888. picker.destroy();
  60889. }
  60890. me.callParent();
  60891. },
  60892. isEventWithinPickerLoadMask: function(e) {
  60893. var loadMask = this.picker.loadMask;
  60894. return loadMask ? e.within(loadMask.maskEl, false, true) || e.within(loadMask.el, false, true) : false;
  60895. }
  60896. });
  60897. Ext.define('Ext.layout.component.BoundList', {
  60898. extend: 'Ext.layout.component.Auto',
  60899. alias: 'layout.boundlist',
  60900. type: 'component',
  60901. beginLayout: function(ownerContext) {
  60902. var me = this,
  60903. owner = me.owner,
  60904. toolbar = owner.pagingToolbar;
  60905. me.callParent(arguments);
  60906. if (owner.floating) {
  60907. ownerContext.savedXY = owner.el.getXY();
  60908. owner.el.setXY([-9999, -9999]);
  60909. }
  60910. if (toolbar) {
  60911. ownerContext.toolbarContext = ownerContext.context.getCmp(toolbar);
  60912. }
  60913. ownerContext.listContext = ownerContext.getEl('listEl');
  60914. },
  60915. beginLayoutCycle: function(ownerContext){
  60916. var owner = this.owner;
  60917. this.callParent(arguments);
  60918. if (ownerContext.heightModel.auto) {
  60919. owner.el.setHeight('auto');
  60920. owner.listEl.setHeight('auto');
  60921. }
  60922. },
  60923. getLayoutItems: function() {
  60924. var toolbar = this.owner.pagingToolbar;
  60925. return toolbar ? [toolbar] : [];
  60926. },
  60927. isValidParent: function() {
  60928. return true;
  60929. },
  60930. finishedLayout: function(ownerContext) {
  60931. var xy = ownerContext.savedXY;
  60932. this.callParent(arguments);
  60933. if (xy) {
  60934. this.owner.el.setXY(xy);
  60935. }
  60936. },
  60937. measureContentWidth: function(ownerContext) {
  60938. return this.owner.listEl.getWidth();
  60939. },
  60940. measureContentHeight: function(ownerContext) {
  60941. return this.owner.listEl.getHeight();
  60942. },
  60943. publishInnerHeight: function(ownerContext, height) {
  60944. var toolbar = ownerContext.toolbarContext,
  60945. toolbarHeight = 0;
  60946. if (toolbar) {
  60947. toolbarHeight = toolbar.getProp('height');
  60948. }
  60949. if (toolbarHeight === undefined) {
  60950. this.done = false;
  60951. } else {
  60952. ownerContext.listContext.setHeight(height - ownerContext.getFrameInfo().height - toolbarHeight);
  60953. }
  60954. },
  60955. calculateOwnerHeightFromContentHeight: function(ownerContext){
  60956. var height = this.callParent(arguments),
  60957. toolbar = ownerContext.toolbarContext;
  60958. if (toolbar) {
  60959. height += toolbar.getProp('height');
  60960. }
  60961. return height;
  60962. }
  60963. });
  60964. Ext.define('Ext.selection.Model', {
  60965. extend: 'Ext.util.Observable',
  60966. alternateClassName: 'Ext.AbstractSelectionModel',
  60967. requires: ['Ext.data.StoreManager'],
  60968. mixins: {
  60969. bindable: 'Ext.util.Bindable'
  60970. },
  60971. allowDeselect: false,
  60972. selected: null,
  60973. pruneRemoved: true,
  60974. constructor: function(cfg) {
  60975. var me = this;
  60976. cfg = cfg || {};
  60977. Ext.apply(me, cfg);
  60978. me.addEvents(
  60979. 'selectionchange',
  60980. 'focuschange'
  60981. );
  60982. me.modes = {
  60983. SINGLE: true,
  60984. SIMPLE: true,
  60985. MULTI: true
  60986. };
  60987. me.setSelectionMode(cfg.mode || me.mode);
  60988. me.selected = new Ext.util.MixedCollection();
  60989. me.callParent(arguments);
  60990. },
  60991. bindStore: function(store, initial){
  60992. var me = this;
  60993. me.mixins.bindable.bindStore.apply(me, arguments);
  60994. if(me.store && !initial) {
  60995. me.refresh();
  60996. }
  60997. },
  60998. getStoreListeners: function() {
  60999. var me = this;
  61000. return {
  61001. add: me.onStoreAdd,
  61002. clear: me.onStoreClear,
  61003. remove: me.onStoreRemove,
  61004. update: me.onStoreUpdate
  61005. };
  61006. },
  61007. selectAll: function(suppressEvent) {
  61008. var me = this,
  61009. selections = me.store.getRange(),
  61010. i = 0,
  61011. len = selections.length,
  61012. start = me.getSelection().length;
  61013. me.bulkChange = true;
  61014. for (; i < len; i++) {
  61015. me.doSelect(selections[i], true, suppressEvent);
  61016. }
  61017. delete me.bulkChange;
  61018. me.maybeFireSelectionChange(me.getSelection().length !== start);
  61019. },
  61020. deselectAll: function(suppressEvent) {
  61021. var me = this,
  61022. selections = me.getSelection(),
  61023. i = 0,
  61024. len = selections.length,
  61025. start = me.getSelection().length;
  61026. me.bulkChange = true;
  61027. for (; i < len; i++) {
  61028. me.doDeselect(selections[i], suppressEvent);
  61029. }
  61030. delete me.bulkChange;
  61031. me.maybeFireSelectionChange(me.getSelection().length !== start);
  61032. },
  61033. selectWithEvent: function(record, e, keepExisting) {
  61034. var me = this;
  61035. switch (me.selectionMode) {
  61036. case 'MULTI':
  61037. if (e.ctrlKey && me.isSelected(record)) {
  61038. me.doDeselect(record, false);
  61039. } else if (e.shiftKey && me.lastFocused) {
  61040. me.selectRange(me.lastFocused, record, e.ctrlKey);
  61041. } else if (e.ctrlKey) {
  61042. me.doSelect(record, true, false);
  61043. } else if (me.isSelected(record) && !e.shiftKey && !e.ctrlKey && me.selected.getCount() > 1) {
  61044. me.doSelect(record, keepExisting, false);
  61045. } else {
  61046. me.doSelect(record, false);
  61047. }
  61048. break;
  61049. case 'SIMPLE':
  61050. if (me.isSelected(record)) {
  61051. me.doDeselect(record);
  61052. } else {
  61053. me.doSelect(record, true);
  61054. }
  61055. break;
  61056. case 'SINGLE':
  61057. if (me.allowDeselect && me.isSelected(record)) {
  61058. me.doDeselect(record);
  61059. } else {
  61060. me.doSelect(record, false);
  61061. }
  61062. break;
  61063. }
  61064. },
  61065. selectRange : function(startRow, endRow, keepExisting, dir){
  61066. var me = this,
  61067. store = me.store,
  61068. selectedCount = 0,
  61069. i,
  61070. tmp,
  61071. dontDeselect,
  61072. records = [];
  61073. if (me.isLocked()){
  61074. return;
  61075. }
  61076. if (!keepExisting) {
  61077. me.deselectAll(true);
  61078. }
  61079. if (!Ext.isNumber(startRow)) {
  61080. startRow = store.indexOf(startRow);
  61081. }
  61082. if (!Ext.isNumber(endRow)) {
  61083. endRow = store.indexOf(endRow);
  61084. }
  61085. if (startRow > endRow){
  61086. tmp = endRow;
  61087. endRow = startRow;
  61088. startRow = tmp;
  61089. }
  61090. for (i = startRow; i <= endRow; i++) {
  61091. if (me.isSelected(store.getAt(i))) {
  61092. selectedCount++;
  61093. }
  61094. }
  61095. if (!dir) {
  61096. dontDeselect = -1;
  61097. } else {
  61098. dontDeselect = (dir == 'up') ? startRow : endRow;
  61099. }
  61100. for (i = startRow; i <= endRow; i++){
  61101. if (selectedCount == (endRow - startRow + 1)) {
  61102. if (i != dontDeselect) {
  61103. me.doDeselect(i, true);
  61104. }
  61105. } else {
  61106. records.push(store.getAt(i));
  61107. }
  61108. }
  61109. me.doMultiSelect(records, true);
  61110. },
  61111. select: function(records, keepExisting, suppressEvent) {
  61112. if (Ext.isDefined(records)) {
  61113. this.doSelect(records, keepExisting, suppressEvent);
  61114. }
  61115. },
  61116. deselect: function(records, suppressEvent) {
  61117. this.doDeselect(records, suppressEvent);
  61118. },
  61119. doSelect: function(records, keepExisting, suppressEvent) {
  61120. var me = this,
  61121. record;
  61122. if (me.locked || !me.store) {
  61123. return;
  61124. }
  61125. if (typeof records === "number") {
  61126. records = [me.store.getAt(records)];
  61127. }
  61128. if (me.selectionMode == "SINGLE" && records) {
  61129. record = records.length ? records[0] : records;
  61130. me.doSingleSelect(record, suppressEvent);
  61131. } else {
  61132. me.doMultiSelect(records, keepExisting, suppressEvent);
  61133. }
  61134. },
  61135. doMultiSelect: function(records, keepExisting, suppressEvent) {
  61136. var me = this,
  61137. selected = me.selected,
  61138. change = false,
  61139. i = 0,
  61140. len, record;
  61141. if (me.locked) {
  61142. return;
  61143. }
  61144. records = !Ext.isArray(records) ? [records] : records;
  61145. len = records.length;
  61146. if (!keepExisting && selected.getCount() > 0) {
  61147. if (me.doDeselect(me.getSelection(), suppressEvent) === false) {
  61148. return;
  61149. }
  61150. }
  61151. function commit () {
  61152. selected.add(record);
  61153. change = true;
  61154. }
  61155. for (; i < len; i++) {
  61156. record = records[i];
  61157. if (keepExisting && me.isSelected(record)) {
  61158. continue;
  61159. }
  61160. me.lastSelected = record;
  61161. me.onSelectChange(record, true, suppressEvent, commit);
  61162. }
  61163. if (!me.preventFocus) {
  61164. me.setLastFocused(record, suppressEvent);
  61165. }
  61166. me.maybeFireSelectionChange(change && !suppressEvent);
  61167. },
  61168. doDeselect: function(records, suppressEvent) {
  61169. var me = this,
  61170. selected = me.selected,
  61171. i = 0,
  61172. len, record,
  61173. attempted = 0,
  61174. accepted = 0;
  61175. if (me.locked || !me.store) {
  61176. return false;
  61177. }
  61178. if (typeof records === "number") {
  61179. records = [me.store.getAt(records)];
  61180. } else if (!Ext.isArray(records)) {
  61181. records = [records];
  61182. }
  61183. function commit () {
  61184. ++accepted;
  61185. selected.remove(record);
  61186. }
  61187. len = records.length;
  61188. for (; i < len; i++) {
  61189. record = records[i];
  61190. if (me.isSelected(record)) {
  61191. if (me.lastSelected == record) {
  61192. me.lastSelected = selected.last();
  61193. }
  61194. ++attempted;
  61195. me.onSelectChange(record, false, suppressEvent, commit);
  61196. }
  61197. }
  61198. me.maybeFireSelectionChange(accepted > 0 && !suppressEvent);
  61199. return accepted === attempted;
  61200. },
  61201. doSingleSelect: function(record, suppressEvent) {
  61202. var me = this,
  61203. changed = false,
  61204. selected = me.selected;
  61205. if (me.locked) {
  61206. return;
  61207. }
  61208. if (me.isSelected(record)) {
  61209. return;
  61210. }
  61211. function commit () {
  61212. me.bulkChange = true;
  61213. if (selected.getCount() > 0 && me.doDeselect(me.lastSelected, suppressEvent) === false) {
  61214. delete me.bulkChange;
  61215. return false;
  61216. }
  61217. delete me.bulkChange;
  61218. selected.add(record);
  61219. me.lastSelected = record;
  61220. changed = true;
  61221. }
  61222. me.onSelectChange(record, true, suppressEvent, commit);
  61223. if (changed) {
  61224. if (!suppressEvent) {
  61225. me.setLastFocused(record);
  61226. }
  61227. me.maybeFireSelectionChange(!suppressEvent);
  61228. }
  61229. },
  61230. setLastFocused: function(record, supressFocus) {
  61231. var me = this,
  61232. recordBeforeLast = me.lastFocused;
  61233. me.lastFocused = record;
  61234. if (record !== recordBeforeLast) {
  61235. me.onLastFocusChanged(recordBeforeLast, record, supressFocus);
  61236. }
  61237. },
  61238. isFocused: function(record) {
  61239. return record === this.getLastFocused();
  61240. },
  61241. maybeFireSelectionChange: function(fireEvent) {
  61242. var me = this;
  61243. if (fireEvent && !me.bulkChange) {
  61244. me.fireEvent('selectionchange', me, me.getSelection());
  61245. }
  61246. },
  61247. getLastSelected: function() {
  61248. return this.lastSelected;
  61249. },
  61250. getLastFocused: function() {
  61251. return this.lastFocused;
  61252. },
  61253. getSelection: function() {
  61254. return this.selected.getRange();
  61255. },
  61256. getSelectionMode: function() {
  61257. return this.selectionMode;
  61258. },
  61259. setSelectionMode: function(selMode) {
  61260. selMode = selMode ? selMode.toUpperCase() : 'SINGLE';
  61261. this.selectionMode = this.modes[selMode] ? selMode : 'SINGLE';
  61262. },
  61263. isLocked: function() {
  61264. return this.locked;
  61265. },
  61266. setLocked: function(locked) {
  61267. this.locked = !!locked;
  61268. },
  61269. isSelected: function(record) {
  61270. record = Ext.isNumber(record) ? this.store.getAt(record) : record;
  61271. return this.selected.indexOf(record) !== -1;
  61272. },
  61273. hasSelection: function() {
  61274. return this.selected.getCount() > 0;
  61275. },
  61276. refresh: function() {
  61277. var me = this,
  61278. store = me.store,
  61279. toBeSelected = [],
  61280. oldSelections = me.getSelection(),
  61281. len = oldSelections.length,
  61282. selection,
  61283. change,
  61284. i = 0,
  61285. lastFocused = me.getLastFocused();
  61286. if (!store) {
  61287. return;
  61288. }
  61289. for (; i < len; i++) {
  61290. selection = oldSelections[i];
  61291. if (!me.pruneRemoved || store.indexOf(selection) !== -1) {
  61292. toBeSelected.push(selection);
  61293. }
  61294. }
  61295. if (me.selected.getCount() != toBeSelected.length) {
  61296. change = true;
  61297. }
  61298. me.clearSelections();
  61299. if (store.indexOf(lastFocused) !== -1) {
  61300. me.setLastFocused(lastFocused, true);
  61301. }
  61302. if (toBeSelected.length) {
  61303. me.doSelect(toBeSelected, false, true);
  61304. }
  61305. me.maybeFireSelectionChange(change);
  61306. },
  61307. clearSelections: function() {
  61308. this.selected.clear();
  61309. this.lastSelected = null;
  61310. this.setLastFocused(null);
  61311. },
  61312. onStoreAdd: Ext.emptyFn,
  61313. onStoreClear: function() {
  61314. if (this.selected.getCount > 0) {
  61315. this.clearSelections();
  61316. this.maybeFireSelectionChange(true);
  61317. }
  61318. },
  61319. onStoreRemove: function(store, record, index) {
  61320. var me = this,
  61321. selected = me.selected;
  61322. if (me.locked || !me.pruneRemoved) {
  61323. return;
  61324. }
  61325. if (selected.remove(record)) {
  61326. if (me.lastSelected == record) {
  61327. me.lastSelected = null;
  61328. }
  61329. if (me.getLastFocused() == record) {
  61330. me.setLastFocused(null);
  61331. }
  61332. me.maybeFireSelectionChange(true);
  61333. }
  61334. },
  61335. getCount: function() {
  61336. return this.selected.getCount();
  61337. },
  61338. destroy: Ext.emptyFn,
  61339. onStoreUpdate: Ext.emptyFn,
  61340. onStoreLoad: Ext.emptyFn,
  61341. onSelectChange: Ext.emptyFn,
  61342. onLastFocusChanged: function(oldFocused, newFocused) {
  61343. this.fireEvent('focuschange', this, oldFocused, newFocused);
  61344. },
  61345. onEditorKey: Ext.emptyFn,
  61346. bindComponent: Ext.emptyFn,
  61347. beforeViewRender: Ext.emptyFn
  61348. });
  61349. Ext.define('Ext.selection.DataViewModel', {
  61350. extend: 'Ext.selection.Model',
  61351. requires: ['Ext.util.KeyNav'],
  61352. deselectOnContainerClick: true,
  61353. enableKeyNav: true,
  61354. constructor: function(cfg){
  61355. this.addEvents(
  61356. 'beforedeselect',
  61357. 'beforeselect',
  61358. 'deselect',
  61359. 'select'
  61360. );
  61361. this.callParent(arguments);
  61362. },
  61363. bindComponent: function(view) {
  61364. var me = this,
  61365. eventListeners = {
  61366. refresh: me.refresh,
  61367. scope: me
  61368. };
  61369. me.view = view;
  61370. me.bindStore(view.getStore());
  61371. eventListeners[view.triggerEvent] = me.onItemClick;
  61372. eventListeners[view.triggerCtEvent] = me.onContainerClick;
  61373. view.on(eventListeners);
  61374. if (me.enableKeyNav) {
  61375. me.initKeyNav(view);
  61376. }
  61377. },
  61378. onItemClick: function(view, record, item, index, e) {
  61379. this.selectWithEvent(record, e);
  61380. },
  61381. onContainerClick: function() {
  61382. if (this.deselectOnContainerClick) {
  61383. this.deselectAll();
  61384. }
  61385. },
  61386. initKeyNav: function(view) {
  61387. var me = this;
  61388. if (!view.rendered) {
  61389. view.on({
  61390. render: Ext.Function.bind(me.initKeyNav, me, [view]),
  61391. single: true
  61392. });
  61393. return;
  61394. }
  61395. view.el.set({
  61396. tabIndex: -1
  61397. });
  61398. me.keyNav = new Ext.util.KeyNav({
  61399. target: view.el,
  61400. ignoreInputFields: true,
  61401. down: Ext.pass(me.onNavKey, [1], me),
  61402. right: Ext.pass(me.onNavKey, [1], me),
  61403. left: Ext.pass(me.onNavKey, [-1], me),
  61404. up: Ext.pass(me.onNavKey, [-1], me),
  61405. scope: me
  61406. });
  61407. },
  61408. onNavKey: function(step) {
  61409. step = step || 1;
  61410. var me = this,
  61411. view = me.view,
  61412. selected = me.getSelection()[0],
  61413. numRecords = me.view.store.getCount(),
  61414. idx;
  61415. if (selected) {
  61416. idx = view.indexOf(view.getNode(selected)) + step;
  61417. } else {
  61418. idx = 0;
  61419. }
  61420. if (idx < 0) {
  61421. idx = numRecords - 1;
  61422. } else if (idx >= numRecords) {
  61423. idx = 0;
  61424. }
  61425. me.select(idx);
  61426. },
  61427. onSelectChange: function(record, isSelected, suppressEvent, commitFn) {
  61428. var me = this,
  61429. view = me.view,
  61430. eventName = isSelected ? 'select' : 'deselect';
  61431. if ((suppressEvent || me.fireEvent('before' + eventName, me, record)) !== false &&
  61432. commitFn() !== false) {
  61433. if (view) {
  61434. if (isSelected) {
  61435. view.onItemSelect(record);
  61436. } else {
  61437. view.onItemDeselect(record);
  61438. }
  61439. }
  61440. if (!suppressEvent) {
  61441. me.fireEvent(eventName, me, record);
  61442. }
  61443. }
  61444. },
  61445. destroy: function(){
  61446. Ext.destroy(this.keyNav);
  61447. this.callParent();
  61448. }
  61449. });
  61450. Ext.define('Ext.view.AbstractView', {
  61451. extend: 'Ext.Component',
  61452. requires: [
  61453. 'Ext.LoadMask',
  61454. 'Ext.data.StoreManager',
  61455. 'Ext.CompositeElementLite',
  61456. 'Ext.DomQuery',
  61457. 'Ext.selection.DataViewModel'
  61458. ],
  61459. mixins: {
  61460. bindable: 'Ext.util.Bindable'
  61461. },
  61462. inheritableStatics: {
  61463. getRecord: function(node) {
  61464. return this.getBoundView(node).getRecord(node);
  61465. },
  61466. getBoundView: function(node) {
  61467. return Ext.getCmp(node.boundView);
  61468. }
  61469. },
  61470. deferInitialRefresh: true,
  61471. itemCls: Ext.baseCSSPrefix + 'dataview-item',
  61472. loadingText: 'Loading...',
  61473. loadMask: true,
  61474. loadingUseMsg: true,
  61475. selectedItemCls: Ext.baseCSSPrefix + 'item-selected',
  61476. emptyText: "",
  61477. deferEmptyText: true,
  61478. trackOver: false,
  61479. blockRefresh: false,
  61480. preserveScrollOnRefresh: false,
  61481. last: false,
  61482. triggerEvent: 'itemclick',
  61483. triggerCtEvent: 'containerclick',
  61484. addCmpEvents: function() {
  61485. },
  61486. initComponent : function(){
  61487. var me = this,
  61488. isDef = Ext.isDefined,
  61489. itemTpl = me.itemTpl,
  61490. memberFn = {};
  61491. if (itemTpl) {
  61492. if (Ext.isArray(itemTpl)) {
  61493. itemTpl = itemTpl.join('');
  61494. } else if (Ext.isObject(itemTpl)) {
  61495. memberFn = Ext.apply(memberFn, itemTpl.initialConfig);
  61496. itemTpl = itemTpl.html;
  61497. }
  61498. if (!me.itemSelector) {
  61499. me.itemSelector = '.' + me.itemCls;
  61500. }
  61501. itemTpl = Ext.String.format('<tpl for="."><div class="{0}">{1}</div></tpl>', me.itemCls, itemTpl);
  61502. me.tpl = new Ext.XTemplate(itemTpl, memberFn);
  61503. }
  61504. me.callParent();
  61505. if(Ext.isString(me.tpl) || Ext.isArray(me.tpl)){
  61506. me.tpl = new Ext.XTemplate(me.tpl);
  61507. }
  61508. me.addEvents(
  61509. 'beforerefresh',
  61510. 'refresh',
  61511. 'viewready',
  61512. 'itemupdate',
  61513. 'itemadd',
  61514. 'itemremove'
  61515. );
  61516. me.addCmpEvents();
  61517. me.store = Ext.data.StoreManager.lookup(me.store || 'ext-empty-store');
  61518. me.bindStore(me.store, true);
  61519. me.all = new Ext.CompositeElementLite();
  61520. me.scrollState = {
  61521. top: 0,
  61522. left: 0
  61523. };
  61524. me.on({
  61525. scroll: me.onViewScroll,
  61526. element: 'el',
  61527. scope: me
  61528. });
  61529. },
  61530. onRender: function() {
  61531. var me = this,
  61532. mask = me.loadMask,
  61533. cfg = {
  61534. msg: me.loadingText,
  61535. msgCls: me.loadingCls,
  61536. useMsg: me.loadingUseMsg,
  61537. store: me.getMaskStore()
  61538. };
  61539. me.callParent(arguments);
  61540. if (mask) {
  61541. if (Ext.isObject(mask)) {
  61542. cfg = Ext.apply(cfg, mask);
  61543. }
  61544. me.loadMask = new Ext.LoadMask(me, cfg);
  61545. me.loadMask.on({
  61546. scope: me,
  61547. beforeshow: me.onMaskBeforeShow,
  61548. hide: me.onMaskHide
  61549. });
  61550. }
  61551. },
  61552. finishRender: function(){
  61553. var me = this;
  61554. me.callParent(arguments);
  61555. if (!me.up('[collapsed],[hidden]')) {
  61556. me.doFirstRefresh(me.store);
  61557. }
  61558. },
  61559. onBoxReady: function() {
  61560. var me = this;
  61561. me.callParent(arguments);
  61562. if (!me.firstRefreshDone) {
  61563. me.doFirstRefresh(me.store);
  61564. }
  61565. },
  61566. getMaskStore: function(){
  61567. return this.store;
  61568. },
  61569. onMaskBeforeShow: function(){
  61570. var me = this,
  61571. loadingHeight = me.loadingHeight;
  61572. me.getSelectionModel().deselectAll();
  61573. me.all.clear();
  61574. if (loadingHeight && loadingHeight > me.getHeight()) {
  61575. me.hasLoadingHeight = true;
  61576. me.oldMinHeight = me.minHeight;
  61577. me.minHeight = loadingHeight;
  61578. me.updateLayout();
  61579. }
  61580. },
  61581. onMaskHide: function(){
  61582. var me = this;
  61583. if (!me.destroying && me.hasLoadingHeight) {
  61584. me.minHeight = me.oldMinHeight;
  61585. me.updateLayout();
  61586. delete me.hasLoadingHeight;
  61587. }
  61588. },
  61589. beforeRender: function() {
  61590. this.callParent(arguments);
  61591. this.getSelectionModel().beforeViewRender(this);
  61592. },
  61593. afterRender: function() {
  61594. this.callParent(arguments);
  61595. this.getSelectionModel().bindComponent(this);
  61596. },
  61597. getSelectionModel: function(){
  61598. var me = this,
  61599. mode = 'SINGLE';
  61600. if (!me.selModel) {
  61601. me.selModel = {};
  61602. }
  61603. if (me.simpleSelect) {
  61604. mode = 'SIMPLE';
  61605. } else if (me.multiSelect) {
  61606. mode = 'MULTI';
  61607. }
  61608. Ext.applyIf(me.selModel, {
  61609. allowDeselect: me.allowDeselect,
  61610. mode: mode
  61611. });
  61612. if (!me.selModel.events) {
  61613. me.selModel = new Ext.selection.DataViewModel(me.selModel);
  61614. }
  61615. if (!me.selModel.hasRelaySetup) {
  61616. me.relayEvents(me.selModel, [
  61617. 'selectionchange', 'beforeselect', 'beforedeselect', 'select', 'deselect', 'focuschange'
  61618. ]);
  61619. me.selModel.hasRelaySetup = true;
  61620. }
  61621. if (me.disableSelection) {
  61622. me.selModel.locked = true;
  61623. }
  61624. return me.selModel;
  61625. },
  61626. refresh: function() {
  61627. var me = this,
  61628. targetEl,
  61629. targetParent,
  61630. oldDisplay,
  61631. nextSibling,
  61632. dom,
  61633. records;
  61634. if (!me.rendered || me.isDestroyed) {
  61635. return;
  61636. }
  61637. if (!me.hasListeners.beforerefresh || me.fireEvent('beforerefresh', me) !== false) {
  61638. targetEl = me.getTargetEl();
  61639. records = me.store.getRange();
  61640. dom = targetEl.dom;
  61641. if (!me.preserveScrollOnRefresh) {
  61642. targetParent = dom.parentNode;
  61643. oldDisplay = dom.style.display;
  61644. dom.style.display = 'none';
  61645. nextSibling = dom.nextSibling;
  61646. targetParent.removeChild(dom);
  61647. }
  61648. if (me.refreshCounter) {
  61649. me.clearViewEl();
  61650. } else {
  61651. me.fixedNodes = targetEl.dom.childNodes.length;
  61652. me.refreshCounter = 1;
  61653. }
  61654. me.tpl.append(targetEl, me.collectData(records, 0));
  61655. if (records.length < 1) {
  61656. if (!me.deferEmptyText || me.hasSkippedEmptyText) {
  61657. Ext.core.DomHelper.insertHtml('beforeEnd', targetEl.dom, me.emptyText);
  61658. }
  61659. me.all.clear();
  61660. } else {
  61661. me.all.fill(Ext.query(me.getItemSelector(), targetEl.dom));
  61662. me.updateIndexes(0);
  61663. }
  61664. me.selModel.refresh();
  61665. me.hasSkippedEmptyText = true;
  61666. if (!me.preserveScrollOnRefresh) {
  61667. targetParent.insertBefore(dom, nextSibling);
  61668. dom.style.display = oldDisplay;
  61669. }
  61670. this.refreshSize();
  61671. me.fireEvent('refresh', me);
  61672. if (!me.viewReady) {
  61673. me.viewReady = true;
  61674. me.fireEvent('viewready', me);
  61675. }
  61676. }
  61677. },
  61678. refreshSize: function() {
  61679. var sizeModel = this.getSizeModel();
  61680. if (sizeModel.height.shrinkWrap || sizeModel.width.shrinkWrap) {
  61681. this.updateLayout();
  61682. }
  61683. },
  61684. clearViewEl: function(){
  61685. var me = this,
  61686. el = me.getTargetEl();
  61687. if (me.fixedNodes) {
  61688. while (el.dom.childNodes[me.fixedNodes]) {
  61689. el.dom.removeChild(el.dom.childNodes[me.fixedNodes]);
  61690. }
  61691. } else {
  61692. el.update('');
  61693. }
  61694. me.refreshCounter++;
  61695. },
  61696. onViewScroll: Ext.emptyFn,
  61697. saveScrollState: function() {
  61698. if (this.rendered) {
  61699. var dom = this.el.dom,
  61700. state = this.scrollState;
  61701. state.left = dom.scrollLeft;
  61702. state.top = dom.scrollTop;
  61703. }
  61704. },
  61705. restoreScrollState: function() {
  61706. if (this.rendered) {
  61707. var dom = this.el.dom,
  61708. state = this.scrollState;
  61709. dom.scrollLeft = state.left;
  61710. dom.scrollTop = state.top;
  61711. }
  61712. },
  61713. prepareData: function(data, index, record) {
  61714. var associatedData, attr;
  61715. if (record) {
  61716. associatedData = record.getAssociatedData();
  61717. for (attr in associatedData) {
  61718. if (associatedData.hasOwnProperty(attr)) {
  61719. data[attr] = associatedData[attr];
  61720. }
  61721. }
  61722. }
  61723. return data;
  61724. },
  61725. collectData : function(records, startIndex){
  61726. var data = [],
  61727. i = 0,
  61728. len = records.length,
  61729. record;
  61730. for (; i < len; i++) {
  61731. record = records[i];
  61732. data[i] = this.prepareData(record.data, startIndex + i, record);
  61733. }
  61734. return data;
  61735. },
  61736. bufferRender : function(records, index){
  61737. var me = this,
  61738. div = me.renderBuffer || (me.renderBuffer = document.createElement('div'));
  61739. me.tpl.overwrite(div, me.collectData(records, index));
  61740. return Ext.query(me.getItemSelector(), div);
  61741. },
  61742. onUpdate : function(ds, record){
  61743. var me = this,
  61744. index,
  61745. node;
  61746. if (me.viewReady) {
  61747. index = me.store.indexOf(record);
  61748. if (index > -1) {
  61749. node = me.bufferRender([record], index)[0];
  61750. if (me.getNode(record)) {
  61751. me.all.replaceElement(index, node, true);
  61752. me.updateIndexes(index, index);
  61753. me.selModel.refresh();
  61754. if (me.hasListeners.itemupdate) {
  61755. me.fireEvent('itemupdate', record, index, node);
  61756. }
  61757. return node;
  61758. }
  61759. }
  61760. }
  61761. },
  61762. onAdd : function(ds, records, index) {
  61763. var me = this,
  61764. nodes;
  61765. if (me.rendered) {
  61766. if (me.all.getCount() === 0) {
  61767. me.refresh();
  61768. return;
  61769. }
  61770. nodes = me.bufferRender(records, index);
  61771. me.doAdd(nodes, records, index);
  61772. me.selModel.refresh();
  61773. me.updateIndexes(index);
  61774. me.refreshSize();
  61775. if (me.hasListeners.itemadd) {
  61776. me.fireEvent('itemadd', records, index, nodes);
  61777. }
  61778. }
  61779. },
  61780. doAdd: function(nodes, records, index) {
  61781. var all = this.all,
  61782. count = all.getCount();
  61783. if (count === 0) {
  61784. this.clearViewEl();
  61785. this.getTargetEl().appendChild(nodes);
  61786. } else if (index < count) {
  61787. if (index === 0) {
  61788. all.item(index).insertSibling(nodes, 'before', true);
  61789. } else {
  61790. all.item(index - 1).insertSibling(nodes, 'after', true);
  61791. }
  61792. } else {
  61793. all.last().insertSibling(nodes, 'after', true);
  61794. }
  61795. Ext.Array.insert(all.elements, index, nodes);
  61796. },
  61797. onRemove : function(ds, record, index) {
  61798. var me = this;
  61799. if (me.all.getCount()) {
  61800. if (me.store.getCount() === 0) {
  61801. me.refresh();
  61802. } else {
  61803. me.doRemove(record, index);
  61804. if (me.selModel.refreshOnRemove) {
  61805. me.selModel.refresh();
  61806. }
  61807. me.updateIndexes(index);
  61808. }
  61809. this.refreshSize();
  61810. if (me.hasListeners.itemremove) {
  61811. me.fireEvent('itemremove', record, index);
  61812. }
  61813. }
  61814. },
  61815. doRemove: function(record, index) {
  61816. this.all.removeElement(index, true);
  61817. },
  61818. refreshNode : function(index){
  61819. this.onUpdate(this.store, this.store.getAt(index));
  61820. },
  61821. updateIndexes : function(startIndex, endIndex) {
  61822. var ns = this.all.elements,
  61823. records = this.store.getRange(),
  61824. i;
  61825. startIndex = startIndex || 0;
  61826. endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));
  61827. for (i = startIndex; i <= endIndex; i++) {
  61828. ns[i].viewIndex = i;
  61829. ns[i].viewRecordId = records[i].internalId;
  61830. if (!ns[i].boundView) {
  61831. ns[i].boundView = this.id;
  61832. }
  61833. }
  61834. },
  61835. getStore : function() {
  61836. return this.store;
  61837. },
  61838. bindStore : function(store, initial) {
  61839. var me = this;
  61840. me.mixins.bindable.bindStore.apply(me, arguments);
  61841. if (!initial) {
  61842. me.getSelectionModel().bindStore(me.store);
  61843. }
  61844. if (me.componentLayoutCounter) {
  61845. me.doFirstRefresh(store);
  61846. }
  61847. },
  61848. doFirstRefresh: function(store) {
  61849. var me = this;
  61850. me.firstRefreshDone = true;
  61851. if (store && !store.loading) {
  61852. if (me.deferInitialRefresh) {
  61853. me.applyFirstRefresh();
  61854. } else {
  61855. me.refresh();
  61856. }
  61857. }
  61858. },
  61859. applyFirstRefresh: function(){
  61860. var me = this;
  61861. if (me.isDestroyed) {
  61862. return;
  61863. }
  61864. if (me.up('[isCollapsingOrExpanding]')) {
  61865. Ext.Function.defer(me.applyFirstRefresh, 100, me);
  61866. } else {
  61867. Ext.Function.defer(function () {
  61868. if (!me.isDestroyed) {
  61869. me.refresh();
  61870. }
  61871. }, 1);
  61872. }
  61873. },
  61874. onUnbindStore: function(store) {
  61875. this.setMaskBind(null);
  61876. },
  61877. onBindStore: function(store) {
  61878. this.setMaskBind(store);
  61879. },
  61880. setMaskBind: function(store) {
  61881. var mask = this.loadMask;
  61882. if (mask && mask.bindStore) {
  61883. mask.bindStore(store);
  61884. }
  61885. },
  61886. getStoreListeners: function() {
  61887. var me = this;
  61888. return {
  61889. refresh: me.onDataRefresh,
  61890. add: me.onAdd,
  61891. remove: me.onRemove,
  61892. update: me.onUpdate,
  61893. clear: me.refresh
  61894. };
  61895. },
  61896. onDataRefresh: function() {
  61897. var me = this,
  61898. blockedByAncestor = !me.firstRefreshDone && (!me.rendered || me.up('[collapsed],[isCollapsingOrExpanding],[hidden]'));
  61899. if (blockedByAncestor) {
  61900. me.deferInitialRefresh = false;
  61901. } else if (me.blockRefresh !== true) {
  61902. me.firstRefreshDone = true;
  61903. me.refresh.apply(me, arguments);
  61904. }
  61905. },
  61906. findItemByChild: function(node){
  61907. return Ext.fly(node).findParent(this.getItemSelector(), this.getTargetEl());
  61908. },
  61909. findTargetByEvent: function(e) {
  61910. return e.getTarget(this.getItemSelector(), this.getTargetEl());
  61911. },
  61912. getSelectedNodes: function(){
  61913. var nodes = [],
  61914. records = this.selModel.getSelection(),
  61915. ln = records.length,
  61916. i = 0;
  61917. for (; i < ln; i++) {
  61918. nodes.push(this.getNode(records[i]));
  61919. }
  61920. return nodes;
  61921. },
  61922. getRecords: function(nodes) {
  61923. var records = [],
  61924. i = 0,
  61925. len = nodes.length,
  61926. data = this.store.data;
  61927. for (; i < len; i++) {
  61928. records[records.length] = data.getByKey(nodes[i].viewRecordId);
  61929. }
  61930. return records;
  61931. },
  61932. getRecord: function(node){
  61933. return this.store.data.getByKey(Ext.getDom(node).viewRecordId);
  61934. },
  61935. isSelected : function(node) {
  61936. var r = this.getRecord(node);
  61937. return this.selModel.isSelected(r);
  61938. },
  61939. select: function(records, keepExisting, suppressEvent) {
  61940. this.selModel.select(records, keepExisting, suppressEvent);
  61941. },
  61942. deselect: function(records, suppressEvent) {
  61943. this.selModel.deselect(records, suppressEvent);
  61944. },
  61945. getNode : function(nodeInfo) {
  61946. if ((!nodeInfo && nodeInfo !== 0) || !this.rendered) {
  61947. return null;
  61948. }
  61949. if (Ext.isString(nodeInfo)) {
  61950. return document.getElementById(nodeInfo);
  61951. }
  61952. if (Ext.isNumber(nodeInfo)) {
  61953. return this.all.elements[nodeInfo];
  61954. }
  61955. if (nodeInfo.isModel) {
  61956. return this.getNodeByRecord(nodeInfo);
  61957. }
  61958. return nodeInfo;
  61959. },
  61960. getNodeByRecord: function(record) {
  61961. var ns = this.all.elements,
  61962. ln = ns.length,
  61963. i = 0;
  61964. for (; i < ln; i++) {
  61965. if (ns[i].viewRecordId === record.internalId) {
  61966. return ns[i];
  61967. }
  61968. }
  61969. return null;
  61970. },
  61971. getNodes: function(start, end) {
  61972. var ns = this.all.elements;
  61973. if (end === undefined) {
  61974. end = ns.length;
  61975. } else {
  61976. end++;
  61977. }
  61978. return this.all.elements.slice(start||0, end);
  61979. },
  61980. indexOf: function(node) {
  61981. node = this.getNode(node);
  61982. if (!node && node !== 0) {
  61983. return -1;
  61984. }
  61985. if (Ext.isNumber(node.viewIndex)) {
  61986. return node.viewIndex;
  61987. }
  61988. return this.all.indexOf(node);
  61989. },
  61990. onDestroy : function() {
  61991. var me = this;
  61992. me.all.clear();
  61993. me.callParent();
  61994. me.bindStore(null);
  61995. me.selModel.destroy();
  61996. },
  61997. onItemSelect: function(record) {
  61998. var node = this.getNode(record);
  61999. if (node) {
  62000. Ext.fly(node).addCls(this.selectedItemCls);
  62001. }
  62002. },
  62003. onItemDeselect: function(record) {
  62004. var node = this.getNode(record);
  62005. if (node) {
  62006. Ext.fly(node).removeCls(this.selectedItemCls);
  62007. }
  62008. },
  62009. getItemSelector: function() {
  62010. return this.itemSelector;
  62011. }
  62012. }, function() {
  62013. Ext.deprecate('extjs', '4.0', function() {
  62014. Ext.view.AbstractView.override({
  62015. getSelectionCount : function(){
  62016. if (Ext.global.console) {
  62017. Ext.global.console.warn("DataView: getSelectionCount will be removed, please interact with the Ext.selection.DataViewModel");
  62018. }
  62019. return this.selModel.getSelection().length;
  62020. },
  62021. getSelectedRecords : function(){
  62022. if (Ext.global.console) {
  62023. Ext.global.console.warn("DataView: getSelectedRecords will be removed, please interact with the Ext.selection.DataViewModel");
  62024. }
  62025. return this.selModel.getSelection();
  62026. },
  62027. select: function(records, keepExisting, supressEvents) {
  62028. if (Ext.global.console) {
  62029. Ext.global.console.warn("DataView: select will be removed, please access select through a DataView's SelectionModel, ie: view.getSelectionModel().select()");
  62030. }
  62031. var sm = this.getSelectionModel();
  62032. return sm.select.apply(sm, arguments);
  62033. },
  62034. clearSelections: function() {
  62035. if (Ext.global.console) {
  62036. Ext.global.console.warn("DataView: clearSelections will be removed, please access deselectAll through DataView's SelectionModel, ie: view.getSelectionModel().deselectAll()");
  62037. }
  62038. var sm = this.getSelectionModel();
  62039. return sm.deselectAll();
  62040. }
  62041. });
  62042. });
  62043. });
  62044. Ext.define('Ext.view.View', {
  62045. extend: 'Ext.view.AbstractView',
  62046. alternateClassName: 'Ext.DataView',
  62047. alias: 'widget.dataview',
  62048. deferHighlight: (Ext.isIE6 || Ext.isIE7) ? 100 : 0,
  62049. inputTagRe: /^textarea$|^input$/i,
  62050. inheritableStatics: {
  62051. EventMap: {
  62052. mousedown: 'MouseDown',
  62053. mouseup: 'MouseUp',
  62054. click: 'Click',
  62055. dblclick: 'DblClick',
  62056. contextmenu: 'ContextMenu',
  62057. mouseover: 'MouseOver',
  62058. mouseout: 'MouseOut',
  62059. mouseenter: 'MouseEnter',
  62060. mouseleave: 'MouseLeave',
  62061. keydown: 'KeyDown',
  62062. focus: 'Focus'
  62063. }
  62064. },
  62065. initComponent: function() {
  62066. var me = this;
  62067. me.callParent();
  62068. if (me.deferHighlight){
  62069. me.setHighlightedItem =
  62070. Ext.Function.createBuffered(me.setHighlightedItem, me.deferHighlight, me);
  62071. }
  62072. },
  62073. addCmpEvents: function() {
  62074. this.addEvents(
  62075. 'beforeitemmousedown',
  62076. 'beforeitemmouseup',
  62077. 'beforeitemmouseenter',
  62078. 'beforeitemmouseleave',
  62079. 'beforeitemclick',
  62080. 'beforeitemdblclick',
  62081. 'beforeitemcontextmenu',
  62082. 'beforeitemkeydown',
  62083. 'itemmousedown',
  62084. 'itemmouseup',
  62085. 'itemmouseenter',
  62086. 'itemmouseleave',
  62087. 'itemclick',
  62088. 'itemdblclick',
  62089. 'itemcontextmenu',
  62090. 'itemkeydown',
  62091. 'beforecontainermousedown',
  62092. 'beforecontainermouseup',
  62093. 'beforecontainermouseover',
  62094. 'beforecontainermouseout',
  62095. 'beforecontainerclick',
  62096. 'beforecontainerdblclick',
  62097. 'beforecontainercontextmenu',
  62098. 'beforecontainerkeydown',
  62099. 'containermouseup',
  62100. 'containermouseover',
  62101. 'containermouseout',
  62102. 'containerclick',
  62103. 'containerdblclick',
  62104. 'containercontextmenu',
  62105. 'containerkeydown',
  62106. 'selectionchange',
  62107. 'beforeselect',
  62108. 'beforedeselect',
  62109. 'select',
  62110. 'deselect',
  62111. 'focuschange',
  62112. 'highlightitem',
  62113. 'unhighlightitem'
  62114. );
  62115. },
  62116. getFocusEl: function() {
  62117. return this.getTargetEl();
  62118. },
  62119. afterRender: function(){
  62120. var me = this;
  62121. me.callParent();
  62122. me.mon(me.getTargetEl(), {
  62123. scope: me,
  62124. freezeEvent: true,
  62125. click: me.handleEvent,
  62126. mousedown: me.handleEvent,
  62127. mouseup: me.handleEvent,
  62128. dblclick: me.handleEvent,
  62129. contextmenu: me.handleEvent,
  62130. mouseover: me.handleEvent,
  62131. mouseout: me.handleEvent,
  62132. keydown: me.handleEvent
  62133. });
  62134. },
  62135. handleEvent: function(e) {
  62136. var me = this,
  62137. key = e.type == 'keydown' && e.getKey();
  62138. if (me.processUIEvent(e) !== false) {
  62139. me.processSpecialEvent(e);
  62140. }
  62141. if (key === e.SPACE) {
  62142. if (!me.inputTagRe.test(e.getTarget().tagName)) {
  62143. e.stopEvent();
  62144. }
  62145. }
  62146. },
  62147. processItemEvent: Ext.emptyFn,
  62148. processContainerEvent: Ext.emptyFn,
  62149. processSpecialEvent: Ext.emptyFn,
  62150. stillOverItem: function (event, overItem) {
  62151. var nowOver;
  62152. if (overItem && typeof(overItem.offsetParent) === "object") {
  62153. nowOver = (event.type == 'mouseout') ? event.getRelatedTarget() : event.getTarget();
  62154. return Ext.fly(overItem).contains(nowOver);
  62155. }
  62156. return false;
  62157. },
  62158. processUIEvent: function(e) {
  62159. var me = this,
  62160. item = e.getTarget(me.getItemSelector(), me.getTargetEl()),
  62161. map = this.statics().EventMap,
  62162. index, record,
  62163. type = e.type,
  62164. overItem = me.mouseOverItem,
  62165. newType;
  62166. if (!item) {
  62167. if (type == 'mouseover' && me.stillOverItem(e, overItem)) {
  62168. item = overItem;
  62169. }
  62170. if (type == 'keydown') {
  62171. record = me.getSelectionModel().getLastSelected();
  62172. if (record) {
  62173. item = me.getNode(record);
  62174. }
  62175. }
  62176. }
  62177. if (item) {
  62178. index = me.indexOf(item);
  62179. if (!record) {
  62180. record = me.getRecord(item);
  62181. }
  62182. if (!record || me.processItemEvent(record, item, index, e) === false) {
  62183. return false;
  62184. }
  62185. newType = me.isNewItemEvent(item, e);
  62186. if (newType === false) {
  62187. return false;
  62188. }
  62189. if (
  62190. (me['onBeforeItem' + map[newType]](record, item, index, e) === false) ||
  62191. (me.fireEvent('beforeitem' + newType, me, record, item, index, e) === false) ||
  62192. (me['onItem' + map[newType]](record, item, index, e) === false)
  62193. ) {
  62194. return false;
  62195. }
  62196. me.fireEvent('item' + newType, me, record, item, index, e);
  62197. }
  62198. else {
  62199. if (
  62200. (me.processContainerEvent(e) === false) ||
  62201. (me['onBeforeContainer' + map[type]](e) === false) ||
  62202. (me.fireEvent('beforecontainer' + type, me, e) === false) ||
  62203. (me['onContainer' + map[type]](e) === false)
  62204. ) {
  62205. return false;
  62206. }
  62207. me.fireEvent('container' + type, me, e);
  62208. }
  62209. return true;
  62210. },
  62211. isNewItemEvent: function (item, e) {
  62212. var me = this,
  62213. overItem = me.mouseOverItem,
  62214. type = e.type;
  62215. switch (type) {
  62216. case 'mouseover':
  62217. if (item === overItem) {
  62218. return false;
  62219. }
  62220. me.mouseOverItem = item;
  62221. return 'mouseenter';
  62222. case 'mouseout':
  62223. if (me.stillOverItem(e, overItem)) {
  62224. return false;
  62225. }
  62226. me.mouseOverItem = null;
  62227. return 'mouseleave';
  62228. }
  62229. return type;
  62230. },
  62231. onItemMouseEnter: function(record, item, index, e) {
  62232. if (this.trackOver) {
  62233. this.highlightItem(item);
  62234. }
  62235. },
  62236. onItemMouseLeave : function(record, item, index, e) {
  62237. if (this.trackOver) {
  62238. this.clearHighlight();
  62239. }
  62240. },
  62241. onItemMouseDown: Ext.emptyFn,
  62242. onItemMouseUp: Ext.emptyFn,
  62243. onItemFocus: Ext.emptyFn,
  62244. onItemClick: Ext.emptyFn,
  62245. onItemDblClick: Ext.emptyFn,
  62246. onItemContextMenu: Ext.emptyFn,
  62247. onItemKeyDown: Ext.emptyFn,
  62248. onBeforeItemMouseDown: Ext.emptyFn,
  62249. onBeforeItemMouseUp: Ext.emptyFn,
  62250. onBeforeItemFocus: Ext.emptyFn,
  62251. onBeforeItemMouseEnter: Ext.emptyFn,
  62252. onBeforeItemMouseLeave: Ext.emptyFn,
  62253. onBeforeItemClick: Ext.emptyFn,
  62254. onBeforeItemDblClick: Ext.emptyFn,
  62255. onBeforeItemContextMenu: Ext.emptyFn,
  62256. onBeforeItemKeyDown: Ext.emptyFn,
  62257. onContainerMouseDown: Ext.emptyFn,
  62258. onContainerMouseUp: Ext.emptyFn,
  62259. onContainerMouseOver: Ext.emptyFn,
  62260. onContainerMouseOut: Ext.emptyFn,
  62261. onContainerClick: Ext.emptyFn,
  62262. onContainerDblClick: Ext.emptyFn,
  62263. onContainerContextMenu: Ext.emptyFn,
  62264. onContainerKeyDown: Ext.emptyFn,
  62265. onBeforeContainerMouseDown: Ext.emptyFn,
  62266. onBeforeContainerMouseUp: Ext.emptyFn,
  62267. onBeforeContainerMouseOver: Ext.emptyFn,
  62268. onBeforeContainerMouseOut: Ext.emptyFn,
  62269. onBeforeContainerClick: Ext.emptyFn,
  62270. onBeforeContainerDblClick: Ext.emptyFn,
  62271. onBeforeContainerContextMenu: Ext.emptyFn,
  62272. onBeforeContainerKeyDown: Ext.emptyFn,
  62273. setHighlightedItem: function(item){
  62274. var me = this,
  62275. highlighted = me.highlightedItem;
  62276. if (highlighted != item){
  62277. if (highlighted) {
  62278. Ext.fly(highlighted).removeCls(me.overItemCls);
  62279. me.fireEvent('unhighlightitem', me, highlighted);
  62280. }
  62281. me.highlightedItem = item;
  62282. if (item) {
  62283. Ext.fly(item).addCls(me.overItemCls);
  62284. me.fireEvent('highlightitem', me, item);
  62285. }
  62286. }
  62287. },
  62288. highlightItem: function(item) {
  62289. this.setHighlightedItem(item);
  62290. },
  62291. clearHighlight: function() {
  62292. this.setHighlightedItem(undefined);
  62293. },
  62294. onUpdate: function(store, record){
  62295. var me = this,
  62296. node,
  62297. newNode,
  62298. highlighted;
  62299. if (me.viewReady) {
  62300. node = me.getNode(record);
  62301. newNode = me.callParent(arguments);
  62302. highlighted = me.highlightedItem;
  62303. if (highlighted && highlighted === node) {
  62304. delete me.highlightedItem;
  62305. if (newNode) {
  62306. me.highlightItem(newNode);
  62307. }
  62308. }
  62309. }
  62310. },
  62311. refresh: function() {
  62312. this.clearHighlight();
  62313. this.callParent(arguments);
  62314. }
  62315. });
  62316. Ext.define('Ext.toolbar.TextItem', {
  62317. extend: 'Ext.toolbar.Item',
  62318. requires: ['Ext.XTemplate'],
  62319. alias: 'widget.tbtext',
  62320. alternateClassName: 'Ext.Toolbar.TextItem',
  62321. text: '',
  62322. renderTpl: '{text}',
  62323. baseCls: Ext.baseCSSPrefix + 'toolbar-text',
  62324. beforeRender : function() {
  62325. var me = this;
  62326. me.callParent();
  62327. Ext.apply(me.renderData, {
  62328. text: me.text
  62329. });
  62330. },
  62331. setText : function(text) {
  62332. var me = this;
  62333. if (me.rendered) {
  62334. me.el.update(text);
  62335. me.updateLayout();
  62336. } else {
  62337. this.text = text;
  62338. }
  62339. }
  62340. });
  62341. Ext.define('Ext.form.field.Spinner', {
  62342. extend: 'Ext.form.field.Trigger',
  62343. alias: 'widget.spinnerfield',
  62344. alternateClassName: 'Ext.form.Spinner',
  62345. requires: ['Ext.util.KeyNav'],
  62346. trigger1Cls: Ext.baseCSSPrefix + 'form-spinner-up',
  62347. trigger2Cls: Ext.baseCSSPrefix + 'form-spinner-down',
  62348. spinUpEnabled: true,
  62349. spinDownEnabled: true,
  62350. keyNavEnabled: true,
  62351. mouseWheelEnabled: true,
  62352. repeatTriggerClick: true,
  62353. onSpinUp: Ext.emptyFn,
  62354. onSpinDown: Ext.emptyFn,
  62355. triggerTpl: '<td style="{triggerStyle}">' +
  62356. '<div class="' + Ext.baseCSSPrefix + 'trigger-index-0 ' + Ext.baseCSSPrefix + 'form-trigger ' + Ext.baseCSSPrefix + 'form-spinner-up" role="button"></div>' +
  62357. '<div class="' + Ext.baseCSSPrefix + 'trigger-index-1 ' + Ext.baseCSSPrefix + 'form-trigger ' + Ext.baseCSSPrefix + 'form-spinner-down" role="button"></div>' +
  62358. '</td>' +
  62359. '</tr>',
  62360. initComponent: function() {
  62361. this.callParent();
  62362. this.addEvents(
  62363. 'spin',
  62364. 'spinup',
  62365. 'spindown'
  62366. );
  62367. },
  62368. onRender: function() {
  62369. var me = this,
  62370. triggers;
  62371. me.callParent(arguments);
  62372. triggers = me.triggerEl;
  62373. me.spinUpEl = triggers.item(0);
  62374. me.spinDownEl = triggers.item(1);
  62375. me.triggerCell = me.spinUpEl.parent();
  62376. me.setSpinUpEnabled(me.spinUpEnabled);
  62377. me.setSpinDownEnabled(me.spinDownEnabled);
  62378. if (me.keyNavEnabled) {
  62379. me.spinnerKeyNav = new Ext.util.KeyNav(me.inputEl, {
  62380. scope: me,
  62381. up: me.spinUp,
  62382. down: me.spinDown
  62383. });
  62384. }
  62385. if (me.mouseWheelEnabled) {
  62386. me.mon(me.bodyEl, 'mousewheel', me.onMouseWheel, me);
  62387. }
  62388. },
  62389. getSubTplMarkup: function() {
  62390. var me = this,
  62391. field = Ext.form.field.Base.prototype.getSubTplMarkup.apply(me, arguments);
  62392. return '<table id="' + me.id + '-triggerWrap" class="' + Ext.baseCSSPrefix + 'form-trigger-wrap" cellpadding="0" cellspacing="0">' +
  62393. '<tbody>' +
  62394. '<tr><td id="' + me.id + '-inputCell" class="' + Ext.baseCSSPrefix + 'form-trigger-input-cell">' + field + '</td>' +
  62395. me.getTriggerMarkup() +
  62396. '</tbody></table>';
  62397. },
  62398. getTriggerMarkup: function() {
  62399. var me = this,
  62400. hideTrigger = (me.readOnly || me.hideTrigger);
  62401. return me.getTpl('triggerTpl').apply({
  62402. triggerStyle: 'width:' + me.triggerWidth + (hideTrigger ? 'px;display:none' : 'px')
  62403. });
  62404. },
  62405. getTriggerWidth: function() {
  62406. var me = this,
  62407. totalTriggerWidth = 0;
  62408. if (me.triggerWrap && !me.hideTrigger && !me.readOnly) {
  62409. totalTriggerWidth = me.triggerWidth;
  62410. }
  62411. return totalTriggerWidth;
  62412. },
  62413. onTrigger1Click: function() {
  62414. this.spinUp();
  62415. },
  62416. onTrigger2Click: function() {
  62417. this.spinDown();
  62418. },
  62419. onTriggerWrapMouseup: function() {
  62420. this.inputEl.focus();
  62421. },
  62422. spinUp: function() {
  62423. var me = this;
  62424. if (me.spinUpEnabled && !me.disabled) {
  62425. me.fireEvent('spin', me, 'up');
  62426. me.fireEvent('spinup', me);
  62427. me.onSpinUp();
  62428. }
  62429. },
  62430. spinDown: function() {
  62431. var me = this;
  62432. if (me.spinDownEnabled && !me.disabled) {
  62433. me.fireEvent('spin', me, 'down');
  62434. me.fireEvent('spindown', me);
  62435. me.onSpinDown();
  62436. }
  62437. },
  62438. setSpinUpEnabled: function(enabled) {
  62439. var me = this,
  62440. wasEnabled = me.spinUpEnabled;
  62441. me.spinUpEnabled = enabled;
  62442. if (wasEnabled !== enabled && me.rendered) {
  62443. me.spinUpEl[enabled ? 'removeCls' : 'addCls'](me.trigger1Cls + '-disabled');
  62444. }
  62445. },
  62446. setSpinDownEnabled: function(enabled) {
  62447. var me = this,
  62448. wasEnabled = me.spinDownEnabled;
  62449. me.spinDownEnabled = enabled;
  62450. if (wasEnabled !== enabled && me.rendered) {
  62451. me.spinDownEl[enabled ? 'removeCls' : 'addCls'](me.trigger2Cls + '-disabled');
  62452. }
  62453. },
  62454. onMouseWheel: function(e) {
  62455. var me = this,
  62456. delta;
  62457. if (me.hasFocus) {
  62458. delta = e.getWheelDelta();
  62459. if (delta > 0) {
  62460. me.spinUp();
  62461. }
  62462. else if (delta < 0) {
  62463. me.spinDown();
  62464. }
  62465. e.stopEvent();
  62466. }
  62467. },
  62468. onDestroy: function() {
  62469. Ext.destroyMembers(this, 'spinnerKeyNav', 'spinUpEl', 'spinDownEl');
  62470. this.callParent();
  62471. }
  62472. });
  62473. Ext.define('Ext.form.field.Number', {
  62474. extend:'Ext.form.field.Spinner',
  62475. alias: 'widget.numberfield',
  62476. alternateClassName: ['Ext.form.NumberField', 'Ext.form.Number'],
  62477. allowDecimals : true,
  62478. decimalSeparator : '.',
  62479. submitLocaleSeparator: true,
  62480. decimalPrecision : 2,
  62481. minValue: Number.NEGATIVE_INFINITY,
  62482. maxValue: Number.MAX_VALUE,
  62483. step: 1,
  62484. minText : 'The minimum value for this field is {0}',
  62485. maxText : 'The maximum value for this field is {0}',
  62486. nanText : '{0} is not a valid number',
  62487. negativeText : 'The value cannot be negative',
  62488. baseChars : '0123456789',
  62489. autoStripChars: false,
  62490. initComponent: function() {
  62491. var me = this,
  62492. allowed;
  62493. me.callParent();
  62494. me.setMinValue(me.minValue);
  62495. me.setMaxValue(me.maxValue);
  62496. if (me.disableKeyFilter !== true) {
  62497. allowed = me.baseChars + '';
  62498. if (me.allowDecimals) {
  62499. allowed += me.decimalSeparator;
  62500. }
  62501. if (me.minValue < 0) {
  62502. allowed += '-';
  62503. }
  62504. allowed = Ext.String.escapeRegex(allowed);
  62505. me.maskRe = new RegExp('[' + allowed + ']');
  62506. if (me.autoStripChars) {
  62507. me.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi');
  62508. }
  62509. }
  62510. },
  62511. getErrors: function(value) {
  62512. var me = this,
  62513. errors = me.callParent(arguments),
  62514. format = Ext.String.format,
  62515. num;
  62516. value = Ext.isDefined(value) ? value : this.processRawValue(this.getRawValue());
  62517. if (value.length < 1) {
  62518. return errors;
  62519. }
  62520. value = String(value).replace(me.decimalSeparator, '.');
  62521. if(isNaN(value)){
  62522. errors.push(format(me.nanText, value));
  62523. }
  62524. num = me.parseValue(value);
  62525. if (me.minValue === 0 && num < 0) {
  62526. errors.push(this.negativeText);
  62527. }
  62528. else if (num < me.minValue) {
  62529. errors.push(format(me.minText, me.minValue));
  62530. }
  62531. if (num > me.maxValue) {
  62532. errors.push(format(me.maxText, me.maxValue));
  62533. }
  62534. return errors;
  62535. },
  62536. rawToValue: function(rawValue) {
  62537. var value = this.fixPrecision(this.parseValue(rawValue));
  62538. if (value === null) {
  62539. value = rawValue || null;
  62540. }
  62541. return value;
  62542. },
  62543. valueToRaw: function(value) {
  62544. var me = this,
  62545. decimalSeparator = me.decimalSeparator;
  62546. value = me.parseValue(value);
  62547. value = me.fixPrecision(value);
  62548. value = Ext.isNumber(value) ? value : parseFloat(String(value).replace(decimalSeparator, '.'));
  62549. value = isNaN(value) ? '' : String(value).replace('.', decimalSeparator);
  62550. return value;
  62551. },
  62552. getSubmitValue: function() {
  62553. var me = this,
  62554. value = me.callParent();
  62555. if (!me.submitLocaleSeparator) {
  62556. value = value.replace(me.decimalSeparator, '.');
  62557. }
  62558. return value;
  62559. },
  62560. onChange: function() {
  62561. this.toggleSpinners();
  62562. this.callParent(arguments);
  62563. },
  62564. toggleSpinners: function(){
  62565. var me = this,
  62566. value = me.getValue(),
  62567. valueIsNull = value === null;
  62568. me.setSpinUpEnabled(valueIsNull || value < me.maxValue);
  62569. me.setSpinDownEnabled(valueIsNull || value > me.minValue);
  62570. },
  62571. setMinValue : function(value) {
  62572. this.minValue = Ext.Number.from(value, Number.NEGATIVE_INFINITY);
  62573. this.toggleSpinners();
  62574. },
  62575. setMaxValue: function(value) {
  62576. this.maxValue = Ext.Number.from(value, Number.MAX_VALUE);
  62577. this.toggleSpinners();
  62578. },
  62579. parseValue : function(value) {
  62580. value = parseFloat(String(value).replace(this.decimalSeparator, '.'));
  62581. return isNaN(value) ? null : value;
  62582. },
  62583. fixPrecision : function(value) {
  62584. var me = this,
  62585. nan = isNaN(value),
  62586. precision = me.decimalPrecision;
  62587. if (nan || !value) {
  62588. return nan ? '' : value;
  62589. } else if (!me.allowDecimals || precision <= 0) {
  62590. precision = 0;
  62591. }
  62592. return parseFloat(Ext.Number.toFixed(parseFloat(value), precision));
  62593. },
  62594. beforeBlur : function() {
  62595. var me = this,
  62596. v = me.parseValue(me.getRawValue());
  62597. if (!Ext.isEmpty(v)) {
  62598. me.setValue(v);
  62599. }
  62600. },
  62601. onSpinUp: function() {
  62602. var me = this;
  62603. if (!me.readOnly) {
  62604. me.setValue(Ext.Number.constrain(me.getValue() + me.step, me.minValue, me.maxValue));
  62605. }
  62606. },
  62607. onSpinDown: function() {
  62608. var me = this;
  62609. if (!me.readOnly) {
  62610. me.setValue(Ext.Number.constrain(me.getValue() - me.step, me.minValue, me.maxValue));
  62611. }
  62612. }
  62613. });
  62614. Ext.define('Ext.toolbar.Paging', {
  62615. extend: 'Ext.toolbar.Toolbar',
  62616. alias: 'widget.pagingtoolbar',
  62617. alternateClassName: 'Ext.PagingToolbar',
  62618. requires: ['Ext.toolbar.TextItem', 'Ext.form.field.Number'],
  62619. mixins: {
  62620. bindable: 'Ext.util.Bindable'
  62621. },
  62622. displayInfo: false,
  62623. prependButtons: false,
  62624. displayMsg : 'Displaying {0} - {1} of {2}',
  62625. emptyMsg : 'No data to display',
  62626. beforePageText : 'Page',
  62627. afterPageText : 'of {0}',
  62628. firstText : 'First Page',
  62629. prevText : 'Previous Page',
  62630. nextText : 'Next Page',
  62631. lastText : 'Last Page',
  62632. refreshText : 'Refresh',
  62633. inputItemWidth : 30,
  62634. getPagingItems: function() {
  62635. var me = this;
  62636. return [{
  62637. itemId: 'first',
  62638. tooltip: me.firstText,
  62639. overflowText: me.firstText,
  62640. iconCls: Ext.baseCSSPrefix + 'tbar-page-first',
  62641. disabled: true,
  62642. handler: me.moveFirst,
  62643. scope: me
  62644. },{
  62645. itemId: 'prev',
  62646. tooltip: me.prevText,
  62647. overflowText: me.prevText,
  62648. iconCls: Ext.baseCSSPrefix + 'tbar-page-prev',
  62649. disabled: true,
  62650. handler: me.movePrevious,
  62651. scope: me
  62652. },
  62653. '-',
  62654. me.beforePageText,
  62655. {
  62656. xtype: 'numberfield',
  62657. itemId: 'inputItem',
  62658. name: 'inputItem',
  62659. cls: Ext.baseCSSPrefix + 'tbar-page-number',
  62660. allowDecimals: false,
  62661. minValue: 1,
  62662. hideTrigger: true,
  62663. enableKeyEvents: true,
  62664. keyNavEnabled: false,
  62665. selectOnFocus: true,
  62666. submitValue: false,
  62667. isFormField: false,
  62668. width: me.inputItemWidth,
  62669. margins: '-1 2 3 2',
  62670. listeners: {
  62671. scope: me,
  62672. keydown: me.onPagingKeyDown,
  62673. blur: me.onPagingBlur
  62674. }
  62675. },{
  62676. xtype: 'tbtext',
  62677. itemId: 'afterTextItem',
  62678. text: Ext.String.format(me.afterPageText, 1)
  62679. },
  62680. '-',
  62681. {
  62682. itemId: 'next',
  62683. tooltip: me.nextText,
  62684. overflowText: me.nextText,
  62685. iconCls: Ext.baseCSSPrefix + 'tbar-page-next',
  62686. disabled: true,
  62687. handler: me.moveNext,
  62688. scope: me
  62689. },{
  62690. itemId: 'last',
  62691. tooltip: me.lastText,
  62692. overflowText: me.lastText,
  62693. iconCls: Ext.baseCSSPrefix + 'tbar-page-last',
  62694. disabled: true,
  62695. handler: me.moveLast,
  62696. scope: me
  62697. },
  62698. '-',
  62699. {
  62700. itemId: 'refresh',
  62701. tooltip: me.refreshText,
  62702. overflowText: me.refreshText,
  62703. iconCls: Ext.baseCSSPrefix + 'tbar-loading',
  62704. handler: me.doRefresh,
  62705. scope: me
  62706. }];
  62707. },
  62708. initComponent : function(){
  62709. var me = this,
  62710. pagingItems = me.getPagingItems(),
  62711. userItems = me.items || me.buttons || [];
  62712. if (me.prependButtons) {
  62713. me.items = userItems.concat(pagingItems);
  62714. } else {
  62715. me.items = pagingItems.concat(userItems);
  62716. }
  62717. delete me.buttons;
  62718. if (me.displayInfo) {
  62719. me.items.push('->');
  62720. me.items.push({xtype: 'tbtext', itemId: 'displayItem'});
  62721. }
  62722. me.callParent();
  62723. me.addEvents(
  62724. 'change',
  62725. 'beforechange'
  62726. );
  62727. me.on('beforerender', me.onLoad, me, {single: true});
  62728. me.bindStore(me.store || 'ext-empty-store', true);
  62729. },
  62730. updateInfo : function(){
  62731. var me = this,
  62732. displayItem = me.child('#displayItem'),
  62733. store = me.store,
  62734. pageData = me.getPageData(),
  62735. count, msg;
  62736. if (displayItem) {
  62737. count = store.getCount();
  62738. if (count === 0) {
  62739. msg = me.emptyMsg;
  62740. } else {
  62741. msg = Ext.String.format(
  62742. me.displayMsg,
  62743. pageData.fromRecord,
  62744. pageData.toRecord,
  62745. pageData.total
  62746. );
  62747. }
  62748. displayItem.setText(msg);
  62749. }
  62750. },
  62751. onLoad : function(){
  62752. var me = this,
  62753. pageData,
  62754. currPage,
  62755. pageCount,
  62756. afterText,
  62757. count,
  62758. isEmpty;
  62759. count = me.store.getCount();
  62760. isEmpty = count === 0;
  62761. if (!isEmpty) {
  62762. pageData = me.getPageData();
  62763. currPage = pageData.currentPage;
  62764. pageCount = pageData.pageCount;
  62765. afterText = Ext.String.format(me.afterPageText, isNaN(pageCount) ? 1 : pageCount);
  62766. } else {
  62767. currPage = 0;
  62768. pageCount = 0;
  62769. afterText = Ext.String.format(me.afterPageText, 0);
  62770. }
  62771. Ext.suspendLayouts();
  62772. me.child('#afterTextItem').setText(afterText);
  62773. me.child('#inputItem').setDisabled(isEmpty).setValue(currPage);
  62774. me.child('#first').setDisabled(currPage === 1 || isEmpty);
  62775. me.child('#prev').setDisabled(currPage === 1 || isEmpty);
  62776. me.child('#next').setDisabled(currPage === pageCount || isEmpty);
  62777. me.child('#last').setDisabled(currPage === pageCount || isEmpty);
  62778. me.child('#refresh').enable();
  62779. me.updateInfo();
  62780. Ext.resumeLayouts(true);
  62781. if (me.rendered) {
  62782. me.fireEvent('change', me, pageData);
  62783. }
  62784. },
  62785. getPageData : function(){
  62786. var store = this.store,
  62787. totalCount = store.getTotalCount();
  62788. return {
  62789. total : totalCount,
  62790. currentPage : store.currentPage,
  62791. pageCount: Math.ceil(totalCount / store.pageSize),
  62792. fromRecord: ((store.currentPage - 1) * store.pageSize) + 1,
  62793. toRecord: Math.min(store.currentPage * store.pageSize, totalCount)
  62794. };
  62795. },
  62796. onLoadError : function(){
  62797. if (!this.rendered) {
  62798. return;
  62799. }
  62800. this.child('#refresh').enable();
  62801. },
  62802. readPageFromInput : function(pageData){
  62803. var v = this.child('#inputItem').getValue(),
  62804. pageNum = parseInt(v, 10);
  62805. if (!v || isNaN(pageNum)) {
  62806. this.child('#inputItem').setValue(pageData.currentPage);
  62807. return false;
  62808. }
  62809. return pageNum;
  62810. },
  62811. onPagingFocus : function(){
  62812. this.child('#inputItem').select();
  62813. },
  62814. onPagingBlur : function(e){
  62815. var curPage = this.getPageData().currentPage;
  62816. this.child('#inputItem').setValue(curPage);
  62817. },
  62818. onPagingKeyDown : function(field, e){
  62819. var me = this,
  62820. k = e.getKey(),
  62821. pageData = me.getPageData(),
  62822. increment = e.shiftKey ? 10 : 1,
  62823. pageNum;
  62824. if (k == e.RETURN) {
  62825. e.stopEvent();
  62826. pageNum = me.readPageFromInput(pageData);
  62827. if (pageNum !== false) {
  62828. pageNum = Math.min(Math.max(1, pageNum), pageData.pageCount);
  62829. if(me.fireEvent('beforechange', me, pageNum) !== false){
  62830. me.store.loadPage(pageNum);
  62831. }
  62832. }
  62833. } else if (k == e.HOME || k == e.END) {
  62834. e.stopEvent();
  62835. pageNum = k == e.HOME ? 1 : pageData.pageCount;
  62836. field.setValue(pageNum);
  62837. } else if (k == e.UP || k == e.PAGE_UP || k == e.DOWN || k == e.PAGE_DOWN) {
  62838. e.stopEvent();
  62839. pageNum = me.readPageFromInput(pageData);
  62840. if (pageNum) {
  62841. if (k == e.DOWN || k == e.PAGE_DOWN) {
  62842. increment *= -1;
  62843. }
  62844. pageNum += increment;
  62845. if (pageNum >= 1 && pageNum <= pageData.pageCount) {
  62846. field.setValue(pageNum);
  62847. }
  62848. }
  62849. }
  62850. },
  62851. beforeLoad : function(){
  62852. if(this.rendered && this.refresh){
  62853. this.refresh.disable();
  62854. }
  62855. },
  62856. moveFirst : function(){
  62857. if (this.fireEvent('beforechange', this, 1) !== false){
  62858. this.store.loadPage(1);
  62859. }
  62860. },
  62861. movePrevious : function(){
  62862. var me = this,
  62863. prev = me.store.currentPage - 1;
  62864. if (prev > 0) {
  62865. if (me.fireEvent('beforechange', me, prev) !== false) {
  62866. me.store.previousPage();
  62867. }
  62868. }
  62869. },
  62870. moveNext : function(){
  62871. var me = this,
  62872. total = me.getPageData().pageCount,
  62873. next = me.store.currentPage + 1;
  62874. if (next <= total) {
  62875. if (me.fireEvent('beforechange', me, next) !== false) {
  62876. me.store.nextPage();
  62877. }
  62878. }
  62879. },
  62880. moveLast : function(){
  62881. var me = this,
  62882. last = me.getPageData().pageCount;
  62883. if (me.fireEvent('beforechange', me, last) !== false) {
  62884. me.store.loadPage(last);
  62885. }
  62886. },
  62887. doRefresh : function(){
  62888. var me = this,
  62889. current = me.store.currentPage;
  62890. if (me.fireEvent('beforechange', me, current) !== false) {
  62891. me.store.loadPage(current);
  62892. }
  62893. },
  62894. getStoreListeners: function() {
  62895. return {
  62896. beforeload: this.beforeLoad,
  62897. load: this.onLoad,
  62898. exception: this.onLoadError
  62899. };
  62900. },
  62901. unbind : function(store){
  62902. this.bindStore(null);
  62903. },
  62904. bind : function(store){
  62905. this.bindStore(store);
  62906. },
  62907. onDestroy : function(){
  62908. this.unbind();
  62909. this.callParent();
  62910. }
  62911. });
  62912. Ext.define('Ext.view.BoundList', {
  62913. extend: 'Ext.view.View',
  62914. alias: 'widget.boundlist',
  62915. alternateClassName: 'Ext.BoundList',
  62916. requires: ['Ext.layout.component.BoundList', 'Ext.toolbar.Paging'],
  62917. pageSize: 0,
  62918. baseCls: Ext.baseCSSPrefix + 'boundlist',
  62919. itemCls: Ext.baseCSSPrefix + 'boundlist-item',
  62920. listItemCls: '',
  62921. shadow: false,
  62922. trackOver: true,
  62923. refreshed: 0,
  62924. deferInitialRefresh: false,
  62925. componentLayout: 'boundlist',
  62926. childEls: [
  62927. 'listEl'
  62928. ],
  62929. renderTpl: [
  62930. '<div id="{id}-listEl" class="{baseCls}-list-ct" style="overflow:auto"></div>',
  62931. '{%',
  62932. 'var me=values.$comp, pagingToolbar=me.pagingToolbar;',
  62933. 'if (pagingToolbar) {',
  62934. 'pagingToolbar.ownerLayout = me.componentLayout;',
  62935. 'Ext.DomHelper.generateMarkup(pagingToolbar.getRenderTree(), out);',
  62936. '}',
  62937. '%}',
  62938. {
  62939. disableFormats: true
  62940. }
  62941. ],
  62942. initComponent: function() {
  62943. var me = this,
  62944. baseCls = me.baseCls,
  62945. itemCls = me.itemCls;
  62946. me.selectedItemCls = baseCls + '-selected';
  62947. me.overItemCls = baseCls + '-item-over';
  62948. me.itemSelector = "." + itemCls;
  62949. if (me.floating) {
  62950. me.addCls(baseCls + '-floating');
  62951. }
  62952. if (!me.tpl) {
  62953. me.tpl = new Ext.XTemplate(
  62954. '<ul><tpl for=".">',
  62955. '<li role="option" class="' + itemCls + '">' + me.getInnerTpl(me.displayField) + '</li>',
  62956. '</tpl></ul>'
  62957. );
  62958. } else if (Ext.isString(me.tpl)) {
  62959. me.tpl = new Ext.XTemplate(me.tpl);
  62960. }
  62961. if (me.pageSize) {
  62962. me.pagingToolbar = me.createPagingToolbar();
  62963. }
  62964. me.callParent();
  62965. },
  62966. beforeRender: function() {
  62967. var me = this;
  62968. me.callParent(arguments);
  62969. if (me.up('menu')) {
  62970. me.addCls(Ext.baseCSSPrefix + 'menu');
  62971. }
  62972. },
  62973. getBubbleTarget: function() {
  62974. return this.pickerField;
  62975. },
  62976. getRefItems: function() {
  62977. return this.pagingToolbar ? [ this.pagingToolbar ] : [];
  62978. },
  62979. createPagingToolbar: function() {
  62980. return Ext.widget('pagingtoolbar', {
  62981. id: this.id + '-paging-toolbar',
  62982. pageSize: this.pageSize,
  62983. store: this.store,
  62984. border: false,
  62985. ownerCt: this,
  62986. ownerLayout: this.getComponentLayout()
  62987. });
  62988. },
  62989. finishRenderChildren: function () {
  62990. var toolbar = this.pagingToolbar;
  62991. this.callParent(arguments);
  62992. if (toolbar) {
  62993. toolbar.finishRender();
  62994. }
  62995. },
  62996. refresh: function(){
  62997. var me = this,
  62998. toolbar = me.pagingToolbar;
  62999. me.callParent();
  63000. if (me.rendered && toolbar && toolbar.rendered && !me.preserveScrollOnRefresh) {
  63001. me.el.appendChild(toolbar.el);
  63002. }
  63003. },
  63004. bindStore : function(store, initial) {
  63005. var toolbar = this.pagingToolbar;
  63006. this.callParent(arguments);
  63007. if (toolbar) {
  63008. toolbar.bindStore(this.store, initial);
  63009. }
  63010. },
  63011. getTargetEl: function() {
  63012. return this.listEl || this.el;
  63013. },
  63014. getInnerTpl: function(displayField) {
  63015. return '{' + displayField + '}';
  63016. },
  63017. onDestroy: function() {
  63018. Ext.destroyMembers(this, 'pagingToolbar', 'listEl');
  63019. this.callParent();
  63020. }
  63021. });
  63022. Ext.define('Ext.view.BoundListKeyNav', {
  63023. extend: 'Ext.util.KeyNav',
  63024. requires: 'Ext.view.BoundList',
  63025. constructor: function(el, config) {
  63026. var me = this;
  63027. me.boundList = config.boundList;
  63028. me.callParent([el, Ext.apply({}, config, me.defaultHandlers)]);
  63029. },
  63030. defaultHandlers: {
  63031. up: function() {
  63032. var me = this,
  63033. boundList = me.boundList,
  63034. allItems = boundList.all,
  63035. oldItem = boundList.highlightedItem,
  63036. oldItemIdx = oldItem ? boundList.indexOf(oldItem) : -1,
  63037. newItemIdx = oldItemIdx > 0 ? oldItemIdx - 1 : allItems.getCount() - 1;
  63038. me.highlightAt(newItemIdx);
  63039. },
  63040. down: function() {
  63041. var me = this,
  63042. boundList = me.boundList,
  63043. allItems = boundList.all,
  63044. oldItem = boundList.highlightedItem,
  63045. oldItemIdx = oldItem ? boundList.indexOf(oldItem) : -1,
  63046. newItemIdx = oldItemIdx < allItems.getCount() - 1 ? oldItemIdx + 1 : 0;
  63047. me.highlightAt(newItemIdx);
  63048. },
  63049. pageup: function() {
  63050. },
  63051. pagedown: function() {
  63052. },
  63053. home: function() {
  63054. this.highlightAt(0);
  63055. },
  63056. end: function() {
  63057. var me = this;
  63058. me.highlightAt(me.boundList.all.getCount() - 1);
  63059. },
  63060. enter: function(e) {
  63061. this.selectHighlighted(e);
  63062. }
  63063. },
  63064. highlightAt: function(index) {
  63065. var boundList = this.boundList,
  63066. item = boundList.all.item(index);
  63067. if (item) {
  63068. item = item.dom;
  63069. boundList.highlightItem(item);
  63070. boundList.getTargetEl().scrollChildIntoView(item, false);
  63071. }
  63072. },
  63073. selectHighlighted: function(e) {
  63074. var me = this,
  63075. boundList = me.boundList,
  63076. highlighted = boundList.highlightedItem,
  63077. selModel = boundList.getSelectionModel();
  63078. if (highlighted) {
  63079. selModel.selectWithEvent(boundList.getRecord(highlighted), e);
  63080. }
  63081. }
  63082. });
  63083. Ext.define('Ext.form.field.ComboBox', {
  63084. extend:'Ext.form.field.Picker',
  63085. requires: ['Ext.util.DelayedTask', 'Ext.EventObject', 'Ext.view.BoundList', 'Ext.view.BoundListKeyNav', 'Ext.data.StoreManager', 'Ext.layout.component.field.ComboBox'],
  63086. alternateClassName: 'Ext.form.ComboBox',
  63087. alias: ['widget.combobox', 'widget.combo'],
  63088. mixins: {
  63089. bindable: 'Ext.util.Bindable'
  63090. },
  63091. componentLayout: 'combobox',
  63092. triggerCls: Ext.baseCSSPrefix + 'form-arrow-trigger',
  63093. hiddenName: '',
  63094. hiddenDataCls: Ext.baseCSSPrefix + 'hide-display ' + Ext.baseCSSPrefix + 'form-data-hidden',
  63095. fieldSubTpl: [
  63096. '<div class="{hiddenDataCls}" role="presentation"></div>',
  63097. '<input id="{id}" type="{type}" {inputAttrTpl} class="{fieldCls} {typeCls}" autocomplete="off"',
  63098. '<tpl if="value"> value="{[Ext.util.Format.htmlEncode(values.value)]}"</tpl>',
  63099. '<tpl if="name"> name="{name}"</tpl>',
  63100. '<tpl if="placeholder"> placeholder="{placeholder}"</tpl>',
  63101. '<tpl if="size"> size="{size}"</tpl>',
  63102. '<tpl if="maxLength !== undefined"> maxlength="{maxLength}"</tpl>',
  63103. '<tpl if="readOnly"> readonly="readonly"</tpl>',
  63104. '<tpl if="disabled"> disabled="disabled"</tpl>',
  63105. '<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>',
  63106. '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',
  63107. '/>',
  63108. {
  63109. compiled: true,
  63110. disableFormats: true
  63111. }
  63112. ],
  63113. getSubTplData: function(){
  63114. var me = this;
  63115. Ext.applyIf(me.subTplData, {
  63116. hiddenDataCls: me.hiddenDataCls
  63117. });
  63118. return me.callParent(arguments);
  63119. },
  63120. afterRender: function(){
  63121. var me = this;
  63122. me.callParent(arguments);
  63123. me.setHiddenValue(me.value);
  63124. },
  63125. multiSelect: false,
  63126. delimiter: ', ',
  63127. displayField: 'text',
  63128. triggerAction: 'all',
  63129. allQuery: '',
  63130. queryParam: 'query',
  63131. queryMode: 'remote',
  63132. queryCaching: true,
  63133. pageSize: 0,
  63134. autoSelect: true,
  63135. typeAhead: false,
  63136. typeAheadDelay: 250,
  63137. selectOnTab: true,
  63138. forceSelection: false,
  63139. growToLongestValue: true,
  63140. defaultListConfig: {
  63141. loadingHeight: 70,
  63142. minWidth: 70,
  63143. maxHeight: 300,
  63144. shadow: 'sides'
  63145. },
  63146. ignoreSelection: 0,
  63147. removingRecords: null,
  63148. resizeComboToGrow: function () {
  63149. var me = this;
  63150. return me.grow && me.growToLongestValue;
  63151. },
  63152. initComponent: function() {
  63153. var me = this,
  63154. isDefined = Ext.isDefined,
  63155. store = me.store,
  63156. transform = me.transform,
  63157. transformSelect, isLocalMode;
  63158. Ext.applyIf(me.renderSelectors, {
  63159. hiddenDataEl: '.' + me.hiddenDataCls.split(' ').join('.')
  63160. });
  63161. this.addEvents(
  63162. 'beforequery',
  63163. 'select',
  63164. 'beforeselect',
  63165. 'beforedeselect'
  63166. );
  63167. if (transform) {
  63168. transformSelect = Ext.getDom(transform);
  63169. if (transformSelect) {
  63170. if (!me.store) {
  63171. store = Ext.Array.map(Ext.Array.from(transformSelect.options), function(option){
  63172. return [option.value, option.text];
  63173. });
  63174. }
  63175. if (!me.name) {
  63176. me.name = transformSelect.name;
  63177. }
  63178. if (!('value' in me)) {
  63179. me.value = transformSelect.value;
  63180. }
  63181. }
  63182. }
  63183. me.bindStore(store || 'ext-empty-store', true);
  63184. store = me.store;
  63185. if (store.autoCreated) {
  63186. me.queryMode = 'local';
  63187. me.valueField = me.displayField = 'field1';
  63188. if (!store.expanded) {
  63189. me.displayField = 'field2';
  63190. }
  63191. }
  63192. if (!isDefined(me.valueField)) {
  63193. me.valueField = me.displayField;
  63194. }
  63195. isLocalMode = me.queryMode === 'local';
  63196. if (!isDefined(me.queryDelay)) {
  63197. me.queryDelay = isLocalMode ? 10 : 500;
  63198. }
  63199. if (!isDefined(me.minChars)) {
  63200. me.minChars = isLocalMode ? 0 : 4;
  63201. }
  63202. if (!me.displayTpl) {
  63203. me.displayTpl = new Ext.XTemplate(
  63204. '<tpl for=".">' +
  63205. '{[typeof values === "string" ? values : values["' + me.displayField + '"]]}' +
  63206. '<tpl if="xindex < xcount">' + me.delimiter + '</tpl>' +
  63207. '</tpl>'
  63208. );
  63209. } else if (Ext.isString(me.displayTpl)) {
  63210. me.displayTpl = new Ext.XTemplate(me.displayTpl);
  63211. }
  63212. me.callParent();
  63213. me.doQueryTask = new Ext.util.DelayedTask(me.doRawQuery, me);
  63214. if (me.store.getCount() > 0) {
  63215. me.setValue(me.value);
  63216. }
  63217. if (transformSelect) {
  63218. me.render(transformSelect.parentNode, transformSelect);
  63219. Ext.removeNode(transformSelect);
  63220. delete me.renderTo;
  63221. }
  63222. },
  63223. getStore : function(){
  63224. return this.store;
  63225. },
  63226. beforeBlur: function() {
  63227. this.doQueryTask.cancel();
  63228. this.assertValue();
  63229. },
  63230. assertValue: function() {
  63231. var me = this,
  63232. value = me.getRawValue(),
  63233. rec;
  63234. if (me.forceSelection) {
  63235. if (me.multiSelect) {
  63236. if (value !== me.getDisplayValue()) {
  63237. me.setValue(me.lastSelection);
  63238. }
  63239. } else {
  63240. rec = me.findRecordByDisplay(value);
  63241. if (rec) {
  63242. me.select(rec);
  63243. } else {
  63244. me.setValue(me.lastSelection);
  63245. }
  63246. }
  63247. }
  63248. me.collapse();
  63249. },
  63250. onTypeAhead: function() {
  63251. var me = this,
  63252. displayField = me.displayField,
  63253. record = me.store.findRecord(displayField, me.getRawValue()),
  63254. boundList = me.getPicker(),
  63255. newValue, len, selStart;
  63256. if (record) {
  63257. newValue = record.get(displayField);
  63258. len = newValue.length;
  63259. selStart = me.getRawValue().length;
  63260. boundList.highlightItem(boundList.getNode(record));
  63261. if (selStart !== 0 && selStart !== len) {
  63262. me.setRawValue(newValue);
  63263. me.selectText(selStart, newValue.length);
  63264. }
  63265. }
  63266. },
  63267. resetToDefault: Ext.emptyFn,
  63268. beforeReset: function() {
  63269. this.callParent();
  63270. this.clearFilter();
  63271. },
  63272. onUnbindStore: function(store) {
  63273. var picker = this.picker;
  63274. if (!store && picker) {
  63275. picker.bindStore(null);
  63276. }
  63277. this.clearFilter();
  63278. },
  63279. onBindStore: function(store, initial) {
  63280. var picker = this.picker;
  63281. if (!initial) {
  63282. this.resetToDefault();
  63283. }
  63284. if (picker) {
  63285. picker.bindStore(store);
  63286. }
  63287. },
  63288. getStoreListeners: function() {
  63289. var me = this;
  63290. return {
  63291. beforeload: me.onBeforeLoad,
  63292. clear: me.onClear,
  63293. datachanged: me.onDataChanged,
  63294. load: me.onLoad,
  63295. exception: me.onException,
  63296. remove: me.onRemove
  63297. };
  63298. },
  63299. onBeforeLoad: function(){
  63300. ++this.ignoreSelection;
  63301. },
  63302. onDataChanged: function() {
  63303. var me = this;
  63304. if (me.resizeComboToGrow()) {
  63305. me.updateLayout();
  63306. }
  63307. },
  63308. onClear: function() {
  63309. var me = this;
  63310. if (me.resizeComboToGrow()) {
  63311. me.removingRecords = true;
  63312. me.onDataChanged();
  63313. }
  63314. },
  63315. onRemove: function() {
  63316. var me = this;
  63317. if (me.resizeComboToGrow()) {
  63318. me.removingRecords = true;
  63319. }
  63320. },
  63321. onException: function(){
  63322. if (this.ignoreSelection > 0) {
  63323. --this.ignoreSelection;
  63324. }
  63325. this.collapse();
  63326. },
  63327. onLoad: function() {
  63328. var me = this,
  63329. value = me.value;
  63330. if (me.ignoreSelection > 0) {
  63331. --me.ignoreSelection;
  63332. }
  63333. if (me.rawQuery) {
  63334. me.rawQuery = false;
  63335. me.syncSelection();
  63336. if (me.picker && !me.picker.getSelectionModel().hasSelection()) {
  63337. me.doAutoSelect();
  63338. }
  63339. }
  63340. else {
  63341. if (me.value || me.value === 0) {
  63342. me.setValue(me.value);
  63343. } else {
  63344. if (me.store.getCount()) {
  63345. me.doAutoSelect();
  63346. } else {
  63347. me.setValue(me.value);
  63348. }
  63349. }
  63350. }
  63351. },
  63352. doRawQuery: function() {
  63353. this.doQuery(this.getRawValue(), false, true);
  63354. },
  63355. doQuery: function(queryString, forceAll, rawQuery) {
  63356. queryString = queryString || '';
  63357. var me = this,
  63358. qe = {
  63359. query: queryString,
  63360. forceAll: forceAll,
  63361. combo: me,
  63362. cancel: false
  63363. },
  63364. store = me.store,
  63365. isLocalMode = me.queryMode === 'local',
  63366. needsRefresh;
  63367. if (me.fireEvent('beforequery', qe) === false || qe.cancel) {
  63368. return false;
  63369. }
  63370. queryString = qe.query;
  63371. forceAll = qe.forceAll;
  63372. if (forceAll || (queryString.length >= me.minChars)) {
  63373. me.expand();
  63374. if (!me.queryCaching || me.lastQuery !== queryString) {
  63375. me.lastQuery = queryString;
  63376. if (isLocalMode) {
  63377. store.suspendEvents();
  63378. needsRefresh = me.clearFilter();
  63379. if (queryString || !forceAll) {
  63380. me.activeFilter = new Ext.util.Filter({
  63381. root: 'data',
  63382. property: me.displayField,
  63383. value: queryString
  63384. });
  63385. store.filter(me.activeFilter);
  63386. needsRefresh = true;
  63387. } else {
  63388. delete me.activeFilter;
  63389. }
  63390. store.resumeEvents();
  63391. if (me.rendered && needsRefresh) {
  63392. me.getPicker().refresh();
  63393. }
  63394. } else {
  63395. me.rawQuery = rawQuery;
  63396. if (me.pageSize) {
  63397. me.loadPage(1);
  63398. } else {
  63399. store.load({
  63400. params: me.getParams(queryString)
  63401. });
  63402. }
  63403. }
  63404. }
  63405. if (me.getRawValue() !== me.getDisplayValue()) {
  63406. me.ignoreSelection++;
  63407. me.picker.getSelectionModel().deselectAll();
  63408. me.ignoreSelection--;
  63409. }
  63410. if (isLocalMode) {
  63411. me.doAutoSelect();
  63412. }
  63413. if (me.typeAhead) {
  63414. me.doTypeAhead();
  63415. }
  63416. }
  63417. return true;
  63418. },
  63419. clearFilter: function() {
  63420. var store = this.store,
  63421. filter = this.activeFilter,
  63422. filters = store.filters,
  63423. remaining;
  63424. if (filter) {
  63425. if (filters.getCount() > 1) {
  63426. filters.remove(filter);
  63427. remaining = filters.getRange();
  63428. }
  63429. store.clearFilter(true);
  63430. if (remaining) {
  63431. store.filter(remaining);
  63432. }
  63433. }
  63434. return !!filter;
  63435. },
  63436. loadPage: function(pageNum){
  63437. this.store.loadPage(pageNum, {
  63438. params: this.getParams(this.lastQuery)
  63439. });
  63440. },
  63441. onPageChange: function(toolbar, newPage){
  63442. this.loadPage(newPage);
  63443. return false;
  63444. },
  63445. getParams: function(queryString) {
  63446. var params = {},
  63447. param = this.queryParam;
  63448. if (param) {
  63449. params[param] = queryString;
  63450. }
  63451. return params;
  63452. },
  63453. doAutoSelect: function() {
  63454. var me = this,
  63455. picker = me.picker,
  63456. lastSelected, itemNode;
  63457. if (picker && me.autoSelect && me.store.getCount() > 0) {
  63458. lastSelected = picker.getSelectionModel().lastSelected;
  63459. itemNode = picker.getNode(lastSelected || 0);
  63460. if (itemNode) {
  63461. picker.highlightItem(itemNode);
  63462. picker.listEl.scrollChildIntoView(itemNode, false);
  63463. }
  63464. }
  63465. },
  63466. doTypeAhead: function() {
  63467. if (!this.typeAheadTask) {
  63468. this.typeAheadTask = new Ext.util.DelayedTask(this.onTypeAhead, this);
  63469. }
  63470. if (this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE) {
  63471. this.typeAheadTask.delay(this.typeAheadDelay);
  63472. }
  63473. },
  63474. onTriggerClick: function() {
  63475. var me = this;
  63476. if (!me.readOnly && !me.disabled) {
  63477. if (me.isExpanded) {
  63478. me.collapse();
  63479. } else {
  63480. me.onFocus({});
  63481. if (me.triggerAction === 'all') {
  63482. me.doQuery(me.allQuery, true);
  63483. } else {
  63484. me.doQuery(me.getRawValue(), false, true);
  63485. }
  63486. }
  63487. me.inputEl.focus();
  63488. }
  63489. },
  63490. onKeyUp: function(e, t) {
  63491. var me = this,
  63492. key = e.getKey();
  63493. if (!me.readOnly && !me.disabled && me.editable) {
  63494. me.lastKey = key;
  63495. if (!e.isSpecialKey() || key == e.BACKSPACE || key == e.DELETE) {
  63496. me.doQueryTask.delay(me.queryDelay);
  63497. }
  63498. }
  63499. if (me.enableKeyEvents) {
  63500. me.callParent(arguments);
  63501. }
  63502. },
  63503. initEvents: function() {
  63504. var me = this;
  63505. me.callParent();
  63506. if (!me.enableKeyEvents) {
  63507. me.mon(me.inputEl, 'keyup', me.onKeyUp, me);
  63508. }
  63509. },
  63510. onDestroy: function() {
  63511. this.bindStore(null);
  63512. this.callParent();
  63513. },
  63514. onAdded: function() {
  63515. var me = this;
  63516. me.callParent(arguments);
  63517. if (me.picker) {
  63518. me.picker.ownerCt = me.up('[floating]');
  63519. me.picker.registerWithOwnerCt();
  63520. }
  63521. },
  63522. createPicker: function() {
  63523. var me = this,
  63524. picker,
  63525. pickerCfg = Ext.apply({
  63526. xtype: 'boundlist',
  63527. pickerField: me,
  63528. selModel: {
  63529. mode: me.multiSelect ? 'SIMPLE' : 'SINGLE'
  63530. },
  63531. floating: true,
  63532. hidden: true,
  63533. store: me.store,
  63534. displayField: me.displayField,
  63535. focusOnToFront: false,
  63536. pageSize: me.pageSize,
  63537. tpl: me.tpl
  63538. }, me.listConfig, me.defaultListConfig);
  63539. picker = me.picker = Ext.widget(pickerCfg);
  63540. if (me.pageSize) {
  63541. picker.pagingToolbar.on('beforechange', me.onPageChange, me);
  63542. }
  63543. me.mon(picker, {
  63544. itemclick: me.onItemClick,
  63545. refresh: me.onListRefresh,
  63546. scope: me
  63547. });
  63548. me.mon(picker.getSelectionModel(), {
  63549. beforeselect: me.onBeforeSelect,
  63550. beforedeselect: me.onBeforeDeselect,
  63551. selectionchange: me.onListSelectionChange,
  63552. scope: me
  63553. });
  63554. return picker;
  63555. },
  63556. alignPicker: function(){
  63557. var me = this,
  63558. picker = me.getPicker(),
  63559. heightAbove = me.getPosition()[1] - Ext.getBody().getScroll().top,
  63560. heightBelow = Ext.Element.getViewHeight() - heightAbove - me.getHeight(),
  63561. space = Math.max(heightAbove, heightBelow);
  63562. if (picker.height) {
  63563. delete picker.height;
  63564. picker.updateLayout();
  63565. }
  63566. if (picker.getHeight() > space - 5) {
  63567. picker.setHeight(space - 5);
  63568. }
  63569. me.callParent();
  63570. },
  63571. onListRefresh: function() {
  63572. this.alignPicker();
  63573. this.syncSelection();
  63574. },
  63575. onItemClick: function(picker, record){
  63576. var me = this,
  63577. selection = me.picker.getSelectionModel().getSelection(),
  63578. valueField = me.valueField;
  63579. if (!me.multiSelect && selection.length) {
  63580. if (record.get(valueField) === selection[0].get(valueField)) {
  63581. me.displayTplData = [record.data];
  63582. me.setRawValue(me.getDisplayValue());
  63583. me.collapse();
  63584. }
  63585. }
  63586. },
  63587. onBeforeSelect: function(list, record) {
  63588. return this.fireEvent('beforeselect', this, record, record.index);
  63589. },
  63590. onBeforeDeselect: function(list, record) {
  63591. return this.fireEvent('beforedeselect', this, record, record.index);
  63592. },
  63593. onListSelectionChange: function(list, selectedRecords) {
  63594. var me = this,
  63595. isMulti = me.multiSelect,
  63596. hasRecords = selectedRecords.length > 0;
  63597. if (!me.ignoreSelection && me.isExpanded) {
  63598. if (!isMulti) {
  63599. Ext.defer(me.collapse, 1, me);
  63600. }
  63601. if (isMulti || hasRecords) {
  63602. me.setValue(selectedRecords, false);
  63603. }
  63604. if (hasRecords) {
  63605. me.fireEvent('select', me, selectedRecords);
  63606. }
  63607. me.inputEl.focus();
  63608. }
  63609. },
  63610. onExpand: function() {
  63611. var me = this,
  63612. keyNav = me.listKeyNav,
  63613. selectOnTab = me.selectOnTab,
  63614. picker = me.getPicker();
  63615. if (keyNav) {
  63616. keyNav.enable();
  63617. } else {
  63618. keyNav = me.listKeyNav = new Ext.view.BoundListKeyNav(this.inputEl, {
  63619. boundList: picker,
  63620. forceKeyDown: true,
  63621. tab: function(e) {
  63622. if (selectOnTab) {
  63623. this.selectHighlighted(e);
  63624. me.triggerBlur();
  63625. }
  63626. return true;
  63627. }
  63628. });
  63629. }
  63630. if (selectOnTab) {
  63631. me.ignoreMonitorTab = true;
  63632. }
  63633. Ext.defer(keyNav.enable, 1, keyNav);
  63634. me.inputEl.focus();
  63635. },
  63636. onCollapse: function() {
  63637. var me = this,
  63638. keyNav = me.listKeyNav;
  63639. if (keyNav) {
  63640. keyNav.disable();
  63641. me.ignoreMonitorTab = false;
  63642. }
  63643. },
  63644. select: function(r) {
  63645. this.setValue(r, true);
  63646. },
  63647. findRecord: function(field, value) {
  63648. var ds = this.store,
  63649. idx = ds.findExact(field, value);
  63650. return idx !== -1 ? ds.getAt(idx) : false;
  63651. },
  63652. findRecordByValue: function(value) {
  63653. return this.findRecord(this.valueField, value);
  63654. },
  63655. findRecordByDisplay: function(value) {
  63656. return this.findRecord(this.displayField, value);
  63657. },
  63658. setValue: function(value, doSelect) {
  63659. var me = this,
  63660. valueNotFoundText = me.valueNotFoundText,
  63661. inputEl = me.inputEl,
  63662. i, len, record,
  63663. dataObj,
  63664. matchedRecords = [],
  63665. displayTplData = [],
  63666. processedValue = [];
  63667. if (me.store.loading) {
  63668. me.value = value;
  63669. me.setHiddenValue(me.value);
  63670. return me;
  63671. }
  63672. value = Ext.Array.from(value);
  63673. for (i = 0, len = value.length; i < len; i++) {
  63674. record = value[i];
  63675. if (!record || !record.isModel) {
  63676. record = me.findRecordByValue(record);
  63677. }
  63678. if (record) {
  63679. matchedRecords.push(record);
  63680. displayTplData.push(record.data);
  63681. processedValue.push(record.get(me.valueField));
  63682. }
  63683. else {
  63684. if (!me.forceSelection) {
  63685. processedValue.push(value[i]);
  63686. dataObj = {};
  63687. dataObj[me.displayField] = value[i];
  63688. displayTplData.push(dataObj);
  63689. }
  63690. else if (Ext.isDefined(valueNotFoundText)) {
  63691. displayTplData.push(valueNotFoundText);
  63692. }
  63693. }
  63694. }
  63695. me.setHiddenValue(processedValue);
  63696. me.value = me.multiSelect ? processedValue : processedValue[0];
  63697. if (!Ext.isDefined(me.value)) {
  63698. me.value = null;
  63699. }
  63700. me.displayTplData = displayTplData;
  63701. me.lastSelection = me.valueModels = matchedRecords;
  63702. if (inputEl && me.emptyText && !Ext.isEmpty(value)) {
  63703. inputEl.removeCls(me.emptyCls);
  63704. }
  63705. me.setRawValue(me.getDisplayValue());
  63706. me.checkChange();
  63707. if (doSelect !== false) {
  63708. me.syncSelection();
  63709. }
  63710. me.applyEmptyText();
  63711. return me;
  63712. },
  63713. setHiddenValue: function(values){
  63714. var me = this,
  63715. name = me.hiddenName,
  63716. i,
  63717. dom, childNodes, input, valueCount, childrenCount;
  63718. if (!me.hiddenDataEl || !name) {
  63719. return;
  63720. }
  63721. values = Ext.Array.from(values);
  63722. dom = me.hiddenDataEl.dom;
  63723. childNodes = dom.childNodes;
  63724. input = childNodes[0];
  63725. valueCount = values.length;
  63726. childrenCount = childNodes.length;
  63727. if (!input && valueCount > 0) {
  63728. me.hiddenDataEl.update(Ext.DomHelper.markup({
  63729. tag: 'input',
  63730. type: 'hidden',
  63731. name: name
  63732. }));
  63733. childrenCount = 1;
  63734. input = dom.firstChild;
  63735. }
  63736. while (childrenCount > valueCount) {
  63737. dom.removeChild(childNodes[0]);
  63738. -- childrenCount;
  63739. }
  63740. while (childrenCount < valueCount) {
  63741. dom.appendChild(input.cloneNode(true));
  63742. ++ childrenCount;
  63743. }
  63744. for (i = 0; i < valueCount; i++) {
  63745. childNodes[i].value = values[i];
  63746. }
  63747. },
  63748. getDisplayValue: function() {
  63749. return this.displayTpl.apply(this.displayTplData);
  63750. },
  63751. getValue: function() {
  63752. var me = this,
  63753. picker = me.picker,
  63754. rawValue = me.getRawValue(),
  63755. value = me.value;
  63756. if (me.getDisplayValue() !== rawValue) {
  63757. value = rawValue;
  63758. me.value = me.displayTplData = me.valueModels = null;
  63759. if (picker) {
  63760. me.ignoreSelection++;
  63761. picker.getSelectionModel().deselectAll();
  63762. me.ignoreSelection--;
  63763. }
  63764. }
  63765. return value;
  63766. },
  63767. getSubmitValue: function() {
  63768. return this.getValue();
  63769. },
  63770. isEqual: function(v1, v2) {
  63771. var fromArray = Ext.Array.from,
  63772. i, len;
  63773. v1 = fromArray(v1);
  63774. v2 = fromArray(v2);
  63775. len = v1.length;
  63776. if (len !== v2.length) {
  63777. return false;
  63778. }
  63779. for(i = 0; i < len; i++) {
  63780. if (v2[i] !== v1[i]) {
  63781. return false;
  63782. }
  63783. }
  63784. return true;
  63785. },
  63786. clearValue: function() {
  63787. this.setValue([]);
  63788. },
  63789. syncSelection: function() {
  63790. var me = this,
  63791. picker = me.picker,
  63792. selection, selModel,
  63793. values = me.valueModels || [],
  63794. vLen = values.length, v, value;
  63795. if (picker) {
  63796. selection = [];
  63797. for (v = 0; v < vLen; v++) {
  63798. value = values[v];
  63799. if (value && value.isModel && me.store.indexOf(value) >= 0) {
  63800. selection.push(value);
  63801. }
  63802. }
  63803. me.ignoreSelection++;
  63804. selModel = picker.getSelectionModel();
  63805. selModel.deselectAll();
  63806. if (selection.length) {
  63807. selModel.select(selection);
  63808. }
  63809. me.ignoreSelection--;
  63810. }
  63811. },
  63812. onEditorTab: function(e){
  63813. var keyNav = this.listKeyNav;
  63814. if (this.selectOnTab && keyNav) {
  63815. keyNav.selectHighlighted(e);
  63816. }
  63817. }
  63818. });
  63819. Ext.define('Ext.picker.Month', {
  63820. extend: 'Ext.Component',
  63821. requires: [
  63822. 'Ext.XTemplate',
  63823. 'Ext.util.ClickRepeater',
  63824. 'Ext.Date',
  63825. 'Ext.button.Button'
  63826. ],
  63827. alias: 'widget.monthpicker',
  63828. alternateClassName: 'Ext.MonthPicker',
  63829. childEls: [
  63830. 'bodyEl', 'prevEl', 'nextEl', 'buttonsEl', 'monthEl', 'yearEl'
  63831. ],
  63832. renderTpl: [
  63833. '<div id="{id}-bodyEl" class="{baseCls}-body">',
  63834. '<div id="{id}-monthEl" class="{baseCls}-months">',
  63835. '<tpl for="months">',
  63836. '<div class="{parent.baseCls}-item {parent.baseCls}-month"><a style="{parent.monthStyle}" href="#" hidefocus="on">{.}</a></div>',
  63837. '</tpl>',
  63838. '</div>',
  63839. '<div id="{id}-yearEl" class="{baseCls}-years">',
  63840. '<div class="{baseCls}-yearnav">',
  63841. '<button id="{id}-prevEl" class="{baseCls}-yearnav-prev"></button>',
  63842. '<button id="{id}-nextEl" class="{baseCls}-yearnav-next"></button>',
  63843. '</div>',
  63844. '<tpl for="years">',
  63845. '<div class="{parent.baseCls}-item {parent.baseCls}-year"><a href="#" hidefocus="on">{.}</a></div>',
  63846. '</tpl>',
  63847. '</div>',
  63848. '<div class="' + Ext.baseCSSPrefix + 'clear"></div>',
  63849. '</div>',
  63850. '<tpl if="showButtons">',
  63851. '<div id="{id}-buttonsEl" class="{baseCls}-buttons">{%',
  63852. 'var me=values.$comp, okBtn=me.okBtn, cancelBtn=me.cancelBtn;',
  63853. 'okBtn.ownerLayout = cancelBtn.ownerLayout = me.componentLayout;',
  63854. 'okBtn.ownerCt = cancelBtn.ownerCt = me;',
  63855. 'Ext.DomHelper.generateMarkup(okBtn.getRenderTree(), out);',
  63856. 'Ext.DomHelper.generateMarkup(cancelBtn.getRenderTree(), out);',
  63857. '%}</div>',
  63858. '</tpl>'
  63859. ],
  63860. okText: 'OK',
  63861. cancelText: 'Cancel',
  63862. baseCls: Ext.baseCSSPrefix + 'monthpicker',
  63863. showButtons: true,
  63864. width: 178,
  63865. measureWidth: 35,
  63866. measureMaxHeight: 20,
  63867. smallCls: Ext.baseCSSPrefix + 'monthpicker-small',
  63868. totalYears: 10,
  63869. yearOffset: 5,
  63870. monthOffset: 6,
  63871. initComponent: function(){
  63872. var me = this;
  63873. me.selectedCls = me.baseCls + '-selected';
  63874. me.addEvents(
  63875. 'cancelclick',
  63876. 'monthclick',
  63877. 'monthdblclick',
  63878. 'okclick',
  63879. 'select',
  63880. 'yearclick',
  63881. 'yeardblclick'
  63882. );
  63883. if (me.small) {
  63884. me.addCls(me.smallCls);
  63885. }
  63886. me.setValue(me.value);
  63887. me.activeYear = me.getYear(new Date().getFullYear() - 4, -4);
  63888. if (me.showButtons) {
  63889. me.okBtn = new Ext.button.Button({
  63890. text: me.okText,
  63891. handler: me.onOkClick,
  63892. scope: me
  63893. });
  63894. me.cancelBtn = new Ext.button.Button({
  63895. text: me.cancelText,
  63896. handler: me.onCancelClick,
  63897. scope: me
  63898. });
  63899. }
  63900. this.callParent();
  63901. },
  63902. beforeRender: function(){
  63903. var me = this,
  63904. i = 0,
  63905. months = [],
  63906. shortName = Ext.Date.getShortMonthName,
  63907. monthLen = me.monthOffset,
  63908. margin = me.monthMargin,
  63909. style = '';
  63910. me.callParent();
  63911. for (; i < monthLen; ++i) {
  63912. months.push(shortName(i), shortName(i + monthLen));
  63913. }
  63914. if (Ext.isDefined(margin)) {
  63915. style = 'margin: 0 ' + margin + 'px;';
  63916. }
  63917. Ext.apply(me.renderData, {
  63918. months: months,
  63919. years: me.getYears(),
  63920. showButtons: me.showButtons,
  63921. monthStyle: style
  63922. });
  63923. },
  63924. afterRender: function(){
  63925. var me = this,
  63926. body = me.bodyEl,
  63927. buttonsEl = me.buttonsEl;
  63928. me.callParent();
  63929. me.mon(body, 'click', me.onBodyClick, me);
  63930. me.mon(body, 'dblclick', me.onBodyClick, me);
  63931. me.years = body.select('.' + me.baseCls + '-year a');
  63932. me.months = body.select('.' + me.baseCls + '-month a');
  63933. me.backRepeater = new Ext.util.ClickRepeater(me.prevEl, {
  63934. handler: Ext.Function.bind(me.adjustYear, me, [-me.totalYears])
  63935. });
  63936. me.prevEl.addClsOnOver(me.baseCls + '-yearnav-prev-over');
  63937. me.nextRepeater = new Ext.util.ClickRepeater(me.nextEl, {
  63938. handler: Ext.Function.bind(me.adjustYear, me, [me.totalYears])
  63939. });
  63940. me.nextEl.addClsOnOver(me.baseCls + '-yearnav-next-over');
  63941. me.updateBody();
  63942. if (!Ext.isDefined(me.monthMargin)) {
  63943. Ext.picker.Month.prototype.monthMargin = me.calculateMonthMargin();
  63944. }
  63945. },
  63946. calculateMonthMargin: function(){
  63947. var me = this,
  63948. monthEl = me.monthEl,
  63949. months = me.months,
  63950. first = months.first(),
  63951. itemMargin = first.getMargin('l');
  63952. while (itemMargin && me.getLargest() > me.measureMaxHeight) {
  63953. --itemMargin;
  63954. months.setStyle('margin', '0 ' + itemMargin + 'px');
  63955. }
  63956. return itemMargin;
  63957. },
  63958. getLargest: function(months){
  63959. var largest = 0;
  63960. this.months.each(function(item){
  63961. var h = item.getHeight();
  63962. if (h > largest) {
  63963. largest = h;
  63964. }
  63965. });
  63966. return largest;
  63967. },
  63968. setValue: function(value){
  63969. var me = this,
  63970. active = me.activeYear,
  63971. offset = me.monthOffset,
  63972. year,
  63973. index;
  63974. if (!value) {
  63975. me.value = [null, null];
  63976. } else if (Ext.isDate(value)) {
  63977. me.value = [value.getMonth(), value.getFullYear()];
  63978. } else {
  63979. me.value = [value[0], value[1]];
  63980. }
  63981. if (me.rendered) {
  63982. year = me.value[1];
  63983. if (year !== null) {
  63984. if ((year < active || year > active + me.yearOffset)) {
  63985. me.activeYear = year - me.yearOffset + 1;
  63986. }
  63987. }
  63988. me.updateBody();
  63989. }
  63990. return me;
  63991. },
  63992. getValue: function(){
  63993. return this.value;
  63994. },
  63995. hasSelection: function(){
  63996. var value = this.value;
  63997. return value[0] !== null && value[1] !== null;
  63998. },
  63999. getYears: function(){
  64000. var me = this,
  64001. offset = me.yearOffset,
  64002. start = me.activeYear,
  64003. end = start + offset,
  64004. i = start,
  64005. years = [];
  64006. for (; i < end; ++i) {
  64007. years.push(i, i + offset);
  64008. }
  64009. return years;
  64010. },
  64011. updateBody: function(){
  64012. var me = this,
  64013. years = me.years,
  64014. months = me.months,
  64015. yearNumbers = me.getYears(),
  64016. cls = me.selectedCls,
  64017. value = me.getYear(null),
  64018. month = me.value[0],
  64019. monthOffset = me.monthOffset,
  64020. year,
  64021. yearItems, y, yLen, el;
  64022. if (me.rendered) {
  64023. years.removeCls(cls);
  64024. months.removeCls(cls);
  64025. yearItems = years.elements;
  64026. yLen = yearItems.length;
  64027. for (y = 0; y < yLen; y++) {
  64028. el = Ext.fly(yearItems[y]);
  64029. year = yearNumbers[y];
  64030. el.dom.innerHTML = year;
  64031. if (year == value) {
  64032. el.dom.className = cls;
  64033. }
  64034. }
  64035. if (month !== null) {
  64036. if (month < monthOffset) {
  64037. month = month * 2;
  64038. } else {
  64039. month = (month - monthOffset) * 2 + 1;
  64040. }
  64041. months.item(month).addCls(cls);
  64042. }
  64043. }
  64044. },
  64045. getYear: function(defaultValue, offset) {
  64046. var year = this.value[1];
  64047. offset = offset || 0;
  64048. return year === null ? defaultValue : year + offset;
  64049. },
  64050. onBodyClick: function(e, t) {
  64051. var me = this,
  64052. isDouble = e.type == 'dblclick';
  64053. if (e.getTarget('.' + me.baseCls + '-month')) {
  64054. e.stopEvent();
  64055. me.onMonthClick(t, isDouble);
  64056. } else if (e.getTarget('.' + me.baseCls + '-year')) {
  64057. e.stopEvent();
  64058. me.onYearClick(t, isDouble);
  64059. }
  64060. },
  64061. adjustYear: function(offset){
  64062. if (typeof offset != 'number') {
  64063. offset = this.totalYears;
  64064. }
  64065. this.activeYear += offset;
  64066. this.updateBody();
  64067. },
  64068. onOkClick: function(){
  64069. this.fireEvent('okclick', this, this.value);
  64070. },
  64071. onCancelClick: function(){
  64072. this.fireEvent('cancelclick', this);
  64073. },
  64074. onMonthClick: function(target, isDouble){
  64075. var me = this;
  64076. me.value[0] = me.resolveOffset(me.months.indexOf(target), me.monthOffset);
  64077. me.updateBody();
  64078. me.fireEvent('month' + (isDouble ? 'dbl' : '') + 'click', me, me.value);
  64079. me.fireEvent('select', me, me.value);
  64080. },
  64081. onYearClick: function(target, isDouble){
  64082. var me = this;
  64083. me.value[1] = me.activeYear + me.resolveOffset(me.years.indexOf(target), me.yearOffset);
  64084. me.updateBody();
  64085. me.fireEvent('year' + (isDouble ? 'dbl' : '') + 'click', me, me.value);
  64086. me.fireEvent('select', me, me.value);
  64087. },
  64088. resolveOffset: function(index, offset){
  64089. if (index % 2 === 0) {
  64090. return (index / 2);
  64091. } else {
  64092. return offset + Math.floor(index / 2);
  64093. }
  64094. },
  64095. beforeDestroy: function(){
  64096. var me = this;
  64097. me.years = me.months = null;
  64098. Ext.destroyMembers(me, 'backRepeater', 'nextRepeater', 'okBtn', 'cancelBtn');
  64099. me.callParent();
  64100. },
  64101. finishRenderChildren: function () {
  64102. var me = this;
  64103. this.callParent(arguments);
  64104. if (this.showButtons) {
  64105. me.okBtn.finishRender();
  64106. me.cancelBtn.finishRender();
  64107. }
  64108. },
  64109. onDestroy: function() {
  64110. Ext.destroyMembers(this, 'okBtn', 'cancelBtn');
  64111. this.callParent();
  64112. }
  64113. });
  64114. Ext.define('Ext.picker.Date', {
  64115. extend: 'Ext.Component',
  64116. requires: [
  64117. 'Ext.XTemplate',
  64118. 'Ext.button.Button',
  64119. 'Ext.button.Split',
  64120. 'Ext.util.ClickRepeater',
  64121. 'Ext.util.KeyNav',
  64122. 'Ext.EventObject',
  64123. 'Ext.fx.Manager',
  64124. 'Ext.picker.Month'
  64125. ],
  64126. alias: 'widget.datepicker',
  64127. alternateClassName: 'Ext.DatePicker',
  64128. childEls: [
  64129. 'innerEl', 'eventEl', 'prevEl', 'nextEl', 'middleBtnEl', 'footerEl'
  64130. ],
  64131. border: true,
  64132. renderTpl: [
  64133. '<div id="{id}-innerEl" role="grid">',
  64134. '<div role="presentation" class="{baseCls}-header">',
  64135. '<div class="{baseCls}-prev"><a id="{id}-prevEl" href="#" role="button" title="{prevText}"></a></div>',
  64136. '<div class="{baseCls}-month" id="{id}-middleBtnEl">{%this.renderMonthBtn(values, out)%}</div>',
  64137. '<div class="{baseCls}-next"><a id="{id}-nextEl" href="#" role="button" title="{nextText}"></a></div>',
  64138. '</div>',
  64139. '<table id="{id}-eventEl" class="{baseCls}-inner" cellspacing="0" role="presentation">',
  64140. '<thead role="presentation"><tr role="presentation">',
  64141. '<tpl for="dayNames">',
  64142. '<th role="columnheader" title="{.}"><span>{.:this.firstInitial}</span></th>',
  64143. '</tpl>',
  64144. '</tr></thead>',
  64145. '<tbody role="presentation"><tr role="presentation">',
  64146. '<tpl for="days">',
  64147. '{#:this.isEndOfWeek}',
  64148. '<td role="gridcell" id="{[Ext.id()]}">',
  64149. '<a role="presentation" href="#" hidefocus="on" class="{parent.baseCls}-date" tabIndex="1">',
  64150. '<em role="presentation"><span role="presentation"></span></em>',
  64151. '</a>',
  64152. '</td>',
  64153. '</tpl>',
  64154. '</tr></tbody>',
  64155. '</table>',
  64156. '<tpl if="showToday">',
  64157. '<div id="{id}-footerEl" role="presentation" class="{baseCls}-footer">{%this.renderTodayBtn(values, out)%}</div>',
  64158. '</tpl>',
  64159. '</div>',
  64160. {
  64161. firstInitial: function(value) {
  64162. return Ext.picker.Date.prototype.getDayInitial(value);
  64163. },
  64164. isEndOfWeek: function(value) {
  64165. value--;
  64166. var end = value % 7 === 0 && value !== 0;
  64167. return end ? '</tr><tr role="row">' : '';
  64168. },
  64169. renderTodayBtn: function(values, out) {
  64170. Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(), out);
  64171. },
  64172. renderMonthBtn: function(values, out) {
  64173. Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(), out);
  64174. }
  64175. }
  64176. ],
  64177. todayText : 'Today',
  64178. ariaTitle: 'Date Picker: {0}',
  64179. ariaTitleDateFormat: 'F d, Y',
  64180. todayTip : '{0} (Spacebar)',
  64181. minText : 'This date is before the minimum date',
  64182. maxText : 'This date is after the maximum date',
  64183. disabledDaysText : 'Disabled',
  64184. disabledDatesText : 'Disabled',
  64185. nextText : 'Next Month (Control+Right)',
  64186. prevText : 'Previous Month (Control+Left)',
  64187. monthYearText : 'Choose a month (Control+Up/Down to move years)',
  64188. monthYearFormat: 'F Y',
  64189. startDay : 0,
  64190. showToday : true,
  64191. disableAnim: false,
  64192. baseCls: Ext.baseCSSPrefix + 'datepicker',
  64193. longDayFormat: 'F d, Y',
  64194. focusOnShow: false,
  64195. focusOnSelect: true,
  64196. width: 178,
  64197. initHour: 12,
  64198. numDays: 42,
  64199. initComponent : function() {
  64200. var me = this,
  64201. clearTime = Ext.Date.clearTime;
  64202. me.selectedCls = me.baseCls + '-selected';
  64203. me.disabledCellCls = me.baseCls + '-disabled';
  64204. me.prevCls = me.baseCls + '-prevday';
  64205. me.activeCls = me.baseCls + '-active';
  64206. me.nextCls = me.baseCls + '-prevday';
  64207. me.todayCls = me.baseCls + '-today';
  64208. me.dayNames = me.dayNames.slice(me.startDay).concat(me.dayNames.slice(0, me.startDay));
  64209. me.listeners = Ext.apply(me.listeners||{}, {
  64210. mousewheel: {
  64211. element: 'eventEl',
  64212. fn: me.handleMouseWheel,
  64213. scope: me
  64214. },
  64215. click: {
  64216. element: 'eventEl',
  64217. fn: me.handleDateClick,
  64218. scope: me,
  64219. delegate: 'a.' + me.baseCls + '-date'
  64220. }
  64221. });
  64222. this.callParent();
  64223. me.value = me.value ?
  64224. clearTime(me.value, true) : clearTime(new Date());
  64225. me.addEvents(
  64226. 'select'
  64227. );
  64228. me.initDisabledDays();
  64229. },
  64230. beforeRender: function () {
  64231. var me = this,
  64232. days = new Array(me.numDays),
  64233. today = Ext.Date.format(new Date(), me.format);
  64234. if (me.up('menu')) {
  64235. me.addCls(Ext.baseCSSPrefix + 'menu');
  64236. }
  64237. me.monthBtn = new Ext.button.Split({
  64238. ownerCt: me,
  64239. ownerLayout: me.getComponentLayout(),
  64240. text: '',
  64241. tooltip: me.monthYearText,
  64242. listeners: {
  64243. click: me.showMonthPicker,
  64244. arrowclick: me.showMonthPicker,
  64245. scope: me
  64246. }
  64247. });
  64248. if (this.showToday) {
  64249. me.todayBtn = new Ext.button.Button({
  64250. ownerCt: me,
  64251. ownerLayout: me.getComponentLayout(),
  64252. text: Ext.String.format(me.todayText, today),
  64253. tooltip: Ext.String.format(me.todayTip, today),
  64254. tooltipType: 'title',
  64255. handler: me.selectToday,
  64256. scope: me
  64257. });
  64258. }
  64259. me.callParent();
  64260. Ext.applyIf(me, {
  64261. renderData: {}
  64262. });
  64263. Ext.apply(me.renderData, {
  64264. dayNames: me.dayNames,
  64265. showToday: me.showToday,
  64266. prevText: me.prevText,
  64267. nextText: me.nextText,
  64268. days: days
  64269. });
  64270. },
  64271. finishRenderChildren: function () {
  64272. var me = this;
  64273. me.callParent();
  64274. me.monthBtn.finishRender();
  64275. if (me.showToday) {
  64276. me.todayBtn.finishRender();
  64277. }
  64278. },
  64279. onRender : function(container, position){
  64280. var me = this;
  64281. me.callParent(arguments);
  64282. me.el.unselectable();
  64283. me.cells = me.eventEl.select('tbody td');
  64284. me.textNodes = me.eventEl.query('tbody td span');
  64285. },
  64286. initEvents: function(){
  64287. var me = this,
  64288. eDate = Ext.Date,
  64289. day = eDate.DAY;
  64290. me.callParent();
  64291. me.prevRepeater = new Ext.util.ClickRepeater(me.prevEl, {
  64292. handler: me.showPrevMonth,
  64293. scope: me,
  64294. preventDefault: true,
  64295. stopDefault: true
  64296. });
  64297. me.nextRepeater = new Ext.util.ClickRepeater(me.nextEl, {
  64298. handler: me.showNextMonth,
  64299. scope: me,
  64300. preventDefault:true,
  64301. stopDefault:true
  64302. });
  64303. me.keyNav = new Ext.util.KeyNav(me.eventEl, Ext.apply({
  64304. scope: me,
  64305. left : function(e){
  64306. if(e.ctrlKey){
  64307. me.showPrevMonth();
  64308. }else{
  64309. me.update(eDate.add(me.activeDate, day, -1));
  64310. }
  64311. },
  64312. right : function(e){
  64313. if(e.ctrlKey){
  64314. me.showNextMonth();
  64315. }else{
  64316. me.update(eDate.add(me.activeDate, day, 1));
  64317. }
  64318. },
  64319. up : function(e){
  64320. if(e.ctrlKey){
  64321. me.showNextYear();
  64322. }else{
  64323. me.update(eDate.add(me.activeDate, day, -7));
  64324. }
  64325. },
  64326. down : function(e){
  64327. if(e.ctrlKey){
  64328. me.showPrevYear();
  64329. }else{
  64330. me.update(eDate.add(me.activeDate, day, 7));
  64331. }
  64332. },
  64333. pageUp : me.showNextMonth,
  64334. pageDown : me.showPrevMonth,
  64335. enter : function(e){
  64336. e.stopPropagation();
  64337. return true;
  64338. }
  64339. }, me.keyNavConfig));
  64340. if (me.showToday) {
  64341. me.todayKeyListener = me.eventEl.addKeyListener(Ext.EventObject.SPACE, me.selectToday, me);
  64342. }
  64343. me.update(me.value);
  64344. },
  64345. initDisabledDays : function(){
  64346. var me = this,
  64347. dd = me.disabledDates,
  64348. re = '(?:',
  64349. len,
  64350. d, dLen, dI;
  64351. if(!me.disabledDatesRE && dd){
  64352. len = dd.length - 1;
  64353. dLen = dd.length;
  64354. for (d = 0; d < dLen; d++) {
  64355. dI = dd[d];
  64356. re += Ext.isDate(dI) ? '^' + Ext.String.escapeRegex(Ext.Date.dateFormat(dI, me.format)) + '$' : dI;
  64357. if (d != len) {
  64358. re += '|';
  64359. }
  64360. }
  64361. me.disabledDatesRE = new RegExp(re + ')');
  64362. }
  64363. },
  64364. setDisabledDates : function(dd){
  64365. var me = this;
  64366. if(Ext.isArray(dd)){
  64367. me.disabledDates = dd;
  64368. me.disabledDatesRE = null;
  64369. }else{
  64370. me.disabledDatesRE = dd;
  64371. }
  64372. me.initDisabledDays();
  64373. me.update(me.value, true);
  64374. return me;
  64375. },
  64376. setDisabledDays : function(dd){
  64377. this.disabledDays = dd;
  64378. return this.update(this.value, true);
  64379. },
  64380. setMinDate : function(dt){
  64381. this.minDate = dt;
  64382. return this.update(this.value, true);
  64383. },
  64384. setMaxDate : function(dt){
  64385. this.maxDate = dt;
  64386. return this.update(this.value, true);
  64387. },
  64388. setValue : function(value){
  64389. this.value = Ext.Date.clearTime(value, true);
  64390. return this.update(this.value);
  64391. },
  64392. getValue : function(){
  64393. return this.value;
  64394. },
  64395. getDayInitial: function(value){
  64396. return value.substr(0,1);
  64397. },
  64398. focus : function(){
  64399. this.update(this.activeDate);
  64400. },
  64401. onEnable: function(){
  64402. this.callParent();
  64403. this.setDisabledStatus(false);
  64404. this.update(this.activeDate);
  64405. },
  64406. onDisable : function(){
  64407. this.callParent();
  64408. this.setDisabledStatus(true);
  64409. },
  64410. setDisabledStatus : function(disabled){
  64411. var me = this;
  64412. me.keyNav.setDisabled(disabled);
  64413. me.prevRepeater.setDisabled(disabled);
  64414. me.nextRepeater.setDisabled(disabled);
  64415. if (me.showToday) {
  64416. me.todayKeyListener.setDisabled(disabled);
  64417. me.todayBtn.setDisabled(disabled);
  64418. }
  64419. },
  64420. getActive: function(){
  64421. return this.activeDate || this.value;
  64422. },
  64423. runAnimation: function(isHide){
  64424. var picker = this.monthPicker,
  64425. options = {
  64426. duration: 200,
  64427. callback: function(){
  64428. if (isHide) {
  64429. picker.hide();
  64430. } else {
  64431. picker.show();
  64432. }
  64433. }
  64434. };
  64435. if (isHide) {
  64436. picker.el.slideOut('t', options);
  64437. } else {
  64438. picker.el.slideIn('t', options);
  64439. }
  64440. },
  64441. hideMonthPicker : function(animate){
  64442. var me = this,
  64443. picker = me.monthPicker;
  64444. if (picker) {
  64445. if (me.shouldAnimate(animate)) {
  64446. me.runAnimation(true);
  64447. } else {
  64448. picker.hide();
  64449. }
  64450. }
  64451. return me;
  64452. },
  64453. showMonthPicker : function(animate){
  64454. var me = this,
  64455. picker;
  64456. if (me.rendered && !me.disabled) {
  64457. picker = me.createMonthPicker();
  64458. picker.setValue(me.getActive());
  64459. picker.setSize(me.getSize());
  64460. picker.setPosition(-1, -1);
  64461. if (me.shouldAnimate(animate)) {
  64462. me.runAnimation(false);
  64463. } else {
  64464. picker.show();
  64465. }
  64466. }
  64467. return me;
  64468. },
  64469. shouldAnimate: function(animate){
  64470. return Ext.isDefined(animate) ? animate : !this.disableAnim;
  64471. },
  64472. createMonthPicker: function(){
  64473. var me = this,
  64474. picker = me.monthPicker;
  64475. if (!picker) {
  64476. me.monthPicker = picker = new Ext.picker.Month({
  64477. renderTo: me.el,
  64478. floating: true,
  64479. shadow: false,
  64480. small: me.showToday === false,
  64481. listeners: {
  64482. scope: me,
  64483. cancelclick: me.onCancelClick,
  64484. okclick: me.onOkClick,
  64485. yeardblclick: me.onOkClick,
  64486. monthdblclick: me.onOkClick
  64487. }
  64488. });
  64489. if (!me.disableAnim) {
  64490. picker.el.setStyle('display', 'none');
  64491. }
  64492. me.on('beforehide', Ext.Function.bind(me.hideMonthPicker, me, [false]));
  64493. }
  64494. return picker;
  64495. },
  64496. onOkClick: function(picker, value){
  64497. var me = this,
  64498. month = value[0],
  64499. year = value[1],
  64500. date = new Date(year, month, me.getActive().getDate());
  64501. if (date.getMonth() !== month) {
  64502. date = Ext.Date.getLastDateOfMonth(new Date(year, month, 1));
  64503. }
  64504. me.update(date);
  64505. me.hideMonthPicker();
  64506. },
  64507. onCancelClick: function(){
  64508. this.selectedUpdate(this.activeDate);
  64509. this.hideMonthPicker();
  64510. },
  64511. showPrevMonth : function(e){
  64512. return this.update(Ext.Date.add(this.activeDate, Ext.Date.MONTH, -1));
  64513. },
  64514. showNextMonth : function(e){
  64515. return this.update(Ext.Date.add(this.activeDate, Ext.Date.MONTH, 1));
  64516. },
  64517. showPrevYear : function(){
  64518. this.update(Ext.Date.add(this.activeDate, Ext.Date.YEAR, -1));
  64519. },
  64520. showNextYear : function(){
  64521. this.update(Ext.Date.add(this.activeDate, Ext.Date.YEAR, 1));
  64522. },
  64523. handleMouseWheel : function(e){
  64524. e.stopEvent();
  64525. if(!this.disabled){
  64526. var delta = e.getWheelDelta();
  64527. if(delta > 0){
  64528. this.showPrevMonth();
  64529. } else if(delta < 0){
  64530. this.showNextMonth();
  64531. }
  64532. }
  64533. },
  64534. handleDateClick : function(e, t){
  64535. var me = this,
  64536. handler = me.handler;
  64537. e.stopEvent();
  64538. if(!me.disabled && t.dateValue && !Ext.fly(t.parentNode).hasCls(me.disabledCellCls)){
  64539. me.doCancelFocus = me.focusOnSelect === false;
  64540. me.setValue(new Date(t.dateValue));
  64541. delete me.doCancelFocus;
  64542. me.fireEvent('select', me, me.value);
  64543. if (handler) {
  64544. handler.call(me.scope || me, me, me.value);
  64545. }
  64546. me.onSelect();
  64547. }
  64548. },
  64549. onSelect: function() {
  64550. if (this.hideOnSelect) {
  64551. this.hide();
  64552. }
  64553. },
  64554. selectToday : function(){
  64555. var me = this,
  64556. btn = me.todayBtn,
  64557. handler = me.handler;
  64558. if(btn && !btn.disabled){
  64559. me.setValue(Ext.Date.clearTime(new Date()));
  64560. me.fireEvent('select', me, me.value);
  64561. if (handler) {
  64562. handler.call(me.scope || me, me, me.value);
  64563. }
  64564. me.onSelect();
  64565. }
  64566. return me;
  64567. },
  64568. selectedUpdate: function(date){
  64569. var me = this,
  64570. t = date.getTime(),
  64571. cells = me.cells,
  64572. cls = me.selectedCls,
  64573. cellItems = cells.elements,
  64574. c,
  64575. cLen = cellItems.length,
  64576. cell;
  64577. cells.removeCls(cls);
  64578. for (c = 0; c < cLen; c++) {
  64579. cell = Ext.fly(cellItems[c]);
  64580. if (cell.dom.firstChild.dateValue == t) {
  64581. me.fireEvent('highlightitem', me, cell);
  64582. cell.addCls(cls);
  64583. if(me.isVisible() && !me.doCancelFocus){
  64584. Ext.fly(cell.dom.firstChild).focus(50);
  64585. }
  64586. break;
  64587. }
  64588. }
  64589. },
  64590. fullUpdate: function(date){
  64591. var me = this,
  64592. cells = me.cells.elements,
  64593. textNodes = me.textNodes,
  64594. disabledCls = me.disabledCellCls,
  64595. eDate = Ext.Date,
  64596. i = 0,
  64597. extraDays = 0,
  64598. visible = me.isVisible(),
  64599. sel = +eDate.clearTime(date, true),
  64600. today = +eDate.clearTime(new Date()),
  64601. min = me.minDate ? eDate.clearTime(me.minDate, true) : Number.NEGATIVE_INFINITY,
  64602. max = me.maxDate ? eDate.clearTime(me.maxDate, true) : Number.POSITIVE_INFINITY,
  64603. ddMatch = me.disabledDatesRE,
  64604. ddText = me.disabledDatesText,
  64605. ddays = me.disabledDays ? me.disabledDays.join('') : false,
  64606. ddaysText = me.disabledDaysText,
  64607. format = me.format,
  64608. days = eDate.getDaysInMonth(date),
  64609. firstOfMonth = eDate.getFirstDateOfMonth(date),
  64610. startingPos = firstOfMonth.getDay() - me.startDay,
  64611. previousMonth = eDate.add(date, eDate.MONTH, -1),
  64612. longDayFormat = me.longDayFormat,
  64613. prevStart,
  64614. current,
  64615. disableToday,
  64616. tempDate,
  64617. setCellClass,
  64618. html,
  64619. cls,
  64620. formatValue,
  64621. value;
  64622. if (startingPos < 0) {
  64623. startingPos += 7;
  64624. }
  64625. days += startingPos;
  64626. prevStart = eDate.getDaysInMonth(previousMonth) - startingPos;
  64627. current = new Date(previousMonth.getFullYear(), previousMonth.getMonth(), prevStart, me.initHour);
  64628. if (me.showToday) {
  64629. tempDate = eDate.clearTime(new Date());
  64630. disableToday = (tempDate < min || tempDate > max ||
  64631. (ddMatch && format && ddMatch.test(eDate.dateFormat(tempDate, format))) ||
  64632. (ddays && ddays.indexOf(tempDate.getDay()) != -1));
  64633. if (!me.disabled) {
  64634. me.todayBtn.setDisabled(disableToday);
  64635. me.todayKeyListener.setDisabled(disableToday);
  64636. }
  64637. }
  64638. setCellClass = function(cell){
  64639. value = +eDate.clearTime(current, true);
  64640. cell.title = eDate.format(current, longDayFormat);
  64641. cell.firstChild.dateValue = value;
  64642. if(value == today){
  64643. cell.className += ' ' + me.todayCls;
  64644. cell.title = me.todayText;
  64645. }
  64646. if(value == sel){
  64647. cell.className += ' ' + me.selectedCls;
  64648. me.fireEvent('highlightitem', me, cell);
  64649. if (visible && me.floating) {
  64650. Ext.fly(cell.firstChild).focus(50);
  64651. }
  64652. }
  64653. if(value < min) {
  64654. cell.className = disabledCls;
  64655. cell.title = me.minText;
  64656. return;
  64657. }
  64658. if(value > max) {
  64659. cell.className = disabledCls;
  64660. cell.title = me.maxText;
  64661. return;
  64662. }
  64663. if(ddays){
  64664. if(ddays.indexOf(current.getDay()) != -1){
  64665. cell.title = ddaysText;
  64666. cell.className = disabledCls;
  64667. }
  64668. }
  64669. if(ddMatch && format){
  64670. formatValue = eDate.dateFormat(current, format);
  64671. if(ddMatch.test(formatValue)){
  64672. cell.title = ddText.replace('%0', formatValue);
  64673. cell.className = disabledCls;
  64674. }
  64675. }
  64676. };
  64677. for(; i < me.numDays; ++i) {
  64678. if (i < startingPos) {
  64679. html = (++prevStart);
  64680. cls = me.prevCls;
  64681. } else if (i >= days) {
  64682. html = (++extraDays);
  64683. cls = me.nextCls;
  64684. } else {
  64685. html = i - startingPos + 1;
  64686. cls = me.activeCls;
  64687. }
  64688. textNodes[i].innerHTML = html;
  64689. cells[i].className = cls;
  64690. current.setDate(current.getDate() + 1);
  64691. setCellClass(cells[i]);
  64692. }
  64693. me.monthBtn.setText(Ext.Date.format(date, me.monthYearFormat));
  64694. },
  64695. update : function(date, forceRefresh){
  64696. var me = this,
  64697. active = me.activeDate;
  64698. if (me.rendered) {
  64699. me.activeDate = date;
  64700. if(!forceRefresh && active && me.el && active.getMonth() == date.getMonth() && active.getFullYear() == date.getFullYear()){
  64701. me.selectedUpdate(date, active);
  64702. } else {
  64703. me.fullUpdate(date, active);
  64704. }
  64705. me.innerEl.dom.title = Ext.String.format(me.ariaTitle, Ext.Date.format(me.activeDate, me.ariaTitleDateFormat));
  64706. }
  64707. return me;
  64708. },
  64709. beforeDestroy : function() {
  64710. var me = this;
  64711. if (me.rendered) {
  64712. Ext.destroy(
  64713. me.todayKeyListener,
  64714. me.keyNav,
  64715. me.monthPicker,
  64716. me.monthBtn,
  64717. me.nextRepeater,
  64718. me.prevRepeater,
  64719. me.todayBtn
  64720. );
  64721. delete me.textNodes;
  64722. delete me.cells.elements;
  64723. }
  64724. me.callParent();
  64725. },
  64726. onShow: function() {
  64727. this.callParent(arguments);
  64728. if (this.focusOnShow) {
  64729. this.focus();
  64730. }
  64731. }
  64732. },
  64733. function() {
  64734. var proto = this.prototype,
  64735. date = Ext.Date;
  64736. proto.monthNames = date.monthNames;
  64737. proto.dayNames = date.dayNames;
  64738. proto.format = date.defaultFormat;
  64739. });
  64740. Ext.define('Ext.form.field.Date', {
  64741. extend:'Ext.form.field.Picker',
  64742. alias: 'widget.datefield',
  64743. requires: ['Ext.picker.Date'],
  64744. alternateClassName: ['Ext.form.DateField', 'Ext.form.Date'],
  64745. format : "m/d/Y",
  64746. altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",
  64747. disabledDaysText : "Disabled",
  64748. disabledDatesText : "Disabled",
  64749. minText : "The date in this field must be equal to or after {0}",
  64750. maxText : "The date in this field must be equal to or before {0}",
  64751. invalidText : "{0} is not a valid date - it must be in the format {1}",
  64752. triggerCls : Ext.baseCSSPrefix + 'form-date-trigger',
  64753. showToday : true,
  64754. useStrict: undefined,
  64755. initTime: '12',
  64756. initTimeFormat: 'H',
  64757. matchFieldWidth: false,
  64758. startDay: 0,
  64759. initComponent : function(){
  64760. var me = this,
  64761. isString = Ext.isString,
  64762. min, max;
  64763. min = me.minValue;
  64764. max = me.maxValue;
  64765. if(isString(min)){
  64766. me.minValue = me.parseDate(min);
  64767. }
  64768. if(isString(max)){
  64769. me.maxValue = me.parseDate(max);
  64770. }
  64771. me.disabledDatesRE = null;
  64772. me.initDisabledDays();
  64773. me.callParent();
  64774. },
  64775. initValue: function() {
  64776. var me = this,
  64777. value = me.value;
  64778. if (Ext.isString(value)) {
  64779. me.value = me.rawToValue(value);
  64780. }
  64781. me.callParent();
  64782. },
  64783. initDisabledDays : function(){
  64784. if(this.disabledDates){
  64785. var dd = this.disabledDates,
  64786. len = dd.length - 1,
  64787. re = "(?:",
  64788. d,
  64789. dLen = dd.length,
  64790. date;
  64791. for (d = 0; d < dLen; d++) {
  64792. date = dd[d];
  64793. re += Ext.isDate(date) ? '^' + Ext.String.escapeRegex(date.dateFormat(this.format)) + '$' : date;
  64794. if (d !== len) {
  64795. re += '|';
  64796. }
  64797. }
  64798. this.disabledDatesRE = new RegExp(re + ')');
  64799. }
  64800. },
  64801. setDisabledDates : function(dd){
  64802. var me = this,
  64803. picker = me.picker;
  64804. me.disabledDates = dd;
  64805. me.initDisabledDays();
  64806. if (picker) {
  64807. picker.setDisabledDates(me.disabledDatesRE);
  64808. }
  64809. },
  64810. setDisabledDays : function(dd){
  64811. var picker = this.picker;
  64812. this.disabledDays = dd;
  64813. if (picker) {
  64814. picker.setDisabledDays(dd);
  64815. }
  64816. },
  64817. setMinValue : function(dt){
  64818. var me = this,
  64819. picker = me.picker,
  64820. minValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
  64821. me.minValue = minValue;
  64822. if (picker) {
  64823. picker.minText = Ext.String.format(me.minText, me.formatDate(me.minValue));
  64824. picker.setMinDate(minValue);
  64825. }
  64826. },
  64827. setMaxValue : function(dt){
  64828. var me = this,
  64829. picker = me.picker,
  64830. maxValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
  64831. me.maxValue = maxValue;
  64832. if (picker) {
  64833. picker.maxText = Ext.String.format(me.maxText, me.formatDate(me.maxValue));
  64834. picker.setMaxDate(maxValue);
  64835. }
  64836. },
  64837. getErrors: function(value) {
  64838. var me = this,
  64839. format = Ext.String.format,
  64840. clearTime = Ext.Date.clearTime,
  64841. errors = me.callParent(arguments),
  64842. disabledDays = me.disabledDays,
  64843. disabledDatesRE = me.disabledDatesRE,
  64844. minValue = me.minValue,
  64845. maxValue = me.maxValue,
  64846. len = disabledDays ? disabledDays.length : 0,
  64847. i = 0,
  64848. svalue,
  64849. fvalue,
  64850. day,
  64851. time;
  64852. value = me.formatDate(value || me.processRawValue(me.getRawValue()));
  64853. if (value === null || value.length < 1) {
  64854. return errors;
  64855. }
  64856. svalue = value;
  64857. value = me.parseDate(value);
  64858. if (!value) {
  64859. errors.push(format(me.invalidText, svalue, Ext.Date.unescapeFormat(me.format)));
  64860. return errors;
  64861. }
  64862. time = value.getTime();
  64863. if (minValue && time < clearTime(minValue).getTime()) {
  64864. errors.push(format(me.minText, me.formatDate(minValue)));
  64865. }
  64866. if (maxValue && time > clearTime(maxValue).getTime()) {
  64867. errors.push(format(me.maxText, me.formatDate(maxValue)));
  64868. }
  64869. if (disabledDays) {
  64870. day = value.getDay();
  64871. for(; i < len; i++) {
  64872. if (day === disabledDays[i]) {
  64873. errors.push(me.disabledDaysText);
  64874. break;
  64875. }
  64876. }
  64877. }
  64878. fvalue = me.formatDate(value);
  64879. if (disabledDatesRE && disabledDatesRE.test(fvalue)) {
  64880. errors.push(format(me.disabledDatesText, fvalue));
  64881. }
  64882. return errors;
  64883. },
  64884. rawToValue: function(rawValue) {
  64885. return this.parseDate(rawValue) || rawValue || null;
  64886. },
  64887. valueToRaw: function(value) {
  64888. return this.formatDate(this.parseDate(value));
  64889. },
  64890. safeParse : function(value, format) {
  64891. var me = this,
  64892. utilDate = Ext.Date,
  64893. result = null,
  64894. strict = me.useStrict,
  64895. parsedDate;
  64896. if (utilDate.formatContainsHourInfo(format)) {
  64897. result = utilDate.parse(value, format, strict);
  64898. } else {
  64899. parsedDate = utilDate.parse(value + ' ' + me.initTime, format + ' ' + me.initTimeFormat, strict);
  64900. if (parsedDate) {
  64901. result = utilDate.clearTime(parsedDate);
  64902. }
  64903. }
  64904. return result;
  64905. },
  64906. getSubmitValue: function() {
  64907. var format = this.submitFormat || this.format,
  64908. value = this.getValue();
  64909. return value ? Ext.Date.format(value, format) : '';
  64910. },
  64911. parseDate : function(value) {
  64912. if(!value || Ext.isDate(value)){
  64913. return value;
  64914. }
  64915. var me = this,
  64916. val = me.safeParse(value, me.format),
  64917. altFormats = me.altFormats,
  64918. altFormatsArray = me.altFormatsArray,
  64919. i = 0,
  64920. len;
  64921. if (!val && altFormats) {
  64922. altFormatsArray = altFormatsArray || altFormats.split('|');
  64923. len = altFormatsArray.length;
  64924. for (; i < len && !val; ++i) {
  64925. val = me.safeParse(value, altFormatsArray[i]);
  64926. }
  64927. }
  64928. return val;
  64929. },
  64930. formatDate : function(date){
  64931. return Ext.isDate(date) ? Ext.Date.dateFormat(date, this.format) : date;
  64932. },
  64933. createPicker: function() {
  64934. var me = this,
  64935. format = Ext.String.format;
  64936. return new Ext.picker.Date({
  64937. pickerField: me,
  64938. ownerCt: me.ownerCt,
  64939. renderTo: document.body,
  64940. floating: true,
  64941. hidden: true,
  64942. focusOnShow: true,
  64943. minDate: me.minValue,
  64944. maxDate: me.maxValue,
  64945. disabledDatesRE: me.disabledDatesRE,
  64946. disabledDatesText: me.disabledDatesText,
  64947. disabledDays: me.disabledDays,
  64948. disabledDaysText: me.disabledDaysText,
  64949. format: me.format,
  64950. showToday: me.showToday,
  64951. startDay: me.startDay,
  64952. minText: format(me.minText, me.formatDate(me.minValue)),
  64953. maxText: format(me.maxText, me.formatDate(me.maxValue)),
  64954. listeners: {
  64955. scope: me,
  64956. select: me.onSelect
  64957. },
  64958. keyNavConfig: {
  64959. esc: function() {
  64960. me.collapse();
  64961. }
  64962. }
  64963. });
  64964. },
  64965. onSelect: function(m, d) {
  64966. var me = this;
  64967. me.setValue(d);
  64968. me.fireEvent('select', me, d);
  64969. me.collapse();
  64970. },
  64971. onExpand: function() {
  64972. var value = this.getValue();
  64973. this.picker.setValue(Ext.isDate(value) ? value : new Date());
  64974. },
  64975. onCollapse: function() {
  64976. this.focus(false, 60);
  64977. },
  64978. beforeBlur : function(){
  64979. var me = this,
  64980. v = me.parseDate(me.getRawValue()),
  64981. focusTask = me.focusTask;
  64982. if (focusTask) {
  64983. focusTask.cancel();
  64984. }
  64985. if (v) {
  64986. me.setValue(v);
  64987. }
  64988. }
  64989. });
  64990. Ext.define("Ext.form.field.File", {
  64991. extend: 'Ext.form.field.Trigger',
  64992. alias: ['widget.filefield', 'widget.fileuploadfield'],
  64993. alternateClassName: ['Ext.form.FileUploadField', 'Ext.ux.form.FileUploadField', 'Ext.form.File'],
  64994. uses: ['Ext.button.Button', 'Ext.layout.component.field.Field'],
  64995. buttonText: 'Browse...',
  64996. buttonOnly: false,
  64997. buttonMargin: 3,
  64998. fieldBodyCls: Ext.baseCSSPrefix + 'form-file-wrap',
  64999. readOnly: true,
  65000. triggerNoEditCls: '',
  65001. componentLayout: 'triggerfield',
  65002. childEls: ['fileInputEl', 'buttonEl', 'buttonEl-btnEl', 'browseButtonWrap'],
  65003. onRender: function() {
  65004. var me = this,
  65005. inputEl;
  65006. me.callParent(arguments);
  65007. inputEl = me.inputEl;
  65008. inputEl.dom.name = '';
  65009. me.fileInputEl.dom.name = me.getName();
  65010. me.fileInputEl.on({
  65011. scope: me,
  65012. change: me.onFileChange
  65013. });
  65014. if (me.buttonOnly) {
  65015. me.inputCell.setDisplayed(false);
  65016. }
  65017. me.browseButtonWrap.dom.style.width = (me.browseButtonWrap.dom.lastChild.offsetWidth + me.buttonEl.getMargin('lr')) + 'px';
  65018. if (Ext.isIE) {
  65019. me.buttonEl.repaint();
  65020. }
  65021. },
  65022. getTriggerMarkup: function() {
  65023. var me = this,
  65024. result,
  65025. btn = Ext.widget('button', Ext.apply({
  65026. id: me.id + '-buttonEl',
  65027. ui: me.ui,
  65028. disabled: me.disabled,
  65029. text: me.buttonText,
  65030. cls: Ext.baseCSSPrefix + 'form-file-btn',
  65031. preventDefault: false,
  65032. style: me.buttonOnly ? '' : 'margin-left:' + me.buttonMargin + 'px'
  65033. }, me.buttonConfig)),
  65034. btnCfg = btn.getRenderTree(),
  65035. inputElCfg = {
  65036. id: me.id + '-fileInputEl',
  65037. cls: Ext.baseCSSPrefix + 'form-file-input',
  65038. tag: 'input',
  65039. type: 'file',
  65040. size: 1
  65041. };
  65042. if (me.disabled) {
  65043. inputElCfg.disabled = true;
  65044. }
  65045. btnCfg.cn = inputElCfg;
  65046. result = '<td id="' + me.id + '-browseButtonWrap">' + Ext.DomHelper.markup(btnCfg) + '</td>';
  65047. btn.destroy();
  65048. return result;
  65049. },
  65050. createFileInput : function() {
  65051. var me = this;
  65052. me.fileInputEl = me.buttonEl.createChild({
  65053. name: me.getName(),
  65054. id: me.id + '-fileInputEl',
  65055. cls: Ext.baseCSSPrefix + 'form-file-input',
  65056. tag: 'input',
  65057. type: 'file',
  65058. size: 1
  65059. });
  65060. me.fileInputEl.on({
  65061. scope: me,
  65062. change: me.onFileChange
  65063. });
  65064. },
  65065. onFileChange: function() {
  65066. this.lastValue = null;
  65067. Ext.form.field.File.superclass.setValue.call(this, this.fileInputEl.dom.value);
  65068. },
  65069. setValue: Ext.emptyFn,
  65070. reset : function(){
  65071. var me = this;
  65072. if (me.rendered) {
  65073. me.fileInputEl.remove();
  65074. me.createFileInput();
  65075. me.inputEl.dom.value = '';
  65076. }
  65077. me.callParent();
  65078. },
  65079. onDisable: function(){
  65080. this.callParent();
  65081. this.disableItems();
  65082. },
  65083. disableItems: function(){
  65084. var file = this.fileInputEl;
  65085. if (file) {
  65086. file.dom.disabled = true;
  65087. }
  65088. this['buttonEl-btnEl'].dom.disabled = true;
  65089. },
  65090. onEnable: function(){
  65091. var me = this;
  65092. me.callParent();
  65093. me.fileInputEl.dom.disabled = false;
  65094. this['buttonEl-btnEl'].dom.disabled = false;
  65095. },
  65096. isFileUpload: function() {
  65097. return true;
  65098. },
  65099. extractFileInput: function() {
  65100. var fileInput = this.fileInputEl.dom;
  65101. this.reset();
  65102. return fileInput;
  65103. },
  65104. onDestroy: function(){
  65105. Ext.destroyMembers(this, 'fileInputEl', 'buttonEl');
  65106. this.callParent();
  65107. }
  65108. });
  65109. Ext.define('Ext.form.field.Hidden', {
  65110. extend:'Ext.form.field.Base',
  65111. alias: ['widget.hiddenfield', 'widget.hidden'],
  65112. alternateClassName: 'Ext.form.Hidden',
  65113. inputType : 'hidden',
  65114. hideLabel: true,
  65115. initComponent: function(){
  65116. this.formItemCls += '-hidden';
  65117. this.callParent();
  65118. },
  65119. isEqual: function(value1, value2) {
  65120. return this.isEqualAsString(value1, value2);
  65121. },
  65122. initEvents: Ext.emptyFn,
  65123. setSize : Ext.emptyFn,
  65124. setWidth : Ext.emptyFn,
  65125. setHeight : Ext.emptyFn,
  65126. setPosition : Ext.emptyFn,
  65127. setPagePosition : Ext.emptyFn,
  65128. markInvalid : Ext.emptyFn,
  65129. clearInvalid : Ext.emptyFn
  65130. });
  65131. Ext.define('Ext.layout.component.field.HtmlEditor', {
  65132. extend: 'Ext.layout.component.field.Field',
  65133. alias: ['layout.htmleditor'],
  65134. type: 'htmleditor',
  65135. toolbarSizePolicy: {
  65136. setsWidth: 0,
  65137. setsHeight: 0
  65138. },
  65139. beginLayout: function(ownerContext) {
  65140. this.callParent(arguments);
  65141. ownerContext.textAreaContext = ownerContext.getEl('textareaEl');
  65142. ownerContext.iframeContext = ownerContext.getEl('iframeEl');
  65143. ownerContext.toolbarContext = ownerContext.context.getCmp(this.owner.getToolbar());
  65144. },
  65145. renderItems: Ext.emptyFn,
  65146. getItemSizePolicy: function (item) {
  65147. return this.toolbarSizePolicy;
  65148. },
  65149. getLayoutItems: function () {
  65150. var toolbar = this.owner.getToolbar();
  65151. return toolbar ? [toolbar] : [];
  65152. },
  65153. getRenderTarget: function() {
  65154. return this.owner.bodyEl;
  65155. },
  65156. publishInnerHeight: function (ownerContext, height) {
  65157. var me = this,
  65158. innerHeight = height - me.measureLabelErrorHeight(ownerContext) -
  65159. ownerContext.toolbarContext.getProp('height') -
  65160. ownerContext.bodyCellContext.getPaddingInfo().height;
  65161. if (Ext.isNumber(innerHeight)) {
  65162. ownerContext.textAreaContext.setHeight(innerHeight);
  65163. ownerContext.iframeContext.setHeight(innerHeight);
  65164. } else {
  65165. me.done = false;
  65166. }
  65167. }
  65168. });
  65169. Ext.define('Ext.picker.Color', {
  65170. extend: 'Ext.Component',
  65171. requires: 'Ext.XTemplate',
  65172. alias: 'widget.colorpicker',
  65173. alternateClassName: 'Ext.ColorPalette',
  65174. componentCls : Ext.baseCSSPrefix + 'color-picker',
  65175. selectedCls: Ext.baseCSSPrefix + 'color-picker-selected',
  65176. value : null,
  65177. clickEvent :'click',
  65178. allowReselect : false,
  65179. colors : [
  65180. '000000', '993300', '333300', '003300', '003366', '000080', '333399', '333333',
  65181. '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080',
  65182. 'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '969696',
  65183. 'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0',
  65184. 'FF99CC', 'FFCC99', 'FFFF99', 'CCFFCC', 'CCFFFF', '99CCFF', 'CC99FF', 'FFFFFF'
  65185. ],
  65186. colorRe: /(?:^|\s)color-(.{6})(?:\s|$)/,
  65187. renderTpl: [
  65188. '<tpl for="colors">',
  65189. '<a href="#" class="color-{.}" hidefocus="on">',
  65190. '<em><span style="background:#{.}" unselectable="on">&#160;</span></em>',
  65191. '</a>',
  65192. '</tpl>'
  65193. ],
  65194. initComponent : function(){
  65195. var me = this;
  65196. me.callParent(arguments);
  65197. me.addEvents(
  65198. 'select'
  65199. );
  65200. if (me.handler) {
  65201. me.on('select', me.handler, me.scope, true);
  65202. }
  65203. },
  65204. initRenderData : function(){
  65205. var me = this;
  65206. return Ext.apply(me.callParent(), {
  65207. itemCls: me.itemCls,
  65208. colors: me.colors
  65209. });
  65210. },
  65211. onRender : function(){
  65212. var me = this,
  65213. clickEvent = me.clickEvent;
  65214. me.callParent(arguments);
  65215. me.mon(me.el, clickEvent, me.handleClick, me, {delegate: 'a'});
  65216. if(clickEvent != 'click'){
  65217. me.mon(me.el, 'click', Ext.emptyFn, me, {delegate: 'a', stopEvent: true});
  65218. }
  65219. },
  65220. afterRender : function(){
  65221. var me = this,
  65222. value;
  65223. me.callParent(arguments);
  65224. if (me.value) {
  65225. value = me.value;
  65226. me.value = null;
  65227. me.select(value, true);
  65228. }
  65229. },
  65230. handleClick : function(event, target){
  65231. var me = this,
  65232. color;
  65233. event.stopEvent();
  65234. if (!me.disabled) {
  65235. color = target.className.match(me.colorRe)[1];
  65236. me.select(color.toUpperCase());
  65237. }
  65238. },
  65239. select : function(color, suppressEvent){
  65240. var me = this,
  65241. selectedCls = me.selectedCls,
  65242. value = me.value,
  65243. el;
  65244. color = color.replace('#', '');
  65245. if (!me.rendered) {
  65246. me.value = color;
  65247. return;
  65248. }
  65249. if (color != value || me.allowReselect) {
  65250. el = me.el;
  65251. if (me.value) {
  65252. el.down('a.color-' + value).removeCls(selectedCls);
  65253. }
  65254. el.down('a.color-' + color).addCls(selectedCls);
  65255. me.value = color;
  65256. if (suppressEvent !== true) {
  65257. me.fireEvent('select', me, color);
  65258. }
  65259. }
  65260. },
  65261. getValue: function(){
  65262. return this.value || null;
  65263. }
  65264. });
  65265. Ext.define('Ext.form.field.HtmlEditor', {
  65266. extend:'Ext.Component',
  65267. mixins: {
  65268. labelable: 'Ext.form.Labelable',
  65269. field: 'Ext.form.field.Field'
  65270. },
  65271. alias: 'widget.htmleditor',
  65272. alternateClassName: 'Ext.form.HtmlEditor',
  65273. requires: [
  65274. 'Ext.tip.QuickTipManager',
  65275. 'Ext.picker.Color',
  65276. 'Ext.toolbar.Item',
  65277. 'Ext.toolbar.Toolbar',
  65278. 'Ext.util.Format',
  65279. 'Ext.layout.component.field.HtmlEditor'
  65280. ],
  65281. childEls: [
  65282. 'iframeEl', 'textareaEl'
  65283. ],
  65284. fieldSubTpl: [
  65285. '{beforeTextAreaTpl}',
  65286. '<textarea id="{cmpId}-textareaEl" name="{name}" tabIndex="-1" {inputAttrTpl}',
  65287. ' class="{textareaCls}" style="{size}" autocomplete="off">',
  65288. '{[Ext.util.Format.htmlEncode(values.value)]}',
  65289. '</textarea>',
  65290. '{afterTextAreaTpl}',
  65291. '{beforeIFrameTpl}',
  65292. '<iframe id="{cmpId}-iframeEl" name="{iframeName}" frameBorder="0" {iframeAttrTpl}',
  65293. ' style="overflow:auto;{size}" src="{iframeSrc}"></iframe>',
  65294. '{afterIFrameTpl}',
  65295. {
  65296. disableFormats: true
  65297. }
  65298. ],
  65299. subTplInsertions: [
  65300. 'beforeTextAreaTpl',
  65301. 'afterTextAreaTpl',
  65302. 'beforeIFrameTpl',
  65303. 'afterIFrameTpl',
  65304. 'iframeAttrTpl',
  65305. 'inputAttrTpl'
  65306. ],
  65307. enableFormat : true,
  65308. enableFontSize : true,
  65309. enableColors : true,
  65310. enableAlignments : true,
  65311. enableLists : true,
  65312. enableSourceEdit : true,
  65313. enableLinks : true,
  65314. enableFont : true,
  65315. createLinkText : 'Please enter the URL for the link:',
  65316. defaultLinkValue : 'http:/'+'/',
  65317. fontFamilies : [
  65318. 'Arial',
  65319. 'Courier New',
  65320. 'Tahoma',
  65321. 'Times New Roman',
  65322. 'Verdana'
  65323. ],
  65324. defaultFont: 'tahoma',
  65325. defaultValue: (Ext.isOpera || Ext.isIE6) ? '&#160;' : '&#8203;',
  65326. editorWrapCls: Ext.baseCSSPrefix + 'html-editor-wrap',
  65327. componentLayout: 'htmleditor',
  65328. initialized : false,
  65329. activated : false,
  65330. sourceEditMode : false,
  65331. iframePad:3,
  65332. hideMode:'offsets',
  65333. afterBodyEl: '</div>',
  65334. maskOnDisable: true,
  65335. initComponent : function(){
  65336. var me = this;
  65337. me.addEvents(
  65338. 'initialize',
  65339. 'activate',
  65340. 'beforesync',
  65341. 'beforepush',
  65342. 'sync',
  65343. 'push',
  65344. 'editmodechange'
  65345. );
  65346. me.callParent(arguments);
  65347. me.createToolbar(me);
  65348. me.initLabelable();
  65349. me.initField();
  65350. },
  65351. getRefItems: function() {
  65352. return [ this.toolbar ];
  65353. },
  65354. createToolbar : function(editor){
  65355. var me = this,
  65356. items = [], i,
  65357. tipsEnabled = Ext.tip.QuickTipManager && Ext.tip.QuickTipManager.isEnabled(),
  65358. baseCSSPrefix = Ext.baseCSSPrefix,
  65359. fontSelectItem, toolbar, undef;
  65360. function btn(id, toggle, handler){
  65361. return {
  65362. itemId : id,
  65363. cls : baseCSSPrefix + 'btn-icon',
  65364. iconCls: baseCSSPrefix + 'edit-'+id,
  65365. enableToggle:toggle !== false,
  65366. scope: editor,
  65367. handler:handler||editor.relayBtnCmd,
  65368. clickEvent: 'mousedown',
  65369. tooltip: tipsEnabled ? editor.buttonTips[id] || undef : undef,
  65370. overflowText: editor.buttonTips[id].title || undef,
  65371. tabIndex: -1
  65372. };
  65373. }
  65374. if (me.enableFont && !Ext.isSafari2) {
  65375. fontSelectItem = Ext.widget('component', {
  65376. renderTpl: [
  65377. '<select id="{id}-selectEl" class="{cls}">',
  65378. '<tpl for="fonts">',
  65379. '<option value="{[values.toLowerCase()]}" style="font-family:{.}"<tpl if="values.toLowerCase()==parent.defaultFont"> selected</tpl>>{.}</option>',
  65380. '</tpl>',
  65381. '</select>'
  65382. ],
  65383. renderData: {
  65384. cls: baseCSSPrefix + 'font-select',
  65385. fonts: me.fontFamilies,
  65386. defaultFont: me.defaultFont
  65387. },
  65388. childEls: ['selectEl'],
  65389. afterRender: function() {
  65390. me.fontSelect = this.selectEl;
  65391. Ext.Component.prototype.afterRender.apply(this, arguments);
  65392. },
  65393. onDisable: function() {
  65394. var selectEl = this.selectEl;
  65395. if (selectEl) {
  65396. selectEl.dom.disabled = true;
  65397. }
  65398. Ext.Component.prototype.onDisable.apply(this, arguments);
  65399. },
  65400. onEnable: function() {
  65401. var selectEl = this.selectEl;
  65402. if (selectEl) {
  65403. selectEl.dom.disabled = false;
  65404. }
  65405. Ext.Component.prototype.onEnable.apply(this, arguments);
  65406. },
  65407. listeners: {
  65408. change: function() {
  65409. me.relayCmd('fontname', me.fontSelect.dom.value);
  65410. me.deferFocus();
  65411. },
  65412. element: 'selectEl'
  65413. }
  65414. });
  65415. items.push(
  65416. fontSelectItem,
  65417. '-'
  65418. );
  65419. }
  65420. if (me.enableFormat) {
  65421. items.push(
  65422. btn('bold'),
  65423. btn('italic'),
  65424. btn('underline')
  65425. );
  65426. }
  65427. if (me.enableFontSize) {
  65428. items.push(
  65429. '-',
  65430. btn('increasefontsize', false, me.adjustFont),
  65431. btn('decreasefontsize', false, me.adjustFont)
  65432. );
  65433. }
  65434. if (me.enableColors) {
  65435. items.push(
  65436. '-', {
  65437. itemId: 'forecolor',
  65438. cls: baseCSSPrefix + 'btn-icon',
  65439. iconCls: baseCSSPrefix + 'edit-forecolor',
  65440. overflowText: editor.buttonTips.forecolor.title,
  65441. tooltip: tipsEnabled ? editor.buttonTips.forecolor || undef : undef,
  65442. tabIndex:-1,
  65443. menu : Ext.widget('menu', {
  65444. plain: true,
  65445. items: [{
  65446. xtype: 'colorpicker',
  65447. allowReselect: true,
  65448. focus: Ext.emptyFn,
  65449. value: '000000',
  65450. plain: true,
  65451. clickEvent: 'mousedown',
  65452. handler: function(cp, color) {
  65453. me.execCmd('forecolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
  65454. me.deferFocus();
  65455. this.up('menu').hide();
  65456. }
  65457. }]
  65458. })
  65459. }, {
  65460. itemId: 'backcolor',
  65461. cls: baseCSSPrefix + 'btn-icon',
  65462. iconCls: baseCSSPrefix + 'edit-backcolor',
  65463. overflowText: editor.buttonTips.backcolor.title,
  65464. tooltip: tipsEnabled ? editor.buttonTips.backcolor || undef : undef,
  65465. tabIndex:-1,
  65466. menu : Ext.widget('menu', {
  65467. plain: true,
  65468. items: [{
  65469. xtype: 'colorpicker',
  65470. focus: Ext.emptyFn,
  65471. value: 'FFFFFF',
  65472. plain: true,
  65473. allowReselect: true,
  65474. clickEvent: 'mousedown',
  65475. handler: function(cp, color) {
  65476. if (Ext.isGecko) {
  65477. me.execCmd('useCSS', false);
  65478. me.execCmd('hilitecolor', color);
  65479. me.execCmd('useCSS', true);
  65480. me.deferFocus();
  65481. } else {
  65482. me.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
  65483. me.deferFocus();
  65484. }
  65485. this.up('menu').hide();
  65486. }
  65487. }]
  65488. })
  65489. }
  65490. );
  65491. }
  65492. if (me.enableAlignments) {
  65493. items.push(
  65494. '-',
  65495. btn('justifyleft'),
  65496. btn('justifycenter'),
  65497. btn('justifyright')
  65498. );
  65499. }
  65500. if (!Ext.isSafari2) {
  65501. if (me.enableLinks) {
  65502. items.push(
  65503. '-',
  65504. btn('createlink', false, me.createLink)
  65505. );
  65506. }
  65507. if (me.enableLists) {
  65508. items.push(
  65509. '-',
  65510. btn('insertorderedlist'),
  65511. btn('insertunorderedlist')
  65512. );
  65513. }
  65514. if (me.enableSourceEdit) {
  65515. items.push(
  65516. '-',
  65517. btn('sourceedit', true, function(btn){
  65518. me.toggleSourceEdit(!me.sourceEditMode);
  65519. })
  65520. );
  65521. }
  65522. }
  65523. for (i = 0; i < items.length; i++) {
  65524. if (items[i].itemId !== 'sourceedit') {
  65525. items[i].disabled = true;
  65526. }
  65527. }
  65528. toolbar = Ext.widget('toolbar', {
  65529. id: me.id + '-toolbar',
  65530. ownerCt: me,
  65531. cls: Ext.baseCSSPrefix + 'html-editor-tb',
  65532. enableOverflow: true,
  65533. items: items,
  65534. ownerLayout: me.getComponentLayout(),
  65535. listeners: {
  65536. click: function(e){
  65537. e.preventDefault();
  65538. },
  65539. element: 'el'
  65540. }
  65541. });
  65542. me.toolbar = toolbar;
  65543. },
  65544. getMaskTarget: function(){
  65545. return this.bodyEl;
  65546. },
  65547. setReadOnly: function(readOnly) {
  65548. var me = this,
  65549. textareaEl = me.textareaEl,
  65550. iframeEl = me.iframeEl,
  65551. body;
  65552. me.readOnly = readOnly;
  65553. if (textareaEl) {
  65554. textareaEl.dom.readOnly = readOnly;
  65555. }
  65556. if (me.initialized) {
  65557. body = me.getEditorBody();
  65558. if (Ext.isIE) {
  65559. iframeEl.setDisplayed(false);
  65560. body.contentEditable = !readOnly;
  65561. iframeEl.setDisplayed(true);
  65562. } else {
  65563. me.setDesignMode(!readOnly);
  65564. }
  65565. if (body) {
  65566. body.style.cursor = readOnly ? 'default' : 'text';
  65567. }
  65568. me.disableItems(readOnly);
  65569. }
  65570. },
  65571. getDocMarkup: function() {
  65572. var me = this,
  65573. h = me.iframeEl.getHeight() - me.iframePad * 2;
  65574. return Ext.String.format('<html><head><style type="text/css">body{border:0;margin:0;padding:{0}px;height:{1}px;box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;cursor:text}</style></head><body></body></html>', me.iframePad, h);
  65575. },
  65576. getEditorBody: function() {
  65577. var doc = this.getDoc();
  65578. return doc.body || doc.documentElement;
  65579. },
  65580. getDoc: function() {
  65581. return (!Ext.isIE && this.iframeEl.dom.contentDocument) || this.getWin().document;
  65582. },
  65583. getWin: function() {
  65584. return Ext.isIE ? this.iframeEl.dom.contentWindow : window.frames[this.iframeEl.dom.name];
  65585. },
  65586. finishRenderChildren: function () {
  65587. this.callParent();
  65588. this.toolbar.finishRender();
  65589. },
  65590. onRender: function() {
  65591. var me = this;
  65592. me.callParent(arguments);
  65593. me.inputEl = me.iframeEl;
  65594. me.monitorTask = Ext.TaskManager.start({
  65595. run: me.checkDesignMode,
  65596. scope: me,
  65597. interval: 100
  65598. });
  65599. },
  65600. initRenderTpl: function() {
  65601. var me = this;
  65602. if (!me.hasOwnProperty('renderTpl')) {
  65603. me.renderTpl = me.getTpl('labelableRenderTpl');
  65604. }
  65605. return me.callParent();
  65606. },
  65607. initRenderData: function() {
  65608. this.beforeSubTpl = '<div class="' + this.editorWrapCls + '">' + Ext.DomHelper.markup(this.toolbar.getRenderTree());
  65609. return Ext.applyIf(this.callParent(), this.getLabelableRenderData());
  65610. },
  65611. getSubTplData: function() {
  65612. return {
  65613. $comp : this,
  65614. cmpId : this.id,
  65615. id : this.getInputId(),
  65616. textareaCls : Ext.baseCSSPrefix + 'hidden',
  65617. value : this.value,
  65618. iframeName : Ext.id(),
  65619. iframeSrc : Ext.SSL_SECURE_URL,
  65620. size : 'height:100px;width:100%'
  65621. };
  65622. },
  65623. getSubTplMarkup: function() {
  65624. return this.getTpl('fieldSubTpl').apply(this.getSubTplData());
  65625. },
  65626. initFrameDoc: function() {
  65627. var me = this,
  65628. doc, task;
  65629. Ext.TaskManager.stop(me.monitorTask);
  65630. doc = me.getDoc();
  65631. me.win = me.getWin();
  65632. doc.open();
  65633. doc.write(me.getDocMarkup());
  65634. doc.close();
  65635. task = {
  65636. run: function() {
  65637. var doc = me.getDoc();
  65638. if (doc.body || doc.readyState === 'complete') {
  65639. Ext.TaskManager.stop(task);
  65640. me.setDesignMode(true);
  65641. Ext.defer(me.initEditor, 10, me);
  65642. }
  65643. },
  65644. interval : 10,
  65645. duration:10000,
  65646. scope: me
  65647. };
  65648. Ext.TaskManager.start(task);
  65649. },
  65650. checkDesignMode: function() {
  65651. var me = this,
  65652. doc = me.getDoc();
  65653. if (doc && (!doc.editorInitialized || me.getDesignMode() !== 'on')) {
  65654. me.initFrameDoc();
  65655. }
  65656. },
  65657. setDesignMode: function(mode) {
  65658. var me = this,
  65659. doc = me.getDoc();
  65660. if (doc) {
  65661. if (me.readOnly) {
  65662. mode = false;
  65663. }
  65664. doc.designMode = (/on|true/i).test(String(mode).toLowerCase()) ?'on':'off';
  65665. }
  65666. },
  65667. getDesignMode: function() {
  65668. var doc = this.getDoc();
  65669. return !doc ? '' : String(doc.designMode).toLowerCase();
  65670. },
  65671. disableItems: function(disabled) {
  65672. var items = this.getToolbar().items.items,
  65673. i,
  65674. iLen = items.length,
  65675. item;
  65676. for (i = 0; i < iLen; i++) {
  65677. item = items[i];
  65678. if (item.getItemId() !== 'sourceedit') {
  65679. item.setDisabled(disabled);
  65680. }
  65681. }
  65682. },
  65683. toggleSourceEdit: function(sourceEditMode) {
  65684. var me = this,
  65685. iframe = me.iframeEl,
  65686. textarea = me.textareaEl,
  65687. hiddenCls = Ext.baseCSSPrefix + 'hidden',
  65688. btn = me.getToolbar().getComponent('sourceedit');
  65689. if (!Ext.isBoolean(sourceEditMode)) {
  65690. sourceEditMode = !me.sourceEditMode;
  65691. }
  65692. me.sourceEditMode = sourceEditMode;
  65693. if (btn.pressed !== sourceEditMode) {
  65694. btn.toggle(sourceEditMode);
  65695. }
  65696. if (sourceEditMode) {
  65697. me.disableItems(true);
  65698. me.syncValue();
  65699. iframe.addCls(hiddenCls);
  65700. textarea.removeCls(hiddenCls);
  65701. textarea.dom.removeAttribute('tabIndex');
  65702. textarea.focus();
  65703. me.inputEl = textarea;
  65704. }
  65705. else {
  65706. if (me.initialized) {
  65707. me.disableItems(me.readOnly);
  65708. }
  65709. me.pushValue();
  65710. iframe.removeCls(hiddenCls);
  65711. textarea.addCls(hiddenCls);
  65712. textarea.dom.setAttribute('tabIndex', -1);
  65713. me.deferFocus();
  65714. me.inputEl = iframe;
  65715. }
  65716. me.fireEvent('editmodechange', me, sourceEditMode);
  65717. me.updateLayout();
  65718. },
  65719. createLink : function() {
  65720. var url = prompt(this.createLinkText, this.defaultLinkValue);
  65721. if (url && url !== 'http:/'+'/') {
  65722. this.relayCmd('createlink', url);
  65723. }
  65724. },
  65725. clearInvalid: Ext.emptyFn,
  65726. setValue: function(value) {
  65727. var me = this,
  65728. textarea = me.textareaEl;
  65729. me.mixins.field.setValue.call(me, value);
  65730. if (value === null || value === undefined) {
  65731. value = '';
  65732. }
  65733. if (textarea) {
  65734. textarea.dom.value = value;
  65735. }
  65736. me.pushValue();
  65737. return this;
  65738. },
  65739. cleanHtml: function(html) {
  65740. html = String(html);
  65741. if (Ext.isWebKit) {
  65742. html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');
  65743. }
  65744. if (html.charCodeAt(0) === parseInt(this.defaultValue.replace(/\D/g, ''), 10)) {
  65745. html = html.substring(1);
  65746. }
  65747. return html;
  65748. },
  65749. syncValue : function(){
  65750. var me = this,
  65751. body, changed, html, bodyStyle, match;
  65752. if (me.initialized) {
  65753. body = me.getEditorBody();
  65754. html = body.innerHTML;
  65755. if (Ext.isWebKit) {
  65756. bodyStyle = body.getAttribute('style');
  65757. match = bodyStyle.match(/text-align:(.*?);/i);
  65758. if (match && match[1]) {
  65759. html = '<div style="' + match[0] + '">' + html + '</div>';
  65760. }
  65761. }
  65762. html = me.cleanHtml(html);
  65763. if (me.fireEvent('beforesync', me, html) !== false) {
  65764. if (me.textareaEl.dom.value != html) {
  65765. me.textareaEl.dom.value = html;
  65766. changed = true;
  65767. }
  65768. me.fireEvent('sync', me, html);
  65769. if (changed) {
  65770. me.checkChange();
  65771. }
  65772. }
  65773. }
  65774. },
  65775. getValue : function() {
  65776. var me = this,
  65777. value;
  65778. if (!me.sourceEditMode) {
  65779. me.syncValue();
  65780. }
  65781. value = me.rendered ? me.textareaEl.dom.value : me.value;
  65782. me.value = value;
  65783. return value;
  65784. },
  65785. pushValue: function() {
  65786. var me = this,
  65787. v;
  65788. if(me.initialized){
  65789. v = me.textareaEl.dom.value || '';
  65790. if (!me.activated && v.length < 1) {
  65791. v = me.defaultValue;
  65792. }
  65793. if (me.fireEvent('beforepush', me, v) !== false) {
  65794. me.getEditorBody().innerHTML = v;
  65795. if (Ext.isGecko) {
  65796. me.setDesignMode(false);
  65797. me.setDesignMode(true);
  65798. }
  65799. me.fireEvent('push', me, v);
  65800. }
  65801. }
  65802. },
  65803. deferFocus : function(){
  65804. this.focus(false, true);
  65805. },
  65806. getFocusEl: function() {
  65807. var me = this,
  65808. win = me.win;
  65809. return win && !me.sourceEditMode ? win : me.textareaEl;
  65810. },
  65811. onBodyKeyup : Ext.emptyFn,
  65812. initEditor : function(){
  65813. try {
  65814. var me = this,
  65815. dbody = me.getEditorBody(),
  65816. ss = me.textareaEl.getStyles('font-size', 'font-family', 'background-image', 'background-repeat', 'background-color', 'color'),
  65817. doc,
  65818. fn;
  65819. ss['background-attachment'] = 'fixed';
  65820. dbody.bgProperties = 'fixed';
  65821. Ext.DomHelper.applyStyles(dbody, ss);
  65822. doc = me.getDoc();
  65823. if (doc) {
  65824. try {
  65825. Ext.EventManager.removeAll(doc);
  65826. } catch(e) {}
  65827. }
  65828. fn = Ext.Function.bind(me.onEditorEvent, me);
  65829. Ext.EventManager.on(doc, {
  65830. mousedown: fn,
  65831. dblclick: fn,
  65832. click: fn,
  65833. keyup: fn,
  65834. buffer:100
  65835. });
  65836. /*Ext.EventManager.on(doc, {
  65837. keyup: function(){
  65838. console.log(2);
  65839. },
  65840. buffer:100
  65841. });*/
  65842. fn = me.onRelayedEvent;
  65843. Ext.EventManager.on(doc, {
  65844. mousedown: fn,
  65845. mousemove: fn,
  65846. mouseup: fn,
  65847. click: fn,
  65848. dblclick: fn,
  65849. scope: me
  65850. });
  65851. if (Ext.isGecko) {
  65852. Ext.EventManager.on(doc, 'keypress', me.applyCommand, me);
  65853. }
  65854. if (me.fixKeys) {
  65855. Ext.EventManager.on(doc, 'keydown', me.fixKeys, me);
  65856. }
  65857. Ext.EventManager.on(window, 'unload', me.beforeDestroy, me);
  65858. doc.editorInitialized = true;
  65859. me.initialized = true;
  65860. me.pushValue();
  65861. me.setReadOnly(me.readOnly);
  65862. me.fireEvent('initialize', me);
  65863. } catch(ex) {
  65864. }
  65865. },
  65866. beforeDestroy : function(){
  65867. var me = this,
  65868. monitorTask = me.monitorTask,
  65869. doc, prop;
  65870. if (monitorTask) {
  65871. Ext.TaskManager.stop(monitorTask);
  65872. }
  65873. if (me.rendered) {
  65874. try {
  65875. doc = me.getDoc();
  65876. if (doc) {
  65877. Ext.EventManager.removeAll(Ext.fly(doc));
  65878. for (prop in doc) {
  65879. if (doc.hasOwnProperty && doc.hasOwnProperty(prop)) {
  65880. delete doc[prop];
  65881. }
  65882. }
  65883. }
  65884. } catch(e) {
  65885. }
  65886. Ext.destroyMembers(me, 'toolbar', 'iframeEl', 'textareaEl');
  65887. }
  65888. me.callParent();
  65889. },
  65890. onRelayedEvent: function (event) {
  65891. var iframeEl = this.iframeEl,
  65892. iframeXY = iframeEl.getXY(),
  65893. eventXY = event.getXY();
  65894. event.xy = [iframeXY[0] + eventXY[0], iframeXY[1] + eventXY[1]];
  65895. event.injectEvent(iframeEl);
  65896. event.xy = eventXY;
  65897. },
  65898. onFirstFocus : function(){
  65899. var me = this,
  65900. selection, range;
  65901. me.activated = true;
  65902. me.disableItems(me.readOnly);
  65903. if (Ext.isGecko) {
  65904. me.win.focus();
  65905. selection = me.win.getSelection();
  65906. if (!selection.focusNode || selection.focusNode.nodeType !== 3) {
  65907. range = selection.getRangeAt(0);
  65908. range.selectNodeContents(me.getEditorBody());
  65909. range.collapse(true);
  65910. me.deferFocus();
  65911. }
  65912. try {
  65913. me.execCmd('useCSS', true);
  65914. me.execCmd('styleWithCSS', false);
  65915. } catch(e) {
  65916. }
  65917. }
  65918. me.fireEvent('activate', me);
  65919. },
  65920. adjustFont: function(btn) {
  65921. var adjust = btn.getItemId() === 'increasefontsize' ? 1 : -1,
  65922. size = this.getDoc().queryCommandValue('FontSize') || '2',
  65923. isPxSize = Ext.isString(size) && size.indexOf('px') !== -1,
  65924. isSafari;
  65925. size = parseInt(size, 10);
  65926. if (isPxSize) {
  65927. if (size <= 10) {
  65928. size = 1 + adjust;
  65929. }
  65930. else if (size <= 13) {
  65931. size = 2 + adjust;
  65932. }
  65933. else if (size <= 16) {
  65934. size = 3 + adjust;
  65935. }
  65936. else if (size <= 18) {
  65937. size = 4 + adjust;
  65938. }
  65939. else if (size <= 24) {
  65940. size = 5 + adjust;
  65941. }
  65942. else {
  65943. size = 6 + adjust;
  65944. }
  65945. size = Ext.Number.constrain(size, 1, 6);
  65946. } else {
  65947. isSafari = Ext.isSafari;
  65948. if (isSafari) {
  65949. adjust *= 2;
  65950. }
  65951. size = Math.max(1, size + adjust) + (isSafari ? 'px' : 0);
  65952. }
  65953. this.execCmd('FontSize', size);
  65954. },
  65955. onEditorEvent: function(e) {
  65956. this.updateToolbar();
  65957. },
  65958. updateToolbar: function() {
  65959. var me = this,
  65960. btns, doc, name, fontSelect;
  65961. if (me.readOnly) {
  65962. return;
  65963. }
  65964. if (!me.activated) {
  65965. me.onFirstFocus();
  65966. return;
  65967. }
  65968. btns = me.getToolbar().items.map;
  65969. doc = me.getDoc();
  65970. if (me.enableFont && !Ext.isSafari2) {
  65971. name = (doc.queryCommandValue('FontName') || me.defaultFont).toLowerCase();
  65972. fontSelect = me.fontSelect.dom;
  65973. if (name !== fontSelect.value) {
  65974. fontSelect.value = name;
  65975. }
  65976. }
  65977. function updateButtons() {
  65978. for (var i = 0, l = arguments.length, name; i < l; i++) {
  65979. name = arguments[i];
  65980. btns[name].toggle(doc.queryCommandState(name));
  65981. }
  65982. }
  65983. if(me.enableFormat){
  65984. updateButtons('bold', 'italic', 'underline');
  65985. }
  65986. if(me.enableAlignments){
  65987. updateButtons('justifyleft', 'justifycenter', 'justifyright');
  65988. }
  65989. if(!Ext.isSafari2 && me.enableLists){
  65990. updateButtons('insertorderedlist', 'insertunorderedlist');
  65991. }
  65992. Ext.menu.Manager.hideAll();
  65993. me.syncValue();
  65994. },
  65995. relayBtnCmd: function(btn) {
  65996. this.relayCmd(btn.getItemId());
  65997. },
  65998. relayCmd: function(cmd, value) {
  65999. Ext.defer(function() {
  66000. var me = this;
  66001. me.focus();
  66002. me.execCmd(cmd, value);
  66003. me.updateToolbar();
  66004. }, 10, this);
  66005. },
  66006. execCmd : function(cmd, value){
  66007. var me = this,
  66008. doc = me.getDoc(),
  66009. undef;
  66010. doc.execCommand(cmd, false, value === undef ? null : value);
  66011. me.syncValue();
  66012. },
  66013. applyCommand : function(e){
  66014. if (e.ctrlKey) {
  66015. var me = this,
  66016. c = e.getCharCode(), cmd;
  66017. if (c > 0) {
  66018. c = String.fromCharCode(c);
  66019. switch (c) {
  66020. case 'b':
  66021. cmd = 'bold';
  66022. break;
  66023. case 'i':
  66024. cmd = 'italic';
  66025. break;
  66026. case 'u':
  66027. cmd = 'underline';
  66028. break;
  66029. }
  66030. if (cmd) {
  66031. me.win.focus();
  66032. me.execCmd(cmd);
  66033. me.deferFocus();
  66034. e.preventDefault();
  66035. }
  66036. }
  66037. }
  66038. },
  66039. insertAtCursor : function(text){
  66040. var me = this,
  66041. range;
  66042. if (me.activated) {
  66043. me.win.focus();
  66044. if (Ext.isIE) {
  66045. range = me.getDoc().selection.createRange();
  66046. if (range) {
  66047. range.pasteHTML(text);
  66048. me.syncValue();
  66049. me.deferFocus();
  66050. }
  66051. }else{
  66052. me.execCmd('InsertHTML', text);
  66053. me.deferFocus();
  66054. }
  66055. }
  66056. },
  66057. fixKeys: (function() {
  66058. if (Ext.isIE) {
  66059. return function(e){
  66060. var me = this,
  66061. k = e.getKey(),
  66062. doc = me.getDoc(),
  66063. readOnly = me.readOnly,
  66064. range, target;
  66065. if (k === e.TAB) {
  66066. e.stopEvent();
  66067. if (!readOnly) {
  66068. range = doc.selection.createRange();
  66069. if(range){
  66070. range.collapse(true);
  66071. range.pasteHTML('&#160;&#160;&#160;&#160;');
  66072. me.deferFocus();
  66073. }
  66074. }
  66075. }
  66076. else if (k === e.ENTER) {
  66077. if (!readOnly) {
  66078. range = doc.selection.createRange();
  66079. if (range) {
  66080. target = range.parentElement();
  66081. if(!target || target.tagName.toLowerCase() !== 'li'){
  66082. e.stopEvent();
  66083. range.pasteHTML('<br />');
  66084. range.collapse(false);
  66085. range.select();
  66086. }
  66087. }
  66088. }
  66089. }
  66090. };
  66091. }
  66092. if (Ext.isOpera) {
  66093. return function(e){
  66094. var me = this;
  66095. if (e.getKey() === e.TAB) {
  66096. e.stopEvent();
  66097. if (!me.readOnly) {
  66098. me.win.focus();
  66099. me.execCmd('InsertHTML','&#160;&#160;&#160;&#160;');
  66100. me.deferFocus();
  66101. }
  66102. }
  66103. };
  66104. }
  66105. if (Ext.isWebKit) {
  66106. return function(e){
  66107. var me = this,
  66108. k = e.getKey(),
  66109. readOnly = me.readOnly;
  66110. if (k === e.TAB) {
  66111. e.stopEvent();
  66112. if (!readOnly) {
  66113. me.execCmd('InsertText','\t');
  66114. me.deferFocus();
  66115. }
  66116. }
  66117. else if (k === e.ENTER) {
  66118. e.stopEvent();
  66119. if (!readOnly) {
  66120. me.execCmd('InsertHtml','<br /><br />');
  66121. me.deferFocus();
  66122. }
  66123. }
  66124. };
  66125. }
  66126. return null;
  66127. }()),
  66128. getToolbar : function(){
  66129. return this.toolbar;
  66130. },
  66131. buttonTips : {
  66132. bold : {
  66133. title: 'Bold (Ctrl+B)',
  66134. text: 'Make the selected text bold.',
  66135. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66136. },
  66137. italic : {
  66138. title: 'Italic (Ctrl+I)',
  66139. text: 'Make the selected text italic.',
  66140. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66141. },
  66142. underline : {
  66143. title: 'Underline (Ctrl+U)',
  66144. text: 'Underline the selected text.',
  66145. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66146. },
  66147. increasefontsize : {
  66148. title: 'Grow Text',
  66149. text: 'Increase the font size.',
  66150. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66151. },
  66152. decreasefontsize : {
  66153. title: 'Shrink Text',
  66154. text: 'Decrease the font size.',
  66155. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66156. },
  66157. backcolor : {
  66158. title: 'Text Highlight Color',
  66159. text: 'Change the background color of the selected text.',
  66160. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66161. },
  66162. forecolor : {
  66163. title: 'Font Color',
  66164. text: 'Change the color of the selected text.',
  66165. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66166. },
  66167. justifyleft : {
  66168. title: 'Align Text Left',
  66169. text: 'Align text to the left.',
  66170. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66171. },
  66172. justifycenter : {
  66173. title: 'Center Text',
  66174. text: 'Center text in the editor.',
  66175. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66176. },
  66177. justifyright : {
  66178. title: 'Align Text Right',
  66179. text: 'Align text to the right.',
  66180. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66181. },
  66182. insertunorderedlist : {
  66183. title: 'Bullet List',
  66184. text: 'Start a bulleted list.',
  66185. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66186. },
  66187. insertorderedlist : {
  66188. title: 'Numbered List',
  66189. text: 'Start a numbered list.',
  66190. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66191. },
  66192. createlink : {
  66193. title: 'Hyperlink',
  66194. text: 'Make the selected text a hyperlink.',
  66195. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66196. },
  66197. sourceedit : {
  66198. title: 'Source Edit',
  66199. text: 'Switch to source editing mode.',
  66200. cls: Ext.baseCSSPrefix + 'html-editor-tip'
  66201. }
  66202. }
  66203. });
  66204. Ext.define('Ext.form.field.Radio', {
  66205. extend:'Ext.form.field.Checkbox',
  66206. alias: ['widget.radiofield', 'widget.radio'],
  66207. alternateClassName: 'Ext.form.Radio',
  66208. requires: ['Ext.form.RadioManager'],
  66209. isRadio: true,
  66210. inputType: 'radio',
  66211. ariaRole: 'radio',
  66212. formId: null,
  66213. getGroupValue: function() {
  66214. var selected = this.getManager().getChecked(this.name, this.getFormId());
  66215. return selected ? selected.inputValue : null;
  66216. },
  66217. onBoxClick: function(e) {
  66218. var me = this;
  66219. if (!me.disabled && !me.readOnly) {
  66220. this.setValue(true);
  66221. }
  66222. },
  66223. onRemoved: function(){
  66224. this.callParent(arguments);
  66225. this.formId = null;
  66226. },
  66227. setValue: function(v) {
  66228. var me = this,
  66229. active;
  66230. if (Ext.isBoolean(v)) {
  66231. me.callParent(arguments);
  66232. } else {
  66233. active = me.getManager().getWithValue(me.name, v, me.getFormId()).getAt(0);
  66234. if (active) {
  66235. active.setValue(true);
  66236. }
  66237. }
  66238. return me;
  66239. },
  66240. getSubmitValue: function() {
  66241. return this.checked ? this.inputValue : null;
  66242. },
  66243. getModelData: function() {
  66244. return this.getSubmitData();
  66245. },
  66246. onChange: function(newVal, oldVal) {
  66247. var me = this,
  66248. r, rLen, radio, radios;
  66249. me.callParent(arguments);
  66250. if (newVal) {
  66251. radios = me.getManager().getByName(me.name, me.getFormId()).items;
  66252. rLen = radios.length;
  66253. for (r = 0; r < rLen; r++) {
  66254. radio = radios[r];
  66255. if (radio !== me) {
  66256. radio.setValue(false);
  66257. }
  66258. }
  66259. }
  66260. },
  66261. getManager: function() {
  66262. return Ext.form.RadioManager;
  66263. }
  66264. });
  66265. Ext.define('Ext.picker.Time', {
  66266. extend: 'Ext.view.BoundList',
  66267. alias: 'widget.timepicker',
  66268. requires: ['Ext.data.Store', 'Ext.Date'],
  66269. increment: 15,
  66270. format : "g:i A",
  66271. displayField: 'disp',
  66272. initDate: [2008,0,1],
  66273. componentCls: Ext.baseCSSPrefix + 'timepicker',
  66274. loadMask: false,
  66275. initComponent: function() {
  66276. var me = this,
  66277. dateUtil = Ext.Date,
  66278. clearTime = dateUtil.clearTime,
  66279. initDate = me.initDate;
  66280. me.absMin = clearTime(new Date(initDate[0], initDate[1], initDate[2]));
  66281. me.absMax = dateUtil.add(clearTime(new Date(initDate[0], initDate[1], initDate[2])), 'mi', (24 * 60) - 1);
  66282. me.store = me.createStore();
  66283. me.updateList();
  66284. me.callParent();
  66285. },
  66286. setMinValue: function(value) {
  66287. this.minValue = value;
  66288. this.updateList();
  66289. },
  66290. setMaxValue: function(value) {
  66291. this.maxValue = value;
  66292. this.updateList();
  66293. },
  66294. normalizeDate: function(date) {
  66295. var initDate = this.initDate;
  66296. date.setFullYear(initDate[0], initDate[1], initDate[2]);
  66297. return date;
  66298. },
  66299. updateList: function() {
  66300. var me = this,
  66301. min = me.normalizeDate(me.minValue || me.absMin),
  66302. max = me.normalizeDate(me.maxValue || me.absMax);
  66303. me.store.filterBy(function(record) {
  66304. var date = record.get('date');
  66305. return date >= min && date <= max;
  66306. });
  66307. },
  66308. createStore: function() {
  66309. var me = this,
  66310. utilDate = Ext.Date,
  66311. times = [],
  66312. min = me.absMin,
  66313. max = me.absMax;
  66314. while(min <= max){
  66315. times.push({
  66316. disp: utilDate.dateFormat(min, me.format),
  66317. date: min
  66318. });
  66319. min = utilDate.add(min, 'mi', me.increment);
  66320. }
  66321. return new Ext.data.Store({
  66322. fields: ['disp', 'date'],
  66323. data: times
  66324. });
  66325. }
  66326. });
  66327. Ext.define('Ext.form.field.Time', {
  66328. extend:'Ext.form.field.ComboBox',
  66329. alias: 'widget.timefield',
  66330. requires: ['Ext.form.field.Date', 'Ext.picker.Time', 'Ext.view.BoundListKeyNav', 'Ext.Date'],
  66331. alternateClassName: ['Ext.form.TimeField', 'Ext.form.Time'],
  66332. triggerCls: Ext.baseCSSPrefix + 'form-time-trigger',
  66333. minText : "The time in this field must be equal to or after {0}",
  66334. maxText : "The time in this field must be equal to or before {0}",
  66335. invalidText : "{0} is not a valid time",
  66336. format : "g:i A",
  66337. altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",
  66338. increment: 15,
  66339. pickerMaxHeight: 300,
  66340. selectOnTab: true,
  66341. snapToIncrement: false,
  66342. initDate: '1/1/2008',
  66343. initDateFormat: 'j/n/Y',
  66344. ignoreSelection: 0,
  66345. queryMode: 'local',
  66346. displayField: 'disp',
  66347. valueField: 'date',
  66348. initComponent: function() {
  66349. var me = this,
  66350. min = me.minValue,
  66351. max = me.maxValue;
  66352. if (min) {
  66353. me.setMinValue(min);
  66354. }
  66355. if (max) {
  66356. me.setMaxValue(max);
  66357. }
  66358. me.displayTpl = new Ext.XTemplate(
  66359. '<tpl for=".">' +
  66360. '{[typeof values === "string" ? values : this.formatDate(values["' + me.displayField + '"])]}' +
  66361. '<tpl if="xindex < xcount">' + me.delimiter + '</tpl>' +
  66362. '</tpl>', {
  66363. formatDate: Ext.Function.bind(me.formatDate, me)
  66364. });
  66365. this.callParent();
  66366. },
  66367. transformOriginalValue: function(value) {
  66368. if (Ext.isString(value)) {
  66369. return this.rawToValue(value);
  66370. }
  66371. return value;
  66372. },
  66373. isEqual: function(v1, v2) {
  66374. return Ext.Date.isEqual(v1, v2);
  66375. },
  66376. setMinValue: function(value) {
  66377. var me = this,
  66378. picker = me.picker;
  66379. me.setLimit(value, true);
  66380. if (picker) {
  66381. picker.setMinValue(me.minValue);
  66382. }
  66383. },
  66384. setMaxValue: function(value) {
  66385. var me = this,
  66386. picker = me.picker;
  66387. me.setLimit(value, false);
  66388. if (picker) {
  66389. picker.setMaxValue(me.maxValue);
  66390. }
  66391. },
  66392. setLimit: function(value, isMin) {
  66393. var me = this,
  66394. d, val;
  66395. if (Ext.isString(value)) {
  66396. d = me.parseDate(value);
  66397. }
  66398. else if (Ext.isDate(value)) {
  66399. d = value;
  66400. }
  66401. if (d) {
  66402. val = Ext.Date.clearTime(new Date(me.initDate));
  66403. val.setHours(d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds());
  66404. }
  66405. else {
  66406. val = null;
  66407. }
  66408. me[isMin ? 'minValue' : 'maxValue'] = val;
  66409. },
  66410. rawToValue: function(rawValue) {
  66411. return this.parseDate(rawValue) || rawValue || null;
  66412. },
  66413. valueToRaw: function(value) {
  66414. return this.formatDate(this.parseDate(value));
  66415. },
  66416. getErrors: function(value) {
  66417. var me = this,
  66418. format = Ext.String.format,
  66419. errors = me.callParent(arguments),
  66420. minValue = me.minValue,
  66421. maxValue = me.maxValue,
  66422. date;
  66423. value = me.formatDate(value || me.processRawValue(me.getRawValue()));
  66424. if (value === null || value.length < 1) {
  66425. return errors;
  66426. }
  66427. date = me.parseDate(value);
  66428. if (!date) {
  66429. errors.push(format(me.invalidText, value, Ext.Date.unescapeFormat(me.format)));
  66430. return errors;
  66431. }
  66432. if (minValue && date < minValue) {
  66433. errors.push(format(me.minText, me.formatDate(minValue)));
  66434. }
  66435. if (maxValue && date > maxValue) {
  66436. errors.push(format(me.maxText, me.formatDate(maxValue)));
  66437. }
  66438. return errors;
  66439. },
  66440. formatDate: function() {
  66441. return Ext.form.field.Date.prototype.formatDate.apply(this, arguments);
  66442. },
  66443. parseDate: function(value) {
  66444. var me = this,
  66445. val = value,
  66446. altFormats = me.altFormats,
  66447. altFormatsArray = me.altFormatsArray,
  66448. i = 0,
  66449. len;
  66450. if (value && !Ext.isDate(value)) {
  66451. val = me.safeParse(value, me.format);
  66452. if (!val && altFormats) {
  66453. altFormatsArray = altFormatsArray || altFormats.split('|');
  66454. len = altFormatsArray.length;
  66455. for (; i < len && !val; ++i) {
  66456. val = me.safeParse(value, altFormatsArray[i]);
  66457. }
  66458. }
  66459. }
  66460. if (val && me.snapToIncrement) {
  66461. val = new Date(Ext.Number.snap(val.getTime(), me.increment * 60 * 1000));
  66462. }
  66463. return val;
  66464. },
  66465. safeParse: function(value, format){
  66466. var me = this,
  66467. utilDate = Ext.Date,
  66468. parsedDate,
  66469. result = null;
  66470. if (utilDate.formatContainsDateInfo(format)) {
  66471. result = utilDate.parse(value, format);
  66472. } else {
  66473. parsedDate = utilDate.parse(me.initDate + ' ' + value, me.initDateFormat + ' ' + format);
  66474. if (parsedDate) {
  66475. result = parsedDate;
  66476. }
  66477. }
  66478. return result;
  66479. },
  66480. getSubmitValue: function() {
  66481. var me = this,
  66482. format = me.submitFormat || me.format,
  66483. value = me.getValue();
  66484. return value ? Ext.Date.format(value, format) : null;
  66485. },
  66486. createPicker: function() {
  66487. var me = this,
  66488. picker;
  66489. me.listConfig = Ext.apply({
  66490. xtype: 'timepicker',
  66491. selModel: {
  66492. mode: 'SINGLE'
  66493. },
  66494. cls: undefined,
  66495. minValue: me.minValue,
  66496. maxValue: me.maxValue,
  66497. increment: me.increment,
  66498. format: me.format,
  66499. maxHeight: me.pickerMaxHeight
  66500. }, me.listConfig);
  66501. picker = me.callParent();
  66502. me.store = picker.store;
  66503. return picker;
  66504. },
  66505. onItemClick: function(picker, record){
  66506. var me = this,
  66507. selected = picker.getSelectionModel().getSelection();
  66508. if (selected.length > 0) {
  66509. selected = selected[0];
  66510. if (selected && Ext.Date.isEqual(record.get('date'), selected.get('date'))) {
  66511. me.collapse();
  66512. }
  66513. }
  66514. },
  66515. onListSelectionChange: function(list, recordArray) {
  66516. var me = this,
  66517. record = recordArray[0],
  66518. val = record ? record.get('date') : null;
  66519. if (!me.ignoreSelection) {
  66520. me.skipSync = true;
  66521. me.setValue(val);
  66522. me.skipSync = false;
  66523. me.fireEvent('select', me, val);
  66524. me.picker.clearHighlight();
  66525. me.collapse();
  66526. me.inputEl.focus();
  66527. }
  66528. },
  66529. syncSelection: function() {
  66530. var me = this,
  66531. picker = me.picker,
  66532. toSelect,
  66533. selModel,
  66534. value,
  66535. data, d, dLen, rec;
  66536. if (picker && !me.skipSync) {
  66537. picker.clearHighlight();
  66538. value = me.getValue();
  66539. selModel = picker.getSelectionModel();
  66540. me.ignoreSelection++;
  66541. if (value === null) {
  66542. selModel.deselectAll();
  66543. } else if(Ext.isDate(value)) {
  66544. data = picker.store.data.items;
  66545. dLen = data.length;
  66546. for (d = 0; d < dLen; d++) {
  66547. rec = data[d];
  66548. if (Ext.Date.isEqual(rec.get('date'), value)) {
  66549. toSelect = rec;
  66550. break;
  66551. }
  66552. }
  66553. selModel.select(toSelect);
  66554. }
  66555. me.ignoreSelection--;
  66556. }
  66557. },
  66558. postBlur: function() {
  66559. var me = this;
  66560. me.callParent(arguments);
  66561. me.setRawValue(me.formatDate(me.getValue()));
  66562. },
  66563. setValue: function() {
  66564. this.getPicker();
  66565. this.callParent(arguments);
  66566. },
  66567. getValue: function() {
  66568. return this.parseDate(this.callParent(arguments));
  66569. }
  66570. });
  66571. Ext.define('Ext.grid.CellEditor', {
  66572. extend: 'Ext.Editor',
  66573. constructor: function(config) {
  66574. config = Ext.apply({}, config);
  66575. if (config.field) {
  66576. config.field.monitorTab = false;
  66577. }
  66578. this.callParent([config]);
  66579. },
  66580. onShow: function() {
  66581. var me = this,
  66582. innerCell = me.boundEl.first(),
  66583. lastChild,
  66584. textNode;
  66585. if (innerCell) {
  66586. lastChild = innerCell.dom.lastChild;
  66587. if(lastChild && lastChild.nodeType === 3) {
  66588. textNode = me.cellTextNode = innerCell.dom.lastChild;
  66589. me.cellTextValue = textNode.nodeValue;
  66590. textNode.nodeValue = '\u00a0';
  66591. }
  66592. }
  66593. me.callParent(arguments);
  66594. },
  66595. onHide: function() {
  66596. var me = this,
  66597. innerCell = me.boundEl.first();
  66598. if (innerCell && me.cellTextNode) {
  66599. me.cellTextNode.nodeValue = me.cellTextValue;
  66600. delete me.cellTextNode;
  66601. delete me.cellTextValue;
  66602. }
  66603. me.callParent(arguments);
  66604. },
  66605. afterRender: function() {
  66606. var me = this,
  66607. field = me.field;
  66608. me.callParent(arguments);
  66609. if (field.isXType('checkboxfield')) {
  66610. field.mon(field.inputEl, {
  66611. mousedown: me.onCheckBoxMouseDown,
  66612. click: me.onCheckBoxClick,
  66613. scope: me
  66614. });
  66615. }
  66616. },
  66617. onCheckBoxMouseDown: function() {
  66618. this.completeEdit = Ext.emptyFn;
  66619. },
  66620. onCheckBoxClick: function() {
  66621. delete this.completeEdit;
  66622. this.field.focus(false, 10);
  66623. },
  66624. realign: function(autoSize) {
  66625. var me = this,
  66626. boundEl = me.boundEl,
  66627. innerCell = boundEl.first(),
  66628. children = innerCell.dom.childNodes,
  66629. childCount = children.length,
  66630. offsets = Ext.Array.clone(me.offsets),
  66631. inputEl = me.field.inputEl,
  66632. lastChild, leftBound, rightBound, width;
  66633. if(me.isForTree && (childCount > 1 || (childCount === 1 && children[0].nodeType !== 3))) {
  66634. lastChild = innerCell.last();
  66635. leftBound = lastChild.getOffsetsTo(innerCell)[0] + lastChild.getWidth();
  66636. rightBound = innerCell.getWidth();
  66637. width = rightBound - leftBound;
  66638. if(!me.editingPlugin.grid.columnLines) {
  66639. width --;
  66640. }
  66641. offsets[0] += leftBound;
  66642. me.addCls(Ext.baseCSSPrefix + 'grid-editor-on-text-node');
  66643. } else {
  66644. width = boundEl.getWidth() - 1;
  66645. }
  66646. if (autoSize === true) {
  66647. me.field.setWidth(width);
  66648. }
  66649. me.alignTo(boundEl, me.alignment, offsets);
  66650. },
  66651. onEditorTab: function(e){
  66652. var field = this.field;
  66653. if (field.onEditorTab) {
  66654. field.onEditorTab(e);
  66655. }
  66656. },
  66657. alignment: "tl-tl",
  66658. hideEl : false,
  66659. cls: Ext.baseCSSPrefix + "small-editor " + Ext.baseCSSPrefix + "grid-editor",
  66660. shim: false,
  66661. shadow: false
  66662. });
  66663. Ext.define('Ext.grid.ColumnComponentLayout', {
  66664. extend: 'Ext.layout.component.Auto',
  66665. alias: 'layout.columncomponent',
  66666. type: 'columncomponent',
  66667. setWidthInDom: true,
  66668. getContentHeight : function(ownerContext) {
  66669. return this.owner.isGroupHeader ? ownerContext.getProp('contentHeight') : this.callParent(arguments);
  66670. },
  66671. calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
  66672. var result = this.callParent(arguments);
  66673. if (this.owner.isGroupHeader) {
  66674. result += this.owner.titleEl.dom.offsetHeight;
  66675. }
  66676. return result;
  66677. },
  66678. getContentWidth : function(ownerContext) {
  66679. return this.owner.isGroupHeader ? ownerContext.getProp('contentWidth') : this.callParent(arguments);
  66680. },
  66681. calculateOwnerWidthFromContentWidth: function (ownerContext, contentWidth) {
  66682. return contentWidth + ownerContext.getPaddingInfo().width;
  66683. }
  66684. });
  66685. Ext.define('Ext.grid.ColumnLayout', {
  66686. extend: 'Ext.layout.container.HBox',
  66687. alias: 'layout.gridcolumn',
  66688. type : 'gridcolumn',
  66689. reserveOffset: false,
  66690. firstHeaderCls: Ext.baseCSSPrefix + 'column-header-first',
  66691. lastHeaderCls: Ext.baseCSSPrefix + 'column-header-last',
  66692. initLayout: function() {
  66693. this.grid = this.owner.up('[scrollerOwner]');
  66694. this.callParent();
  66695. },
  66696. beginLayout: function (ownerContext) {
  66697. var me = this,
  66698. grid = me.grid,
  66699. view = grid.view,
  66700. i = 0,
  66701. items = me.getVisibleItems(),
  66702. len = items.length,
  66703. item;
  66704. ownerContext.gridContext = ownerContext.context.getCmp(me.grid);
  66705. if (grid.lockable) {
  66706. if (me.owner.up('tablepanel') === view.normalGrid) {
  66707. view = view.normalGrid.getView();
  66708. } else {
  66709. view = null;
  66710. }
  66711. }
  66712. me.callParent(arguments);
  66713. for (; i < len; i++) {
  66714. item = items[i];
  66715. item.removeCls([me.firstHeaderCls, me.lastHeaderCls]);
  66716. item.el.setStyle({
  66717. height: 'auto'
  66718. });
  66719. item.titleEl.setStyle({
  66720. height: 'auto',
  66721. paddingTop: ''
  66722. });
  66723. }
  66724. if (len > 0) {
  66725. items[0].addCls(me.firstHeaderCls);
  66726. items[len - 1].addCls(me.lastHeaderCls);
  66727. }
  66728. if (!me.owner.isHeader && Ext.getScrollbarSize().width && !grid.collapsed && view &&
  66729. view.table.dom && (view.autoScroll || view.overflowY)) {
  66730. ownerContext.viewContext = ownerContext.context.getCmp(view);
  66731. }
  66732. },
  66733. roundFlex: function(width) {
  66734. return Math.floor(width);
  66735. },
  66736. calculate: function(ownerContext) {
  66737. var me = this,
  66738. viewContext = ownerContext.viewContext,
  66739. tableHeight,
  66740. viewHeight;
  66741. me.callParent(arguments);
  66742. if (ownerContext.state.parallelDone) {
  66743. ownerContext.setProp('columnWidthsDone', true);
  66744. }
  66745. if (viewContext && !ownerContext.state.overflowAdjust.width && !ownerContext.gridContext.heightModel.shrinkWrap) {
  66746. tableHeight = viewContext.tableContext.getProp('height');
  66747. viewHeight = viewContext.getProp('height');
  66748. if (isNaN(tableHeight + viewHeight)) {
  66749. me.done = false;
  66750. }
  66751. else if (tableHeight >= viewHeight) {
  66752. ownerContext.gridContext.invalidate({
  66753. after: function() {
  66754. ownerContext.state.overflowAdjust = {
  66755. width: Ext.getScrollbarSize().width,
  66756. height: 0
  66757. };
  66758. }
  66759. });
  66760. }
  66761. }
  66762. },
  66763. completeLayout: function(ownerContext) {
  66764. var me = this,
  66765. owner = me.owner,
  66766. state = ownerContext.state,
  66767. needsInvalidate = false,
  66768. calculated = me.sizeModels.calculated,
  66769. childItems, len, i, childContext, item;
  66770. me.callParent(arguments);
  66771. if (!state.flexesCalculated && owner.forceFit && !owner.isHeader) {
  66772. childItems = ownerContext.childItems;
  66773. len = childItems.length;
  66774. for (i = 0; i < len; i++) {
  66775. childContext = childItems[i];
  66776. item = childContext.target;
  66777. if (item.width) {
  66778. item.flex = ownerContext.childItems[i].flex = item.width;
  66779. delete item.width;
  66780. childContext.widthModel = calculated;
  66781. needsInvalidate = true;
  66782. }
  66783. }
  66784. if (needsInvalidate) {
  66785. me.cacheFlexes(ownerContext);
  66786. ownerContext.invalidate({
  66787. state: {
  66788. flexesCalculated: true
  66789. }
  66790. });
  66791. }
  66792. }
  66793. },
  66794. finalizeLayout: function() {
  66795. var me = this,
  66796. i = 0,
  66797. items,
  66798. len,
  66799. itemsHeight,
  66800. owner = me.owner,
  66801. titleEl = owner.titleEl;
  66802. items = me.getVisibleItems();
  66803. len = items.length;
  66804. itemsHeight = owner.el.getViewSize().height;
  66805. if (titleEl) {
  66806. itemsHeight -= titleEl.getHeight();
  66807. }
  66808. for (; i < len; i++) {
  66809. items[i].setPadding(itemsHeight);
  66810. }
  66811. },
  66812. publishInnerCtSize: function(ownerContext) {
  66813. var me = this,
  66814. size = ownerContext.state.boxPlan.targetSize,
  66815. cw = ownerContext.peek('contentWidth'),
  66816. view;
  66817. if ((cw != null) && !me.owner.isHeader) {
  66818. size.width = cw;
  66819. view = me.owner.ownerCt.view;
  66820. if (view.autoScroll || view.overflowY) {
  66821. size.width += Ext.getScrollbarSize().width;
  66822. }
  66823. }
  66824. return me.callParent(arguments);
  66825. }
  66826. });
  66827. Ext.define('Ext.grid.LockingView', {
  66828. mixins: {
  66829. observable: 'Ext.util.Observable'
  66830. },
  66831. eventRelayRe: /^(beforeitem|beforecontainer|item|container|cell)/,
  66832. constructor: function(config){
  66833. var me = this,
  66834. eventNames = [],
  66835. eventRe = me.eventRelayRe,
  66836. locked = config.locked.getView(),
  66837. normal = config.normal.getView(),
  66838. events,
  66839. event;
  66840. Ext.apply(me, {
  66841. lockedView: locked,
  66842. normalView: normal,
  66843. lockedGrid: config.locked,
  66844. normalGrid: config.normal,
  66845. panel: config.panel
  66846. });
  66847. me.mixins.observable.constructor.call(me, config);
  66848. events = locked.events;
  66849. for (event in events) {
  66850. if (events.hasOwnProperty(event) && eventRe.test(event)) {
  66851. eventNames.push(event);
  66852. }
  66853. }
  66854. me.relayEvents(locked, eventNames);
  66855. me.relayEvents(normal, eventNames);
  66856. normal.on({
  66857. scope: me,
  66858. itemmouseleave: me.onItemMouseLeave,
  66859. itemmouseenter: me.onItemMouseEnter
  66860. });
  66861. locked.on({
  66862. scope: me,
  66863. itemmouseleave: me.onItemMouseLeave,
  66864. itemmouseenter: me.onItemMouseEnter
  66865. });
  66866. },
  66867. getGridColumns: function() {
  66868. var cols = this.lockedGrid.headerCt.getGridColumns();
  66869. return cols.concat(this.normalGrid.headerCt.getGridColumns());
  66870. },
  66871. getEl: function(column){
  66872. return this.getViewForColumn(column).getEl();
  66873. },
  66874. getViewForColumn: function(column) {
  66875. var view = this.lockedView,
  66876. inLocked;
  66877. view.headerCt.cascade(function(col){
  66878. if (col === column) {
  66879. inLocked = true;
  66880. return false;
  66881. }
  66882. });
  66883. return inLocked ? view : this.normalView;
  66884. },
  66885. onItemMouseEnter: function(view, record){
  66886. var me = this,
  66887. locked = me.lockedView,
  66888. other = me.normalView,
  66889. item;
  66890. if (view.trackOver) {
  66891. if (view !== locked) {
  66892. other = locked;
  66893. }
  66894. item = other.getNode(record);
  66895. other.highlightItem(item);
  66896. }
  66897. },
  66898. onItemMouseLeave: function(view, record){
  66899. var me = this,
  66900. locked = me.lockedView,
  66901. other = me.normalView;
  66902. if (view.trackOver) {
  66903. if (view !== locked) {
  66904. other = locked;
  66905. }
  66906. other.clearHighlight();
  66907. }
  66908. },
  66909. relayFn: function(name, args){
  66910. args = args || [];
  66911. var view = this.lockedView;
  66912. view[name].apply(view, args || []);
  66913. view = this.normalView;
  66914. view[name].apply(view, args || []);
  66915. },
  66916. getSelectionModel: function(){
  66917. return this.panel.getSelectionModel();
  66918. },
  66919. getStore: function(){
  66920. return this.panel.store;
  66921. },
  66922. getNode: function(nodeInfo){
  66923. return this.normalView.getNode(nodeInfo);
  66924. },
  66925. getCell: function(record, column){
  66926. var view = this.getViewForColumn(column),
  66927. row;
  66928. row = view.getNode(record);
  66929. return Ext.fly(row).down(column.getCellSelector());
  66930. },
  66931. getRecord: function(node){
  66932. var result = this.lockedView.getRecord(node);
  66933. if (!node) {
  66934. result = this.normalView.getRecord(node);
  66935. }
  66936. return result;
  66937. },
  66938. addElListener: function(eventName, fn, scope){
  66939. this.relayFn('addElListener', arguments);
  66940. },
  66941. refreshNode: function(){
  66942. this.relayFn('refreshNode', arguments);
  66943. },
  66944. refresh: function(){
  66945. this.relayFn('refresh', arguments);
  66946. },
  66947. bindStore: function(){
  66948. this.relayFn('bindStore', arguments);
  66949. },
  66950. addRowCls: function(){
  66951. this.relayFn('addRowCls', arguments);
  66952. },
  66953. removeRowCls: function(){
  66954. this.relayFn('removeRowCls', arguments);
  66955. }
  66956. });
  66957. Ext.define('Ext.view.TableLayout', {
  66958. extend: 'Ext.layout.component.Auto',
  66959. alias: ['layout.tableview'],
  66960. type: 'tableview',
  66961. beginLayout: function(ownerContext) {
  66962. var me = this;
  66963. me.callParent(arguments);
  66964. if (me.owner.table.dom) {
  66965. ownerContext.tableContext = ownerContext.getEl(me.owner.table);
  66966. ownerContext.headerContext = ownerContext.context.getCmp(me.headerCt);
  66967. }
  66968. },
  66969. calculate: function(ownerContext) {
  66970. var me = this;
  66971. me.callParent(arguments);
  66972. if (ownerContext.tableContext) {
  66973. if (ownerContext.state.columnWidthsSynced) {
  66974. if (ownerContext.hasProp('columnWidthsFlushed')) {
  66975. ownerContext.tableContext.setHeight(ownerContext.tableContext.el.dom.offsetHeight, false);
  66976. } else {
  66977. me.done = false;
  66978. }
  66979. } else {
  66980. if (ownerContext.headerContext.hasProp('columnWidthsDone')) {
  66981. ownerContext.context.queueFlush(me);
  66982. ownerContext.state.columnWidthsSynced = true;
  66983. }
  66984. me.done = false;
  66985. }
  66986. }
  66987. },
  66988. measureContentHeight: function(ownerContext) {
  66989. if (!ownerContext.headerContext || ownerContext.hasProp('columnWidthsFlushed')) {
  66990. return this.callParent(arguments);
  66991. }
  66992. },
  66993. flush: function() {
  66994. var me = this,
  66995. context = me.ownerContext.context,
  66996. columns = me.headerCt.getGridColumns(),
  66997. i = 0, len = columns.length,
  66998. el = me.owner.el,
  66999. tableWidth = 0,
  67000. colWidth;
  67001. context.currentLayout = me;
  67002. for (i = 0; i < len; i++) {
  67003. colWidth = columns[i].hidden ? 0 : context.getCmp(columns[i]).props.width;
  67004. tableWidth += colWidth;
  67005. el.select(me.getColumnSelector(columns[i])).setWidth(colWidth);
  67006. }
  67007. el.select('table.' + Ext.baseCSSPrefix + 'grid-table-resizer').setWidth(tableWidth);
  67008. me.ownerContext.setProp('columnWidthsFlushed', true);
  67009. },
  67010. finishedLayout: function(){
  67011. var me = this,
  67012. first;
  67013. me.callParent(arguments);
  67014. if (Ext.isGecko) {
  67015. first = me.headerCt.getGridColumns()[0];
  67016. if (first) {
  67017. first = me.owner.el.down(me.getColumnSelector(first));
  67018. if (first) {
  67019. first.setStyle('display', 'none');
  67020. first.dom.scrollWidth;
  67021. first.setStyle('display', '');
  67022. }
  67023. }
  67024. }
  67025. },
  67026. getColumnSelector: function(column) {
  67027. return 'th.' + Ext.baseCSSPrefix + 'grid-col-resizer-' + column.id;
  67028. }
  67029. });
  67030. Ext.define('Ext.view.Table', {
  67031. extend: 'Ext.view.View',
  67032. alias: 'widget.tableview',
  67033. uses: [
  67034. 'Ext.view.TableLayout',
  67035. 'Ext.view.TableChunker',
  67036. 'Ext.util.DelayedTask',
  67037. 'Ext.util.MixedCollection'
  67038. ],
  67039. componentLayout: 'tableview',
  67040. baseCls: Ext.baseCSSPrefix + 'grid-view',
  67041. itemSelector: 'tr.' + Ext.baseCSSPrefix + 'grid-row',
  67042. cellSelector: 'td.' + Ext.baseCSSPrefix + 'grid-cell',
  67043. rowSelector: 'tr.' + Ext.baseCSSPrefix + 'grid-row',
  67044. firstCls: Ext.baseCSSPrefix + 'grid-cell-first',
  67045. lastCls: Ext.baseCSSPrefix + 'grid-cell-last',
  67046. headerRowSelector: 'tr.' + Ext.baseCSSPrefix + 'grid-header-row',
  67047. selectedItemCls: Ext.baseCSSPrefix + 'grid-row-selected',
  67048. selectedCellCls: Ext.baseCSSPrefix + 'grid-cell-selected',
  67049. focusedItemCls: Ext.baseCSSPrefix + 'grid-row-focused',
  67050. overItemCls: Ext.baseCSSPrefix + 'grid-row-over',
  67051. altRowCls: Ext.baseCSSPrefix + 'grid-row-alt',
  67052. rowClsRe: new RegExp('(?:^|\\s*)' + Ext.baseCSSPrefix + 'grid-row-(first|last|alt)(?:\\s+|$)', 'g'),
  67053. cellRe: new RegExp(Ext.baseCSSPrefix + 'grid-cell-([^\\s]+) ', ''),
  67054. trackOver: true,
  67055. getRowClass: null,
  67056. stripeRows: true,
  67057. markDirty : true,
  67058. initialTpl: '<div></div>',
  67059. initComponent: function() {
  67060. var me = this,
  67061. scroll = me.scroll;
  67062. me.table = new Ext.dom.Element.Fly();
  67063. me.table.id = me.id + 'gridTable';
  67064. me.autoScroll = undefined;
  67065. if (scroll === true || scroll === 'both') {
  67066. me.autoScroll = true;
  67067. } else if (scroll === 'horizontal') {
  67068. me.overflowX = 'auto';
  67069. } else if (scroll === 'vertical') {
  67070. me.overflowY = 'auto';
  67071. }
  67072. me.selModel.view = me;
  67073. me.headerCt.view = me;
  67074. me.headerCt.markDirty = me.markDirty;
  67075. me.initFeatures(me.grid);
  67076. delete me.grid;
  67077. me.tpl = me.getTpl('initialTpl');
  67078. me.callParent();
  67079. },
  67080. moveColumn: function(fromIdx, toIdx, colsToMove) {
  67081. var me = this,
  67082. fragment = (colsToMove > 1) ? document.createDocumentFragment() : undefined,
  67083. destinationCellIdx = toIdx,
  67084. colCount = me.getGridColumns().length,
  67085. lastIdx = colCount - 1,
  67086. doFirstLastClasses = (me.firstCls || me.lastCls) && (toIdx === 0 || toIdx == colCount || fromIdx === 0 || fromIdx == lastIdx),
  67087. i,
  67088. j,
  67089. rows, len, tr, headerRows;
  67090. if (me.rendered) {
  67091. headerRows = me.el.query(me.headerRowSelector);
  67092. rows = me.el.query(me.rowSelector);
  67093. if (toIdx > fromIdx && fragment) {
  67094. destinationCellIdx -= colsToMove;
  67095. }
  67096. for (i = 0, len = headerRows.length; i < len; ++i) {
  67097. tr = headerRows[i];
  67098. if (fragment) {
  67099. for (j = 0; j < colsToMove; j++) {
  67100. fragment.appendChild(tr.cells[fromIdx]);
  67101. }
  67102. tr.insertBefore(fragment, tr.cells[destinationCellIdx] || null);
  67103. } else {
  67104. tr.insertBefore(tr.cells[fromIdx], tr.cells[destinationCellIdx] || null);
  67105. }
  67106. }
  67107. for (i = 0, len = rows.length; i < len; i++) {
  67108. tr = rows[i];
  67109. if (doFirstLastClasses) {
  67110. if (fromIdx === 0) {
  67111. Ext.fly(tr.cells[0]).removeCls(me.firstCls);
  67112. Ext.fly(tr.cells[1]).addCls(me.firstCls);
  67113. } else if (fromIdx === lastIdx) {
  67114. Ext.fly(tr.cells[lastIdx]).removeCls(me.lastCls);
  67115. Ext.fly(tr.cells[lastIdx - 1]).addCls(me.lastCls);
  67116. }
  67117. if (toIdx === 0) {
  67118. Ext.fly(tr.cells[0]).removeCls(me.firstCls);
  67119. Ext.fly(tr.cells[fromIdx]).addCls(me.firstCls);
  67120. } else if (toIdx === colCount) {
  67121. Ext.fly(tr.cells[lastIdx]).removeCls(me.lastCls);
  67122. Ext.fly(tr.cells[fromIdx]).addCls(me.lastCls);
  67123. }
  67124. }
  67125. if (fragment) {
  67126. for (j = 0; j < colsToMove; j++) {
  67127. fragment.appendChild(tr.cells[fromIdx]);
  67128. }
  67129. tr.insertBefore(fragment, tr.cells[destinationCellIdx] || null);
  67130. } else {
  67131. tr.insertBefore(tr.cells[fromIdx], tr.cells[destinationCellIdx] || null);
  67132. }
  67133. }
  67134. me.setNewTemplate();
  67135. }
  67136. },
  67137. scrollToTop: Ext.emptyFn,
  67138. addElListener: function(eventName, fn, scope){
  67139. this.mon(this, eventName, fn, scope, {
  67140. element: 'el'
  67141. });
  67142. },
  67143. getGridColumns: function() {
  67144. return this.headerCt.getGridColumns();
  67145. },
  67146. getHeaderAtIndex: function(index) {
  67147. return this.headerCt.getHeaderAtIndex(index);
  67148. },
  67149. getCell: function(record, column) {
  67150. var row = this.getNode(record);
  67151. return Ext.fly(row).down(column.getCellSelector());
  67152. },
  67153. getFeature: function(id) {
  67154. var features = this.featuresMC;
  67155. if (features) {
  67156. return features.get(id);
  67157. }
  67158. },
  67159. initFeatures: function(grid) {
  67160. var me = this,
  67161. i,
  67162. features,
  67163. feature,
  67164. len;
  67165. me.featuresMC = new Ext.util.MixedCollection();
  67166. features = me.features = me.constructFeatures();
  67167. len = features ? features.length : 0;
  67168. for (i = 0; i < len; i++) {
  67169. feature = features[i];
  67170. feature.view = me;
  67171. feature.grid = grid;
  67172. me.featuresMC.add(feature);
  67173. feature.init();
  67174. }
  67175. },
  67176. constructFeatures: function() {
  67177. var me = this,
  67178. features = me.features,
  67179. feature,
  67180. result,
  67181. i = 0, len;
  67182. if (features) {
  67183. result = [];
  67184. len = features.length;
  67185. for (; i < len; i++) {
  67186. feature = features[i];
  67187. if (!feature.isFeature) {
  67188. feature = Ext.create('feature.' + feature.ftype, feature);
  67189. }
  67190. result[i] = feature;
  67191. }
  67192. }
  67193. return result;
  67194. },
  67195. attachEventsForFeatures: function() {
  67196. var features = this.features,
  67197. ln = features.length,
  67198. i = 0;
  67199. for (; i < ln; i++) {
  67200. if (features[i].isFeature) {
  67201. features[i].attachEvents();
  67202. }
  67203. }
  67204. },
  67205. afterRender: function() {
  67206. var me = this;
  67207. me.callParent();
  67208. if (!me.enableTextSelection) {
  67209. me.el.unselectable();
  67210. }
  67211. me.attachEventsForFeatures();
  67212. },
  67213. onViewScroll: function(e, t) {
  67214. this.callParent(arguments);
  67215. this.fireEvent('bodyscroll', e, t);
  67216. },
  67217. prepareData: function(data, idx, record) {
  67218. var me = this,
  67219. result = me.headerCt.prepareData(data, idx, record, me, me.ownerCt),
  67220. features = me.features,
  67221. ln = features.length,
  67222. i = 0,
  67223. feature;
  67224. for (; i < ln; i++) {
  67225. feature = features[i];
  67226. if (feature.isFeature) {
  67227. Ext.apply(result, feature.getAdditionalData(data, idx, record, result, me));
  67228. }
  67229. }
  67230. return result;
  67231. },
  67232. collectData: function(records, startIndex) {
  67233. var me = this,
  67234. preppedRecords = me.callParent(arguments),
  67235. headerCt = me.headerCt,
  67236. fullWidth = headerCt.getFullWidth(),
  67237. features = me.features,
  67238. ln = features.length,
  67239. o = {
  67240. rows: preppedRecords,
  67241. fullWidth: fullWidth
  67242. },
  67243. i = 0,
  67244. feature,
  67245. j = 0,
  67246. jln,
  67247. rowParams,
  67248. rec,
  67249. cls;
  67250. jln = preppedRecords.length;
  67251. if (me.getRowClass) {
  67252. for (; j < jln; j++) {
  67253. rowParams = {};
  67254. rec = preppedRecords[j];
  67255. cls = rec.rowCls || '';
  67256. rec.rowCls = this.getRowClass(records[j], j, rowParams, me.store) + ' ' + cls;
  67257. }
  67258. }
  67259. for (; i < ln; i++) {
  67260. feature = features[i];
  67261. if (feature.isFeature && feature.collectData && !feature.disabled) {
  67262. o = feature.collectData(records, preppedRecords, startIndex, fullWidth, o);
  67263. break;
  67264. }
  67265. }
  67266. return o;
  67267. },
  67268. refreshSize: function() {
  67269. var me = this,
  67270. cmp;
  67271. me.table.attach(me.el.child('table', true));
  67272. if (!me.hasLoadingHeight) {
  67273. cmp = me.up('tablepanel');
  67274. Ext.suspendLayouts();
  67275. me.callParent();
  67276. if (cmp && Ext.getScrollbarSize().width && (me.autoScroll || me.overflowY)) {
  67277. cmp.updateLayout();
  67278. }
  67279. Ext.resumeLayouts(true);
  67280. }
  67281. },
  67282. setNewTemplate: function() {
  67283. var me = this,
  67284. columns = me.headerCt.getColumnsForTpl(true);
  67285. me.tpl = me.getTableChunker().getTableTpl({
  67286. rowCount: me.store.getCount(),
  67287. columns: columns,
  67288. features: me.features,
  67289. enableTextSelection: me.enableTextSelection
  67290. });
  67291. },
  67292. getTableChunker: function() {
  67293. return this.chunker || Ext.view.TableChunker;
  67294. },
  67295. addRowCls: function(rowInfo, cls) {
  67296. var row = this.getNode(rowInfo);
  67297. if (row) {
  67298. Ext.fly(row).addCls(cls);
  67299. }
  67300. },
  67301. removeRowCls: function(rowInfo, cls) {
  67302. var row = this.getNode(rowInfo);
  67303. if (row) {
  67304. Ext.fly(row).removeCls(cls);
  67305. }
  67306. },
  67307. onRowSelect : function(rowIdx) {
  67308. this.addRowCls(rowIdx, this.selectedItemCls);
  67309. },
  67310. onRowDeselect : function(rowIdx) {
  67311. var me = this;
  67312. me.removeRowCls(rowIdx, me.selectedItemCls);
  67313. me.removeRowCls(rowIdx, me.focusedItemCls);
  67314. },
  67315. onCellSelect: function(position) {
  67316. var cell = this.getCellByPosition(position, true);
  67317. if (cell) {
  67318. Ext.fly(cell).addCls(this.selectedCellCls);
  67319. }
  67320. },
  67321. onCellDeselect: function(position) {
  67322. var cell = this.getCellByPosition(position, true);
  67323. if (cell) {
  67324. Ext.fly(cell).removeCls(this.selectedCellCls);
  67325. }
  67326. },
  67327. onCellFocus: function(position) {
  67328. this.focusCell(position);
  67329. },
  67330. getCellByPosition: function(position, returnDom) {
  67331. if (position) {
  67332. var node = this.getNode(position.row),
  67333. header = this.headerCt.getHeaderAtIndex(position.column);
  67334. if (header && node) {
  67335. return Ext.fly(node).down(header.getCellSelector(), returnDom);
  67336. }
  67337. }
  67338. return false;
  67339. },
  67340. onRowFocus: function(rowIdx, highlight, supressFocus) {
  67341. var me = this;
  67342. if (highlight) {
  67343. me.addRowCls(rowIdx, me.focusedItemCls);
  67344. if (!supressFocus) {
  67345. me.focusRow(rowIdx);
  67346. }
  67347. } else {
  67348. me.removeRowCls(rowIdx, me.focusedItemCls);
  67349. }
  67350. },
  67351. focusRow: function(rowIdx) {
  67352. var me = this,
  67353. row = me.getNode(rowIdx),
  67354. el = me.el,
  67355. adjustment = 0,
  67356. panel = me.ownerCt,
  67357. rowRegion,
  67358. elTop,
  67359. elBottom,
  67360. record;
  67361. if (row && el) {
  67362. elTop = el.getY();
  67363. elBottom = elTop + el.dom.clientHeight;
  67364. rowRegion = Ext.fly(row).getRegion();
  67365. if (rowRegion.top < elTop) {
  67366. adjustment = rowRegion.top - elTop;
  67367. } else if (rowRegion.bottom > elBottom) {
  67368. adjustment = rowRegion.bottom - elBottom;
  67369. }
  67370. record = me.getRecord(row);
  67371. rowIdx = me.store.indexOf(record);
  67372. if (adjustment) {
  67373. panel.scrollByDeltaY(adjustment);
  67374. }
  67375. me.fireEvent('rowfocus', record, row, rowIdx);
  67376. }
  67377. },
  67378. focusCell: function(position) {
  67379. var me = this,
  67380. cell = me.getCellByPosition(position),
  67381. el = me.el,
  67382. adjustmentY = 0,
  67383. adjustmentX = 0,
  67384. elRegion = el.getRegion(),
  67385. panel = me.ownerCt,
  67386. cellRegion,
  67387. record;
  67388. elRegion.bottom = elRegion.top + el.dom.clientHeight;
  67389. elRegion.right = elRegion.left + el.dom.clientWidth;
  67390. if (cell) {
  67391. cellRegion = cell.getRegion();
  67392. if (cellRegion.top < elRegion.top) {
  67393. adjustmentY = cellRegion.top - elRegion.top;
  67394. } else if (cellRegion.bottom > elRegion.bottom) {
  67395. adjustmentY = cellRegion.bottom - elRegion.bottom;
  67396. }
  67397. if (cellRegion.left < elRegion.left) {
  67398. adjustmentX = cellRegion.left - elRegion.left;
  67399. } else if (cellRegion.right > elRegion.right) {
  67400. adjustmentX = cellRegion.right - elRegion.right;
  67401. }
  67402. if (adjustmentY) {
  67403. panel.scrollByDeltaY(adjustmentY);
  67404. }
  67405. if (adjustmentX) {
  67406. panel.scrollByDeltaX(adjustmentX);
  67407. }
  67408. el.focus();
  67409. me.fireEvent('cellfocus', record, cell, position);
  67410. }
  67411. },
  67412. scrollByDelta: function(delta, dir) {
  67413. dir = dir || 'scrollTop';
  67414. var elDom = this.el.dom;
  67415. elDom[dir] = (elDom[dir] += delta);
  67416. },
  67417. onUpdate : function(store, record, operation, changedFieldNames) {
  67418. var me = this,
  67419. index,
  67420. newRow, newAttrs, attLen, i, attName, oldRow, oldRowDom,
  67421. oldCells, newCells, len, i,
  67422. columns, overItemCls,
  67423. isHovered, row,
  67424. isEditing = me.editingPlugin && me.editingPlugin.editing;
  67425. if (me.viewReady) {
  67426. index = me.store.indexOf(record);
  67427. columns = me.headerCt.getGridColumns();
  67428. overItemCls = me.overItemCls;
  67429. if (columns.length && index > -1) {
  67430. newRow = me.bufferRender([record], index)[0];
  67431. oldRow = me.all.item(index);
  67432. if (oldRow) {
  67433. oldRowDom = oldRow.dom;
  67434. isHovered = oldRow.hasCls(overItemCls);
  67435. if (oldRowDom.mergeAttributes) {
  67436. oldRowDom.mergeAttributes(newRow, true);
  67437. } else {
  67438. newAttrs = newRow.attributes;
  67439. attLen = newAttrs.length;
  67440. for (i = 0; i < attLen; i++) {
  67441. attName = newAttrs[i].name;
  67442. if (attName !== 'id') {
  67443. oldRowDom.setAttribute(attName, newAttrs[i].value);
  67444. }
  67445. }
  67446. }
  67447. if (isHovered) {
  67448. oldRow.addCls(overItemCls);
  67449. }
  67450. oldCells = oldRow.query(me.cellSelector);
  67451. newCells = Ext.fly(newRow).query(me.cellSelector);
  67452. len = newCells.length;
  67453. row = oldCells[0].parentNode;
  67454. for (i = 0; i < len; i++) {
  67455. if (me.shouldUpdateCell(columns[i], changedFieldNames)) {
  67456. if (isEditing) {
  67457. Ext.fly(oldCells[i]).syncContent(newCells[i]);
  67458. }
  67459. else {
  67460. row.insertBefore(newCells[i], oldCells[i]);
  67461. row.removeChild(oldCells[i]);
  67462. }
  67463. }
  67464. }
  67465. }
  67466. me.fireEvent('itemupdate', record, index, newRow);
  67467. }
  67468. }
  67469. },
  67470. shouldUpdateCell: function(column, changedFieldNames){
  67471. if (column.hasCustomRenderer) {
  67472. return true;
  67473. }
  67474. return !changedFieldNames || Ext.Array.contains(changedFieldNames, column.dataIndex);
  67475. },
  67476. refresh: function() {
  67477. var me = this;
  67478. me.setNewTemplate();
  67479. me.callParent(arguments);
  67480. me.doStripeRows(0);
  67481. me.headerCt.setSortState();
  67482. },
  67483. clearViewEl: function() {
  67484. this.callParent();
  67485. delete this.table.dom;
  67486. },
  67487. processItemEvent: function(record, row, rowIndex, e) {
  67488. var me = this,
  67489. cell = e.getTarget(me.cellSelector, row),
  67490. cellIndex = cell ? cell.cellIndex : -1,
  67491. map = me.statics().EventMap,
  67492. selModel = me.getSelectionModel(),
  67493. type = e.type,
  67494. result;
  67495. if (type == 'keydown' && !cell && selModel.getCurrentPosition) {
  67496. cell = me.getCellByPosition(selModel.getCurrentPosition());
  67497. if (cell) {
  67498. cell = cell.dom;
  67499. cellIndex = cell.cellIndex;
  67500. }
  67501. }
  67502. result = me.fireEvent('uievent', type, me, cell, rowIndex, cellIndex, e, record, row);
  67503. if (result === false || me.callParent(arguments) === false) {
  67504. return false;
  67505. }
  67506. if (type == 'mouseover' || type == 'mouseout') {
  67507. return true;
  67508. }
  67509. if(!cell) {
  67510. return true;
  67511. }
  67512. return !(
  67513. (me['onBeforeCell' + map[type]](cell, cellIndex, record, row, rowIndex, e) === false) ||
  67514. (me.fireEvent('beforecell' + type, me, cell, cellIndex, record, row, rowIndex, e) === false) ||
  67515. (me['onCell' + map[type]](cell, cellIndex, record, row, rowIndex, e) === false) ||
  67516. (me.fireEvent('cell' + type, me, cell, cellIndex, record, row, rowIndex, e) === false)
  67517. );
  67518. },
  67519. processSpecialEvent: function(e) {
  67520. var me = this,
  67521. map = me.statics().EventMap,
  67522. features = me.features,
  67523. ln = features.length,
  67524. type = e.type,
  67525. i, feature, prefix, featureTarget,
  67526. beforeArgs, args,
  67527. panel = me.ownerCt;
  67528. me.callParent(arguments);
  67529. if (type == 'mouseover' || type == 'mouseout') {
  67530. return;
  67531. }
  67532. for (i = 0; i < ln; i++) {
  67533. feature = features[i];
  67534. if (feature.hasFeatureEvent) {
  67535. featureTarget = e.getTarget(feature.eventSelector, me.getTargetEl());
  67536. if (featureTarget) {
  67537. prefix = feature.eventPrefix;
  67538. beforeArgs = feature.getFireEventArgs('before' + prefix + type, me, featureTarget, e);
  67539. args = feature.getFireEventArgs(prefix + type, me, featureTarget, e);
  67540. if (
  67541. (me.fireEvent.apply(me, beforeArgs) === false) ||
  67542. (panel.fireEvent.apply(panel, beforeArgs) === false) ||
  67543. (me.fireEvent.apply(me, args) === false) ||
  67544. (panel.fireEvent.apply(panel, args) === false)
  67545. ) {
  67546. return false;
  67547. }
  67548. }
  67549. }
  67550. }
  67551. return true;
  67552. },
  67553. onCellMouseDown: Ext.emptyFn,
  67554. onCellMouseUp: Ext.emptyFn,
  67555. onCellClick: Ext.emptyFn,
  67556. onCellDblClick: Ext.emptyFn,
  67557. onCellContextMenu: Ext.emptyFn,
  67558. onCellKeyDown: Ext.emptyFn,
  67559. onBeforeCellMouseDown: Ext.emptyFn,
  67560. onBeforeCellMouseUp: Ext.emptyFn,
  67561. onBeforeCellClick: Ext.emptyFn,
  67562. onBeforeCellDblClick: Ext.emptyFn,
  67563. onBeforeCellContextMenu: Ext.emptyFn,
  67564. onBeforeCellKeyDown: Ext.emptyFn,
  67565. expandToFit: function(header) {
  67566. if (header) {
  67567. var maxWidth = this.getMaxContentWidth(header);
  67568. delete header.flex;
  67569. header.setWidth(maxWidth);
  67570. }
  67571. },
  67572. getMaxContentWidth: function(header) {
  67573. var cellSelector = header.getCellInnerSelector(),
  67574. cells = this.el.query(cellSelector),
  67575. i = 0,
  67576. ln = cells.length,
  67577. maxWidth = header.el.dom.scrollWidth,
  67578. scrollWidth;
  67579. for (; i < ln; i++) {
  67580. scrollWidth = cells[i].scrollWidth;
  67581. if (scrollWidth > maxWidth) {
  67582. maxWidth = scrollWidth;
  67583. }
  67584. }
  67585. return maxWidth;
  67586. },
  67587. getPositionByEvent: function(e) {
  67588. var me = this,
  67589. cellNode = e.getTarget(me.cellSelector),
  67590. rowNode = e.getTarget(me.itemSelector),
  67591. record = me.getRecord(rowNode),
  67592. header = me.getHeaderByCell(cellNode);
  67593. return me.getPosition(record, header);
  67594. },
  67595. getHeaderByCell: function(cell) {
  67596. if (cell) {
  67597. var m = cell.className.match(this.cellRe);
  67598. if (m && m[1]) {
  67599. return Ext.getCmp(m[1]);
  67600. }
  67601. }
  67602. return false;
  67603. },
  67604. walkCells: function(pos, direction, e, preventWrap, verifierFn, scope) {
  67605. if (!pos) {
  67606. return;
  67607. }
  67608. var me = this,
  67609. row = pos.row,
  67610. column = pos.column,
  67611. rowCount = me.store.getCount(),
  67612. firstCol = me.getFirstVisibleColumnIndex(),
  67613. lastCol = me.getLastVisibleColumnIndex(),
  67614. newPos = {row: row, column: column},
  67615. activeHeader = me.headerCt.getHeaderAtIndex(column);
  67616. if (!activeHeader || activeHeader.hidden) {
  67617. return false;
  67618. }
  67619. e = e || {};
  67620. direction = direction.toLowerCase();
  67621. switch (direction) {
  67622. case 'right':
  67623. if (column === lastCol) {
  67624. if (preventWrap || row === rowCount - 1) {
  67625. return false;
  67626. }
  67627. if (!e.ctrlKey) {
  67628. newPos.row = row + 1;
  67629. newPos.column = firstCol;
  67630. }
  67631. } else {
  67632. if (!e.ctrlKey) {
  67633. newPos.column = column + me.getRightGap(activeHeader);
  67634. } else {
  67635. newPos.column = lastCol;
  67636. }
  67637. }
  67638. break;
  67639. case 'left':
  67640. if (column === firstCol) {
  67641. if (preventWrap || row === 0) {
  67642. return false;
  67643. }
  67644. if (!e.ctrlKey) {
  67645. newPos.row = row - 1;
  67646. newPos.column = lastCol;
  67647. }
  67648. } else {
  67649. if (!e.ctrlKey) {
  67650. newPos.column = column + me.getLeftGap(activeHeader);
  67651. } else {
  67652. newPos.column = firstCol;
  67653. }
  67654. }
  67655. break;
  67656. case 'up':
  67657. if (row === 0) {
  67658. return false;
  67659. } else {
  67660. if (!e.ctrlKey) {
  67661. newPos.row = row - 1;
  67662. } else {
  67663. newPos.row = 0;
  67664. }
  67665. }
  67666. break;
  67667. case 'down':
  67668. if (row === rowCount - 1) {
  67669. return false;
  67670. } else {
  67671. if (!e.ctrlKey) {
  67672. newPos.row = row + 1;
  67673. } else {
  67674. newPos.row = rowCount - 1;
  67675. }
  67676. }
  67677. break;
  67678. }
  67679. if (verifierFn && verifierFn.call(scope || window, newPos) !== true) {
  67680. return false;
  67681. } else {
  67682. return newPos;
  67683. }
  67684. },
  67685. getFirstVisibleColumnIndex: function() {
  67686. var firstVisibleHeader = this.getHeaderCt().getVisibleGridColumns()[0];
  67687. return firstVisibleHeader ? firstVisibleHeader.getIndex() : -1;
  67688. },
  67689. getLastVisibleColumnIndex: function() {
  67690. var visHeaders = this.getHeaderCt().getVisibleGridColumns(),
  67691. lastHeader = visHeaders[visHeaders.length - 1];
  67692. return lastHeader.getIndex();
  67693. },
  67694. getHeaderCt: function() {
  67695. return this.headerCt;
  67696. },
  67697. getPosition: function(record, header) {
  67698. var me = this,
  67699. store = me.store,
  67700. gridCols = me.headerCt.getGridColumns();
  67701. return {
  67702. row: store.indexOf(record),
  67703. column: Ext.Array.indexOf(gridCols, header)
  67704. };
  67705. },
  67706. getRightGap: function(activeHeader) {
  67707. var headerCt = this.getHeaderCt(),
  67708. headers = headerCt.getGridColumns(),
  67709. activeHeaderIdx = Ext.Array.indexOf(headers, activeHeader),
  67710. i = activeHeaderIdx + 1,
  67711. nextIdx;
  67712. for (; i <= headers.length; i++) {
  67713. if (!headers[i].hidden) {
  67714. nextIdx = i;
  67715. break;
  67716. }
  67717. }
  67718. return nextIdx - activeHeaderIdx;
  67719. },
  67720. beforeDestroy: function() {
  67721. if (this.rendered) {
  67722. this.el.removeAllListeners();
  67723. }
  67724. this.callParent(arguments);
  67725. },
  67726. getLeftGap: function(activeHeader) {
  67727. var headerCt = this.getHeaderCt(),
  67728. headers = headerCt.getGridColumns(),
  67729. activeHeaderIdx = Ext.Array.indexOf(headers, activeHeader),
  67730. i = activeHeaderIdx - 1,
  67731. prevIdx;
  67732. for (; i >= 0; i--) {
  67733. if (!headers[i].hidden) {
  67734. prevIdx = i;
  67735. break;
  67736. }
  67737. }
  67738. return prevIdx - activeHeaderIdx;
  67739. },
  67740. onAdd: function(ds, records, index) {
  67741. this.callParent(arguments);
  67742. this.doStripeRows(index);
  67743. },
  67744. onRemove: function(ds, records, index) {
  67745. this.callParent(arguments);
  67746. this.doStripeRows(index);
  67747. },
  67748. doStripeRows: function(startRow, endRow) {
  67749. var me = this,
  67750. rows,
  67751. rowsLn,
  67752. i,
  67753. row;
  67754. if (me.rendered && me.stripeRows) {
  67755. rows = me.getNodes(startRow, endRow);
  67756. for (i = 0, rowsLn = rows.length; i < rowsLn; i++) {
  67757. row = rows[i];
  67758. row.className = row.className.replace(me.rowClsRe, ' ');
  67759. startRow++;
  67760. if (startRow % 2 === 0) {
  67761. row.className += (' ' + me.altRowCls);
  67762. }
  67763. }
  67764. }
  67765. }
  67766. });
  67767. Ext.define('Ext.grid.Lockable', {
  67768. requires: [
  67769. 'Ext.grid.LockingView',
  67770. 'Ext.view.Table'
  67771. ],
  67772. syncRowHeight: true,
  67773. headerCounter: 0,
  67774. scrollDelta: 40,
  67775. unlockText: 'Unlock',
  67776. lockText: 'Lock',
  67777. determineXTypeToCreate: function() {
  67778. var me = this,
  67779. typeToCreate,
  67780. xtypes, xtypesLn, xtype, superxtype;
  67781. if (me.subGridXType) {
  67782. typeToCreate = me.subGridXType;
  67783. } else {
  67784. xtypes = this.getXTypes().split('/');
  67785. xtypesLn = xtypes.length;
  67786. xtype = xtypes[xtypesLn - 1];
  67787. superxtype = xtypes[xtypesLn - 2];
  67788. if (superxtype !== 'tablepanel') {
  67789. typeToCreate = superxtype;
  67790. } else {
  67791. typeToCreate = xtype;
  67792. }
  67793. }
  67794. return typeToCreate;
  67795. },
  67796. injectLockable: function() {
  67797. this.lockable = true;
  67798. this.hasView = true;
  67799. var me = this,
  67800. scrollLocked = Ext.getScrollbarSize().width === 0,
  67801. store = me.store = Ext.StoreManager.lookup(me.store),
  67802. xtype = me.determineXTypeToCreate(),
  67803. selModel = me.getSelectionModel(),
  67804. lockedFeatures,
  67805. normalFeatures,
  67806. lockedPlugins,
  67807. normalPlugins,
  67808. lockedGrid,
  67809. normalGrid,
  67810. i, len,
  67811. columns,
  67812. lockedHeaderCt,
  67813. normalHeaderCt,
  67814. lockedView,
  67815. normalView,
  67816. listeners;
  67817. lockedFeatures = me.constructFeatures();
  67818. me.cloneFeatures();
  67819. normalFeatures = me.constructFeatures();
  67820. lockedPlugins = me.constructPlugins();
  67821. me.clonePlugins();
  67822. normalPlugins = me.constructPlugins();
  67823. delete me.features;
  67824. delete me.plugins;
  67825. for (i = 0, len = (lockedFeatures ? lockedFeatures.length : 0); i < len; i++) {
  67826. lockedFeatures[i].lockingPartner = normalFeatures[i];
  67827. normalFeatures[i].lockingPartner = lockedFeatures[i];
  67828. }
  67829. lockedGrid = Ext.apply({
  67830. xtype: xtype,
  67831. store: store,
  67832. scrollerOwner: false,
  67833. enableAnimations: false,
  67834. scroll: scrollLocked ? 'vertical' : false,
  67835. selModel: selModel,
  67836. border: false,
  67837. cls: Ext.baseCSSPrefix + 'grid-inner-locked',
  67838. isLayoutRoot: function() {
  67839. return false;
  67840. },
  67841. features: lockedFeatures,
  67842. plugins: lockedPlugins
  67843. }, me.lockedGridConfig);
  67844. normalGrid = Ext.apply({
  67845. xtype: xtype,
  67846. store: store,
  67847. scrollerOwner: false,
  67848. enableAnimations: false,
  67849. selModel: selModel,
  67850. border: false,
  67851. isLayoutRoot: function() {
  67852. return false;
  67853. },
  67854. features: normalFeatures,
  67855. plugins: normalPlugins
  67856. }, me.normalGridConfig);
  67857. me.addCls(Ext.baseCSSPrefix + 'grid-locked');
  67858. Ext.copyTo(normalGrid, me, me.bothCfgCopy);
  67859. Ext.copyTo(lockedGrid, me, me.bothCfgCopy);
  67860. Ext.copyTo(normalGrid, me, me.normalCfgCopy);
  67861. Ext.copyTo(lockedGrid, me, me.lockedCfgCopy);
  67862. for (i = 0; i < me.normalCfgCopy.length; i++) {
  67863. delete me[me.normalCfgCopy[i]];
  67864. }
  67865. for (i = 0; i < me.lockedCfgCopy.length; i++) {
  67866. delete me[me.lockedCfgCopy[i]];
  67867. }
  67868. me.addEvents(
  67869. 'lockcolumn',
  67870. 'unlockcolumn'
  67871. );
  67872. me.addStateEvents(['lockcolumn', 'unlockcolumn']);
  67873. me.lockedHeights = [];
  67874. me.normalHeights = [];
  67875. columns = me.processColumns(me.columns);
  67876. lockedGrid.width = columns.lockedWidth + Ext.num(selModel.headerWidth, 0);
  67877. lockedGrid.columns = columns.locked;
  67878. normalGrid.columns = columns.normal;
  67879. normalGrid.flex = 1;
  67880. lockedGrid.viewConfig = me.lockedViewConfig || {};
  67881. lockedGrid.viewConfig.loadingUseMsg = false;
  67882. normalGrid.viewConfig = me.normalViewConfig || {};
  67883. Ext.applyIf(lockedGrid.viewConfig, me.viewConfig);
  67884. Ext.applyIf(normalGrid.viewConfig, me.viewConfig);
  67885. me.lockedGrid = Ext.ComponentManager.create(lockedGrid);
  67886. lockedView = me.lockedGrid.getView();
  67887. normalGrid.viewConfig.lockingPartner = lockedView;
  67888. me.normalGrid = Ext.ComponentManager.create(normalGrid);
  67889. normalView = me.normalGrid.getView();
  67890. me.view = new Ext.grid.LockingView({
  67891. locked: me.lockedGrid,
  67892. normal: me.normalGrid,
  67893. panel: me
  67894. });
  67895. listeners = {
  67896. scroll: {
  67897. fn: me.onLockedViewScroll,
  67898. element: 'el',
  67899. scope: me
  67900. }
  67901. };
  67902. if (!scrollLocked) {
  67903. listeners.mousewheel = {
  67904. fn: me.onLockedViewMouseWheel,
  67905. element: 'el',
  67906. scope: me
  67907. };
  67908. }
  67909. if (me.syncRowHeight) {
  67910. listeners.refresh = me.onLockedViewRefresh;
  67911. listeners.itemupdate = me.onLockedViewItemUpdate;
  67912. listeners.scope = me;
  67913. }
  67914. lockedView.on(listeners);
  67915. listeners = {
  67916. scroll: {
  67917. fn: me.onNormalViewScroll,
  67918. element: 'el',
  67919. scope: me
  67920. },
  67921. refresh: me.syncRowHeight ? me.onNormalViewRefresh : me.updateSpacer,
  67922. scope: me
  67923. };
  67924. normalView.on(listeners);
  67925. lockedHeaderCt = me.lockedGrid.headerCt;
  67926. normalHeaderCt = me.normalGrid.headerCt;
  67927. lockedHeaderCt.lockedCt = true;
  67928. lockedHeaderCt.lockableInjected = true;
  67929. normalHeaderCt.lockableInjected = true;
  67930. lockedHeaderCt.on({
  67931. columnshow: me.onLockedHeaderShow,
  67932. columnhide: me.onLockedHeaderHide,
  67933. columnmove: me.onLockedHeaderMove,
  67934. sortchange: me.onLockedHeaderSortChange,
  67935. columnresize: me.onLockedHeaderResize,
  67936. scope: me
  67937. });
  67938. normalHeaderCt.on({
  67939. columnmove: me.onNormalHeaderMove,
  67940. sortchange: me.onNormalHeaderSortChange,
  67941. scope: me
  67942. });
  67943. me.modifyHeaderCt();
  67944. me.items = [me.lockedGrid, me.normalGrid];
  67945. me.relayHeaderCtEvents(lockedHeaderCt);
  67946. me.relayHeaderCtEvents(normalHeaderCt);
  67947. me.layout = {
  67948. type: 'hbox',
  67949. align: 'stretch'
  67950. };
  67951. },
  67952. processColumns: function(columns){
  67953. var i = 0,
  67954. len = columns.length,
  67955. lockedWidth = 0,
  67956. lockedHeaders = [],
  67957. normalHeaders = [],
  67958. column;
  67959. for (; i < len; ++i) {
  67960. column = columns[i];
  67961. if (!column.isComponent) {
  67962. column = Ext.apply({}, columns[i]);
  67963. }
  67964. column.processed = true;
  67965. if (column.locked) {
  67966. if (!column.hidden) {
  67967. lockedWidth += column.width || Ext.grid.header.Container.prototype.defaultWidth;
  67968. }
  67969. lockedHeaders.push(column);
  67970. } else {
  67971. normalHeaders.push(column);
  67972. }
  67973. if (!column.headerId) {
  67974. column.headerId = (column.initialConfig || column).id || ('L' + (++this.headerCounter));
  67975. }
  67976. }
  67977. return {
  67978. lockedWidth: lockedWidth,
  67979. locked: {
  67980. items: lockedHeaders,
  67981. itemId: 'lockedHeaderCt',
  67982. stretchMaxPartner: '^^>>#normalHeaderCt'
  67983. },
  67984. normal: {
  67985. items: normalHeaders,
  67986. itemId: 'normalHeaderCt',
  67987. stretchMaxPartner: '^^>>#lockedHeaderCt'
  67988. }
  67989. };
  67990. },
  67991. onLockedViewMouseWheel: function(e) {
  67992. var me = this,
  67993. scrollDelta = -me.scrollDelta,
  67994. deltaY = scrollDelta * e.getWheelDeltas().y,
  67995. vertScrollerEl = me.lockedGrid.getView().el.dom,
  67996. verticalCanScrollDown, verticalCanScrollUp;
  67997. if (vertScrollerEl) {
  67998. verticalCanScrollDown = vertScrollerEl.scrollTop !== vertScrollerEl.scrollHeight - vertScrollerEl.clientHeight;
  67999. verticalCanScrollUp = vertScrollerEl.scrollTop !== 0;
  68000. }
  68001. if ((deltaY < 0 && verticalCanScrollUp) || (deltaY > 0 && verticalCanScrollDown)) {
  68002. e.stopEvent();
  68003. me.scrolling = true;
  68004. vertScrollerEl.scrollTop += deltaY;
  68005. me.normalGrid.getView().el.dom.scrollTop = vertScrollerEl.scrollTop;
  68006. me.scrolling = false;
  68007. me.onNormalViewScroll();
  68008. }
  68009. },
  68010. onLockedViewScroll: function() {
  68011. var me = this,
  68012. lockedView = me.lockedGrid.getView(),
  68013. normalView = me.normalGrid.getView(),
  68014. normalTable,
  68015. lockedTable;
  68016. if (!me.scrolling) {
  68017. me.scrolling = true;
  68018. normalView.el.dom.scrollTop = lockedView.el.dom.scrollTop;
  68019. if (me.store.buffered) {
  68020. lockedTable = lockedView.el.child('table', true);
  68021. normalTable = normalView.el.child('table', true);
  68022. lockedTable.style.position = 'absolute';
  68023. }
  68024. me.scrolling = false;
  68025. }
  68026. },
  68027. onNormalViewScroll: function() {
  68028. var me = this,
  68029. lockedView = me.lockedGrid.getView(),
  68030. normalView = me.normalGrid.getView(),
  68031. normalTable,
  68032. lockedTable;
  68033. if (!me.scrolling) {
  68034. me.scrolling = true;
  68035. lockedView.el.dom.scrollTop = normalView.el.dom.scrollTop;
  68036. if (me.store.buffered) {
  68037. lockedTable = lockedView.el.child('table', true);
  68038. normalTable = normalView.el.child('table', true);
  68039. lockedTable.style.position = 'absolute';
  68040. lockedTable.style.top = normalTable.style.top;
  68041. }
  68042. me.scrolling = false;
  68043. }
  68044. },
  68045. onLockedHeaderMove: function() {
  68046. if (this.syncRowHeight) {
  68047. this.onNormalViewRefresh();
  68048. }
  68049. },
  68050. onNormalHeaderMove: function() {
  68051. if (this.syncRowHeight) {
  68052. this.onLockedViewRefresh();
  68053. }
  68054. },
  68055. updateSpacer: function() {
  68056. var me = this,
  68057. lockedViewEl = me.lockedGrid.getView().el,
  68058. normalViewEl = me.normalGrid.getView().el.dom,
  68059. spacerId = lockedViewEl.dom.id + '-spacer',
  68060. spacerHeight = (normalViewEl.offsetHeight - normalViewEl.clientHeight) + 'px';
  68061. me.spacerEl = Ext.getDom(spacerId);
  68062. if (me.spacerEl) {
  68063. me.spacerEl.style.height = spacerHeight;
  68064. } else {
  68065. Ext.core.DomHelper.append(lockedViewEl, {
  68066. id: spacerId,
  68067. style: 'height: ' + spacerHeight
  68068. });
  68069. }
  68070. },
  68071. onLockedViewRefresh: function() {
  68072. if (this.normalGrid.headerCt.getGridColumns().length) {
  68073. var me = this,
  68074. view = me.lockedGrid.getView(),
  68075. el = view.el,
  68076. rowEls = el.query(view.getItemSelector()),
  68077. ln = rowEls.length,
  68078. i = 0;
  68079. me.lockedHeights = [];
  68080. for (; i < ln; i++) {
  68081. me.lockedHeights[i] = rowEls[i].offsetHeight;
  68082. }
  68083. me.syncRowHeights();
  68084. me.updateSpacer();
  68085. }
  68086. },
  68087. onNormalViewRefresh: function() {
  68088. if (this.lockedGrid.headerCt.getGridColumns().length) {
  68089. var me = this,
  68090. view = me.normalGrid.getView(),
  68091. el = view.el,
  68092. rowEls = el.query(view.getItemSelector()),
  68093. ln = rowEls.length,
  68094. i = 0;
  68095. me.normalHeights = [];
  68096. for (; i < ln; i++) {
  68097. me.normalHeights[i] = rowEls[i].offsetHeight;
  68098. }
  68099. me.syncRowHeights();
  68100. me.updateSpacer();
  68101. }
  68102. },
  68103. onLockedViewItemUpdate: function(record, index, node) {
  68104. if (this.normalGrid.headerCt.getGridColumns().length) {
  68105. this.lockedHeights[index] = node.offsetHeight;
  68106. this.syncRowHeights();
  68107. }
  68108. },
  68109. onNormalViewItemUpdate: function(record, index, node) {
  68110. if (this.lockedGrid.headerCt.getGridColumns().length) {
  68111. this.normalHeights[index] = node.offsetHeight;
  68112. this.syncRowHeights();
  68113. }
  68114. },
  68115. syncRowHeights: function() {
  68116. var me = this,
  68117. lockedHeights = me.lockedHeights,
  68118. normalHeights = me.normalHeights,
  68119. ln = lockedHeights.length,
  68120. i = 0,
  68121. lockedView, normalView,
  68122. lockedRowEls, normalRowEls,
  68123. scrollTop;
  68124. if (lockedHeights.length && normalHeights.length) {
  68125. lockedView = me.lockedGrid.getView();
  68126. normalView = me.normalGrid.getView();
  68127. lockedRowEls = lockedView.el.query(lockedView.getItemSelector());
  68128. normalRowEls = normalView.el.query(normalView.getItemSelector());
  68129. for (; i < ln; i++) {
  68130. if (!isNaN(lockedHeights[i]) && !isNaN(normalHeights[i])) {
  68131. if (lockedHeights[i] > normalHeights[i]) {
  68132. Ext.fly(normalRowEls[i]).setHeight(lockedHeights[i]);
  68133. } else if (lockedHeights[i] < normalHeights[i]) {
  68134. Ext.fly(lockedRowEls[i]).setHeight(normalHeights[i]);
  68135. }
  68136. }
  68137. }
  68138. scrollTop = normalView.el.dom.scrollTop;
  68139. normalView.el.dom.scrollTop = scrollTop;
  68140. lockedView.el.dom.scrollTop = scrollTop;
  68141. me.lockedHeights = [];
  68142. me.normalHeights = [];
  68143. }
  68144. },
  68145. modifyHeaderCt: function() {
  68146. var me = this;
  68147. me.lockedGrid.headerCt.getMenuItems = me.getMenuItems(me.lockedGrid.headerCt.getMenuItems, true);
  68148. me.normalGrid.headerCt.getMenuItems = me.getMenuItems(me.normalGrid.headerCt.getMenuItems, false);
  68149. },
  68150. onUnlockMenuClick: function() {
  68151. this.unlock();
  68152. },
  68153. onLockMenuClick: function() {
  68154. this.lock();
  68155. },
  68156. getMenuItems: function(getMenuItems, locked) {
  68157. var me = this,
  68158. unlockText = me.unlockText,
  68159. lockText = me.lockText,
  68160. unlockCls = Ext.baseCSSPrefix + 'hmenu-unlock',
  68161. lockCls = Ext.baseCSSPrefix + 'hmenu-lock',
  68162. unlockHandler = Ext.Function.bind(me.onUnlockMenuClick, me),
  68163. lockHandler = Ext.Function.bind(me.onLockMenuClick, me);
  68164. return function() {
  68165. var o = getMenuItems.call(this);
  68166. o.push('-', {
  68167. cls: unlockCls,
  68168. text: unlockText,
  68169. handler: unlockHandler,
  68170. disabled: !locked
  68171. });
  68172. o.push({
  68173. cls: lockCls,
  68174. text: lockText,
  68175. handler: lockHandler,
  68176. disabled: locked
  68177. });
  68178. return o;
  68179. };
  68180. },
  68181. lock: function(activeHd, toIdx) {
  68182. var me = this,
  68183. normalGrid = me.normalGrid,
  68184. lockedGrid = me.lockedGrid,
  68185. normalHCt = normalGrid.headerCt,
  68186. lockedHCt = lockedGrid.headerCt;
  68187. activeHd = activeHd || normalHCt.getMenu().activeHeader;
  68188. if (activeHd.flex) {
  68189. activeHd.width = activeHd.getWidth();
  68190. delete activeHd.flex;
  68191. }
  68192. Ext.suspendLayouts();
  68193. activeHd.ownerCt.remove(activeHd, false);
  68194. activeHd.locked = true;
  68195. if (Ext.isDefined(toIdx)) {
  68196. lockedHCt.insert(toIdx, activeHd);
  68197. } else {
  68198. lockedHCt.add(activeHd);
  68199. }
  68200. me.syncLockedSection();
  68201. Ext.resumeLayouts(true);
  68202. me.updateSpacer();
  68203. me.fireEvent('lockcolumn', me, activeHd);
  68204. },
  68205. syncLockedSection: function() {
  68206. var me = this;
  68207. me.syncLockedWidth();
  68208. me.lockedGrid.getView().refresh();
  68209. me.normalGrid.getView().refresh();
  68210. },
  68211. syncLockedWidth: function() {
  68212. var me = this,
  68213. locked = me.lockedGrid,
  68214. width = locked.headerCt.getFullWidth(true);
  68215. Ext.suspendLayouts();
  68216. if (width > 0) {
  68217. locked.setWidth(width);
  68218. locked.show();
  68219. } else {
  68220. locked.hide();
  68221. }
  68222. Ext.resumeLayouts(true);
  68223. return width > 0;
  68224. },
  68225. onLockedHeaderResize: function() {
  68226. this.syncLockedWidth();
  68227. },
  68228. onLockedHeaderHide: function() {
  68229. this.syncLockedWidth();
  68230. },
  68231. onLockedHeaderShow: function() {
  68232. this.syncLockedWidth();
  68233. },
  68234. onLockedHeaderSortChange: function(headerCt, header, sortState) {
  68235. if (sortState) {
  68236. this.normalGrid.headerCt.clearOtherSortStates(null, true);
  68237. }
  68238. },
  68239. onNormalHeaderSortChange: function(headerCt, header, sortState) {
  68240. if (sortState) {
  68241. this.lockedGrid.headerCt.clearOtherSortStates(null, true);
  68242. }
  68243. },
  68244. unlock: function(activeHd, toIdx) {
  68245. var me = this,
  68246. normalGrid = me.normalGrid,
  68247. lockedGrid = me.lockedGrid,
  68248. normalHCt = normalGrid.headerCt,
  68249. lockedHCt = lockedGrid.headerCt,
  68250. refreshLocked = false;
  68251. if (!Ext.isDefined(toIdx)) {
  68252. toIdx = 0;
  68253. }
  68254. activeHd = activeHd || lockedHCt.getMenu().activeHeader;
  68255. Ext.suspendLayouts();
  68256. activeHd.ownerCt.remove(activeHd, false);
  68257. if (me.syncLockedWidth()) {
  68258. refreshLocked = true;
  68259. }
  68260. activeHd.locked = false;
  68261. normalHCt.insert(toIdx, activeHd);
  68262. me.normalGrid.getView().refresh();
  68263. if (refreshLocked) {
  68264. me.lockedGrid.getView().refresh();
  68265. }
  68266. Ext.resumeLayouts(true);
  68267. me.fireEvent('unlockcolumn', me, activeHd);
  68268. },
  68269. applyColumnsState: function (columns) {
  68270. var me = this,
  68271. lockedGrid = me.lockedGrid,
  68272. lockedHeaderCt = lockedGrid.headerCt,
  68273. normalHeaderCt = me.normalGrid.headerCt,
  68274. lockedCols = Ext.Array.toMap(lockedHeaderCt.items, 'headerId'),
  68275. normalCols = Ext.Array.toMap(normalHeaderCt.items, 'headerId'),
  68276. locked = [],
  68277. normal = [],
  68278. lockedWidth = 1,
  68279. length = columns.length,
  68280. i, existing,
  68281. lockedDefault,
  68282. col;
  68283. for (i = 0; i < length; i++) {
  68284. col = columns[i];
  68285. lockedDefault = lockedCols[col.id];
  68286. existing = lockedDefault || normalCols[col.id];
  68287. if (existing) {
  68288. if (existing.applyColumnState) {
  68289. existing.applyColumnState(col);
  68290. }
  68291. if (existing.locked === undefined) {
  68292. existing.locked = !!lockedDefault;
  68293. }
  68294. if (existing.locked) {
  68295. locked.push(existing);
  68296. if (!existing.hidden && typeof existing.width == 'number') {
  68297. lockedWidth += existing.width;
  68298. }
  68299. } else {
  68300. normal.push(existing);
  68301. }
  68302. }
  68303. }
  68304. if (locked.length + normal.length == lockedHeaderCt.items.getCount() + normalHeaderCt.items.getCount()) {
  68305. lockedHeaderCt.removeAll(false);
  68306. normalHeaderCt.removeAll(false);
  68307. lockedHeaderCt.add(locked);
  68308. normalHeaderCt.add(normal);
  68309. lockedGrid.setWidth(lockedWidth);
  68310. }
  68311. },
  68312. getColumnsState: function () {
  68313. var me = this,
  68314. locked = me.lockedGrid.headerCt.getColumnsState(),
  68315. normal = me.normalGrid.headerCt.getColumnsState();
  68316. return locked.concat(normal);
  68317. },
  68318. reconfigureLockable: function(store, columns) {
  68319. var me = this,
  68320. lockedGrid = me.lockedGrid,
  68321. normalGrid = me.normalGrid;
  68322. if (columns) {
  68323. Ext.suspendLayouts();
  68324. lockedGrid.headerCt.removeAll();
  68325. normalGrid.headerCt.removeAll();
  68326. columns = me.processColumns(columns);
  68327. lockedGrid.setWidth(columns.lockedWidth);
  68328. lockedGrid.headerCt.add(columns.locked.items);
  68329. normalGrid.headerCt.add(columns.normal.items);
  68330. Ext.resumeLayouts(true);
  68331. }
  68332. if (store) {
  68333. store = Ext.data.StoreManager.lookup(store);
  68334. me.store = store;
  68335. lockedGrid.bindStore(store);
  68336. normalGrid.bindStore(store);
  68337. } else {
  68338. lockedGrid.getView().refresh();
  68339. normalGrid.getView().refresh();
  68340. }
  68341. },
  68342. cloneFeatures: function() {
  68343. var me = this,
  68344. features = me.features,
  68345. feature,
  68346. i = 0, len;
  68347. if (features) {
  68348. len = features.length;
  68349. for (; i < len; i++) {
  68350. feature = features[i];
  68351. if (feature.isFeature) {
  68352. features[i] = feature.clone();
  68353. }
  68354. }
  68355. }
  68356. },
  68357. clonePlugins: function() {
  68358. var me = this,
  68359. plugins = me.plugins,
  68360. plugin,
  68361. i = 0, len;
  68362. if (plugins) {
  68363. len = plugins.length;
  68364. for (; i < len; i++) {
  68365. plugin = plugins[i];
  68366. if (typeof plugin.init === 'function') {
  68367. plugins[i] = plugin.clone();
  68368. }
  68369. }
  68370. }
  68371. }
  68372. }, function() {
  68373. this.borrow(Ext.view.Table, ['constructFeatures']);
  68374. this.borrow(Ext.AbstractComponent, ['constructPlugins', 'constructPlugin']);
  68375. });
  68376. Ext.define('Ext.grid.PagingScroller', {
  68377. percentageFromEdge: 0.35,
  68378. numFromEdge: 2,
  68379. trailingBufferZone: 5,
  68380. leadingBufferZone: 15,
  68381. scrollToLoadBuffer: 200,
  68382. viewSize: 0,
  68383. rowHeight: 21,
  68384. tableStart: 0,
  68385. tableEnd: 0,
  68386. constructor: function(config) {
  68387. var me = this;
  68388. me.variableRowHeight = config.variableRowHeight;
  68389. me.bindView(config.view);
  68390. Ext.apply(me, config);
  68391. me.callParent(arguments);
  68392. },
  68393. bindView: function(view) {
  68394. var me = this,
  68395. viewListeners = {
  68396. scroll: {
  68397. fn: me.onViewScroll,
  68398. element: 'el',
  68399. scope: me
  68400. },
  68401. render: me.onViewRender,
  68402. resize: me.onViewResize,
  68403. boxready: {
  68404. fn: me.onViewResize,
  68405. scope: me,
  68406. single: true
  68407. },
  68408. beforerefresh: me.beforeViewRefresh,
  68409. refresh: me.onViewRefresh,
  68410. scope: me
  68411. },
  68412. storeListeners = {
  68413. guaranteedrange: me.onGuaranteedRange,
  68414. scope: me
  68415. },
  68416. gridListeners = {
  68417. reconfigure: me.onGridReconfigure,
  68418. scope: me
  68419. }, partner;
  68420. if (me.view) {
  68421. if (me.view.el) {
  68422. me.view.el.un('scroll', me.onViewScroll, me);
  68423. }
  68424. partner = view.lockingPartner;
  68425. if (partner) {
  68426. partner.un('refresh', me.onLockRefresh, me);
  68427. }
  68428. me.view.un(viewListeners);
  68429. me.store.un(storeListeners);
  68430. if (me.grid) {
  68431. me.grid.un(gridListeners);
  68432. }
  68433. delete me.view.refreshSize;
  68434. }
  68435. me.view = view;
  68436. me.grid = me.view.up('tablepanel');
  68437. me.store = view.store;
  68438. if (view.rendered) {
  68439. me.viewSize = me.store.viewSize = Math.ceil(view.getHeight() / me.rowHeight) + me.trailingBufferZone + (me.numFromEdge * 2) + me.leadingBufferZone;
  68440. }
  68441. partner = view.lockingPartner;
  68442. if (partner) {
  68443. partner.on('refresh', me.onLockRefresh, me);
  68444. }
  68445. me.view.mon(me.store.pageMap, {
  68446. scope: me,
  68447. clear: me.onCacheClear
  68448. });
  68449. me.view.refreshSize = Ext.Function.createInterceptor(me.view.refreshSize, me.beforeViewrefreshSize, me);
  68450. me.position = 0;
  68451. if (me.grid) {
  68452. me.grid.on(gridListeners);
  68453. } else {
  68454. me.view.on({
  68455. added: function() {
  68456. me.grid = me.view.up('tablepanel');
  68457. me.grid.on(gridListeners);
  68458. },
  68459. single: true
  68460. });
  68461. }
  68462. me.view.on(me.viewListeners = viewListeners);
  68463. me.store.on(storeListeners);
  68464. },
  68465. onCacheClear: function() {
  68466. var me = this;
  68467. if (me.view.rendered && !me.store.isDestroyed) {
  68468. me.ignoreNextScrollEvent = me.view.el.dom.scrollTop !== 0;
  68469. me.view.el.dom.scrollTop = 0;
  68470. delete me.lastScrollDirection;
  68471. delete me.scrollOffset;
  68472. delete me.scrollProportion;
  68473. }
  68474. },
  68475. onGridReconfigure: function (grid) {
  68476. this.bindView(grid.view);
  68477. },
  68478. onViewRender: function() {
  68479. var me = this,
  68480. view = me.view,
  68481. el = me.view.el,
  68482. stretcher;
  68483. me.stretcher = me.createStretcher(view);
  68484. view = view.lockingPartner;
  68485. if (view) {
  68486. stretcher = me.stretcher;
  68487. me.stretcher = new Ext.CompositeElement(stretcher);
  68488. me.stretcher.add(me.createStretcher(view));
  68489. }
  68490. },
  68491. createStretcher: function(view) {
  68492. var el = view.el;
  68493. el.setStyle('position', 'relative');
  68494. return el.createChild({
  68495. style:{
  68496. position: 'absolute',
  68497. width: '1px',
  68498. height: 0,
  68499. top: 0,
  68500. left: 0
  68501. }
  68502. }, el.dom.firstChild);
  68503. },
  68504. onViewResize: function(view, width, height) {
  68505. var me = this,
  68506. newViewSize;
  68507. newViewSize = Math.ceil(height / me.rowHeight) + me.trailingBufferZone + (me.numFromEdge * 2) + me.leadingBufferZone;
  68508. if (newViewSize > me.viewSize) {
  68509. me.viewSize = me.store.viewSize = newViewSize;
  68510. me.handleViewScroll(me.lastScrollDirection || 1);
  68511. }
  68512. },
  68513. beforeViewRefresh: function() {
  68514. var me = this,
  68515. view = me.view,
  68516. rows,
  68517. direction;
  68518. me.focusOnRefresh = Ext.Element.getActiveElement === view.el.dom;
  68519. if (me.variableRowHeight) {
  68520. direction = me.lastScrollDirection;
  68521. me.commonRecordIndex = undefined;
  68522. if (direction && (me.previousStart !== undefined) && (me.scrollProportion === undefined) && (rows = view.getNodes()).length) {
  68523. if (direction === 1) {
  68524. if (me.tableStart <= me.previousEnd) {
  68525. me.commonRecordIndex = rows.length - 1;
  68526. }
  68527. }
  68528. else if (direction === -1) {
  68529. if (me.tableEnd >= me.previousStart) {
  68530. me.commonRecordIndex = 0;
  68531. }
  68532. }
  68533. me.scrollOffset = -view.el.getOffsetsTo(rows[me.commonRecordIndex])[1];
  68534. me.commonRecordIndex -= (me.tableStart - me.previousStart);
  68535. } else {
  68536. me.scrollOffset = undefined;
  68537. }
  68538. }
  68539. },
  68540. onLockRefresh: function(view) {
  68541. view.table.dom.style.position = 'absolute';
  68542. },
  68543. onViewRefresh: function() {
  68544. var me = this,
  68545. store = me.store,
  68546. newScrollHeight,
  68547. view = me.view,
  68548. viewEl = view.el,
  68549. viewDom = viewEl.dom,
  68550. rows,
  68551. newScrollOffset,
  68552. scrollDelta,
  68553. table = view.table.dom,
  68554. tableTop,
  68555. scrollTop;
  68556. if (me.focusOnRefresh) {
  68557. viewEl.focus();
  68558. me.focusOnRefresh = false;
  68559. }
  68560. me.disabled = true;
  68561. if (store.getCount() === store.getTotalCount() || (store.isFiltered() && !store.remoteFilter)) {
  68562. me.stretcher.setHeight(0);
  68563. me.position = viewDom.scrollTop = 0;
  68564. me.setTablePosition('absolute');
  68565. return;
  68566. }
  68567. me.stretcher.setHeight(newScrollHeight = me.getScrollHeight());
  68568. scrollTop = viewDom.scrollTop;
  68569. me.isScrollRefresh = (scrollTop > 0);
  68570. if (me.scrollProportion !== undefined) {
  68571. me.setTablePosition('absolute');
  68572. me.setTableTop((me.scrollProportion ? (newScrollHeight * me.scrollProportion) - (table.offsetHeight * me.scrollProportion) : 0) + 'px');
  68573. } else {
  68574. me.setTablePosition('absolute');
  68575. me.setTableTop((tableTop = (me.tableStart||0) * me.rowHeight) + 'px');
  68576. if (me.scrollOffset) {
  68577. rows = view.getNodes();
  68578. newScrollOffset = -viewEl.getOffsetsTo(rows[me.commonRecordIndex])[1];
  68579. scrollDelta = newScrollOffset - me.scrollOffset;
  68580. me.position = (viewDom.scrollTop += scrollDelta);
  68581. }
  68582. else if ((tableTop > scrollTop) || ((tableTop + table.offsetHeight) < scrollTop + viewDom.clientHeight)) {
  68583. me.lastScrollDirection = -1;
  68584. me.position = viewDom.scrollTop = tableTop;
  68585. }
  68586. }
  68587. me.disabled = false;
  68588. },
  68589. setTablePosition: function(position) {
  68590. this.setViewTableStyle(this.view, 'position', position);
  68591. },
  68592. setTableTop: function(top){
  68593. this.setViewTableStyle(this.view, 'top', top);
  68594. },
  68595. setViewTableStyle: function(view, prop, value) {
  68596. view.el.child('table', true).style[prop] = value;
  68597. view = view.lockingPartner;
  68598. if (view) {
  68599. view.el.child('table', true).style[prop] = value;
  68600. }
  68601. },
  68602. beforeViewrefreshSize: function() {
  68603. if (this.isScrollRefresh) {
  68604. this.view.table.attach(this.view.el.child('table', true));
  68605. return (this.isScrollRefresh = false);
  68606. }
  68607. },
  68608. onGuaranteedRange: function(range, start, end) {
  68609. var me = this,
  68610. ds = me.store;
  68611. if (range.length && me.visibleStart < range[0].index) {
  68612. return;
  68613. }
  68614. me.previousStart = me.tableStart;
  68615. me.previousEnd = me.tableEnd;
  68616. me.tableStart = start;
  68617. me.tableEnd = end;
  68618. ds.loadRecords(range, {
  68619. start: start
  68620. });
  68621. },
  68622. onViewScroll: function(e, t) {
  68623. var me = this,
  68624. view = me.view,
  68625. lastPosition = me.position;
  68626. me.position = view.el.dom.scrollTop;
  68627. if (me.ignoreNextScrollEvent) {
  68628. me.ignoreNextScrollEvent = false;
  68629. return;
  68630. }
  68631. if (!me.disabled) {
  68632. me.lastScrollDirection = me.position > lastPosition ? 1 : -1;
  68633. if (lastPosition !== me.position) {
  68634. me.handleViewScroll(me.lastScrollDirection);
  68635. }
  68636. }
  68637. },
  68638. handleViewScroll: function(direction) {
  68639. var me = this,
  68640. store = me.store,
  68641. view = me.view,
  68642. viewSize = me.viewSize,
  68643. totalCount = store.getTotalCount(),
  68644. highestStartPoint = totalCount - viewSize,
  68645. visibleStart = me.getFirstVisibleRowIndex(),
  68646. visibleEnd = me.getLastVisibleRowIndex(),
  68647. el = view.el.dom,
  68648. requestStart,
  68649. requestEnd;
  68650. if (totalCount >= viewSize) {
  68651. me.scrollProportion = undefined;
  68652. if (direction == -1) {
  68653. if (me.tableStart) {
  68654. if (visibleStart !== undefined) {
  68655. if (visibleStart < (me.tableStart + me.numFromEdge)) {
  68656. requestStart = Math.max(0, visibleEnd + me.trailingBufferZone - viewSize);
  68657. }
  68658. }
  68659. else {
  68660. me.scrollProportion = el.scrollTop / (el.scrollHeight - el.clientHeight);
  68661. requestStart = Math.max(0, totalCount * me.scrollProportion - (viewSize / 2) - me.numFromEdge - ((me.leadingBufferZone + me.trailingBufferZone) / 2));
  68662. }
  68663. }
  68664. }
  68665. else {
  68666. if (visibleStart !== undefined) {
  68667. if (visibleEnd > (me.tableEnd - me.numFromEdge)) {
  68668. requestStart = Math.max(0, visibleStart - me.trailingBufferZone);
  68669. }
  68670. }
  68671. else {
  68672. me.scrollProportion = el.scrollTop / (el.scrollHeight - el.clientHeight);
  68673. requestStart = totalCount * me.scrollProportion - (viewSize / 2) - me.numFromEdge - ((me.leadingBufferZone + me.trailingBufferZone) / 2);
  68674. }
  68675. }
  68676. if (requestStart !== undefined) {
  68677. if (requestStart > highestStartPoint) {
  68678. requestStart = highestStartPoint & ~1;
  68679. requestEnd = totalCount - 1;
  68680. }
  68681. else {
  68682. requestStart = requestStart & ~1;
  68683. requestEnd = requestStart + viewSize - 1;
  68684. }
  68685. if (store.rangeCached(requestStart, requestEnd)) {
  68686. me.cancelLoad();
  68687. store.guaranteeRange(requestStart, requestEnd);
  68688. }
  68689. else {
  68690. me.attemptLoad(requestStart, requestEnd);
  68691. }
  68692. }
  68693. }
  68694. },
  68695. getFirstVisibleRowIndex: function() {
  68696. var me = this,
  68697. view = me.view,
  68698. scrollTop = view.el.dom.scrollTop,
  68699. rows,
  68700. count,
  68701. i,
  68702. rowBottom;
  68703. if (me.variableRowHeight) {
  68704. rows = view.getNodes();
  68705. count = rows.length;
  68706. if (!count) {
  68707. return;
  68708. }
  68709. rowBottom = Ext.fly(rows[0]).getOffsetsTo(view.el)[1];
  68710. for (i = 0; i < count; i++) {
  68711. rowBottom += rows[i].offsetHeight;
  68712. if (rowBottom > view.el.dom.clientHeight) {
  68713. return;
  68714. }
  68715. if (rowBottom > 0) {
  68716. return view.getRecord(rows[i]).index;
  68717. }
  68718. }
  68719. } else {
  68720. return Math.floor(scrollTop / me.rowHeight);
  68721. }
  68722. },
  68723. getLastVisibleRowIndex: function() {
  68724. var me = this,
  68725. store = me.store,
  68726. view = me.view,
  68727. clientHeight = view.el.dom.clientHeight,
  68728. rows,
  68729. count,
  68730. i,
  68731. rowTop;
  68732. if (me.variableRowHeight) {
  68733. rows = view.getNodes();
  68734. if (!rows.length) {
  68735. return;
  68736. }
  68737. count = store.getCount() - 1;
  68738. rowTop = Ext.fly(rows[count]).getOffsetsTo(view.el)[1] + rows[count].offsetHeight;
  68739. for (i = count; i >= 0; i--) {
  68740. rowTop -= rows[i].offsetHeight;
  68741. if (rowTop < 0) {
  68742. return;
  68743. }
  68744. if (rowTop < clientHeight) {
  68745. return view.getRecord(rows[i]).index;
  68746. }
  68747. }
  68748. } else {
  68749. return me.getFirstVisibleRowIndex() + Math.ceil(clientHeight / me.rowHeight) + 1;
  68750. }
  68751. },
  68752. getScrollHeight: function() {
  68753. var me = this,
  68754. view = me.view,
  68755. table,
  68756. firstRow,
  68757. store = me.store,
  68758. deltaHeight = 0,
  68759. doCalcHeight = !me.hasOwnProperty('rowHeight');
  68760. if (me.variableRowHeight) {
  68761. table = me.view.table.dom;
  68762. if (doCalcHeight) {
  68763. me.initialTableHeight = table.offsetHeight;
  68764. me.rowHeight = me.initialTableHeight / me.store.getCount();
  68765. } else {
  68766. deltaHeight = table.offsetHeight - me.initialTableHeight;
  68767. if (store.getCount() > me.viewSize) {
  68768. deltaHeight -= me.rowHeight;
  68769. }
  68770. }
  68771. } else if (doCalcHeight) {
  68772. firstRow = view.el.down(view.getItemSelector());
  68773. if (firstRow) {
  68774. me.rowHeight = firstRow.getHeight(false, true);
  68775. }
  68776. }
  68777. return Math.floor(store.getTotalCount() * me.rowHeight) + deltaHeight;
  68778. },
  68779. attemptLoad: function(start, end) {
  68780. var me = this;
  68781. if (me.scrollToLoadBuffer) {
  68782. if (!me.loadTask) {
  68783. me.loadTask = new Ext.util.DelayedTask(me.doAttemptLoad, me, []);
  68784. }
  68785. me.loadTask.delay(me.scrollToLoadBuffer, me.doAttemptLoad, me, [start, end]);
  68786. } else {
  68787. me.store.guaranteeRange(start, end);
  68788. }
  68789. },
  68790. cancelLoad: function() {
  68791. if (this.loadTask) {
  68792. this.loadTask.cancel();
  68793. }
  68794. },
  68795. doAttemptLoad: function(start, end) {
  68796. this.store.guaranteeRange(start, end);
  68797. },
  68798. destroy: function() {
  68799. var me = this,
  68800. scrollListener = me.viewListeners.scroll;
  68801. me.store.un({
  68802. guaranteedrange: me.onGuaranteedRange,
  68803. scope: me
  68804. });
  68805. me.view.un(me.viewListeners);
  68806. if (me.view.rendered) {
  68807. me.stretcher.remove();
  68808. me.view.el.un('scroll', scrollListener.fn, scrollListener.scope);
  68809. }
  68810. }
  68811. });
  68812. Ext.define('Ext.layout.container.Fit', {
  68813. extend: 'Ext.layout.container.Container',
  68814. alternateClassName: 'Ext.layout.FitLayout',
  68815. alias: 'layout.fit',
  68816. itemCls: Ext.baseCSSPrefix + 'fit-item',
  68817. targetCls: Ext.baseCSSPrefix + 'layout-fit',
  68818. type: 'fit',
  68819. defaultMargins: {
  68820. top: 0,
  68821. right: 0,
  68822. bottom: 0,
  68823. left: 0
  68824. },
  68825. manageMargins: true,
  68826. sizePolicies: {
  68827. 0: { setsWidth: 0, setsHeight: 0 },
  68828. 1: { setsWidth: 1, setsHeight: 0 },
  68829. 2: { setsWidth: 0, setsHeight: 1 },
  68830. 3: { setsWidth: 1, setsHeight: 1 }
  68831. },
  68832. getItemSizePolicy: function (item, ownerSizeModel) {
  68833. var sizeModel = ownerSizeModel || this.owner.getSizeModel(),
  68834. mode = (sizeModel.width.shrinkWrap ? 0 : 1) |
  68835. (sizeModel.height.shrinkWrap ? 0 : 2);
  68836. return this.sizePolicies[mode];
  68837. },
  68838. beginLayoutCycle: function (ownerContext, firstCycle) {
  68839. var me = this,
  68840. resetHeight = me.lastHeightModel && me.lastHeightModel.calculated,
  68841. resetWidth = me.lastWidthModel && me.lastWidthModel.calculated,
  68842. resetSizes = resetWidth || resetHeight,
  68843. maxChildMinHeight = 0, maxChildMinWidth = 0,
  68844. c, childItems, i, item, length, margins, minHeight, minWidth, style, undef;
  68845. me.callParent(arguments);
  68846. if (resetSizes && ownerContext.targetContext.el.dom.tagName.toUpperCase() != 'TD') {
  68847. resetSizes = resetWidth = resetHeight = false;
  68848. }
  68849. childItems = ownerContext.childItems;
  68850. length = childItems.length;
  68851. for (i = 0; i < length; ++i) {
  68852. item = childItems[i];
  68853. if (firstCycle) {
  68854. c = item.target;
  68855. minHeight = c.minHeight;
  68856. minWidth = c.minWidth;
  68857. if (minWidth || minHeight) {
  68858. margins = item.marginInfo || item.getMarginInfo();
  68859. minHeight += margins.height;
  68860. minWidth += margins.height;
  68861. if (maxChildMinHeight < minHeight) {
  68862. maxChildMinHeight = minHeight;
  68863. }
  68864. if (maxChildMinWidth < minWidth) {
  68865. maxChildMinWidth = minWidth;
  68866. }
  68867. }
  68868. }
  68869. if (resetSizes) {
  68870. style = item.el.dom.style;
  68871. if (resetHeight) {
  68872. style.height = '';
  68873. }
  68874. if (resetWidth) {
  68875. style.width = '';
  68876. }
  68877. }
  68878. }
  68879. if (firstCycle) {
  68880. ownerContext.maxChildMinHeight = maxChildMinHeight;
  68881. ownerContext.maxChildMinWidth = maxChildMinWidth;
  68882. }
  68883. c = ownerContext.target;
  68884. ownerContext.overflowX = (!ownerContext.widthModel.shrinkWrap &&
  68885. ownerContext.maxChildMinWidth &&
  68886. (c.autoScroll || c.overflowX)) || undef;
  68887. ownerContext.overflowY = (!ownerContext.heightModel.shrinkWrap &&
  68888. ownerContext.maxChildMinHeight &&
  68889. (c.autoScroll || c.overflowY)) || undef;
  68890. },
  68891. calculate : function (ownerContext) {
  68892. var me = this,
  68893. childItems = ownerContext.childItems,
  68894. length = childItems.length,
  68895. containerSize = me.getContainerSize(ownerContext),
  68896. info = {
  68897. length: length,
  68898. ownerContext: ownerContext,
  68899. targetSize: containerSize
  68900. },
  68901. shrinkWrapWidth = ownerContext.widthModel.shrinkWrap,
  68902. shrinkWrapHeight = ownerContext.heightModel.shrinkWrap,
  68903. overflowX = ownerContext.overflowX,
  68904. overflowY = ownerContext.overflowY,
  68905. scrollbars, scrollbarSize, padding, i, contentWidth, contentHeight;
  68906. if (overflowX || overflowY) {
  68907. scrollbars = me.getScrollbarsNeeded(
  68908. overflowX && containerSize.width, overflowY && containerSize.height,
  68909. ownerContext.maxChildMinWidth, ownerContext.maxChildMinHeight);
  68910. if (scrollbars) {
  68911. scrollbarSize = Ext.getScrollbarSize();
  68912. if (scrollbars & 1) {
  68913. containerSize.height -= scrollbarSize.height;
  68914. }
  68915. if (scrollbars & 2) {
  68916. containerSize.width -= scrollbarSize.width;
  68917. }
  68918. }
  68919. }
  68920. for (i = 0; i < length; ++i) {
  68921. info.index = i;
  68922. me.fitItem(childItems[i], info);
  68923. }
  68924. if (shrinkWrapHeight || shrinkWrapWidth) {
  68925. padding = ownerContext.targetContext.getPaddingInfo();
  68926. if (shrinkWrapWidth) {
  68927. if (overflowY && !containerSize.gotHeight) {
  68928. me.done = false;
  68929. } else {
  68930. contentWidth = info.contentWidth + padding.width;
  68931. if (scrollbars & 2) {
  68932. contentWidth += scrollbarSize.width;
  68933. }
  68934. if (!ownerContext.setContentWidth(contentWidth)) {
  68935. me.done = false;
  68936. }
  68937. }
  68938. }
  68939. if (shrinkWrapHeight) {
  68940. if (overflowX && !containerSize.gotWidth) {
  68941. me.done = false;
  68942. } else {
  68943. contentHeight = info.contentHeight + padding.height;
  68944. if (scrollbars & 1) {
  68945. contentHeight += scrollbarSize.height;
  68946. }
  68947. if (!ownerContext.setContentHeight(contentHeight)) {
  68948. me.done = false;
  68949. }
  68950. }
  68951. }
  68952. }
  68953. },
  68954. fitItem: function (itemContext, info) {
  68955. var me = this;
  68956. if (itemContext.invalid) {
  68957. me.done = false;
  68958. return;
  68959. }
  68960. info.margins = itemContext.getMarginInfo();
  68961. info.needed = info.got = 0;
  68962. me.fitItemWidth(itemContext, info);
  68963. me.fitItemHeight(itemContext, info);
  68964. if (info.got != info.needed) {
  68965. me.done = false;
  68966. }
  68967. },
  68968. fitItemWidth: function (itemContext, info) {
  68969. var contentWidth, width;
  68970. if (info.ownerContext.widthModel.shrinkWrap) {
  68971. width = itemContext.getProp('width') + info.margins.width;
  68972. contentWidth = info.contentWidth;
  68973. if (contentWidth === undefined) {
  68974. info.contentWidth = width;
  68975. } else {
  68976. info.contentWidth = Math.max(contentWidth, width);
  68977. }
  68978. } else if (itemContext.widthModel.calculated) {
  68979. ++info.needed;
  68980. if (info.targetSize.gotWidth) {
  68981. ++info.got;
  68982. this.setItemWidth(itemContext, info);
  68983. }
  68984. }
  68985. this.positionItemX(itemContext, info);
  68986. },
  68987. fitItemHeight: function (itemContext, info) {
  68988. var contentHeight, height;
  68989. if (info.ownerContext.heightModel.shrinkWrap) {
  68990. height = itemContext.getProp('height') + info.margins.height;
  68991. contentHeight = info.contentHeight;
  68992. if (contentHeight === undefined) {
  68993. info.contentHeight = height;
  68994. } else {
  68995. info.contentHeight = Math.max(contentHeight, height);
  68996. }
  68997. } else if (itemContext.heightModel.calculated) {
  68998. ++info.needed;
  68999. if (info.targetSize.gotHeight) {
  69000. ++info.got;
  69001. this.setItemHeight(itemContext, info);
  69002. }
  69003. }
  69004. this.positionItemY(itemContext, info);
  69005. },
  69006. positionItemX: function (itemContext, info) {
  69007. var margins = info.margins;
  69008. if (info.index || margins.left) {
  69009. itemContext.setProp('x', margins.left);
  69010. }
  69011. if (margins.width) {
  69012. itemContext.setProp('margin-right', margins.width);
  69013. }
  69014. },
  69015. positionItemY: function (itemContext, info) {
  69016. var margins = info.margins;
  69017. if (info.index || margins.top) {
  69018. itemContext.setProp('y', margins.top);
  69019. }
  69020. if (margins.height) {
  69021. itemContext.setProp('margin-bottom', margins.height);
  69022. }
  69023. },
  69024. setItemHeight: function (itemContext, info) {
  69025. itemContext.setHeight(info.targetSize.height - info.margins.height);
  69026. },
  69027. setItemWidth: function (itemContext, info) {
  69028. itemContext.setWidth(info.targetSize.width - info.margins.width);
  69029. }
  69030. });
  69031. Ext.define('Ext.panel.Table', {
  69032. extend: 'Ext.panel.Panel',
  69033. alias: 'widget.tablepanel',
  69034. uses: [
  69035. 'Ext.selection.RowModel',
  69036. 'Ext.selection.CellModel',
  69037. 'Ext.selection.CheckboxModel',
  69038. 'Ext.grid.PagingScroller',
  69039. 'Ext.grid.header.Container',
  69040. 'Ext.grid.Lockable'
  69041. ],
  69042. extraBaseCls: Ext.baseCSSPrefix + 'grid',
  69043. extraBodyCls: Ext.baseCSSPrefix + 'grid-body',
  69044. layout: 'fit',
  69045. hasView: false,
  69046. viewType: null,
  69047. selType: 'rowmodel',
  69048. scroll: true,
  69049. deferRowRender: true,
  69050. sortableColumns: true,
  69051. enableLocking: false,
  69052. scrollerOwner: true,
  69053. enableColumnMove: true,
  69054. sealedColumns: false,
  69055. enableColumnResize: true,
  69056. enableColumnHide: true,
  69057. rowLines: true,
  69058. initComponent: function() {
  69059. var me = this,
  69060. scroll = me.scroll,
  69061. vertical = false,
  69062. horizontal = false,
  69063. headerCtCfg = me.columns || me.colModel,
  69064. view,
  69065. border = me.border,
  69066. i, len;
  69067. if (me.columnLines) {
  69068. me.addCls(Ext.baseCSSPrefix + 'grid-with-col-lines');
  69069. }
  69070. if (me.rowLines) {
  69071. me.addCls(Ext.baseCSSPrefix + 'grid-with-row-lines');
  69072. }
  69073. me.store = Ext.data.StoreManager.lookup(me.store || 'ext-empty-store');
  69074. if (headerCtCfg instanceof Ext.grid.header.Container) {
  69075. me.headerCt = headerCtCfg;
  69076. me.headerCt.border = border;
  69077. me.columns = me.headerCt.items.items;
  69078. } else {
  69079. if (Ext.isArray(headerCtCfg)) {
  69080. headerCtCfg = {
  69081. items: headerCtCfg,
  69082. border: border
  69083. };
  69084. }
  69085. Ext.apply(headerCtCfg, {
  69086. forceFit: me.forceFit,
  69087. sortable: me.sortableColumns,
  69088. enableColumnMove: me.enableColumnMove,
  69089. enableColumnResize: me.enableColumnResize,
  69090. enableColumnHide: me.enableColumnHide,
  69091. border: border,
  69092. sealed: me.sealedColumns
  69093. });
  69094. me.columns = headerCtCfg.items;
  69095. if (me.enableLocking || Ext.ComponentQuery.query('{locked !== undefined}{processed != true}', me.columns).length) {
  69096. me.self.mixin('lockable', Ext.grid.Lockable);
  69097. me.injectLockable();
  69098. }
  69099. }
  69100. me.scrollTask = new Ext.util.DelayedTask(me.syncHorizontalScroll, me);
  69101. me.addEvents(
  69102. 'reconfigure',
  69103. 'viewready'
  69104. );
  69105. me.bodyCls = me.bodyCls || '';
  69106. me.bodyCls += (' ' + me.extraBodyCls);
  69107. me.cls = me.cls || '';
  69108. me.cls += (' ' + me.extraBaseCls);
  69109. delete me.autoScroll;
  69110. if (!me.hasView) {
  69111. if (!me.headerCt) {
  69112. me.headerCt = new Ext.grid.header.Container(headerCtCfg);
  69113. }
  69114. me.columns = me.headerCt.items.items;
  69115. if (me.store.buffered && !me.store.remoteSort) {
  69116. for (i = 0, len = me.columns.length; i < len; i++) {
  69117. me.columns[i].sortable = false;
  69118. }
  69119. }
  69120. if (me.hideHeaders) {
  69121. me.headerCt.height = 0;
  69122. me.headerCt.addCls(Ext.baseCSSPrefix + 'grid-header-ct-hidden');
  69123. me.addCls(Ext.baseCSSPrefix + 'grid-header-hidden');
  69124. if (Ext.isIEQuirks) {
  69125. me.headerCt.style = {
  69126. display: 'none'
  69127. };
  69128. }
  69129. }
  69130. if (scroll === true || scroll === 'both') {
  69131. vertical = horizontal = true;
  69132. } else if (scroll === 'horizontal') {
  69133. horizontal = true;
  69134. } else if (scroll === 'vertical') {
  69135. vertical = true;
  69136. }
  69137. me.relayHeaderCtEvents(me.headerCt);
  69138. me.features = me.features || [];
  69139. if (!Ext.isArray(me.features)) {
  69140. me.features = [me.features];
  69141. }
  69142. me.dockedItems = [].concat(me.dockedItems || []);
  69143. me.dockedItems.unshift(me.headerCt);
  69144. me.viewConfig = me.viewConfig || {};
  69145. if (me.store && me.store.buffered) {
  69146. me.viewConfig.preserveScrollOnRefresh = true;
  69147. } else if (me.invalidateScrollerOnRefresh !== undefined) {
  69148. me.viewConfig.preserveScrollOnRefresh = !me.invalidateScrollerOnRefresh;
  69149. }
  69150. view = me.getView();
  69151. me.items = [view];
  69152. me.hasView = true;
  69153. if (vertical) {
  69154. if (me.store.buffered) {
  69155. me.verticalScroller = new Ext.grid.PagingScroller(Ext.apply({
  69156. panel: me,
  69157. store: me.store,
  69158. view: me.view
  69159. }, me.verticalScroller));
  69160. }
  69161. }
  69162. if (horizontal) {
  69163. if (!me.hideHeaders) {
  69164. view.on({
  69165. scroll: {
  69166. fn: me.onHorizontalScroll,
  69167. element: 'el',
  69168. scope: me
  69169. }
  69170. });
  69171. }
  69172. }
  69173. me.mon(view.store, {
  69174. load: me.onStoreLoad,
  69175. scope: me
  69176. });
  69177. me.mon(view, {
  69178. viewready: me.onViewReady,
  69179. refresh: me.onRestoreHorzScroll,
  69180. scope: me
  69181. });
  69182. }
  69183. this.relayEvents(me.view, [
  69184. 'beforeitemmousedown',
  69185. 'beforeitemmouseup',
  69186. 'beforeitemmouseenter',
  69187. 'beforeitemmouseleave',
  69188. 'beforeitemclick',
  69189. 'beforeitemdblclick',
  69190. 'beforeitemcontextmenu',
  69191. 'itemmousedown',
  69192. 'itemmouseup',
  69193. 'itemmouseenter',
  69194. 'itemmouseleave',
  69195. 'itemclick',
  69196. 'itemdblclick',
  69197. 'itemcontextmenu',
  69198. 'beforecontainermousedown',
  69199. 'beforecontainermouseup',
  69200. 'beforecontainermouseover',
  69201. 'beforecontainermouseout',
  69202. 'beforecontainerclick',
  69203. 'beforecontainerdblclick',
  69204. 'beforecontainercontextmenu',
  69205. 'containermouseup',
  69206. 'containermouseover',
  69207. 'containermouseout',
  69208. 'containerclick',
  69209. 'containerdblclick',
  69210. 'containercontextmenu',
  69211. 'selectionchange',
  69212. 'beforeselect',
  69213. 'select',
  69214. 'beforedeselect',
  69215. 'deselect'
  69216. ]);
  69217. me.callParent(arguments);
  69218. me.addStateEvents(['columnresize', 'columnmove', 'columnhide', 'columnshow', 'sortchange']);
  69219. if (me.headerCt) {
  69220. me.headerCt.on('afterlayout', me.onRestoreHorzScroll, me);
  69221. }
  69222. },
  69223. relayHeaderCtEvents: function (headerCt) {
  69224. this.relayEvents(headerCt, [
  69225. 'columnresize',
  69226. 'columnmove',
  69227. 'columnhide',
  69228. 'columnshow',
  69229. 'sortchange'
  69230. ]);
  69231. },
  69232. getState: function(){
  69233. var me = this,
  69234. state = me.callParent(),
  69235. sorter = me.store.sorters.first();
  69236. state = me.addPropertyToState(state, 'columns', (me.headerCt || me).getColumnsState());
  69237. if (sorter) {
  69238. state = me.addPropertyToState(state, 'sort', {
  69239. property: sorter.property,
  69240. direction: sorter.direction,
  69241. root: sorter.root
  69242. });
  69243. }
  69244. return state;
  69245. },
  69246. applyState: function(state) {
  69247. var me = this,
  69248. sorter = state.sort,
  69249. store = me.store,
  69250. columns = state.columns;
  69251. delete state.columns;
  69252. me.callParent(arguments);
  69253. if (columns) {
  69254. (me.headerCt || me).applyColumnsState(columns);
  69255. }
  69256. if (sorter) {
  69257. if (store.remoteSort) {
  69258. store.sort({
  69259. property: sorter.property,
  69260. direction: sorter.direction,
  69261. root: sorter.root
  69262. }, null, false);
  69263. } else {
  69264. store.sort(sorter.property, sorter.direction);
  69265. }
  69266. }
  69267. },
  69268. getStore: function(){
  69269. return this.store;
  69270. },
  69271. getView: function() {
  69272. var me = this,
  69273. sm;
  69274. if (!me.view) {
  69275. sm = me.getSelectionModel();
  69276. me.view = Ext.widget(Ext.apply({}, me.viewConfig, {
  69277. grid: me,
  69278. deferInitialRefresh: me.deferRowRender !== false,
  69279. scroll: me.scroll,
  69280. xtype: me.viewType,
  69281. store: me.store,
  69282. headerCt: me.headerCt,
  69283. selModel: sm,
  69284. features: me.features,
  69285. panel: me,
  69286. emptyText : me.emptyText ? '<div class="' + Ext.baseCSSPrefix + 'grid-empty">' + me.emptyText + '</div>' : ''
  69287. }));
  69288. me.view.getComponentLayout().headerCt = me.headerCt;
  69289. me.mon(me.view, {
  69290. uievent: me.processEvent,
  69291. scope: me
  69292. });
  69293. sm.view = me.view;
  69294. me.headerCt.view = me.view;
  69295. me.relayEvents(me.view, [
  69296. 'cellclick',
  69297. 'celldblclick'
  69298. ]);
  69299. }
  69300. return me.view;
  69301. },
  69302. setAutoScroll: Ext.emptyFn,
  69303. processEvent: function(type, view, cell, recordIndex, cellIndex, e) {
  69304. var me = this,
  69305. header;
  69306. if (cellIndex !== -1) {
  69307. header = me.headerCt.getGridColumns()[cellIndex];
  69308. return header.processEvent.apply(header, arguments);
  69309. }
  69310. },
  69311. determineScrollbars: function () {
  69312. },
  69313. invalidateScroller: function () {
  69314. },
  69315. scrollByDeltaY: function(yDelta, animate) {
  69316. this.getView().scrollBy(0, yDelta, animate);
  69317. },
  69318. scrollByDeltaX: function(xDelta, animate) {
  69319. this.getView().scrollBy(xDelta, 0, animate);
  69320. },
  69321. afterCollapse: function() {
  69322. var me = this;
  69323. me.saveScrollPos();
  69324. me.saveScrollPos();
  69325. me.callParent(arguments);
  69326. },
  69327. afterExpand: function() {
  69328. var me = this;
  69329. me.callParent(arguments);
  69330. me.restoreScrollPos();
  69331. me.restoreScrollPos();
  69332. },
  69333. saveScrollPos: Ext.emptyFn,
  69334. restoreScrollPos: Ext.emptyFn,
  69335. onHeaderResize: function(){
  69336. this.delayScroll();
  69337. },
  69338. onHeaderMove: function(headerCt, header, colsToMove, fromIdx, toIdx) {
  69339. var me = this;
  69340. if (me.optimizedColumnMove === false) {
  69341. me.view.refresh();
  69342. }
  69343. else {
  69344. me.view.moveColumn(fromIdx, toIdx, colsToMove);
  69345. }
  69346. me.delayScroll();
  69347. },
  69348. onHeaderHide: function(headerCt, header) {
  69349. this.delayScroll();
  69350. },
  69351. onHeaderShow: function(headerCt, header) {
  69352. this.delayScroll();
  69353. },
  69354. delayScroll: function(){
  69355. var target = this.getScrollTarget().el;
  69356. if (target) {
  69357. this.scrollTask.delay(10, null, null, [target.dom.scrollLeft]);
  69358. }
  69359. },
  69360. onViewReady: function() {
  69361. this.fireEvent('viewready', this);
  69362. },
  69363. onRestoreHorzScroll: function() {
  69364. var left = this.scrollLeftPos;
  69365. if (left) {
  69366. this.syncHorizontalScroll(left, true);
  69367. }
  69368. },
  69369. getScrollerOwner: function() {
  69370. var rootCmp = this;
  69371. if (!this.scrollerOwner) {
  69372. rootCmp = this.up('[scrollerOwner]');
  69373. }
  69374. return rootCmp;
  69375. },
  69376. getLhsMarker: function() {
  69377. var me = this;
  69378. return me.lhsMarker || (me.lhsMarker = Ext.DomHelper.append(me.el, {
  69379. cls: Ext.baseCSSPrefix + 'grid-resize-marker'
  69380. }, true));
  69381. },
  69382. getRhsMarker: function() {
  69383. var me = this;
  69384. return me.rhsMarker || (me.rhsMarker = Ext.DomHelper.append(me.el, {
  69385. cls: Ext.baseCSSPrefix + 'grid-resize-marker'
  69386. }, true));
  69387. },
  69388. getSelectionModel: function(){
  69389. if (!this.selModel) {
  69390. this.selModel = {};
  69391. }
  69392. var mode = 'SINGLE',
  69393. type;
  69394. if (this.simpleSelect) {
  69395. mode = 'SIMPLE';
  69396. } else if (this.multiSelect) {
  69397. mode = 'MULTI';
  69398. }
  69399. Ext.applyIf(this.selModel, {
  69400. allowDeselect: this.allowDeselect,
  69401. mode: mode
  69402. });
  69403. if (!this.selModel.events) {
  69404. type = this.selModel.selType || this.selType;
  69405. this.selModel = Ext.create('selection.' + type, this.selModel);
  69406. }
  69407. if (!this.selModel.hasRelaySetup) {
  69408. this.relayEvents(this.selModel, [
  69409. 'selectionchange', 'beforeselect', 'beforedeselect', 'select', 'deselect'
  69410. ]);
  69411. this.selModel.hasRelaySetup = true;
  69412. }
  69413. if (this.disableSelection) {
  69414. this.selModel.locked = true;
  69415. }
  69416. return this.selModel;
  69417. },
  69418. getScrollTarget: function(){
  69419. var owner = this.getScrollerOwner(),
  69420. items = owner.query('tableview');
  69421. return items[1] || items[0];
  69422. },
  69423. onHorizontalScroll: function(event, target) {
  69424. this.syncHorizontalScroll(target.scrollLeft);
  69425. },
  69426. syncHorizontalScroll: function(left, setBody) {
  69427. var me = this,
  69428. scrollTarget;
  69429. setBody = setBody === true;
  69430. if (me.rendered && (setBody || left !== me.scrollLeftPos)) {
  69431. if (setBody) {
  69432. scrollTarget = me.getScrollTarget();
  69433. scrollTarget.el.dom.scrollLeft = left;
  69434. }
  69435. me.headerCt.el.dom.scrollLeft = left;
  69436. me.scrollLeftPos = left;
  69437. }
  69438. },
  69439. onStoreLoad: Ext.emptyFn,
  69440. getEditorParent: function() {
  69441. return this.body;
  69442. },
  69443. bindStore: function(store) {
  69444. var me = this;
  69445. me.store = store;
  69446. me.getView().bindStore(store);
  69447. },
  69448. beforeDestroy: function(){
  69449. Ext.destroy(this.verticalScroller);
  69450. this.callParent();
  69451. },
  69452. reconfigure: function(store, columns) {
  69453. var me = this,
  69454. headerCt = me.headerCt;
  69455. if (me.lockable) {
  69456. me.reconfigureLockable(store, columns);
  69457. } else {
  69458. Ext.suspendLayouts();
  69459. if (columns) {
  69460. delete me.scrollLeftPos;
  69461. headerCt.removeAll();
  69462. headerCt.add(columns);
  69463. }
  69464. if (store) {
  69465. store = Ext.StoreManager.lookup(store);
  69466. me.bindStore(store);
  69467. } else {
  69468. me.getView().refresh();
  69469. }
  69470. headerCt.setSortState();
  69471. Ext.resumeLayouts(true);
  69472. }
  69473. me.fireEvent('reconfigure', me, store, columns);
  69474. }
  69475. });
  69476. Ext.define('Ext.grid.View', {
  69477. extend: 'Ext.view.Table',
  69478. alias: 'widget.gridview',
  69479. stripeRows: true,
  69480. autoScroll: true
  69481. });
  69482. Ext.define('Ext.grid.Panel', {
  69483. extend: 'Ext.panel.Table',
  69484. requires: ['Ext.grid.View'],
  69485. alias: ['widget.gridpanel', 'widget.grid'],
  69486. alternateClassName: ['Ext.list.ListView', 'Ext.ListView', 'Ext.grid.GridPanel'],
  69487. viewType: 'gridview',
  69488. lockable: false,
  69489. bothCfgCopy: [
  69490. 'invalidateScrollerOnRefresh',
  69491. 'hideHeaders',
  69492. 'enableColumnHide',
  69493. 'enableColumnMove',
  69494. 'enableColumnResize',
  69495. 'sortableColumns'
  69496. ],
  69497. normalCfgCopy: [
  69498. 'verticalScroller',
  69499. 'verticalScrollDock',
  69500. 'verticalScrollerType',
  69501. 'scroll'
  69502. ],
  69503. lockedCfgCopy: [],
  69504. rowLines: true
  69505. });
  69506. Ext.define('Ext.grid.RowEditor', {
  69507. extend: 'Ext.form.Panel',
  69508. requires: [
  69509. 'Ext.tip.ToolTip',
  69510. 'Ext.util.HashMap',
  69511. 'Ext.util.KeyNav'
  69512. ],
  69513. saveBtnText : 'Update',
  69514. cancelBtnText: 'Cancel',
  69515. errorsText: 'Errors',
  69516. dirtyText: 'You need to commit or cancel your changes',
  69517. lastScrollLeft: 0,
  69518. lastScrollTop: 0,
  69519. border: false,
  69520. hideMode: 'offsets',
  69521. initComponent: function() {
  69522. var me = this,
  69523. form;
  69524. me.cls = Ext.baseCSSPrefix + 'grid-row-editor';
  69525. me.layout = {
  69526. type: 'hbox',
  69527. align: 'middle'
  69528. };
  69529. me.columns = new Ext.util.HashMap();
  69530. me.columns.getKey = function(columnHeader) {
  69531. var f;
  69532. if (columnHeader.getEditor) {
  69533. f = columnHeader.getEditor();
  69534. if (f) {
  69535. return f.id;
  69536. }
  69537. }
  69538. return columnHeader.id;
  69539. };
  69540. me.mon(me.columns, {
  69541. add: me.onFieldAdd,
  69542. remove: me.onFieldRemove,
  69543. replace: me.onFieldReplace,
  69544. scope: me
  69545. });
  69546. me.callParent(arguments);
  69547. if (me.fields) {
  69548. me.setField(me.fields);
  69549. delete me.fields;
  69550. }
  69551. me.mon(Ext.container.Container.hierarchyEventSource, {
  69552. scope: me,
  69553. show: me.repositionIfVisible
  69554. });
  69555. form = me.getForm();
  69556. form.trackResetOnLoad = true;
  69557. },
  69558. onFieldChange: function() {
  69559. var me = this,
  69560. form = me.getForm(),
  69561. valid = form.isValid();
  69562. if (me.errorSummary && me.isVisible()) {
  69563. me[valid ? 'hideToolTip' : 'showToolTip']();
  69564. }
  69565. me.updateButton(valid);
  69566. me.isValid = valid;
  69567. },
  69568. updateButton: function(valid){
  69569. var buttons = this.floatingButtons;
  69570. if (buttons) {
  69571. buttons.child('#update').setDisabled(!valid);
  69572. }
  69573. },
  69574. afterRender: function() {
  69575. var me = this,
  69576. plugin = me.editingPlugin;
  69577. me.callParent(arguments);
  69578. me.mon(me.renderTo, 'scroll', me.onCtScroll, me, { buffer: 100 });
  69579. me.mon(me.el, {
  69580. click: Ext.emptyFn,
  69581. stopPropagation: true
  69582. });
  69583. me.el.swallowEvent([
  69584. 'keypress',
  69585. 'keydown'
  69586. ]);
  69587. me.keyNav = new Ext.util.KeyNav(me.el, {
  69588. enter: plugin.completeEdit,
  69589. esc: plugin.onEscKey,
  69590. scope: plugin
  69591. });
  69592. me.mon(plugin.view, {
  69593. beforerefresh: me.onBeforeViewRefresh,
  69594. refresh: me.onViewRefresh,
  69595. itemremove: me.onViewItemRemove,
  69596. scope: me
  69597. });
  69598. },
  69599. onBeforeViewRefresh: function(view) {
  69600. var me = this,
  69601. viewDom = view.el.dom;
  69602. if (me.el.dom.parentNode === viewDom) {
  69603. viewDom.removeChild(me.el.dom);
  69604. }
  69605. },
  69606. onViewRefresh: function(view) {
  69607. var me = this,
  69608. viewDom = view.el.dom,
  69609. context = me.context,
  69610. idx;
  69611. viewDom.appendChild(me.el.dom);
  69612. if (context && (idx = context.store.indexOf(context.record)) >= 0) {
  69613. context.row = view.getNode(idx);
  69614. me.reposition();
  69615. if (me.tooltip && me.tooltip.isVisible()) {
  69616. me.tooltip.setTarget(context.row);
  69617. }
  69618. } else {
  69619. me.editingPlugin.cancelEdit();
  69620. }
  69621. },
  69622. onViewItemRemove: function(record, index) {
  69623. var context = this.context;
  69624. if (context && record === context.record) {
  69625. this.editingPlugin.cancelEdit();
  69626. }
  69627. },
  69628. onCtScroll: function(e, target) {
  69629. var me = this,
  69630. scrollTop = target.scrollTop,
  69631. scrollLeft = target.scrollLeft;
  69632. if (scrollTop !== me.lastScrollTop) {
  69633. me.lastScrollTop = scrollTop;
  69634. if ((me.tooltip && me.tooltip.isVisible()) || me.hiddenTip) {
  69635. me.repositionTip();
  69636. }
  69637. }
  69638. if (scrollLeft !== me.lastScrollLeft) {
  69639. me.lastScrollLeft = scrollLeft;
  69640. me.reposition();
  69641. }
  69642. },
  69643. onColumnAdd: function(column) {
  69644. if (!column.isGroupHeader) {
  69645. this.setField(column);
  69646. }
  69647. },
  69648. onColumnRemove: function(column) {
  69649. this.columns.remove(column);
  69650. },
  69651. onColumnResize: function(column, width) {
  69652. if (!column.isGroupHeader) {
  69653. column.getEditor().setWidth(width - 2);
  69654. this.repositionIfVisible();
  69655. }
  69656. },
  69657. onColumnHide: function(column) {
  69658. if (!column.isGroupHeader) {
  69659. column.getEditor().hide();
  69660. this.repositionIfVisible();
  69661. }
  69662. },
  69663. onColumnShow: function(column) {
  69664. var field = column.getEditor();
  69665. field.setWidth(column.getWidth() - 2).show();
  69666. this.repositionIfVisible();
  69667. },
  69668. onColumnMove: function(column, fromIdx, toIdx) {
  69669. if (!column.isGroupHeader) {
  69670. var field = column.getEditor();
  69671. if (this.items.indexOf(field) != toIdx) {
  69672. this.move(fromIdx, toIdx);
  69673. }
  69674. }
  69675. },
  69676. onFieldAdd: function(map, fieldId, column) {
  69677. var me = this,
  69678. colIdx,
  69679. field;
  69680. if (!column.isGroupHeader) {
  69681. colIdx = me.editingPlugin.grid.headerCt.getHeaderIndex(column);
  69682. field = column.getEditor({ xtype: 'displayfield' });
  69683. me.insert(colIdx, field);
  69684. }
  69685. },
  69686. onFieldRemove: function(map, fieldId, column) {
  69687. var me = this,
  69688. field,
  69689. fieldEl;
  69690. if (!column.isGroupHeader) {
  69691. field = column.getEditor();
  69692. fieldEl = field.el;
  69693. me.remove(field, false);
  69694. if (fieldEl) {
  69695. fieldEl.remove();
  69696. }
  69697. }
  69698. },
  69699. onFieldReplace: function(map, fieldId, column, oldColumn) {
  69700. this.onFieldRemove(map, fieldId, oldColumn);
  69701. },
  69702. clearFields: function() {
  69703. var map = this.columns,
  69704. key;
  69705. for (key in map) {
  69706. if (map.hasOwnProperty(key)) {
  69707. map.removeAtKey(key);
  69708. }
  69709. }
  69710. },
  69711. getFloatingButtons: function() {
  69712. var me = this,
  69713. cssPrefix = Ext.baseCSSPrefix,
  69714. btnsCss = cssPrefix + 'grid-row-editor-buttons',
  69715. plugin = me.editingPlugin,
  69716. minWidth = Ext.panel.Panel.prototype.minButtonWidth,
  69717. btns;
  69718. if (!me.floatingButtons) {
  69719. btns = me.floatingButtons = new Ext.Container({
  69720. renderTpl: [
  69721. '<div class="{baseCls}-ml"></div>',
  69722. '<div class="{baseCls}-mr"></div>',
  69723. '<div class="{baseCls}-bl"></div>',
  69724. '<div class="{baseCls}-br"></div>',
  69725. '<div class="{baseCls}-bc"></div>',
  69726. '{%this.renderContainer(out,values)%}'
  69727. ],
  69728. width: 200,
  69729. renderTo: me.el,
  69730. baseCls: btnsCss,
  69731. layout: {
  69732. type: 'hbox',
  69733. align: 'middle'
  69734. },
  69735. defaults: {
  69736. flex: 1,
  69737. margins: '0 1 0 1'
  69738. },
  69739. items: [{
  69740. itemId: 'update',
  69741. xtype: 'button',
  69742. handler: plugin.completeEdit,
  69743. scope: plugin,
  69744. text: me.saveBtnText,
  69745. minWidth: minWidth
  69746. }, {
  69747. xtype: 'button',
  69748. handler: plugin.cancelEdit,
  69749. scope: plugin,
  69750. text: me.cancelBtnText,
  69751. minWidth: minWidth
  69752. }]
  69753. });
  69754. me.mon(btns.el, {
  69755. mousedown: Ext.emptyFn,
  69756. click: Ext.emptyFn,
  69757. stopEvent: true
  69758. });
  69759. }
  69760. return me.floatingButtons;
  69761. },
  69762. repositionIfVisible: function(c){
  69763. var me = this,
  69764. view = me.view;
  69765. if (c && (c == me || !view.isDescendantOf(c))) {
  69766. return;
  69767. }
  69768. if (me.isVisible() && view.isVisible(true)) {
  69769. me.reposition();
  69770. }
  69771. },
  69772. reposition: function(animateConfig) {
  69773. var me = this,
  69774. context = me.context,
  69775. row = context && Ext.get(context.row),
  69776. btns = me.getFloatingButtons(),
  69777. btnEl = btns.el,
  69778. grid = me.editingPlugin.grid,
  69779. viewEl = grid.view.el,
  69780. mainBodyWidth = grid.headerCt.getFullWidth(),
  69781. scrollerWidth = grid.getWidth(),
  69782. width = Math.min(mainBodyWidth, scrollerWidth),
  69783. scrollLeft = grid.view.el.dom.scrollLeft,
  69784. btnWidth = btns.getWidth(),
  69785. left = (width - btnWidth) / 2 + scrollLeft,
  69786. y, rowH, newHeight,
  69787. invalidateScroller = function() {
  69788. btnEl.scrollIntoView(viewEl, false);
  69789. if (animateConfig && animateConfig.callback) {
  69790. animateConfig.callback.call(animateConfig.scope || me);
  69791. }
  69792. },
  69793. animObj;
  69794. if (row && Ext.isElement(row.dom)) {
  69795. row.scrollIntoView(viewEl, false);
  69796. y = row.getXY()[1] - 5;
  69797. rowH = row.getHeight();
  69798. newHeight = rowH + (me.editingPlugin.grid.rowLines ? 9 : 10);
  69799. if (me.getHeight() != newHeight) {
  69800. me.setHeight(newHeight);
  69801. me.el.setLeft(0);
  69802. }
  69803. if (animateConfig) {
  69804. animObj = {
  69805. to: {
  69806. y: y
  69807. },
  69808. duration: animateConfig.duration || 125,
  69809. listeners: {
  69810. afteranimate: function() {
  69811. invalidateScroller();
  69812. y = row.getXY()[1] - 5;
  69813. }
  69814. }
  69815. };
  69816. me.el.animate(animObj);
  69817. } else {
  69818. me.el.setY(y);
  69819. invalidateScroller();
  69820. }
  69821. }
  69822. if (me.getWidth() != mainBodyWidth) {
  69823. me.setWidth(mainBodyWidth);
  69824. }
  69825. btnEl.setLeft(left);
  69826. },
  69827. getEditor: function(fieldInfo) {
  69828. var me = this;
  69829. if (Ext.isNumber(fieldInfo)) {
  69830. return me.query('>[isFormField]')[fieldInfo];
  69831. } else if (fieldInfo.isHeader && !fieldInfo.isGroupHeader) {
  69832. return fieldInfo.getEditor();
  69833. }
  69834. },
  69835. removeField: function(field) {
  69836. var me = this;
  69837. field = me.getEditor(field);
  69838. me.mun(field, 'validitychange', me.onValidityChange, me);
  69839. me.columns.removeAtKey(field.id);
  69840. Ext.destroy(field);
  69841. },
  69842. setField: function(column) {
  69843. var me = this,
  69844. i,
  69845. length, field;
  69846. if (Ext.isArray(column)) {
  69847. length = column.length;
  69848. for (i = 0; i < length; i++) {
  69849. me.setField(column[i]);
  69850. }
  69851. return;
  69852. }
  69853. field = column.getEditor(null, {
  69854. xtype: 'displayfield',
  69855. getModelData: function() {
  69856. return null;
  69857. }
  69858. });
  69859. field.margins = '0 0 0 2';
  69860. me.mon(field, 'change', me.onFieldChange, me);
  69861. if (me.isVisible() && me.context) {
  69862. if (field.is('displayfield')) {
  69863. me.renderColumnData(field, me.context.record, column);
  69864. } else {
  69865. field.suspendEvents();
  69866. field.setValue(me.context.record.get(column.dataIndex));
  69867. field.resumeEvents();
  69868. }
  69869. }
  69870. me.columns.add(field.id, column);
  69871. if (column.hidden) {
  69872. me.onColumnHide(column);
  69873. } else if (column.rendered) {
  69874. me.onColumnShow(column);
  69875. }
  69876. },
  69877. loadRecord: function(record) {
  69878. var me = this,
  69879. form = me.getForm(),
  69880. fields = form.getFields(),
  69881. items = fields.items,
  69882. length = items.length,
  69883. i, displayFields,
  69884. isValid;
  69885. for (i = 0; i < length; i++) {
  69886. items[i].suspendEvents();
  69887. }
  69888. form.loadRecord(record);
  69889. for (i = 0; i < length; i++) {
  69890. items[i].resumeEvents();
  69891. }
  69892. isValid = form.isValid();
  69893. if (me.errorSummary) {
  69894. if (isValid) {
  69895. me.hideToolTip();
  69896. } else {
  69897. me.showToolTip();
  69898. }
  69899. }
  69900. me.updateButton(isValid);
  69901. displayFields = me.query('>displayfield');
  69902. length = displayFields.length;
  69903. for (i = 0; i < length; i++) {
  69904. me.renderColumnData(displayFields[i], record);
  69905. }
  69906. },
  69907. renderColumnData: function(field, record, activeColumn) {
  69908. var me = this,
  69909. grid = me.editingPlugin.grid,
  69910. headerCt = grid.headerCt,
  69911. view = grid.view,
  69912. store = view.store,
  69913. column = activeColumn || me.columns.get(field.id),
  69914. value = record.get(column.dataIndex),
  69915. renderer = column.editRenderer || column.renderer,
  69916. metaData,
  69917. rowIdx,
  69918. colIdx;
  69919. if (renderer) {
  69920. metaData = { tdCls: '', style: '' };
  69921. rowIdx = store.indexOf(record);
  69922. colIdx = headerCt.getHeaderIndex(column);
  69923. value = renderer.call(
  69924. column.scope || headerCt.ownerCt,
  69925. value,
  69926. metaData,
  69927. record,
  69928. rowIdx,
  69929. colIdx,
  69930. store,
  69931. view
  69932. );
  69933. }
  69934. field.setRawValue(value);
  69935. field.resetOriginalValue();
  69936. },
  69937. beforeEdit: function() {
  69938. var me = this;
  69939. if (me.isVisible() && me.errorSummary && !me.autoCancel && me.isDirty()) {
  69940. me.showToolTip();
  69941. return false;
  69942. }
  69943. },
  69944. startEdit: function(record, columnHeader) {
  69945. var me = this,
  69946. grid = me.editingPlugin.grid,
  69947. store = grid.store,
  69948. context = me.context = Ext.apply(me.editingPlugin.context, {
  69949. view: grid.getView(),
  69950. store: store
  69951. });
  69952. context.grid.getSelectionModel().select(record);
  69953. me.loadRecord(record);
  69954. if (!me.isVisible()) {
  69955. me.show();
  69956. me.focusContextCell();
  69957. } else {
  69958. me.reposition({
  69959. callback: this.focusContextCell
  69960. });
  69961. }
  69962. },
  69963. focusContextCell: function() {
  69964. var field = this.getEditor(this.context.colIdx);
  69965. if (field && field.focus) {
  69966. field.focus();
  69967. }
  69968. },
  69969. cancelEdit: function() {
  69970. var me = this,
  69971. form = me.getForm(),
  69972. fields = form.getFields(),
  69973. items = fields.items,
  69974. length = items.length,
  69975. i;
  69976. me.hide();
  69977. form.clearInvalid();
  69978. for (i = 0; i < length; i++) {
  69979. items[i].suspendEvents();
  69980. }
  69981. form.reset();
  69982. for (i = 0; i < length; i++) {
  69983. items[i].resumeEvents();
  69984. }
  69985. },
  69986. completeEdit: function() {
  69987. var me = this,
  69988. form = me.getForm();
  69989. if (!form.isValid()) {
  69990. return;
  69991. }
  69992. form.updateRecord(me.context.record);
  69993. me.hide();
  69994. return true;
  69995. },
  69996. onShow: function() {
  69997. this.callParent(arguments);
  69998. this.reposition();
  69999. },
  70000. onHide: function() {
  70001. var me = this;
  70002. me.callParent(arguments);
  70003. if (me.tooltip) {
  70004. me.hideToolTip();
  70005. }
  70006. if (me.context) {
  70007. me.context.view.focus();
  70008. me.context = null;
  70009. }
  70010. },
  70011. isDirty: function() {
  70012. var me = this,
  70013. form = me.getForm();
  70014. return form.isDirty();
  70015. },
  70016. getToolTip: function() {
  70017. return this.tooltip || (this.tooltip = new Ext.tip.ToolTip({
  70018. cls: Ext.baseCSSPrefix + 'grid-row-editor-errors',
  70019. title: this.errorsText,
  70020. autoHide: false,
  70021. closable: true,
  70022. closeAction: 'disable',
  70023. anchor: 'left'
  70024. }));
  70025. },
  70026. hideToolTip: function() {
  70027. var me = this,
  70028. tip = me.getToolTip();
  70029. if (tip.rendered) {
  70030. tip.disable();
  70031. }
  70032. me.hiddenTip = false;
  70033. },
  70034. showToolTip: function() {
  70035. var me = this,
  70036. tip = me.getToolTip(),
  70037. context = me.context,
  70038. row = Ext.get(context.row),
  70039. viewEl = context.grid.view.el;
  70040. tip.setTarget(row);
  70041. tip.showAt([-10000, -10000]);
  70042. tip.update(me.getErrors());
  70043. tip.mouseOffset = [viewEl.getWidth() - row.getWidth() + me.lastScrollLeft + 15, 0];
  70044. me.repositionTip();
  70045. tip.doLayout();
  70046. tip.enable();
  70047. },
  70048. repositionTip: function() {
  70049. var me = this,
  70050. tip = me.getToolTip(),
  70051. context = me.context,
  70052. row = Ext.get(context.row),
  70053. viewEl = context.grid.view.el,
  70054. viewHeight = viewEl.getHeight(),
  70055. viewTop = me.lastScrollTop,
  70056. viewBottom = viewTop + viewHeight,
  70057. rowHeight = row.getHeight(),
  70058. rowTop = row.dom.offsetTop,
  70059. rowBottom = rowTop + rowHeight;
  70060. if (rowBottom > viewTop && rowTop < viewBottom) {
  70061. tip.show();
  70062. me.hiddenTip = false;
  70063. } else {
  70064. tip.hide();
  70065. me.hiddenTip = true;
  70066. }
  70067. },
  70068. getErrors: function() {
  70069. var me = this,
  70070. dirtyText = !me.autoCancel && me.isDirty() ? me.dirtyText + '<br />' : '',
  70071. errors = [],
  70072. fields = me.query('>[isFormField]'),
  70073. length = fields.length,
  70074. i;
  70075. function createListItem(e) {
  70076. return '<li>' + e + '</li>';
  70077. }
  70078. for (i = 0; i < length; i++) {
  70079. errors = errors.concat(
  70080. Ext.Array.map(fields[i].getErrors(), createListItem)
  70081. );
  70082. }
  70083. return dirtyText + '<ul>' + errors.join('') + '</ul>';
  70084. },
  70085. beforeDestroy: function(){
  70086. Ext.destroy(this.floatingButtons, this.tooltip);
  70087. this.callParent();
  70088. }
  70089. });
  70090. Ext.define('Ext.grid.plugin.HeaderResizer', {
  70091. extend: 'Ext.AbstractPlugin',
  70092. requires: ['Ext.dd.DragTracker', 'Ext.util.Region'],
  70093. alias: 'plugin.gridheaderresizer',
  70094. disabled: false,
  70095. config: {
  70096. dynamic: false
  70097. },
  70098. colHeaderCls: Ext.baseCSSPrefix + 'column-header',
  70099. minColWidth: 40,
  70100. maxColWidth: 1000,
  70101. wResizeCursor: 'col-resize',
  70102. eResizeCursor: 'col-resize',
  70103. init: function(headerCt) {
  70104. this.headerCt = headerCt;
  70105. headerCt.on('render', this.afterHeaderRender, this, {single: true});
  70106. },
  70107. destroy: function() {
  70108. if (this.tracker) {
  70109. this.tracker.destroy();
  70110. }
  70111. },
  70112. afterHeaderRender: function() {
  70113. var headerCt = this.headerCt,
  70114. el = headerCt.el;
  70115. headerCt.mon(el, 'mousemove', this.onHeaderCtMouseMove, this);
  70116. this.tracker = new Ext.dd.DragTracker({
  70117. disabled: this.disabled,
  70118. onBeforeStart: Ext.Function.bind(this.onBeforeStart, this),
  70119. onStart: Ext.Function.bind(this.onStart, this),
  70120. onDrag: Ext.Function.bind(this.onDrag, this),
  70121. onEnd: Ext.Function.bind(this.onEnd, this),
  70122. tolerance: 3,
  70123. autoStart: 300,
  70124. el: el
  70125. });
  70126. },
  70127. onHeaderCtMouseMove: function(e, t) {
  70128. var me = this,
  70129. prevSiblings,
  70130. headerEl, overHeader, resizeHeader, resizeHeaderOwnerGrid, ownerGrid;
  70131. if (me.headerCt.dragging) {
  70132. if (me.activeHd) {
  70133. me.activeHd.el.dom.style.cursor = '';
  70134. delete me.activeHd;
  70135. }
  70136. } else {
  70137. headerEl = e.getTarget('.' + me.colHeaderCls, 3, true);
  70138. if (headerEl){
  70139. overHeader = Ext.getCmp(headerEl.id);
  70140. if (overHeader.isOnLeftEdge(e)) {
  70141. resizeHeader = overHeader.previousNode('gridcolumn:not([hidden]):not([isGroupHeader])')
  70142. if (resizeHeader) {
  70143. ownerGrid = me.headerCt.up('tablepanel');
  70144. resizeHeaderOwnerGrid = resizeHeader.up('tablepanel');
  70145. if (!((resizeHeaderOwnerGrid === ownerGrid) || ((ownerGrid.ownerCt.isXType('tablepanel')) && ownerGrid.ownerCt.view.lockedGrid === resizeHeaderOwnerGrid))) {
  70146. resizeHeader = null;
  70147. }
  70148. }
  70149. }
  70150. else if (overHeader.isOnRightEdge(e)) {
  70151. resizeHeader = overHeader;
  70152. }
  70153. else {
  70154. resizeHeader = null;
  70155. }
  70156. if (resizeHeader) {
  70157. if (resizeHeader.isGroupHeader) {
  70158. prevSiblings = resizeHeader.getGridColumns();
  70159. resizeHeader = prevSiblings[prevSiblings.length - 1];
  70160. }
  70161. if (resizeHeader && !(resizeHeader.fixed || (resizeHeader.resizable === false) || me.disabled)) {
  70162. me.activeHd = resizeHeader;
  70163. overHeader.el.dom.style.cursor = me.eResizeCursor;
  70164. }
  70165. } else {
  70166. overHeader.el.dom.style.cursor = '';
  70167. delete me.activeHd;
  70168. }
  70169. }
  70170. }
  70171. },
  70172. onBeforeStart : function(e){
  70173. var t = e.getTarget();
  70174. this.dragHd = this.activeHd;
  70175. if (!!this.dragHd && !Ext.fly(t).hasCls(Ext.baseCSSPrefix + 'column-header-trigger') && !this.headerCt.dragging) {
  70176. this.tracker.constrainTo = this.getConstrainRegion();
  70177. return true;
  70178. } else {
  70179. this.headerCt.dragging = false;
  70180. return false;
  70181. }
  70182. },
  70183. getConstrainRegion: function() {
  70184. var me = this,
  70185. dragHdEl = me.dragHd.el,
  70186. region = Ext.util.Region.getRegion(dragHdEl),
  70187. nextHd;
  70188. if (me.headerCt.forceFit) {
  70189. nextHd = me.dragHd.nextNode('gridcolumn:not([hidden]):not([isGroupHeader])');
  70190. }
  70191. return region.adjust(
  70192. 0,
  70193. me.headerCt.forceFit ? (nextHd ? nextHd.getWidth() - me.minColWidth : 0) : me.maxColWidth - dragHdEl.getWidth(),
  70194. 0,
  70195. me.minColWidth
  70196. );
  70197. },
  70198. onStart: function(e){
  70199. var me = this,
  70200. dragHd = me.dragHd,
  70201. dragHdEl = dragHd.el,
  70202. width = dragHdEl.getWidth(),
  70203. headerCt = me.headerCt,
  70204. t = e.getTarget(),
  70205. xy, gridSection, dragHct, firstSection, lhsMarker, rhsMarker, el, offsetLeft, offsetTop, topLeft, markerHeight, top;
  70206. if (me.dragHd && !Ext.fly(t).hasCls(Ext.baseCSSPrefix + 'column-header-trigger')) {
  70207. headerCt.dragging = true;
  70208. }
  70209. me.origWidth = width;
  70210. if (!me.dynamic) {
  70211. xy = dragHdEl.getXY();
  70212. gridSection = headerCt.up('[scrollerOwner]');
  70213. dragHct = me.dragHd.up(':not([isGroupHeader])');
  70214. firstSection = dragHct.up();
  70215. lhsMarker = gridSection.getLhsMarker();
  70216. rhsMarker = gridSection.getRhsMarker();
  70217. el = rhsMarker.parent();
  70218. offsetLeft = el.getLocalX();
  70219. offsetTop = el.getLocalY();
  70220. topLeft = el.translatePoints(xy);
  70221. markerHeight = firstSection.body.getHeight() + headerCt.getHeight();
  70222. top = topLeft.top - offsetTop;
  70223. lhsMarker.setTop(top);
  70224. rhsMarker.setTop(top);
  70225. lhsMarker.setHeight(markerHeight);
  70226. rhsMarker.setHeight(markerHeight);
  70227. lhsMarker.setLeft(topLeft.left - offsetLeft);
  70228. rhsMarker.setLeft(topLeft.left + width - offsetLeft);
  70229. }
  70230. },
  70231. onDrag: function(e){
  70232. if (!this.dynamic) {
  70233. var xy = this.tracker.getXY('point'),
  70234. gridSection = this.headerCt.up('[scrollerOwner]'),
  70235. rhsMarker = gridSection.getRhsMarker(),
  70236. el = rhsMarker.parent(),
  70237. topLeft = el.translatePoints(xy),
  70238. offsetLeft = el.getLocalX();
  70239. rhsMarker.setLeft(topLeft.left - offsetLeft);
  70240. } else {
  70241. this.doResize();
  70242. }
  70243. },
  70244. onEnd: function(e){
  70245. this.headerCt.dragging = false;
  70246. if (this.dragHd) {
  70247. if (!this.dynamic) {
  70248. var dragHd = this.dragHd,
  70249. gridSection = this.headerCt.up('[scrollerOwner]'),
  70250. lhsMarker = gridSection.getLhsMarker(),
  70251. rhsMarker = gridSection.getRhsMarker(),
  70252. offscreen = -9999;
  70253. lhsMarker.setLeft(offscreen);
  70254. rhsMarker.setLeft(offscreen);
  70255. }
  70256. this.doResize();
  70257. }
  70258. },
  70259. doResize: function() {
  70260. if (this.dragHd) {
  70261. var dragHd = this.dragHd,
  70262. nextHd,
  70263. offset = this.tracker.getOffset('point');
  70264. if (dragHd.flex) {
  70265. delete dragHd.flex;
  70266. }
  70267. Ext.suspendLayouts();
  70268. dragHd.setWidth(this.origWidth + offset[0]);
  70269. if (this.headerCt.forceFit) {
  70270. nextHd = dragHd.nextNode('gridcolumn:not([hidden]):not([isGroupHeader])');
  70271. if (nextHd) {
  70272. delete nextHd.flex;
  70273. nextHd.setWidth(nextHd.getWidth() - offset[0]);
  70274. }
  70275. }
  70276. Ext.resumeLayouts(true);
  70277. }
  70278. },
  70279. disable: function() {
  70280. this.disabled = true;
  70281. if (this.tracker) {
  70282. this.tracker.disable();
  70283. }
  70284. },
  70285. enable: function() {
  70286. this.disabled = false;
  70287. if (this.tracker) {
  70288. this.tracker.enable();
  70289. }
  70290. }
  70291. });
  70292. Ext.define('Ext.grid.header.DragZone', {
  70293. extend: 'Ext.dd.DragZone',
  70294. colHeaderCls: Ext.baseCSSPrefix + 'column-header',
  70295. maxProxyWidth: 120,
  70296. constructor: function(headerCt) {
  70297. this.headerCt = headerCt;
  70298. this.ddGroup = this.getDDGroup();
  70299. this.callParent([headerCt.el]);
  70300. this.proxy.el.addCls(Ext.baseCSSPrefix + 'grid-col-dd');
  70301. },
  70302. getDDGroup: function() {
  70303. return 'header-dd-zone-' + this.headerCt.up('[scrollerOwner]').id;
  70304. },
  70305. getDragData: function(e) {
  70306. var header = e.getTarget('.'+this.colHeaderCls),
  70307. headerCmp,
  70308. ddel;
  70309. if (header) {
  70310. headerCmp = Ext.getCmp(header.id);
  70311. if (!this.headerCt.dragging && headerCmp.draggable && !(headerCmp.isOnLeftEdge(e) || headerCmp.isOnRightEdge(e))) {
  70312. ddel = document.createElement('div');
  70313. ddel.innerHTML = Ext.getCmp(header.id).text;
  70314. return {
  70315. ddel: ddel,
  70316. header: headerCmp
  70317. };
  70318. }
  70319. }
  70320. return false;
  70321. },
  70322. onBeforeDrag: function() {
  70323. return !(this.headerCt.dragging || this.disabled);
  70324. },
  70325. onInitDrag: function() {
  70326. this.headerCt.dragging = true;
  70327. this.callParent(arguments);
  70328. },
  70329. onDragDrop: function() {
  70330. this.headerCt.dragging = false;
  70331. this.callParent(arguments);
  70332. },
  70333. afterRepair: function() {
  70334. this.callParent();
  70335. this.headerCt.dragging = false;
  70336. },
  70337. getRepairXY: function() {
  70338. return this.dragData.header.el.getXY();
  70339. },
  70340. disable: function() {
  70341. this.disabled = true;
  70342. },
  70343. enable: function() {
  70344. this.disabled = false;
  70345. }
  70346. });
  70347. Ext.define('Ext.grid.header.DropZone', {
  70348. extend: 'Ext.dd.DropZone',
  70349. colHeaderCls: Ext.baseCSSPrefix + 'column-header',
  70350. proxyOffsets: [-4, -9],
  70351. constructor: function(headerCt){
  70352. this.headerCt = headerCt;
  70353. this.ddGroup = this.getDDGroup();
  70354. this.callParent([headerCt.el]);
  70355. },
  70356. getDDGroup: function() {
  70357. return 'header-dd-zone-' + this.headerCt.up('[scrollerOwner]').id;
  70358. },
  70359. getTargetFromEvent : function(e){
  70360. return e.getTarget('.' + this.colHeaderCls);
  70361. },
  70362. getTopIndicator: function() {
  70363. if (!this.topIndicator) {
  70364. this.topIndicator = Ext.DomHelper.append(Ext.getBody(), {
  70365. cls: "col-move-top",
  70366. html: "&#160;"
  70367. }, true);
  70368. }
  70369. return this.topIndicator;
  70370. },
  70371. getBottomIndicator: function() {
  70372. if (!this.bottomIndicator) {
  70373. this.bottomIndicator = Ext.DomHelper.append(Ext.getBody(), {
  70374. cls: "col-move-bottom",
  70375. html: "&#160;"
  70376. }, true);
  70377. }
  70378. return this.bottomIndicator;
  70379. },
  70380. getLocation: function(e, t) {
  70381. var x = e.getXY()[0],
  70382. region = Ext.fly(t).getRegion(),
  70383. pos, header;
  70384. if ((region.right - x) <= (region.right - region.left) / 2) {
  70385. pos = "after";
  70386. } else {
  70387. pos = "before";
  70388. }
  70389. return {
  70390. pos: pos,
  70391. header: Ext.getCmp(t.id),
  70392. node: t
  70393. };
  70394. },
  70395. positionIndicator: function(draggedHeader, node, e){
  70396. var location = this.getLocation(e, node),
  70397. header = location.header,
  70398. pos = location.pos,
  70399. nextHd = draggedHeader.nextSibling('gridcolumn:not([hidden])'),
  70400. prevHd = draggedHeader.previousSibling('gridcolumn:not([hidden])'),
  70401. topIndicator, bottomIndicator, topAnchor, bottomAnchor,
  70402. topXY, bottomXY, headerCtEl, minX, maxX,
  70403. allDropZones, ln, i, dropZone;
  70404. if (!header.draggable && header.getIndex() === 0) {
  70405. return false;
  70406. }
  70407. this.lastLocation = location;
  70408. if ((draggedHeader !== header) &&
  70409. ((pos === "before" && nextHd !== header) ||
  70410. (pos === "after" && prevHd !== header)) &&
  70411. !header.isDescendantOf(draggedHeader)) {
  70412. allDropZones = Ext.dd.DragDropManager.getRelated(this);
  70413. ln = allDropZones.length;
  70414. i = 0;
  70415. for (; i < ln; i++) {
  70416. dropZone = allDropZones[i];
  70417. if (dropZone !== this && dropZone.invalidateDrop) {
  70418. dropZone.invalidateDrop();
  70419. }
  70420. }
  70421. this.valid = true;
  70422. topIndicator = this.getTopIndicator();
  70423. bottomIndicator = this.getBottomIndicator();
  70424. if (pos === 'before') {
  70425. topAnchor = 'tl';
  70426. bottomAnchor = 'bl';
  70427. } else {
  70428. topAnchor = 'tr';
  70429. bottomAnchor = 'br';
  70430. }
  70431. topXY = header.el.getAnchorXY(topAnchor);
  70432. bottomXY = header.el.getAnchorXY(bottomAnchor);
  70433. headerCtEl = this.headerCt.el;
  70434. minX = headerCtEl.getLeft();
  70435. maxX = headerCtEl.getRight();
  70436. topXY[0] = Ext.Number.constrain(topXY[0], minX, maxX);
  70437. bottomXY[0] = Ext.Number.constrain(bottomXY[0], minX, maxX);
  70438. topXY[0] -= 4;
  70439. topXY[1] -= 9;
  70440. bottomXY[0] -= 4;
  70441. topIndicator.setXY(topXY);
  70442. bottomIndicator.setXY(bottomXY);
  70443. topIndicator.show();
  70444. bottomIndicator.show();
  70445. } else {
  70446. this.invalidateDrop();
  70447. }
  70448. },
  70449. invalidateDrop: function() {
  70450. this.valid = false;
  70451. this.hideIndicators();
  70452. },
  70453. onNodeOver: function(node, dragZone, e, data) {
  70454. var me = this,
  70455. header = me.headerCt,
  70456. doPosition = true,
  70457. from = data.header,
  70458. to;
  70459. if (data.header.el.dom === node) {
  70460. doPosition = false;
  70461. } else {
  70462. to = me.getLocation(e, node).header;
  70463. doPosition = (from.ownerCt === to.ownerCt) || (!from.ownerCt.sealed && !to.ownerCt.sealed);
  70464. }
  70465. if (doPosition) {
  70466. me.positionIndicator(data.header, node, e);
  70467. } else {
  70468. me.valid = false;
  70469. }
  70470. return me.valid ? me.dropAllowed : me.dropNotAllowed;
  70471. },
  70472. hideIndicators: function() {
  70473. this.getTopIndicator().hide();
  70474. this.getBottomIndicator().hide();
  70475. },
  70476. onNodeOut: function() {
  70477. this.hideIndicators();
  70478. },
  70479. onNodeDrop: function(node, dragZone, e, data) {
  70480. if (this.valid) {
  70481. var dragHeader = data.header,
  70482. lastLocation = this.lastLocation,
  70483. targetHeader = lastLocation.header,
  70484. fromCt = dragHeader.ownerCt,
  70485. fromHeader = dragHeader.up('headercontainer:not(gridcolumn)'),
  70486. localFromIdx = fromCt.items.indexOf(dragHeader),
  70487. toCt = targetHeader.ownerCt,
  70488. toHeader = targetHeader.up('headercontainer:not(gridcolumn)'),
  70489. localToIdx = toCt.items.indexOf(targetHeader),
  70490. headerCt = this.headerCt,
  70491. fromIdx = headerCt.getHeaderIndex(dragHeader),
  70492. colsToMove = dragHeader.isGroupHeader ? dragHeader.query(':not([isGroupHeader])').length : 1,
  70493. toIdx = headerCt.getHeaderIndex(targetHeader),
  70494. groupCt,
  70495. scrollerOwner;
  70496. if (lastLocation.pos === 'after') {
  70497. localToIdx++;
  70498. toIdx += targetHeader.isGroupHeader ? targetHeader.query(':not([isGroupHeader])').length : 1;
  70499. }
  70500. if (fromHeader !== toHeader && fromHeader.lockableInjected && toHeader.lockableInjected && toHeader.lockedCt) {
  70501. scrollerOwner = fromCt.up('[scrollerOwner]');
  70502. scrollerOwner.lock(dragHeader, localToIdx);
  70503. this.onNodeDrop(node, dragZone, e, data);
  70504. } else if (fromHeader !== toHeader && fromHeader.lockableInjected && toHeader.lockableInjected && fromHeader.lockedCt) {
  70505. scrollerOwner = fromCt.up('[scrollerOwner]');
  70506. scrollerOwner.unlock(dragHeader, localToIdx);
  70507. this.onNodeDrop(node, dragZone, e, data);
  70508. }
  70509. else {
  70510. this.invalidateDrop();
  70511. if ((fromCt === toCt) && (localToIdx > localFromIdx)) {
  70512. localToIdx -= 1;
  70513. }
  70514. Ext.suspendLayouts();
  70515. if (fromCt !== toCt) {
  70516. fromCt.remove(dragHeader, false);
  70517. if (fromCt.isGroupHeader) {
  70518. if (!fromCt.items.getCount()) {
  70519. groupCt = fromCt.ownerCt;
  70520. groupCt.remove(fromCt, false);
  70521. fromCt.el.dom.parentNode.removeChild(fromCt.el.dom);
  70522. }
  70523. }
  70524. }
  70525. if (fromCt === toCt) {
  70526. toCt.move(localFromIdx, localToIdx);
  70527. } else {
  70528. toCt.insert(localToIdx, dragHeader);
  70529. }
  70530. if (toCt.isGroupHeader) {
  70531. if (toCt !== fromCt) {
  70532. dragHeader.savedFlex = dragHeader.flex;
  70533. delete dragHeader.flex;
  70534. dragHeader.width = dragHeader.getWidth();
  70535. }
  70536. } else {
  70537. if (dragHeader.savedFlex) {
  70538. dragHeader.flex = dragHeader.savedFlex;
  70539. delete dragHeader.width;
  70540. }
  70541. }
  70542. headerCt.purgeCache();
  70543. Ext.resumeLayouts(true);
  70544. headerCt.onHeaderMoved(dragHeader, colsToMove, fromIdx, toIdx);
  70545. if (!fromCt.items.getCount()) {
  70546. fromCt.destroy();
  70547. }
  70548. }
  70549. }
  70550. }
  70551. });
  70552. Ext.define('Ext.grid.plugin.HeaderReorderer', {
  70553. extend: 'Ext.AbstractPlugin',
  70554. requires: ['Ext.grid.header.DragZone', 'Ext.grid.header.DropZone'],
  70555. alias: 'plugin.gridheaderreorderer',
  70556. init: function(headerCt) {
  70557. this.headerCt = headerCt;
  70558. headerCt.on({
  70559. render: this.onHeaderCtRender,
  70560. single: true,
  70561. scope: this
  70562. });
  70563. },
  70564. destroy: function() {
  70565. Ext.destroy(this.dragZone, this.dropZone);
  70566. },
  70567. onHeaderCtRender: function() {
  70568. var me = this;
  70569. me.dragZone = new Ext.grid.header.DragZone(me.headerCt);
  70570. me.dropZone = new Ext.grid.header.DropZone(me.headerCt);
  70571. if (me.disabled) {
  70572. me.dragZone.disable();
  70573. }
  70574. },
  70575. enable: function() {
  70576. this.disabled = false;
  70577. if (this.dragZone) {
  70578. this.dragZone.enable();
  70579. }
  70580. },
  70581. disable: function() {
  70582. this.disabled = true;
  70583. if (this.dragZone) {
  70584. this.dragZone.disable();
  70585. }
  70586. }
  70587. });
  70588. Ext.define('Ext.grid.header.Container', {
  70589. extend: 'Ext.container.Container',
  70590. requires: [
  70591. 'Ext.grid.ColumnLayout',
  70592. 'Ext.grid.plugin.HeaderResizer',
  70593. 'Ext.grid.plugin.HeaderReorderer'
  70594. ],
  70595. uses: [
  70596. 'Ext.grid.column.Column',
  70597. 'Ext.menu.Menu',
  70598. 'Ext.menu.CheckItem',
  70599. 'Ext.menu.Separator'
  70600. ],
  70601. border: true,
  70602. alias: 'widget.headercontainer',
  70603. baseCls: Ext.baseCSSPrefix + 'grid-header-ct',
  70604. dock: 'top',
  70605. weight: 100,
  70606. defaultType: 'gridcolumn',
  70607. detachOnRemove: false,
  70608. defaultWidth: 100,
  70609. sortAscText: 'Sort Ascending',
  70610. sortDescText: 'Sort Descending',
  70611. sortClearText: 'Clear Sort',
  70612. columnsText: 'Columns',
  70613. headerOpenCls: Ext.baseCSSPrefix + 'column-header-open',
  70614. triStateSort: false,
  70615. ddLock: false,
  70616. dragging: false,
  70617. sortable: true,
  70618. initComponent: function() {
  70619. var me = this;
  70620. me.headerCounter = 0;
  70621. me.plugins = me.plugins || [];
  70622. if (!me.isHeader) {
  70623. if (me.enableColumnResize) {
  70624. me.resizer = new Ext.grid.plugin.HeaderResizer();
  70625. me.plugins.push(me.resizer);
  70626. }
  70627. if (me.enableColumnMove) {
  70628. me.reorderer = new Ext.grid.plugin.HeaderReorderer();
  70629. me.plugins.push(me.reorderer);
  70630. }
  70631. }
  70632. if (me.isHeader && !me.items) {
  70633. me.layout = me.layout || 'auto';
  70634. }
  70635. else {
  70636. me.layout = Ext.apply({
  70637. type: 'gridcolumn',
  70638. align: 'stretchmax'
  70639. }, me.initialConfig.layout);
  70640. }
  70641. me.defaults = me.defaults || {};
  70642. Ext.applyIf(me.defaults, {
  70643. triStateSort: me.triStateSort,
  70644. sortable: me.sortable
  70645. });
  70646. me.menuTask = new Ext.util.DelayedTask(me.updateMenuDisabledState, me);
  70647. me.callParent();
  70648. me.addEvents(
  70649. 'columnresize',
  70650. 'headerclick',
  70651. 'headertriggerclick',
  70652. 'columnmove',
  70653. 'columnhide',
  70654. 'columnshow',
  70655. 'sortchange',
  70656. 'menucreate'
  70657. );
  70658. },
  70659. onDestroy: function() {
  70660. var me = this;
  70661. me.menuTask.cancel();
  70662. Ext.destroy(me.resizer, me.reorderer);
  70663. me.callParent();
  70664. },
  70665. applyColumnsState: function(columns) {
  70666. if (!columns || !columns.length) {
  70667. return;
  70668. }
  70669. var me = this,
  70670. items = me.items.items,
  70671. count = items.length,
  70672. i = 0,
  70673. length = columns.length,
  70674. c, col, columnState, index;
  70675. for (c = 0; c < length; c++) {
  70676. columnState = columns[c];
  70677. for (index = count; index--; ) {
  70678. col = items[index];
  70679. if (col.getStateId && col.getStateId() == columnState.id) {
  70680. if (i !== index) {
  70681. me.moveHeader(index, i);
  70682. }
  70683. if (col.applyColumnState) {
  70684. col.applyColumnState(columnState);
  70685. }
  70686. ++i;
  70687. break;
  70688. }
  70689. }
  70690. }
  70691. },
  70692. getColumnsState: function () {
  70693. var me = this,
  70694. columns = [],
  70695. state;
  70696. me.items.each(function (col) {
  70697. state = col.getColumnState && col.getColumnState();
  70698. if (state) {
  70699. columns.push(state);
  70700. }
  70701. });
  70702. return columns;
  70703. },
  70704. onAdd: function(c) {
  70705. var me = this,
  70706. headerCt = me.isHeader ? me.getOwnerHeaderCt() : me;
  70707. if (!c.headerId) {
  70708. c.headerId = c.initialConfig.id || Ext.id(null, 'header-');
  70709. }
  70710. if (!c.stateId) {
  70711. c.stateId = c.initialConfig.id || ('h' + (++me.headerCounter));
  70712. }
  70713. me.callParent(arguments);
  70714. if (headerCt) {
  70715. headerCt.purgeCache();
  70716. }
  70717. },
  70718. onRemove: function(c) {
  70719. var me = this,
  70720. headerCt = me.isHeader ? me.getOwnerHeaderCt() : me;
  70721. me.callParent(arguments);
  70722. if (headerCt) {
  70723. me.purgeCache();
  70724. }
  70725. },
  70726. applyDefaults: function(config) {
  70727. var ret;
  70728. if (config && !config.isComponent && config.xtype == 'rownumberer') {
  70729. ret = config;
  70730. } else {
  70731. ret = this.callParent(arguments);
  70732. if (!config.isGroupHeader && !('width' in ret) && !ret.flex) {
  70733. ret.width = this.defaultWidth;
  70734. }
  70735. }
  70736. return ret;
  70737. },
  70738. afterRender: function() {
  70739. this.callParent();
  70740. this.setSortState();
  70741. },
  70742. setSortState: function(){
  70743. var store = this.up('[store]').store,
  70744. first = store.getFirstSorter(),
  70745. hd;
  70746. if (first) {
  70747. hd = this.down('gridcolumn[dataIndex=' + first.property +']');
  70748. if (hd) {
  70749. hd.setSortState(first.direction, false, true);
  70750. }
  70751. } else {
  70752. this.clearOtherSortStates(null);
  70753. }
  70754. },
  70755. getHeaderMenu: function(){
  70756. var menu = this.getMenu(),
  70757. item;
  70758. if (menu) {
  70759. item = menu.child('#columnItem');
  70760. if (item) {
  70761. return item.menu;
  70762. }
  70763. }
  70764. return null;
  70765. },
  70766. onHeaderVisibilityChange: function(header, visible){
  70767. var me = this,
  70768. menu = me.getHeaderMenu(),
  70769. item;
  70770. if (menu) {
  70771. item = me.getMenuItemForHeader(menu, header);
  70772. if (item) {
  70773. item.setChecked(visible, true);
  70774. }
  70775. me.menuTask.delay(50);
  70776. }
  70777. },
  70778. getLeafMenuItems: function() {
  70779. var me = this,
  70780. columns = me.getGridColumns(),
  70781. items = [],
  70782. i = 0,
  70783. count = 0,
  70784. len = columns.length,
  70785. menu = me.getMenu(),
  70786. item;
  70787. for (; i < len; ++i) {
  70788. item = columns[i];
  70789. if (item.hideable) {
  70790. item = me.getMenuItemForHeader(menu, item);
  70791. if (item) {
  70792. items.push(item);
  70793. if (item.checked) {
  70794. ++count;
  70795. }
  70796. }
  70797. } else if (!item.hidden && !item.menuDisabled) {
  70798. ++count;
  70799. }
  70800. }
  70801. return {
  70802. items: items,
  70803. checkedCount: count
  70804. };
  70805. },
  70806. updateMenuDisabledState: function(){
  70807. var me = this,
  70808. result = me.getLeafMenuItems(),
  70809. total = result.checkedCount,
  70810. items = result.items,
  70811. len = items.length,
  70812. i = 0,
  70813. rootItem = me.getMenu().child('#columnItem');
  70814. if (total <= 1) {
  70815. me.disableMenuItems(rootItem, Ext.ComponentQuery.query('[checked=true]', items)[0]);
  70816. } else {
  70817. for (; i < len; ++i) {
  70818. me.setMenuItemState(total, rootItem, items[i]);
  70819. }
  70820. }
  70821. },
  70822. disableMenuItems: function(rootItem, item){
  70823. while (item && item != rootItem) {
  70824. item.disableCheckChange();
  70825. item = item.parentMenu.ownerItem;
  70826. }
  70827. },
  70828. setMenuItemState: function(total, rootItem, item){
  70829. var parentMenu,
  70830. checkedChildren;
  70831. while (item && item != rootItem) {
  70832. parentMenu = item.parentMenu;
  70833. checkedChildren = item.parentMenu.query('[checked=true]:not([menu])').length;
  70834. item.enableCheckChange();
  70835. item = parentMenu.ownerItem;
  70836. if (checkedChildren === total) {
  70837. break;
  70838. }
  70839. }
  70840. this.disableMenuItems(rootItem, item);
  70841. },
  70842. getMenuItemForHeader: function(menu, header){
  70843. return header ? menu.down('menucheckitem[headerId=' + header.id + ']') : null;
  70844. },
  70845. onHeaderShow: function(header) {
  70846. var me = this,
  70847. gridSection = me.ownerCt;
  70848. me.onHeaderVisibilityChange(header, true);
  70849. if (!header.isGroupHeader) {
  70850. if (gridSection) {
  70851. gridSection.onHeaderShow(me, header);
  70852. }
  70853. }
  70854. me.fireEvent('columnshow', me, header);
  70855. },
  70856. onHeaderHide: function(header) {
  70857. var me = this,
  70858. gridSection = me.ownerCt;
  70859. me.onHeaderVisibilityChange(header, false);
  70860. if (!header.isGroupHeader) {
  70861. if (gridSection) {
  70862. gridSection.onHeaderHide(me, header);
  70863. }
  70864. }
  70865. me.fireEvent('columnhide', me, header);
  70866. },
  70867. tempLock: function() {
  70868. this.ddLock = true;
  70869. Ext.Function.defer(function() {
  70870. this.ddLock = false;
  70871. }, 200, this);
  70872. },
  70873. onHeaderResize: function(header, w, suppressFocus) {
  70874. var me = this,
  70875. view = me.view,
  70876. gridSection = me.ownerCt;
  70877. if (view && view.table.dom) {
  70878. me.tempLock();
  70879. if (gridSection) {
  70880. gridSection.onHeaderResize(me, header, w);
  70881. }
  70882. }
  70883. me.fireEvent('columnresize', this, header, w);
  70884. },
  70885. onHeaderClick: function(header, e, t) {
  70886. header.fireEvent('headerclick', this, header, e, t);
  70887. this.fireEvent("headerclick", this, header, e, t);
  70888. },
  70889. onHeaderTriggerClick: function(header, e, t) {
  70890. var me = this;
  70891. if (header.fireEvent('headertriggerclick', me, header, e, t) !== false && me.fireEvent("headertriggerclick", me, header, e, t) !== false) {
  70892. me.showMenuBy(t, header);
  70893. }
  70894. },
  70895. showMenuBy: function(t, header) {
  70896. var menu = this.getMenu(),
  70897. ascItem = menu.down('#ascItem'),
  70898. descItem = menu.down('#descItem'),
  70899. sortableMth;
  70900. menu.activeHeader = menu.ownerCt = header;
  70901. menu.setFloatParent(header);
  70902. header.titleEl.addCls(this.headerOpenCls);
  70903. sortableMth = header.sortable ? 'enable' : 'disable';
  70904. if (ascItem) {
  70905. ascItem[sortableMth]();
  70906. }
  70907. if (descItem) {
  70908. descItem[sortableMth]();
  70909. }
  70910. menu.showBy(t);
  70911. },
  70912. onMenuDeactivate: function() {
  70913. var menu = this.getMenu();
  70914. menu.activeHeader.titleEl.removeCls(this.headerOpenCls);
  70915. },
  70916. moveHeader: function(fromIdx, toIdx) {
  70917. this.tempLock();
  70918. this.onHeaderMoved(this.move(fromIdx, toIdx), 1, fromIdx, toIdx);
  70919. },
  70920. purgeCache: function() {
  70921. var me = this;
  70922. delete me.gridDataColumns;
  70923. delete me.hideableColumns;
  70924. if (me.menu) {
  70925. me.menu.hide();
  70926. me.menu.destroy();
  70927. delete me.menu;
  70928. }
  70929. },
  70930. onHeaderMoved: function(header, colsToMove, fromIdx, toIdx) {
  70931. var me = this,
  70932. gridSection = me.ownerCt;
  70933. if (gridSection && gridSection.onHeaderMove) {
  70934. gridSection.onHeaderMove(me, header, colsToMove, fromIdx, toIdx);
  70935. }
  70936. me.fireEvent("columnmove", me, header, fromIdx, toIdx);
  70937. },
  70938. getMenu: function() {
  70939. var me = this;
  70940. if (!me.menu) {
  70941. me.menu = new Ext.menu.Menu({
  70942. hideOnParentHide: false,
  70943. items: me.getMenuItems(),
  70944. listeners: {
  70945. deactivate: me.onMenuDeactivate,
  70946. scope: me
  70947. }
  70948. });
  70949. me.updateMenuDisabledState();
  70950. me.fireEvent('menucreate', me, me.menu);
  70951. }
  70952. return me.menu;
  70953. },
  70954. getMenuItems: function() {
  70955. var me = this,
  70956. menuItems = [],
  70957. hideableColumns = me.enableColumnHide ? me.getColumnMenu(me) : null;
  70958. if (me.sortable) {
  70959. menuItems = [{
  70960. itemId: 'ascItem',
  70961. text: me.sortAscText,
  70962. cls: Ext.baseCSSPrefix + 'hmenu-sort-asc',
  70963. handler: me.onSortAscClick,
  70964. scope: me
  70965. },{
  70966. itemId: 'descItem',
  70967. text: me.sortDescText,
  70968. cls: Ext.baseCSSPrefix + 'hmenu-sort-desc',
  70969. handler: me.onSortDescClick,
  70970. scope: me
  70971. }];
  70972. }
  70973. if (hideableColumns && hideableColumns.length) {
  70974. menuItems.push('-', {
  70975. itemId: 'columnItem',
  70976. text: me.columnsText,
  70977. cls: Ext.baseCSSPrefix + 'cols-icon',
  70978. menu: hideableColumns
  70979. });
  70980. }
  70981. return menuItems;
  70982. },
  70983. onSortAscClick: function() {
  70984. var menu = this.getMenu(),
  70985. activeHeader = menu.activeHeader;
  70986. activeHeader.setSortState('ASC');
  70987. },
  70988. onSortDescClick: function() {
  70989. var menu = this.getMenu(),
  70990. activeHeader = menu.activeHeader;
  70991. activeHeader.setSortState('DESC');
  70992. },
  70993. getColumnMenu: function(headerContainer) {
  70994. var menuItems = [],
  70995. i = 0,
  70996. item,
  70997. items = headerContainer.query('>gridcolumn[hideable]'),
  70998. itemsLn = items.length,
  70999. menuItem;
  71000. for (; i < itemsLn; i++) {
  71001. item = items[i];
  71002. menuItem = new Ext.menu.CheckItem({
  71003. text: item.menuText || item.text,
  71004. checked: !item.hidden,
  71005. hideOnClick: false,
  71006. headerId: item.id,
  71007. menu: item.isGroupHeader ? this.getColumnMenu(item) : undefined,
  71008. checkHandler: this.onColumnCheckChange,
  71009. scope: this
  71010. });
  71011. menuItems.push(menuItem);
  71012. item.on({
  71013. destroy: Ext.Function.bind(menuItem.destroy, menuItem)
  71014. });
  71015. }
  71016. return menuItems;
  71017. },
  71018. onColumnCheckChange: function(checkItem, checked) {
  71019. var header = Ext.getCmp(checkItem.headerId);
  71020. header[checked ? 'show' : 'hide']();
  71021. },
  71022. getColumnsForTpl: function(flushCache) {
  71023. var cols = [],
  71024. headers = this.getGridColumns(flushCache),
  71025. headersLn = headers.length,
  71026. i = 0,
  71027. header,
  71028. width;
  71029. for (; i < headersLn; i++) {
  71030. header = headers[i];
  71031. if (header.hidden || header.up('headercontainer[hidden=true]')) {
  71032. width = 0;
  71033. } else {
  71034. width = header.getDesiredWidth();
  71035. }
  71036. cols.push({
  71037. dataIndex: header.dataIndex,
  71038. align: header.align,
  71039. width: width,
  71040. id: header.id,
  71041. cls: header.tdCls,
  71042. columnId: header.getItemId()
  71043. });
  71044. }
  71045. return cols;
  71046. },
  71047. getColumnCount: function() {
  71048. return this.getGridColumns().length;
  71049. },
  71050. getFullWidth: function(flushCache) {
  71051. var fullWidth = 0,
  71052. headers = this.getVisibleGridColumns(flushCache),
  71053. headersLn = headers.length,
  71054. i = 0,
  71055. header;
  71056. for (; i < headersLn; i++) {
  71057. header = headers[i];
  71058. if (header.getDesiredWidth) {
  71059. fullWidth += header.getDesiredWidth() || 0;
  71060. } else {
  71061. fullWidth += header.getWidth();
  71062. }
  71063. }
  71064. return fullWidth;
  71065. },
  71066. clearOtherSortStates: function(activeHeader) {
  71067. var headers = this.getGridColumns(),
  71068. headersLn = headers.length,
  71069. i = 0;
  71070. for (; i < headersLn; i++) {
  71071. if (headers[i] !== activeHeader) {
  71072. headers[i].setSortState(null, true);
  71073. }
  71074. }
  71075. },
  71076. getVisibleGridColumns: function(refreshCache) {
  71077. return Ext.ComponentQuery.query(':not([hidden])', this.getGridColumns(refreshCache));
  71078. },
  71079. getGridColumns: function(refreshCache) {
  71080. var me = this,
  71081. result = refreshCache ? null : me.gridDataColumns;
  71082. if (!result) {
  71083. me.gridDataColumns = result = [];
  71084. me.cascade(function(c) {
  71085. if ((c !== me) && !c.isGroupHeader) {
  71086. result.push(c);
  71087. }
  71088. });
  71089. }
  71090. return result;
  71091. },
  71092. getHideableColumns: function(refreshCache) {
  71093. var me = this,
  71094. result = refreshCache ? null : me.hideableColumns;
  71095. if (!result) {
  71096. result = me.hideableColumns = me.query('[hideable]');
  71097. }
  71098. return result;
  71099. },
  71100. getHeaderIndex: function(header) {
  71101. if (header.isGroupHeader) {
  71102. header = header.down(':not([isgroupHeader])');
  71103. }
  71104. return Ext.Array.indexOf(this.getGridColumns(), header);
  71105. },
  71106. getHeaderAtIndex: function(index) {
  71107. var columns = this.getGridColumns();
  71108. return columns.length ? columns[index] : null;
  71109. },
  71110. getVisibleHeaderClosestToIndex: function(index) {
  71111. var result = this.getHeaderAtIndex(index);
  71112. if (result && result.hidden) {
  71113. result = result.next(':not([hidden])') || result.prev(':not([hidden])');
  71114. }
  71115. return result;
  71116. },
  71117. prepareData: function(data, rowIdx, record, view, panel) {
  71118. var me = this,
  71119. obj = {},
  71120. headers = me.gridDataColumns || me.getGridColumns(),
  71121. headersLn = headers.length,
  71122. colIdx = 0,
  71123. header,
  71124. headerId,
  71125. renderer,
  71126. value,
  71127. metaData,
  71128. store = panel.store;
  71129. for (; colIdx < headersLn; colIdx++) {
  71130. metaData = {
  71131. tdCls: '',
  71132. style: ''
  71133. };
  71134. header = headers[colIdx];
  71135. headerId = header.id;
  71136. renderer = header.renderer;
  71137. value = data[header.dataIndex];
  71138. if (typeof renderer == "function") {
  71139. value = renderer.call(
  71140. header.scope || me.ownerCt,
  71141. value,
  71142. metaData,
  71143. record,
  71144. rowIdx,
  71145. colIdx,
  71146. store,
  71147. view
  71148. );
  71149. }
  71150. if (me.markDirty) {
  71151. obj[headerId + '-modified'] = record.isModified(header.dataIndex) ? Ext.baseCSSPrefix + 'grid-dirty-cell' : '';
  71152. }
  71153. obj[headerId+'-tdCls'] = metaData.tdCls;
  71154. obj[headerId+'-tdAttr'] = metaData.tdAttr;
  71155. obj[headerId+'-style'] = metaData.style;
  71156. if (typeof value === 'undefined' || value === null || value === '') {
  71157. value = header.emptyCellText;
  71158. }
  71159. obj[headerId] = value;
  71160. }
  71161. return obj;
  71162. },
  71163. expandToFit: function(header) {
  71164. var view = this.view;
  71165. if (view) {
  71166. view.expandToFit(header);
  71167. }
  71168. }
  71169. });
  71170. Ext.define('Ext.grid.column.Column', {
  71171. extend: 'Ext.grid.header.Container',
  71172. alias: 'widget.gridcolumn',
  71173. requires: ['Ext.util.KeyNav', 'Ext.grid.ColumnComponentLayout', 'Ext.grid.ColumnLayout'],
  71174. alternateClassName: 'Ext.grid.Column',
  71175. baseCls: Ext.baseCSSPrefix + 'column-header ' + Ext.baseCSSPrefix + 'unselectable',
  71176. hoverCls: Ext.baseCSSPrefix + 'column-header-over',
  71177. handleWidth: 5,
  71178. sortState: null,
  71179. possibleSortStates: ['ASC', 'DESC'],
  71180. childEls: [
  71181. 'titleEl', 'triggerEl', 'textEl'
  71182. ],
  71183. renderTpl:
  71184. '<div id="{id}-titleEl" {tipMarkup}class="' + Ext.baseCSSPrefix + 'column-header-inner">' +
  71185. '<span id="{id}-textEl" class="' + Ext.baseCSSPrefix + 'column-header-text">' +
  71186. '{text}' +
  71187. '</span>' +
  71188. '<tpl if="!menuDisabled">'+
  71189. '<div id="{id}-triggerEl" class="' + Ext.baseCSSPrefix + 'column-header-trigger"></div>'+
  71190. '</tpl>' +
  71191. '</div>' +
  71192. '{%this.renderContainer(out,values)%}',
  71193. dataIndex: null,
  71194. text: '&#160;',
  71195. menuText: null,
  71196. emptyCellText: '&#160;',
  71197. sortable: true,
  71198. resizable: true,
  71199. hideable: true,
  71200. menuDisabled: false,
  71201. renderer: false,
  71202. editRenderer: false,
  71203. align: 'left',
  71204. draggable: true,
  71205. tooltipType: 'qtip',
  71206. initDraggable: Ext.emptyFn,
  71207. isHeader: true,
  71208. componentLayout: 'columncomponent',
  71209. initResizable: Ext.emptyFn,
  71210. initComponent: function() {
  71211. var me = this,
  71212. renderer;
  71213. if (Ext.isDefined(me.header)) {
  71214. me.text = me.header;
  71215. delete me.header;
  71216. }
  71217. if (!me.triStateSort) {
  71218. me.possibleSortStates.length = 2;
  71219. }
  71220. if (Ext.isDefined(me.columns)) {
  71221. me.isGroupHeader = true;
  71222. me.items = me.columns;
  71223. delete me.columns;
  71224. delete me.flex;
  71225. delete me.width;
  71226. me.cls = (me.cls||'') + ' ' + Ext.baseCSSPrefix + 'group-header';
  71227. me.sortable = false;
  71228. me.resizable = false;
  71229. me.align = 'center';
  71230. } else {
  71231. me.isContainer = false;
  71232. if (me.flex) {
  71233. me.minWidth = me.minWidth || Ext.grid.plugin.HeaderResizer.prototype.minColWidth;
  71234. }
  71235. }
  71236. me.addCls(Ext.baseCSSPrefix + 'column-header-align-' + me.align);
  71237. renderer = me.renderer;
  71238. if (renderer) {
  71239. if (typeof renderer == 'string') {
  71240. me.renderer = Ext.util.Format[renderer];
  71241. }
  71242. me.hasCustomRenderer = true;
  71243. } else if (me.defaultRenderer) {
  71244. me.scope = me;
  71245. me.renderer = me.defaultRenderer;
  71246. }
  71247. me.callParent(arguments);
  71248. me.on({
  71249. element: 'el',
  71250. click: me.onElClick,
  71251. dblclick: me.onElDblClick,
  71252. scope: me
  71253. });
  71254. me.on({
  71255. element: 'titleEl',
  71256. mouseenter: me.onTitleMouseOver,
  71257. mouseleave: me.onTitleMouseOut,
  71258. scope: me
  71259. });
  71260. },
  71261. onAdd: function(childHeader) {
  71262. childHeader.isSubHeader = true;
  71263. childHeader.addCls(Ext.baseCSSPrefix + 'group-sub-header');
  71264. this.callParent(arguments);
  71265. },
  71266. onRemove: function(childHeader) {
  71267. childHeader.isSubHeader = false;
  71268. childHeader.removeCls(Ext.baseCSSPrefix + 'group-sub-header');
  71269. this.callParent(arguments);
  71270. },
  71271. initRenderData: function() {
  71272. var me = this,
  71273. tipMarkup = '',
  71274. tip = me.tooltip,
  71275. attr = me.tooltipType == 'qtip' ? 'data-qtip' : 'title';
  71276. if (!Ext.isEmpty(tip)) {
  71277. tipMarkup = attr + '="' + tip + '" ';
  71278. }
  71279. return Ext.applyIf(me.callParent(arguments), {
  71280. text: me.text,
  71281. menuDisabled: me.menuDisabled,
  71282. tipMarkup: tipMarkup
  71283. });
  71284. },
  71285. applyColumnState: function (state) {
  71286. var me = this,
  71287. defined = Ext.isDefined;
  71288. me.applyColumnsState(state.columns);
  71289. if (defined(state.hidden)) {
  71290. me.hidden = state.hidden;
  71291. }
  71292. if (defined(state.locked)) {
  71293. me.locked = state.locked;
  71294. }
  71295. if (defined(state.sortable)) {
  71296. me.sortable = state.sortable;
  71297. }
  71298. if (defined(state.width)) {
  71299. delete me.flex;
  71300. me.width = state.width;
  71301. } else if (defined(state.flex)) {
  71302. delete me.width;
  71303. me.flex = state.flex;
  71304. }
  71305. },
  71306. getColumnState: function () {
  71307. var me = this,
  71308. items = me.items.items,
  71309. iLen = items ? items.length : 0,
  71310. i,
  71311. columns = [],
  71312. state = {
  71313. id: me.getStateId()
  71314. };
  71315. me.savePropsToState(['hidden', 'sortable', 'locked', 'flex', 'width'], state);
  71316. if (me.isGroupHeader) {
  71317. for (i = 0; i < iLen; i++) {
  71318. columns.push(items[i].getColumnState());
  71319. }
  71320. if (columns.length) {
  71321. state.columns = columns;
  71322. }
  71323. } else if (me.isSubHeader && me.ownerCt.hidden) {
  71324. delete me.hidden;
  71325. }
  71326. if ('width' in state) {
  71327. delete state.flex;
  71328. }
  71329. return state;
  71330. },
  71331. getStateId: function () {
  71332. return this.stateId || this.headerId;
  71333. },
  71334. setText: function(text) {
  71335. this.text = text;
  71336. if (this.rendered) {
  71337. this.textEl.update(text);
  71338. }
  71339. },
  71340. getOwnerHeaderCt: function() {
  71341. return this.up(':not([isHeader])');
  71342. },
  71343. getIndex: function() {
  71344. return this.isGroupColumn ? false : this.getOwnerHeaderCt().getHeaderIndex(this);
  71345. },
  71346. getVisibleIndex: function() {
  71347. return this.isGroupColumn ? false : Ext.Array.indexOf(this.getOwnerHeaderCt().getVisibleGridColumns(), this);
  71348. },
  71349. beforeRender: function() {
  71350. var me = this,
  71351. grid = me.up('tablepanel');
  71352. me.callParent();
  71353. if (grid && (!me.sortable || grid.sortableColumns === false) && !me.groupable &&
  71354. !me.lockable && (grid.enableColumnHide === false ||
  71355. !me.getOwnerHeaderCt().getHideableColumns().length)) {
  71356. me.menuDisabled = true;
  71357. }
  71358. },
  71359. afterRender: function() {
  71360. var me = this,
  71361. el = me.el;
  71362. me.callParent(arguments);
  71363. if (me.overCls) {
  71364. el.addClsOnOver(me.overCls);
  71365. }
  71366. if (!Ext.isIE8 || !Ext.isStrict) {
  71367. me.mon(me.getFocusEl(), {
  71368. focus: me.onTitleMouseOver,
  71369. blur: me.onTitleMouseOut,
  71370. scope: me
  71371. });
  71372. }
  71373. me.keyNav = new Ext.util.KeyNav(el, {
  71374. enter: me.onEnterKey,
  71375. down: me.onDownKey,
  71376. scope: me
  71377. });
  71378. },
  71379. afterComponentLayout: function(width, height, oldWidth, oldHeight) {
  71380. var me = this,
  71381. ownerHeaderCt = me.getOwnerHeaderCt();
  71382. me.callParent(arguments);
  71383. if (ownerHeaderCt && (oldWidth != null || me.flex) && width !== oldWidth) {
  71384. ownerHeaderCt.onHeaderResize(me, width, true);
  71385. }
  71386. },
  71387. setPadding: function(headerHeight) {
  71388. var me = this,
  71389. lineHeight = parseInt(me.textEl.getStyle('line-height'), 10),
  71390. textHeight = me.textEl.dom.offsetHeight,
  71391. titleEl = me.titleEl,
  71392. availableHeight = headerHeight - me.el.getBorderWidth('tb'),
  71393. titleElHeight;
  71394. if (!me.isGroupHeader) {
  71395. if (titleEl.getHeight() < availableHeight) {
  71396. titleEl.setHeight(availableHeight);
  71397. me.ownerCt.layout.innerCt.setHeight(headerHeight);
  71398. }
  71399. }
  71400. titleElHeight = titleEl.getViewSize().height;
  71401. if (textHeight) {
  71402. if(lineHeight) {
  71403. textHeight = Math.ceil(textHeight / lineHeight) * lineHeight;
  71404. }
  71405. titleEl.setStyle({
  71406. paddingTop: Math.floor(Math.max(((titleElHeight - textHeight) / 2), 0)) + 'px'
  71407. });
  71408. }
  71409. if (Ext.isIE && me.triggerEl) {
  71410. me.triggerEl.setHeight(titleElHeight);
  71411. }
  71412. },
  71413. onDestroy: function() {
  71414. var me = this;
  71415. Ext.destroy(me.textEl, me.keyNav, me.field);
  71416. delete me.keyNav;
  71417. me.callParent(arguments);
  71418. },
  71419. onTitleMouseOver: function() {
  71420. this.titleEl.addCls(this.hoverCls);
  71421. },
  71422. onTitleMouseOut: function() {
  71423. this.titleEl.removeCls(this.hoverCls);
  71424. },
  71425. onDownKey: function(e) {
  71426. if (this.triggerEl) {
  71427. this.onElClick(e, this.triggerEl.dom || this.el.dom);
  71428. }
  71429. },
  71430. onEnterKey: function(e) {
  71431. this.onElClick(e, this.el.dom);
  71432. },
  71433. onElDblClick: function(e, t) {
  71434. var me = this,
  71435. ownerCt = me.ownerCt;
  71436. if (ownerCt && Ext.Array.indexOf(ownerCt.items, me) !== 0 && me.isOnLeftEdge(e) ) {
  71437. ownerCt.expandToFit(me.previousSibling('gridcolumn'));
  71438. }
  71439. },
  71440. onElClick: function(e, t) {
  71441. var me = this,
  71442. ownerHeaderCt = me.getOwnerHeaderCt();
  71443. if (ownerHeaderCt && !ownerHeaderCt.ddLock) {
  71444. if (me.triggerEl && (e.target === me.triggerEl.dom || t === me.triggerEl.dom || e.within(me.triggerEl))) {
  71445. ownerHeaderCt.onHeaderTriggerClick(me, e, t);
  71446. } else if (e.getKey() || (!me.isOnLeftEdge(e) && !me.isOnRightEdge(e))) {
  71447. me.toggleSortState();
  71448. ownerHeaderCt.onHeaderClick(me, e, t);
  71449. }
  71450. }
  71451. },
  71452. processEvent: function(type, view, cell, recordIndex, cellIndex, e) {
  71453. return this.fireEvent.apply(this, arguments);
  71454. },
  71455. toggleSortState: function() {
  71456. var me = this,
  71457. idx,
  71458. nextIdx;
  71459. if (me.sortable) {
  71460. idx = Ext.Array.indexOf(me.possibleSortStates, me.sortState);
  71461. nextIdx = (idx + 1) % me.possibleSortStates.length;
  71462. me.setSortState(me.possibleSortStates[nextIdx]);
  71463. }
  71464. },
  71465. doSort: function(state) {
  71466. var ds = this.up('tablepanel').store;
  71467. ds.sort({
  71468. property: this.getSortParam(),
  71469. direction: state
  71470. });
  71471. },
  71472. getSortParam: function() {
  71473. return this.dataIndex;
  71474. },
  71475. setSortState: function(state, skipClear, initial) {
  71476. var me = this,
  71477. colSortClsPrefix = Ext.baseCSSPrefix + 'column-header-sort-',
  71478. ascCls = colSortClsPrefix + 'ASC',
  71479. descCls = colSortClsPrefix + 'DESC',
  71480. nullCls = colSortClsPrefix + 'null',
  71481. ownerHeaderCt = me.getOwnerHeaderCt(),
  71482. oldSortState = me.sortState;
  71483. if (oldSortState !== state && me.getSortParam()) {
  71484. me.addCls(colSortClsPrefix + state);
  71485. if (state && !initial) {
  71486. me.doSort(state);
  71487. }
  71488. switch (state) {
  71489. case 'DESC':
  71490. me.removeCls([ascCls, nullCls]);
  71491. break;
  71492. case 'ASC':
  71493. me.removeCls([descCls, nullCls]);
  71494. break;
  71495. case null:
  71496. me.removeCls([ascCls, descCls]);
  71497. break;
  71498. }
  71499. if (ownerHeaderCt && !me.triStateSort && !skipClear) {
  71500. ownerHeaderCt.clearOtherSortStates(me);
  71501. }
  71502. me.sortState = state;
  71503. if (me.triStateSort || state != null) {
  71504. ownerHeaderCt.fireEvent('sortchange', ownerHeaderCt, me, state);
  71505. }
  71506. }
  71507. },
  71508. hide: function(fromOwner) {
  71509. var me = this,
  71510. ownerHeaderCt = me.getOwnerHeaderCt(),
  71511. owner = me.ownerCt,
  71512. ownerIsGroup = owner.isGroupHeader,
  71513. item, items, len, i;
  71514. if (ownerIsGroup && !fromOwner) {
  71515. items = owner.query('>:not([hidden])');
  71516. if (items.length === 1 && items[0] == me) {
  71517. me.ownerCt.hide();
  71518. return;
  71519. }
  71520. }
  71521. Ext.suspendLayouts();
  71522. if (me.isGroupHeader) {
  71523. items = me.items.items;
  71524. for (i = 0, len = items.length; i < len; i++) {
  71525. item = items[i];
  71526. if (!item.hidden) {
  71527. item.hide(true);
  71528. }
  71529. }
  71530. }
  71531. me.callParent();
  71532. ownerHeaderCt.onHeaderHide(me);
  71533. Ext.resumeLayouts(true);
  71534. },
  71535. show: function(fromOwner, fromChild) {
  71536. var me = this,
  71537. ownerCt = me.ownerCt,
  71538. items,
  71539. len, i,
  71540. item;
  71541. Ext.suspendLayouts();
  71542. if (me.isSubHeader && ownerCt.hidden) {
  71543. ownerCt.show(false, true);
  71544. }
  71545. me.callParent(arguments);
  71546. if (me.isGroupHeader && fromChild !== true && !me.query(':not([hidden])').length) {
  71547. items = me.query('>*');
  71548. for (i = 0, len = items.length; i < len; i++) {
  71549. item = items[i];
  71550. if (item.hidden) {
  71551. item.show(true);
  71552. }
  71553. }
  71554. }
  71555. Ext.resumeLayouts(true);
  71556. ownerCt = me.getOwnerHeaderCt();
  71557. if (ownerCt) {
  71558. ownerCt.onHeaderShow(me);
  71559. }
  71560. },
  71561. getDesiredWidth: function() {
  71562. var me = this;
  71563. if (me.rendered && me.componentLayout && me.componentLayout.lastComponentSize) {
  71564. return me.componentLayout.lastComponentSize.width;
  71565. }
  71566. else if (me.flex) {
  71567. return me.width;
  71568. }
  71569. else {
  71570. return me.width;
  71571. }
  71572. },
  71573. getCellSelector: function() {
  71574. return '.' + Ext.baseCSSPrefix + 'grid-cell-' + this.getItemId();
  71575. },
  71576. getCellInnerSelector: function() {
  71577. return this.getCellSelector() + ' .' + Ext.baseCSSPrefix + 'grid-cell-inner';
  71578. },
  71579. isOnLeftEdge: function(e) {
  71580. return (e.getXY()[0] - this.el.getLeft() <= this.handleWidth);
  71581. },
  71582. isOnRightEdge: function(e) {
  71583. return (this.el.getRight() - e.getXY()[0] <= this.handleWidth);
  71584. }
  71585. });
  71586. Ext.define('Ext.grid.RowNumberer', {
  71587. extend: 'Ext.grid.column.Column',
  71588. alias: 'widget.rownumberer',
  71589. text: "&#160",
  71590. width: 23,
  71591. sortable: false,
  71592. draggable: false,
  71593. align: 'right',
  71594. constructor : function(config){
  71595. this.width = this.width;
  71596. this.callParent(arguments);
  71597. if (this.rowspan) {
  71598. this.renderer = Ext.Function.bind(this.renderer, this);
  71599. }
  71600. },
  71601. resizable: false,
  71602. hideable: false,
  71603. menuDisabled: true,
  71604. dataIndex: '',
  71605. cls: Ext.baseCSSPrefix + 'row-numberer',
  71606. rowspan: undefined,
  71607. renderer: function(value, metaData, record, rowIdx, colIdx, store) {
  71608. if (this.rowspan){
  71609. metaData.cellAttr = 'rowspan="'+this.rowspan+'"';
  71610. }
  71611. metaData.tdCls = Ext.baseCSSPrefix + 'grid-cell-special';
  71612. return store.indexOfTotal(record) + 1;
  71613. }
  71614. });
  71615. Ext.define('Ext.view.DropZone', {
  71616. extend: 'Ext.dd.DropZone',
  71617. indicatorHtml: '<div class="' + Ext.baseCSSPrefix + 'grid-drop-indicator-left"></div><div class="' + Ext.baseCSSPrefix + 'grid-drop-indicator-right"></div>',
  71618. indicatorCls: Ext.baseCSSPrefix + 'grid-drop-indicator',
  71619. constructor: function(config) {
  71620. var me = this;
  71621. Ext.apply(me, config);
  71622. if (!me.ddGroup) {
  71623. me.ddGroup = 'view-dd-zone-' + me.view.id;
  71624. }
  71625. me.callParent([me.view.el]);
  71626. },
  71627. fireViewEvent: function() {
  71628. var me = this,
  71629. result;
  71630. me.lock();
  71631. result = me.view.fireEvent.apply(me.view, arguments);
  71632. me.unlock();
  71633. return result;
  71634. },
  71635. getTargetFromEvent : function(e) {
  71636. var node = e.getTarget(this.view.getItemSelector()),
  71637. mouseY, nodeList, testNode, i, len, box;
  71638. if (!node) {
  71639. mouseY = e.getPageY();
  71640. for (i = 0, nodeList = this.view.getNodes(), len = nodeList.length; i < len; i++) {
  71641. testNode = nodeList[i];
  71642. box = Ext.fly(testNode).getBox();
  71643. if (mouseY <= box.bottom) {
  71644. return testNode;
  71645. }
  71646. }
  71647. }
  71648. return node;
  71649. },
  71650. getIndicator: function() {
  71651. var me = this;
  71652. if (!me.indicator) {
  71653. me.indicator = new Ext.Component({
  71654. html: me.indicatorHtml,
  71655. cls: me.indicatorCls,
  71656. ownerCt: me.view,
  71657. floating: true,
  71658. shadow: false
  71659. });
  71660. }
  71661. return me.indicator;
  71662. },
  71663. getPosition: function(e, node) {
  71664. var y = e.getXY()[1],
  71665. region = Ext.fly(node).getRegion(),
  71666. pos;
  71667. if ((region.bottom - y) >= (region.bottom - region.top) / 2) {
  71668. pos = "before";
  71669. } else {
  71670. pos = "after";
  71671. }
  71672. return pos;
  71673. },
  71674. containsRecordAtOffset: function(records, record, offset) {
  71675. if (!record) {
  71676. return false;
  71677. }
  71678. var view = this.view,
  71679. recordIndex = view.indexOf(record),
  71680. nodeBefore = view.getNode(recordIndex + offset),
  71681. recordBefore = nodeBefore ? view.getRecord(nodeBefore) : null;
  71682. return recordBefore && Ext.Array.contains(records, recordBefore);
  71683. },
  71684. positionIndicator: function(node, data, e) {
  71685. var me = this,
  71686. view = me.view,
  71687. pos = me.getPosition(e, node),
  71688. overRecord = view.getRecord(node),
  71689. draggingRecords = data.records,
  71690. indicatorY;
  71691. if (!Ext.Array.contains(draggingRecords, overRecord) && (
  71692. pos == 'before' && !me.containsRecordAtOffset(draggingRecords, overRecord, -1) ||
  71693. pos == 'after' && !me.containsRecordAtOffset(draggingRecords, overRecord, 1)
  71694. )) {
  71695. me.valid = true;
  71696. if (me.overRecord != overRecord || me.currentPosition != pos) {
  71697. indicatorY = Ext.fly(node).getY() - view.el.getY() - 1;
  71698. if (pos == 'after') {
  71699. indicatorY += Ext.fly(node).getHeight();
  71700. }
  71701. me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0, indicatorY);
  71702. me.overRecord = overRecord;
  71703. me.currentPosition = pos;
  71704. }
  71705. } else {
  71706. me.invalidateDrop();
  71707. }
  71708. },
  71709. invalidateDrop: function() {
  71710. if (this.valid) {
  71711. this.valid = false;
  71712. this.getIndicator().hide();
  71713. }
  71714. },
  71715. onNodeOver: function(node, dragZone, e, data) {
  71716. var me = this;
  71717. if (!Ext.Array.contains(data.records, me.view.getRecord(node))) {
  71718. me.positionIndicator(node, data, e);
  71719. }
  71720. return me.valid ? me.dropAllowed : me.dropNotAllowed;
  71721. },
  71722. notifyOut: function(node, dragZone, e, data) {
  71723. var me = this;
  71724. me.callParent(arguments);
  71725. delete me.overRecord;
  71726. delete me.currentPosition;
  71727. if (me.indicator) {
  71728. me.indicator.hide();
  71729. }
  71730. },
  71731. onContainerOver : function(dd, e, data) {
  71732. var me = this,
  71733. view = me.view,
  71734. count = view.store.getCount();
  71735. if (count) {
  71736. me.positionIndicator(view.getNode(count - 1), data, e);
  71737. }
  71738. else {
  71739. delete me.overRecord;
  71740. delete me.currentPosition;
  71741. me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0, 0);
  71742. me.valid = true;
  71743. }
  71744. return me.dropAllowed;
  71745. },
  71746. onContainerDrop : function(dd, e, data) {
  71747. return this.onNodeDrop(dd, null, e, data);
  71748. },
  71749. onNodeDrop: function(node, dragZone, e, data) {
  71750. var me = this,
  71751. dropHandled = false,
  71752. dropHandlers = {
  71753. wait: false,
  71754. processDrop: function () {
  71755. me.invalidateDrop();
  71756. me.handleNodeDrop(data, me.overRecord, me.currentPosition);
  71757. dropHandled = true;
  71758. me.fireViewEvent('drop', node, data, me.overRecord, me.currentPosition);
  71759. },
  71760. cancelDrop: function() {
  71761. me.invalidateDrop();
  71762. dropHandled = true;
  71763. }
  71764. },
  71765. performOperation = false;
  71766. if (me.valid) {
  71767. performOperation = me.fireViewEvent('beforedrop', node, data, me.overRecord, me.currentPosition, dropHandlers);
  71768. if (dropHandlers.wait) {
  71769. return;
  71770. }
  71771. if (performOperation !== false) {
  71772. if (!dropHandled) {
  71773. dropHandlers.processDrop();
  71774. }
  71775. }
  71776. }
  71777. return performOperation;
  71778. },
  71779. destroy: function(){
  71780. Ext.destroy(this.indicator);
  71781. delete this.indicator;
  71782. this.callParent();
  71783. }
  71784. });
  71785. Ext.define('Ext.grid.ViewDropZone', {
  71786. extend: 'Ext.view.DropZone',
  71787. indicatorHtml: '<div class="' + Ext.baseCSSPrefix + 'grid-drop-indicator-left"></div><div class="' + Ext.baseCSSPrefix + 'grid-drop-indicator-right"></div>',
  71788. indicatorCls: Ext.baseCSSPrefix + 'grid-drop-indicator',
  71789. handleNodeDrop : function(data, record, position) {
  71790. var view = this.view,
  71791. store = view.getStore(),
  71792. index, records, i, len;
  71793. if (data.copy) {
  71794. records = data.records;
  71795. data.records = [];
  71796. for (i = 0, len = records.length; i < len; i++) {
  71797. data.records.push(records[i].copy(records[i].getId()));
  71798. }
  71799. } else {
  71800. data.view.store.remove(data.records, data.view === view);
  71801. }
  71802. index = store.indexOf(record);
  71803. if (position !== 'before') {
  71804. index++;
  71805. }
  71806. store.insert(index, data.records);
  71807. view.getSelectionModel().select(data.records);
  71808. }
  71809. });
  71810. Ext.define('Ext.grid.column.Action', {
  71811. extend: 'Ext.grid.column.Column',
  71812. alias: ['widget.actioncolumn'],
  71813. alternateClassName: 'Ext.grid.ActionColumn',
  71814. actionIdRe: new RegExp(Ext.baseCSSPrefix + 'action-col-(\\d+)'),
  71815. altText: '',
  71816. menuText: '<i>Actions</i>',
  71817. sortable: false,
  71818. constructor: function(config) {
  71819. var me = this,
  71820. cfg = Ext.apply({}, config),
  71821. items = cfg.items || [me],
  71822. hasGetClass,
  71823. i,
  71824. len;
  71825. me.origRenderer = cfg.renderer || me.renderer;
  71826. me.origScope = cfg.scope || me.scope;
  71827. delete me.renderer;
  71828. delete me.scope;
  71829. delete cfg.renderer;
  71830. delete cfg.scope;
  71831. delete cfg.items;
  71832. me.callParent([cfg]);
  71833. me.items = items;
  71834. for (i = 0, len = items.length; i < len; ++i) {
  71835. if (items[i].getClass) {
  71836. hasGetClass = true;
  71837. break;
  71838. }
  71839. }
  71840. if (me.origRenderer || hasGetClass) {
  71841. me.hasCustomRenderer = true;
  71842. }
  71843. },
  71844. defaultRenderer: function(v, meta){
  71845. var me = this,
  71846. prefix = Ext.baseCSSPrefix,
  71847. scope = me.origScope || me,
  71848. items = me.items,
  71849. len = items.length,
  71850. i = 0,
  71851. item;
  71852. v = Ext.isFunction(me.origRenderer) ? me.origRenderer.apply(scope, arguments) || '' : '';
  71853. meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell';
  71854. for (; i < len; i++) {
  71855. item = items[i];
  71856. if (!item.hasActionConfiguration) {
  71857. item.stopSelection = me.stopSelection;
  71858. item.disable = Ext.Function.bind(me.disableAction, me, [i], 0);
  71859. item.enable = Ext.Function.bind(me.enableAction, me, [i], 0);
  71860. item.hasActionConfiguration = true;
  71861. }
  71862. v += '<img alt="' + (item.altText || me.altText) + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) +
  71863. '" class="' + prefix + 'action-col-icon ' + prefix + 'action-col-' + String(i) + ' ' + (item.disabled ? prefix + 'item-disabled' : ' ') +
  71864. ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope || scope, arguments) : (item.iconCls || me.iconCls || '')) + '"' +
  71865. ((item.tooltip) ? ' data-qtip="' + item.tooltip + '"' : '') + ' />';
  71866. }
  71867. return v;
  71868. },
  71869. enableAction: function(index, silent) {
  71870. var me = this;
  71871. if (!index) {
  71872. index = 0;
  71873. } else if (!Ext.isNumber(index)) {
  71874. index = Ext.Array.indexOf(me.items, index);
  71875. }
  71876. me.items[index].disabled = false;
  71877. me.up('tablepanel').el.select('.' + Ext.baseCSSPrefix + 'action-col-' + index).removeCls(me.disabledCls);
  71878. if (!silent) {
  71879. me.fireEvent('enable', me);
  71880. }
  71881. },
  71882. disableAction: function(index, silent) {
  71883. var me = this;
  71884. if (!index) {
  71885. index = 0;
  71886. } else if (!Ext.isNumber(index)) {
  71887. index = Ext.Array.indexOf(me.items, index);
  71888. }
  71889. me.items[index].disabled = true;
  71890. me.up('tablepanel').el.select('.' + Ext.baseCSSPrefix + 'action-col-' + index).addCls(me.disabledCls);
  71891. if (!silent) {
  71892. me.fireEvent('disable', me);
  71893. }
  71894. },
  71895. destroy: function() {
  71896. delete this.items;
  71897. delete this.renderer;
  71898. return this.callParent(arguments);
  71899. },
  71900. processEvent : function(type, view, cell, recordIndex, cellIndex, e, record, row){
  71901. var me = this,
  71902. target = e.getTarget(),
  71903. match,
  71904. item, fn,
  71905. key = type == 'keydown' && e.getKey();
  71906. if (key && !Ext.fly(target).findParent(view.cellSelector)) {
  71907. target = Ext.fly(cell).down('.' + Ext.baseCSSPrefix + 'action-col-icon', true);
  71908. }
  71909. if (target && (match = target.className.match(me.actionIdRe))) {
  71910. item = me.items[parseInt(match[1], 10)];
  71911. if (item) {
  71912. if (type == 'click' || (key == e.ENTER || key == e.SPACE)) {
  71913. fn = item.handler || me.handler;
  71914. if (fn && !item.disabled) {
  71915. fn.call(item.scope || me.origScope || me, view, recordIndex, cellIndex, item, e, record, row);
  71916. }
  71917. } else if (type == 'mousedown' && item.stopSelection !== false) {
  71918. return false;
  71919. }
  71920. }
  71921. }
  71922. return me.callParent(arguments);
  71923. },
  71924. cascade: function(fn, scope) {
  71925. fn.call(scope||this, this);
  71926. },
  71927. getRefItems: function() {
  71928. return [];
  71929. }
  71930. });
  71931. Ext.define('Ext.grid.column.Boolean', {
  71932. extend: 'Ext.grid.column.Column',
  71933. alias: ['widget.booleancolumn'],
  71934. alternateClassName: 'Ext.grid.BooleanColumn',
  71935. trueText: 'true',
  71936. falseText: 'false',
  71937. undefinedText: '&#160;',
  71938. defaultRenderer: function(value){
  71939. if (value === undefined) {
  71940. return this.undefinedText;
  71941. }
  71942. if (!value || value === 'false') {
  71943. return this.falseText;
  71944. }
  71945. return this.trueText;
  71946. }
  71947. });
  71948. Ext.define('Ext.grid.column.Date', {
  71949. extend: 'Ext.grid.column.Column',
  71950. alias: ['widget.datecolumn'],
  71951. requires: ['Ext.Date'],
  71952. alternateClassName: 'Ext.grid.DateColumn',
  71953. initComponent: function(){
  71954. if (!this.format) {
  71955. this.format = Ext.Date.defaultFormat;
  71956. }
  71957. this.callParent(arguments);
  71958. },
  71959. defaultRenderer: function(value){
  71960. return Ext.util.Format.date(value, this.format);
  71961. }
  71962. });
  71963. Ext.define('Ext.grid.column.Number', {
  71964. extend: 'Ext.grid.column.Column',
  71965. alias: ['widget.numbercolumn'],
  71966. requires: ['Ext.util.Format'],
  71967. alternateClassName: 'Ext.grid.NumberColumn',
  71968. format : '0,000.00',
  71969. defaultRenderer: function(value){
  71970. return Ext.util.Format.number(value, this.format);
  71971. }
  71972. });
  71973. Ext.define('Ext.grid.column.Template', {
  71974. extend: 'Ext.grid.column.Column',
  71975. alias: ['widget.templatecolumn'],
  71976. requires: ['Ext.XTemplate'],
  71977. alternateClassName: 'Ext.grid.TemplateColumn',
  71978. initComponent: function(){
  71979. var me = this;
  71980. me.tpl = (!Ext.isPrimitive(me.tpl) && me.tpl.compile) ? me.tpl : new Ext.XTemplate(me.tpl);
  71981. me.hasCustomRenderer = true;
  71982. me.callParent(arguments);
  71983. },
  71984. defaultRenderer: function(value, meta, record) {
  71985. var data = Ext.apply({}, record.data, record.getAssociatedData());
  71986. return this.tpl.apply(data);
  71987. }
  71988. });
  71989. Ext.define('Ext.grid.feature.Feature', {
  71990. extend: 'Ext.util.Observable',
  71991. alias: 'feature.feature',
  71992. isFeature: true,
  71993. disabled: false,
  71994. hasFeatureEvent: true,
  71995. eventPrefix: null,
  71996. eventSelector: null,
  71997. view: null,
  71998. grid: null,
  71999. collectData: false,
  72000. constructor: function(config) {
  72001. this.initialConfig = config;
  72002. this.callParent(arguments);
  72003. },
  72004. clone: function() {
  72005. return new this.self(this.initialConfig);
  72006. },
  72007. init: Ext.emptyFn,
  72008. getFeatureTpl: function() {
  72009. return '';
  72010. },
  72011. getFireEventArgs: function(eventName, view, featureTarget, e) {
  72012. return [eventName, view, featureTarget, e];
  72013. },
  72014. attachEvents: function() {
  72015. },
  72016. getFragmentTpl: Ext.emptyFn,
  72017. mutateMetaRowTpl: Ext.emptyFn,
  72018. getMetaRowTplFragments: function() {
  72019. return {};
  72020. },
  72021. getTableFragments: function() {
  72022. return {};
  72023. },
  72024. getAdditionalData: function(data, idx, record, orig) {
  72025. return {};
  72026. },
  72027. enable: function() {
  72028. this.disabled = false;
  72029. },
  72030. disable: function() {
  72031. this.disabled = true;
  72032. }
  72033. });
  72034. Ext.define('Ext.grid.feature.AbstractSummary', {
  72035. extend: 'Ext.grid.feature.Feature',
  72036. alias: 'feature.abstractsummary',
  72037. showSummaryRow: true,
  72038. nestedIdRe: /\{\{id\}([\w\-]*)\}/g,
  72039. init: function() {
  72040. var me = this;
  72041. me.grid.optimizedColumnMove = false;
  72042. me.view.mon(me.view.store, {
  72043. update: me.onStoreUpdate,
  72044. scope: me
  72045. });
  72046. },
  72047. onStoreUpdate: function() {
  72048. var v = this.view;
  72049. if (this.showSummaryRow) {
  72050. v.saveScrollState();
  72051. v.refresh();
  72052. v.restoreScrollState();
  72053. }
  72054. },
  72055. toggleSummaryRow: function(visible){
  72056. this.showSummaryRow = !!visible;
  72057. },
  72058. getSummaryFragments: function(){
  72059. var fragments = {};
  72060. if (this.showSummaryRow) {
  72061. Ext.apply(fragments, {
  72062. printSummaryRow: Ext.bind(this.printSummaryRow, this)
  72063. });
  72064. }
  72065. return fragments;
  72066. },
  72067. printSummaryRow: function(index){
  72068. var inner = this.view.getTableChunker().metaRowTpl.join(''),
  72069. prefix = Ext.baseCSSPrefix;
  72070. inner = inner.replace(prefix + 'grid-row', prefix + 'grid-row-summary');
  72071. inner = inner.replace('{{id}}', '{gridSummaryValue}');
  72072. inner = inner.replace(this.nestedIdRe, '{id$1}');
  72073. inner = inner.replace('{[this.embedRowCls()]}', '{rowCls}');
  72074. inner = inner.replace('{[this.embedRowAttr()]}', '{rowAttr}');
  72075. inner = new Ext.XTemplate(inner, {
  72076. firstOrLastCls: Ext.view.TableChunker.firstOrLastCls
  72077. });
  72078. return inner.applyTemplate({
  72079. columns: this.getPrintData(index)
  72080. });
  72081. },
  72082. getColumnValue: function(column, summaryData){
  72083. var comp = Ext.getCmp(column.id),
  72084. value = summaryData[column.id],
  72085. renderer = comp.summaryRenderer;
  72086. if (!value && value !== 0) {
  72087. value = '\u00a0';
  72088. }
  72089. if (renderer) {
  72090. value = renderer.call(
  72091. comp.scope || this,
  72092. value,
  72093. summaryData,
  72094. column.dataIndex
  72095. );
  72096. }
  72097. return value;
  72098. },
  72099. getSummary: function(store, type, field, group){
  72100. if (type) {
  72101. if (Ext.isFunction(type)) {
  72102. return store.aggregate(type, null, group);
  72103. }
  72104. switch (type) {
  72105. case 'count':
  72106. return store.count(group);
  72107. case 'min':
  72108. return store.min(field, group);
  72109. case 'max':
  72110. return store.max(field, group);
  72111. case 'sum':
  72112. return store.sum(field, group);
  72113. case 'average':
  72114. return store.average(field, group);
  72115. default:
  72116. return group ? {} : '';
  72117. }
  72118. }
  72119. }
  72120. });
  72121. Ext.define('Ext.grid.feature.Chunking', {
  72122. extend: 'Ext.grid.feature.Feature',
  72123. alias: 'feature.chunking',
  72124. chunkSize: 20,
  72125. rowHeight: Ext.isIE ? 27 : 26,
  72126. visibleChunk: 0,
  72127. hasFeatureEvent: false,
  72128. attachEvents: function() {
  72129. this.view.el.on('scroll', this.onBodyScroll, this, {buffer: 300});
  72130. },
  72131. onBodyScroll: function(e, t) {
  72132. var view = this.view,
  72133. top = t.scrollTop,
  72134. nextChunk = Math.floor(top / this.rowHeight / this.chunkSize);
  72135. if (nextChunk !== this.visibleChunk) {
  72136. this.visibleChunk = nextChunk;
  72137. view.refresh();
  72138. view.el.dom.scrollTop = top;
  72139. view.el.dom.scrollTop = top;
  72140. }
  72141. },
  72142. collectData: function(records, preppedRecords, startIndex, fullWidth, o) {
  72143. var me = this,
  72144. recordCount = o.rows.length,
  72145. start = 0,
  72146. i = 0,
  72147. visibleChunk = me.visibleChunk,
  72148. rows,
  72149. chunkLength,
  72150. origRows = o.rows;
  72151. delete o.rows;
  72152. o.chunks = [];
  72153. for (; start < recordCount; start += me.chunkSize, i++) {
  72154. if (start + me.chunkSize > recordCount) {
  72155. chunkLength = recordCount - start;
  72156. } else {
  72157. chunkLength = me.chunkSize;
  72158. }
  72159. if (i >= visibleChunk - 1 && i <= visibleChunk + 1) {
  72160. rows = origRows.slice(start, start + me.chunkSize);
  72161. } else {
  72162. rows = [];
  72163. }
  72164. o.chunks.push({
  72165. rows: rows,
  72166. fullWidth: fullWidth,
  72167. chunkHeight: chunkLength * me.rowHeight
  72168. });
  72169. }
  72170. return o;
  72171. },
  72172. getTableFragments: function() {
  72173. return {
  72174. openTableWrap: function() {
  72175. return '<tpl for="chunks"><div class="' + Ext.baseCSSPrefix + 'grid-chunk" style="height: {chunkHeight}px;">';
  72176. },
  72177. closeTableWrap: function() {
  72178. return '</div></tpl>';
  72179. }
  72180. };
  72181. }
  72182. });
  72183. Ext.define('Ext.grid.feature.Grouping', {
  72184. extend: 'Ext.grid.feature.Feature',
  72185. alias: 'feature.grouping',
  72186. eventPrefix: 'group',
  72187. eventSelector: '.' + Ext.baseCSSPrefix + 'grid-group-hd',
  72188. bodySelector: '.' + Ext.baseCSSPrefix + 'grid-group-body',
  72189. constructor: function() {
  72190. var me = this;
  72191. me.collapsedState = {};
  72192. me.callParent(arguments);
  72193. },
  72194. groupHeaderTpl: '{columnName}: {name}',
  72195. depthToIndent: 17,
  72196. collapsedCls: Ext.baseCSSPrefix + 'grid-group-collapsed',
  72197. hdCollapsedCls: Ext.baseCSSPrefix + 'grid-group-hd-collapsed',
  72198. hdCollapsibleCls: Ext.baseCSSPrefix + 'grid-group-hd-collapsible',
  72199. groupByText : 'Group by this field',
  72200. showGroupsText : 'Show in groups',
  72201. hideGroupedHeader : false,
  72202. startCollapsed : false,
  72203. enableGroupingMenu : true,
  72204. enableNoGroups : true,
  72205. collapsible: true,
  72206. enable: function() {
  72207. var me = this,
  72208. view = me.view,
  72209. store = view.store,
  72210. groupToggleMenuItem;
  72211. me.lastGroupField = me.getGroupField();
  72212. if (me.lastGroupIndex) {
  72213. me.block();
  72214. store.group(me.lastGroupIndex);
  72215. me.unblock();
  72216. }
  72217. me.callParent();
  72218. groupToggleMenuItem = me.view.headerCt.getMenu().down('#groupToggleMenuItem');
  72219. groupToggleMenuItem.setChecked(true, true);
  72220. me.refreshIf();
  72221. },
  72222. disable: function() {
  72223. var me = this,
  72224. view = me.view,
  72225. store = view.store,
  72226. remote = store.remoteGroup,
  72227. groupToggleMenuItem,
  72228. lastGroup;
  72229. lastGroup = store.groupers.first();
  72230. if (lastGroup) {
  72231. me.lastGroupIndex = lastGroup.property;
  72232. me.block();
  72233. store.clearGrouping();
  72234. me.unblock();
  72235. }
  72236. me.callParent();
  72237. groupToggleMenuItem = me.view.headerCt.getMenu().down('#groupToggleMenuItem');
  72238. groupToggleMenuItem.setChecked(true, true);
  72239. groupToggleMenuItem.setChecked(false, true);
  72240. me.refreshIf();
  72241. },
  72242. refreshIf: function() {
  72243. var ownerCt = this.grid.ownerCt,
  72244. view = this.view;
  72245. if (!view.store.remoteGroup && !this.blockRefresh) {
  72246. if (ownerCt && ownerCt.lockable) {
  72247. ownerCt.view.refresh();
  72248. } else {
  72249. view.refresh();
  72250. }
  72251. }
  72252. },
  72253. getFeatureTpl: function(values, parent, x, xcount) {
  72254. return [
  72255. '<tpl if="typeof rows !== \'undefined\'">',
  72256. '<tr id="{groupHeaderId}" class="' + Ext.baseCSSPrefix + 'grid-group-hd {hdCollapsedCls} {collapsibleClass}"><td class="' + Ext.baseCSSPrefix + 'grid-cell" colspan="' + parent.columns.length + '" {[this.indentByDepth(values)]}><div class="' + Ext.baseCSSPrefix + 'grid-cell-inner"><div class="' + Ext.baseCSSPrefix + 'grid-group-title">{collapsed}{[this.renderGroupHeaderTpl(values, parent)]}</div></div></td></tr>',
  72257. '<tr id="{groupBodyId}" class="' + Ext.baseCSSPrefix + 'grid-group-body {collapsedCls}"><td colspan="' + parent.columns.length + '">{[this.recurse(values)]}</td></tr>',
  72258. '</tpl>'
  72259. ].join('');
  72260. },
  72261. getFragmentTpl: function() {
  72262. var me = this;
  72263. return {
  72264. indentByDepth: me.indentByDepth,
  72265. depthToIndent: me.depthToIndent,
  72266. renderGroupHeaderTpl: function(values, parent) {
  72267. return Ext.XTemplate.getTpl(me, 'groupHeaderTpl').apply(values, parent);
  72268. }
  72269. };
  72270. },
  72271. indentByDepth: function(values) {
  72272. return 'style="padding-left:'+ ((values.depth || 0) * this.depthToIndent) + 'px;"';
  72273. },
  72274. destroy: function() {
  72275. delete this.view;
  72276. delete this.prunedHeader;
  72277. },
  72278. attachEvents: function() {
  72279. var me = this,
  72280. view = me.view;
  72281. view.on({
  72282. scope: me,
  72283. groupclick: me.onGroupClick,
  72284. rowfocus: me.onRowFocus
  72285. });
  72286. view.mon(view.store, {
  72287. scope: me,
  72288. groupchange: me.onGroupChange,
  72289. remove: me.onRemove,
  72290. add: me.onAdd,
  72291. update: me.onUpdate
  72292. });
  72293. if (me.enableGroupingMenu) {
  72294. me.injectGroupingMenu();
  72295. }
  72296. me.pruneGroupedHeader();
  72297. me.lastGroupField = me.getGroupField();
  72298. me.block();
  72299. me.onGroupChange();
  72300. me.unblock();
  72301. },
  72302. onAdd: function(store, records){
  72303. var me = this,
  72304. view = me.view,
  72305. groupField = me.getGroupField(),
  72306. i = 0,
  72307. len = records.length,
  72308. activeGroups,
  72309. addedGroups,
  72310. groups,
  72311. needsRefresh,
  72312. group;
  72313. if (view.rendered) {
  72314. addedGroups = {};
  72315. activeGroups = {};
  72316. for (; i < len; ++i) {
  72317. group = records[i].get(groupField);
  72318. if (addedGroups[group] === undefined) {
  72319. addedGroups[group] = 0;
  72320. }
  72321. addedGroups[group] += 1;
  72322. }
  72323. groups = store.getGroups();
  72324. for (i = 0, len = groups.length; i < len; ++i) {
  72325. group = groups[i];
  72326. activeGroups[group.name] = group.children.length;
  72327. }
  72328. for (group in addedGroups) {
  72329. if (addedGroups[group] === activeGroups[group]) {
  72330. needsRefresh = true;
  72331. break;
  72332. }
  72333. }
  72334. if (needsRefresh) {
  72335. view.refresh();
  72336. }
  72337. }
  72338. },
  72339. onUpdate: function(store, record, type, changedFields){
  72340. var view = this.view;
  72341. if (view.rendered && !changedFields || Ext.Array.contains(changedFields, this.getGroupField())) {
  72342. view.refresh();
  72343. }
  72344. },
  72345. onRemove: function(store, record) {
  72346. var me = this,
  72347. groupField = me.getGroupField(),
  72348. removedGroup = record.get(groupField),
  72349. view = me.view;
  72350. if (view.rendered) {
  72351. if (store.findExact(groupField, removedGroup) === -1) {
  72352. me.view.refresh();
  72353. }
  72354. }
  72355. },
  72356. injectGroupingMenu: function() {
  72357. var me = this,
  72358. headerCt = me.view.headerCt;
  72359. headerCt.showMenuBy = me.showMenuBy;
  72360. headerCt.getMenuItems = me.getMenuItems();
  72361. },
  72362. showMenuBy: function(t, header) {
  72363. var menu = this.getMenu(),
  72364. groupMenuItem = menu.down('#groupMenuItem'),
  72365. groupableMth = header.groupable === false ? 'disable' : 'enable';
  72366. groupMenuItem[groupableMth]();
  72367. Ext.grid.header.Container.prototype.showMenuBy.apply(this, arguments);
  72368. },
  72369. getMenuItems: function() {
  72370. var me = this,
  72371. groupByText = me.groupByText,
  72372. disabled = me.disabled || !me.getGroupField(),
  72373. showGroupsText = me.showGroupsText,
  72374. enableNoGroups = me.enableNoGroups,
  72375. getMenuItems = me.view.headerCt.getMenuItems;
  72376. return function() {
  72377. var o = getMenuItems.call(this);
  72378. o.push('-', {
  72379. iconCls: Ext.baseCSSPrefix + 'group-by-icon',
  72380. itemId: 'groupMenuItem',
  72381. text: groupByText,
  72382. handler: me.onGroupMenuItemClick,
  72383. scope: me
  72384. });
  72385. if (enableNoGroups) {
  72386. o.push({
  72387. itemId: 'groupToggleMenuItem',
  72388. text: showGroupsText,
  72389. checked: !disabled,
  72390. checkHandler: me.onGroupToggleMenuItemClick,
  72391. scope: me
  72392. });
  72393. }
  72394. return o;
  72395. };
  72396. },
  72397. onGroupMenuItemClick: function(menuItem, e) {
  72398. var me = this,
  72399. menu = menuItem.parentMenu,
  72400. hdr = menu.activeHeader,
  72401. view = me.view,
  72402. store = view.store;
  72403. delete me.lastGroupIndex;
  72404. me.block();
  72405. me.enable();
  72406. store.group(hdr.dataIndex);
  72407. me.pruneGroupedHeader();
  72408. me.unblock();
  72409. me.refreshIf();
  72410. },
  72411. block: function(){
  72412. this.blockRefresh = this.view.blockRefresh = true;
  72413. },
  72414. unblock: function(){
  72415. this.blockRefresh = this.view.blockRefresh = false;
  72416. },
  72417. onGroupToggleMenuItemClick: function(menuItem, checked) {
  72418. this[checked ? 'enable' : 'disable']();
  72419. },
  72420. pruneGroupedHeader: function() {
  72421. var me = this,
  72422. header = me.getGroupedHeader();
  72423. if (me.hideGroupedHeader && header) {
  72424. if (me.prunedHeader) {
  72425. me.prunedHeader.show();
  72426. }
  72427. me.prunedHeader = header;
  72428. header.hide();
  72429. }
  72430. },
  72431. getGroupedHeader: function(){
  72432. var groupField = this.getGroupField(),
  72433. headerCt = this.view.headerCt;
  72434. return groupField ? headerCt.down('[dataIndex=' + groupField + ']') : null;
  72435. },
  72436. getGroupField: function(){
  72437. var group = this.view.store.groupers.first();
  72438. if (group) {
  72439. return group.property;
  72440. }
  72441. return '';
  72442. },
  72443. onRowFocus: function(rowIdx) {
  72444. var node = this.view.getNode(rowIdx),
  72445. groupBd = Ext.fly(node).up('.' + this.collapsedCls);
  72446. if (groupBd) {
  72447. this.expand(groupBd);
  72448. }
  72449. },
  72450. isExpanded: function(groupName) {
  72451. return (this.collapsedState[groupName] === false);
  72452. },
  72453. expand: function(groupName, focus, preventSizeCalculation) {
  72454. var me = this,
  72455. view = me.view,
  72456. groupHeader,
  72457. groupBody,
  72458. lockingPartner = me.lockingPartner;
  72459. if (Ext.isString(groupName)) {
  72460. groupBody = Ext.fly(me.getGroupBodyId(groupName), '_grouping');
  72461. }
  72462. else {
  72463. groupBody = Ext.fly(groupName, '_grouping')
  72464. groupName = me.getGroupName(groupBody);
  72465. }
  72466. groupHeader = Ext.get(me.getGroupHeaderId(groupName));
  72467. if (me.collapsedState[groupName]) {
  72468. groupBody.removeCls(me.collapsedCls);
  72469. groupBody.prev().removeCls(me.hdCollapsedCls);
  72470. if (preventSizeCalculation !== true) {
  72471. view.refreshSize();
  72472. }
  72473. view.fireEvent('groupexpand', view, groupHeader, groupName);
  72474. me.collapsedState[groupName] = false;
  72475. if (lockingPartner) {
  72476. lockingPartner.expand(groupName, focus, preventSizeCalculation);
  72477. }
  72478. if (focus) {
  72479. groupBody.scrollIntoView(view.el, null, true);
  72480. }
  72481. }
  72482. },
  72483. expandAll: function(){
  72484. var me = this,
  72485. view = me.view,
  72486. els = view.el.select(me.eventSelector).elements,
  72487. e,
  72488. eLen = els.length;
  72489. for (e = 0; e < eLen; e++) {
  72490. me.expand(Ext.fly(els[e]).next(), false, true);
  72491. }
  72492. view.refreshSize();
  72493. },
  72494. collapse: function(groupName, focus, preventSizeCalculation) {
  72495. var me = this,
  72496. view = me.view,
  72497. groupHeader,
  72498. groupBody,
  72499. lockingPartner = me.lockingPartner;
  72500. if (Ext.isString(groupName)) {
  72501. groupBody = Ext.fly(me.getGroupBodyId(groupName), '_grouping');
  72502. }
  72503. else {
  72504. groupBody = Ext.fly(groupName, '_grouping')
  72505. groupName = me.getGroupName(groupBody);
  72506. }
  72507. groupHeader = Ext.get(me.getGroupHeaderId(groupName));
  72508. if (!me.collapsedState[groupName]) {
  72509. groupBody.addCls(me.collapsedCls);
  72510. groupBody.prev().addCls(me.hdCollapsedCls);
  72511. if (preventSizeCalculation !== true) {
  72512. view.refreshSize();
  72513. }
  72514. view.fireEvent('groupcollapse', view, groupHeader, groupName);
  72515. me.collapsedState[groupName] = true;
  72516. if (lockingPartner) {
  72517. lockingPartner.collapse(groupName, focus, preventSizeCalculation);
  72518. }
  72519. if (focus) {
  72520. groupHeader.scrollIntoView(view.el, null, true);
  72521. }
  72522. }
  72523. },
  72524. collapseAll: function() {
  72525. var me = this,
  72526. view = me.view,
  72527. els = view.el.select(me.eventSelector).elements,
  72528. e,
  72529. eLen = els.length;
  72530. for (e = 0; e < eLen; e++) {
  72531. me.collapse(Ext.fly(els[e]).next(), false, true);
  72532. }
  72533. view.refreshSize();
  72534. },
  72535. onGroupChange: function(){
  72536. var me = this,
  72537. field = me.getGroupField(),
  72538. menuItem,
  72539. visibleGridColumns,
  72540. groupingByLastVisibleColumn;
  72541. if (me.hideGroupedHeader) {
  72542. if (me.lastGroupField) {
  72543. menuItem = me.getMenuItem(me.lastGroupField);
  72544. if (menuItem) {
  72545. menuItem.setChecked(true);
  72546. }
  72547. }
  72548. if (field) {
  72549. visibleGridColumns = me.view.headerCt.getVisibleGridColumns();
  72550. groupingByLastVisibleColumn = ((visibleGridColumns.length === 1) && (visibleGridColumns[0].dataIndex == field));
  72551. menuItem = me.getMenuItem(field);
  72552. if (menuItem && !groupingByLastVisibleColumn) {
  72553. menuItem.setChecked(false);
  72554. }
  72555. }
  72556. }
  72557. me.refreshIf();
  72558. me.lastGroupField = field;
  72559. },
  72560. getMenuItem: function(dataIndex){
  72561. var view = this.view,
  72562. header = view.headerCt.down('gridcolumn[dataIndex=' + dataIndex + ']'),
  72563. menu = view.headerCt.getMenu();
  72564. return header ? menu.down('menuitem[headerId='+ header.id +']') : null;
  72565. },
  72566. onGroupClick: function(view, rowElement, groupName, e) {
  72567. var me = this;
  72568. if (me.collapsible) {
  72569. if (me.collapsedState[groupName]) {
  72570. me.expand(groupName);
  72571. } else {
  72572. me.collapse(groupName);
  72573. }
  72574. }
  72575. },
  72576. getMetaRowTplFragments: function() {
  72577. return {
  72578. isRow: this.isRow,
  72579. closeRow: this.closeRow
  72580. };
  72581. },
  72582. isRow: function() {
  72583. return '<tpl if="typeof rows === \'undefined\'">';
  72584. },
  72585. closeRow: function() {
  72586. return '</tpl>';
  72587. },
  72588. mutateMetaRowTpl: function(metaRowTpl) {
  72589. metaRowTpl.unshift('{[this.isRow()]}');
  72590. metaRowTpl.push('{[this.closeRow()]}');
  72591. },
  72592. getAdditionalData: function(data, idx, record, orig) {
  72593. var view = this.view,
  72594. hCt = view.headerCt,
  72595. col = hCt.items.getAt(0),
  72596. o = {},
  72597. tdAttrKey;
  72598. if (col) {
  72599. tdAttrKey = col.id + '-tdAttr';
  72600. o[tdAttrKey] = this.indentByDepth(data) + " " + (orig[tdAttrKey] ? orig[tdAttrKey] : '');
  72601. o.collapsed = 'true';
  72602. o.data = record.getData();
  72603. }
  72604. return o;
  72605. },
  72606. getGroupRows: function(group, records, preppedRecords, fullWidth) {
  72607. var me = this,
  72608. children = group.children,
  72609. rows = group.rows = [],
  72610. view = me.view,
  72611. header = me.getGroupedHeader(),
  72612. groupField = me.getGroupField(),
  72613. index = -1,
  72614. r,
  72615. rLen = records.length,
  72616. record;
  72617. if (view.store.buffered) {
  72618. me.collapsible = false;
  72619. }
  72620. group.viewId = view.id;
  72621. for (r = 0; r < rLen; r++) {
  72622. record = records[r];
  72623. if (record.get(groupField) == group.name) {
  72624. index = r;
  72625. }
  72626. if (Ext.Array.indexOf(children, record) != -1) {
  72627. rows.push(Ext.apply(preppedRecords[r], {
  72628. depth : 1
  72629. }));
  72630. }
  72631. }
  72632. group.groupField = groupField,
  72633. group.groupHeaderId = me.getGroupHeaderId(group.name);
  72634. group.groupBodyId = me.getGroupBodyId(group.name);
  72635. group.fullWidth = fullWidth;
  72636. group.columnName = header ? header.text : groupField;
  72637. group.groupValue = group.name;
  72638. if (header && index > -1) {
  72639. group.name = group.renderedValue = preppedRecords[index][header.id];
  72640. }
  72641. if (me.collapsedState[group.name]) {
  72642. group.collapsedCls = me.collapsedCls;
  72643. group.hdCollapsedCls = me.hdCollapsedCls;
  72644. } else {
  72645. group.collapsedCls = group.hdCollapsedCls = '';
  72646. }
  72647. if (me.collapsible) {
  72648. group.collapsibleClass = me.hdCollapsibleCls;
  72649. } else {
  72650. group.collapsibleClass = '';
  72651. }
  72652. return group;
  72653. },
  72654. getGroupHeaderId: function(groupName) {
  72655. return this.view.id + '-hd-' + groupName;
  72656. },
  72657. getGroupBodyId: function(groupName) {
  72658. return this.view.id + '-bd-' + groupName;
  72659. },
  72660. getGroupName: function(element) {
  72661. var me = this,
  72662. targetEl;
  72663. targetEl = Ext.fly(element).findParent(me.eventSelector);
  72664. if (targetEl) {
  72665. return targetEl.id.split(this.view.id + '-hd-')[1];
  72666. }
  72667. targetEl = Ext.fly(element).findParent(me.bodySelector);
  72668. if (targetEl) {
  72669. return targetEl.id.split(this.view.id + '-bd-')[1];
  72670. }
  72671. },
  72672. collectData: function(records, preppedRecords, startIndex, fullWidth, o) {
  72673. var me = this,
  72674. store = me.view.store,
  72675. collapsedState = me.collapsedState,
  72676. collapseGroups,
  72677. g,
  72678. groups, gLen, group;
  72679. if (me.startCollapsed) {
  72680. me.startCollapsed = false;
  72681. collapseGroups = true;
  72682. }
  72683. if (!me.disabled && store.isGrouped()) {
  72684. o.rows = groups = store.getGroups();
  72685. gLen = groups.length;
  72686. for (g = 0; g < gLen; g++) {
  72687. group = groups[g];
  72688. if (collapseGroups) {
  72689. collapsedState[group.name] = true;
  72690. }
  72691. me.getGroupRows(group, records, preppedRecords, fullWidth);
  72692. }
  72693. }
  72694. return o;
  72695. },
  72696. getFireEventArgs: function(type, view, targetEl, e) {
  72697. return [type, view, targetEl, this.getGroupName(targetEl), e];
  72698. }
  72699. });
  72700. Ext.define('Ext.grid.feature.GroupingSummary', {
  72701. extend: 'Ext.grid.feature.Grouping',
  72702. alias: 'feature.groupingsummary',
  72703. mixins: {
  72704. summary: 'Ext.grid.feature.AbstractSummary'
  72705. },
  72706. init: function() {
  72707. this.mixins.summary.init.call(this);
  72708. },
  72709. getFeatureTpl: function() {
  72710. var tpl = this.callParent(arguments);
  72711. if (this.showSummaryRow) {
  72712. tpl = tpl.replace('</tpl>', '');
  72713. tpl += '{[this.printSummaryRow(xindex)]}</tpl>';
  72714. }
  72715. return tpl;
  72716. },
  72717. getFragmentTpl: function() {
  72718. var me = this,
  72719. fragments = me.callParent();
  72720. Ext.apply(fragments, me.getSummaryFragments());
  72721. if (me.showSummaryRow) {
  72722. me.summaryGroups = me.view.store.getGroups();
  72723. me.summaryData = me.generateSummaryData();
  72724. }
  72725. return fragments;
  72726. },
  72727. getPrintData: function(index){
  72728. var me = this,
  72729. columns = me.view.headerCt.getColumnsForTpl(),
  72730. i = 0,
  72731. length = columns.length,
  72732. data = [],
  72733. name = me.summaryGroups[index - 1].name,
  72734. active = me.summaryData[name],
  72735. column;
  72736. for (; i < length; ++i) {
  72737. column = columns[i];
  72738. column.gridSummaryValue = this.getColumnValue(column, active);
  72739. data.push(column);
  72740. }
  72741. return data;
  72742. },
  72743. generateSummaryData: function(){
  72744. var me = this,
  72745. data = {},
  72746. remoteData = {},
  72747. store = me.view.store,
  72748. groupField = this.getGroupField(),
  72749. reader = store.proxy.reader,
  72750. groups = me.summaryGroups,
  72751. columns = me.view.headerCt.getColumnsForTpl(),
  72752. remote,
  72753. i,
  72754. length,
  72755. fieldData,
  72756. root,
  72757. key,
  72758. comp,
  72759. summaryRows,
  72760. s,
  72761. sLen,
  72762. convertedSummaryRow;
  72763. for (i = 0, length = groups.length; i < length; ++i) {
  72764. data[groups[i].name] = {};
  72765. }
  72766. if (me.remoteRoot && reader.rawData) {
  72767. root = reader.root;
  72768. reader.root = me.remoteRoot;
  72769. reader.buildExtractors(true);
  72770. summaryRows = reader.getRoot(reader.rawData);
  72771. sLen = summaryRows.length;
  72772. if (!reader.convertRecordData) {
  72773. reader.buildExtractors();
  72774. }
  72775. for (s = 0; s < sLen; s++) {
  72776. convertedSummaryRow = {};
  72777. reader.convertRecordData(convertedSummaryRow, summaryRows[s]);
  72778. remoteData[convertedSummaryRow[groupField]] = convertedSummaryRow;
  72779. }
  72780. reader.root = root;
  72781. reader.buildExtractors(true);
  72782. }
  72783. for (i = 0, length = columns.length; i < length; ++i) {
  72784. comp = Ext.getCmp(columns[i].id);
  72785. fieldData = me.getSummary(store, comp.summaryType, comp.dataIndex, true);
  72786. for (key in fieldData) {
  72787. if (fieldData.hasOwnProperty(key)) {
  72788. data[key][comp.id] = fieldData[key];
  72789. }
  72790. }
  72791. for (key in remoteData) {
  72792. if (remoteData.hasOwnProperty(key)) {
  72793. remote = remoteData[key][comp.dataIndex];
  72794. if (remote !== undefined && data[key] !== undefined) {
  72795. data[key][comp.id] = remote;
  72796. }
  72797. }
  72798. }
  72799. }
  72800. return data;
  72801. }
  72802. });
  72803. Ext.define('Ext.grid.feature.RowBody', {
  72804. extend: 'Ext.grid.feature.Feature',
  72805. alias: 'feature.rowbody',
  72806. rowBodyHiddenCls: Ext.baseCSSPrefix + 'grid-row-body-hidden',
  72807. rowBodyTrCls: Ext.baseCSSPrefix + 'grid-rowbody-tr',
  72808. rowBodyTdCls: Ext.baseCSSPrefix + 'grid-cell-rowbody',
  72809. rowBodyDivCls: Ext.baseCSSPrefix + 'grid-rowbody',
  72810. eventPrefix: 'rowbody',
  72811. eventSelector: '.' + Ext.baseCSSPrefix + 'grid-rowbody-tr',
  72812. getRowBody: function(values) {
  72813. return [
  72814. '<tr class="' + this.rowBodyTrCls + ' {rowBodyCls}">',
  72815. '<td class="' + this.rowBodyTdCls + '" colspan="{rowBodyColspan}">',
  72816. '<div class="' + this.rowBodyDivCls + '">{rowBody}</div>',
  72817. '</td>',
  72818. '</tr>'
  72819. ].join('');
  72820. },
  72821. getMetaRowTplFragments: function() {
  72822. return {
  72823. getRowBody: this.getRowBody,
  72824. rowBodyTrCls: this.rowBodyTrCls,
  72825. rowBodyTdCls: this.rowBodyTdCls,
  72826. rowBodyDivCls: this.rowBodyDivCls
  72827. };
  72828. },
  72829. mutateMetaRowTpl: function(metaRowTpl) {
  72830. metaRowTpl.push('{[this.getRowBody(values)]}');
  72831. },
  72832. getAdditionalData: function(data, idx, record, orig) {
  72833. var headerCt = this.view.headerCt,
  72834. colspan = headerCt.getColumnCount();
  72835. return {
  72836. rowBody: "",
  72837. rowBodyCls: this.rowBodyCls,
  72838. rowBodyColspan: colspan
  72839. };
  72840. }
  72841. });
  72842. Ext.define('Ext.grid.feature.RowWrap', {
  72843. extend: 'Ext.grid.feature.Feature',
  72844. alias: 'feature.rowwrap',
  72845. hasFeatureEvent: false,
  72846. init: function() {
  72847. if (!this.disabled) {
  72848. this.enable();
  72849. }
  72850. },
  72851. getRowSelector: function(){
  72852. return 'tr:has(> ' + this.view.cellSelector + ')';
  72853. },
  72854. enable: function(){
  72855. var me = this,
  72856. view = me.view;
  72857. me.callParent();
  72858. me.savedRowSelector = view.rowSelector;
  72859. view.rowSelector = me.getRowSelector();
  72860. view.getComponentLayout().getColumnSelector = me.getColumnSelector;
  72861. },
  72862. disable: function(){
  72863. var me = this,
  72864. view = me.view,
  72865. saved = me.savedRowSelector;
  72866. me.callParent();
  72867. if (saved) {
  72868. view.rowSelector = saved;
  72869. }
  72870. delete me.savedRowSelector;
  72871. },
  72872. mutateMetaRowTpl: function(metaRowTpl) {
  72873. var prefix = Ext.baseCSSPrefix;
  72874. metaRowTpl[0] = metaRowTpl[0].replace(prefix + 'grid-row', '');
  72875. metaRowTpl[0] = metaRowTpl[0].replace("{[this.embedRowCls()]}", "");
  72876. metaRowTpl.unshift('<table class="' + prefix + 'grid-table ' + prefix + 'grid-table-resizer" style="width: {[this.embedFullWidth()]}px;">');
  72877. metaRowTpl.unshift('<tr class="' + prefix + 'grid-row {[this.embedRowCls()]}"><td colspan="{[this.embedColSpan()]}"><div class="' + prefix + 'grid-rowwrap-div">');
  72878. metaRowTpl.push('</table>');
  72879. metaRowTpl.push('</div></td></tr>');
  72880. },
  72881. embedColSpan: function() {
  72882. return '{colspan}';
  72883. },
  72884. embedFullWidth: function() {
  72885. return '{fullWidth}';
  72886. },
  72887. getAdditionalData: function(data, idx, record, orig) {
  72888. var headerCt = this.view.headerCt,
  72889. colspan = headerCt.getColumnCount(),
  72890. fullWidth = headerCt.getFullWidth(),
  72891. items = headerCt.query('gridcolumn'),
  72892. itemsLn = items.length,
  72893. i = 0,
  72894. o = {
  72895. colspan: colspan,
  72896. fullWidth: fullWidth
  72897. },
  72898. id,
  72899. tdClsKey,
  72900. colResizerCls;
  72901. for (; i < itemsLn; i++) {
  72902. id = items[i].id;
  72903. tdClsKey = id + '-tdCls';
  72904. colResizerCls = Ext.baseCSSPrefix + 'grid-col-resizer-'+id;
  72905. o[tdClsKey] = colResizerCls + " " + (orig[tdClsKey] ? orig[tdClsKey] : '');
  72906. o[id+'-tdAttr'] = " style=\"width: " + (items[i].hidden ? 0 : items[i].getDesiredWidth()) + "px;\" ";
  72907. if (orig[id+'-tdAttr']) {
  72908. o[id+'-tdAttr'] += orig[id+'-tdAttr'];
  72909. }
  72910. }
  72911. return o;
  72912. },
  72913. getMetaRowTplFragments: function() {
  72914. return {
  72915. embedFullWidth: this.embedFullWidth,
  72916. embedColSpan: this.embedColSpan
  72917. };
  72918. },
  72919. getColumnSelector: function(header) {
  72920. var s = Ext.baseCSSPrefix + 'grid-col-resizer-' + header.id;
  72921. return 'th.' + s + ',td.' + s;
  72922. }
  72923. });
  72924. Ext.define('Ext.grid.feature.Summary', {
  72925. extend: 'Ext.grid.feature.AbstractSummary',
  72926. alias: 'feature.summary',
  72927. getFragmentTpl: function() {
  72928. this.summaryData = this.generateSummaryData();
  72929. return this.getSummaryFragments();
  72930. },
  72931. getTableFragments: function(){
  72932. if (this.showSummaryRow) {
  72933. return {
  72934. closeRows: this.closeRows
  72935. };
  72936. }
  72937. },
  72938. closeRows: function() {
  72939. return '</tpl>{[this.printSummaryRow()]}';
  72940. },
  72941. getPrintData: function(index){
  72942. var me = this,
  72943. columns = me.view.headerCt.getColumnsForTpl(),
  72944. i = 0,
  72945. length = columns.length,
  72946. data = [],
  72947. active = me.summaryData,
  72948. column;
  72949. for (; i < length; ++i) {
  72950. column = columns[i];
  72951. column.gridSummaryValue = this.getColumnValue(column, active);
  72952. data.push(column);
  72953. }
  72954. return data;
  72955. },
  72956. generateSummaryData: function(){
  72957. var me = this,
  72958. data = {},
  72959. store = me.view.store,
  72960. columns = me.view.headerCt.getColumnsForTpl(),
  72961. i = 0,
  72962. length = columns.length,
  72963. fieldData,
  72964. key,
  72965. comp;
  72966. for (i = 0, length = columns.length; i < length; ++i) {
  72967. comp = Ext.getCmp(columns[i].id);
  72968. data[comp.id] = me.getSummary(store, comp.summaryType, comp.dataIndex, false);
  72969. }
  72970. return data;
  72971. }
  72972. });
  72973. Ext.define('Ext.grid.plugin.Editing', {
  72974. alias: 'editing.editing',
  72975. extend: 'Ext.AbstractPlugin',
  72976. requires: [
  72977. 'Ext.grid.column.Column',
  72978. 'Ext.util.KeyNav'
  72979. ],
  72980. mixins: {
  72981. observable: 'Ext.util.Observable'
  72982. },
  72983. clicksToEdit: 2,
  72984. triggerEvent: undefined,
  72985. defaultFieldXType: 'textfield',
  72986. editStyle: '',
  72987. constructor: function(config) {
  72988. var me = this;
  72989. me.addEvents(
  72990. 'beforeedit',
  72991. 'edit',
  72992. 'validateedit',
  72993. 'canceledit'
  72994. );
  72995. me.callParent(arguments);
  72996. me.mixins.observable.constructor.call(me);
  72997. me.on("edit", function(editor, e) {
  72998. me.fireEvent("afteredit", editor, e);
  72999. });
  73000. },
  73001. init: function(grid) {
  73002. var me = this;
  73003. me.grid = grid;
  73004. me.view = grid.view;
  73005. me.initEvents();
  73006. me.mon(grid, 'reconfigure', me.onReconfigure, me);
  73007. me.onReconfigure();
  73008. grid.relayEvents(me, [
  73009. 'beforeedit',
  73010. 'edit',
  73011. 'validateedit',
  73012. 'canceledit'
  73013. ]);
  73014. grid.isEditable = true;
  73015. grid.editingPlugin = grid.view.editingPlugin = me;
  73016. },
  73017. onReconfigure: function() {
  73018. this.initFieldAccessors(this.view.getGridColumns());
  73019. },
  73020. destroy: function() {
  73021. var me = this,
  73022. grid = me.grid;
  73023. Ext.destroy(me.keyNav);
  73024. me.removeFieldAccessors(grid.getView().getGridColumns());
  73025. me.clearListeners();
  73026. delete me.grid.editingPlugin;
  73027. delete me.grid.view.editingPlugin;
  73028. delete me.grid;
  73029. delete me.view;
  73030. delete me.editor;
  73031. delete me.keyNav;
  73032. },
  73033. getEditStyle: function() {
  73034. return this.editStyle;
  73035. },
  73036. initFieldAccessors: function(columns) {
  73037. columns = [].concat(columns);
  73038. var me = this,
  73039. c,
  73040. cLen = columns.length,
  73041. column;
  73042. for (c = 0; c < cLen; c++) {
  73043. column = columns[c];
  73044. Ext.applyIf(column, {
  73045. getEditor: function(record, defaultField) {
  73046. return me.getColumnField(this, defaultField);
  73047. },
  73048. setEditor: function(field) {
  73049. me.setColumnField(this, field);
  73050. }
  73051. });
  73052. }
  73053. },
  73054. removeFieldAccessors: function(columns) {
  73055. columns = [].concat(columns);
  73056. var c,
  73057. cLen = columns.length,
  73058. column;
  73059. for (c = 0; c < cLen; c++) {
  73060. column = columns[c];
  73061. delete column.getEditor;
  73062. delete column.setEditor;
  73063. }
  73064. },
  73065. getColumnField: function(columnHeader, defaultField) {
  73066. var field = columnHeader.field;
  73067. if (!field && columnHeader.editor) {
  73068. field = columnHeader.editor;
  73069. delete columnHeader.editor;
  73070. }
  73071. if (!field && defaultField) {
  73072. field = defaultField;
  73073. }
  73074. if (field) {
  73075. if (Ext.isString(field)) {
  73076. field = { xtype: field };
  73077. }
  73078. if (!field.isFormField) {
  73079. field = Ext.ComponentManager.create(field, this.defaultFieldXType);
  73080. }
  73081. columnHeader.field = field;
  73082. Ext.apply(field, {
  73083. name: columnHeader.dataIndex
  73084. });
  73085. return field;
  73086. }
  73087. },
  73088. setColumnField: function(column, field) {
  73089. if (Ext.isObject(field) && !field.isFormField) {
  73090. field = Ext.ComponentManager.create(field, this.defaultFieldXType);
  73091. }
  73092. column.field = field;
  73093. },
  73094. initEvents: function() {
  73095. var me = this;
  73096. me.initEditTriggers();
  73097. me.initCancelTriggers();
  73098. },
  73099. initCancelTriggers: Ext.emptyFn,
  73100. initEditTriggers: function() {
  73101. var me = this,
  73102. view = me.view;
  73103. if (me.triggerEvent == 'cellfocus') {
  73104. me.mon(view, 'cellfocus', me.onCellFocus, me);
  73105. } else if (me.triggerEvent == 'rowfocus') {
  73106. me.mon(view, 'rowfocus', me.onRowFocus, me);
  73107. } else {
  73108. if (view.selModel.isCellModel) {
  73109. view.onCellFocus = Ext.Function.bind(me.beforeViewCellFocus, me);
  73110. }
  73111. me.mon(view, me.triggerEvent || ('cell' + (me.clicksToEdit === 1 ? 'click' : 'dblclick')), me.onCellClick, me);
  73112. }
  73113. me.initAddRemoveHeaderEvents()
  73114. view.on('render', me.initKeyNavHeaderEvents, me, {single: true});
  73115. },
  73116. beforeViewCellFocus: function(position) {
  73117. if (this.view.selModel.keyNavigation || !this.editing || !this.isCellEditable || !this.isCellEditable(position.row, position.columnHeader)) {
  73118. this.view.focusCell.apply(this.view, arguments);
  73119. }
  73120. },
  73121. onRowFocus: function(record, row, rowIdx) {
  73122. this.startEdit(row, 0);
  73123. },
  73124. onCellFocus: function(record, cell, position) {
  73125. this.startEdit(position.row, position.column);
  73126. },
  73127. onCellClick: function(view, cell, colIdx, record, row, rowIdx, e) {
  73128. if(!view.expanderSelector || !e.getTarget(view.expanderSelector)) {
  73129. this.startEdit(record, view.getHeaderAtIndex(colIdx));
  73130. }
  73131. },
  73132. initAddRemoveHeaderEvents: function(){
  73133. var me = this;
  73134. me.mon(me.grid.headerCt, {
  73135. scope: me,
  73136. add: me.onColumnAdd,
  73137. remove: me.onColumnRemove
  73138. });
  73139. },
  73140. initKeyNavHeaderEvents: function() {
  73141. var me = this;
  73142. me.keyNav = Ext.create('Ext.util.KeyNav', me.view.el, {
  73143. enter: me.onEnterKey,
  73144. esc: me.onEscKey,
  73145. scope: me
  73146. });
  73147. },
  73148. onColumnAdd: function(ct, column) {
  73149. if (column.isHeader) {
  73150. this.initFieldAccessors(column);
  73151. }
  73152. },
  73153. onColumnRemove: function(ct, column) {
  73154. if (column.isHeader) {
  73155. this.removeFieldAccessors(column);
  73156. }
  73157. },
  73158. onEnterKey: function(e) {
  73159. var me = this,
  73160. grid = me.grid,
  73161. selModel = grid.getSelectionModel(),
  73162. record,
  73163. pos,
  73164. columnHeader = grid.headerCt.getHeaderAtIndex(0);
  73165. if (selModel.getCurrentPosition) {
  73166. pos = selModel.getCurrentPosition();
  73167. if (pos) {
  73168. record = grid.store.getAt(pos.row);
  73169. columnHeader = grid.headerCt.getHeaderAtIndex(pos.column);
  73170. }
  73171. }
  73172. else {
  73173. record = selModel.getLastSelected();
  73174. }
  73175. if (record && columnHeader) {
  73176. me.startEdit(record, columnHeader);
  73177. }
  73178. },
  73179. onEscKey: function(e) {
  73180. this.cancelEdit();
  73181. },
  73182. beforeEdit: Ext.emptyFn,
  73183. startEdit: function(record, columnHeader) {
  73184. var me = this,
  73185. context = me.getEditingContext(record, columnHeader);
  73186. if (context == null || me.beforeEdit(context) === false || me.fireEvent('beforeedit', me, context) === false || context.cancel || !me.grid.view.isVisible(true)) {
  73187. return false;
  73188. }
  73189. me.context = context;
  73190. me.editing = true;
  73191. },
  73192. getEditingContext: function(record, columnHeader) {
  73193. var me = this,
  73194. grid = me.grid,
  73195. view = grid.getView(),
  73196. node = view.getNode(record),
  73197. rowIdx, colIdx;
  73198. if (!node) {
  73199. return;
  73200. }
  73201. columnHeader = grid.headerCt.getVisibleHeaderClosestToIndex(Ext.isNumber(columnHeader) ? columnHeader : columnHeader.getIndex());
  73202. if (!columnHeader) {
  73203. return;
  73204. }
  73205. colIdx = columnHeader.getIndex();
  73206. if (Ext.isNumber(record)) {
  73207. rowIdx = record;
  73208. record = view.getRecord(node);
  73209. } else {
  73210. rowIdx = view.indexOf(node);
  73211. }
  73212. return {
  73213. grid : grid,
  73214. record : record,
  73215. field : columnHeader.dataIndex,
  73216. value : record.get(columnHeader.dataIndex),
  73217. row : view.getNode(rowIdx),
  73218. column : columnHeader,
  73219. rowIdx : rowIdx,
  73220. colIdx : colIdx
  73221. };
  73222. },
  73223. cancelEdit: function() {
  73224. var me = this;
  73225. me.editing = false;
  73226. me.fireEvent('canceledit', me, me.context);
  73227. },
  73228. completeEdit: function() {
  73229. var me = this;
  73230. if (me.editing && me.validateEdit()) {
  73231. me.fireEvent('edit', me, me.context);
  73232. }
  73233. delete me.context;
  73234. me.editing = false;
  73235. },
  73236. validateEdit: function() {
  73237. var me = this,
  73238. context = me.context;
  73239. return me.fireEvent('validateedit', me, context) !== false && !context.cancel;
  73240. }
  73241. });
  73242. Ext.define('Ext.grid.plugin.CellEditing', {
  73243. alias: 'plugin.cellediting',
  73244. extend: 'Ext.grid.plugin.Editing',
  73245. requires: ['Ext.grid.CellEditor', 'Ext.util.DelayedTask'],
  73246. constructor: function() {
  73247. this.callParent(arguments);
  73248. this.editors = new Ext.util.MixedCollection(false, function(editor) {
  73249. return editor.editorId;
  73250. });
  73251. this.editTask = new Ext.util.DelayedTask();
  73252. },
  73253. onReconfigure: function(){
  73254. this.editors.clear();
  73255. this.callParent();
  73256. },
  73257. destroy: function() {
  73258. var me = this;
  73259. me.editTask.cancel();
  73260. me.editors.each(Ext.destroy, Ext);
  73261. me.editors.clear();
  73262. me.callParent(arguments);
  73263. },
  73264. onBodyScroll: function() {
  73265. var me = this,
  73266. ed = me.getActiveEditor(),
  73267. scroll = me.view.el.getScroll();
  73268. if (ed && ed.editing) {
  73269. if (scroll.top !== me.scroll.top) {
  73270. if (ed.field) {
  73271. if (ed.field.triggerBlur) {
  73272. ed.field.triggerBlur();
  73273. } else {
  73274. ed.field.blur();
  73275. }
  73276. }
  73277. }
  73278. else {
  73279. ed.realign();
  73280. }
  73281. }
  73282. me.scroll = scroll;
  73283. },
  73284. initCancelTriggers: function() {
  73285. var me = this,
  73286. grid = me.grid,
  73287. view = grid.view;
  73288. view.addElListener('mousewheel', me.cancelEdit, me);
  73289. me.mon(view, 'bodyscroll', me.onBodyScroll, me);
  73290. me.mon(grid, {
  73291. columnresize: me.cancelEdit,
  73292. columnmove: me.cancelEdit,
  73293. scope: me
  73294. });
  73295. },
  73296. isCellEditable: function(record, columnHeader) {
  73297. var me = this,
  73298. context = me.getEditingContext(record, columnHeader);
  73299. if (me.grid.view.isVisible(true) && context) {
  73300. columnHeader = context.column;
  73301. record = context.record;
  73302. if (columnHeader && me.getEditor(record, columnHeader)) {
  73303. return true;
  73304. }
  73305. }
  73306. },
  73307. startEdit: function(record, columnHeader) {
  73308. var me = this,
  73309. context = me.getEditingContext(record, columnHeader),
  73310. value, ed;
  73311. me.completeEdit();
  73312. if (!context || !me.grid.view.isVisible(true)) {
  73313. return false;
  73314. }
  73315. record = context.record;
  73316. columnHeader = context.column;
  73317. if (columnHeader && !columnHeader.getEditor(record)) {
  73318. return false;
  73319. }
  73320. value = record.get(columnHeader.dataIndex);
  73321. context.originalValue = context.value = value;
  73322. if (me.beforeEdit(context) === false || me.fireEvent('beforeedit', me, context) === false || context.cancel) {
  73323. return false;
  73324. }
  73325. ed = me.getEditor(record, columnHeader);
  73326. me.grid.view.cancelFocus();
  73327. me.view.focusCell({
  73328. row: context.rowIdx,
  73329. column: context.colIdx
  73330. });
  73331. if (ed) {
  73332. me.editTask.delay(15, me.showEditor, me, [ed, context, value]);
  73333. return true;
  73334. }
  73335. return false;
  73336. },
  73337. showEditor: function(ed, context, value) {
  73338. var me = this,
  73339. record = context.record,
  73340. columnHeader = context.column,
  73341. sm = me.grid.getSelectionModel(),
  73342. selection = sm.getCurrentPosition();
  73343. me.context = context;
  73344. me.setActiveEditor(ed);
  73345. me.setActiveRecord(record);
  73346. me.setActiveColumn(columnHeader);
  73347. if (sm.selectByPosition && (!selection || selection.column !== context.colIdx || selection.row !== context.rowIdx)) {
  73348. sm.selectByPosition({
  73349. row: context.rowIdx,
  73350. column: context.colIdx
  73351. });
  73352. }
  73353. ed.startEdit(me.getCell(record, columnHeader), value);
  73354. me.editing = true;
  73355. me.scroll = me.view.el.getScroll();
  73356. },
  73357. completeEdit: function() {
  73358. var activeEd = this.getActiveEditor();
  73359. if (activeEd) {
  73360. activeEd.completeEdit();
  73361. this.editing = false;
  73362. }
  73363. },
  73364. setActiveEditor: function(ed) {
  73365. this.activeEditor = ed;
  73366. },
  73367. getActiveEditor: function() {
  73368. return this.activeEditor;
  73369. },
  73370. setActiveColumn: function(column) {
  73371. this.activeColumn = column;
  73372. },
  73373. getActiveColumn: function() {
  73374. return this.activeColumn;
  73375. },
  73376. setActiveRecord: function(record) {
  73377. this.activeRecord = record;
  73378. },
  73379. getActiveRecord: function() {
  73380. return this.activeRecord;
  73381. },
  73382. getEditor: function(record, column) {
  73383. var me = this,
  73384. editors = me.editors,
  73385. editorId = column.getItemId(),
  73386. editor = editors.getByKey(editorId);
  73387. if (editor) {
  73388. return editor;
  73389. } else {
  73390. editor = column.getEditor(record);
  73391. if (!editor) {
  73392. return false;
  73393. }
  73394. if (!(editor instanceof Ext.grid.CellEditor)) {
  73395. editor = new Ext.grid.CellEditor({
  73396. editorId: editorId,
  73397. field: editor,
  73398. ownerCt: me.grid
  73399. });
  73400. } else {
  73401. editor.ownerCt = me.grid;
  73402. }
  73403. editor.editingPlugin = me;
  73404. editor.isForTree = me.grid.isTree;
  73405. editor.on({
  73406. scope: me,
  73407. specialkey: me.onSpecialKey,
  73408. complete: me.onEditComplete,
  73409. canceledit: me.cancelEdit
  73410. });
  73411. editors.add(editor);
  73412. return editor;
  73413. }
  73414. },
  73415. setColumnField: function(column, field) {
  73416. var ed = this.editors.getByKey(column.getItemId());
  73417. Ext.destroy(ed, column.field);
  73418. this.editors.removeAtKey(column.getItemId());
  73419. this.callParent(arguments);
  73420. },
  73421. getCell: function(record, column) {
  73422. return this.grid.getView().getCell(record, column);
  73423. },
  73424. onSpecialKey: function(ed, field, e) {
  73425. var me = this,
  73426. grid = me.grid,
  73427. sm;
  73428. if (e.getKey() === e.TAB) {
  73429. e.stopEvent();
  73430. if (ed) {
  73431. ed.onEditorTab(e);
  73432. }
  73433. sm = grid.getSelectionModel();
  73434. if (sm.onEditorTab) {
  73435. sm.onEditorTab(me, e);
  73436. }
  73437. }
  73438. },
  73439. onEditComplete : function(ed, value, startValue) {
  73440. var me = this,
  73441. grid = me.grid,
  73442. activeColumn = me.getActiveColumn(),
  73443. sm = grid.getSelectionModel(),
  73444. record;
  73445. if (activeColumn) {
  73446. record = me.context.record;
  73447. me.setActiveEditor(null);
  73448. me.setActiveColumn(null);
  73449. me.setActiveRecord(null);
  73450. if (!me.validateEdit()) {
  73451. return;
  73452. }
  73453. if (!record.isEqual(value, startValue)) {
  73454. record.set(activeColumn.dataIndex, value);
  73455. }
  73456. if (sm.setCurrentPosition) {
  73457. sm.setCurrentPosition(sm.getCurrentPosition());
  73458. }
  73459. grid.getView().getEl(activeColumn).focus();
  73460. me.context.value = value;
  73461. me.fireEvent('edit', me, me.context);
  73462. }
  73463. },
  73464. cancelEdit: function() {
  73465. var me = this,
  73466. activeEd = me.getActiveEditor(),
  73467. viewEl = me.grid.getView().getEl(me.getActiveColumn());
  73468. me.setActiveEditor(null);
  73469. me.setActiveColumn(null);
  73470. me.setActiveRecord(null);
  73471. if (activeEd) {
  73472. activeEd.cancelEdit();
  73473. viewEl.focus();
  73474. me.callParent(arguments);
  73475. }
  73476. },
  73477. startEditByPosition: function(position) {
  73478. position.column = this.view.getHeaderCt().getVisibleHeaderClosestToIndex(position.column).getIndex();
  73479. return this.startEdit(position.row, position.column);
  73480. }
  73481. });
  73482. Ext.define('Ext.grid.plugin.DragDrop', {
  73483. extend: 'Ext.AbstractPlugin',
  73484. alias: 'plugin.gridviewdragdrop',
  73485. uses: [
  73486. 'Ext.view.DragZone',
  73487. 'Ext.grid.ViewDropZone'
  73488. ],
  73489. dragText : '{0} selected row{1}',
  73490. ddGroup : "GridDD",
  73491. enableDrop: true,
  73492. enableDrag: true,
  73493. init : function(view) {
  73494. view.on('render', this.onViewRender, this, {single: true});
  73495. },
  73496. destroy: function() {
  73497. Ext.destroy(this.dragZone, this.dropZone);
  73498. },
  73499. enable: function() {
  73500. var me = this;
  73501. if (me.dragZone) {
  73502. me.dragZone.unlock();
  73503. }
  73504. if (me.dropZone) {
  73505. me.dropZone.unlock();
  73506. }
  73507. me.callParent();
  73508. },
  73509. disable: function() {
  73510. var me = this;
  73511. if (me.dragZone) {
  73512. me.dragZone.lock();
  73513. }
  73514. if (me.dropZone) {
  73515. me.dropZone.lock();
  73516. }
  73517. me.callParent();
  73518. },
  73519. onViewRender : function(view) {
  73520. var me = this;
  73521. if (me.enableDrag) {
  73522. me.dragZone = new Ext.view.DragZone({
  73523. view: view,
  73524. ddGroup: me.dragGroup || me.ddGroup,
  73525. dragText: me.dragText
  73526. });
  73527. }
  73528. if (me.enableDrop) {
  73529. me.dropZone = new Ext.grid.ViewDropZone({
  73530. view: view,
  73531. ddGroup: me.dropGroup || me.ddGroup
  73532. });
  73533. }
  73534. }
  73535. });
  73536. Ext.define('Ext.grid.plugin.RowEditing', {
  73537. extend: 'Ext.grid.plugin.Editing',
  73538. alias: 'plugin.rowediting',
  73539. requires: [
  73540. 'Ext.grid.RowEditor'
  73541. ],
  73542. editStyle: 'row',
  73543. autoCancel: true,
  73544. errorSummary: true,
  73545. constructor: function() {
  73546. var me = this;
  73547. me.callParent(arguments);
  73548. if (!me.clicksToMoveEditor) {
  73549. me.clicksToMoveEditor = me.clicksToEdit;
  73550. }
  73551. me.autoCancel = !!me.autoCancel;
  73552. },
  73553. init: function(grid) {
  73554. this.callParent([grid]);
  73555. },
  73556. destroy: function() {
  73557. var me = this;
  73558. Ext.destroy(me.editor);
  73559. me.callParent(arguments);
  73560. },
  73561. startEdit: function(record, columnHeader) {
  73562. var me = this,
  73563. editor = me.getEditor();
  73564. if ((editor.beforeEdit() !== false) && (me.callParent(arguments) !== false)) {
  73565. editor.startEdit(me.context.record, me.context.column);
  73566. return true;
  73567. }
  73568. return false;
  73569. },
  73570. cancelEdit: function() {
  73571. var me = this;
  73572. if (me.editing) {
  73573. me.getEditor().cancelEdit();
  73574. me.callParent(arguments);
  73575. }
  73576. },
  73577. completeEdit: function() {
  73578. var me = this;
  73579. if (me.editing && me.validateEdit()) {
  73580. me.editing = false;
  73581. me.fireEvent('edit', me, me.context);
  73582. }
  73583. },
  73584. validateEdit: function() {
  73585. var me = this,
  73586. editor = me.editor,
  73587. context = me.context,
  73588. record = context.record,
  73589. newValues = {},
  73590. originalValues = {},
  73591. editors = editor.items.items,
  73592. e,
  73593. eLen = editors.length,
  73594. name, item;
  73595. for (e = 0; e < eLen; e++) {
  73596. item = editors[e];
  73597. name = item.name;
  73598. newValues[name] = item.getValue();
  73599. originalValues[name] = record.get(name);
  73600. }
  73601. Ext.apply(context, {
  73602. newValues : newValues,
  73603. originalValues : originalValues
  73604. });
  73605. return me.callParent(arguments) && me.getEditor().completeEdit();
  73606. },
  73607. getEditor: function() {
  73608. var me = this;
  73609. if (!me.editor) {
  73610. me.editor = me.initEditor();
  73611. }
  73612. return me.editor;
  73613. },
  73614. initEditor: function() {
  73615. var me = this,
  73616. grid = me.grid,
  73617. view = me.view,
  73618. headerCt = grid.headerCt,
  73619. btns = ['saveBtnText', 'cancelBtnText', 'errorsText', 'dirtyText'],
  73620. b,
  73621. bLen = btns.length,
  73622. cfg = {
  73623. autoCancel: me.autoCancel,
  73624. errorSummary: me.errorSummary,
  73625. fields: headerCt.getGridColumns(),
  73626. hidden: true,
  73627. view: view,
  73628. editingPlugin: me,
  73629. renderTo: view.el
  73630. },
  73631. item;
  73632. for (b = 0; b < bLen; b++) {
  73633. item = btns[b];
  73634. if (Ext.isDefined(me[item])) {
  73635. cfg[item] = me[item];
  73636. }
  73637. }
  73638. return Ext.create('Ext.grid.RowEditor', cfg);
  73639. },
  73640. initEditTriggers: function() {
  73641. var me = this,
  73642. view = me.view,
  73643. moveEditorEvent = me.clicksToMoveEditor === 1 ? 'click' : 'dblclick';
  73644. me.callParent(arguments);
  73645. if (me.clicksToMoveEditor !== me.clicksToEdit) {
  73646. me.mon(view, 'cell' + moveEditorEvent, me.moveEditorByClick, me);
  73647. }
  73648. view.on({
  73649. render: function() {
  73650. me.mon(me.grid.headerCt, {
  73651. scope: me,
  73652. columnresize: me.onColumnResize,
  73653. columnhide: me.onColumnHide,
  73654. columnshow: me.onColumnShow,
  73655. columnmove: me.onColumnMove
  73656. });
  73657. },
  73658. single: true
  73659. });
  73660. },
  73661. startEditByClick: function() {
  73662. var me = this;
  73663. if (!me.editing || me.clicksToMoveEditor === me.clicksToEdit) {
  73664. me.callParent(arguments);
  73665. }
  73666. },
  73667. moveEditorByClick: function() {
  73668. var me = this;
  73669. if (me.editing) {
  73670. me.superclass.onCellClick.apply(me, arguments);
  73671. }
  73672. },
  73673. onColumnAdd: function(ct, column) {
  73674. if (column.isHeader) {
  73675. var me = this,
  73676. editor;
  73677. me.initFieldAccessors(column);
  73678. editor = me.editor;
  73679. if (editor && editor.onColumnAdd) {
  73680. editor.onColumnAdd(column);
  73681. }
  73682. }
  73683. },
  73684. onColumnRemove: function(ct, column) {
  73685. if (column.isHeader) {
  73686. var me = this,
  73687. editor = me.getEditor();
  73688. if (editor && editor.onColumnRemove) {
  73689. editor.onColumnRemove(column);
  73690. }
  73691. me.removeFieldAccessors(column);
  73692. }
  73693. },
  73694. onColumnResize: function(ct, column, width) {
  73695. if (column.isHeader) {
  73696. var me = this,
  73697. editor = me.getEditor();
  73698. if (editor && editor.onColumnResize) {
  73699. editor.onColumnResize(column, width);
  73700. }
  73701. }
  73702. },
  73703. onColumnHide: function(ct, column) {
  73704. var me = this,
  73705. editor = me.getEditor();
  73706. if (editor && editor.onColumnHide) {
  73707. editor.onColumnHide(column);
  73708. }
  73709. },
  73710. onColumnShow: function(ct, column) {
  73711. var me = this,
  73712. editor = me.getEditor();
  73713. if (editor && editor.onColumnShow) {
  73714. editor.onColumnShow(column);
  73715. }
  73716. },
  73717. onColumnMove: function(ct, column, fromIdx, toIdx) {
  73718. var me = this,
  73719. editor = me.getEditor();
  73720. if (editor && editor.onColumnMove) {
  73721. editor.onColumnMove(column, fromIdx, toIdx - (toIdx > fromIdx ? 1 : 0));
  73722. }
  73723. },
  73724. setColumnField: function(column, field) {
  73725. var me = this,
  73726. editor = me.getEditor();
  73727. editor.removeField(column);
  73728. me.callParent(arguments);
  73729. me.getEditor().setField(column);
  73730. }
  73731. });
  73732. Ext.define('Ext.grid.property.Grid', {
  73733. extend: 'Ext.grid.Panel',
  73734. alias: 'widget.propertygrid',
  73735. alternateClassName: 'Ext.grid.PropertyGrid',
  73736. uses: [
  73737. 'Ext.grid.plugin.CellEditing',
  73738. 'Ext.grid.property.Store',
  73739. 'Ext.grid.property.HeaderContainer',
  73740. 'Ext.XTemplate',
  73741. 'Ext.grid.CellEditor',
  73742. 'Ext.form.field.Date',
  73743. 'Ext.form.field.Text',
  73744. 'Ext.form.field.Number',
  73745. 'Ext.form.field.ComboBox'
  73746. ],
  73747. valueField: 'value',
  73748. nameField: 'name',
  73749. enableColumnMove: false,
  73750. columnLines: true,
  73751. stripeRows: false,
  73752. trackMouseOver: false,
  73753. clicksToEdit: 1,
  73754. enableHdMenu: false,
  73755. initComponent : function(){
  73756. var me = this;
  73757. me.addCls(Ext.baseCSSPrefix + 'property-grid');
  73758. me.plugins = me.plugins || [];
  73759. me.plugins.push(new Ext.grid.plugin.CellEditing({
  73760. clicksToEdit: me.clicksToEdit,
  73761. startEdit: function(record, column) {
  73762. return this.self.prototype.startEdit.call(this, record, me.headerCt.child('#' + me.valueField));
  73763. }
  73764. }));
  73765. me.selModel = {
  73766. selType: 'cellmodel',
  73767. onCellSelect: function(position) {
  73768. if (position.column != 1) {
  73769. position.column = 1;
  73770. }
  73771. return this.self.prototype.onCellSelect.call(this, position);
  73772. }
  73773. };
  73774. me.customRenderers = me.customRenderers || {};
  73775. me.customEditors = me.customEditors || {};
  73776. if (!me.store) {
  73777. me.propStore = me.store = new Ext.grid.property.Store(me, me.source);
  73778. }
  73779. if (me.sortableColumns) {
  73780. me.store.sort('name', 'ASC');
  73781. }
  73782. me.columns = new Ext.grid.property.HeaderContainer(me, me.store);
  73783. me.addEvents(
  73784. 'beforepropertychange',
  73785. 'propertychange'
  73786. );
  73787. me.callParent();
  73788. me.getView().walkCells = this.walkCells;
  73789. me.editors = {
  73790. 'date' : new Ext.grid.CellEditor({ field: new Ext.form.field.Date({selectOnFocus: true})}),
  73791. 'string' : new Ext.grid.CellEditor({ field: new Ext.form.field.Text({selectOnFocus: true})}),
  73792. 'number' : new Ext.grid.CellEditor({ field: new Ext.form.field.Number({selectOnFocus: true})}),
  73793. 'boolean' : new Ext.grid.CellEditor({ field: new Ext.form.field.ComboBox({
  73794. editable: false,
  73795. store: [[ true, me.headerCt.trueText ], [false, me.headerCt.falseText ]]
  73796. })})
  73797. };
  73798. me.store.on('update', me.onUpdate, me);
  73799. },
  73800. onUpdate : function(store, record, operation) {
  73801. var me = this,
  73802. v, oldValue;
  73803. if (me.rendered && operation == Ext.data.Model.EDIT) {
  73804. v = record.get(me.valueField);
  73805. oldValue = record.modified.value;
  73806. if (me.fireEvent('beforepropertychange', me.source, record.getId(), v, oldValue) !== false) {
  73807. if (me.source) {
  73808. me.source[record.getId()] = v;
  73809. }
  73810. record.commit();
  73811. me.fireEvent('propertychange', me.source, record.getId(), v, oldValue);
  73812. } else {
  73813. record.reject();
  73814. }
  73815. }
  73816. },
  73817. walkCells: function(pos, direction, e, preventWrap, verifierFn, scope) {
  73818. if (direction == 'left') {
  73819. direction = 'up';
  73820. } else if (direction == 'right') {
  73821. direction = 'down';
  73822. }
  73823. pos = Ext.view.Table.prototype.walkCells.call(this, pos, direction, e, preventWrap, verifierFn, scope);
  73824. if (!pos.column) {
  73825. pos.column = 1;
  73826. }
  73827. return pos;
  73828. },
  73829. getCellEditor : function(record, column) {
  73830. var me = this,
  73831. propName = record.get(me.nameField),
  73832. val = record.get(me.valueField),
  73833. editor = me.customEditors[propName];
  73834. if (editor) {
  73835. if (!(editor instanceof Ext.grid.CellEditor)) {
  73836. if (!(editor instanceof Ext.form.field.Base)) {
  73837. editor = Ext.ComponentManager.create(editor, 'textfield');
  73838. }
  73839. editor = me.customEditors[propName] = new Ext.grid.CellEditor({ field: editor });
  73840. }
  73841. } else if (Ext.isDate(val)) {
  73842. editor = me.editors.date;
  73843. } else if (Ext.isNumber(val)) {
  73844. editor = me.editors.number;
  73845. } else if (Ext.isBoolean(val)) {
  73846. editor = me.editors['boolean'];
  73847. } else {
  73848. editor = me.editors.string;
  73849. }
  73850. editor.editorId = propName;
  73851. return editor;
  73852. },
  73853. beforeDestroy: function() {
  73854. var me = this;
  73855. me.callParent();
  73856. me.destroyEditors(me.editors);
  73857. me.destroyEditors(me.customEditors);
  73858. delete me.source;
  73859. },
  73860. destroyEditors: function (editors) {
  73861. for (var ed in editors) {
  73862. if (editors.hasOwnProperty(ed)) {
  73863. Ext.destroy(editors[ed]);
  73864. }
  73865. }
  73866. },
  73867. setSource: function(source) {
  73868. this.source = source;
  73869. this.propStore.setSource(source);
  73870. },
  73871. getSource: function() {
  73872. return this.propStore.getSource();
  73873. },
  73874. setProperty: function(prop, value, create) {
  73875. this.propStore.setValue(prop, value, create);
  73876. },
  73877. removeProperty: function(prop) {
  73878. this.propStore.remove(prop);
  73879. }
  73880. });
  73881. Ext.define('Ext.grid.property.HeaderContainer', {
  73882. extend: 'Ext.grid.header.Container',
  73883. alternateClassName: 'Ext.grid.PropertyColumnModel',
  73884. nameWidth: 115,
  73885. nameText : 'Name',
  73886. valueText : 'Value',
  73887. dateFormat : 'm/j/Y',
  73888. trueText: 'true',
  73889. falseText: 'false',
  73890. nameColumnCls: Ext.baseCSSPrefix + 'grid-property-name',
  73891. constructor : function(grid, store) {
  73892. var me = this;
  73893. me.grid = grid;
  73894. me.store = store;
  73895. me.callParent([{
  73896. items: [{
  73897. header: me.nameText,
  73898. width: grid.nameColumnWidth || me.nameWidth,
  73899. sortable: grid.sortableColumns,
  73900. dataIndex: grid.nameField,
  73901. renderer: Ext.Function.bind(me.renderProp, me),
  73902. itemId: grid.nameField,
  73903. menuDisabled :true,
  73904. tdCls: me.nameColumnCls
  73905. }, {
  73906. header: me.valueText,
  73907. renderer: Ext.Function.bind(me.renderCell, me),
  73908. getEditor: Ext.Function.bind(me.getCellEditor, me),
  73909. sortable: grid.sortableColumns,
  73910. flex: 1,
  73911. fixed: true,
  73912. dataIndex: grid.valueField,
  73913. itemId: grid.valueField,
  73914. menuDisabled: true
  73915. }]
  73916. }]);
  73917. },
  73918. getCellEditor: function(record){
  73919. return this.grid.getCellEditor(record, this);
  73920. },
  73921. renderProp : function(v) {
  73922. return this.getPropertyName(v);
  73923. },
  73924. renderCell : function(val, meta, rec) {
  73925. var me = this,
  73926. renderer = me.grid.customRenderers[rec.get(me.grid.nameField)],
  73927. result = val;
  73928. if (renderer) {
  73929. return renderer.apply(me, arguments);
  73930. }
  73931. if (Ext.isDate(val)) {
  73932. result = me.renderDate(val);
  73933. } else if (Ext.isBoolean(val)) {
  73934. result = me.renderBool(val);
  73935. }
  73936. return Ext.util.Format.htmlEncode(result);
  73937. },
  73938. renderDate : Ext.util.Format.date,
  73939. renderBool : function(bVal) {
  73940. return this[bVal ? 'trueText' : 'falseText'];
  73941. },
  73942. getPropertyName : function(name) {
  73943. var pn = this.grid.propertyNames;
  73944. return pn && pn[name] ? pn[name] : name;
  73945. }
  73946. });
  73947. Ext.define('Ext.grid.property.Property', {
  73948. extend: 'Ext.data.Model',
  73949. alternateClassName: 'Ext.PropGridProperty',
  73950. fields: [{
  73951. name: 'name',
  73952. type: 'string'
  73953. }, {
  73954. name: 'value'
  73955. }],
  73956. idProperty: 'name'
  73957. });
  73958. Ext.define('Ext.grid.property.Store', {
  73959. extend: 'Ext.data.Store',
  73960. alternateClassName: 'Ext.grid.PropertyStore',
  73961. sortOnLoad: false,
  73962. uses: ['Ext.data.reader.Reader', 'Ext.data.proxy.Proxy', 'Ext.data.ResultSet', 'Ext.grid.property.Property'],
  73963. constructor : function(grid, source){
  73964. var me = this;
  73965. me.grid = grid;
  73966. me.source = source;
  73967. me.callParent([{
  73968. data: source,
  73969. model: Ext.grid.property.Property,
  73970. proxy: me.getProxy()
  73971. }]);
  73972. },
  73973. getProxy: function() {
  73974. if (!this.proxy) {
  73975. Ext.grid.property.Store.prototype.proxy = new Ext.data.proxy.Memory({
  73976. model: Ext.grid.property.Property,
  73977. reader: this.getReader()
  73978. });
  73979. }
  73980. return this.proxy;
  73981. },
  73982. getReader: function() {
  73983. if (!this.reader) {
  73984. Ext.grid.property.Store.prototype.reader = new Ext.data.reader.Reader({
  73985. model: Ext.grid.property.Property,
  73986. buildExtractors: Ext.emptyFn,
  73987. read: function(dataObject) {
  73988. return this.readRecords(dataObject);
  73989. },
  73990. readRecords: function(dataObject) {
  73991. var val,
  73992. propName,
  73993. result = {
  73994. records: [],
  73995. success: true
  73996. };
  73997. for (propName in dataObject) {
  73998. if (dataObject.hasOwnProperty(propName)) {
  73999. val = dataObject[propName];
  74000. if (this.isEditableValue(val)) {
  74001. result.records.push(new Ext.grid.property.Property({
  74002. name: propName,
  74003. value: val
  74004. }, propName));
  74005. }
  74006. }
  74007. }
  74008. result.total = result.count = result.records.length;
  74009. return new Ext.data.ResultSet(result);
  74010. },
  74011. isEditableValue: function(val){
  74012. return Ext.isPrimitive(val) || Ext.isDate(val);
  74013. }
  74014. });
  74015. }
  74016. return this.reader;
  74017. },
  74018. setSource : function(dataObject) {
  74019. var me = this;
  74020. me.source = dataObject;
  74021. me.suspendEvents();
  74022. me.removeAll();
  74023. me.proxy.data = dataObject;
  74024. me.load();
  74025. me.resumeEvents();
  74026. me.fireEvent('datachanged', me);
  74027. me.fireEvent('refresh', me);
  74028. },
  74029. getProperty : function(row) {
  74030. return Ext.isNumber(row) ? this.getAt(row) : this.getById(row);
  74031. },
  74032. setValue : function(prop, value, create){
  74033. var me = this,
  74034. rec = me.getRec(prop);
  74035. if (rec) {
  74036. rec.set('value', value);
  74037. me.source[prop] = value;
  74038. } else if (create) {
  74039. me.source[prop] = value;
  74040. rec = new Ext.grid.property.Property({name: prop, value: value}, prop);
  74041. me.add(rec);
  74042. }
  74043. },
  74044. remove : function(prop) {
  74045. var rec = this.getRec(prop);
  74046. if (rec) {
  74047. this.callParent([rec]);
  74048. delete this.source[prop];
  74049. }
  74050. },
  74051. getRec : function(prop) {
  74052. return this.getById(prop);
  74053. },
  74054. getSource : function() {
  74055. return this.source;
  74056. }
  74057. });
  74058. Ext.define('Ext.layout.ClassList', (function () {
  74059. var splitWords = Ext.String.splitWords,
  74060. toMap = Ext.Array.toMap;
  74061. return {
  74062. dirty: false,
  74063. constructor: function (owner) {
  74064. this.owner = owner;
  74065. this.map = toMap(this.classes = splitWords(owner.el.className));
  74066. },
  74067. add: function (cls) {
  74068. var me = this;
  74069. if (!me.map[cls]) {
  74070. me.map[cls] = true;
  74071. me.classes.push(cls);
  74072. if (!me.dirty) {
  74073. me.dirty = true;
  74074. me.owner.markDirty();
  74075. }
  74076. }
  74077. },
  74078. addMany: function (classes) {
  74079. Ext.each(splitWords(classes), this.add, this);
  74080. },
  74081. contains: function (cls) {
  74082. return this.map[cls];
  74083. },
  74084. flush: function () {
  74085. this.owner.el.className = this.classes.join(' ');
  74086. this.dirty = false;
  74087. },
  74088. remove: function (cls) {
  74089. var me = this;
  74090. if (me.map[cls]) {
  74091. delete me.map[cls];
  74092. me.classes = Ext.Array.filter(me.classes, function (c) {
  74093. return c != cls;
  74094. });
  74095. if (!me.dirty) {
  74096. me.dirty = true;
  74097. me.owner.markDirty();
  74098. }
  74099. }
  74100. },
  74101. removeMany: function (classes) {
  74102. var me = this,
  74103. remove = toMap(splitWords(classes));
  74104. me.classes = Ext.Array.filter(me.classes, function (c) {
  74105. if (!remove[c]) {
  74106. return true;
  74107. }
  74108. delete me.map[c];
  74109. if (!me.dirty) {
  74110. me.dirty = true;
  74111. me.owner.markDirty();
  74112. }
  74113. return false;
  74114. });
  74115. }
  74116. };
  74117. }()));
  74118. Ext.define('Ext.util.Queue', {
  74119. constructor: function() {
  74120. this.clear();
  74121. },
  74122. add : function(obj) {
  74123. var me = this,
  74124. key = me.getKey(obj);
  74125. if (!me.map[key]) {
  74126. ++me.length;
  74127. me.items.push(obj);
  74128. me.map[key] = obj;
  74129. }
  74130. return obj;
  74131. },
  74132. clear : function(){
  74133. var me = this,
  74134. items = me.items;
  74135. me.items = [];
  74136. me.map = {};
  74137. me.length = 0;
  74138. return items;
  74139. },
  74140. contains: function (obj) {
  74141. var key = this.getKey(obj);
  74142. return this.map.hasOwnProperty(key);
  74143. },
  74144. getCount : function(){
  74145. return this.length;
  74146. },
  74147. getKey : function(obj){
  74148. return obj.id;
  74149. },
  74150. remove : function(obj){
  74151. var me = this,
  74152. key = me.getKey(obj),
  74153. items = me.items,
  74154. index;
  74155. if (me.map[key]) {
  74156. index = Ext.Array.indexOf(items, obj);
  74157. Ext.Array.erase(items, index, 1);
  74158. delete me.map[key];
  74159. --me.length;
  74160. }
  74161. return obj;
  74162. }
  74163. });
  74164. Ext.define('Ext.layout.ContextItem', {
  74165. requires: ['Ext.layout.ClassList'],
  74166. heightModel: null,
  74167. widthModel: null,
  74168. sizeModel: null,
  74169. boxChildren: null,
  74170. boxParent: null,
  74171. children: [],
  74172. dirty: null,
  74173. dirtyCount: 0,
  74174. hasRawContent: true,
  74175. isContextItem: true,
  74176. isTopLevel: false,
  74177. consumersContentHeight: 0,
  74178. consumersContentWidth: 0,
  74179. consumersContainerHeight: 0,
  74180. consumersContainerWidth: 0,
  74181. consumersHeight: 0,
  74182. consumersWidth: 0,
  74183. ownerCtContext: null,
  74184. remainingChildLayouts: 0,
  74185. remainingComponentChildLayouts: 0,
  74186. remainingContainerChildLayouts: 0,
  74187. props: null,
  74188. state: null,
  74189. wrapsComponent: false,
  74190. constructor: function (config) {
  74191. var me = this,
  74192. el, ownerCt, ownerCtContext, sizeModel, target;
  74193. Ext.apply(me, config);
  74194. el = me.el;
  74195. me.id = el.id;
  74196. me.lastBox = el.lastBox;
  74197. me.flushedProps = {};
  74198. me.props = {};
  74199. me.styles = {};
  74200. target = me.target;
  74201. if (target.isComponent) {
  74202. me.wrapsComponent = true;
  74203. ownerCt = target.ownerCt;
  74204. if (ownerCt && (ownerCtContext = me.context.items[ownerCt.el.id])) {
  74205. me.ownerCtContext = ownerCtContext;
  74206. }
  74207. me.sizeModel = sizeModel = target.getSizeModel(ownerCtContext &&
  74208. ownerCtContext.widthModel.pairsByHeightOrdinal[ownerCtContext.heightModel.ordinal]);
  74209. me.widthModel = sizeModel.width;
  74210. me.heightModel = sizeModel.height;
  74211. }
  74212. },
  74213. init: function (full, options) {
  74214. var me = this,
  74215. oldProps = me.props,
  74216. oldDirty = me.dirty,
  74217. ownerCtContext = me.ownerCtContext,
  74218. ownerLayout = me.target.ownerLayout,
  74219. firstTime = !me.state,
  74220. ret = full || firstTime,
  74221. children, i, n, ownerCt, sizeModel, target,
  74222. oldHeightModel = me.heightModel,
  74223. oldWidthModel = me.widthModel,
  74224. newHeightModel, newWidthModel;
  74225. me.dirty = me.invalid = false;
  74226. me.props = {};
  74227. if (me.boxChildren) {
  74228. me.boxChildren.length = 0;
  74229. }
  74230. if (!firstTime) {
  74231. me.clearAllBlocks('blocks');
  74232. me.clearAllBlocks('domBlocks');
  74233. }
  74234. if (!me.wrapsComponent) {
  74235. return ret;
  74236. }
  74237. target = me.target;
  74238. me.state = {};
  74239. if (firstTime) {
  74240. if (target.beforeLayout) {
  74241. target.beforeLayout();
  74242. }
  74243. if (!ownerCtContext && (ownerCt = target.ownerCt)) {
  74244. ownerCtContext = me.context.items[ownerCt.el.id];
  74245. }
  74246. if (ownerCtContext) {
  74247. me.ownerCtContext = ownerCtContext;
  74248. me.isBoxParent = target.ownerLayout.isItemBoxParent(me);
  74249. } else {
  74250. me.isTopLevel = true;
  74251. }
  74252. me.frameBodyContext = me.getEl('frameBody');
  74253. } else {
  74254. ownerCtContext = me.ownerCtContext;
  74255. me.isTopLevel = !ownerCtContext;
  74256. children = me.children;
  74257. for (i = 0, n = children.length; i < n; ++i) {
  74258. children[i].init(true);
  74259. }
  74260. }
  74261. me.hasRawContent = !(target.isContainer && target.items.items.length > 0);
  74262. if (full) {
  74263. me.widthModel = me.heightModel = null;
  74264. sizeModel = target.getSizeModel(ownerCtContext &&
  74265. ownerCtContext.widthModel.pairsByHeightOrdinal[ownerCtContext.heightModel.ordinal]);
  74266. if (firstTime) {
  74267. me.sizeModel = sizeModel;
  74268. }
  74269. me.widthModel = sizeModel.width;
  74270. me.heightModel = sizeModel.height;
  74271. } else if (oldProps) {
  74272. me.recoverProp('x', oldProps, oldDirty);
  74273. me.recoverProp('y', oldProps, oldDirty);
  74274. if (me.widthModel.calculated) {
  74275. me.recoverProp('width', oldProps, oldDirty);
  74276. }
  74277. if (me.heightModel.calculated) {
  74278. me.recoverProp('height', oldProps, oldDirty);
  74279. }
  74280. }
  74281. if (oldProps && ownerLayout && ownerLayout.manageMargins) {
  74282. me.recoverProp('margin-top', oldProps, oldDirty);
  74283. me.recoverProp('margin-right', oldProps, oldDirty);
  74284. me.recoverProp('margin-bottom', oldProps, oldDirty);
  74285. me.recoverProp('margin-left', oldProps, oldDirty);
  74286. }
  74287. if (options) {
  74288. newHeightModel = options.heightModel;
  74289. newWidthModel = options.widthModel;
  74290. if (newWidthModel && newHeightModel && oldWidthModel && oldHeightModel) {
  74291. if (oldWidthModel.shrinkWrap && oldHeightModel.shrinkWrap) {
  74292. if (newWidthModel.constrainedMax && newHeightModel.constrainedMin) {
  74293. newHeightModel = null;
  74294. }
  74295. }
  74296. }
  74297. if (newWidthModel) {
  74298. me.widthModel = newWidthModel;
  74299. }
  74300. if (newHeightModel) {
  74301. me.heightModel = newHeightModel;
  74302. }
  74303. if (options.state) {
  74304. Ext.apply(me.state, options.state);
  74305. }
  74306. }
  74307. return ret;
  74308. },
  74309. initContinue: function (full) {
  74310. var me = this,
  74311. ownerCtContext = me.ownerCtContext,
  74312. widthModel = me.widthModel,
  74313. boxParent;
  74314. if (full) {
  74315. if (ownerCtContext && widthModel.shrinkWrap) {
  74316. boxParent = ownerCtContext.isBoxParent ? ownerCtContext : ownerCtContext.boxParent;
  74317. if (boxParent) {
  74318. boxParent.addBoxChild(me);
  74319. }
  74320. } else if (widthModel.natural) {
  74321. me.boxParent = ownerCtContext;
  74322. }
  74323. }
  74324. return full;
  74325. },
  74326. initDone: function (full, componentChildrenDone, containerChildrenDone, containerLayoutDone) {
  74327. var me = this,
  74328. props = me.props,
  74329. state = me.state;
  74330. if (componentChildrenDone) {
  74331. props.componentChildrenDone = true;
  74332. }
  74333. if (containerChildrenDone) {
  74334. props.containerChildrenDone = true;
  74335. }
  74336. if (containerLayoutDone) {
  74337. props.containerLayoutDone = true;
  74338. }
  74339. if (me.boxChildren && me.boxChildren.length && me.widthModel.shrinkWrap) {
  74340. me.el.setWidth(10000);
  74341. state.blocks = (state.blocks || 0) + 1;
  74342. }
  74343. },
  74344. initAnimation: function() {
  74345. var me = this,
  74346. target = me.target,
  74347. ownerCtContext = me.ownerCtContext;
  74348. if (ownerCtContext && ownerCtContext.isTopLevel) {
  74349. me.animatePolicy = target.ownerLayout.getAnimatePolicy(me);
  74350. } else if (!ownerCtContext && target.isCollapsingOrExpanding && target.animCollapse) {
  74351. me.animatePolicy = target.componentLayout.getAnimatePolicy(me);
  74352. }
  74353. if (me.animatePolicy) {
  74354. me.context.queueAnimation(me);
  74355. }
  74356. },
  74357. noFraming: { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0 },
  74358. addCls: function(newCls) {
  74359. this.getClassList().addMany(newCls);
  74360. },
  74361. removeCls: function(removeCls) {
  74362. this.getClassList().removeMany(removeCls);
  74363. },
  74364. addBlock: function (name, layout, propName) {
  74365. var me = this,
  74366. collection = me[name] || (me[name] = {}),
  74367. blockedLayouts = collection[propName] || (collection[propName] = {});
  74368. if (!blockedLayouts[layout.id]) {
  74369. blockedLayouts[layout.id] = layout;
  74370. ++layout.blockCount;
  74371. ++me.context.blockCount;
  74372. }
  74373. },
  74374. addBoxChild: function (boxChildItem) {
  74375. var me = this,
  74376. children,
  74377. widthModel = boxChildItem.widthModel;
  74378. boxChildItem.boxParent = this;
  74379. boxChildItem.measuresBox = widthModel.shrinkWrap ? boxChildItem.hasRawContent : widthModel.natural;
  74380. if (boxChildItem.measuresBox) {
  74381. children = me.boxChildren;
  74382. if (children) {
  74383. children.push(boxChildItem);
  74384. } else {
  74385. me.boxChildren = [ boxChildItem ];
  74386. }
  74387. }
  74388. },
  74389. addTrigger: function (propName, inDom) {
  74390. var me = this,
  74391. name = inDom ? 'domTriggers' : 'triggers',
  74392. collection = me[name] || (me[name] = {}),
  74393. context = me.context,
  74394. layout = context.currentLayout,
  74395. triggers = collection[propName] || (collection[propName] = {});
  74396. if (!triggers[layout.id]) {
  74397. triggers[layout.id] = layout;
  74398. ++layout.triggerCount;
  74399. triggers = context.triggers[inDom ? 'dom' : 'data'];
  74400. (triggers[layout.id] || (triggers[layout.id] = [])).push({
  74401. item: this,
  74402. prop: propName
  74403. });
  74404. if (me.props[propName] !== undefined) {
  74405. if (!inDom || !(me.dirty && (propName in me.dirty))) {
  74406. ++layout.firedTriggers;
  74407. }
  74408. }
  74409. }
  74410. },
  74411. boxChildMeasured: function () {
  74412. var me = this,
  74413. state = me.state,
  74414. count = (state.boxesMeasured = (state.boxesMeasured || 0) + 1);
  74415. if (count == me.boxChildren.length) {
  74416. state.clearBoxWidth = 1;
  74417. ++me.context.progressCount;
  74418. me.markDirty();
  74419. }
  74420. },
  74421. borderNames: [ 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'],
  74422. marginNames: [ 'margin-top', 'margin-right', 'margin-bottom', 'margin-left' ],
  74423. paddingNames: [ 'padding-top', 'padding-right', 'padding-bottom', 'padding-left' ],
  74424. trblNames: [ 'top', 'right', 'bottom', 'left' ],
  74425. cacheMissHandlers: {
  74426. borderInfo: function (me) {
  74427. var info = me.getStyles(me.borderNames, me.trblNames);
  74428. info.width = info.left + info.right;
  74429. info.height = info.top + info.bottom;
  74430. return info;
  74431. },
  74432. marginInfo: function (me) {
  74433. var info = me.getStyles(me.marginNames, me.trblNames);
  74434. info.width = info.left + info.right;
  74435. info.height = info.top + info.bottom;
  74436. return info;
  74437. },
  74438. paddingInfo: function (me) {
  74439. var item = me.frameBodyContext || me,
  74440. info = item.getStyles(me.paddingNames, me.trblNames);
  74441. info.width = info.left + info.right;
  74442. info.height = info.top + info.bottom;
  74443. return info;
  74444. }
  74445. },
  74446. checkCache: function (entry) {
  74447. return this.cacheMissHandlers[entry](this);
  74448. },
  74449. clearAllBlocks: function (name) {
  74450. var collection = this[name],
  74451. propName;
  74452. if (collection) {
  74453. for (propName in collection) {
  74454. this.clearBlocks(name, propName);
  74455. }
  74456. }
  74457. },
  74458. clearBlocks: function (name, propName) {
  74459. var collection = this[name],
  74460. blockedLayouts = collection && collection[propName],
  74461. context, layout, layoutId;
  74462. if (blockedLayouts) {
  74463. delete collection[propName];
  74464. context = this.context;
  74465. for (layoutId in blockedLayouts) {
  74466. layout = blockedLayouts[layoutId];
  74467. --context.blockCount;
  74468. if (! --layout.blockCount && !layout.pending && !layout.done) {
  74469. context.queueLayout(layout);
  74470. }
  74471. }
  74472. }
  74473. },
  74474. block: function (layout, propName) {
  74475. this.addBlock('blocks', layout, propName);
  74476. },
  74477. domBlock: function (layout, propName) {
  74478. this.addBlock('domBlocks', layout, propName);
  74479. },
  74480. fireTriggers: function (name, propName) {
  74481. var collection = this[name],
  74482. triggers = collection && collection[propName],
  74483. context = this.context,
  74484. layout, layoutId;
  74485. if (triggers) {
  74486. for (layoutId in triggers) {
  74487. layout = triggers[layoutId];
  74488. ++layout.firedTriggers;
  74489. if (!layout.done && !layout.blockCount && !layout.pending) {
  74490. context.queueLayout(layout);
  74491. }
  74492. }
  74493. }
  74494. },
  74495. flush: function () {
  74496. var me = this,
  74497. dirty = me.dirty,
  74498. state = me.state,
  74499. targetEl = me.el;
  74500. me.dirtyCount = 0;
  74501. if (me.classList && me.classList.dirty) {
  74502. me.classList.flush();
  74503. }
  74504. if ('attributes' in me) {
  74505. targetEl.set(me.attributes);
  74506. delete me.attributes;
  74507. }
  74508. if ('innerHTML' in me) {
  74509. targetEl.innerHTML = me.innerHTML;
  74510. delete me.innerHTML;
  74511. }
  74512. if (state && state.clearBoxWidth) {
  74513. state.clearBoxWidth = 0;
  74514. me.el.setStyle('width', null);
  74515. if (! --state.blocks) {
  74516. me.context.queueItemLayouts(me);
  74517. }
  74518. }
  74519. if (dirty) {
  74520. delete me.dirty;
  74521. me.writeProps(dirty, true);
  74522. }
  74523. },
  74524. flushAnimations: function() {
  74525. var me = this,
  74526. animateFrom = me.lastBox,
  74527. target, targetAnim, duration, animateProps, anim,
  74528. changeCount, j, propsLen, propName, oldValue, newValue;
  74529. if (animateFrom) {
  74530. target = me.target;
  74531. targetAnim = target.layout && target.layout.animate;
  74532. if (targetAnim) {
  74533. duration = Ext.isNumber(targetAnim) ? targetAnim : targetAnim.duration;
  74534. }
  74535. animateProps = Ext.Object.getKeys(me.animatePolicy);
  74536. anim = Ext.apply({}, {
  74537. from: {},
  74538. to: {},
  74539. duration: duration || Ext.fx.Anim.prototype.duration
  74540. }, targetAnim);
  74541. for (changeCount = 0, j = 0, propsLen = animateProps.length; j < propsLen; j++) {
  74542. propName = animateProps[j];
  74543. oldValue = animateFrom[propName];
  74544. newValue = me.peek(propName);
  74545. if (oldValue != newValue) {
  74546. propName = me.translateProps[propName]||propName;
  74547. anim.from[propName] = oldValue;
  74548. anim.to[propName] = newValue;
  74549. ++changeCount;
  74550. }
  74551. }
  74552. if (changeCount) {
  74553. if (me.isCollapsingOrExpanding === 1) {
  74554. target.componentLayout.undoLayout(me);
  74555. }
  74556. else {
  74557. me.writeProps(anim.from);
  74558. }
  74559. me.el.animate(anim);
  74560. Ext.fx.Manager.getFxQueue(me.el.id)[0].on({
  74561. afteranimate: function() {
  74562. if (me.isCollapsingOrExpanding === 1) {
  74563. target.componentLayout.redoLayout(me);
  74564. target.afterCollapse(true);
  74565. } else if (me.isCollapsingOrExpanding === 2) {
  74566. target.afterExpand(true);
  74567. }
  74568. }
  74569. });
  74570. }
  74571. }
  74572. },
  74573. getBorderInfo: function () {
  74574. var me = this,
  74575. info = me.borderInfo;
  74576. if (!info) {
  74577. me.borderInfo = info = me.checkCache('borderInfo');
  74578. }
  74579. return info;
  74580. },
  74581. getClassList: function () {
  74582. return this.classList || (this.classList = new Ext.layout.ClassList(this));
  74583. },
  74584. getEl: function (nameOrEl, owner) {
  74585. var me = this,
  74586. src, el, elContext;
  74587. if (nameOrEl) {
  74588. if (nameOrEl.dom) {
  74589. el = nameOrEl;
  74590. } else {
  74591. src = me.target;
  74592. if (owner) {
  74593. src = owner;
  74594. }
  74595. el = src[nameOrEl];
  74596. if (typeof el == 'function') {
  74597. el = el.call(src);
  74598. if (el === me.el) {
  74599. return this;
  74600. }
  74601. }
  74602. }
  74603. if (el) {
  74604. elContext = me.context.getEl(me, el);
  74605. }
  74606. }
  74607. return elContext || null;
  74608. },
  74609. getFraming: function () {
  74610. var me = this;
  74611. if (!me.framingInfo) {
  74612. me.framingInfo = me.target.frameSize || me.noFraming;
  74613. }
  74614. return me.framingInfo;
  74615. },
  74616. getFrameInfo: function () {
  74617. var me = this,
  74618. info = me.frameInfo,
  74619. frame, border;
  74620. if (!info) {
  74621. frame = me.getFraming();
  74622. border = me.getBorderInfo();
  74623. me.frameInfo = info = {
  74624. top : frame.top + border.top,
  74625. right : frame.right + border.right,
  74626. bottom: frame.bottom + border.bottom,
  74627. left : frame.left + border.left,
  74628. width : frame.width + border.width,
  74629. height: frame.height + border.height
  74630. };
  74631. }
  74632. return info;
  74633. },
  74634. getMarginInfo: function () {
  74635. var me = this,
  74636. info = me.marginInfo,
  74637. comp, manageMargins, margins, ownerLayout, ownerLayoutId;
  74638. if (!info) {
  74639. if (!me.wrapsComponent) {
  74640. info = me.checkCache('marginInfo');
  74641. } else {
  74642. comp = me.target;
  74643. ownerLayout = comp.ownerLayout;
  74644. ownerLayoutId = ownerLayout ? ownerLayout.id : null;
  74645. manageMargins = ownerLayout && ownerLayout.manageMargins;
  74646. info = comp.margin$;
  74647. if (info && info.ownerId !== ownerLayoutId) {
  74648. info = null;
  74649. }
  74650. if (!info) {
  74651. info = me.parseMargins(comp.margin) || me.checkCache('marginInfo');
  74652. if (manageMargins) {
  74653. margins = me.parseMargins(comp.margins, ownerLayout.defaultMargins);
  74654. if (margins) {
  74655. info = {
  74656. top: info.top + margins.top,
  74657. right: info.right + margins.right,
  74658. bottom: info.bottom + margins.bottom,
  74659. left: info.left + margins.left
  74660. };
  74661. }
  74662. me.setProp('margin-top', 0);
  74663. me.setProp('margin-right', 0);
  74664. me.setProp('margin-bottom', 0);
  74665. me.setProp('margin-left', 0);
  74666. }
  74667. info.ownerId = ownerLayoutId;
  74668. comp.margin$ = info;
  74669. }
  74670. info.width = info.left + info.right;
  74671. info.height = info.top + info.bottom;
  74672. }
  74673. me.marginInfo = info;
  74674. }
  74675. return info;
  74676. },
  74677. clearMarginCache: function() {
  74678. delete this.marginInfo;
  74679. delete this.target.margin$;
  74680. },
  74681. getPaddingInfo: function () {
  74682. var me = this,
  74683. info = me.paddingInfo;
  74684. if (!info) {
  74685. me.paddingInfo = info = me.checkCache('paddingInfo');
  74686. }
  74687. return info;
  74688. },
  74689. getProp: function (propName) {
  74690. var me = this,
  74691. result = me.props[propName];
  74692. me.addTrigger(propName);
  74693. return result;
  74694. },
  74695. getDomProp: function (propName) {
  74696. var me = this,
  74697. result = (me.dirty && (propName in me.dirty)) ? undefined : me.props[propName];
  74698. me.addTrigger(propName, true);
  74699. return result;
  74700. },
  74701. getStyle: function (styleName) {
  74702. var me = this,
  74703. styles = me.styles,
  74704. info, value;
  74705. if (styleName in styles) {
  74706. value = styles[styleName];
  74707. } else {
  74708. info = me.styleInfo[styleName];
  74709. value = me.el.getStyle(styleName);
  74710. if (info && info.parseInt) {
  74711. value = parseInt(value, 10) || 0;
  74712. }
  74713. styles[styleName] = value;
  74714. }
  74715. return value;
  74716. },
  74717. getStyles: function (styleNames, altNames) {
  74718. var me = this,
  74719. styleCache = me.styles,
  74720. values = {},
  74721. hits = 0,
  74722. n = styleNames.length,
  74723. i, missing, missingAltNames, name, info, styleInfo, styles, value;
  74724. altNames = altNames || styleNames;
  74725. for (i = 0; i < n; ++i) {
  74726. name = styleNames[i];
  74727. if (name in styleCache) {
  74728. values[altNames[i]] = styleCache[name];
  74729. ++hits;
  74730. if (i && hits==1) {
  74731. missing = styleNames.slice(0, i);
  74732. missingAltNames = altNames.slice(0, i);
  74733. }
  74734. } else if (hits) {
  74735. (missing || (missing = [])).push(name);
  74736. (missingAltNames || (missingAltNames = [])).push(altNames[i]);
  74737. }
  74738. }
  74739. if (hits < n) {
  74740. missing = missing || styleNames;
  74741. missingAltNames = missingAltNames || altNames;
  74742. styleInfo = me.styleInfo;
  74743. styles = me.el.getStyle(missing);
  74744. for (i = missing.length; i--; ) {
  74745. name = missing[i];
  74746. info = styleInfo[name];
  74747. value = styles[name];
  74748. if (info && info.parseInt) {
  74749. value = parseInt(value, 10) || 0;
  74750. }
  74751. values[missingAltNames[i]] = value;
  74752. styleCache[name] = value;
  74753. }
  74754. }
  74755. return values;
  74756. },
  74757. hasProp: function (propName) {
  74758. var value = this.getProp(propName);
  74759. return typeof value != 'undefined';
  74760. },
  74761. hasDomProp: function (propName) {
  74762. var value = this.getDomProp(propName);
  74763. return typeof value != 'undefined';
  74764. },
  74765. invalidate: function (options) {
  74766. this.context.queueInvalidate(this, options);
  74767. },
  74768. markDirty: function () {
  74769. if (++this.dirtyCount == 1) {
  74770. this.context.queueFlush(this);
  74771. }
  74772. },
  74773. onBoxMeasured: function () {
  74774. var boxParent = this.boxParent,
  74775. state = this.state;
  74776. if (boxParent && boxParent.widthModel.shrinkWrap && !state.boxMeasured && this.measuresBox) {
  74777. state.boxMeasured = 1;
  74778. boxParent.boxChildMeasured();
  74779. }
  74780. },
  74781. parseMargins: function (margins, defaultMargins) {
  74782. if (margins === true) {
  74783. margins = 5;
  74784. }
  74785. var type = typeof margins,
  74786. ret;
  74787. if (type == 'string' || type == 'number') {
  74788. ret = Ext.util.Format.parseBox(margins);
  74789. } else if (margins || defaultMargins) {
  74790. ret = { top: 0, right: 0, bottom: 0, left: 0 };
  74791. if (defaultMargins) {
  74792. Ext.apply(ret, this.parseMargins(defaultMargins));
  74793. }
  74794. Ext.apply(ret, margins);
  74795. }
  74796. return ret;
  74797. },
  74798. peek: function (propName) {
  74799. return this.props[propName];
  74800. },
  74801. recoverProp: function (propName, oldProps, oldDirty) {
  74802. var me = this,
  74803. props = me.props,
  74804. dirty;
  74805. if (propName in oldProps) {
  74806. props[propName] = oldProps[propName];
  74807. if (oldDirty && propName in oldDirty) {
  74808. dirty = me.dirty || (me.dirty = {});
  74809. dirty[propName] = oldDirty[propName];
  74810. }
  74811. }
  74812. },
  74813. redo: function(deep) {
  74814. var me = this,
  74815. items, len, i;
  74816. me.revertProps(me.props);
  74817. if (deep && me.wrapsComponent) {
  74818. if (me.childItems) {
  74819. for (i = 0, items = me.childItems, len = items.length; i < len; i++) {
  74820. items[i].redo(deep);
  74821. }
  74822. }
  74823. for (i = 0, items = me.children, len = items.length; i < len; i++) {
  74824. items[i].redo();
  74825. }
  74826. }
  74827. },
  74828. revertProps: function (props) {
  74829. var name,
  74830. flushed = this.flushedProps,
  74831. reverted = {};
  74832. for (name in props) {
  74833. if (flushed.hasOwnProperty(name)) {
  74834. reverted[name] = props[name];
  74835. }
  74836. }
  74837. this.writeProps(reverted);
  74838. },
  74839. setAttribute: function(name, value) {
  74840. var me = this;
  74841. if (!me.attributes) {
  74842. me.attributes = {};
  74843. }
  74844. me.attributes[name] = value;
  74845. me.markDirty();
  74846. },
  74847. setBox: function (box) {
  74848. var me = this;
  74849. if ('left' in box) {
  74850. me.setProp('x', box.left);
  74851. }
  74852. if ('top' in box) {
  74853. me.setProp('y', box.top);
  74854. }
  74855. me.setSize(box.width, box.height);
  74856. },
  74857. setContentHeight: function (height, measured) {
  74858. if (!measured && this.hasRawContent) {
  74859. return 1;
  74860. }
  74861. return this.setProp('contentHeight', height);
  74862. },
  74863. setContentWidth: function (width, measured) {
  74864. if (!measured && this.hasRawContent) {
  74865. return 1;
  74866. }
  74867. return this.setProp('contentWidth', width);
  74868. },
  74869. setContentSize: function (width, height, measured) {
  74870. return this.setContentWidth(width, measured) +
  74871. this.setContentHeight(height, measured) == 2;
  74872. },
  74873. setProp: function (propName, value, dirty) {
  74874. var me = this,
  74875. valueType = typeof value,
  74876. borderBox, info;
  74877. if (valueType == 'undefined' || (valueType === 'number' && isNaN(value))) {
  74878. return 0;
  74879. }
  74880. if (me.props[propName] === value) {
  74881. return 1;
  74882. }
  74883. me.props[propName] = value;
  74884. ++me.context.progressCount;
  74885. if (dirty === false) {
  74886. me.fireTriggers('domTriggers', propName);
  74887. me.clearBlocks('domBlocks', propName);
  74888. } else {
  74889. info = me.styleInfo[propName];
  74890. if (info) {
  74891. if (!me.dirty) {
  74892. me.dirty = {};
  74893. }
  74894. if (propName == 'width' || propName == 'height') {
  74895. borderBox = me.isBorderBoxValue;
  74896. if (borderBox == null) {
  74897. me.isBorderBoxValue = borderBox = !!me.el.isBorderBox();
  74898. }
  74899. if (!borderBox) {
  74900. me.borderInfo || me.getBorderInfo();
  74901. me.paddingInfo || me.getPaddingInfo();
  74902. }
  74903. }
  74904. me.dirty[propName] = value;
  74905. me.markDirty();
  74906. }
  74907. }
  74908. me.fireTriggers('triggers', propName);
  74909. me.clearBlocks('blocks', propName);
  74910. return 1;
  74911. },
  74912. setHeight: function (height, dirty ) {
  74913. var me = this,
  74914. comp = me.target,
  74915. frameBody, frameInfo, padding;
  74916. if (height < 0) {
  74917. height = 0;
  74918. }
  74919. if (!me.wrapsComponent) {
  74920. if (!me.setProp('height', height, dirty)) {
  74921. return NaN;
  74922. }
  74923. } else {
  74924. height = Ext.Number.constrain(height, comp.minHeight || 0, comp.maxHeight);
  74925. if (!me.setProp('height', height, dirty)) {
  74926. return NaN;
  74927. }
  74928. frameBody = me.frameBodyContext;
  74929. if (frameBody){
  74930. frameInfo = me.getFrameInfo();
  74931. frameBody.setHeight(height - frameInfo.height, dirty);
  74932. }
  74933. }
  74934. return height;
  74935. },
  74936. setWidth: function (width, dirty ) {
  74937. var me = this,
  74938. comp = me.target,
  74939. frameBody, frameInfo, padding;
  74940. if (width < 0) {
  74941. width = 0;
  74942. }
  74943. if (!me.wrapsComponent) {
  74944. if (!me.setProp('width', width, dirty)) {
  74945. return NaN;
  74946. }
  74947. } else {
  74948. width = Ext.Number.constrain(width, comp.minWidth || 0, comp.maxWidth);
  74949. if (!me.setProp('width', width, dirty)) {
  74950. return NaN;
  74951. }
  74952. frameBody = me.frameBodyContext;
  74953. if (frameBody) {
  74954. frameInfo = me.getFrameInfo();
  74955. frameBody.setWidth(width - frameInfo.width, dirty);
  74956. }
  74957. }
  74958. return width;
  74959. },
  74960. setSize: function (width, height, dirty) {
  74961. this.setWidth(width, dirty);
  74962. this.setHeight(height, dirty);
  74963. },
  74964. translateProps: {
  74965. x: 'left',
  74966. y: 'top'
  74967. },
  74968. undo: function(deep) {
  74969. var me = this,
  74970. items, len, i;
  74971. me.revertProps(me.lastBox);
  74972. if (deep && me.wrapsComponent) {
  74973. if (me.childItems) {
  74974. for (i = 0, items = me.childItems, len = items.length; i < len; i++) {
  74975. items[i].undo(deep);
  74976. }
  74977. }
  74978. for (i = 0, items = me.children, len = items.length; i < len; i++) {
  74979. items[i].undo();
  74980. }
  74981. }
  74982. },
  74983. unsetProp: function (propName) {
  74984. var dirty = this.dirty;
  74985. delete this.props[propName];
  74986. if (dirty) {
  74987. delete dirty[propName];
  74988. }
  74989. },
  74990. writeProps: function(dirtyProps, flushing) {
  74991. if (!(dirtyProps && typeof dirtyProps == 'object')) {
  74992. return;
  74993. }
  74994. var me = this,
  74995. el = me.el,
  74996. styles = {},
  74997. styleCount = 0,
  74998. styleInfo = me.styleInfo,
  74999. info,
  75000. propName,
  75001. numericValue,
  75002. dirtyX = 'x' in dirtyProps,
  75003. dirtyY = 'y' in dirtyProps,
  75004. x = dirtyProps.x,
  75005. y = dirtyProps.y,
  75006. width = dirtyProps.width,
  75007. height = dirtyProps.height,
  75008. isBorderBox = me.isBorderBoxValue,
  75009. target = me.target,
  75010. max = Math.max,
  75011. paddingWidth = 0,
  75012. paddingHeight = 0,
  75013. hasWidth, hasHeight, isAbsolute, scrollbarSize, style, targetEl;
  75014. if ('displayed' in dirtyProps) {
  75015. el.setDisplayed(dirtyProps.displayed);
  75016. }
  75017. for (propName in dirtyProps) {
  75018. if (flushing) {
  75019. me.fireTriggers('domTriggers', propName);
  75020. me.clearBlocks('domBlocks', propName);
  75021. me.flushedProps[propName] = 1;
  75022. }
  75023. info = styleInfo[propName];
  75024. if (info && info.dom) {
  75025. if (info.suffix && (numericValue = parseInt(dirtyProps[propName], 10))) {
  75026. styles[propName] = numericValue + info.suffix;
  75027. }
  75028. else {
  75029. styles[propName] = dirtyProps[propName];
  75030. }
  75031. ++styleCount;
  75032. }
  75033. }
  75034. if (dirtyX || dirtyY) {
  75035. if (target.isComponent) {
  75036. target.setPosition(x||me.props.x, y||me.props.y);
  75037. } else {
  75038. if (dirtyX) {
  75039. styles.left = x + 'px';
  75040. ++styleCount;
  75041. }
  75042. if (dirtyY) {
  75043. styles.top = y + 'px';
  75044. ++styleCount;
  75045. }
  75046. }
  75047. }
  75048. if (!isBorderBox && (width > 0 || height > 0)) {
  75049. if(!me.frameBodyContext) {
  75050. paddingWidth = me.paddingInfo.width;
  75051. paddingHeight = me.paddingInfo.height;
  75052. }
  75053. if (width) {
  75054. width = max(parseInt(width, 10) - (me.borderInfo.width + paddingWidth), 0);
  75055. styles.width = width + 'px';
  75056. ++styleCount;
  75057. }
  75058. if (height) {
  75059. height = max(parseInt(height, 10) - (me.borderInfo.height + paddingHeight), 0);
  75060. styles.height = height + 'px';
  75061. ++styleCount;
  75062. }
  75063. }
  75064. if (me.wrapsComponent && Ext.isIE9 && Ext.isStrict) {
  75065. if ((hasWidth = width !== undefined && me.hasOverflowY) ||
  75066. (hasHeight = height !== undefined && me.hasOverflowX)) {
  75067. isAbsolute = me.isAbsolute;
  75068. if (isAbsolute === undefined) {
  75069. isAbsolute = false;
  75070. targetEl = me.target.getTargetEl();
  75071. style = targetEl.getStyle('position');
  75072. if (style == 'absolute') {
  75073. style = targetEl.getStyle('box-sizing');
  75074. isAbsolute = (style == 'border-box');
  75075. }
  75076. me.isAbsolute = isAbsolute;
  75077. }
  75078. if (isAbsolute) {
  75079. scrollbarSize = Ext.getScrollbarSize();
  75080. if (hasWidth) {
  75081. width = parseInt(width, 10) + scrollbarSize.width;
  75082. styles.width = width + 'px';
  75083. ++styleCount;
  75084. }
  75085. if (hasHeight) {
  75086. height = parseInt(height, 10) + scrollbarSize.height;
  75087. styles.height = height + 'px';
  75088. ++styleCount;
  75089. }
  75090. }
  75091. }
  75092. }
  75093. if (styleCount) {
  75094. el.setStyle(styles);
  75095. }
  75096. }
  75097. }, function () {
  75098. var px = { dom: true, parseInt: true, suffix: 'px' },
  75099. isDom = { dom: true },
  75100. faux = { dom: false };
  75101. this.prototype.styleInfo = {
  75102. childrenDone: faux,
  75103. componentChildrenDone: faux,
  75104. containerChildrenDone: faux,
  75105. containerLayoutDone: faux,
  75106. displayed: faux,
  75107. done: faux,
  75108. x: faux,
  75109. y: faux,
  75110. columnWidthsDone: faux,
  75111. left: px,
  75112. top: px,
  75113. right: px,
  75114. bottom: px,
  75115. width: px,
  75116. height: px,
  75117. 'border-top-width': px,
  75118. 'border-right-width': px,
  75119. 'border-bottom-width': px,
  75120. 'border-left-width': px,
  75121. 'margin-top': px,
  75122. 'margin-right': px,
  75123. 'margin-bottom': px,
  75124. 'margin-left': px,
  75125. 'padding-top': px,
  75126. 'padding-right': px,
  75127. 'padding-bottom': px,
  75128. 'padding-left': px,
  75129. 'line-height': isDom,
  75130. display: isDom
  75131. };
  75132. });
  75133. Ext.define('Ext.layout.Context', {
  75134. requires: [
  75135. 'Ext.util.Queue',
  75136. 'Ext.layout.ContextItem',
  75137. 'Ext.layout.Layout',
  75138. 'Ext.fx.Anim',
  75139. 'Ext.fx.Manager'
  75140. ],
  75141. remainingLayouts: 0,
  75142. state: 0,
  75143. constructor: function (config) {
  75144. var me = this;
  75145. Ext.apply(me, config);
  75146. me.items = {};
  75147. me.layouts = {};
  75148. me.blockCount = 0;
  75149. me.cycleCount = 0;
  75150. me.flushCount = 0;
  75151. me.calcCount = 0;
  75152. me.animateQueue = me.newQueue();
  75153. me.completionQueue = me.newQueue();
  75154. me.finalizeQueue = me.newQueue();
  75155. me.finishQueue = me.newQueue();
  75156. me.flushQueue = me.newQueue();
  75157. me.invalidateData = {};
  75158. me.layoutQueue = me.newQueue();
  75159. me.invalidQueue = [];
  75160. me.triggers = {
  75161. data: {
  75162. },
  75163. dom: {}
  75164. };
  75165. },
  75166. callLayout: function (layout, methodName) {
  75167. this.currentLayout = layout;
  75168. layout[methodName](this.getCmp(layout.owner));
  75169. },
  75170. cancelComponent: function (comp, isChild, isDestroying) {
  75171. var me = this,
  75172. components = comp,
  75173. isArray = !comp.isComponent,
  75174. length = isArray ? components.length : 1,
  75175. i, k, klen, items, layout, newQueue, oldQueue, entry, temp,
  75176. ownerCtContext;
  75177. for (i = 0; i < length; ++i) {
  75178. if (isArray) {
  75179. comp = components[i];
  75180. }
  75181. if (isDestroying && comp.ownerCt) {
  75182. ownerCtContext = this.items[comp.ownerCt.el.id];
  75183. if (ownerCtContext) {
  75184. Ext.Array.remove(ownerCtContext.childItems, me.getCmp(comp));
  75185. }
  75186. }
  75187. if (!isChild) {
  75188. oldQueue = me.invalidQueue;
  75189. klen = oldQueue.length;
  75190. if (klen) {
  75191. me.invalidQueue = newQueue = [];
  75192. for (k = 0; k < klen; ++k) {
  75193. entry = oldQueue[k];
  75194. temp = entry.item.target;
  75195. if (temp != comp && !temp.isDescendant(comp)) {
  75196. newQueue.push(entry);
  75197. }
  75198. }
  75199. }
  75200. }
  75201. layout = comp.componentLayout;
  75202. me.cancelLayout(layout);
  75203. if (layout.getLayoutItems) {
  75204. items = layout.getLayoutItems();
  75205. if (items.length) {
  75206. me.cancelComponent(items, true);
  75207. }
  75208. }
  75209. if (comp.isContainer && !comp.collapsed) {
  75210. layout = comp.layout;
  75211. me.cancelLayout(layout);
  75212. items = layout.getVisibleItems();
  75213. if (items.length) {
  75214. me.cancelComponent(items, true);
  75215. }
  75216. }
  75217. }
  75218. },
  75219. cancelLayout: function (layout) {
  75220. var me = this;
  75221. me.completionQueue.remove(layout);
  75222. me.finalizeQueue.remove(layout);
  75223. me.finishQueue.remove(layout);
  75224. me.layoutQueue.remove(layout);
  75225. if (layout.running) {
  75226. me.layoutDone(layout);
  75227. }
  75228. layout.ownerContext = null;
  75229. },
  75230. clearTriggers: function (layout, inDom) {
  75231. var id = layout.id,
  75232. collection = this.triggers[inDom ? 'dom' : 'data'],
  75233. triggers = collection && collection[id],
  75234. length = (triggers && triggers.length) || 0,
  75235. collection, i, item, trigger;
  75236. for (i = 0; i < length; ++i) {
  75237. trigger = triggers[i];
  75238. item = trigger.item;
  75239. collection = inDom ? item.domTriggers : item.triggers;
  75240. delete collection[trigger.prop][id];
  75241. }
  75242. },
  75243. flush: function () {
  75244. var me = this,
  75245. items = me.flushQueue.clear(),
  75246. length = items.length, i;
  75247. if (length) {
  75248. ++me.flushCount;
  75249. for (i = 0; i < length; ++i) {
  75250. items[i].flush();
  75251. }
  75252. }
  75253. },
  75254. flushAnimations: function() {
  75255. var me = this,
  75256. items = me.animateQueue.clear(),
  75257. len = items.length,
  75258. i;
  75259. if (len) {
  75260. for (i = 0; i < len; i++) {
  75261. if (items[i].target.animate !== false) {
  75262. items[i].flushAnimations();
  75263. }
  75264. }
  75265. Ext.fx.Manager.runner();
  75266. }
  75267. },
  75268. flushInvalidates: function () {
  75269. var me = this,
  75270. queue = me.invalidQueue,
  75271. length = queue && queue.length,
  75272. comp, components, entry, i;
  75273. me.invalidQueue = [];
  75274. if (length) {
  75275. components = [];
  75276. for (i = 0; i < length; ++i) {
  75277. comp = (entry = queue[i]).item.target;
  75278. if (!comp.container.isDetachedBody) {
  75279. components.push(comp);
  75280. if (entry.options) {
  75281. me.invalidateData[comp.id] = entry.options;
  75282. }
  75283. }
  75284. }
  75285. me.invalidate(components, null);
  75286. }
  75287. },
  75288. flushLayouts: function (queueName, methodName, dontClear) {
  75289. var me = this,
  75290. layouts = dontClear ? me[queueName].items : me[queueName].clear(),
  75291. length = layouts.length,
  75292. i, layout;
  75293. if (length) {
  75294. for (i = 0; i < length; ++i) {
  75295. layout = layouts[i];
  75296. if (!layout.running) {
  75297. me.callLayout(layout, methodName);
  75298. }
  75299. }
  75300. me.currentLayout = null;
  75301. }
  75302. },
  75303. getCmp: function (cmp) {
  75304. return this.getItem(cmp, cmp.el);
  75305. },
  75306. getEl: function (parent, el) {
  75307. var item = this.getItem(el, el);
  75308. if (!item.parent) {
  75309. item.parent = parent;
  75310. if (parent.children.length) {
  75311. parent.children.push(item);
  75312. } else {
  75313. parent.children = [ item ];
  75314. }
  75315. }
  75316. return item;
  75317. },
  75318. getItem: function (target, el) {
  75319. var id = el.id,
  75320. items = this.items,
  75321. item = items[id] ||
  75322. (items[id] = new Ext.layout.ContextItem({
  75323. context: this,
  75324. target: target,
  75325. el: el
  75326. }));
  75327. return item;
  75328. },
  75329. handleFailure: function () {
  75330. var layouts = this.layouts,
  75331. layout, key;
  75332. Ext.failedLayouts = (Ext.failedLayouts || 0) + 1;
  75333. for (key in layouts) {
  75334. layout = layouts[key];
  75335. if (layouts.hasOwnProperty(key)) {
  75336. layout.running = false;
  75337. layout.ownerContext = null;
  75338. }
  75339. }
  75340. },
  75341. invalidate: function (components, full) {
  75342. var me = this,
  75343. isArray = !components.isComponent,
  75344. componentChildrenDone, containerChildrenDone, containerLayoutDone,
  75345. firstTime, i, comp, item, items, length, componentLayout, layout,
  75346. invalidateOptions, token;
  75347. for (i = 0, length = isArray ? components.length : 1; i < length; ++i) {
  75348. comp = isArray ? components[i] : components;
  75349. if (comp.rendered && !comp.hidden) {
  75350. item = me.getCmp(comp);
  75351. componentLayout = comp.componentLayout;
  75352. firstTime = !componentLayout.ownerContext;
  75353. layout = (comp.isContainer && !comp.collapsed) ? comp.layout : null;
  75354. invalidateOptions = me.invalidateData[item.id];
  75355. delete me.invalidateData[item.id];
  75356. token = item.init(full, invalidateOptions);
  75357. if (invalidateOptions) {
  75358. me.processInvalidate(invalidateOptions, item, 'before');
  75359. }
  75360. if (componentLayout.beforeLayoutCycle) {
  75361. componentLayout.beforeLayoutCycle(item);
  75362. }
  75363. token = item.initContinue(token);
  75364. componentChildrenDone = containerChildrenDone = containerLayoutDone = true;
  75365. if (componentLayout.getLayoutItems) {
  75366. componentLayout.renderChildren();
  75367. items = componentLayout.getLayoutItems();
  75368. if (items.length) {
  75369. me.invalidate(items, true);
  75370. componentChildrenDone = false;
  75371. }
  75372. }
  75373. if (layout) {
  75374. containerLayoutDone = false;
  75375. layout.renderChildren();
  75376. items = layout.getVisibleItems();
  75377. if (items.length) {
  75378. me.invalidate(items, true);
  75379. containerChildrenDone = false;
  75380. }
  75381. }
  75382. item.initDone(token, componentChildrenDone, containerChildrenDone,
  75383. containerLayoutDone);
  75384. me.resetLayout(componentLayout, item, firstTime);
  75385. if (layout) {
  75386. me.resetLayout(layout, item, firstTime);
  75387. }
  75388. item.initAnimation();
  75389. if (invalidateOptions) {
  75390. me.processInvalidate(invalidateOptions, item, 'after');
  75391. }
  75392. }
  75393. }
  75394. me.currentLayout = null;
  75395. },
  75396. layoutDone: function (layout) {
  75397. var ownerContext = layout.ownerContext,
  75398. ownerCtContext;
  75399. layout.running = false;
  75400. if (layout.isComponentLayout) {
  75401. if (ownerContext.measuresBox) {
  75402. ownerContext.onBoxMeasured();
  75403. }
  75404. ownerContext.setProp('done', true);
  75405. ownerCtContext = ownerContext.ownerCtContext;
  75406. if (ownerCtContext) {
  75407. if (ownerContext.target.ownerLayout.isComponentLayout) {
  75408. if (! --ownerCtContext.remainingComponentChildLayouts) {
  75409. ownerCtContext.setProp('componentChildrenDone', true);
  75410. }
  75411. } else {
  75412. if (! --ownerCtContext.remainingContainerChildLayouts) {
  75413. ownerCtContext.setProp('containerChildrenDone', true);
  75414. }
  75415. }
  75416. if (! --ownerCtContext.remainingChildLayouts) {
  75417. ownerCtContext.setProp('childrenDone', true);
  75418. }
  75419. }
  75420. } else {
  75421. ownerContext.setProp('containerLayoutDone', true);
  75422. }
  75423. --this.remainingLayouts;
  75424. ++this.progressCount;
  75425. },
  75426. newQueue: function () {
  75427. return new Ext.util.Queue();
  75428. },
  75429. processInvalidate: function (options, item, name) {
  75430. if (options[name]) {
  75431. var me = this,
  75432. currentLayout = me.currentLayout;
  75433. me.currentLayout = options.layout || null;
  75434. options[name](item, options);
  75435. me.currentLayout = currentLayout;
  75436. }
  75437. },
  75438. queueAnimation: function (item) {
  75439. this.animateQueue.add(item);
  75440. },
  75441. queueCompletion: function (layout) {
  75442. this.completionQueue.add(layout);
  75443. },
  75444. queueFinalize: function (layout) {
  75445. this.finalizeQueue.add(layout);
  75446. },
  75447. queueFlush: function (item) {
  75448. this.flushQueue.add(item);
  75449. },
  75450. chainFns: function (oldOptions, newOptions, funcName) {
  75451. var me = this,
  75452. oldLayout = oldOptions.layout,
  75453. newLayout = newOptions.layout,
  75454. oldFn = oldOptions[funcName],
  75455. newFn = newOptions[funcName];
  75456. return function (contextItem) {
  75457. var prev = me.currentLayout;
  75458. if (oldFn) {
  75459. me.currentLayout = oldLayout;
  75460. oldFn.call(oldOptions.scope || oldOptions, contextItem, oldOptions);
  75461. }
  75462. me.currentLayout = newLayout;
  75463. newFn.call(newOptions.scope || newOptions, contextItem, newOptions);
  75464. me.currentLayout = prev;
  75465. };
  75466. },
  75467. queueInvalidate: function (item, options) {
  75468. var me = this,
  75469. newQueue = [],
  75470. oldQueue = me.invalidQueue,
  75471. index = oldQueue.length,
  75472. comp, old, oldComp, oldOptions, oldState;
  75473. if (item.isComponent) {
  75474. item = me.getCmp(comp = item);
  75475. } else {
  75476. comp = item.target;
  75477. }
  75478. item.invalid = true;
  75479. while (index--) {
  75480. old = oldQueue[index];
  75481. oldComp = old.item.target;
  75482. if (comp.isDescendant(oldComp)) {
  75483. return;
  75484. }
  75485. if (oldComp == comp) {
  75486. if (!(oldOptions = old.options)) {
  75487. old.options = options;
  75488. } else if (options) {
  75489. if (options.widthModel) {
  75490. oldOptions.widthModel = options.widthModel;
  75491. }
  75492. if (options.heightModel) {
  75493. oldOptions.heightModel = options.heightModel;
  75494. }
  75495. if (!(oldState = oldOptions.state)) {
  75496. oldOptions.state = options.state;
  75497. } else if (options.state) {
  75498. Ext.apply(oldState, options.state);
  75499. }
  75500. if (options.before) {
  75501. oldOptions.before = me.chainFns(oldOptions, options, 'before');
  75502. }
  75503. if (options.after) {
  75504. oldOptions.after = me.chainFns(oldOptions, options, 'after');
  75505. }
  75506. }
  75507. return;
  75508. }
  75509. if (!oldComp.isDescendant(comp)) {
  75510. newQueue.push(old);
  75511. }
  75512. }
  75513. newQueue.push({ item: item, options: options });
  75514. me.invalidQueue = newQueue;
  75515. },
  75516. queueItemLayouts: function (item) {
  75517. var comp = item.isComponent ? item : item.target,
  75518. layout = comp.componentLayout;
  75519. if (!layout.pending && !layout.invalid && !layout.done) {
  75520. this.queueLayout(layout);
  75521. }
  75522. layout = comp.layout;
  75523. if (layout && !layout.pending && !layout.invalid && !layout.done) {
  75524. this.queueLayout(layout);
  75525. }
  75526. },
  75527. queueLayout: function (layout) {
  75528. this.layoutQueue.add(layout);
  75529. layout.pending = true;
  75530. },
  75531. resetLayout: function (layout, ownerContext, firstTime) {
  75532. var me = this,
  75533. ownerCtContext;
  75534. me.currentLayout = layout;
  75535. layout.done = false;
  75536. layout.pending = true;
  75537. layout.firedTriggers = 0;
  75538. me.layoutQueue.add(layout);
  75539. if (firstTime) {
  75540. me.layouts[layout.id] = layout;
  75541. layout.running = true;
  75542. if (layout.finishedLayout) {
  75543. me.finishQueue.add(layout);
  75544. }
  75545. ++me.remainingLayouts;
  75546. ++layout.layoutCount;
  75547. layout.ownerContext = ownerContext;
  75548. layout.beginCount = 0;
  75549. layout.blockCount = 0;
  75550. layout.calcCount = 0;
  75551. layout.triggerCount = 0;
  75552. if (layout.isComponentLayout && (ownerCtContext = ownerContext.ownerCtContext)) {
  75553. if (ownerContext.target.ownerLayout.isComponentLayout) {
  75554. ++ownerCtContext.remainingComponentChildLayouts;
  75555. } else {
  75556. ++ownerCtContext.remainingContainerChildLayouts;
  75557. }
  75558. ++ownerCtContext.remainingChildLayouts;
  75559. }
  75560. if (!layout.initialized) {
  75561. layout.initLayout();
  75562. }
  75563. layout.beginLayout(ownerContext);
  75564. } else {
  75565. ++layout.beginCount;
  75566. if (!layout.running) {
  75567. ++me.remainingLayouts;
  75568. layout.running = true;
  75569. if (layout.isComponentLayout) {
  75570. ownerContext.unsetProp('done');
  75571. ownerCtContext = ownerContext.ownerCtContext;
  75572. if (ownerCtContext) {
  75573. if (ownerContext.target.ownerLayout.isComponentLayout) {
  75574. if (++ownerCtContext.remainingComponentChildLayouts == 1) {
  75575. ownerCtContext.unsetProp('componentChildrenDone');
  75576. }
  75577. } else {
  75578. if (++ownerCtContext.remainingContainerChildLayouts == 1) {
  75579. ownerCtContext.unsetProp('containerChildrenDone');
  75580. }
  75581. }
  75582. if (++ownerCtContext.remainingChildLayouts == 1) {
  75583. ownerCtContext.unsetProp('childrenDone');
  75584. }
  75585. }
  75586. }
  75587. me.completionQueue.remove(layout);
  75588. me.finalizeQueue.remove(layout);
  75589. }
  75590. }
  75591. layout.beginLayoutCycle(ownerContext, firstTime);
  75592. },
  75593. run: function () {
  75594. var me = this,
  75595. flushed = false,
  75596. watchDog = 100;
  75597. me.flushInvalidates();
  75598. me.state = 1;
  75599. me.totalCount = me.layoutQueue.getCount();
  75600. me.flush();
  75601. while ((me.remainingLayouts || me.invalidQueue.length) && watchDog--) {
  75602. if (me.invalidQueue.length) {
  75603. me.flushInvalidates();
  75604. }
  75605. if (me.runCycle()) {
  75606. flushed = false;
  75607. } else if (!flushed) {
  75608. me.flush();
  75609. flushed = true;
  75610. me.flushLayouts('completionQueue', 'completeLayout');
  75611. } else {
  75612. me.state = 2;
  75613. break;
  75614. }
  75615. if (!(me.remainingLayouts || me.invalidQueue.length)) {
  75616. me.flush();
  75617. me.flushLayouts('completionQueue', 'completeLayout');
  75618. me.flushLayouts('finalizeQueue', 'finalizeLayout');
  75619. }
  75620. }
  75621. return me.runComplete();
  75622. },
  75623. runComplete: function () {
  75624. var me = this;
  75625. me.state = 2;
  75626. if (me.remainingLayouts) {
  75627. me.handleFailure();
  75628. return false;
  75629. }
  75630. me.flush();
  75631. me.flushLayouts('finishQueue', 'finishedLayout', true);
  75632. me.flushLayouts('finishQueue', 'notifyOwner');
  75633. me.flush();
  75634. me.flushAnimations();
  75635. return true;
  75636. },
  75637. runCycle: function () {
  75638. var me = this,
  75639. layouts = me.layoutQueue.clear(),
  75640. length = layouts.length,
  75641. i;
  75642. ++me.cycleCount;
  75643. me.progressCount = 0;
  75644. for (i = 0; i < length; ++i) {
  75645. me.runLayout(me.currentLayout = layouts[i]);
  75646. }
  75647. me.currentLayout = null;
  75648. return me.progressCount > 0;
  75649. },
  75650. runLayout: function (layout) {
  75651. var me = this,
  75652. ownerContext = me.getCmp(layout.owner);
  75653. layout.pending = false;
  75654. if (ownerContext.state.blocks) {
  75655. return;
  75656. }
  75657. layout.done = true;
  75658. ++layout.calcCount;
  75659. ++me.calcCount;
  75660. if(layout.calculate){
  75661. layout.calculate(ownerContext);
  75662. }
  75663. if (layout.done) {
  75664. me.layoutDone(layout);
  75665. if (layout.completeLayout) {
  75666. me.queueCompletion(layout);
  75667. }
  75668. if (layout.finalizeLayout) {
  75669. me.queueFinalize(layout);
  75670. }
  75671. } else if (!layout.pending && !layout.invalid && !(layout.blockCount + layout.triggerCount - layout.firedTriggers)) {
  75672. me.queueLayout(layout);
  75673. }
  75674. },
  75675. setItemSize: function(item, width, height) {
  75676. var items = item,
  75677. len = 1,
  75678. contextItem, i;
  75679. if (item.isComposite) {
  75680. items = item.elements;
  75681. len = items.length;
  75682. item = items[0];
  75683. } else if (!item.dom && !item.el) {
  75684. len = items.length;
  75685. item = items[0];
  75686. }
  75687. for (i = 0; i < len; ) {
  75688. contextItem = this.get(item);
  75689. contextItem.setSize(width, height);
  75690. item = items[++i];
  75691. }
  75692. }
  75693. });
  75694. Ext.define('Ext.layout.component.Tab', {
  75695. extend: 'Ext.layout.component.Button',
  75696. alias: 'layout.tab',
  75697. beginLayout: function(ownerContext) {
  75698. var me = this,
  75699. closable = me.owner.closable;
  75700. if (me.lastClosable !== closable) {
  75701. me.lastClosable = closable;
  75702. me.clearTargetCache();
  75703. }
  75704. me.callParent(arguments);
  75705. }
  75706. });
  75707. Ext.define('Ext.layout.component.field.Slider', {
  75708. alias: ['layout.sliderfield'],
  75709. extend: 'Ext.layout.component.field.Field',
  75710. type: 'sliderfield',
  75711. beginLayout: function(ownerContext) {
  75712. this.callParent(arguments);
  75713. ownerContext.endElContext = ownerContext.getEl('endEl');
  75714. ownerContext.innerElContext = ownerContext.getEl('innerEl');
  75715. ownerContext.bodyElContext = ownerContext.getEl('bodyEl');
  75716. },
  75717. publishInnerHeight: function (ownerContext, height) {
  75718. var innerHeight = height - this.measureLabelErrorHeight(ownerContext),
  75719. endElPad,
  75720. inputPad;
  75721. if (this.owner.vertical) {
  75722. endElPad = ownerContext.endElContext.getPaddingInfo();
  75723. inputPad = ownerContext.inputContext.getPaddingInfo();
  75724. ownerContext.innerElContext.setHeight(innerHeight - inputPad.height - endElPad.height);
  75725. } else {
  75726. ownerContext.bodyElContext.setHeight(innerHeight);
  75727. }
  75728. },
  75729. publishInnerWidth: function (ownerContext, width) {
  75730. if (!this.owner.vertical) {
  75731. var endElPad = ownerContext.endElContext.getPaddingInfo(),
  75732. inputPad = ownerContext.inputContext.getPaddingInfo();
  75733. ownerContext.innerElContext.setWidth(width - inputPad.left - endElPad.right - ownerContext.labelContext.getProp('width'));
  75734. }
  75735. },
  75736. beginLayoutFixed: function(ownerContext, width, suffix) {
  75737. var me = this,
  75738. ieInputWidthAdjustment = me.ieInputWidthAdjustment;
  75739. if (ieInputWidthAdjustment) {
  75740. me.owner.bodyEl.setStyle('padding-right', ieInputWidthAdjustment + 'px');
  75741. }
  75742. me.callParent(arguments);
  75743. }
  75744. });
  75745. Ext.define('Ext.layout.container.Absolute', {
  75746. alias: 'layout.absolute',
  75747. extend: 'Ext.layout.container.Anchor',
  75748. alternateClassName: 'Ext.layout.AbsoluteLayout',
  75749. targetCls: Ext.baseCSSPrefix + 'abs-layout-ct',
  75750. itemCls: Ext.baseCSSPrefix + 'abs-layout-item',
  75751. ignoreOnContentChange: true,
  75752. type: 'absolute',
  75753. adjustWidthAnchor: function(value, childContext) {
  75754. var padding = this.targetPadding,
  75755. x = childContext.getStyle('left');
  75756. return value - x + padding.left;
  75757. },
  75758. adjustHeightAnchor: function(value, childContext) {
  75759. var padding = this.targetPadding,
  75760. y = childContext.getStyle('top');
  75761. return value - y + padding.top;
  75762. },
  75763. isItemLayoutRoot: function (item) {
  75764. return this.ignoreOnContentChange || this.callParent(arguments);
  75765. },
  75766. isItemShrinkWrap: function (item) {
  75767. return true;
  75768. },
  75769. beginLayout: function (ownerContext) {
  75770. var me = this,
  75771. target = me.getTarget();
  75772. me.callParent(arguments);
  75773. if (target.dom !== document.body) {
  75774. target.position();
  75775. }
  75776. me.targetPadding = ownerContext.targetContext.getPaddingInfo();
  75777. },
  75778. isItemBoxParent: function (itemContext) {
  75779. return true;
  75780. },
  75781. onContentChange: function () {
  75782. if (this.ignoreOnContentChange) {
  75783. return false;
  75784. }
  75785. return this.callParent(arguments);
  75786. }
  75787. });
  75788. Ext.define('Ext.layout.container.Accordion', {
  75789. extend: 'Ext.layout.container.VBox',
  75790. alias: ['layout.accordion'],
  75791. alternateClassName: 'Ext.layout.AccordionLayout',
  75792. itemCls: [Ext.baseCSSPrefix + 'box-item', Ext.baseCSSPrefix + 'accordion-item'],
  75793. align: 'stretch',
  75794. fill : true,
  75795. titleCollapse : true,
  75796. hideCollapseTool : false,
  75797. collapseFirst : false,
  75798. animate : true,
  75799. activeOnTop : false,
  75800. multi: false,
  75801. defaultAnimatePolicy: {
  75802. y: true,
  75803. height: true
  75804. },
  75805. constructor: function() {
  75806. var me = this;
  75807. me.callParent(arguments);
  75808. if (me.animate) {
  75809. me.animatePolicy = Ext.apply({}, me.defaultAnimatePolicy);
  75810. } else {
  75811. me.animatePolicy = null;
  75812. }
  75813. },
  75814. beforeRenderItems: function (items) {
  75815. var me = this,
  75816. ln = items.length,
  75817. i = 0,
  75818. comp;
  75819. for (; i < ln; i++) {
  75820. comp = items[i];
  75821. if (!comp.rendered) {
  75822. if (me.collapseFirst) {
  75823. comp.collapseFirst = me.collapseFirst;
  75824. }
  75825. if (me.hideCollapseTool) {
  75826. comp.hideCollapseTool = me.hideCollapseTool;
  75827. comp.titleCollapse = true;
  75828. }
  75829. else if (me.titleCollapse) {
  75830. comp.titleCollapse = me.titleCollapse;
  75831. }
  75832. delete comp.hideHeader;
  75833. delete comp.width;
  75834. comp.collapsible = true;
  75835. comp.title = comp.title || '&#160;';
  75836. comp.addBodyCls(Ext.baseCSSPrefix + 'accordion-body');
  75837. if (!me.multi) {
  75838. if (me.expandedItem !== undefined) {
  75839. comp.collapsed = true;
  75840. }
  75841. else if (comp.hasOwnProperty('collapsed') && comp.collapsed === false) {
  75842. me.expandedItem = i;
  75843. } else {
  75844. comp.collapsed = true;
  75845. }
  75846. me.owner.mon(comp, {
  75847. show: me.onComponentShow,
  75848. beforeexpand: me.onComponentExpand,
  75849. scope: me
  75850. });
  75851. }
  75852. if (me.fill) {
  75853. me.owner.mon(comp, {
  75854. beforecollapse: me.onComponentCollapse,
  75855. scope: me
  75856. });
  75857. }
  75858. }
  75859. }
  75860. if (ln && me.expandedItem === undefined) {
  75861. me.expandedItem = 0;
  75862. items[0].collapsed = false;
  75863. }
  75864. },
  75865. getItemsRenderTree: function(items) {
  75866. this.beforeRenderItems(items);
  75867. return this.callParent(arguments);
  75868. },
  75869. renderItems : function(items, target) {
  75870. this.beforeRenderItems(items);
  75871. this.callParent(arguments);
  75872. },
  75873. configureItem: function(item) {
  75874. this.callParent(arguments);
  75875. item.animCollapse = item.border = false;
  75876. if (this.fill) {
  75877. item.flex = 1;
  75878. }
  75879. },
  75880. onChildPanelRender: function(panel) {
  75881. panel.header.addCls(Ext.baseCSSPrefix + 'accordion-hd');
  75882. },
  75883. beginLayout: function (ownerContext) {
  75884. this.callParent(arguments);
  75885. this.updatePanelClasses(ownerContext);
  75886. },
  75887. updatePanelClasses: function(ownerContext) {
  75888. var children = ownerContext.visibleItems,
  75889. ln = children.length,
  75890. siblingCollapsed = true,
  75891. i, child, header;
  75892. for (i = 0; i < ln; i++) {
  75893. child = children[i];
  75894. header = child.header;
  75895. header.addCls(Ext.baseCSSPrefix + 'accordion-hd');
  75896. if (siblingCollapsed) {
  75897. header.removeCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded');
  75898. } else {
  75899. header.addCls(Ext.baseCSSPrefix + 'accordion-hd-sibling-expanded');
  75900. }
  75901. if (i + 1 == ln && child.collapsed) {
  75902. header.addCls(Ext.baseCSSPrefix + 'accordion-hd-last-collapsed');
  75903. } else {
  75904. header.removeCls(Ext.baseCSSPrefix + 'accordion-hd-last-collapsed');
  75905. }
  75906. siblingCollapsed = child.collapsed;
  75907. }
  75908. },
  75909. onComponentExpand: function(toExpand) {
  75910. var me = this,
  75911. owner = me.owner,
  75912. expanded,
  75913. expandedCount, i,
  75914. previousValue;
  75915. if (!me.processing) {
  75916. me.processing = true;
  75917. previousValue = owner.deferLayouts;
  75918. owner.deferLayouts = true;
  75919. expanded = me.multi ? [] : owner.query('>panel:not([collapsed])');
  75920. expandedCount = expanded.length;
  75921. for (i = 0; i < expandedCount; i++) {
  75922. expanded[i].collapse();
  75923. }
  75924. owner.deferLayouts = previousValue;
  75925. me.processing = false;
  75926. }
  75927. },
  75928. onComponentCollapse: function(comp) {
  75929. var me = this,
  75930. owner = me.owner,
  75931. toExpand,
  75932. expanded,
  75933. previousValue;
  75934. if (me.owner.items.getCount() === 1) {
  75935. return false;
  75936. }
  75937. if (!me.processing) {
  75938. me.processing = true;
  75939. previousValue = owner.deferLayouts;
  75940. owner.deferLayouts = true;
  75941. toExpand = comp.next() || comp.prev();
  75942. if (me.multi) {
  75943. expanded = me.owner.query('>panel:not([collapsed])');
  75944. if (expanded.length === 1) {
  75945. toExpand.expand();
  75946. }
  75947. } else if (toExpand) {
  75948. toExpand.expand();
  75949. }
  75950. owner.deferLayouts = previousValue;
  75951. me.processing = false;
  75952. }
  75953. },
  75954. onComponentShow: function(comp) {
  75955. this.onComponentExpand(comp);
  75956. }
  75957. });
  75958. Ext.define('Ext.resizer.Splitter', {
  75959. extend: 'Ext.Component',
  75960. requires: ['Ext.XTemplate'],
  75961. uses: ['Ext.resizer.SplitterTracker'],
  75962. alias: 'widget.splitter',
  75963. childEls: [
  75964. 'collapseEl'
  75965. ],
  75966. renderTpl: [
  75967. '<tpl if="collapsible===true">',
  75968. '<div id="{id}-collapseEl" class="', Ext.baseCSSPrefix, 'collapse-el ',
  75969. Ext.baseCSSPrefix, 'layout-split-{collapseDir}">&#160;</div>',
  75970. '</tpl>'
  75971. ],
  75972. baseCls: Ext.baseCSSPrefix + 'splitter',
  75973. collapsedClsInternal: Ext.baseCSSPrefix + 'splitter-collapsed',
  75974. canResize: true,
  75975. collapsible: false,
  75976. collapseOnDblClick: true,
  75977. defaultSplitMin: 40,
  75978. defaultSplitMax: 1000,
  75979. collapseTarget: 'next',
  75980. horizontal: false,
  75981. vertical: false,
  75982. getTrackerConfig: function () {
  75983. return {
  75984. xclass: 'Ext.resizer.SplitterTracker',
  75985. el: this.el,
  75986. splitter: this
  75987. };
  75988. },
  75989. beforeRender: function() {
  75990. var me = this,
  75991. target = me.getCollapseTarget(),
  75992. collapseDir = me.getCollapseDirection(),
  75993. vertical = me.vertical,
  75994. fixedSizeProp = vertical ? 'width' : 'height',
  75995. stretchSizeProp = vertical ? 'height' : 'width',
  75996. cls;
  75997. me.callParent();
  75998. if (!me.hasOwnProperty(stretchSizeProp)) {
  75999. me[stretchSizeProp] = '100%';
  76000. }
  76001. if (!me.hasOwnProperty(fixedSizeProp)) {
  76002. me[fixedSizeProp] = 5;
  76003. }
  76004. if (target.collapsed) {
  76005. me.addCls(me.collapsedClsInternal);
  76006. }
  76007. cls = me.baseCls + '-' + me.orientation;
  76008. me.addCls(cls);
  76009. if (!me.canResize) {
  76010. me.addCls(cls + '-noresize');
  76011. }
  76012. Ext.applyIf(me.renderData, {
  76013. collapseDir: collapseDir,
  76014. collapsible: me.collapsible || target.collapsible
  76015. });
  76016. },
  76017. onRender: function() {
  76018. var me = this;
  76019. me.callParent(arguments);
  76020. if (me.performCollapse !== false) {
  76021. if (me.renderData.collapsible) {
  76022. me.mon(me.collapseEl, 'click', me.toggleTargetCmp, me);
  76023. }
  76024. if (me.collapseOnDblClick) {
  76025. me.mon(me.el, 'dblclick', me.toggleTargetCmp, me);
  76026. }
  76027. }
  76028. me.mon(me.getCollapseTarget(), {
  76029. collapse: me.onTargetCollapse,
  76030. expand: me.onTargetExpand,
  76031. scope: me
  76032. });
  76033. me.el.unselectable();
  76034. if (me.canResize) {
  76035. me.tracker = Ext.create(me.getTrackerConfig());
  76036. me.relayEvents(me.tracker, [ 'beforedragstart', 'dragstart', 'dragend' ]);
  76037. }
  76038. },
  76039. getCollapseDirection: function() {
  76040. var me = this,
  76041. dir = me.collapseDirection,
  76042. collapseTarget, idx, items, type;
  76043. if (!dir) {
  76044. collapseTarget = me.collapseTarget;
  76045. if (collapseTarget.isComponent) {
  76046. dir = collapseTarget.collapseDirection;
  76047. }
  76048. if (!dir) {
  76049. type = me.ownerCt.layout.type;
  76050. if (collapseTarget.isComponent) {
  76051. items = me.ownerCt.items;
  76052. idx = Number(items.indexOf(collapseTarget) == items.indexOf(me) - 1) << 1 | Number(type == 'hbox');
  76053. } else {
  76054. idx = Number(me.collapseTarget == 'prev') << 1 | Number(type == 'hbox');
  76055. }
  76056. dir = ['bottom', 'right', 'top', 'left'][idx];
  76057. }
  76058. me.collapseDirection = dir;
  76059. }
  76060. me.orientation = (dir == 'top' || dir == 'bottom') ? 'horizontal' : 'vertical';
  76061. me[me.orientation] = true;
  76062. return dir;
  76063. },
  76064. getCollapseTarget: function() {
  76065. var me = this;
  76066. return me.collapseTarget.isComponent ? me.collapseTarget : me.collapseTarget == 'prev' ? me.previousSibling() : me.nextSibling();
  76067. },
  76068. onTargetCollapse: function(target) {
  76069. this.el.addCls([this.collapsedClsInternal, this.collapsedCls]);
  76070. },
  76071. onTargetExpand: function(target) {
  76072. this.el.removeCls([this.collapsedClsInternal, this.collapsedCls]);
  76073. },
  76074. toggleTargetCmp: function(e, t) {
  76075. var cmp = this.getCollapseTarget(),
  76076. placeholder = cmp.placeholder,
  76077. toggle;
  76078. if (placeholder && !placeholder.hidden) {
  76079. toggle = true;
  76080. } else {
  76081. toggle = !cmp.hidden;
  76082. }
  76083. if (toggle) {
  76084. if (cmp.collapsed) {
  76085. cmp.expand();
  76086. } else if (cmp.collapseDirection) {
  76087. cmp.collapse();
  76088. } else {
  76089. cmp.collapse(this.renderData.collapseDir);
  76090. }
  76091. }
  76092. },
  76093. setSize: function() {
  76094. var me = this;
  76095. me.callParent(arguments);
  76096. if (Ext.isIE && me.el) {
  76097. me.el.repaint();
  76098. }
  76099. },
  76100. beforeDestroy: function(){
  76101. Ext.destroy(this.tracker);
  76102. this.callParent();
  76103. }
  76104. });
  76105. Ext.define('Ext.resizer.BorderSplitter', {
  76106. extend: 'Ext.resizer.Splitter',
  76107. uses: ['Ext.resizer.BorderSplitterTracker'],
  76108. alias: 'widget.bordersplitter',
  76109. collapseTarget: null,
  76110. getTrackerConfig: function () {
  76111. var trackerConfig = this.callParent();
  76112. trackerConfig.xclass = 'Ext.resizer.BorderSplitterTracker';
  76113. return trackerConfig;
  76114. }
  76115. });
  76116. Ext.define('Ext.layout.container.Border', {
  76117. alias: 'layout.border',
  76118. extend: 'Ext.layout.container.Container',
  76119. requires: ['Ext.resizer.BorderSplitter', 'Ext.Component', 'Ext.fx.Anim'],
  76120. alternateClassName: 'Ext.layout.BorderLayout',
  76121. targetCls: Ext.baseCSSPrefix + 'border-layout-ct',
  76122. itemCls: [Ext.baseCSSPrefix + 'border-item', Ext.baseCSSPrefix + 'box-item'],
  76123. type: 'border',
  76124. padding: undefined,
  76125. percentageRe: /(\d+)%/,
  76126. axisProps: {
  76127. horz: {
  76128. borderBegin: 'west',
  76129. borderEnd: 'east',
  76130. horizontal: true,
  76131. posProp: 'x',
  76132. sizeProp: 'width',
  76133. sizePropCap: 'Width'
  76134. },
  76135. vert: {
  76136. borderBegin: 'north',
  76137. borderEnd: 'south',
  76138. horizontal: false,
  76139. posProp: 'y',
  76140. sizeProp: 'height',
  76141. sizePropCap: 'Height'
  76142. }
  76143. },
  76144. centerRegion: null,
  76145. collapseDirections: {
  76146. north: 'top',
  76147. south: 'bottom',
  76148. east: 'right',
  76149. west: 'left'
  76150. },
  76151. manageMargins: true,
  76152. panelCollapseAnimate: true,
  76153. panelCollapseMode: 'placeholder',
  76154. regionWeights: {
  76155. north: 20,
  76156. south: 10,
  76157. center: 0,
  76158. west: -10,
  76159. east: -20
  76160. },
  76161. beginAxis: function (ownerContext, regions, name) {
  76162. var me = this,
  76163. props = me.axisProps[name],
  76164. isVert = !props.horizontal,
  76165. sizeProp = props.sizeProp,
  76166. totalFlex = 0,
  76167. childItems = ownerContext.childItems,
  76168. length = childItems.length,
  76169. center, i, childContext, centerFlex, comp, region, match, size, type, target, placeholder;
  76170. for (i = 0; i < length; ++i) {
  76171. childContext = childItems[i];
  76172. comp = childContext.target;
  76173. childContext.layoutPos = {};
  76174. if (comp.region) {
  76175. childContext.region = region = comp.region;
  76176. childContext.isCenter = comp.isCenter;
  76177. childContext.isHorz = comp.isHorz;
  76178. childContext.isVert = comp.isVert;
  76179. childContext.weight = comp.weight || me.regionWeights[region] || 0;
  76180. regions[comp.id] = childContext;
  76181. if (comp.isCenter) {
  76182. center = childContext;
  76183. centerFlex = comp.flex;
  76184. ownerContext.centerRegion = center;
  76185. continue;
  76186. }
  76187. if (isVert !== childContext.isVert) {
  76188. continue;
  76189. }
  76190. childContext.reverseWeighting = (region == props.borderEnd);
  76191. size = comp[sizeProp];
  76192. type = typeof size;
  76193. if (!comp.collapsed) {
  76194. if (type == 'string' && (match = me.percentageRe.exec(size))) {
  76195. childContext.percentage = parseInt(match[1], 10);
  76196. } else if (comp.flex) {
  76197. totalFlex += childContext.flex = comp.flex;
  76198. }
  76199. }
  76200. }
  76201. }
  76202. if (center) {
  76203. target = center.target;
  76204. if (placeholder = target.placeholderFor) {
  76205. if (!centerFlex && isVert === placeholder.collapsedVertical()) {
  76206. centerFlex = 0;
  76207. center.collapseAxis = name;
  76208. }
  76209. } else if (target.collapsed && (isVert === target.collapsedVertical())) {
  76210. centerFlex = 0;
  76211. center.collapseAxis = name;
  76212. }
  76213. }
  76214. if (centerFlex == null) {
  76215. centerFlex = 1;
  76216. }
  76217. totalFlex += centerFlex;
  76218. return Ext.apply({
  76219. before : isVert ? 'top' : 'left',
  76220. totalFlex : totalFlex
  76221. }, props);
  76222. },
  76223. beginLayout: function (ownerContext) {
  76224. var me = this,
  76225. items = me.getLayoutItems(),
  76226. pad = me.padding,
  76227. type = typeof pad,
  76228. padOnContainer = false,
  76229. childContext, item, length, i, regions, collapseTarget,
  76230. doShow, hidden, region;
  76231. if (pad) {
  76232. if (type == 'string' || type == 'number') {
  76233. pad = Ext.util.Format.parseBox(pad);
  76234. }
  76235. } else {
  76236. pad = ownerContext.getEl('getTargetEl').getPaddingInfo();
  76237. padOnContainer = true;
  76238. }
  76239. ownerContext.outerPad = pad;
  76240. ownerContext.padOnContainer = padOnContainer;
  76241. for (i = 0, length = items.length; i < length; ++i) {
  76242. item = items[i];
  76243. collapseTarget = me.getSplitterTarget(item);
  76244. if (collapseTarget) {
  76245. hidden = !!item.hidden;
  76246. if (!collapseTarget.split) {
  76247. if (collapseTarget.isCollapsingOrExpanding) {
  76248. doShow = !!collapseTarget.collapsed;
  76249. }
  76250. } else if (hidden !== collapseTarget.hidden) {
  76251. doShow = !collapseTarget.hidden;
  76252. }
  76253. if (doShow === true) {
  76254. item.show();
  76255. } else if (doShow === false) {
  76256. item.hide();
  76257. }
  76258. }
  76259. }
  76260. me.callParent(arguments);
  76261. items = ownerContext.childItems;
  76262. length = items.length;
  76263. regions = {};
  76264. ownerContext.borderAxisHorz = me.beginAxis(ownerContext, regions, 'horz');
  76265. ownerContext.borderAxisVert = me.beginAxis(ownerContext, regions, 'vert');
  76266. for (i = 0; i < length; ++i) {
  76267. childContext = items[i];
  76268. collapseTarget = me.getSplitterTarget(childContext.target);
  76269. if (collapseTarget) {
  76270. region = regions[collapseTarget.id]
  76271. if (!region) {
  76272. region = ownerContext.getEl(collapseTarget.el, me);
  76273. region.region = collapseTarget.region;
  76274. }
  76275. childContext.collapseTarget = collapseTarget = region;
  76276. childContext.weight = collapseTarget.weight;
  76277. childContext.reverseWeighting = collapseTarget.reverseWeighting;
  76278. collapseTarget.splitter = childContext;
  76279. childContext.isHorz = collapseTarget.isHorz;
  76280. childContext.isVert = collapseTarget.isVert;
  76281. }
  76282. }
  76283. me.sortWeightedItems(items, 'reverseWeighting');
  76284. me.setupSplitterNeighbors(items);
  76285. },
  76286. calculate: function (ownerContext) {
  76287. var me = this,
  76288. containerSize = me.getContainerSize(ownerContext),
  76289. childItems = ownerContext.childItems,
  76290. length = childItems.length,
  76291. horz = ownerContext.borderAxisHorz,
  76292. vert = ownerContext.borderAxisVert,
  76293. pad = ownerContext.outerPad,
  76294. padOnContainer = ownerContext.padOnContainer,
  76295. i, childContext, childMargins, size, horzPercentTotal, vertPercentTotal;
  76296. horz.begin = pad.left;
  76297. vert.begin = pad.top;
  76298. horzPercentTotal = horz.end = horz.flexSpace = containerSize.width + (padOnContainer ? pad.left : -pad.right);
  76299. vertPercentTotal = vert.end = vert.flexSpace = containerSize.height + (padOnContainer ? pad.top : -pad.bottom);
  76300. for (i = 0; i < length; ++i) {
  76301. childContext = childItems[i];
  76302. childMargins = childContext.getMarginInfo();
  76303. if (childContext.isHorz || childContext.isCenter) {
  76304. horz.addUnflexed(childMargins.width);
  76305. horzPercentTotal -= childMargins.width;
  76306. }
  76307. if (childContext.isVert || childContext.isCenter) {
  76308. vert.addUnflexed(childMargins.height);
  76309. vertPercentTotal -= childMargins.height;
  76310. }
  76311. if (!childContext.flex && !childContext.percentage) {
  76312. if (childContext.isHorz || (childContext.isCenter && childContext.collapseAxis === 'horz')) {
  76313. size = childContext.getProp('width');
  76314. horz.addUnflexed(size);
  76315. if (childContext.collapseTarget) {
  76316. horzPercentTotal -= size;
  76317. }
  76318. } else if (childContext.isVert || (childContext.isCenter && childContext.collapseAxis === 'vert')) {
  76319. size = childContext.getProp('height');
  76320. vert.addUnflexed(size);
  76321. if (childContext.collapseTarget) {
  76322. vertPercentTotal -= size;
  76323. }
  76324. }
  76325. }
  76326. }
  76327. for (i = 0; i < length; ++i) {
  76328. childContext = childItems[i];
  76329. childMargins = childContext.getMarginInfo();
  76330. if (childContext.percentage) {
  76331. if (childContext.isHorz) {
  76332. size = Math.ceil(horzPercentTotal * childContext.percentage / 100);
  76333. size = childContext.setWidth(size);
  76334. horz.addUnflexed(size);
  76335. } else if (childContext.isVert) {
  76336. size = Math.ceil(vertPercentTotal * childContext.percentage / 100);
  76337. size = childContext.setHeight(size);
  76338. vert.addUnflexed(size);
  76339. }
  76340. }
  76341. }
  76342. for (i = 0; i < length; ++i) {
  76343. childContext = childItems[i];
  76344. if (!childContext.isCenter) {
  76345. me.calculateChildAxis(childContext, horz);
  76346. me.calculateChildAxis(childContext, vert);
  76347. }
  76348. }
  76349. if (me.finishAxis(ownerContext, vert) + me.finishAxis(ownerContext, horz) < 2) {
  76350. me.done = false;
  76351. } else {
  76352. me.finishPositions(childItems);
  76353. }
  76354. },
  76355. calculateChildAxis: function (childContext, axis) {
  76356. var collapseTarget = childContext.collapseTarget,
  76357. setSizeMethod = 'set' + axis.sizePropCap,
  76358. sizeProp = axis.sizeProp,
  76359. childMarginSize = childContext.getMarginInfo()[sizeProp],
  76360. region, isBegin, flex, pos, size;
  76361. if (collapseTarget) {
  76362. region = collapseTarget.region;
  76363. } else {
  76364. region = childContext.region;
  76365. flex = childContext.flex;
  76366. }
  76367. isBegin = region == axis.borderBegin;
  76368. if (!isBegin && region != axis.borderEnd) {
  76369. childContext[setSizeMethod](axis.end - axis.begin - childMarginSize);
  76370. pos = axis.begin;
  76371. } else {
  76372. if (flex) {
  76373. size = Math.ceil(axis.flexSpace * (flex / axis.totalFlex));
  76374. size = childContext[setSizeMethod](size);
  76375. } else if (childContext.percentage) {
  76376. size = childContext.peek(sizeProp);
  76377. } else {
  76378. size = childContext.getProp(sizeProp);
  76379. }
  76380. size += childMarginSize;
  76381. if (isBegin) {
  76382. pos = axis.begin;
  76383. axis.begin += size;
  76384. } else {
  76385. axis.end = pos = axis.end - size;
  76386. }
  76387. }
  76388. childContext.layoutPos[axis.posProp] = pos;
  76389. },
  76390. finishAxis: function (ownerContext, axis) {
  76391. var size = axis.end - axis.begin,
  76392. center = ownerContext.centerRegion;
  76393. if (center) {
  76394. center['set' + axis.sizePropCap](size - center.getMarginInfo()[axis.sizeProp]);
  76395. center.layoutPos[axis.posProp] = axis.begin;
  76396. }
  76397. return Ext.isNumber(size) ? 1 : 0;
  76398. },
  76399. finishPositions: function (childItems) {
  76400. var length = childItems.length,
  76401. index, childContext;
  76402. for (index = 0; index < length; ++index) {
  76403. childContext = childItems[index];
  76404. childContext.setProp('x', childContext.layoutPos.x + childContext.marginInfo.left);
  76405. childContext.setProp('y', childContext.layoutPos.y + childContext.marginInfo.top);
  76406. }
  76407. },
  76408. getPlaceholder: function (comp) {
  76409. return comp.getPlaceholder && comp.getPlaceholder();
  76410. },
  76411. getSplitterTarget: function (splitter) {
  76412. var collapseTarget = splitter.collapseTarget;
  76413. if (collapseTarget && collapseTarget.collapsed) {
  76414. return collapseTarget.placeholder || collapseTarget;
  76415. }
  76416. return collapseTarget;
  76417. },
  76418. isItemBoxParent: function (itemContext) {
  76419. return true;
  76420. },
  76421. isItemShrinkWrap: function (item) {
  76422. return true;
  76423. },
  76424. insertSplitter: function (item, index, hidden) {
  76425. var region = item.region,
  76426. splitter = {
  76427. xtype: 'bordersplitter',
  76428. collapseTarget: item,
  76429. id: item.id + '-splitter',
  76430. hidden: hidden,
  76431. canResize: item.splitterResize !== false
  76432. },
  76433. at = index + ((region == 'south' || region == 'east') ? 0 : 1);
  76434. if (item.isHorz) {
  76435. splitter.height = null;
  76436. } else {
  76437. splitter.width = null;
  76438. }
  76439. if (item.collapseMode == 'mini') {
  76440. splitter.collapsedCls = item.collapsedCls;
  76441. }
  76442. item.splitter = this.owner.add(at, splitter);
  76443. },
  76444. onAdd: function (item, index) {
  76445. var me = this,
  76446. placeholderFor = item.placeholderFor,
  76447. region = item.region,
  76448. split,
  76449. hidden;
  76450. me.callParent(arguments);
  76451. if (region) {
  76452. Ext.apply(item, me.regionFlags[region]);
  76453. if (region == 'center') {
  76454. me.centerRegion = item;
  76455. } else {
  76456. item.collapseDirection = this.collapseDirections[region];
  76457. split = item.split;
  76458. hidden = !!item.hidden;
  76459. if ((item.isHorz || item.isVert) && (split || item.collapseMode == 'mini')) {
  76460. me.insertSplitter(item, index, hidden || !split);
  76461. }
  76462. }
  76463. if (!item.hasOwnProperty('collapseMode')) {
  76464. item.collapseMode = me.panelCollapseMode;
  76465. }
  76466. if (!item.hasOwnProperty('animCollapse')) {
  76467. if (item.collapseMode != 'placeholder') {
  76468. item.animCollapse = false;
  76469. } else {
  76470. item.animCollapse = me.panelCollapseAnimate;
  76471. }
  76472. }
  76473. } else if (placeholderFor) {
  76474. Ext.apply(item, me.regionFlags[placeholderFor.region]);
  76475. item.region = placeholderFor.region;
  76476. item.weight = placeholderFor.weight;
  76477. }
  76478. },
  76479. onDestroy: function() {
  76480. this.centerRegion = null;
  76481. this.callParent();
  76482. },
  76483. onRemove: function (item) {
  76484. var me = this,
  76485. region = item.region,
  76486. splitter = item.splitter;
  76487. if (region) {
  76488. if (item.isCenter) {
  76489. me.centerRegion = null;
  76490. }
  76491. delete item.isCenter;
  76492. delete item.isHorz;
  76493. delete item.isVert;
  76494. if (splitter) {
  76495. me.owner.doRemove(splitter, true);
  76496. delete item.splitter;
  76497. }
  76498. }
  76499. me.callParent(arguments);
  76500. },
  76501. regionFlags: {
  76502. center: { isCenter: true, isHorz: false, isVert: false },
  76503. north: { isCenter: false, isHorz: false, isVert: true },
  76504. south: { isCenter: false, isHorz: false, isVert: true },
  76505. west: { isCenter: false, isHorz: true, isVert: false },
  76506. east: { isCenter: false, isHorz: true, isVert: false }
  76507. },
  76508. setupSplitterNeighbors: function (items) {
  76509. var edgeRegions = {
  76510. },
  76511. length = items.length,
  76512. touchedRegions = this.touchedRegions,
  76513. i, j, center, count, edge, comp, region, splitter, touched;
  76514. for (i = 0; i < length; ++i) {
  76515. comp = items[i].target;
  76516. region = comp.region;
  76517. if (comp.isCenter) {
  76518. center = comp;
  76519. } else if (region) {
  76520. touched = touchedRegions[region];
  76521. for (j = 0, count = touched.length; j < count; ++j) {
  76522. edge = edgeRegions[touched[j]];
  76523. if (edge) {
  76524. edge.neighbors.push(comp);
  76525. }
  76526. }
  76527. if (comp.placeholderFor) {
  76528. splitter = comp.placeholderFor.splitter;
  76529. } else {
  76530. splitter = comp.splitter;
  76531. }
  76532. if (splitter) {
  76533. splitter.neighbors = [];
  76534. }
  76535. edgeRegions[region] = splitter;
  76536. }
  76537. }
  76538. if (center) {
  76539. touched = touchedRegions.center;
  76540. for (j = 0, count = touched.length; j < count; ++j) {
  76541. edge = edgeRegions[touched[j]];
  76542. if (edge) {
  76543. edge.neighbors.push(center);
  76544. }
  76545. }
  76546. }
  76547. },
  76548. touchedRegions: {
  76549. center: [ 'north', 'south', 'east', 'west' ],
  76550. north: [ 'north', 'east', 'west' ],
  76551. south: [ 'south', 'east', 'west' ],
  76552. east: [ 'east', 'north', 'south' ],
  76553. west: [ 'west', 'north', 'south' ]
  76554. },
  76555. sizePolicies: {
  76556. vert: {
  76557. setsWidth: 1,
  76558. setsHeight: 0
  76559. },
  76560. horz: {
  76561. setsWidth: 0,
  76562. setsHeight: 1
  76563. },
  76564. flexAll: {
  76565. setsWidth: 1,
  76566. setsHeight: 1
  76567. }
  76568. },
  76569. getItemSizePolicy: function (item) {
  76570. var me = this,
  76571. policies = this.sizePolicies,
  76572. collapseTarget, size, policy, placeholderFor;
  76573. if (item.isCenter) {
  76574. placeholderFor = item.placeholderFor;
  76575. if (placeholderFor) {
  76576. if (placeholderFor.collapsedVertical()) {
  76577. return policies.vert;
  76578. }
  76579. return policies.horz;
  76580. }
  76581. if (item.collapsed) {
  76582. if (item.collapsedVertical()) {
  76583. return policies.vert;
  76584. }
  76585. return policies.horz;
  76586. }
  76587. return policies.flexAll;
  76588. }
  76589. collapseTarget = item.collapseTarget;
  76590. if (collapseTarget) {
  76591. return collapseTarget.isVert ? policies.vert : policies.horz;
  76592. }
  76593. if (item.region) {
  76594. if (item.isVert) {
  76595. size = item.height;
  76596. policy = policies.vert;
  76597. } else {
  76598. size = item.width;
  76599. policy = policies.horz;
  76600. }
  76601. if (item.flex || (typeof size == 'string' && me.percentageRe.test(size))) {
  76602. return policies.flexAll;
  76603. }
  76604. return policy;
  76605. }
  76606. return me.autoSizePolicy;
  76607. }
  76608. }, function () {
  76609. var methods = {
  76610. addUnflexed: function (px) {
  76611. this.flexSpace = Math.max(this.flexSpace - px, 0);
  76612. }
  76613. },
  76614. props = this.prototype.axisProps;
  76615. Ext.apply(props.horz, methods);
  76616. Ext.apply(props.vert, methods);
  76617. });
  76618. Ext.define('Ext.layout.container.Card', {
  76619. extend: 'Ext.layout.container.Fit',
  76620. alternateClassName: 'Ext.layout.CardLayout',
  76621. alias: 'layout.card',
  76622. type: 'card',
  76623. hideInactive: true,
  76624. deferredRender : false,
  76625. getRenderTree: function () {
  76626. var me = this,
  76627. activeItem = me.getActiveItem();
  76628. if (activeItem) {
  76629. if (activeItem.hasListeners.beforeactivate && activeItem.fireEvent('beforeactivate', activeItem) === false) {
  76630. activeItem = me.activeItem = me.owner.activeItem = null;
  76631. }
  76632. else if (activeItem.hasListeners.activate) {
  76633. activeItem.on({
  76634. boxready: function() {
  76635. activeItem.fireEvent('activate', activeItem);
  76636. },
  76637. single: true
  76638. });
  76639. }
  76640. if (me.deferredRender) {
  76641. if (activeItem) {
  76642. return me.getItemsRenderTree([activeItem]);
  76643. }
  76644. } else {
  76645. return me.callParent(arguments);
  76646. }
  76647. }
  76648. },
  76649. renderChildren: function () {
  76650. var me = this,
  76651. active = me.getActiveItem();
  76652. if (!me.deferredRender) {
  76653. me.callParent();
  76654. } else if (active) {
  76655. me.renderItems([active], me.getRenderTarget());
  76656. }
  76657. },
  76658. isValidParent : function(item, target, position) {
  76659. var itemEl = item.el ? item.el.dom : Ext.getDom(item);
  76660. return (itemEl && itemEl.parentNode === (target.dom || target)) || false;
  76661. },
  76662. getActiveItem: function() {
  76663. var me = this,
  76664. result = me.parseActiveItem(me.activeItem || (me.owner && me.owner.activeItem));
  76665. if (result && me.owner.items.indexOf(result) != -1) {
  76666. me.activeItem = result;
  76667. } else {
  76668. me.activeItem = null;
  76669. }
  76670. return me.activeItem;
  76671. },
  76672. parseActiveItem: function(item) {
  76673. if (item && item.isComponent) {
  76674. return item;
  76675. } else if (typeof item == 'number' || item === undefined) {
  76676. return this.getLayoutItems()[item || 0];
  76677. } else {
  76678. return this.owner.getComponent(item);
  76679. }
  76680. },
  76681. configureItem: function(item) {
  76682. if (item === this.getActiveItem()) {
  76683. item.hidden = false;
  76684. } else {
  76685. item.hidden = true;
  76686. }
  76687. this.callParent(arguments);
  76688. },
  76689. onRemove: function(component) {
  76690. var me = this;
  76691. if (component === me.activeItem) {
  76692. me.activeItem = null;
  76693. }
  76694. },
  76695. getAnimation: function(newCard, owner) {
  76696. var newAnim = (newCard || {}).cardSwitchAnimation;
  76697. if (newAnim === false) {
  76698. return false;
  76699. }
  76700. return newAnim || owner.cardSwitchAnimation;
  76701. },
  76702. getNext: function() {
  76703. var wrap = arguments[0],
  76704. items = this.getLayoutItems(),
  76705. index = Ext.Array.indexOf(items, this.activeItem);
  76706. return items[index + 1] || (wrap ? items[0] : false);
  76707. },
  76708. next: function() {
  76709. var anim = arguments[0],
  76710. wrap = arguments[1];
  76711. return this.setActiveItem(this.getNext(wrap), anim);
  76712. },
  76713. getPrev: function() {
  76714. var wrap = arguments[0],
  76715. items = this.getLayoutItems(),
  76716. index = Ext.Array.indexOf(items, this.activeItem);
  76717. return items[index - 1] || (wrap ? items[items.length - 1] : false);
  76718. },
  76719. prev: function() {
  76720. var anim = arguments[0],
  76721. wrap = arguments[1];
  76722. return this.setActiveItem(this.getPrev(wrap), anim);
  76723. },
  76724. setActiveItem: function(newCard) {
  76725. var me = this,
  76726. owner = me.owner,
  76727. oldCard = me.activeItem,
  76728. rendered = owner.rendered,
  76729. newIndex;
  76730. newCard = me.parseActiveItem(newCard);
  76731. newIndex = owner.items.indexOf(newCard);
  76732. if (newIndex == -1) {
  76733. newIndex = owner.items.items.length;
  76734. Ext.suspendLayouts();
  76735. newCard = owner.add(newCard);
  76736. Ext.resumeLayouts();
  76737. }
  76738. if (newCard && oldCard != newCard) {
  76739. if (newCard.fireEvent('beforeactivate', newCard, oldCard) === false) {
  76740. return false;
  76741. }
  76742. if (oldCard && oldCard.fireEvent('beforedeactivate', oldCard, newCard) === false) {
  76743. return false;
  76744. }
  76745. if (rendered) {
  76746. Ext.suspendLayouts();
  76747. if (!newCard.rendered) {
  76748. me.renderItem(newCard, me.getRenderTarget(), owner.items.length);
  76749. }
  76750. if (oldCard) {
  76751. if (me.hideInactive) {
  76752. oldCard.hide();
  76753. oldCard.hiddenByLayout = true;
  76754. }
  76755. oldCard.fireEvent('deactivate', oldCard, newCard);
  76756. }
  76757. if (newCard.hidden) {
  76758. newCard.show();
  76759. }
  76760. if (!newCard.hidden) {
  76761. me.activeItem = newCard;
  76762. }
  76763. Ext.resumeLayouts(true);
  76764. } else {
  76765. me.activeItem = newCard;
  76766. }
  76767. newCard.fireEvent('activate', newCard, oldCard);
  76768. return me.activeItem;
  76769. }
  76770. return false;
  76771. }
  76772. });
  76773. Ext.define('Ext.layout.container.Column', {
  76774. extend: 'Ext.layout.container.Container',
  76775. alias: ['layout.column'],
  76776. alternateClassName: 'Ext.layout.ColumnLayout',
  76777. type: 'column',
  76778. itemCls: Ext.baseCSSPrefix + 'column',
  76779. targetCls: Ext.baseCSSPrefix + 'column-layout-ct',
  76780. columnWidthSizePolicy: {
  76781. setsWidth: 1,
  76782. setsHeight: 0
  76783. },
  76784. childEls: [
  76785. 'innerCt'
  76786. ],
  76787. manageOverflow: 2,
  76788. renderTpl: [
  76789. '<div id="{ownerId}-innerCt" class="',Ext.baseCSSPrefix,'column-inner">',
  76790. '{%this.renderBody(out,values)%}',
  76791. '<div class="',Ext.baseCSSPrefix,'clear"></div>',
  76792. '</div>',
  76793. '{%this.renderPadder(out,values)%}'
  76794. ],
  76795. getItemSizePolicy: function (item) {
  76796. if (item.columnWidth) {
  76797. return this.columnWidthSizePolicy;
  76798. }
  76799. return this.autoSizePolicy;
  76800. },
  76801. beginLayout: function() {
  76802. this.callParent(arguments);
  76803. this.innerCt.dom.style.width = '';
  76804. },
  76805. calculate: function (ownerContext) {
  76806. var me = this,
  76807. containerSize = me.getContainerSize(ownerContext),
  76808. state = ownerContext.state;
  76809. if (state.calculatedColumns || (state.calculatedColumns = me.calculateColumns(ownerContext))) {
  76810. if (me.calculateHeights(ownerContext)) {
  76811. me.calculateOverflow(ownerContext, containerSize);
  76812. return;
  76813. }
  76814. }
  76815. me.done = false;
  76816. },
  76817. calculateColumns: function (ownerContext) {
  76818. var me = this,
  76819. containerSize = me.getContainerSize(ownerContext),
  76820. innerCtContext = ownerContext.getEl('innerCt', me),
  76821. items = ownerContext.childItems,
  76822. len = items.length,
  76823. contentWidth = 0,
  76824. blocked, availableWidth, i, itemContext, itemMarginWidth, itemWidth;
  76825. if (!ownerContext.heightModel.shrinkWrap && !ownerContext.targetContext.hasProp('height')) {
  76826. return false;
  76827. }
  76828. if (!containerSize.gotWidth) {
  76829. ownerContext.targetContext.block(me, 'width');
  76830. blocked = true;
  76831. } else {
  76832. availableWidth = containerSize.width;
  76833. innerCtContext.setWidth(availableWidth);
  76834. }
  76835. for (i = 0; i < len; ++i) {
  76836. itemContext = items[i];
  76837. itemMarginWidth = itemContext.getMarginInfo().width;
  76838. if (!itemContext.widthModel.calculated) {
  76839. itemWidth = itemContext.getProp('width');
  76840. if (typeof itemWidth != 'number') {
  76841. itemContext.block(me, 'width');
  76842. blocked = true;
  76843. }
  76844. contentWidth += itemWidth + itemMarginWidth;
  76845. }
  76846. }
  76847. if (!blocked) {
  76848. availableWidth = (availableWidth < contentWidth) ? 0 : availableWidth - contentWidth;
  76849. for (i = 0; i < len; ++i) {
  76850. itemContext = items[i];
  76851. if (itemContext.widthModel.calculated) {
  76852. itemMarginWidth = itemContext.marginInfo.width;
  76853. itemWidth = itemContext.target.columnWidth;
  76854. itemWidth = Math.floor(itemWidth * availableWidth) - itemMarginWidth;
  76855. itemWidth = itemContext.setWidth(itemWidth);
  76856. contentWidth += itemWidth + itemMarginWidth;
  76857. }
  76858. }
  76859. ownerContext.setContentWidth(contentWidth);
  76860. }
  76861. return !blocked;
  76862. },
  76863. calculateHeights: function (ownerContext) {
  76864. var me = this,
  76865. items = ownerContext.childItems,
  76866. len = items.length,
  76867. blocked, i, itemContext;
  76868. blocked = false;
  76869. for (i = 0; i < len; ++i) {
  76870. itemContext = items[i];
  76871. if (!itemContext.hasDomProp('height')) {
  76872. itemContext.domBlock(me, 'height');
  76873. blocked = true;
  76874. }
  76875. }
  76876. if (!blocked) {
  76877. ownerContext.setContentHeight(me.innerCt.getHeight() + ownerContext.targetContext.getPaddingInfo().height);
  76878. }
  76879. return !blocked;
  76880. },
  76881. finishedLayout: function (ownerContext) {
  76882. var bc = ownerContext.bodyContext;
  76883. if (bc && (Ext.isIE6 || Ext.isIE7 || Ext.isIEQuirks)) {
  76884. bc.el.repaint();
  76885. }
  76886. this.callParent(arguments);
  76887. },
  76888. getRenderTarget : function() {
  76889. return this.innerCt;
  76890. }
  76891. });
  76892. Ext.define('Ext.layout.container.Form', {
  76893. alias: 'layout.form',
  76894. extend: 'Ext.layout.container.Auto',
  76895. alternateClassName: 'Ext.layout.FormLayout',
  76896. tableCls: Ext.baseCSSPrefix + 'form-layout-table',
  76897. type: 'form',
  76898. manageOverflow: 2,
  76899. childEls: ['formTable'],
  76900. padRow: '<tr><td class="' + Ext.baseCSSPrefix + 'form-item-pad" colspan="3"></td></tr>',
  76901. renderTpl: [
  76902. '<table id="{ownerId}-formTable" class="{tableCls}" style="width:100%" cellpadding="0">',
  76903. '{%this.renderBody(out,values)%}',
  76904. '</table>',
  76905. '{%this.renderPadder(out,values)%}'
  76906. ],
  76907. getRenderData: function(){
  76908. var data = this.callParent();
  76909. data.tableCls = this.tableCls;
  76910. return data;
  76911. },
  76912. calculate : function (ownerContext) {
  76913. var me = this,
  76914. containerSize = me.getContainerSize(ownerContext, true),
  76915. tableWidth,
  76916. childItems,
  76917. i = 0, length;
  76918. if (containerSize.gotWidth) {
  76919. this.callParent(arguments);
  76920. tableWidth = me.formTable.dom.offsetWidth;
  76921. childItems = ownerContext.childItems;
  76922. for (length = childItems.length; i < length; ++i) {
  76923. childItems[i].setWidth(tableWidth, false);
  76924. }
  76925. } else {
  76926. me.done = false;
  76927. }
  76928. },
  76929. getRenderTarget: function() {
  76930. return this.formTable;
  76931. },
  76932. getRenderTree: function() {
  76933. var me = this,
  76934. result = me.callParent(arguments),
  76935. i, len;
  76936. for (i = 0, len = result.length; i < len; i++) {
  76937. result[i] = me.transformItemRenderTree(result[i]);
  76938. }
  76939. return result;
  76940. },
  76941. transformItemRenderTree: function(item) {
  76942. if (item.tag && item.tag == 'table') {
  76943. item.tag = 'tbody';
  76944. delete item.cellspacing;
  76945. delete item.cellpadding;
  76946. if (Ext.isIE6) {
  76947. item.cn = this.padRow;
  76948. }
  76949. return item;
  76950. }
  76951. return {
  76952. tag: 'tbody',
  76953. cn: {
  76954. tag: 'tr',
  76955. cn: {
  76956. tag: 'td',
  76957. colspan: 3,
  76958. style: 'width:100%',
  76959. cn: item
  76960. }
  76961. }
  76962. };
  76963. },
  76964. isValidParent: function(item, target, position) {
  76965. return true;
  76966. },
  76967. isItemShrinkWrap: function(item) {
  76968. return ((item.shrinkWrap === true) ? 3 : item.shrinkWrap||0) & 2;
  76969. },
  76970. getItemSizePolicy: function(item) {
  76971. return {
  76972. setsWidth: 1,
  76973. setsHeight: 0
  76974. };
  76975. }
  76976. });
  76977. Ext.define('Ext.menu.Item', {
  76978. extend: 'Ext.Component',
  76979. alias: 'widget.menuitem',
  76980. alternateClassName: 'Ext.menu.TextItem',
  76981. activeCls: Ext.baseCSSPrefix + 'menu-item-active',
  76982. ariaRole: 'menuitem',
  76983. canActivate: true,
  76984. clickHideDelay: 1,
  76985. destroyMenu: true,
  76986. disabledCls: Ext.baseCSSPrefix + 'menu-item-disabled',
  76987. hideOnClick: true,
  76988. isMenuItem: true,
  76989. menuAlign: 'tl-tr?',
  76990. menuExpandDelay: 200,
  76991. menuHideDelay: 200,
  76992. tooltipType: 'qtip',
  76993. arrowCls: Ext.baseCSSPrefix + 'menu-item-arrow',
  76994. childEls: [
  76995. 'itemEl', 'iconEl', 'textEl', 'arrowEl'
  76996. ],
  76997. renderTpl: [
  76998. '<tpl if="plain">',
  76999. '{text}',
  77000. '<tpl else>',
  77001. '<a id="{id}-itemEl" class="' + Ext.baseCSSPrefix + 'menu-item-link" href="{href}" <tpl if="hrefTarget">target="{hrefTarget}"</tpl> hidefocus="true" unselectable="on">',
  77002. '<img id="{id}-iconEl" src="{icon}" class="' + Ext.baseCSSPrefix + 'menu-item-icon {iconCls}" />',
  77003. '<span id="{id}-textEl" class="' + Ext.baseCSSPrefix + 'menu-item-text" <tpl if="arrowCls">style="margin-right: 17px;"</tpl> >{text}</span>',
  77004. '<img id="{id}-arrowEl" src="{blank}" class="{arrowCls}" />',
  77005. '</a>',
  77006. '</tpl>'
  77007. ],
  77008. maskOnDisable: false,
  77009. activate: function() {
  77010. var me = this;
  77011. if (!me.activated && me.canActivate && me.rendered && !me.isDisabled() && me.isVisible()) {
  77012. me.el.addCls(me.activeCls);
  77013. me.focus();
  77014. me.activated = true;
  77015. me.fireEvent('activate', me);
  77016. }
  77017. },
  77018. getFocusEl: function() {
  77019. return this.itemEl;
  77020. },
  77021. deactivate: function() {
  77022. var me = this;
  77023. if (me.activated) {
  77024. me.el.removeCls(me.activeCls);
  77025. me.blur();
  77026. me.hideMenu();
  77027. me.activated = false;
  77028. me.fireEvent('deactivate', me);
  77029. }
  77030. },
  77031. deferExpandMenu: function() {
  77032. var me = this;
  77033. if (me.activated && (!me.menu.rendered || !me.menu.isVisible())) {
  77034. me.parentMenu.activeChild = me.menu;
  77035. me.menu.parentItem = me;
  77036. me.menu.parentMenu = me.menu.ownerCt = me.parentMenu;
  77037. me.menu.showBy(me, me.menuAlign);
  77038. }
  77039. },
  77040. deferHideMenu: function() {
  77041. if (this.menu.isVisible()) {
  77042. this.menu.hide();
  77043. }
  77044. },
  77045. cancelDeferHide: function(){
  77046. clearTimeout(this.hideMenuTimer);
  77047. },
  77048. deferHideParentMenus: function() {
  77049. var ancestor;
  77050. Ext.menu.Manager.hideAll();
  77051. if (!Ext.Element.getActiveElement()) {
  77052. ancestor = this.up(':not([hidden])');
  77053. if (ancestor) {
  77054. ancestor.focus();
  77055. }
  77056. }
  77057. },
  77058. expandMenu: function(delay) {
  77059. var me = this;
  77060. if (me.menu) {
  77061. me.cancelDeferHide();
  77062. if (delay === 0) {
  77063. me.deferExpandMenu();
  77064. } else {
  77065. me.expandMenuTimer = Ext.defer(me.deferExpandMenu, Ext.isNumber(delay) ? delay : me.menuExpandDelay, me);
  77066. }
  77067. }
  77068. },
  77069. getRefItems: function(deep){
  77070. var menu = this.menu,
  77071. items;
  77072. if (menu) {
  77073. items = menu.getRefItems(deep);
  77074. items.unshift(menu);
  77075. }
  77076. return items || [];
  77077. },
  77078. hideMenu: function(delay) {
  77079. var me = this;
  77080. if (me.menu) {
  77081. clearTimeout(me.expandMenuTimer);
  77082. me.hideMenuTimer = Ext.defer(me.deferHideMenu, Ext.isNumber(delay) ? delay : me.menuHideDelay, me);
  77083. }
  77084. },
  77085. initComponent: function() {
  77086. var me = this,
  77087. prefix = Ext.baseCSSPrefix,
  77088. cls = [prefix + 'menu-item'],
  77089. menu;
  77090. me.addEvents(
  77091. 'activate',
  77092. 'click',
  77093. 'deactivate'
  77094. );
  77095. if (me.plain) {
  77096. cls.push(prefix + 'menu-item-plain');
  77097. }
  77098. if (me.cls) {
  77099. cls.push(me.cls);
  77100. }
  77101. me.cls = cls.join(' ');
  77102. if (me.menu) {
  77103. menu = me.menu;
  77104. delete me.menu;
  77105. me.setMenu(menu);
  77106. }
  77107. me.callParent(arguments);
  77108. },
  77109. onClick: function(e) {
  77110. var me = this;
  77111. if (!me.href) {
  77112. e.stopEvent();
  77113. }
  77114. if (me.disabled) {
  77115. return;
  77116. }
  77117. if (me.hideOnClick) {
  77118. me.deferHideParentMenusTimer = Ext.defer(me.deferHideParentMenus, me.clickHideDelay, me);
  77119. }
  77120. Ext.callback(me.handler, me.scope || me, [me, e]);
  77121. me.fireEvent('click', me, e);
  77122. if (!me.hideOnClick) {
  77123. me.focus();
  77124. }
  77125. },
  77126. onRemoved: function() {
  77127. var me = this;
  77128. if (me.activated && me.parentMenu.activeItem === me) {
  77129. me.parentMenu.deactivateActiveItem();
  77130. }
  77131. me.callParent(arguments);
  77132. delete me.parentMenu;
  77133. delete me.ownerButton;
  77134. },
  77135. beforeDestroy: function() {
  77136. var me = this;
  77137. if (me.rendered) {
  77138. me.clearTip();
  77139. }
  77140. me.callParent();
  77141. },
  77142. onDestroy: function() {
  77143. var me = this;
  77144. clearTimeout(me.expandMenuTimer);
  77145. me.cancelDeferHide();
  77146. clearTimeout(me.deferHideParentMenusTimer);
  77147. me.setMenu(null);
  77148. me.callParent(arguments);
  77149. },
  77150. beforeRender: function() {
  77151. var me = this,
  77152. blank = Ext.BLANK_IMAGE_URL,
  77153. iconCls,
  77154. arrowCls;
  77155. me.callParent();
  77156. if (me.iconAlign === 'right') {
  77157. iconCls = me.checkChangeDisabled ? me.disabledCls : '';
  77158. arrowCls = Ext.baseCSSPrefix + 'menu-item-icon-right ' + me.iconCls;
  77159. } else {
  77160. iconCls = me.iconCls + (me.checkChangeDisabled ? ' ' + me.disabledCls : '');
  77161. arrowCls = me.menu ? me.arrowCls : '';
  77162. }
  77163. Ext.applyIf(me.renderData, {
  77164. href: me.href || '#',
  77165. hrefTarget: me.hrefTarget,
  77166. icon: me.icon || blank,
  77167. iconCls: iconCls,
  77168. plain: me.plain,
  77169. text: me.text,
  77170. arrowCls: arrowCls,
  77171. blank: blank
  77172. });
  77173. },
  77174. onRender: function() {
  77175. var me = this;
  77176. me.callParent(arguments);
  77177. if (me.tooltip) {
  77178. me.setTooltip(me.tooltip, true);
  77179. }
  77180. },
  77181. setMenu: function(menu, destroyMenu) {
  77182. var me = this,
  77183. oldMenu = me.menu,
  77184. arrowEl = me.arrowEl;
  77185. if (oldMenu) {
  77186. delete oldMenu.parentItem;
  77187. delete oldMenu.parentMenu;
  77188. delete oldMenu.ownerCt;
  77189. delete oldMenu.ownerItem;
  77190. if (destroyMenu === true || (destroyMenu !== false && me.destroyMenu)) {
  77191. Ext.destroy(oldMenu);
  77192. }
  77193. }
  77194. if (menu) {
  77195. me.menu = Ext.menu.Manager.get(menu);
  77196. me.menu.ownerItem = me;
  77197. } else {
  77198. me.menu = null;
  77199. }
  77200. if (me.rendered && !me.destroying && arrowEl) {
  77201. arrowEl[me.menu ? 'addCls' : 'removeCls'](me.arrowCls);
  77202. }
  77203. },
  77204. setHandler: function(fn, scope) {
  77205. this.handler = fn || null;
  77206. this.scope = scope;
  77207. },
  77208. setIcon: function(icon){
  77209. var iconEl = this.iconEl;
  77210. if (iconEl) {
  77211. iconEl.src = icon || Ext.BLANK_IMAGE_URL;
  77212. }
  77213. this.icon = icon;
  77214. },
  77215. setIconCls: function(iconCls) {
  77216. var me = this,
  77217. iconEl = me.iconEl;
  77218. if (iconEl) {
  77219. if (me.iconCls) {
  77220. iconEl.removeCls(me.iconCls);
  77221. }
  77222. if (iconCls) {
  77223. iconEl.addCls(iconCls);
  77224. }
  77225. }
  77226. me.iconCls = iconCls;
  77227. },
  77228. setText: function(text) {
  77229. var me = this,
  77230. el = me.textEl || me.el;
  77231. me.text = text;
  77232. if (me.rendered) {
  77233. el.update(text || '');
  77234. me.ownerCt.updateLayout();
  77235. }
  77236. },
  77237. getTipAttr: function(){
  77238. return this.tooltipType == 'qtip' ? 'data-qtip' : 'title';
  77239. },
  77240. clearTip: function() {
  77241. if (Ext.isObject(this.tooltip)) {
  77242. Ext.tip.QuickTipManager.unregister(this.itemEl);
  77243. }
  77244. },
  77245. setTooltip: function(tooltip, initial) {
  77246. var me = this;
  77247. if (me.rendered) {
  77248. if (!initial) {
  77249. me.clearTip();
  77250. }
  77251. if (Ext.isObject(tooltip)) {
  77252. Ext.tip.QuickTipManager.register(Ext.apply({
  77253. target: me.itemEl.id
  77254. },
  77255. tooltip));
  77256. me.tooltip = tooltip;
  77257. } else {
  77258. me.itemEl.dom.setAttribute(me.getTipAttr(), tooltip);
  77259. }
  77260. } else {
  77261. me.tooltip = tooltip;
  77262. }
  77263. return me;
  77264. }
  77265. });
  77266. Ext.define('Ext.menu.CheckItem', {
  77267. extend: 'Ext.menu.Item',
  77268. alias: 'widget.menucheckitem',
  77269. checkedCls: Ext.baseCSSPrefix + 'menu-item-checked',
  77270. uncheckedCls: Ext.baseCSSPrefix + 'menu-item-unchecked',
  77271. groupCls: Ext.baseCSSPrefix + 'menu-group-icon',
  77272. hideOnClick: false,
  77273. checkChangeDisabled: false,
  77274. afterRender: function() {
  77275. var me = this;
  77276. me.callParent();
  77277. me.checked = !me.checked;
  77278. me.setChecked(!me.checked, true);
  77279. if (me.checkChangeDisabled) {
  77280. me.disableCheckChange();
  77281. }
  77282. },
  77283. initComponent: function() {
  77284. var me = this;
  77285. me.addEvents(
  77286. 'beforecheckchange',
  77287. 'checkchange'
  77288. );
  77289. me.callParent(arguments);
  77290. Ext.menu.Manager.registerCheckable(me);
  77291. if (me.group) {
  77292. if (!me.iconCls) {
  77293. me.iconCls = me.groupCls;
  77294. }
  77295. if (me.initialConfig.hideOnClick !== false) {
  77296. me.hideOnClick = true;
  77297. }
  77298. }
  77299. },
  77300. disableCheckChange: function() {
  77301. var me = this,
  77302. iconEl = me.iconEl;
  77303. if (iconEl) {
  77304. iconEl.addCls(me.disabledCls);
  77305. }
  77306. if (!(Ext.isIE9 && Ext.isStrict) && me.rendered) {
  77307. me.el.repaint();
  77308. }
  77309. me.checkChangeDisabled = true;
  77310. },
  77311. enableCheckChange: function() {
  77312. var me = this,
  77313. iconEl = me.iconEl;
  77314. if (iconEl) {
  77315. iconEl.removeCls(me.disabledCls);
  77316. }
  77317. me.checkChangeDisabled = false;
  77318. },
  77319. onClick: function(e) {
  77320. var me = this;
  77321. if(!me.disabled && !me.checkChangeDisabled && !(me.checked && me.group)) {
  77322. me.setChecked(!me.checked);
  77323. }
  77324. this.callParent([e]);
  77325. },
  77326. onDestroy: function() {
  77327. Ext.menu.Manager.unregisterCheckable(this);
  77328. this.callParent(arguments);
  77329. },
  77330. setChecked: function(checked, suppressEvents) {
  77331. var me = this;
  77332. if (me.checked !== checked && (suppressEvents || me.fireEvent('beforecheckchange', me, checked) !== false)) {
  77333. if (me.el) {
  77334. me.el[checked ? 'addCls' : 'removeCls'](me.checkedCls)[!checked ? 'addCls' : 'removeCls'](me.uncheckedCls);
  77335. }
  77336. me.checked = checked;
  77337. Ext.menu.Manager.onCheckChange(me, checked);
  77338. if (!suppressEvents) {
  77339. Ext.callback(me.checkHandler, me.scope, [me, checked]);
  77340. me.fireEvent('checkchange', me, checked);
  77341. }
  77342. }
  77343. }
  77344. });
  77345. Ext.define('Ext.menu.KeyNav', {
  77346. extend: 'Ext.util.KeyNav',
  77347. requires: ['Ext.FocusManager'],
  77348. constructor: function(menu) {
  77349. var me = this;
  77350. me.menu = menu;
  77351. me.callParent([menu.el, {
  77352. down: me.down,
  77353. enter: me.enter,
  77354. esc: me.escape,
  77355. left: me.left,
  77356. right: me.right,
  77357. space: me.enter,
  77358. tab: me.tab,
  77359. up: me.up
  77360. }]);
  77361. },
  77362. down: function(e) {
  77363. var me = this,
  77364. fi = me.menu.focusedItem;
  77365. if (fi && e.getKey() == Ext.EventObject.DOWN && me.isWhitelisted(fi)) {
  77366. return true;
  77367. }
  77368. me.focusNextItem(1);
  77369. },
  77370. enter: function(e) {
  77371. var menu = this.menu,
  77372. focused = menu.focusedItem;
  77373. if (menu.activeItem) {
  77374. menu.onClick(e);
  77375. } else if (focused && focused.isFormField) {
  77376. return true;
  77377. }
  77378. },
  77379. escape: function(e) {
  77380. Ext.menu.Manager.hideAll();
  77381. },
  77382. focusNextItem: function(step) {
  77383. var menu = this.menu,
  77384. items = menu.items,
  77385. focusedItem = menu.focusedItem,
  77386. startIdx = focusedItem ? items.indexOf(focusedItem) : -1,
  77387. idx = startIdx + step,
  77388. item;
  77389. while (idx != startIdx) {
  77390. if (idx < 0) {
  77391. idx = items.length - 1;
  77392. } else if (idx >= items.length) {
  77393. idx = 0;
  77394. }
  77395. item = items.getAt(idx);
  77396. if (menu.canActivateItem(item)) {
  77397. menu.setActiveItem(item);
  77398. break;
  77399. }
  77400. idx += step;
  77401. }
  77402. },
  77403. isWhitelisted: function(item) {
  77404. return Ext.FocusManager.isWhitelisted(item);
  77405. },
  77406. left: function(e) {
  77407. var menu = this.menu,
  77408. fi = menu.focusedItem,
  77409. ai = menu.activeItem;
  77410. if (fi && this.isWhitelisted(fi)) {
  77411. return true;
  77412. }
  77413. menu.hide();
  77414. if (menu.parentMenu) {
  77415. menu.parentMenu.focus();
  77416. }
  77417. },
  77418. right: function(e) {
  77419. var menu = this.menu,
  77420. fi = menu.focusedItem,
  77421. ai = menu.activeItem,
  77422. am;
  77423. if (fi && this.isWhitelisted(fi)) {
  77424. return true;
  77425. }
  77426. if (ai) {
  77427. am = menu.activeItem.menu;
  77428. if (am) {
  77429. ai.expandMenu(0);
  77430. Ext.defer(function() {
  77431. am.setActiveItem(am.items.getAt(0));
  77432. }, 25);
  77433. }
  77434. }
  77435. },
  77436. tab: function(e) {
  77437. var me = this;
  77438. if (e.shiftKey) {
  77439. me.up(e);
  77440. } else {
  77441. me.down(e);
  77442. }
  77443. },
  77444. up: function(e) {
  77445. var me = this,
  77446. fi = me.menu.focusedItem;
  77447. if (fi && e.getKey() == Ext.EventObject.UP && me.isWhitelisted(fi)) {
  77448. return true;
  77449. }
  77450. me.focusNextItem(-1);
  77451. }
  77452. });
  77453. Ext.define('Ext.menu.Separator', {
  77454. extend: 'Ext.menu.Item',
  77455. alias: 'widget.menuseparator',
  77456. canActivate: false,
  77457. focusable: false,
  77458. hideOnClick: false,
  77459. plain: true,
  77460. separatorCls: Ext.baseCSSPrefix + 'menu-item-separator',
  77461. text: '&#160;',
  77462. beforeRender: function(ct, pos) {
  77463. var me = this;
  77464. me.callParent();
  77465. me.addCls(me.separatorCls);
  77466. }
  77467. });
  77468. Ext.define('Ext.menu.Menu', {
  77469. extend: 'Ext.panel.Panel',
  77470. alias: 'widget.menu',
  77471. requires: [
  77472. 'Ext.layout.container.Fit',
  77473. 'Ext.layout.container.VBox',
  77474. 'Ext.menu.CheckItem',
  77475. 'Ext.menu.Item',
  77476. 'Ext.menu.KeyNav',
  77477. 'Ext.menu.Manager',
  77478. 'Ext.menu.Separator'
  77479. ],
  77480. enableKeyNav: true,
  77481. allowOtherMenus: false,
  77482. ariaRole: 'menu',
  77483. defaultAlign: 'tl-bl?',
  77484. floating: true,
  77485. constrain: true,
  77486. hidden: true,
  77487. hideMode: 'visibility',
  77488. ignoreParentClicks: false,
  77489. isMenu: true,
  77490. showSeparator : true,
  77491. minWidth: undefined,
  77492. defaultMinWidth: 120,
  77493. initComponent: function() {
  77494. var me = this,
  77495. prefix = Ext.baseCSSPrefix,
  77496. cls = [prefix + 'menu'],
  77497. bodyCls = me.bodyCls ? [me.bodyCls] : [],
  77498. isFloating = me.floating !== false;
  77499. me.addEvents(
  77500. 'click',
  77501. 'mouseenter',
  77502. 'mouseleave',
  77503. 'mouseover'
  77504. );
  77505. Ext.menu.Manager.register(me);
  77506. if (me.plain) {
  77507. cls.push(prefix + 'menu-plain');
  77508. }
  77509. me.cls = cls.join(' ');
  77510. bodyCls.unshift(prefix + 'menu-body');
  77511. me.bodyCls = bodyCls.join(' ');
  77512. if (!me.layout) {
  77513. me.layout = {
  77514. type: 'vbox',
  77515. align: 'stretchmax',
  77516. overflowHandler: 'Scroller'
  77517. };
  77518. }
  77519. if (isFloating && me.minWidth === undefined) {
  77520. me.minWidth = me.defaultMinWidth;
  77521. }
  77522. if (!isFloating && me.initialConfig.hidden !== true) {
  77523. me.hidden = false;
  77524. }
  77525. me.callParent(arguments);
  77526. me.on('beforeshow', function() {
  77527. var hasItems = !!me.items.length;
  77528. if (hasItems && me.rendered) {
  77529. me.el.setStyle('visibility', null);
  77530. }
  77531. return hasItems;
  77532. });
  77533. },
  77534. beforeRender: function() {
  77535. this.callParent(arguments);
  77536. if (!this.getSizeModel().width.shrinkWrap) {
  77537. this.layout.align = 'stretch';
  77538. }
  77539. },
  77540. onBoxReady: function() {
  77541. var me = this,
  77542. separatorSpec;
  77543. me.callParent(arguments);
  77544. if (me.showSeparator) {
  77545. separatorSpec = {
  77546. cls: Ext.baseCSSPrefix + 'menu-icon-separator',
  77547. html: '&#160;'
  77548. };
  77549. if ((!Ext.isStrict && Ext.isIE) || Ext.isIE6) {
  77550. separatorSpec.style = 'height:' + me.el.getHeight() + 'px';
  77551. }
  77552. me.iconSepEl = me.layout.getElementTarget().insertFirst(separatorSpec);
  77553. }
  77554. me.mon(me.el, {
  77555. click: me.onClick,
  77556. mouseover: me.onMouseOver,
  77557. scope: me
  77558. });
  77559. me.mouseMonitor = me.el.monitorMouseLeave(100, me.onMouseLeave, me);
  77560. if (me.enableKeyNav) {
  77561. me.keyNav = new Ext.menu.KeyNav(me);
  77562. }
  77563. },
  77564. getBubbleTarget: function() {
  77565. return this.parentMenu || this.ownerButton || this.callParent(arguments);
  77566. },
  77567. canActivateItem: function(item) {
  77568. return item && !item.isDisabled() && item.isVisible() && (item.canActivate || item.getXTypes().indexOf('menuitem') < 0);
  77569. },
  77570. deactivateActiveItem: function(andBlurFocusedItem) {
  77571. var me = this,
  77572. activeItem = me.activeItem,
  77573. focusedItem = me.focusedItem;
  77574. if (activeItem) {
  77575. activeItem.deactivate();
  77576. if (!activeItem.activated) {
  77577. delete me.activeItem;
  77578. }
  77579. }
  77580. if (focusedItem && andBlurFocusedItem) {
  77581. focusedItem.blur();
  77582. delete me.focusedItem;
  77583. }
  77584. },
  77585. getFocusEl: function() {
  77586. return this.focusedItem || this.el;
  77587. },
  77588. hide: function() {
  77589. this.deactivateActiveItem(true);
  77590. this.callParent(arguments);
  77591. },
  77592. getItemFromEvent: function(e) {
  77593. return this.getChildByElement(e.getTarget());
  77594. },
  77595. lookupComponent: function(cmp) {
  77596. var me = this;
  77597. if (typeof cmp == 'string') {
  77598. cmp = me.lookupItemFromString(cmp);
  77599. } else if (Ext.isObject(cmp)) {
  77600. cmp = me.lookupItemFromObject(cmp);
  77601. }
  77602. cmp.minWidth = cmp.minWidth || me.minWidth;
  77603. return cmp;
  77604. },
  77605. lookupItemFromObject: function(cmp) {
  77606. var me = this,
  77607. prefix = Ext.baseCSSPrefix,
  77608. cls;
  77609. if (!cmp.isComponent) {
  77610. if (!cmp.xtype) {
  77611. cmp = Ext.create('Ext.menu.' + (Ext.isBoolean(cmp.checked) ? 'Check': '') + 'Item', cmp);
  77612. } else {
  77613. cmp = Ext.ComponentManager.create(cmp, cmp.xtype);
  77614. }
  77615. }
  77616. if (cmp.isMenuItem) {
  77617. cmp.parentMenu = me;
  77618. }
  77619. if (!cmp.isMenuItem && !cmp.dock) {
  77620. cls = [prefix + 'menu-item', prefix + 'menu-item-cmp'];
  77621. if (!me.plain && (cmp.indent === true || cmp.iconCls === 'no-icon')) {
  77622. cls.push(prefix + 'menu-item-indent');
  77623. }
  77624. if (cmp.rendered) {
  77625. cmp.el.addCls(cls);
  77626. } else {
  77627. cmp.cls = (cmp.cls ? cmp.cls : '') + ' ' + cls.join(' ');
  77628. }
  77629. }
  77630. return cmp;
  77631. },
  77632. lookupItemFromString: function(cmp) {
  77633. return (cmp == 'separator' || cmp == '-') ?
  77634. new Ext.menu.Separator()
  77635. : new Ext.menu.Item({
  77636. canActivate: false,
  77637. hideOnClick: false,
  77638. plain: true,
  77639. text: cmp
  77640. });
  77641. },
  77642. onClick: function(e) {
  77643. var me = this,
  77644. item;
  77645. if (me.disabled) {
  77646. e.stopEvent();
  77647. return;
  77648. }
  77649. item = (e.type === 'click') ? me.getItemFromEvent(e) : me.activeItem;
  77650. if (item && item.isMenuItem) {
  77651. if (!item.menu || !me.ignoreParentClicks) {
  77652. item.onClick(e);
  77653. } else {
  77654. e.stopEvent();
  77655. }
  77656. }
  77657. if (!item || item.disabled) {
  77658. item = undefined;
  77659. }
  77660. me.fireEvent('click', me, item, e);
  77661. },
  77662. onDestroy: function() {
  77663. var me = this;
  77664. Ext.menu.Manager.unregister(me);
  77665. delete me.parentMenu;
  77666. delete me.ownerButton;
  77667. if (me.rendered) {
  77668. me.el.un(me.mouseMonitor);
  77669. Ext.destroy(me.keyNav);
  77670. delete me.keyNav;
  77671. }
  77672. me.callParent(arguments);
  77673. },
  77674. onMouseLeave: function(e) {
  77675. var me = this;
  77676. me.deactivateActiveItem();
  77677. if (me.disabled) {
  77678. return;
  77679. }
  77680. me.fireEvent('mouseleave', me, e);
  77681. },
  77682. onMouseOver: function(e) {
  77683. var me = this,
  77684. fromEl = e.getRelatedTarget(),
  77685. mouseEnter = !me.el.contains(fromEl),
  77686. item = me.getItemFromEvent(e),
  77687. parentMenu = me.parentMenu,
  77688. parentItem = me.parentItem;
  77689. if (mouseEnter && parentMenu) {
  77690. parentMenu.setActiveItem(parentItem);
  77691. parentItem.cancelDeferHide();
  77692. parentMenu.mouseMonitor.mouseenter();
  77693. }
  77694. if (me.disabled) {
  77695. return;
  77696. }
  77697. if (item && !item.activated) {
  77698. me.setActiveItem(item);
  77699. if (item.activated && item.expandMenu) {
  77700. item.expandMenu();
  77701. }
  77702. }
  77703. if (mouseEnter) {
  77704. me.fireEvent('mouseenter', me, e);
  77705. }
  77706. me.fireEvent('mouseover', me, item, e);
  77707. },
  77708. setActiveItem: function(item) {
  77709. var me = this;
  77710. if (item && (item != me.activeItem)) {
  77711. me.deactivateActiveItem();
  77712. if (me.canActivateItem(item)) {
  77713. if (item.activate) {
  77714. item.activate();
  77715. if (item.activated) {
  77716. me.activeItem = item;
  77717. me.focusedItem = item;
  77718. me.focus();
  77719. }
  77720. } else {
  77721. item.focus();
  77722. me.focusedItem = item;
  77723. }
  77724. }
  77725. item.el.scrollIntoView(me.layout.getRenderTarget());
  77726. }
  77727. },
  77728. showBy: function(cmp, pos, off) {
  77729. var me = this;
  77730. if (me.floating && cmp) {
  77731. me.show();
  77732. me.setPagePosition(me.el.getAlignToXY(cmp.el || cmp, pos || me.defaultAlign, off));
  77733. me.setVerticalPosition();
  77734. }
  77735. return me;
  77736. },
  77737. show: function() {
  77738. var me = this,
  77739. parentEl, viewHeight, result,
  77740. maxWas = me.maxHeight;
  77741. if (!me.rendered){
  77742. me.doAutoRender();
  77743. }
  77744. if (me.floating) {
  77745. parentEl = Ext.fly(me.el.getScopeParent());
  77746. viewHeight = parentEl.getViewSize().height;
  77747. me.maxHeight = Math.min(maxWas || viewHeight, viewHeight);
  77748. }
  77749. result = me.callParent(arguments);
  77750. me.maxHeight = maxWas;
  77751. return result;
  77752. },
  77753. afterComponentLayout: function(width, height, oldWidth, oldHeight){
  77754. var me = this;
  77755. me.callParent(arguments);
  77756. if (me.showSeparator){
  77757. me.iconSepEl.setHeight(me.componentLayout.lastComponentSize.contentHeight);
  77758. }
  77759. },
  77760. setVerticalPosition: function(){
  77761. var me = this,
  77762. max,
  77763. y = me.el.getY(),
  77764. returnY = y,
  77765. height = me.getHeight(),
  77766. viewportHeight = Ext.Element.getViewportHeight().height,
  77767. parentEl = Ext.fly(me.el.getScopeParent()),
  77768. viewHeight = parentEl.getViewSize().height,
  77769. normalY = y - parentEl.getScroll().top;
  77770. parentEl = null;
  77771. if (me.floating) {
  77772. max = me.maxHeight ? me.maxHeight : viewHeight - normalY;
  77773. if (height > viewHeight) {
  77774. returnY = y - normalY;
  77775. } else if (max < height) {
  77776. returnY = y - (height - max);
  77777. } else if((y + height) > viewportHeight){
  77778. returnY = viewportHeight - height;
  77779. }
  77780. }
  77781. me.el.setY(returnY);
  77782. }
  77783. });
  77784. Ext.define('Ext.menu.ColorPicker', {
  77785. extend: 'Ext.menu.Menu',
  77786. alias: 'widget.colormenu',
  77787. requires: [
  77788. 'Ext.picker.Color'
  77789. ],
  77790. hideOnClick : true,
  77791. pickerId : null,
  77792. initComponent : function(){
  77793. var me = this,
  77794. cfg = Ext.apply({}, me.initialConfig);
  77795. delete cfg.listeners;
  77796. Ext.apply(me, {
  77797. plain: true,
  77798. showSeparator: false,
  77799. items: Ext.applyIf({
  77800. cls: Ext.baseCSSPrefix + 'menu-color-item',
  77801. id: me.pickerId,
  77802. xtype: 'colorpicker'
  77803. }, cfg)
  77804. });
  77805. me.callParent(arguments);
  77806. me.picker = me.down('colorpicker');
  77807. me.relayEvents(me.picker, ['select']);
  77808. if (me.hideOnClick) {
  77809. me.on('select', me.hidePickerOnSelect, me);
  77810. }
  77811. },
  77812. hidePickerOnSelect: function() {
  77813. Ext.menu.Manager.hideAll();
  77814. }
  77815. });
  77816. Ext.define('Ext.menu.DatePicker', {
  77817. extend: 'Ext.menu.Menu',
  77818. alias: 'widget.datemenu',
  77819. requires: [
  77820. 'Ext.picker.Date'
  77821. ],
  77822. hideOnClick : true,
  77823. pickerId : null,
  77824. initComponent : function(){
  77825. var me = this,
  77826. cfg = Ext.apply({}, me.initialConfig);
  77827. delete cfg.listeners;
  77828. Ext.apply(me, {
  77829. showSeparator: false,
  77830. plain: true,
  77831. border: false,
  77832. bodyPadding: 0,
  77833. items: Ext.applyIf({
  77834. cls: Ext.baseCSSPrefix + 'menu-date-item',
  77835. id: me.pickerId,
  77836. xtype: 'datepicker'
  77837. }, cfg)
  77838. });
  77839. me.callParent(arguments);
  77840. me.picker = me.down('datepicker');
  77841. me.relayEvents(me.picker, ['select']);
  77842. if (me.hideOnClick) {
  77843. me.on('select', me.hidePickerOnSelect, me);
  77844. }
  77845. },
  77846. hidePickerOnSelect: function() {
  77847. Ext.menu.Manager.hideAll();
  77848. }
  77849. });
  77850. Ext.define('Ext.panel.Tool', {
  77851. extend: 'Ext.Component',
  77852. requires: ['Ext.tip.QuickTipManager'],
  77853. alias: 'widget.tool',
  77854. baseCls: Ext.baseCSSPrefix + 'tool',
  77855. disabledCls: Ext.baseCSSPrefix + 'tool-disabled',
  77856. toolPressedCls: Ext.baseCSSPrefix + 'tool-pressed',
  77857. toolOverCls: Ext.baseCSSPrefix + 'tool-over',
  77858. ariaRole: 'button',
  77859. childEls: [
  77860. 'toolEl'
  77861. ],
  77862. renderTpl: [
  77863. '<img id="{id}-toolEl" src="{blank}" class="{baseCls}-{type}" role="presentation"/>'
  77864. ],
  77865. tooltipType: 'qtip',
  77866. stopEvent: true,
  77867. height: 15,
  77868. width: 15,
  77869. initComponent: function() {
  77870. var me = this;
  77871. me.addEvents(
  77872. 'click'
  77873. );
  77874. me.type = me.type || me.id;
  77875. Ext.applyIf(me.renderData, {
  77876. baseCls: me.baseCls,
  77877. blank: Ext.BLANK_IMAGE_URL,
  77878. type: me.type
  77879. });
  77880. me.tooltip = me.tooltip || me.qtip;
  77881. me.callParent();
  77882. me.on({
  77883. element: 'toolEl',
  77884. click: me.onClick,
  77885. mousedown: me.onMouseDown,
  77886. mouseover: me.onMouseOver,
  77887. mouseout: me.onMouseOut,
  77888. scope: me
  77889. });
  77890. },
  77891. afterRender: function() {
  77892. var me = this,
  77893. attr;
  77894. me.callParent(arguments);
  77895. if (me.tooltip) {
  77896. if (Ext.isObject(me.tooltip)) {
  77897. Ext.tip.QuickTipManager.register(Ext.apply({
  77898. target: me.id
  77899. }, me.tooltip));
  77900. }
  77901. else {
  77902. attr = me.tooltipType == 'qtip' ? 'data-qtip' : 'title';
  77903. me.toolEl.dom.setAttribute(attr, me.tooltip);
  77904. }
  77905. }
  77906. },
  77907. getFocusEl: function() {
  77908. return this.el;
  77909. },
  77910. setType: function(type) {
  77911. var me = this;
  77912. me.type = type;
  77913. if (me.rendered) {
  77914. me.toolEl.dom.className = me.baseCls + '-' + type;
  77915. }
  77916. return me;
  77917. },
  77918. bindTo: function(component) {
  77919. this.owner = component;
  77920. },
  77921. onClick: function(e, target) {
  77922. var me = this,
  77923. owner;
  77924. if (me.disabled) {
  77925. return false;
  77926. }
  77927. owner = me.owner || me.ownerCt;
  77928. me.el.removeCls(me.toolPressedCls);
  77929. me.el.removeCls(me.toolOverCls);
  77930. if (me.stopEvent !== false) {
  77931. e.stopEvent();
  77932. }
  77933. Ext.callback(me.handler, me.scope || me, [e, target, owner, me]);
  77934. me.fireEvent('click', me, e);
  77935. return true;
  77936. },
  77937. onDestroy: function(){
  77938. if (Ext.isObject(this.tooltip)) {
  77939. Ext.tip.QuickTipManager.unregister(this.id);
  77940. }
  77941. this.callParent();
  77942. },
  77943. onMouseDown: function() {
  77944. if (this.disabled) {
  77945. return false;
  77946. }
  77947. this.el.addCls(this.toolPressedCls);
  77948. },
  77949. onMouseOver: function() {
  77950. if (this.disabled) {
  77951. return false;
  77952. }
  77953. this.el.addCls(this.toolOverCls);
  77954. },
  77955. onMouseOut: function() {
  77956. this.el.removeCls(this.toolOverCls);
  77957. }
  77958. });
  77959. Ext.define('Ext.resizer.SplitterTracker', {
  77960. extend: 'Ext.dd.DragTracker',
  77961. requires: ['Ext.util.Region'],
  77962. enabled: true,
  77963. overlayCls: Ext.baseCSSPrefix + 'resizable-overlay',
  77964. createDragOverlay: function () {
  77965. var overlay;
  77966. overlay = this.overlay = Ext.getBody().createChild({
  77967. cls: this.overlayCls,
  77968. html: '&#160;'
  77969. });
  77970. overlay.unselectable();
  77971. overlay.setSize(Ext.Element.getViewWidth(true), Ext.Element.getViewHeight(true));
  77972. overlay.show();
  77973. },
  77974. getPrevCmp: function() {
  77975. var splitter = this.getSplitter();
  77976. return splitter.previousSibling();
  77977. },
  77978. getNextCmp: function() {
  77979. var splitter = this.getSplitter();
  77980. return splitter.nextSibling();
  77981. },
  77982. onBeforeStart: function(e) {
  77983. var me = this,
  77984. prevCmp = me.getPrevCmp(),
  77985. nextCmp = me.getNextCmp(),
  77986. collapseEl = me.getSplitter().collapseEl,
  77987. target = e.getTarget(),
  77988. box;
  77989. if (collapseEl && target === me.getSplitter().collapseEl.dom) {
  77990. return false;
  77991. }
  77992. if (nextCmp.collapsed || prevCmp.collapsed) {
  77993. return false;
  77994. }
  77995. me.prevBox = prevCmp.getEl().getBox();
  77996. me.nextBox = nextCmp.getEl().getBox();
  77997. me.constrainTo = box = me.calculateConstrainRegion();
  77998. if (!box) {
  77999. return false;
  78000. }
  78001. me.createDragOverlay();
  78002. return box;
  78003. },
  78004. onStart: function(e) {
  78005. var splitter = this.getSplitter();
  78006. splitter.addCls(splitter.baseCls + '-active');
  78007. },
  78008. calculateConstrainRegion: function() {
  78009. var me = this,
  78010. splitter = me.getSplitter(),
  78011. splitWidth = splitter.getWidth(),
  78012. defaultMin = splitter.defaultSplitMin,
  78013. orient = splitter.orientation,
  78014. prevBox = me.prevBox,
  78015. prevCmp = me.getPrevCmp(),
  78016. nextBox = me.nextBox,
  78017. nextCmp = me.getNextCmp(),
  78018. prevConstrainRegion, nextConstrainRegion;
  78019. if (orient === 'vertical') {
  78020. prevConstrainRegion = new Ext.util.Region(
  78021. prevBox.y,
  78022. (prevCmp.maxWidth ? prevBox.x + prevCmp.maxWidth : nextBox.right - (nextCmp.minWidth || defaultMin)) + splitWidth,
  78023. prevBox.bottom,
  78024. prevBox.x + (prevCmp.minWidth || defaultMin)
  78025. );
  78026. nextConstrainRegion = new Ext.util.Region(
  78027. nextBox.y,
  78028. nextBox.right - (nextCmp.minWidth || defaultMin),
  78029. nextBox.bottom,
  78030. (nextCmp.maxWidth ? nextBox.right - nextCmp.maxWidth : prevBox.x + (prevBox.minWidth || defaultMin)) - splitWidth
  78031. );
  78032. } else {
  78033. prevConstrainRegion = new Ext.util.Region(
  78034. prevBox.y + (prevCmp.minHeight || defaultMin),
  78035. prevBox.right,
  78036. (prevCmp.maxHeight ? prevBox.y + prevCmp.maxHeight : nextBox.bottom - (nextCmp.minHeight || defaultMin)) + splitWidth,
  78037. prevBox.x
  78038. );
  78039. nextConstrainRegion = new Ext.util.Region(
  78040. (nextCmp.maxHeight ? nextBox.bottom - nextCmp.maxHeight : prevBox.y + (prevCmp.minHeight || defaultMin)) - splitWidth,
  78041. nextBox.right,
  78042. nextBox.bottom - (nextCmp.minHeight || defaultMin),
  78043. nextBox.x
  78044. );
  78045. }
  78046. return prevConstrainRegion.intersect(nextConstrainRegion);
  78047. },
  78048. performResize: function(e, offset) {
  78049. var me = this,
  78050. splitter = me.getSplitter(),
  78051. orient = splitter.orientation,
  78052. prevCmp = me.getPrevCmp(),
  78053. nextCmp = me.getNextCmp(),
  78054. owner = splitter.ownerCt,
  78055. flexedSiblings = owner.query('>[flex]'),
  78056. len = flexedSiblings.length,
  78057. i = 0,
  78058. dimension,
  78059. size,
  78060. totalFlex = 0;
  78061. for (; i < len; i++) {
  78062. size = flexedSiblings[i].getWidth();
  78063. totalFlex += size;
  78064. flexedSiblings[i].flex = size;
  78065. }
  78066. offset = offset || me.getOffset('dragTarget');
  78067. if (orient === 'vertical') {
  78068. offset = offset[0];
  78069. dimension = 'width';
  78070. } else {
  78071. dimension = 'height';
  78072. offset = offset[1];
  78073. }
  78074. if (prevCmp) {
  78075. size = me.prevBox[dimension] + offset;
  78076. if (prevCmp.flex) {
  78077. prevCmp.flex = size;
  78078. } else {
  78079. prevCmp[dimension] = size;
  78080. }
  78081. }
  78082. if (nextCmp) {
  78083. size = me.nextBox[dimension] - offset;
  78084. if (nextCmp.flex) {
  78085. nextCmp.flex = size;
  78086. } else {
  78087. nextCmp[dimension] = size;
  78088. }
  78089. }
  78090. owner.updateLayout();
  78091. },
  78092. endDrag: function () {
  78093. var me = this;
  78094. if (me.overlay) {
  78095. me.overlay.remove();
  78096. delete me.overlay;
  78097. }
  78098. me.callParent(arguments);
  78099. },
  78100. onEnd: function(e) {
  78101. var me = this,
  78102. splitter = me.getSplitter();
  78103. splitter.removeCls(splitter.baseCls + '-active');
  78104. me.performResize(e, me.getOffset('dragTarget'));
  78105. },
  78106. onDrag: function(e) {
  78107. var me = this,
  78108. offset = me.getOffset('dragTarget'),
  78109. splitter = me.getSplitter(),
  78110. splitEl = splitter.getEl(),
  78111. orient = splitter.orientation;
  78112. if (orient === "vertical") {
  78113. splitEl.setX(me.startRegion.left + offset[0]);
  78114. } else {
  78115. splitEl.setY(me.startRegion.top + offset[1]);
  78116. }
  78117. },
  78118. getSplitter: function() {
  78119. return this.splitter;
  78120. }
  78121. });
  78122. Ext.define('Ext.resizer.BorderSplitterTracker', {
  78123. extend: 'Ext.resizer.SplitterTracker',
  78124. requires: ['Ext.util.Region'],
  78125. getPrevCmp: null,
  78126. getNextCmp: null,
  78127. calculateConstrainRegion: function() {
  78128. var me = this,
  78129. splitter = me.splitter,
  78130. collapseTarget = splitter.collapseTarget,
  78131. defaultSplitMin = splitter.defaultSplitMin,
  78132. sizePropCap = splitter.vertical ? 'Width' : 'Height',
  78133. minSizeProp = 'min' + sizePropCap,
  78134. maxSizeProp = 'max' + sizePropCap,
  78135. getSizeMethod = 'get' + sizePropCap,
  78136. neighbors = splitter.neighbors,
  78137. length = neighbors.length,
  78138. box = collapseTarget.el.getBox(),
  78139. left = box.x,
  78140. top = box.y,
  78141. right = box.right,
  78142. bottom = box.bottom,
  78143. size = splitter.vertical ? (right - left) : (bottom - top),
  78144. i, neighbor, minRange, maxRange, maxGrowth, maxShrink, targetSize;
  78145. minRange = (collapseTarget[minSizeProp] || Math.min(size,defaultSplitMin)) - size;
  78146. maxRange = collapseTarget[maxSizeProp];
  78147. if (!maxRange) {
  78148. maxRange = 1e9;
  78149. } else {
  78150. maxRange -= size;
  78151. }
  78152. targetSize = size;
  78153. for (i = 0; i < length; ++i) {
  78154. neighbor = neighbors[i];
  78155. size = neighbor[getSizeMethod]();
  78156. maxGrowth = size - neighbor[maxSizeProp];
  78157. maxShrink = size - (neighbor[minSizeProp] || Math.min(size,defaultSplitMin));
  78158. if (!isNaN(maxGrowth)) {
  78159. if (minRange < maxGrowth) {
  78160. minRange = maxGrowth;
  78161. }
  78162. }
  78163. if (maxRange > maxShrink) {
  78164. maxRange = maxShrink;
  78165. }
  78166. }
  78167. if (maxRange - minRange < 2) {
  78168. return null;
  78169. }
  78170. box = new Ext.util.Region(top, right, bottom, left);
  78171. me.constraintAdjusters[splitter.collapseDirection](box, minRange, maxRange, splitter);
  78172. me.dragInfo = {
  78173. minRange: minRange,
  78174. maxRange: maxRange,
  78175. targetSize: targetSize
  78176. };
  78177. return box;
  78178. },
  78179. constraintAdjusters: {
  78180. left: function (box, minRange, maxRange, splitter) {
  78181. box[0] = box.x = box.left = box.right + minRange;
  78182. box.right += maxRange + splitter.getWidth();
  78183. },
  78184. top: function (box, minRange, maxRange, splitter) {
  78185. box[1] = box.y = box.top = box.bottom + minRange;
  78186. box.bottom += maxRange + splitter.getHeight();
  78187. },
  78188. bottom: function (box, minRange, maxRange, splitter) {
  78189. box.bottom = box.top - minRange;
  78190. box.top -= maxRange + splitter.getHeight();
  78191. },
  78192. right: function (box, minRange, maxRange, splitter) {
  78193. box.right = box.left - minRange;
  78194. box.left -= maxRange + splitter.getWidth();
  78195. }
  78196. },
  78197. onBeforeStart: function(e) {
  78198. var me = this,
  78199. splitter = me.splitter,
  78200. collapseTarget = splitter.collapseTarget,
  78201. neighbors = splitter.neighbors,
  78202. collapseEl = me.getSplitter().collapseEl,
  78203. target = e.getTarget(),
  78204. length = neighbors.length,
  78205. i, neighbor;
  78206. if (collapseEl && target === splitter.collapseEl.dom) {
  78207. return false;
  78208. }
  78209. if (collapseTarget.collapsed) {
  78210. return false;
  78211. }
  78212. for (i = 0; i < length; ++i) {
  78213. neighbor = neighbors[i];
  78214. if (neighbor.collapsed && neighbor.isHorz === collapseTarget.isHorz) {
  78215. return false;
  78216. }
  78217. }
  78218. if (!(me.constrainTo = me.calculateConstrainRegion())) {
  78219. return false;
  78220. }
  78221. me.createDragOverlay();
  78222. return true;
  78223. },
  78224. performResize: function(e, offset) {
  78225. var me = this,
  78226. splitter = me.splitter,
  78227. collapseDirection = splitter.collapseDirection,
  78228. collapseTarget = splitter.collapseTarget,
  78229. adjusters = me.splitAdjusters[splitter.vertical ? 'horz' : 'vert'],
  78230. delta = offset[adjusters.index],
  78231. dragInfo = me.dragInfo,
  78232. owner;
  78233. if (collapseDirection == 'right' || collapseDirection == 'bottom') {
  78234. delta = -delta;
  78235. }
  78236. delta = Math.min(Math.max(dragInfo.minRange, delta), dragInfo.maxRange);
  78237. if (delta) {
  78238. (owner = splitter.ownerCt).suspendLayouts();
  78239. adjusters.adjustTarget(collapseTarget, dragInfo.targetSize, delta);
  78240. owner.resumeLayouts(true);
  78241. }
  78242. },
  78243. splitAdjusters: {
  78244. horz: {
  78245. index: 0,
  78246. adjustTarget: function (target, size, delta) {
  78247. target.flex = null;
  78248. target.setSize(size + delta);
  78249. }
  78250. },
  78251. vert: {
  78252. index: 1,
  78253. adjustTarget: function (target, targetSize, delta) {
  78254. target.flex = null;
  78255. target.setSize(undefined, targetSize + delta);
  78256. }
  78257. }
  78258. }
  78259. });
  78260. Ext.define('Ext.resizer.Handle', {
  78261. extend: 'Ext.Component',
  78262. handleCls: '',
  78263. baseHandleCls: Ext.baseCSSPrefix + 'resizable-handle',
  78264. region: '',
  78265. beforeRender: function() {
  78266. var me = this;
  78267. me.callParent();
  78268. me.addCls(
  78269. me.baseHandleCls,
  78270. me.baseHandleCls + '-' + me.region,
  78271. me.handleCls
  78272. );
  78273. },
  78274. onRender: function() {
  78275. this.callParent(arguments);
  78276. this.el.unselectable();
  78277. }
  78278. });
  78279. Ext.define('Ext.resizer.ResizeTracker', {
  78280. extend: 'Ext.dd.DragTracker',
  78281. dynamic: true,
  78282. preserveRatio: false,
  78283. constrainTo: null,
  78284. proxyCls: Ext.baseCSSPrefix + 'resizable-proxy',
  78285. constructor: function(config) {
  78286. var me = this,
  78287. widthRatio, heightRatio,
  78288. throttledResizeFn;
  78289. if (!config.el) {
  78290. if (config.target.isComponent) {
  78291. me.el = config.target.getEl();
  78292. } else {
  78293. me.el = config.target;
  78294. }
  78295. }
  78296. this.callParent(arguments);
  78297. if (me.preserveRatio && me.minWidth && me.minHeight) {
  78298. widthRatio = me.minWidth / me.el.getWidth();
  78299. heightRatio = me.minHeight / me.el.getHeight();
  78300. if (heightRatio > widthRatio) {
  78301. me.minWidth = me.el.getWidth() * heightRatio;
  78302. } else {
  78303. me.minHeight = me.el.getHeight() * widthRatio;
  78304. }
  78305. }
  78306. if (me.throttle) {
  78307. throttledResizeFn = Ext.Function.createThrottled(function() {
  78308. Ext.resizer.ResizeTracker.prototype.resize.apply(me, arguments);
  78309. }, me.throttle);
  78310. me.resize = function(box, direction, atEnd) {
  78311. if (atEnd) {
  78312. Ext.resizer.ResizeTracker.prototype.resize.apply(me, arguments);
  78313. } else {
  78314. throttledResizeFn.apply(null, arguments);
  78315. }
  78316. };
  78317. }
  78318. },
  78319. onBeforeStart: function(e) {
  78320. this.startBox = this.el.getBox();
  78321. },
  78322. getDynamicTarget: function() {
  78323. var me = this,
  78324. target = me.target;
  78325. if (me.dynamic) {
  78326. return target;
  78327. } else if (!me.proxy) {
  78328. me.proxy = me.createProxy(target);
  78329. }
  78330. me.proxy.show();
  78331. return me.proxy;
  78332. },
  78333. createProxy: function(target){
  78334. var proxy,
  78335. cls = this.proxyCls,
  78336. renderTo;
  78337. if (target.isComponent) {
  78338. proxy = target.getProxy().addCls(cls);
  78339. } else {
  78340. renderTo = Ext.getBody();
  78341. if (Ext.scopeResetCSS) {
  78342. renderTo = Ext.getBody().createChild({
  78343. cls: Ext.resetCls
  78344. });
  78345. }
  78346. proxy = target.createProxy({
  78347. tag: 'div',
  78348. cls: cls,
  78349. id: target.id + '-rzproxy'
  78350. }, renderTo);
  78351. }
  78352. proxy.removeCls(Ext.baseCSSPrefix + 'proxy-el');
  78353. return proxy;
  78354. },
  78355. onStart: function(e) {
  78356. this.activeResizeHandle = Ext.get(this.getDragTarget().id);
  78357. if (!this.dynamic) {
  78358. this.resize(this.startBox, {
  78359. horizontal: 'none',
  78360. vertical: 'none'
  78361. });
  78362. }
  78363. },
  78364. onDrag: function(e) {
  78365. if (this.dynamic || this.proxy) {
  78366. this.updateDimensions(e);
  78367. }
  78368. },
  78369. updateDimensions: function(e, atEnd) {
  78370. var me = this,
  78371. region = me.activeResizeHandle.region,
  78372. offset = me.getOffset(me.constrainTo ? 'dragTarget' : null),
  78373. box = me.startBox,
  78374. ratio,
  78375. widthAdjust = 0,
  78376. heightAdjust = 0,
  78377. snappedWidth,
  78378. snappedHeight,
  78379. adjustX = 0,
  78380. adjustY = 0,
  78381. dragRatio,
  78382. horizDir = offset[0] < 0 ? 'right' : 'left',
  78383. vertDir = offset[1] < 0 ? 'down' : 'up',
  78384. oppositeCorner,
  78385. axis,
  78386. newBox,
  78387. newHeight, newWidth;
  78388. switch (region) {
  78389. case 'south':
  78390. heightAdjust = offset[1];
  78391. axis = 2;
  78392. break;
  78393. case 'north':
  78394. heightAdjust = -offset[1];
  78395. adjustY = -heightAdjust;
  78396. axis = 2;
  78397. break;
  78398. case 'east':
  78399. widthAdjust = offset[0];
  78400. axis = 1;
  78401. break;
  78402. case 'west':
  78403. widthAdjust = -offset[0];
  78404. adjustX = -widthAdjust;
  78405. axis = 1;
  78406. break;
  78407. case 'northeast':
  78408. heightAdjust = -offset[1];
  78409. adjustY = -heightAdjust;
  78410. widthAdjust = offset[0];
  78411. oppositeCorner = [box.x, box.y + box.height];
  78412. axis = 3;
  78413. break;
  78414. case 'southeast':
  78415. heightAdjust = offset[1];
  78416. widthAdjust = offset[0];
  78417. oppositeCorner = [box.x, box.y];
  78418. axis = 3;
  78419. break;
  78420. case 'southwest':
  78421. widthAdjust = -offset[0];
  78422. adjustX = -widthAdjust;
  78423. heightAdjust = offset[1];
  78424. oppositeCorner = [box.x + box.width, box.y];
  78425. axis = 3;
  78426. break;
  78427. case 'northwest':
  78428. heightAdjust = -offset[1];
  78429. adjustY = -heightAdjust;
  78430. widthAdjust = -offset[0];
  78431. adjustX = -widthAdjust;
  78432. oppositeCorner = [box.x + box.width, box.y + box.height];
  78433. axis = 3;
  78434. break;
  78435. }
  78436. newBox = {
  78437. width: box.width + widthAdjust,
  78438. height: box.height + heightAdjust,
  78439. x: box.x + adjustX,
  78440. y: box.y + adjustY
  78441. };
  78442. snappedWidth = Ext.Number.snap(newBox.width, me.widthIncrement);
  78443. snappedHeight = Ext.Number.snap(newBox.height, me.heightIncrement);
  78444. if (snappedWidth != newBox.width || snappedHeight != newBox.height){
  78445. switch (region) {
  78446. case 'northeast':
  78447. newBox.y -= snappedHeight - newBox.height;
  78448. break;
  78449. case 'north':
  78450. newBox.y -= snappedHeight - newBox.height;
  78451. break;
  78452. case 'southwest':
  78453. newBox.x -= snappedWidth - newBox.width;
  78454. break;
  78455. case 'west':
  78456. newBox.x -= snappedWidth - newBox.width;
  78457. break;
  78458. case 'northwest':
  78459. newBox.x -= snappedWidth - newBox.width;
  78460. newBox.y -= snappedHeight - newBox.height;
  78461. }
  78462. newBox.width = snappedWidth;
  78463. newBox.height = snappedHeight;
  78464. }
  78465. if (newBox.width < me.minWidth || newBox.width > me.maxWidth) {
  78466. newBox.width = Ext.Number.constrain(newBox.width, me.minWidth, me.maxWidth);
  78467. if (adjustX) {
  78468. newBox.x = box.x + (box.width - newBox.width);
  78469. }
  78470. } else {
  78471. me.lastX = newBox.x;
  78472. }
  78473. if (newBox.height < me.minHeight || newBox.height > me.maxHeight) {
  78474. newBox.height = Ext.Number.constrain(newBox.height, me.minHeight, me.maxHeight);
  78475. if (adjustY) {
  78476. newBox.y = box.y + (box.height - newBox.height);
  78477. }
  78478. } else {
  78479. me.lastY = newBox.y;
  78480. }
  78481. if (me.preserveRatio || e.shiftKey) {
  78482. ratio = me.startBox.width / me.startBox.height;
  78483. newHeight = Math.min(Math.max(me.minHeight, newBox.width / ratio), me.maxHeight);
  78484. newWidth = Math.min(Math.max(me.minWidth, newBox.height * ratio), me.maxWidth);
  78485. if (axis == 1) {
  78486. newBox.height = newHeight;
  78487. }
  78488. else if (axis == 2) {
  78489. newBox.width = newWidth;
  78490. }
  78491. else {
  78492. dragRatio = Math.abs(oppositeCorner[0] - this.lastXY[0]) / Math.abs(oppositeCorner[1] - this.lastXY[1]);
  78493. if (dragRatio > ratio) {
  78494. newBox.height = newHeight;
  78495. } else {
  78496. newBox.width = newWidth;
  78497. }
  78498. if (region == 'northeast') {
  78499. newBox.y = box.y - (newBox.height - box.height);
  78500. } else if (region == 'northwest') {
  78501. newBox.y = box.y - (newBox.height - box.height);
  78502. newBox.x = box.x - (newBox.width - box.width);
  78503. } else if (region == 'southwest') {
  78504. newBox.x = box.x - (newBox.width - box.width);
  78505. }
  78506. }
  78507. }
  78508. if (heightAdjust === 0) {
  78509. vertDir = 'none';
  78510. }
  78511. if (widthAdjust === 0) {
  78512. horizDir = 'none';
  78513. }
  78514. me.resize(newBox, {
  78515. horizontal: horizDir,
  78516. vertical: vertDir
  78517. }, atEnd);
  78518. },
  78519. getResizeTarget: function(atEnd) {
  78520. return atEnd ? this.target : this.getDynamicTarget();
  78521. },
  78522. resize: function(box, direction, atEnd) {
  78523. var target = this.getResizeTarget(atEnd);
  78524. if (target.isComponent) {
  78525. target.setSize(box.width, box.height);
  78526. if (target.floating) {
  78527. target.setPagePosition(box.x, box.y);
  78528. }
  78529. } else {
  78530. target.setBox(box);
  78531. }
  78532. target = this.originalTarget;
  78533. if (target && (this.dynamic || atEnd)) {
  78534. if (target.isComponent) {
  78535. target.setSize(box.width, box.height);
  78536. if (target.floating) {
  78537. target.setPagePosition(box.x, box.y);
  78538. }
  78539. } else {
  78540. target.setBox(box);
  78541. }
  78542. }
  78543. },
  78544. onEnd: function(e) {
  78545. this.updateDimensions(e, true);
  78546. if (this.proxy) {
  78547. this.proxy.hide();
  78548. }
  78549. }
  78550. });
  78551. Ext.define('Ext.resizer.Resizer', {
  78552. mixins: {
  78553. observable: 'Ext.util.Observable'
  78554. },
  78555. uses: ['Ext.resizer.ResizeTracker', 'Ext.Component'],
  78556. alternateClassName: 'Ext.Resizable',
  78557. handleCls: Ext.baseCSSPrefix + 'resizable-handle',
  78558. pinnedCls: Ext.baseCSSPrefix + 'resizable-pinned',
  78559. overCls: Ext.baseCSSPrefix + 'resizable-over',
  78560. wrapCls: Ext.baseCSSPrefix + 'resizable-wrap',
  78561. dynamic: true,
  78562. handles: 's e se',
  78563. height : null,
  78564. width : null,
  78565. heightIncrement : 0,
  78566. widthIncrement : 0,
  78567. minHeight : 20,
  78568. minWidth : 20,
  78569. maxHeight : 10000,
  78570. maxWidth : 10000,
  78571. pinned: false,
  78572. preserveRatio: false,
  78573. transparent: false,
  78574. possiblePositions: {
  78575. n: 'north',
  78576. s: 'south',
  78577. e: 'east',
  78578. w: 'west',
  78579. se: 'southeast',
  78580. sw: 'southwest',
  78581. nw: 'northwest',
  78582. ne: 'northeast'
  78583. },
  78584. constructor: function(config) {
  78585. var me = this,
  78586. target,
  78587. targetEl,
  78588. tag,
  78589. handles = me.handles,
  78590. handleCls,
  78591. possibles,
  78592. len,
  78593. i = 0,
  78594. pos,
  78595. handleEls = [],
  78596. eastWestStyle, style,
  78597. box;
  78598. me.addEvents(
  78599. 'beforeresize',
  78600. 'resizedrag',
  78601. 'resize'
  78602. );
  78603. if (Ext.isString(config) || Ext.isElement(config) || config.dom) {
  78604. target = config;
  78605. config = arguments[1] || {};
  78606. config.target = target;
  78607. }
  78608. me.mixins.observable.constructor.call(me, config);
  78609. target = me.target;
  78610. if (target) {
  78611. if (target.isComponent) {
  78612. me.el = target.getEl();
  78613. if (target.minWidth) {
  78614. me.minWidth = target.minWidth;
  78615. }
  78616. if (target.minHeight) {
  78617. me.minHeight = target.minHeight;
  78618. }
  78619. if (target.maxWidth) {
  78620. me.maxWidth = target.maxWidth;
  78621. }
  78622. if (target.maxHeight) {
  78623. me.maxHeight = target.maxHeight;
  78624. }
  78625. if (target.floating) {
  78626. if (!me.hasOwnProperty('handles')) {
  78627. me.handles = 'n ne e se s sw w nw';
  78628. }
  78629. }
  78630. } else {
  78631. me.el = me.target = Ext.get(target);
  78632. }
  78633. }
  78634. else {
  78635. me.target = me.el = Ext.get(me.el);
  78636. }
  78637. tag = me.el.dom.tagName.toUpperCase();
  78638. if (tag == 'TEXTAREA' || tag == 'IMG' || tag == 'TABLE') {
  78639. me.originalTarget = me.target;
  78640. targetEl = me.el;
  78641. box = targetEl.getBox();
  78642. me.target = me.el = me.el.wrap({
  78643. cls: me.wrapCls,
  78644. id: me.el.id + '-rzwrap',
  78645. style: targetEl.getStyles('margin-top', 'margin-bottom')
  78646. });
  78647. me.el.setPositioning(targetEl.getPositioning());
  78648. targetEl.clearPositioning();
  78649. me.el.setBox(box);
  78650. targetEl.setStyle('position', 'absolute');
  78651. }
  78652. me.el.position();
  78653. if (me.pinned) {
  78654. me.el.addCls(me.pinnedCls);
  78655. }
  78656. me.resizeTracker = new Ext.resizer.ResizeTracker({
  78657. disabled: me.disabled,
  78658. target: me.target,
  78659. constrainTo: me.constrainTo,
  78660. overCls: me.overCls,
  78661. throttle: me.throttle,
  78662. originalTarget: me.originalTarget,
  78663. delegate: '.' + me.handleCls,
  78664. dynamic: me.dynamic,
  78665. preserveRatio: me.preserveRatio,
  78666. heightIncrement: me.heightIncrement,
  78667. widthIncrement: me.widthIncrement,
  78668. minHeight: me.minHeight,
  78669. maxHeight: me.maxHeight,
  78670. minWidth: me.minWidth,
  78671. maxWidth: me.maxWidth
  78672. });
  78673. me.resizeTracker.on({
  78674. mousedown: me.onBeforeResize,
  78675. drag: me.onResize,
  78676. dragend: me.onResizeEnd,
  78677. scope: me
  78678. });
  78679. if (me.handles == 'all') {
  78680. me.handles = 'n s e w ne nw se sw';
  78681. }
  78682. handles = me.handles = me.handles.split(/ |\s*?[,;]\s*?/);
  78683. possibles = me.possiblePositions;
  78684. len = handles.length;
  78685. handleCls = me.handleCls + ' ' + (me.target.isComponent ? (me.target.baseCls + '-handle ') : '') + me.handleCls + '-';
  78686. eastWestStyle = Ext.isIE6 ? ' style="height:' + me.el.getHeight() + 'px"' : '';
  78687. for (; i < len; i++){
  78688. if (handles[i] && possibles[handles[i]]) {
  78689. pos = possibles[handles[i]];
  78690. if (pos === 'east' || pos === 'west') {
  78691. style = eastWestStyle;
  78692. } else {
  78693. style = '';
  78694. }
  78695. handleEls.push('<div id="' + me.el.id + '-' + pos + '-handle" class="' + handleCls + pos + ' ' + Ext.baseCSSPrefix + 'unselectable"' + style + '></div>');
  78696. }
  78697. }
  78698. Ext.DomHelper.append(me.el, handleEls.join(''));
  78699. for (i = 0; i < len; i++){
  78700. if (handles[i] && possibles[handles[i]]) {
  78701. pos = possibles[handles[i]];
  78702. me[pos] = me.el.getById(me.el.id + '-' + pos + '-handle');
  78703. me[pos].region = pos;
  78704. me[pos].unselectable();
  78705. if (me.transparent) {
  78706. me[pos].setOpacity(0);
  78707. }
  78708. }
  78709. }
  78710. if (Ext.isNumber(me.width)) {
  78711. me.width = Ext.Number.constrain(me.width, me.minWidth, me.maxWidth);
  78712. }
  78713. if (Ext.isNumber(me.height)) {
  78714. me.height = Ext.Number.constrain(me.height, me.minHeight, me.maxHeight);
  78715. }
  78716. if (me.width !== null || me.height !== null) {
  78717. if (me.originalTarget) {
  78718. me.originalTarget.setWidth(me.width);
  78719. me.originalTarget.setHeight(me.height);
  78720. }
  78721. me.resizeTo(me.width, me.height);
  78722. }
  78723. me.forceHandlesHeight();
  78724. },
  78725. disable: function() {
  78726. this.resizeTracker.disable();
  78727. },
  78728. enable: function() {
  78729. this.resizeTracker.enable();
  78730. },
  78731. onBeforeResize: function(tracker, e) {
  78732. var box = this.el.getBox();
  78733. return this.fireEvent('beforeresize', this, box.width, box.height, e);
  78734. },
  78735. onResize: function(tracker, e) {
  78736. var me = this,
  78737. box = me.el.getBox();
  78738. me.forceHandlesHeight();
  78739. return me.fireEvent('resizedrag', me, box.width, box.height, e);
  78740. },
  78741. onResizeEnd: function(tracker, e) {
  78742. var me = this,
  78743. box = me.el.getBox();
  78744. me.forceHandlesHeight();
  78745. return me.fireEvent('resize', me, box.width, box.height, e);
  78746. },
  78747. resizeTo : function(width, height) {
  78748. var me = this;
  78749. me.target.setSize(width, height);
  78750. me.fireEvent('resize', me, width, height, null);
  78751. },
  78752. getEl : function() {
  78753. return this.el;
  78754. },
  78755. getTarget: function() {
  78756. return this.target;
  78757. },
  78758. destroy: function() {
  78759. var i = 0,
  78760. handles = this.handles,
  78761. len = handles.length,
  78762. positions = this.possiblePositions;
  78763. for (; i < len; i++) {
  78764. this[positions[handles[i]]].remove();
  78765. }
  78766. },
  78767. forceHandlesHeight : function() {
  78768. var me = this,
  78769. handle;
  78770. if (Ext.isIE6) {
  78771. handle = me.east;
  78772. if (handle) {
  78773. handle.setHeight(me.el.getHeight());
  78774. }
  78775. handle = me.west;
  78776. if (handle) {
  78777. handle.setHeight(me.el.getHeight());
  78778. }
  78779. me.el.repaint();
  78780. }
  78781. }
  78782. });
  78783. Ext.define('Ext.selection.CellModel', {
  78784. extend: 'Ext.selection.Model',
  78785. alias: 'selection.cellmodel',
  78786. requires: ['Ext.util.KeyNav'],
  78787. isCellModel: true,
  78788. enableKeyNav: true,
  78789. preventWrap: false,
  78790. noSelection: {
  78791. row: -1,
  78792. column: -1
  78793. },
  78794. constructor: function() {
  78795. this.addEvents(
  78796. 'deselect',
  78797. 'select'
  78798. );
  78799. this.callParent(arguments);
  78800. },
  78801. bindComponent: function(view) {
  78802. var me = this,
  78803. grid = view.ownerCt;
  78804. me.primaryView = view;
  78805. me.views = me.views || [];
  78806. me.views.push(view);
  78807. me.bindStore(view.getStore(), true);
  78808. view.on({
  78809. cellmousedown: me.onMouseDown,
  78810. refresh: me.onViewRefresh,
  78811. scope: me
  78812. });
  78813. if (grid.optimizedColumnMove !== false) {
  78814. grid.on('columnmove', me.onColumnMove, me);
  78815. }
  78816. if (me.enableKeyNav) {
  78817. me.initKeyNav(view);
  78818. }
  78819. },
  78820. initKeyNav: function(view) {
  78821. var me = this;
  78822. if (!view.rendered) {
  78823. view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true});
  78824. return;
  78825. }
  78826. view.el.set({
  78827. tabIndex: -1
  78828. });
  78829. me.keyNav = new Ext.util.KeyNav({
  78830. target: view.el,
  78831. ignoreInputFields: true,
  78832. up: me.onKeyUp,
  78833. down: me.onKeyDown,
  78834. right: me.onKeyRight,
  78835. left: me.onKeyLeft,
  78836. tab: me.onKeyTab,
  78837. scope: me
  78838. });
  78839. },
  78840. getHeaderCt: function() {
  78841. var selection = this.getCurrentPosition(),
  78842. view = selection ? selection.view : this.primaryView;
  78843. return view.headerCt;
  78844. },
  78845. onKeyUp: function(e, t) {
  78846. this.keyNavigation = true;
  78847. this.move('up', e);
  78848. this.keyNavigation = false;
  78849. },
  78850. onKeyDown: function(e, t) {
  78851. this.keyNavigation = true;
  78852. this.move('down', e);
  78853. this.keyNavigation = false;
  78854. },
  78855. onKeyLeft: function(e, t) {
  78856. this.keyNavigation = true;
  78857. this.move('left', e);
  78858. this.keyNavigation = false;
  78859. },
  78860. onKeyRight: function(e, t) {
  78861. this.keyNavigation = true;
  78862. this.move('right', e);
  78863. this.keyNavigation = false;
  78864. },
  78865. move: function(dir, e) {
  78866. var me = this,
  78867. pos = me.getCurrentPosition(),
  78868. newPos = pos.view.walkCells(pos, dir, e, me.preventWrap);
  78869. if (newPos) {
  78870. newPos.view = pos.view;
  78871. return me.setCurrentPosition(newPos);
  78872. }
  78873. },
  78874. getCurrentPosition: function() {
  78875. return this.selection;
  78876. },
  78877. setCurrentPosition: function(pos) {
  78878. var me = this;
  78879. me.lastSelection = me.selection;
  78880. if (me.selection) {
  78881. me.onCellDeselect(me.selection);
  78882. }
  78883. if (pos) {
  78884. me.nextSelection = new me.Selection(me);
  78885. me.nextSelection.setPosition(pos);
  78886. me.onCellSelect(me.nextSelection);
  78887. return me.selection = me.nextSelection;
  78888. }
  78889. },
  78890. onStoreRemove: function(store, record, index) {
  78891. var me = this,
  78892. pos = me.getCurrentPosition();
  78893. me.callParent(arguments);
  78894. if (pos) {
  78895. if (pos.row == index) {
  78896. if (index < store.getCount() - 1) {
  78897. pos.setPosition(index, pos.column);
  78898. me.setCurrentPosition(pos);
  78899. } else {
  78900. delete me.selection;
  78901. }
  78902. }
  78903. else if (index < pos.row) {
  78904. pos.setPosition(pos.row - 1, pos.column);
  78905. me.setCurrentPosition(pos);
  78906. }
  78907. }
  78908. },
  78909. onMouseDown: function(view, cell, cellIndex, record, row, rowIndex, e) {
  78910. this.setCurrentPosition({
  78911. view: view,
  78912. row: rowIndex,
  78913. column: cellIndex
  78914. });
  78915. },
  78916. onCellSelect: function(position, supressEvent) {
  78917. if (position && position.row !== undefined && position.row > -1) {
  78918. this.doSelect(position.view.getStore().getAt(position.row), false, supressEvent);
  78919. }
  78920. },
  78921. onCellDeselect: function(position, supressEvent) {
  78922. if (position && position.row !== undefined) {
  78923. this.doDeselect(position.view.getStore().getAt(position.row), supressEvent);
  78924. }
  78925. },
  78926. onSelectChange: function(record, isSelected, suppressEvent, commitFn) {
  78927. var me = this,
  78928. pos,
  78929. eventName,
  78930. view;
  78931. if (isSelected) {
  78932. pos = me.nextSelection;
  78933. eventName = 'select';
  78934. } else {
  78935. pos = me.lastSelection || me.noSelection;
  78936. eventName = 'deselect';
  78937. }
  78938. view = pos.view || me.primaryView;
  78939. if ((suppressEvent || me.fireEvent('before' + eventName, me, record, pos.row, pos.column)) !== false &&
  78940. commitFn() !== false) {
  78941. if (isSelected) {
  78942. view.onCellSelect(pos);
  78943. view.onCellFocus(pos);
  78944. } else {
  78945. view.onCellDeselect(pos);
  78946. delete me.selection;
  78947. }
  78948. if (!suppressEvent) {
  78949. me.fireEvent(eventName, me, record, pos.row, pos.column);
  78950. }
  78951. }
  78952. },
  78953. onKeyTab: function(e, t) {
  78954. var me = this,
  78955. editingPlugin = me.getCurrentPosition().view.editingPlugin;
  78956. if (editingPlugin && me.wasEditing) {
  78957. me.onEditorTab(editingPlugin, e)
  78958. } else {
  78959. me.move(e.shiftKey ? 'left' : 'right', e);
  78960. }
  78961. },
  78962. onEditorTab: function(editingPlugin, e) {
  78963. var me = this,
  78964. direction = e.shiftKey ? 'left' : 'right',
  78965. position = me.move(direction, e);
  78966. if (position) {
  78967. if (editingPlugin.startEditByPosition(position)) {
  78968. me.wasEditing = false;
  78969. }
  78970. else {
  78971. me.wasEditing = true;
  78972. if (!position.columnHeader.dataIndex) {
  78973. me.onEditorTab(editingPlugin, e);
  78974. }
  78975. }
  78976. }
  78977. },
  78978. refresh: function() {
  78979. var pos = this.getCurrentPosition(),
  78980. selRowIdx;
  78981. if (pos && (selRowIdx = this.store.indexOf(this.selected.last())) !== -1) {
  78982. pos.row = selRowIdx;
  78983. }
  78984. },
  78985. onColumnMove: function(headerCt, header, fromIdx, toIdx) {
  78986. var grid = headerCt.up('tablepanel');
  78987. if (grid) {
  78988. this.onViewRefresh(grid.view);
  78989. }
  78990. },
  78991. onViewRefresh: function(view) {
  78992. var me = this,
  78993. pos = me.getCurrentPosition(),
  78994. headerCt = view.headerCt,
  78995. record, columnHeader;
  78996. if (pos && pos.view === view) {
  78997. record = pos.record;
  78998. columnHeader = pos.columnHeader;
  78999. if (!columnHeader.isDescendantOf(headerCt)) {
  79000. columnHeader = headerCt.queryById(columnHeader.id) ||
  79001. headerCt.down('[text="' + columnHeader.text + '"]') ||
  79002. headerCt.down('[dataIndex="' + columnHeader.dataIndex + '"]');
  79003. }
  79004. if (columnHeader && (view.store.indexOfId(record.getId()) !== -1)) {
  79005. me.setCurrentPosition({
  79006. row: record,
  79007. column: columnHeader,
  79008. view: view
  79009. });
  79010. }
  79011. }
  79012. },
  79013. selectByPosition: function(position) {
  79014. this.setCurrentPosition(position);
  79015. }
  79016. }, function() {
  79017. var Selection = this.prototype.Selection = function(model) {
  79018. this.model = model;
  79019. };
  79020. Selection.prototype.setPosition = function(row, col) {
  79021. var me = this,
  79022. view;
  79023. if (arguments.length === 1) {
  79024. if (row.view) {
  79025. me.view = view = row.view;
  79026. }
  79027. col = row.column;
  79028. row = row.row;
  79029. }
  79030. if (!view) {
  79031. me.view = view = me.model.primaryView;
  79032. }
  79033. if (typeof row === 'number') {
  79034. me.row = row;
  79035. me.record = view.store.getAt(row);
  79036. }
  79037. else if (row.isModel) {
  79038. me.record = row;
  79039. me.row = view.indexOf(row);
  79040. }
  79041. else if (row.tagName) {
  79042. me.record = view.getRecord(row);
  79043. me.row = view.indexOf(me.record);
  79044. }
  79045. if (typeof col === 'number') {
  79046. me.column = col;
  79047. me.columnHeader = view.getHeaderAtIndex(col);
  79048. }
  79049. else {
  79050. me.columnHeader = col;
  79051. me.column = col.getIndex();
  79052. }
  79053. return me;
  79054. }
  79055. });
  79056. Ext.define('Ext.selection.RowModel', {
  79057. extend: 'Ext.selection.Model',
  79058. alias: 'selection.rowmodel',
  79059. requires: ['Ext.util.KeyNav'],
  79060. deltaScroll: 5,
  79061. enableKeyNav: true,
  79062. ignoreRightMouseSelection: false,
  79063. constructor: function() {
  79064. this.addEvents(
  79065. 'beforedeselect',
  79066. 'beforeselect',
  79067. 'deselect',
  79068. 'select'
  79069. );
  79070. this.views = [];
  79071. this.callParent(arguments);
  79072. },
  79073. bindComponent: function(view) {
  79074. var me = this;
  79075. me.views = me.views || [];
  79076. me.views.push(view);
  79077. me.bindStore(view.getStore(), true);
  79078. view.on({
  79079. itemmousedown: me.onRowMouseDown,
  79080. scope: me
  79081. });
  79082. if (me.enableKeyNav) {
  79083. me.initKeyNav(view);
  79084. }
  79085. },
  79086. initKeyNav: function(view) {
  79087. var me = this;
  79088. if (!view.rendered) {
  79089. view.on('render', Ext.Function.bind(me.initKeyNav, me, [view], 0), me, {single: true});
  79090. return;
  79091. }
  79092. view.el.set({
  79093. tabIndex: -1
  79094. });
  79095. me.keyNav = new Ext.util.KeyNav({
  79096. target: view,
  79097. ignoreInputFields: true,
  79098. eventName: 'itemkeydown',
  79099. processEvent: function(view, record, node, index, event) {
  79100. event.record = record;
  79101. event.recordIndex = index;
  79102. return event;
  79103. },
  79104. up: me.onKeyUp,
  79105. down: me.onKeyDown,
  79106. right: me.onKeyRight,
  79107. left: me.onKeyLeft,
  79108. pageDown: me.onKeyPageDown,
  79109. pageUp: me.onKeyPageUp,
  79110. home: me.onKeyHome,
  79111. end: me.onKeyEnd,
  79112. space: me.onKeySpace,
  79113. enter: me.onKeyEnter,
  79114. scope: me
  79115. });
  79116. },
  79117. getRowsVisible: function() {
  79118. var rowsVisible = false,
  79119. view = this.views[0],
  79120. row = view.getNode(0),
  79121. rowHeight, gridViewHeight;
  79122. if (row) {
  79123. rowHeight = Ext.fly(row).getHeight();
  79124. gridViewHeight = view.el.getHeight();
  79125. rowsVisible = Math.floor(gridViewHeight / rowHeight);
  79126. }
  79127. return rowsVisible;
  79128. },
  79129. onKeyEnd: function(e) {
  79130. var me = this,
  79131. last = me.store.getAt(me.store.getCount() - 1);
  79132. if (last) {
  79133. if (e.shiftKey) {
  79134. me.selectRange(last, me.lastFocused || 0);
  79135. me.setLastFocused(last);
  79136. } else if (e.ctrlKey) {
  79137. me.setLastFocused(last);
  79138. } else {
  79139. me.doSelect(last);
  79140. }
  79141. }
  79142. },
  79143. onKeyHome: function(e) {
  79144. var me = this,
  79145. first = me.store.getAt(0);
  79146. if (first) {
  79147. if (e.shiftKey) {
  79148. me.selectRange(first, me.lastFocused || 0);
  79149. me.setLastFocused(first);
  79150. } else if (e.ctrlKey) {
  79151. me.setLastFocused(first);
  79152. } else {
  79153. me.doSelect(first, false);
  79154. }
  79155. }
  79156. },
  79157. onKeyPageUp: function(e) {
  79158. var me = this,
  79159. rowsVisible = me.getRowsVisible(),
  79160. selIdx,
  79161. prevIdx,
  79162. prevRecord;
  79163. if (rowsVisible) {
  79164. selIdx = e.recordIndex;
  79165. prevIdx = selIdx - rowsVisible;
  79166. if (prevIdx < 0) {
  79167. prevIdx = 0;
  79168. }
  79169. prevRecord = me.store.getAt(prevIdx);
  79170. if (e.shiftKey) {
  79171. me.selectRange(prevRecord, e.record, e.ctrlKey, 'up');
  79172. me.setLastFocused(prevRecord);
  79173. } else if (e.ctrlKey) {
  79174. e.preventDefault();
  79175. me.setLastFocused(prevRecord);
  79176. } else {
  79177. me.doSelect(prevRecord);
  79178. }
  79179. }
  79180. },
  79181. onKeyPageDown: function(e) {
  79182. var me = this,
  79183. rowsVisible = me.getRowsVisible(),
  79184. selIdx,
  79185. nextIdx,
  79186. nextRecord;
  79187. if (rowsVisible) {
  79188. selIdx = e.recordIndex;
  79189. nextIdx = selIdx + rowsVisible;
  79190. if (nextIdx >= me.store.getCount()) {
  79191. nextIdx = me.store.getCount() - 1;
  79192. }
  79193. nextRecord = me.store.getAt(nextIdx);
  79194. if (e.shiftKey) {
  79195. me.selectRange(nextRecord, e.record, e.ctrlKey, 'down');
  79196. me.setLastFocused(nextRecord);
  79197. } else if (e.ctrlKey) {
  79198. e.preventDefault();
  79199. me.setLastFocused(nextRecord);
  79200. } else {
  79201. me.doSelect(nextRecord);
  79202. }
  79203. }
  79204. },
  79205. onKeySpace: function(e) {
  79206. var me = this,
  79207. record = me.lastFocused;
  79208. if (record) {
  79209. if (me.isSelected(record)) {
  79210. me.doDeselect(record, false);
  79211. } else {
  79212. me.doSelect(record, true);
  79213. }
  79214. }
  79215. },
  79216. onKeyEnter: Ext.emptyFn,
  79217. onKeyUp: function(e) {
  79218. var me = this,
  79219. idx = me.store.indexOf(me.lastFocused),
  79220. record;
  79221. if (idx > 0) {
  79222. record = me.store.getAt(idx - 1);
  79223. if (e.shiftKey && me.lastFocused) {
  79224. if (me.isSelected(me.lastFocused) && me.isSelected(record)) {
  79225. me.doDeselect(me.lastFocused, true);
  79226. me.setLastFocused(record);
  79227. } else if (!me.isSelected(me.lastFocused)) {
  79228. me.doSelect(me.lastFocused, true);
  79229. me.doSelect(record, true);
  79230. } else {
  79231. me.doSelect(record, true);
  79232. }
  79233. } else if (e.ctrlKey) {
  79234. me.setLastFocused(record);
  79235. } else {
  79236. me.doSelect(record);
  79237. }
  79238. }
  79239. },
  79240. onKeyDown: function(e) {
  79241. var me = this,
  79242. idx = me.store.indexOf(me.lastFocused),
  79243. record;
  79244. if (idx + 1 < me.store.getCount()) {
  79245. record = me.store.getAt(idx + 1);
  79246. if (me.selected.getCount() === 0) {
  79247. if (!e.ctrlKey) {
  79248. me.doSelect(record);
  79249. } else {
  79250. me.setLastFocused(record);
  79251. }
  79252. } else if (e.shiftKey && me.lastFocused) {
  79253. if (me.isSelected(me.lastFocused) && me.isSelected(record)) {
  79254. me.doDeselect(me.lastFocused, true);
  79255. me.setLastFocused(record);
  79256. } else if (!me.isSelected(me.lastFocused)) {
  79257. me.doSelect(me.lastFocused, true);
  79258. me.doSelect(record, true);
  79259. } else {
  79260. me.doSelect(record, true);
  79261. }
  79262. } else if (e.ctrlKey) {
  79263. me.setLastFocused(record);
  79264. } else {
  79265. me.doSelect(record);
  79266. }
  79267. }
  79268. },
  79269. scrollByDeltaX: function(delta) {
  79270. var view = this.views[0],
  79271. section = view.up(),
  79272. hScroll = section.horizontalScroller;
  79273. if (hScroll) {
  79274. hScroll.scrollByDeltaX(delta);
  79275. }
  79276. },
  79277. onKeyLeft: function(e) {
  79278. this.scrollByDeltaX(-this.deltaScroll);
  79279. },
  79280. onKeyRight: function(e) {
  79281. this.scrollByDeltaX(this.deltaScroll);
  79282. },
  79283. onRowMouseDown: function(view, record, item, index, e) {
  79284. if (!this.allowRightMouseSelection(e)) {
  79285. return;
  79286. }
  79287. if (e.button === 0 || !this.isSelected(record)) {
  79288. this.selectWithEvent(record, e);
  79289. }
  79290. },
  79291. allowRightMouseSelection: function(e) {
  79292. var disallow = this.ignoreRightMouseSelection && e.button !== 0;
  79293. if (disallow) {
  79294. disallow = this.hasSelection();
  79295. }
  79296. return !disallow;
  79297. },
  79298. onSelectChange: function(record, isSelected, suppressEvent, commitFn) {
  79299. var me = this,
  79300. views = me.views,
  79301. viewsLn = views.length,
  79302. store = me.store,
  79303. rowIdx = store.indexOf(record),
  79304. eventName = isSelected ? 'select' : 'deselect',
  79305. i = 0;
  79306. if ((suppressEvent || me.fireEvent('before' + eventName, me, record, rowIdx)) !== false &&
  79307. commitFn() !== false) {
  79308. for (; i < viewsLn; i++) {
  79309. if (isSelected) {
  79310. views[i].onRowSelect(rowIdx, suppressEvent);
  79311. } else {
  79312. views[i].onRowDeselect(rowIdx, suppressEvent);
  79313. }
  79314. }
  79315. if (!suppressEvent) {
  79316. me.fireEvent(eventName, me, record, rowIdx);
  79317. }
  79318. }
  79319. },
  79320. onLastFocusChanged: function(oldFocused, newFocused, supressFocus) {
  79321. var views = this.views,
  79322. viewsLn = views.length,
  79323. store = this.store,
  79324. rowIdx,
  79325. i = 0;
  79326. if (oldFocused) {
  79327. rowIdx = store.indexOf(oldFocused);
  79328. if (rowIdx != -1) {
  79329. for (; i < viewsLn; i++) {
  79330. views[i].onRowFocus(rowIdx, false);
  79331. }
  79332. }
  79333. }
  79334. if (newFocused) {
  79335. rowIdx = store.indexOf(newFocused);
  79336. if (rowIdx != -1) {
  79337. for (i = 0; i < viewsLn; i++) {
  79338. views[i].onRowFocus(rowIdx, true, supressFocus);
  79339. }
  79340. }
  79341. }
  79342. this.callParent();
  79343. },
  79344. onEditorTab: function(editingPlugin, e) {
  79345. var me = this,
  79346. view = me.views[0],
  79347. record = editingPlugin.getActiveRecord(),
  79348. header = editingPlugin.getActiveColumn(),
  79349. position = view.getPosition(record, header),
  79350. direction = e.shiftKey ? 'left' : 'right';
  79351. do {
  79352. position = view.walkCells(position, direction, e, me.preventWrap);
  79353. } while(position && !view.headerCt.getHeaderAtIndex(position.column).getEditor());
  79354. if (position) {
  79355. editingPlugin.startEditByPosition(position);
  79356. }
  79357. },
  79358. getCurrentPosition: function() {
  79359. var firstSelection = this.selected.items[0];
  79360. if (firstSelection) {
  79361. return {
  79362. row: this.store.indexOf(firstSelection),
  79363. column: 0
  79364. };
  79365. }
  79366. },
  79367. selectByPosition: function(position) {
  79368. var record = this.store.getAt(position.row);
  79369. this.select(record);
  79370. },
  79371. selectNext: function(keepExisting, suppressEvent) {
  79372. var me = this,
  79373. store = me.store,
  79374. selection = me.getSelection(),
  79375. record = selection[selection.length - 1],
  79376. index = store.indexOf(record) + 1,
  79377. success;
  79378. if(index === store.getCount() || index === 0) {
  79379. success = false;
  79380. } else {
  79381. me.doSelect(index, keepExisting, suppressEvent);
  79382. success = true;
  79383. }
  79384. return success;
  79385. },
  79386. selectPrevious: function(keepExisting, suppressEvent) {
  79387. var me = this,
  79388. selection = me.getSelection(),
  79389. record = selection[0],
  79390. index = me.store.indexOf(record) - 1,
  79391. success;
  79392. if (index < 0) {
  79393. success = false;
  79394. } else {
  79395. me.doSelect(index, keepExisting, suppressEvent);
  79396. success = true;
  79397. }
  79398. return success;
  79399. }
  79400. });
  79401. Ext.define('Ext.selection.CheckboxModel', {
  79402. alias: 'selection.checkboxmodel',
  79403. extend: 'Ext.selection.RowModel',
  79404. mode: 'MULTI',
  79405. injectCheckbox: 0,
  79406. checkOnly: false,
  79407. showHeaderCheckbox: true,
  79408. headerWidth: 24,
  79409. checkerOnCls: Ext.baseCSSPrefix + 'grid-hd-checker-on',
  79410. refreshOnRemove: true,
  79411. beforeViewRender: function(view) {
  79412. var me = this;
  79413. me.callParent(arguments);
  79414. if (!me.hasLockedHeader() || view.headerCt.lockedCt) {
  79415. if (me.showHeaderCheckbox !== false) {
  79416. view.headerCt.on('headerclick', me.onHeaderClick, me);
  79417. }
  79418. me.addCheckbox(view, true);
  79419. me.mon(view.ownerCt, 'reconfigure', me.onReconfigure, me);
  79420. }
  79421. },
  79422. bindComponent: function(view) {
  79423. var me = this;
  79424. me.sortable = false;
  79425. me.callParent(arguments);
  79426. },
  79427. hasLockedHeader: function(){
  79428. var views = this.views,
  79429. vLen = views.length,
  79430. v;
  79431. for (v = 0; v < vLen; v++) {
  79432. if (views[v].headerCt.lockedCt) {
  79433. return true;
  79434. }
  79435. }
  79436. return false;
  79437. },
  79438. addCheckbox: function(view, initial){
  79439. var me = this,
  79440. checkbox = me.injectCheckbox,
  79441. headerCt = view.headerCt;
  79442. if (checkbox !== false) {
  79443. if (checkbox == 'first') {
  79444. checkbox = 0;
  79445. } else if (checkbox == 'last') {
  79446. checkbox = headerCt.getColumnCount();
  79447. }
  79448. Ext.suspendLayouts();
  79449. headerCt.add(checkbox, me.getHeaderConfig());
  79450. Ext.resumeLayouts();
  79451. }
  79452. if (initial !== true) {
  79453. view.refresh();
  79454. }
  79455. },
  79456. onReconfigure: function(grid, store, columns) {
  79457. if(columns) {
  79458. this.addCheckbox(this.views[0]);
  79459. }
  79460. },
  79461. toggleUiHeader: function(isChecked) {
  79462. var view = this.views[0],
  79463. headerCt = view.headerCt,
  79464. checkHd = headerCt.child('gridcolumn[isCheckerHd]');
  79465. if (checkHd) {
  79466. if (isChecked) {
  79467. checkHd.el.addCls(this.checkerOnCls);
  79468. } else {
  79469. checkHd.el.removeCls(this.checkerOnCls);
  79470. }
  79471. }
  79472. },
  79473. onHeaderClick: function(headerCt, header, e) {
  79474. if (header.isCheckerHd) {
  79475. e.stopEvent();
  79476. var me = this,
  79477. isChecked = header.el.hasCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');
  79478. me.preventFocus = true;
  79479. if (isChecked) {
  79480. me.deselectAll();
  79481. } else {
  79482. me.selectAll();
  79483. }
  79484. delete me.preventFocus;
  79485. }
  79486. },
  79487. getHeaderConfig: function() {
  79488. var me = this,
  79489. showCheck = me.showHeaderCheckbox !== false;
  79490. return {
  79491. isCheckerHd: showCheck,
  79492. text : '&#160;',
  79493. width: me.headerWidth,
  79494. sortable: false,
  79495. draggable: false,
  79496. resizable: false,
  79497. hideable: false,
  79498. menuDisabled: true,
  79499. dataIndex: '',
  79500. cls: showCheck ? Ext.baseCSSPrefix + 'column-header-checkbox ' : '',
  79501. renderer: Ext.Function.bind(me.renderer, me),
  79502. editRenderer: me.editRenderer || me.renderEmpty,
  79503. locked: me.hasLockedHeader()
  79504. };
  79505. },
  79506. renderEmpty: function(){
  79507. return '&#160;';
  79508. },
  79509. renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
  79510. var baseCSSPrefix = Ext.baseCSSPrefix;
  79511. metaData.tdCls = baseCSSPrefix + 'grid-cell-special ' + baseCSSPrefix + 'grid-cell-row-checker';
  79512. return '<div class="' + baseCSSPrefix + 'grid-row-checker">&#160;</div>';
  79513. },
  79514. onRowMouseDown: function(view, record, item, index, e) {
  79515. view.el.focus();
  79516. var me = this,
  79517. checker = e.getTarget('.' + Ext.baseCSSPrefix + 'grid-row-checker'),
  79518. mode;
  79519. if (!me.allowRightMouseSelection(e)) {
  79520. return;
  79521. }
  79522. if (me.checkOnly && !checker) {
  79523. return;
  79524. }
  79525. if (checker) {
  79526. mode = me.getSelectionMode();
  79527. if (mode !== 'SINGLE') {
  79528. me.setSelectionMode('SIMPLE');
  79529. }
  79530. me.selectWithEvent(record, e);
  79531. me.setSelectionMode(mode);
  79532. } else {
  79533. me.selectWithEvent(record, e);
  79534. }
  79535. },
  79536. onSelectChange: function() {
  79537. var me = this;
  79538. me.callParent(arguments);
  79539. me.updateHeaderState();
  79540. },
  79541. onStoreLoad: function() {
  79542. var me = this;
  79543. me.callParent(arguments);
  79544. me.updateHeaderState();
  79545. },
  79546. updateHeaderState: function() {
  79547. var hdSelectStatus = this.selected.getCount() === this.store.getCount();
  79548. this.toggleUiHeader(hdSelectStatus);
  79549. }
  79550. });
  79551. Ext.define('Ext.selection.TreeModel', {
  79552. extend: 'Ext.selection.RowModel',
  79553. alias: 'selection.treemodel',
  79554. pruneRemoved: false,
  79555. onKeyRight: function(e, t) {
  79556. var focused = this.getLastFocused(),
  79557. view = this.view;
  79558. if (focused) {
  79559. if (focused.isExpanded()) {
  79560. this.onKeyDown(e, t);
  79561. } else if (focused.isExpandable()) {
  79562. view.expand(focused);
  79563. }
  79564. }
  79565. },
  79566. onKeyLeft: function(e, t) {
  79567. var focused = this.getLastFocused(),
  79568. view = this.view,
  79569. viewSm = view.getSelectionModel(),
  79570. parentNode, parentRecord;
  79571. if (focused) {
  79572. parentNode = focused.parentNode;
  79573. if (focused.isExpanded()) {
  79574. view.collapse(focused);
  79575. } else if (parentNode && !parentNode.isRoot()) {
  79576. if (e.shiftKey) {
  79577. viewSm.selectRange(parentNode, focused, e.ctrlKey, 'up');
  79578. viewSm.setLastFocused(parentNode);
  79579. } else if (e.ctrlKey) {
  79580. viewSm.setLastFocused(parentNode);
  79581. } else {
  79582. viewSm.select(parentNode);
  79583. }
  79584. }
  79585. }
  79586. },
  79587. onKeySpace: function(e, t) {
  79588. this.toggleCheck(e);
  79589. },
  79590. onKeyEnter: function(e, t) {
  79591. this.toggleCheck(e);
  79592. },
  79593. toggleCheck: function(e){
  79594. e.stopEvent();
  79595. var selected = this.getLastSelected();
  79596. if (selected) {
  79597. this.view.onCheckChange(selected);
  79598. }
  79599. }
  79600. });
  79601. Ext.define('Ext.slider.Thumb', {
  79602. requires: ['Ext.dd.DragTracker', 'Ext.util.Format'],
  79603. topZIndex: 10000,
  79604. constructor: function(config) {
  79605. var me = this;
  79606. Ext.apply(me, config || {}, {
  79607. cls: Ext.baseCSSPrefix + 'slider-thumb',
  79608. constrain: false
  79609. });
  79610. me.callParent([config]);
  79611. },
  79612. render: function() {
  79613. var me = this;
  79614. me.el = me.slider.innerEl.insertFirst(me.getElConfig());
  79615. me.onRender();
  79616. },
  79617. onRender: function() {
  79618. if (this.disabled) {
  79619. this.disable();
  79620. }
  79621. this.initEvents();
  79622. },
  79623. getElConfig: function() {
  79624. var me = this,
  79625. slider = me.slider,
  79626. style = {};
  79627. style[slider.vertical ? 'bottom' : 'left'] = slider.calculateThumbPosition(slider.normalizeValue(me.value)) + '%';
  79628. return {
  79629. style: style,
  79630. id : this.id,
  79631. cls : this.cls
  79632. };
  79633. },
  79634. move: function(v, animate) {
  79635. var el = this.el,
  79636. styleProp = this.slider.vertical ? 'bottom' : 'left',
  79637. to,
  79638. from;
  79639. v += '%';
  79640. if (!animate) {
  79641. el.dom.style[styleProp] = v;
  79642. } else {
  79643. to = {};
  79644. to[styleProp] = v;
  79645. if (!Ext.supports.GetPositionPercentage) {
  79646. from = {};
  79647. from[styleProp] = el.dom.style[styleProp];
  79648. }
  79649. new Ext.fx.Anim({
  79650. target: el,
  79651. duration: 350,
  79652. from: from,
  79653. to: to
  79654. });
  79655. }
  79656. },
  79657. bringToFront: function() {
  79658. this.el.setStyle('zIndex', this.topZIndex);
  79659. },
  79660. sendToBack: function() {
  79661. this.el.setStyle('zIndex', '');
  79662. },
  79663. enable: function() {
  79664. var me = this;
  79665. me.disabled = false;
  79666. if (me.el) {
  79667. me.el.removeCls(me.slider.disabledCls);
  79668. }
  79669. },
  79670. disable: function() {
  79671. var me = this;
  79672. me.disabled = true;
  79673. if (me.el) {
  79674. me.el.addCls(me.slider.disabledCls);
  79675. }
  79676. },
  79677. initEvents: function() {
  79678. var me = this,
  79679. el = me.el;
  79680. me.tracker = new Ext.dd.DragTracker({
  79681. onBeforeStart: Ext.Function.bind(me.onBeforeDragStart, me),
  79682. onStart : Ext.Function.bind(me.onDragStart, me),
  79683. onDrag : Ext.Function.bind(me.onDrag, me),
  79684. onEnd : Ext.Function.bind(me.onDragEnd, me),
  79685. tolerance : 3,
  79686. autoStart : 300,
  79687. overCls : Ext.baseCSSPrefix + 'slider-thumb-over'
  79688. });
  79689. me.tracker.initEl(el);
  79690. },
  79691. onBeforeDragStart : function(e) {
  79692. if (this.disabled) {
  79693. return false;
  79694. } else {
  79695. this.slider.promoteThumb(this);
  79696. return true;
  79697. }
  79698. },
  79699. onDragStart: function(e){
  79700. var me = this;
  79701. me.el.addCls(Ext.baseCSSPrefix + 'slider-thumb-drag');
  79702. me.dragging = me.slider.dragging = true;
  79703. me.dragStartValue = me.value;
  79704. me.slider.fireEvent('dragstart', me.slider, e, me);
  79705. },
  79706. onDrag: function(e) {
  79707. var me = this,
  79708. slider = me.slider,
  79709. index = me.index,
  79710. newValue = me.getValueFromTracker(),
  79711. above,
  79712. below;
  79713. if (newValue !== undefined) {
  79714. if (me.constrain) {
  79715. above = slider.thumbs[index + 1];
  79716. below = slider.thumbs[index - 1];
  79717. if (below !== undefined && newValue <= below.value) {
  79718. newValue = below.value;
  79719. }
  79720. if (above !== undefined && newValue >= above.value) {
  79721. newValue = above.value;
  79722. }
  79723. }
  79724. slider.setValue(index, newValue, false);
  79725. slider.fireEvent('drag', slider, e, me);
  79726. }
  79727. },
  79728. getValueFromTracker: function() {
  79729. var slider = this.slider,
  79730. trackPoint = slider.getTrackpoint(this.tracker.getXY());
  79731. if (trackPoint !== undefined) {
  79732. return slider.reversePixelValue(trackPoint);
  79733. }
  79734. },
  79735. onDragEnd: function(e) {
  79736. var me = this,
  79737. slider = me.slider,
  79738. value = me.value;
  79739. me.el.removeCls(Ext.baseCSSPrefix + 'slider-thumb-drag');
  79740. me.dragging = slider.dragging = false;
  79741. slider.fireEvent('dragend', slider, e);
  79742. if (me.dragStartValue != value) {
  79743. slider.fireEvent('changecomplete', slider, value, me);
  79744. }
  79745. },
  79746. destroy: function() {
  79747. Ext.destroy(this.tracker);
  79748. }
  79749. });
  79750. Ext.define('Ext.slider.Tip', {
  79751. extend: 'Ext.tip.Tip',
  79752. minWidth: 10,
  79753. alias: 'widget.slidertip',
  79754. offsets : null,
  79755. align: null,
  79756. position: '',
  79757. defaultVerticalPosition: 'left',
  79758. defaultHorizontalPosition: 'top',
  79759. isSliderTip: true,
  79760. init: function(slider) {
  79761. var me = this,
  79762. align,
  79763. offsets;
  79764. if (!me.position) {
  79765. me.position = slider.vertical ? me.defaultVerticalPosition : me.defaultHorizontalPosition;
  79766. }
  79767. switch (me.position) {
  79768. case 'top':
  79769. offsets = [0, -10];
  79770. align = 'b-t?';
  79771. break;
  79772. case 'bottom':
  79773. offsets = [0, 10];
  79774. align = 't-b?';
  79775. break;
  79776. case 'left':
  79777. offsets = [-10, 0];
  79778. align = 'r-l?';
  79779. break;
  79780. case 'right':
  79781. offsets = [10, 0];
  79782. align = 'l-r?';
  79783. }
  79784. if (!me.align) {
  79785. me.align = align;
  79786. }
  79787. if (!me.offsets) {
  79788. me.offsets = offsets;
  79789. }
  79790. slider.on({
  79791. scope : me,
  79792. dragstart: me.onSlide,
  79793. drag : me.onSlide,
  79794. dragend : me.hide,
  79795. destroy : me.destroy
  79796. });
  79797. },
  79798. onSlide : function(slider, e, thumb) {
  79799. var me = this;
  79800. me.show();
  79801. me.update(me.getText(thumb));
  79802. me.el.alignTo(thumb.el, me.align, me.offsets);
  79803. },
  79804. getText : function(thumb) {
  79805. return String(thumb.value);
  79806. }
  79807. });
  79808. Ext.define('Ext.slider.Multi', {
  79809. extend: 'Ext.form.field.Base',
  79810. alias: 'widget.multislider',
  79811. alternateClassName: 'Ext.slider.MultiSlider',
  79812. requires: [
  79813. 'Ext.slider.Thumb',
  79814. 'Ext.slider.Tip',
  79815. 'Ext.Number',
  79816. 'Ext.util.Format',
  79817. 'Ext.Template',
  79818. 'Ext.layout.component.field.Slider'
  79819. ],
  79820. childEls: [
  79821. 'endEl', 'innerEl'
  79822. ],
  79823. fieldSubTpl: [
  79824. '<div id="{id}" class="' + Ext.baseCSSPrefix + 'slider {fieldCls} {vertical}" aria-valuemin="{minValue}" aria-valuemax="{maxValue}" aria-valuenow="{value}" aria-valuetext="{value}">',
  79825. '<div id="{cmpId}-endEl" class="' + Ext.baseCSSPrefix + 'slider-end" role="presentation">',
  79826. '<div id="{cmpId}-innerEl" class="' + Ext.baseCSSPrefix + 'slider-inner" role="presentation">',
  79827. '{%this.renderThumbs(out, values)%}',
  79828. '</div>',
  79829. '</div>',
  79830. '</div>',
  79831. {
  79832. renderThumbs: function(out, values) {
  79833. var me = values.$comp,
  79834. i = 0,
  79835. thumbs = me.thumbs,
  79836. len = thumbs.length,
  79837. thumb,
  79838. thumbConfig;
  79839. for (; i < len; i++) {
  79840. thumb = thumbs[i];
  79841. thumbConfig = thumb.getElConfig();
  79842. thumbConfig.id = me.id + '-thumb-' + i;
  79843. Ext.DomHelper.generateMarkup(thumbConfig, out);
  79844. }
  79845. },
  79846. disableFormats: true
  79847. }
  79848. ],
  79849. vertical: false,
  79850. minValue: 0,
  79851. maxValue: 100,
  79852. decimalPrecision: 0,
  79853. keyIncrement: 1,
  79854. increment: 0,
  79855. clickRange: [5,15],
  79856. clickToChange : true,
  79857. animate: true,
  79858. dragging: false,
  79859. constrainThumbs: true,
  79860. componentLayout: 'sliderfield',
  79861. useTips : true,
  79862. tipText : null,
  79863. ariaRole: 'slider',
  79864. initValue: function() {
  79865. var me = this,
  79866. extValue = Ext.value,
  79867. values = extValue(me.values, [extValue(me.value, extValue(me.minValue, 0))]),
  79868. i = 0,
  79869. len = values.length;
  79870. me.originalValue = values;
  79871. for (; i < len; i++) {
  79872. me.addThumb(values[i]);
  79873. }
  79874. },
  79875. initComponent : function() {
  79876. var me = this,
  79877. tipPlug,
  79878. hasTip,
  79879. p, pLen, plugins;
  79880. me.thumbs = [];
  79881. me.keyIncrement = Math.max(me.increment, me.keyIncrement);
  79882. me.addEvents(
  79883. 'beforechange',
  79884. 'change',
  79885. 'changecomplete',
  79886. 'dragstart',
  79887. 'drag',
  79888. 'dragend'
  79889. );
  79890. if (me.increment) {
  79891. me.maxValue = Ext.Number.snapInRange(me.maxValue, me.increment, me.minValue);
  79892. me.value = me.normalizeValue(me.value);
  79893. }
  79894. me.callParent();
  79895. if (me.useTips) {
  79896. if (Ext.isObject(me.useTips)) {
  79897. tipPlug = Ext.apply({}, me.useTips);
  79898. } else {
  79899. tipPlug = me.tipText ? {getText: me.tipText} : {};
  79900. }
  79901. plugins = me.plugins = me.plugins || [];
  79902. pLen = plugins.length;
  79903. for (p = 0; p < pLen; p++) {
  79904. if (plugins[p].isSliderTip) {
  79905. hasTip = true;
  79906. break;
  79907. }
  79908. }
  79909. if (!hasTip) {
  79910. me.plugins.push(new Ext.slider.Tip(tipPlug));
  79911. }
  79912. }
  79913. },
  79914. addThumb: function(value) {
  79915. var me = this,
  79916. thumb = new Ext.slider.Thumb({
  79917. ownerCt : me,
  79918. ownerLayout : me.getComponentLayout(),
  79919. value : value,
  79920. slider : me,
  79921. index : me.thumbs.length,
  79922. constrain : me.constrainThumbs,
  79923. disabled : !!me.readOnly
  79924. });
  79925. me.thumbs.push(thumb);
  79926. if (me.rendered) {
  79927. thumb.render();
  79928. }
  79929. return thumb;
  79930. },
  79931. promoteThumb: function(topThumb) {
  79932. var thumbs = this.thumbs,
  79933. ln = thumbs.length,
  79934. zIndex, thumb, i;
  79935. for (i = 0; i < ln; i++) {
  79936. thumb = thumbs[i];
  79937. if (thumb == topThumb) {
  79938. thumb.bringToFront();
  79939. } else {
  79940. thumb.sendToBack();
  79941. }
  79942. }
  79943. },
  79944. getSubTplData : function() {
  79945. var me = this;
  79946. return Ext.apply(me.callParent(), {
  79947. $comp: me,
  79948. vertical: me.vertical ? Ext.baseCSSPrefix + 'slider-vert' : Ext.baseCSSPrefix + 'slider-horz',
  79949. minValue: me.minValue,
  79950. maxValue: me.maxValue,
  79951. value: me.value
  79952. });
  79953. },
  79954. onRender : function() {
  79955. var me = this,
  79956. thumbs = me.thumbs,
  79957. len = thumbs.length,
  79958. i = 0,
  79959. thumb;
  79960. me.callParent(arguments);
  79961. for (i = 0; i < len; i++) {
  79962. thumb = thumbs[i];
  79963. thumb.el = me.el.getById(me.id + '-thumb-' + i);
  79964. thumb.onRender();
  79965. }
  79966. },
  79967. initEvents : function() {
  79968. var me = this;
  79969. me.mon(me.el, {
  79970. scope : me,
  79971. mousedown: me.onMouseDown,
  79972. keydown : me.onKeyDown
  79973. });
  79974. },
  79975. getTrackpoint : function(xy) {
  79976. var me = this,
  79977. result,
  79978. positionProperty,
  79979. sliderTrack = me.innerEl,
  79980. trackLength;
  79981. if (me.vertical) {
  79982. positionProperty = 'top';
  79983. trackLength = sliderTrack.getHeight();
  79984. } else {
  79985. positionProperty = 'left';
  79986. trackLength = sliderTrack.getWidth();
  79987. }
  79988. result = Ext.Number.constrain(sliderTrack.translatePoints(xy)[positionProperty], 0, trackLength);
  79989. return me.vertical ? trackLength - result : result;
  79990. },
  79991. onMouseDown : function(e) {
  79992. var me = this,
  79993. thumbClicked = false,
  79994. i = 0,
  79995. thumbs = me.thumbs,
  79996. len = thumbs.length,
  79997. trackPoint;
  79998. if (me.disabled) {
  79999. return;
  80000. }
  80001. for (; i < len; i++) {
  80002. thumbClicked = thumbClicked || e.target == thumbs[i].el.dom;
  80003. }
  80004. if (me.clickToChange && !thumbClicked) {
  80005. trackPoint = me.getTrackpoint(e.getXY());
  80006. if (trackPoint !== undefined) {
  80007. me.onClickChange(trackPoint);
  80008. }
  80009. }
  80010. me.focus();
  80011. },
  80012. onClickChange : function(trackPoint) {
  80013. var me = this,
  80014. thumb, index;
  80015. thumb = me.getNearest(trackPoint);
  80016. if (!thumb.disabled) {
  80017. index = thumb.index;
  80018. me.setValue(index, Ext.util.Format.round(me.reversePixelValue(trackPoint), me.decimalPrecision), undefined, true);
  80019. }
  80020. },
  80021. getNearest: function(trackPoint) {
  80022. var me = this,
  80023. clickValue = me.reversePixelValue(trackPoint),
  80024. nearestDistance = (me.maxValue - me.minValue) + 5,
  80025. nearest = null,
  80026. thumbs = me.thumbs,
  80027. i = 0,
  80028. len = thumbs.length,
  80029. thumb,
  80030. value,
  80031. dist;
  80032. for (; i < len; i++) {
  80033. thumb = me.thumbs[i];
  80034. value = thumb.value;
  80035. dist = Math.abs(value - clickValue);
  80036. if (Math.abs(dist <= nearestDistance)) {
  80037. nearest = thumb;
  80038. nearestDistance = dist;
  80039. }
  80040. }
  80041. return nearest;
  80042. },
  80043. onKeyDown : function(e) {
  80044. var me = this,
  80045. k,
  80046. val;
  80047. if(me.disabled || me.thumbs.length !== 1) {
  80048. e.preventDefault();
  80049. return;
  80050. }
  80051. k = e.getKey();
  80052. switch(k) {
  80053. case e.UP:
  80054. case e.RIGHT:
  80055. e.stopEvent();
  80056. val = e.ctrlKey ? me.maxValue : me.getValue(0) + me.keyIncrement;
  80057. me.setValue(0, val, undefined, true);
  80058. break;
  80059. case e.DOWN:
  80060. case e.LEFT:
  80061. e.stopEvent();
  80062. val = e.ctrlKey ? me.minValue : me.getValue(0) - me.keyIncrement;
  80063. me.setValue(0, val, undefined, true);
  80064. break;
  80065. default:
  80066. e.preventDefault();
  80067. }
  80068. },
  80069. normalizeValue : function(v) {
  80070. var me = this,
  80071. Num = Ext.Number,
  80072. snapFn = Num[me.zeroBasedSnapping ? 'snap' : 'snapInRange'];
  80073. v = snapFn.call(Num, v, me.increment, me.minValue, me.maxValue);
  80074. v = Ext.util.Format.round(v, me.decimalPrecision);
  80075. v = Ext.Number.constrain(v, me.minValue, me.maxValue);
  80076. return v;
  80077. },
  80078. setMinValue : function(val) {
  80079. var me = this,
  80080. i = 0,
  80081. thumbs = me.thumbs,
  80082. len = thumbs.length,
  80083. t;
  80084. me.minValue = val;
  80085. if (me.rendered) {
  80086. me.inputEl.dom.setAttribute('aria-valuemin', val);
  80087. }
  80088. for (; i < len; ++i) {
  80089. t = thumbs[i];
  80090. t.value = t.value < val ? val : t.value;
  80091. }
  80092. me.syncThumbs();
  80093. },
  80094. setMaxValue : function(val) {
  80095. var me = this,
  80096. i = 0,
  80097. thumbs = me.thumbs,
  80098. len = thumbs.length,
  80099. t;
  80100. me.maxValue = val;
  80101. if (me.rendered) {
  80102. me.inputEl.dom.setAttribute('aria-valuemax', val);
  80103. }
  80104. for (; i < len; ++i) {
  80105. t = thumbs[i];
  80106. t.value = t.value > val ? val : t.value;
  80107. }
  80108. me.syncThumbs();
  80109. },
  80110. setValue : function(index, value, animate, changeComplete) {
  80111. var me = this,
  80112. thumb = me.thumbs[index];
  80113. value = me.normalizeValue(value);
  80114. if (value !== thumb.value && me.fireEvent('beforechange', me, value, thumb.value, thumb) !== false) {
  80115. thumb.value = value;
  80116. if (me.rendered) {
  80117. me.inputEl.set({
  80118. 'aria-valuenow': value,
  80119. 'aria-valuetext': value
  80120. });
  80121. thumb.move(me.calculateThumbPosition(value), Ext.isDefined(animate) ? animate !== false : me.animate);
  80122. me.fireEvent('change', me, value, thumb);
  80123. me.checkDirty();
  80124. if (changeComplete) {
  80125. me.fireEvent('changecomplete', me, value, thumb);
  80126. }
  80127. }
  80128. }
  80129. },
  80130. calculateThumbPosition : function(v) {
  80131. return (v - this.minValue) / (this.maxValue - this.minValue) * 100;
  80132. },
  80133. getRatio : function() {
  80134. var me = this,
  80135. trackLength = this.vertical ? this.innerEl.getHeight() : this.innerEl.getWidth(),
  80136. valueRange = this.maxValue - this.minValue;
  80137. return valueRange === 0 ? trackLength : (trackLength / valueRange);
  80138. },
  80139. reversePixelValue : function(pos) {
  80140. return this.minValue + (pos / this.getRatio());
  80141. },
  80142. reversePercentageValue : function(pos) {
  80143. return this.minValue + (this.maxValue - this.minValue) * (pos / 100);
  80144. },
  80145. onDisable: function() {
  80146. var me = this,
  80147. i = 0,
  80148. thumbs = me.thumbs,
  80149. len = thumbs.length,
  80150. thumb,
  80151. el,
  80152. xy;
  80153. me.callParent();
  80154. for (; i < len; i++) {
  80155. thumb = thumbs[i];
  80156. el = thumb.el;
  80157. thumb.disable();
  80158. if(Ext.isIE) {
  80159. xy = el.getXY();
  80160. el.hide();
  80161. me.innerEl.addCls(me.disabledCls).dom.disabled = true;
  80162. if (!me.thumbHolder) {
  80163. me.thumbHolder = me.endEl.createChild({cls: Ext.baseCSSPrefix + 'slider-thumb ' + me.disabledCls});
  80164. }
  80165. me.thumbHolder.show().setXY(xy);
  80166. }
  80167. }
  80168. },
  80169. onEnable: function() {
  80170. var me = this,
  80171. i = 0,
  80172. thumbs = me.thumbs,
  80173. len = thumbs.length,
  80174. thumb,
  80175. el;
  80176. this.callParent();
  80177. for (; i < len; i++) {
  80178. thumb = thumbs[i];
  80179. el = thumb.el;
  80180. thumb.enable();
  80181. if (Ext.isIE) {
  80182. me.innerEl.removeCls(me.disabledCls).dom.disabled = false;
  80183. if (me.thumbHolder) {
  80184. me.thumbHolder.hide();
  80185. }
  80186. el.show();
  80187. me.syncThumbs();
  80188. }
  80189. }
  80190. },
  80191. syncThumbs : function() {
  80192. if (this.rendered) {
  80193. var thumbs = this.thumbs,
  80194. length = thumbs.length,
  80195. i = 0;
  80196. for (; i < length; i++) {
  80197. thumbs[i].move(this.calculateThumbPosition(thumbs[i].value));
  80198. }
  80199. }
  80200. },
  80201. getValue : function(index) {
  80202. return Ext.isNumber(index) ? this.thumbs[index].value : this.getValues();
  80203. },
  80204. getValues: function() {
  80205. var values = [],
  80206. i = 0,
  80207. thumbs = this.thumbs,
  80208. len = thumbs.length;
  80209. for (; i < len; i++) {
  80210. values.push(thumbs[i].value);
  80211. }
  80212. return values;
  80213. },
  80214. getSubmitValue: function() {
  80215. var me = this;
  80216. return (me.disabled || !me.submitValue) ? null : me.getValue();
  80217. },
  80218. reset: function() {
  80219. var me = this,
  80220. arr = [].concat(me.originalValue),
  80221. a = 0,
  80222. aLen = arr.length,
  80223. val;
  80224. for (; a < aLen; a++) {
  80225. val = arr[a];
  80226. me.setValue(a, val);
  80227. }
  80228. me.clearInvalid();
  80229. delete me.wasValid;
  80230. },
  80231. setReadOnly: function(readOnly){
  80232. var me = this,
  80233. thumbs = me.thumbs,
  80234. len = thumbs.length,
  80235. i = 0;
  80236. me.callParent(arguments);
  80237. readOnly = me.readOnly;
  80238. for (; i < len; ++i) {
  80239. if (readOnly) {
  80240. thumbs[i].disable();
  80241. } else {
  80242. thumbs[i].enable();
  80243. }
  80244. }
  80245. },
  80246. beforeDestroy : function() {
  80247. var me = this,
  80248. thumbs = me.thumbs,
  80249. t = 0,
  80250. tLen = thumbs.length,
  80251. thumb;
  80252. Ext.destroy(me.innerEl, me.endEl, me.focusEl);
  80253. for (; t < tLen; t++) {
  80254. thumb = thumbs[t];
  80255. Ext.destroy(thumb);
  80256. }
  80257. me.callParent();
  80258. }
  80259. });
  80260. Ext.define('Ext.slider.Single', {
  80261. extend: 'Ext.slider.Multi',
  80262. alias: ['widget.slider', 'widget.sliderfield'],
  80263. alternateClassName: ['Ext.Slider', 'Ext.form.SliderField', 'Ext.slider.SingleSlider', 'Ext.slider.Slider'],
  80264. getValue: function() {
  80265. return this.callParent([0]);
  80266. },
  80267. setValue: function(value, animate) {
  80268. var args = arguments,
  80269. len = args.length;
  80270. if (len == 1 || (len <= 3 && typeof args[1] != 'number')) {
  80271. args = Ext.toArray(args);
  80272. args.unshift(0);
  80273. }
  80274. return this.callParent(args);
  80275. },
  80276. getNearest : function(){
  80277. return this.thumbs[0];
  80278. }
  80279. });
  80280. Ext.define('Ext.state.CookieProvider', {
  80281. extend: 'Ext.state.Provider',
  80282. constructor : function(config){
  80283. var me = this;
  80284. me.path = "/";
  80285. me.expires = new Date(new Date().getTime()+(1000*60*60*24*7));
  80286. me.domain = null;
  80287. me.secure = false;
  80288. me.callParent(arguments);
  80289. me.state = me.readCookies();
  80290. },
  80291. set : function(name, value){
  80292. var me = this;
  80293. if(typeof value == "undefined" || value === null){
  80294. me.clear(name);
  80295. return;
  80296. }
  80297. me.setCookie(name, value);
  80298. me.callParent(arguments);
  80299. },
  80300. clear : function(name){
  80301. this.clearCookie(name);
  80302. this.callParent(arguments);
  80303. },
  80304. readCookies : function(){
  80305. var cookies = {},
  80306. c = document.cookie + ";",
  80307. re = /\s?(.*?)=(.*?);/g,
  80308. prefix = this.prefix,
  80309. len = prefix.length,
  80310. matches,
  80311. name,
  80312. value;
  80313. while((matches = re.exec(c)) != null){
  80314. name = matches[1];
  80315. value = matches[2];
  80316. if (name && name.substring(0, len) == prefix){
  80317. cookies[name.substr(len)] = this.decodeValue(value);
  80318. }
  80319. }
  80320. return cookies;
  80321. },
  80322. setCookie : function(name, value){
  80323. var me = this;
  80324. document.cookie = me.prefix + name + "=" + me.encodeValue(value) +
  80325. ((me.expires == null) ? "" : ("; expires=" + me.expires.toGMTString())) +
  80326. ((me.path == null) ? "" : ("; path=" + me.path)) +
  80327. ((me.domain == null) ? "" : ("; domain=" + me.domain)) +
  80328. ((me.secure == true) ? "; secure" : "");
  80329. },
  80330. clearCookie : function(name){
  80331. var me = this;
  80332. document.cookie = me.prefix + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
  80333. ((me.path == null) ? "" : ("; path=" + me.path)) +
  80334. ((me.domain == null) ? "" : ("; domain=" + me.domain)) +
  80335. ((me.secure == true) ? "; secure" : "");
  80336. }
  80337. });
  80338. Ext.define('Ext.state.LocalStorageProvider', {
  80339. extend: 'Ext.state.Provider',
  80340. alias: 'state.localstorage',
  80341. constructor: function(){
  80342. var me = this;
  80343. me.callParent(arguments);
  80344. me.store = me.getStorageObject();
  80345. me.state = me.readLocalStorage();
  80346. },
  80347. readLocalStorage: function(){
  80348. var store = this.store,
  80349. i = 0,
  80350. len = store.length,
  80351. prefix = this.prefix,
  80352. prefixLen = prefix.length,
  80353. data = {},
  80354. key;
  80355. for (; i < len; ++i) {
  80356. key = store.key(i);
  80357. if (key.substring(0, prefixLen) == prefix) {
  80358. data[key.substr(prefixLen)] = this.decodeValue(store.getItem(key));
  80359. }
  80360. }
  80361. return data;
  80362. },
  80363. set : function(name, value){
  80364. var me = this;
  80365. me.clear(name);
  80366. if (typeof value == "undefined" || value === null) {
  80367. return;
  80368. }
  80369. me.store.setItem(me.prefix + name, me.encodeValue(value));
  80370. me.callParent(arguments);
  80371. },
  80372. clear : function(name){
  80373. this.store.removeItem(this.prefix + name);
  80374. this.callParent(arguments);
  80375. },
  80376. getStorageObject: function(){
  80377. try {
  80378. var supports = 'localStorage' in window && window['localStorage'] !== null;
  80379. if (supports) {
  80380. return window.localStorage;
  80381. }
  80382. } catch (e) {
  80383. return false;
  80384. }
  80385. }
  80386. });
  80387. Ext.define('Ext.tab.Tab', {
  80388. extend: 'Ext.button.Button',
  80389. alias: 'widget.tab',
  80390. requires: [
  80391. 'Ext.layout.component.Tab',
  80392. 'Ext.util.KeyNav'
  80393. ],
  80394. componentLayout: 'tab',
  80395. isTab: true,
  80396. baseCls: Ext.baseCSSPrefix + 'tab',
  80397. activeCls: 'active',
  80398. closableCls: 'closable',
  80399. closable: true,
  80400. closeText: 'Close Tab',
  80401. active: false,
  80402. childEls: [
  80403. 'closeEl'
  80404. ],
  80405. scale: false,
  80406. position: 'top',
  80407. initComponent: function() {
  80408. var me = this;
  80409. me.addEvents(
  80410. 'activate',
  80411. 'deactivate',
  80412. 'beforeclose',
  80413. 'close'
  80414. );
  80415. me.callParent(arguments);
  80416. if (me.card) {
  80417. me.setCard(me.card);
  80418. }
  80419. },
  80420. getTemplateArgs: function() {
  80421. var me = this,
  80422. result = me.callParent();
  80423. result.closable = me.closable;
  80424. result.closeText = me.closeText;
  80425. return result;
  80426. },
  80427. beforeRender: function() {
  80428. var me = this,
  80429. tabBar = me.up('tabbar'),
  80430. tabPanel = me.up('tabpanel');
  80431. me.callParent();
  80432. me.addClsWithUI(me.position);
  80433. me.syncClosableUI();
  80434. if (!me.minWidth) {
  80435. me.minWidth = (tabBar) ? tabBar.minTabWidth : me.minWidth;
  80436. if (!me.minWidth && tabPanel) {
  80437. me.minWidth = tabPanel.minTabWidth;
  80438. }
  80439. if (me.minWidth && me.iconCls) {
  80440. me.minWidth += 25;
  80441. }
  80442. }
  80443. if (!me.maxWidth) {
  80444. me.maxWidth = (tabBar) ? tabBar.maxTabWidth : me.maxWidth;
  80445. if (!me.maxWidth && tabPanel) {
  80446. me.maxWidth = tabPanel.maxTabWidth;
  80447. }
  80448. }
  80449. },
  80450. onRender: function() {
  80451. var me = this;
  80452. me.callParent(arguments);
  80453. me.keyNav = new Ext.util.KeyNav(me.el, {
  80454. enter: me.onEnterKey,
  80455. del: me.onDeleteKey,
  80456. scope: me
  80457. });
  80458. },
  80459. enable : function(silent) {
  80460. var me = this;
  80461. me.callParent(arguments);
  80462. me.removeClsWithUI(me.position + '-disabled');
  80463. return me;
  80464. },
  80465. disable : function(silent) {
  80466. var me = this;
  80467. me.callParent(arguments);
  80468. me.addClsWithUI(me.position + '-disabled');
  80469. return me;
  80470. },
  80471. onDestroy: function() {
  80472. var me = this;
  80473. Ext.destroy(me.keyNav);
  80474. delete me.keyNav;
  80475. me.callParent(arguments);
  80476. },
  80477. setClosable: function(closable) {
  80478. var me = this;
  80479. closable = (!arguments.length || !!closable);
  80480. if (me.closable != closable) {
  80481. me.closable = closable;
  80482. if (me.card) {
  80483. me.card.closable = closable;
  80484. }
  80485. me.syncClosableUI();
  80486. if (me.rendered) {
  80487. me.syncClosableElements();
  80488. me.updateLayout();
  80489. }
  80490. }
  80491. },
  80492. syncClosableElements: function () {
  80493. var me = this,
  80494. closeEl = me.closeEl;
  80495. if (me.closable) {
  80496. if (!closeEl) {
  80497. me.closeEl = me.btnWrap.insertSibling({
  80498. tag: 'a',
  80499. cls: me.baseCls + '-close-btn',
  80500. href: '#',
  80501. title: me.closeText
  80502. }, 'after');
  80503. }
  80504. } else if (closeEl) {
  80505. closeEl.remove();
  80506. delete me.closeEl;
  80507. }
  80508. },
  80509. syncClosableUI: function () {
  80510. var me = this,
  80511. classes = [me.closableCls, me.closableCls + '-' + me.position];
  80512. if (me.closable) {
  80513. me.addClsWithUI(classes);
  80514. } else {
  80515. me.removeClsWithUI(classes);
  80516. }
  80517. },
  80518. setCard: function(card) {
  80519. var me = this;
  80520. me.card = card;
  80521. me.setText(me.title || card.title);
  80522. me.setIconCls(me.iconCls || card.iconCls);
  80523. me.setIcon(me.icon || card.icon);
  80524. },
  80525. onCloseClick: function() {
  80526. var me = this;
  80527. if (me.fireEvent('beforeclose', me) !== false) {
  80528. if (me.tabBar) {
  80529. if (me.tabBar.closeTab(me) === false) {
  80530. return;
  80531. }
  80532. } else {
  80533. me.fireClose();
  80534. }
  80535. }
  80536. },
  80537. fireClose: function(){
  80538. this.fireEvent('close', this);
  80539. },
  80540. onEnterKey: function(e) {
  80541. var me = this;
  80542. if (me.tabBar) {
  80543. me.tabBar.onClick(e, me.el);
  80544. }
  80545. },
  80546. onDeleteKey: function(e) {
  80547. if (this.closable) {
  80548. this.onCloseClick();
  80549. }
  80550. },
  80551. activate : function(supressEvent) {
  80552. var me = this;
  80553. me.active = true;
  80554. me.addClsWithUI([me.activeCls, me.position + '-' + me.activeCls]);
  80555. if (supressEvent !== true) {
  80556. me.fireEvent('activate', me);
  80557. }
  80558. },
  80559. deactivate : function(supressEvent) {
  80560. var me = this;
  80561. me.active = false;
  80562. me.removeClsWithUI([me.activeCls, me.position + '-' + me.activeCls]);
  80563. if (supressEvent !== true) {
  80564. me.fireEvent('deactivate', me);
  80565. }
  80566. }
  80567. });
  80568. Ext.define('Ext.tab.Bar', {
  80569. extend: 'Ext.panel.Header',
  80570. alias: 'widget.tabbar',
  80571. baseCls: Ext.baseCSSPrefix + 'tab-bar',
  80572. requires: ['Ext.tab.Tab'],
  80573. isTabBar: true,
  80574. defaultType: 'tab',
  80575. plain: false,
  80576. childEls: [
  80577. 'body', 'strip'
  80578. ],
  80579. renderTpl: [
  80580. '<div id="{id}-body" class="{baseCls}-body {bodyCls}<tpl if="ui"> {baseCls}-body-{ui}<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl></tpl>"<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',
  80581. '{%this.renderContainer(out,values)%}',
  80582. '</div>',
  80583. '<div id="{id}-strip" class="{baseCls}-strip<tpl if="ui"> {baseCls}-strip-{ui}<tpl for="uiCls"> {parent.baseCls}-strip-{parent.ui}-{.}</tpl></tpl>"></div>'
  80584. ],
  80585. initComponent: function() {
  80586. var me = this;
  80587. if (me.plain) {
  80588. me.setUI(me.ui + '-plain');
  80589. }
  80590. me.addClsWithUI(me.dock);
  80591. me.addEvents(
  80592. 'change'
  80593. );
  80594. me.callParent(arguments);
  80595. me.layout.align = (me.orientation == 'vertical') ? 'left' : 'top';
  80596. me.layout.overflowHandler = new Ext.layout.container.boxOverflow.Scroller(me.layout);
  80597. me.remove(me.titleCmp);
  80598. delete me.titleCmp;
  80599. Ext.apply(me.renderData, {
  80600. bodyCls: me.bodyCls
  80601. });
  80602. },
  80603. getLayout: function() {
  80604. var me = this;
  80605. me.layout.type = (me.dock === 'top' || me.dock === 'bottom') ? 'hbox' : 'vbox';
  80606. return me.callParent(arguments);
  80607. },
  80608. onAdd: function(tab) {
  80609. tab.position = this.dock;
  80610. this.callParent(arguments);
  80611. },
  80612. onRemove: function(tab) {
  80613. var me = this;
  80614. if (tab === me.previousTab) {
  80615. me.previousTab = null;
  80616. }
  80617. me.callParent(arguments);
  80618. },
  80619. afterComponentLayout : function(width) {
  80620. this.callParent(arguments);
  80621. this.strip.setWidth(width);
  80622. },
  80623. onClick: function(e, target) {
  80624. var me = this,
  80625. tabEl = e.getTarget('.' + Ext.tab.Tab.prototype.baseCls),
  80626. tab = tabEl && Ext.getCmp(tabEl.id),
  80627. tabPanel = me.tabPanel,
  80628. isCloseClick = tab && tab.closeEl && (target === tab.closeEl.dom);
  80629. if (isCloseClick) {
  80630. e.preventDefault();
  80631. }
  80632. if (tab && tab.isDisabled && !tab.isDisabled()) {
  80633. if (tab.closable && isCloseClick) {
  80634. tab.onCloseClick();
  80635. } else {
  80636. if (tabPanel) {
  80637. tabPanel.setActiveTab(tab.card);
  80638. } else {
  80639. me.setActiveTab(tab);
  80640. }
  80641. tab.focus();
  80642. }
  80643. }
  80644. },
  80645. closeTab: function(toClose) {
  80646. var me = this,
  80647. card = toClose.card,
  80648. tabPanel = me.tabPanel,
  80649. toActivate;
  80650. if (card && card.fireEvent('beforeclose', card) === false) {
  80651. return false;
  80652. }
  80653. toActivate = me.findNextActivatable(toClose);
  80654. Ext.suspendLayouts();
  80655. if (tabPanel && card) {
  80656. delete toClose.ownerCt;
  80657. card.fireEvent('close', card);
  80658. tabPanel.remove(card);
  80659. if (!tabPanel.getComponent(card)) {
  80660. toClose.fireClose();
  80661. me.remove(toClose);
  80662. } else {
  80663. toClose.ownerCt = me;
  80664. Ext.resumeLayouts(true);
  80665. return false;
  80666. }
  80667. }
  80668. if (toActivate) {
  80669. if (tabPanel) {
  80670. tabPanel.setActiveTab(toActivate.card);
  80671. } else {
  80672. me.setActiveTab(toActivate);
  80673. }
  80674. toActivate.focus();
  80675. }
  80676. Ext.resumeLayouts(true);
  80677. },
  80678. findNextActivatable: function(toClose) {
  80679. var me = this;
  80680. if (toClose.active && me.items.getCount() > 1) {
  80681. return (me.previousTab && me.previousTab !== toClose && !me.previousTab.disabled) ? me.previousTab : (toClose.next('tab[disabled=false]') || toClose.prev('tab[disabled=false]'));
  80682. }
  80683. },
  80684. setActiveTab: function(tab) {
  80685. var me = this;
  80686. if (!tab.disabled && tab !== me.activeTab) {
  80687. if (me.activeTab) {
  80688. if (me.activeTab.isDestroyed) {
  80689. me.previousTab = null;
  80690. } else {
  80691. me.previousTab = me.activeTab;
  80692. me.activeTab.deactivate();
  80693. }
  80694. }
  80695. tab.activate();
  80696. me.activeTab = tab;
  80697. me.fireEvent('change', me, tab, tab.card);
  80698. me.on({
  80699. afterlayout: me.afterTabActivate,
  80700. scope: me,
  80701. single: true
  80702. });
  80703. me.updateLayout();
  80704. }
  80705. },
  80706. afterTabActivate: function() {
  80707. this.layout.overflowHandler.scrollToItem(this.activeTab);
  80708. }
  80709. });
  80710. Ext.define('Ext.tab.Panel', {
  80711. extend: 'Ext.panel.Panel',
  80712. alias: 'widget.tabpanel',
  80713. alternateClassName: ['Ext.TabPanel'],
  80714. requires: ['Ext.layout.container.Card', 'Ext.tab.Bar'],
  80715. tabPosition : 'top',
  80716. removePanelHeader: true,
  80717. plain: false,
  80718. itemCls: Ext.baseCSSPrefix + 'tabpanel-child',
  80719. minTabWidth: undefined,
  80720. maxTabWidth: undefined,
  80721. deferredRender : true,
  80722. initComponent: function() {
  80723. var me = this,
  80724. dockedItems = [].concat(me.dockedItems || []),
  80725. activeTab = me.activeTab || (me.activeTab = 0);
  80726. me.layout = new Ext.layout.container.Card(Ext.apply({
  80727. owner: me,
  80728. deferredRender: me.deferredRender,
  80729. itemCls: me.itemCls,
  80730. activeItem: me.activeTab
  80731. }, me.layout));
  80732. me.tabBar = new Ext.tab.Bar(Ext.apply({
  80733. dock: me.tabPosition,
  80734. plain: me.plain,
  80735. border: me.border,
  80736. cardLayout: me.layout,
  80737. tabPanel: me
  80738. }, me.tabBar));
  80739. dockedItems.push(me.tabBar);
  80740. me.dockedItems = dockedItems;
  80741. me.addEvents(
  80742. 'beforetabchange',
  80743. 'tabchange'
  80744. );
  80745. me.callParent(arguments);
  80746. me.activeTab = me.getComponent(activeTab);
  80747. if (me.activeTab) {
  80748. me.activeTab.tab.activate(true);
  80749. me.tabBar.activeTab = me.activeTab.tab;
  80750. }
  80751. },
  80752. setActiveTab: function(card) {
  80753. var me = this,
  80754. previous;
  80755. card = me.getComponent(card);
  80756. if (card) {
  80757. previous = me.getActiveTab();
  80758. if (previous !== card && me.fireEvent('beforetabchange', me, card, previous) === false) {
  80759. return false;
  80760. }
  80761. if (!card.isComponent) {
  80762. Ext.suspendLayouts();
  80763. card = me.add(card);
  80764. Ext.resumeLayouts();
  80765. }
  80766. me.activeTab = card;
  80767. Ext.suspendLayouts();
  80768. me.layout.setActiveItem(card);
  80769. card = me.activeTab = me.layout.getActiveItem();
  80770. if (card && card !== previous) {
  80771. me.tabBar.setActiveTab(card.tab);
  80772. Ext.resumeLayouts(true);
  80773. if (previous !== card) {
  80774. me.fireEvent('tabchange', me, card, previous);
  80775. }
  80776. }
  80777. else {
  80778. Ext.resumeLayouts(true);
  80779. }
  80780. return card;
  80781. }
  80782. },
  80783. getActiveTab: function() {
  80784. var me = this,
  80785. result = me.getComponent(me.activeTab);
  80786. if (result && me.items.indexOf(result) != -1) {
  80787. me.activeTab = result;
  80788. } else {
  80789. me.activeTab = null;
  80790. }
  80791. return me.activeTab;
  80792. },
  80793. getTabBar: function() {
  80794. return this.tabBar;
  80795. },
  80796. onAdd: function(item, index) {
  80797. var me = this,
  80798. cfg = item.tabConfig || {},
  80799. defaultConfig = {
  80800. xtype: 'tab',
  80801. card: item,
  80802. disabled: item.disabled,
  80803. closable: item.closable,
  80804. hidden: item.hidden && !item.hiddenByLayout,
  80805. tooltip: item.tooltip,
  80806. tabBar: me.tabBar,
  80807. closeText: item.closeText
  80808. };
  80809. cfg = Ext.applyIf(cfg, defaultConfig);
  80810. item.tab = me.tabBar.insert(index, cfg);
  80811. item.on({
  80812. scope : me,
  80813. enable: me.onItemEnable,
  80814. disable: me.onItemDisable,
  80815. beforeshow: me.onItemBeforeShow,
  80816. iconchange: me.onItemIconChange,
  80817. iconclschange: me.onItemIconClsChange,
  80818. titlechange: me.onItemTitleChange
  80819. });
  80820. if (item.isPanel) {
  80821. if (me.removePanelHeader) {
  80822. if (item.rendered) {
  80823. if (item.header) {
  80824. item.header.hide();
  80825. }
  80826. } else {
  80827. item.header = false;
  80828. }
  80829. }
  80830. if (item.isPanel && me.border) {
  80831. item.setBorder(false);
  80832. }
  80833. }
  80834. },
  80835. onItemEnable: function(item){
  80836. item.tab.enable();
  80837. },
  80838. onItemDisable: function(item){
  80839. item.tab.disable();
  80840. },
  80841. onItemBeforeShow: function(item) {
  80842. if (item !== this.activeTab) {
  80843. this.setActiveTab(item);
  80844. return false;
  80845. }
  80846. },
  80847. onItemIconChange: function(item, newIcon) {
  80848. item.tab.setIcon(newIcon);
  80849. },
  80850. onItemIconClsChange: function(item, newIconCls) {
  80851. item.tab.setIconCls(newIconCls);
  80852. },
  80853. onItemTitleChange: function(item, newTitle) {
  80854. item.tab.setText(newTitle);
  80855. },
  80856. doRemove: function(item, autoDestroy) {
  80857. var me = this,
  80858. toActivate;
  80859. if (me.destroying || me.items.getCount() == 1) {
  80860. me.activeTab = null;
  80861. }
  80862. else if ((toActivate = me.tabBar.items.indexOf(me.tabBar.findNextActivatable(item.tab))) !== -1) {
  80863. me.setActiveTab(toActivate);
  80864. }
  80865. this.callParent(arguments);
  80866. delete item.tab.card;
  80867. delete item.tab;
  80868. },
  80869. onRemove: function(item, destroying) {
  80870. var me = this;
  80871. item.un({
  80872. scope : me,
  80873. enable: me.onItemEnable,
  80874. disable: me.onItemDisable,
  80875. beforeshow: me.onItemBeforeShow
  80876. });
  80877. if (!me.destroying && item.tab.ownerCt === me.tabBar) {
  80878. me.tabBar.remove(item.tab);
  80879. }
  80880. }
  80881. });
  80882. Ext.define('Ext.toolbar.Spacer', {
  80883. extend: 'Ext.Component',
  80884. alias: 'widget.tbspacer',
  80885. alternateClassName: 'Ext.Toolbar.Spacer',
  80886. baseCls: Ext.baseCSSPrefix + 'toolbar-spacer',
  80887. focusable: false
  80888. });
  80889. Ext.define('Ext.tree.Column', {
  80890. extend: 'Ext.grid.column.Column',
  80891. alias: 'widget.treecolumn',
  80892. tdCls: Ext.baseCSSPrefix + 'grid-cell-treecolumn',
  80893. treePrefix: Ext.baseCSSPrefix + 'tree-',
  80894. elbowPrefix: Ext.baseCSSPrefix + 'tree-elbow-',
  80895. expanderCls: Ext.baseCSSPrefix + 'tree-expander',
  80896. imgText: '<img src="{1}" class="{0}" />',
  80897. checkboxText: '<input type="button" role="checkbox" class="{0}" {1} />',
  80898. initComponent: function() {
  80899. var me = this;
  80900. me.origRenderer = me.renderer || me.defaultRenderer;
  80901. me.origScope = me.scope || window;
  80902. me.renderer = me.treeRenderer;
  80903. me.scope = me;
  80904. me.callParent();
  80905. },
  80906. treeRenderer: function(value, metaData, record, rowIdx, colIdx, store, view){
  80907. var me = this,
  80908. buf = [],
  80909. format = Ext.String.format,
  80910. depth = record.getDepth(),
  80911. treePrefix = me.treePrefix,
  80912. elbowPrefix = me.elbowPrefix,
  80913. expanderCls = me.expanderCls,
  80914. imgText = me.imgText,
  80915. checkboxText= me.checkboxText,
  80916. formattedValue = me.origRenderer.apply(me.origScope, arguments),
  80917. blank = Ext.BLANK_IMAGE_URL,
  80918. href = record.get('href'),
  80919. target = record.get('hrefTarget'),
  80920. cls = record.get('cls');
  80921. while (record) {
  80922. if (!record.isRoot() || (record.isRoot() && view.rootVisible)) {
  80923. if (record.getDepth() === depth) {
  80924. buf.unshift(format(imgText,
  80925. treePrefix + 'icon ' +
  80926. treePrefix + 'icon' + (record.get('icon') ? '-inline ' : (record.isLeaf() ? '-leaf ' : '-parent ')) +
  80927. (record.get('iconCls') || ''),
  80928. record.get('icon') || blank
  80929. ));
  80930. if (record.get('checked') !== null) {
  80931. buf.unshift(format(
  80932. checkboxText,
  80933. (treePrefix + 'checkbox') + (record.get('checked') ? ' ' + treePrefix + 'checkbox-checked' : ''),
  80934. record.get('checked') ? 'aria-checked="true"' : ''
  80935. ));
  80936. if (record.get('checked')) {
  80937. metaData.tdCls += (' ' + treePrefix + 'checked');
  80938. }
  80939. }
  80940. if (record.isLast()) {
  80941. if (record.isExpandable()) {
  80942. buf.unshift(format(imgText, (elbowPrefix + 'end-plus ' + expanderCls), blank));
  80943. } else {
  80944. buf.unshift(format(imgText, (elbowPrefix + 'end'), blank));
  80945. }
  80946. } else {
  80947. if (record.isExpandable()) {
  80948. buf.unshift(format(imgText, (elbowPrefix + 'plus ' + expanderCls), blank));
  80949. } else {
  80950. buf.unshift(format(imgText, (treePrefix + 'elbow'), blank));
  80951. }
  80952. }
  80953. } else {
  80954. if (record.isLast() || record.getDepth() === 0) {
  80955. buf.unshift(format(imgText, (elbowPrefix + 'empty'), blank));
  80956. } else if (record.getDepth() !== 0) {
  80957. buf.unshift(format(imgText, (elbowPrefix + 'line'), blank));
  80958. }
  80959. }
  80960. }
  80961. record = record.parentNode;
  80962. }
  80963. if (href) {
  80964. buf.push('<a href="', href, '" target="', target, '">', formattedValue, '</a>');
  80965. } else {
  80966. buf.push(formattedValue);
  80967. }
  80968. if (cls) {
  80969. metaData.tdCls += ' ' + cls;
  80970. }
  80971. return buf.join('');
  80972. },
  80973. defaultRenderer: function(value) {
  80974. return value;
  80975. }
  80976. });
  80977. Ext.define('Ext.tree.View', {
  80978. extend: 'Ext.view.Table',
  80979. alias: 'widget.treeview',
  80980. requires: [
  80981. 'Ext.data.NodeStore'
  80982. ],
  80983. loadingCls: Ext.baseCSSPrefix + 'grid-tree-loading',
  80984. expandedCls: Ext.baseCSSPrefix + 'grid-tree-node-expanded',
  80985. leafCls: Ext.baseCSSPrefix + 'grid-tree-node-leaf',
  80986. expanderSelector: '.' + Ext.baseCSSPrefix + 'tree-expander',
  80987. checkboxSelector: '.' + Ext.baseCSSPrefix + 'tree-checkbox',
  80988. expanderIconOverCls: Ext.baseCSSPrefix + 'tree-expander-over',
  80989. nodeAnimWrapCls: Ext.baseCSSPrefix + 'tree-animator-wrap',
  80990. blockRefresh: true,
  80991. loadMask: false,
  80992. rootVisible: true,
  80993. deferInitialRefresh: false,
  80994. expandDuration: 250,
  80995. collapseDuration: 250,
  80996. toggleOnDblClick: true,
  80997. stripeRows: false,
  80998. uiFields: ['expanded', 'loaded', 'checked', 'expandable', 'leaf', 'icon', 'iconCls', 'loading', 'qtip', 'qtitle'],
  80999. initComponent: function() {
  81000. var me = this,
  81001. treeStore = me.panel.getStore();
  81002. if (me.initialConfig.animate === undefined) {
  81003. me.animate = Ext.enableFx;
  81004. }
  81005. me.store = new Ext.data.NodeStore({
  81006. treeStore: treeStore,
  81007. recursive: true,
  81008. rootVisible: me.rootVisible,
  81009. listeners: {
  81010. beforeexpand: me.onBeforeExpand,
  81011. expand: me.onExpand,
  81012. beforecollapse: me.onBeforeCollapse,
  81013. collapse: me.onCollapse,
  81014. write: me.onStoreWrite,
  81015. datachanged: me.onStoreDataChanged,
  81016. scope: me
  81017. }
  81018. });
  81019. if (me.node) {
  81020. me.setRootNode(me.node);
  81021. }
  81022. me.animQueue = {};
  81023. me.animWraps = {};
  81024. me.addEvents(
  81025. 'afteritemexpand',
  81026. 'afteritemcollapse'
  81027. );
  81028. me.callParent(arguments);
  81029. me.on({
  81030. element: 'el',
  81031. scope: me,
  81032. delegate: me.expanderSelector,
  81033. mouseover: me.onExpanderMouseOver,
  81034. mouseout: me.onExpanderMouseOut
  81035. });
  81036. me.on({
  81037. element: 'el',
  81038. scope: me,
  81039. delegate: me.checkboxSelector,
  81040. click: me.onCheckboxChange
  81041. });
  81042. },
  81043. getMaskStore: function(){
  81044. return this.panel.getStore();
  81045. },
  81046. afterComponentLayout: function(){
  81047. this.callParent(arguments);
  81048. var stretcher = this.stretcher;
  81049. if (stretcher) {
  81050. stretcher.setWidth((this.getWidth() - Ext.getScrollbarSize().width));
  81051. }
  81052. },
  81053. processUIEvent: function(e) {
  81054. if (e.getTarget('.' + this.nodeAnimWrapCls, this.el)) {
  81055. return false;
  81056. }
  81057. return this.callParent(arguments);
  81058. },
  81059. onClear: function(){
  81060. this.store.removeAll();
  81061. },
  81062. setRootNode: function(node) {
  81063. var me = this;
  81064. me.store.setNode(node);
  81065. me.node = node;
  81066. },
  81067. onCheckboxChange: function(e, t) {
  81068. var me = this,
  81069. item = e.getTarget(me.getItemSelector(), me.getTargetEl());
  81070. if (item) {
  81071. me.onCheckChange(me.getRecord(item));
  81072. }
  81073. },
  81074. onCheckChange: function(record){
  81075. var checked = record.get('checked');
  81076. if (Ext.isBoolean(checked)) {
  81077. checked = !checked;
  81078. record.set('checked', checked);
  81079. this.fireEvent('checkchange', record, checked);
  81080. }
  81081. },
  81082. getChecked: function() {
  81083. var checked = [];
  81084. this.node.cascadeBy(function(rec){
  81085. if (rec.get('checked')) {
  81086. checked.push(rec);
  81087. }
  81088. });
  81089. return checked;
  81090. },
  81091. isItemChecked: function(rec){
  81092. return rec.get('checked');
  81093. },
  81094. createAnimWrap: function(record, index) {
  81095. var thHtml = '',
  81096. headerCt = this.panel.headerCt,
  81097. headers = headerCt.getGridColumns(),
  81098. i = 0, len = headers.length, item,
  81099. node = this.getNode(record),
  81100. tmpEl, nodeEl;
  81101. for (; i < len; i++) {
  81102. item = headers[i];
  81103. thHtml += '<th style="width: ' + (item.hidden ? 0 : item.getDesiredWidth()) + 'px; height: 0px;"></th>';
  81104. }
  81105. nodeEl = Ext.get(node);
  81106. tmpEl = nodeEl.insertSibling({
  81107. tag: 'tr',
  81108. html: [
  81109. '<td colspan="' + headerCt.getColumnCount() + '">',
  81110. '<div class="' + this.nodeAnimWrapCls + '">',
  81111. '<table class="' + Ext.baseCSSPrefix + 'grid-table" style="width: ' + headerCt.getFullWidth() + 'px;"><tbody>',
  81112. thHtml,
  81113. '</tbody></table>',
  81114. '</div>',
  81115. '</td>'
  81116. ].join('')
  81117. }, 'after');
  81118. return {
  81119. record: record,
  81120. node: node,
  81121. el: tmpEl,
  81122. expanding: false,
  81123. collapsing: false,
  81124. animating: false,
  81125. animateEl: tmpEl.down('div'),
  81126. targetEl: tmpEl.down('tbody')
  81127. };
  81128. },
  81129. getAnimWrap: function(parent, bubble) {
  81130. if (!this.animate) {
  81131. return null;
  81132. }
  81133. var wraps = this.animWraps,
  81134. wrap = wraps[parent.internalId];
  81135. if (bubble !== false) {
  81136. while (!wrap && parent) {
  81137. parent = parent.parentNode;
  81138. if (parent) {
  81139. wrap = wraps[parent.internalId];
  81140. }
  81141. }
  81142. }
  81143. return wrap;
  81144. },
  81145. doAdd: function(nodes, records, index) {
  81146. var me = this,
  81147. record = records[0],
  81148. parent = record.parentNode,
  81149. a = me.all.elements,
  81150. relativeIndex = 0,
  81151. animWrap = me.getAnimWrap(parent),
  81152. targetEl, children, len;
  81153. if (!animWrap || !animWrap.expanding) {
  81154. return me.callParent(arguments);
  81155. }
  81156. parent = animWrap.record;
  81157. targetEl = animWrap.targetEl;
  81158. children = targetEl.dom.childNodes;
  81159. len = children.length - 1;
  81160. relativeIndex = index - me.indexOf(parent) - 1;
  81161. if (!len || relativeIndex >= len) {
  81162. targetEl.appendChild(nodes);
  81163. }
  81164. else {
  81165. Ext.fly(children[relativeIndex + 1]).insertSibling(nodes, 'before', true);
  81166. }
  81167. Ext.Array.insert(a, index, nodes);
  81168. if (animWrap.isAnimating) {
  81169. me.onExpand(parent);
  81170. }
  81171. },
  81172. beginBulkUpdate: function(){
  81173. this.bulkUpdate = true;
  81174. },
  81175. endBulkUpdate: function(){
  81176. this.bulkUpdate = false;
  81177. },
  81178. onRemove : function(ds, record, index) {
  81179. var me = this,
  81180. bulk = me.bulkUpdate;
  81181. if (me.viewReady) {
  81182. me.doRemove(record, index);
  81183. if (!bulk) {
  81184. me.updateIndexes(index);
  81185. }
  81186. if (me.store.getCount() === 0){
  81187. me.refresh();
  81188. }
  81189. if (!bulk) {
  81190. me.fireEvent('itemremove', record, index);
  81191. }
  81192. }
  81193. },
  81194. doRemove: function(record, index) {
  81195. var me = this,
  81196. all = me.all,
  81197. animWrap = me.getAnimWrap(record),
  81198. item = all.item(index),
  81199. node = item ? item.dom : null;
  81200. if (!node || !animWrap || !animWrap.collapsing) {
  81201. return me.callParent(arguments);
  81202. }
  81203. animWrap.targetEl.appendChild(node);
  81204. all.removeElement(index);
  81205. },
  81206. onBeforeExpand: function(parent, records, index) {
  81207. var me = this,
  81208. animWrap;
  81209. if (!me.rendered || !me.animate) {
  81210. return;
  81211. }
  81212. if (me.getNode(parent)) {
  81213. animWrap = me.getAnimWrap(parent, false);
  81214. if (!animWrap) {
  81215. animWrap = me.animWraps[parent.internalId] = me.createAnimWrap(parent);
  81216. animWrap.animateEl.setHeight(0);
  81217. }
  81218. else if (animWrap.collapsing) {
  81219. animWrap.targetEl.select(me.itemSelector).remove();
  81220. }
  81221. animWrap.expanding = true;
  81222. animWrap.collapsing = false;
  81223. }
  81224. },
  81225. onExpand: function(parent) {
  81226. var me = this,
  81227. queue = me.animQueue,
  81228. id = parent.getId(),
  81229. node = me.getNode(parent),
  81230. index = node ? me.indexOf(node) : -1,
  81231. animWrap,
  81232. animateEl,
  81233. targetEl;
  81234. if (me.singleExpand) {
  81235. me.ensureSingleExpand(parent);
  81236. }
  81237. if (index === -1) {
  81238. return;
  81239. }
  81240. animWrap = me.getAnimWrap(parent, false);
  81241. if (!animWrap) {
  81242. me.isExpandingOrCollapsing = false;
  81243. me.fireEvent('afteritemexpand', parent, index, node);
  81244. return;
  81245. }
  81246. animateEl = animWrap.animateEl;
  81247. targetEl = animWrap.targetEl;
  81248. animateEl.stopAnimation();
  81249. queue[id] = true;
  81250. animateEl.slideIn('t', {
  81251. duration: me.expandDuration,
  81252. listeners: {
  81253. scope: me,
  81254. lastframe: function() {
  81255. animWrap.el.insertSibling(targetEl.query(me.itemSelector), 'before');
  81256. animWrap.el.remove();
  81257. me.refreshSize();
  81258. delete me.animWraps[animWrap.record.internalId];
  81259. delete queue[id];
  81260. }
  81261. },
  81262. callback: function() {
  81263. me.isExpandingOrCollapsing = false;
  81264. me.fireEvent('afteritemexpand', parent, index, node);
  81265. }
  81266. });
  81267. animWrap.isAnimating = true;
  81268. },
  81269. onBeforeCollapse: function(parent, records, index) {
  81270. var me = this,
  81271. animWrap;
  81272. if (!me.rendered || !me.animate) {
  81273. return;
  81274. }
  81275. if (me.getNode(parent)) {
  81276. animWrap = me.getAnimWrap(parent);
  81277. if (!animWrap) {
  81278. animWrap = me.animWraps[parent.internalId] = me.createAnimWrap(parent, index);
  81279. }
  81280. else if (animWrap.expanding) {
  81281. animWrap.targetEl.select(this.itemSelector).remove();
  81282. }
  81283. animWrap.expanding = false;
  81284. animWrap.collapsing = true;
  81285. }
  81286. },
  81287. onCollapse: function(parent) {
  81288. var me = this,
  81289. queue = me.animQueue,
  81290. id = parent.getId(),
  81291. node = me.getNode(parent),
  81292. index = node ? me.indexOf(node) : -1,
  81293. animWrap = me.getAnimWrap(parent),
  81294. animateEl, targetEl;
  81295. if (index === -1) {
  81296. return;
  81297. }
  81298. if (!animWrap) {
  81299. me.isExpandingOrCollapsing = false;
  81300. me.fireEvent('afteritemcollapse', parent, index, node);
  81301. return;
  81302. }
  81303. animateEl = animWrap.animateEl;
  81304. targetEl = animWrap.targetEl;
  81305. queue[id] = true;
  81306. animateEl.stopAnimation();
  81307. animateEl.slideOut('t', {
  81308. duration: me.collapseDuration,
  81309. listeners: {
  81310. scope: me,
  81311. lastframe: function() {
  81312. animWrap.el.remove();
  81313. me.refreshSize();
  81314. delete me.animWraps[animWrap.record.internalId];
  81315. delete queue[id];
  81316. }
  81317. },
  81318. callback: function() {
  81319. me.isExpandingOrCollapsing = false;
  81320. me.fireEvent('afteritemcollapse', parent, index, node);
  81321. }
  81322. });
  81323. animWrap.isAnimating = true;
  81324. },
  81325. isAnimating: function(node) {
  81326. return !!this.animQueue[node.getId()];
  81327. },
  81328. collectData: function(records) {
  81329. var data = this.callParent(arguments),
  81330. rows = data.rows,
  81331. len = rows.length,
  81332. i = 0,
  81333. row, record;
  81334. for (; i < len; i++) {
  81335. row = rows[i];
  81336. record = records[i];
  81337. if (record.get('qtip')) {
  81338. row.rowAttr = 'data-qtip="' + record.get('qtip') + '"';
  81339. if (record.get('qtitle')) {
  81340. row.rowAttr += ' ' + 'data-qtitle="' + record.get('qtitle') + '"';
  81341. }
  81342. }
  81343. if (record.isExpanded()) {
  81344. row.rowCls = (row.rowCls || '') + ' ' + this.expandedCls;
  81345. }
  81346. if (record.isLeaf()) {
  81347. row.rowCls = (row.rowCls || '') + ' ' + this.leafCls;
  81348. }
  81349. if (record.isLoading()) {
  81350. row.rowCls = (row.rowCls || '') + ' ' + this.loadingCls;
  81351. }
  81352. }
  81353. return data;
  81354. },
  81355. expand: function(record, deep, callback, scope) {
  81356. return record.expand(deep, callback, scope);
  81357. },
  81358. collapse: function(record, deep, callback, scope) {
  81359. return record.collapse(deep, callback, scope);
  81360. },
  81361. toggle: function(record, deep, callback, scope) {
  81362. var me = this,
  81363. doAnimate = !!this.animate;
  81364. if (!doAnimate || !this.isExpandingOrCollapsing) {
  81365. if (!record.isLeaf()) {
  81366. this.isExpandingOrCollapsing = doAnimate;
  81367. }
  81368. if (record.isExpanded()) {
  81369. me.collapse(record, deep, callback, scope);
  81370. } else {
  81371. me.expand(record, deep, callback, scope);
  81372. }
  81373. }
  81374. },
  81375. onItemDblClick: function(record, item, index) {
  81376. var me = this,
  81377. editingPlugin = me.editingPlugin;
  81378. me.callParent(arguments);
  81379. if (me.toggleOnDblClick && record.isExpandable() && !(editingPlugin && editingPlugin.clicksToEdit === 2)) {
  81380. me.toggle(record);
  81381. }
  81382. },
  81383. onBeforeItemMouseDown: function(record, item, index, e) {
  81384. if (e.getTarget(this.expanderSelector, item)) {
  81385. return false;
  81386. }
  81387. return this.callParent(arguments);
  81388. },
  81389. onItemClick: function(record, item, index, e) {
  81390. if (e.getTarget(this.expanderSelector, item) && record.isExpandable()) {
  81391. this.toggle(record, e.ctrlKey);
  81392. return false;
  81393. }
  81394. return this.callParent(arguments);
  81395. },
  81396. onExpanderMouseOver: function(e, t) {
  81397. e.getTarget(this.cellSelector, 10, true).addCls(this.expanderIconOverCls);
  81398. },
  81399. onExpanderMouseOut: function(e, t) {
  81400. e.getTarget(this.cellSelector, 10, true).removeCls(this.expanderIconOverCls);
  81401. },
  81402. getTreeStore: function() {
  81403. return this.panel.store;
  81404. },
  81405. ensureSingleExpand: function(node) {
  81406. var parent = node.parentNode;
  81407. if (parent) {
  81408. parent.eachChild(function(child) {
  81409. if (child !== node && child.isExpanded()) {
  81410. child.collapse();
  81411. }
  81412. });
  81413. }
  81414. },
  81415. shouldUpdateCell: function(column, changedFieldNames){
  81416. if (changedFieldNames) {
  81417. var i = 0,
  81418. len = changedFieldNames.length;
  81419. for (; i < len; ++i) {
  81420. if (Ext.Array.contains(this.uiFields, changedFieldNames[i])) {
  81421. return true;
  81422. }
  81423. }
  81424. }
  81425. return this.callParent(arguments);
  81426. },
  81427. onStoreWrite: function(store, operation) {
  81428. var treeStore = this.panel.store;
  81429. treeStore.fireEvent('write', treeStore, operation);
  81430. },
  81431. onStoreDataChanged: function(store, operation) {
  81432. var treeStore = this.panel.store;
  81433. treeStore.fireEvent('datachanged', treeStore);
  81434. }
  81435. });
  81436. Ext.define('Ext.tree.Panel', {
  81437. extend: 'Ext.panel.Table',
  81438. alias: 'widget.treepanel',
  81439. alternateClassName: ['Ext.tree.TreePanel', 'Ext.TreePanel'],
  81440. requires: ['Ext.tree.View', 'Ext.selection.TreeModel', 'Ext.tree.Column', 'Ext.data.TreeStore'],
  81441. viewType: 'treeview',
  81442. selType: 'treemodel',
  81443. treeCls: Ext.baseCSSPrefix + 'tree-panel',
  81444. deferRowRender: false,
  81445. rowLines: false,
  81446. lines: true,
  81447. useArrows: false,
  81448. singleExpand: false,
  81449. ddConfig: {
  81450. enableDrag: true,
  81451. enableDrop: true
  81452. },
  81453. rootVisible: true,
  81454. displayField: 'text',
  81455. root: null,
  81456. normalCfgCopy: ['displayField', 'root', 'singleExpand', 'useArrows', 'lines', 'rootVisible', 'scroll'],
  81457. lockedCfgCopy: ['displayField', 'root', 'singleExpand', 'useArrows', 'lines', 'rootVisible'],
  81458. isTree: true,
  81459. constructor: function(config) {
  81460. config = config || {};
  81461. if (config.animate === undefined) {
  81462. config.animate = Ext.isDefined(this.animate) ? this.animate : Ext.enableFx;
  81463. }
  81464. this.enableAnimations = config.animate;
  81465. delete config.animate;
  81466. this.callParent([config]);
  81467. },
  81468. initComponent: function() {
  81469. var me = this,
  81470. cls = [me.treeCls],
  81471. view;
  81472. if (me.useArrows) {
  81473. cls.push(Ext.baseCSSPrefix + 'tree-arrows');
  81474. me.lines = false;
  81475. }
  81476. if (me.lines) {
  81477. cls.push(Ext.baseCSSPrefix + 'tree-lines');
  81478. } else if (!me.useArrows) {
  81479. cls.push(Ext.baseCSSPrefix + 'tree-no-lines');
  81480. }
  81481. if (Ext.isString(me.store)) {
  81482. me.store = Ext.StoreMgr.lookup(me.store);
  81483. } else if (!me.store || Ext.isObject(me.store) && !me.store.isStore) {
  81484. me.store = new Ext.data.TreeStore(Ext.apply({}, me.store || {}, {
  81485. root: me.root,
  81486. fields: me.fields,
  81487. model: me.model,
  81488. folderSort: me.folderSort
  81489. }));
  81490. } else if (me.root) {
  81491. me.store = Ext.data.StoreManager.lookup(me.store);
  81492. me.store.setRootNode(me.root);
  81493. if (me.folderSort !== undefined) {
  81494. me.store.folderSort = me.folderSort;
  81495. me.store.sort();
  81496. }
  81497. }
  81498. me.viewConfig = Ext.apply({}, me.viewConfig);
  81499. me.viewConfig = Ext.applyIf(me.viewConfig, {
  81500. rootVisible: me.rootVisible,
  81501. animate: me.enableAnimations,
  81502. singleExpand: me.singleExpand,
  81503. node: me.store.getRootNode(),
  81504. hideHeaders: me.hideHeaders
  81505. });
  81506. me.mon(me.store, {
  81507. scope: me,
  81508. rootchange: me.onRootChange,
  81509. clear: me.onClear
  81510. });
  81511. me.relayEvents(me.store, [
  81512. 'beforeload',
  81513. 'load'
  81514. ]);
  81515. me.mon(me.store, {
  81516. append: me.createRelayer('itemappend'),
  81517. remove: me.createRelayer('itemremove'),
  81518. move: me.createRelayer('itemmove', [0, 4]),
  81519. insert: me.createRelayer('iteminsert'),
  81520. beforeappend: me.createRelayer('beforeitemappend'),
  81521. beforeremove: me.createRelayer('beforeitemremove'),
  81522. beforemove: me.createRelayer('beforeitemmove'),
  81523. beforeinsert: me.createRelayer('beforeiteminsert'),
  81524. expand: me.createRelayer('itemexpand', [0, 1]),
  81525. collapse: me.createRelayer('itemcollapse', [0, 1]),
  81526. beforeexpand: me.createRelayer('beforeitemexpand', [0, 1]),
  81527. beforecollapse: me.createRelayer('beforeitemcollapse', [0, 1])
  81528. });
  81529. if (!me.columns) {
  81530. if (me.initialConfig.hideHeaders === undefined) {
  81531. me.hideHeaders = true;
  81532. }
  81533. me.addCls(Ext.baseCSSPrefix + 'autowidth-table');
  81534. me.columns = [{
  81535. xtype : 'treecolumn',
  81536. text : 'Name',
  81537. width : Ext.isIE6 ? null : 10000,
  81538. dataIndex: me.displayField
  81539. }];
  81540. }
  81541. if (me.cls) {
  81542. cls.push(me.cls);
  81543. }
  81544. me.cls = cls.join(' ');
  81545. me.callParent();
  81546. view = me.getView();
  81547. me.relayEvents(view, [
  81548. 'checkchange',
  81549. 'afteritemexpand',
  81550. 'afteritemcollapse'
  81551. ]);
  81552. if (!view.rootVisible && !me.getRootNode()) {
  81553. me.setRootNode({
  81554. expanded: true
  81555. });
  81556. }
  81557. },
  81558. onClear: function(){
  81559. this.view.onClear();
  81560. },
  81561. setRootNode: function() {
  81562. return this.store.setRootNode.apply(this.store, arguments);
  81563. },
  81564. getRootNode: function() {
  81565. return this.store.getRootNode();
  81566. },
  81567. onRootChange: function(root) {
  81568. this.view.setRootNode(root);
  81569. },
  81570. getChecked: function() {
  81571. return this.getView().getChecked();
  81572. },
  81573. isItemChecked: function(rec) {
  81574. return rec.get('checked');
  81575. },
  81576. expandNode: function(record, deep, callback, scope) {
  81577. return this.getView().expand(record, deep, callback, scope || this);
  81578. },
  81579. collapseNode: function(record, deep, callback, scope) {
  81580. return this.getView().collapse(record, deep, callback, scope || this);
  81581. },
  81582. expandAll : function(callback, scope) {
  81583. var me = this,
  81584. root = me.getRootNode(),
  81585. animate = me.enableAnimations,
  81586. view = me.getView();
  81587. if (root) {
  81588. if (!animate) {
  81589. view.beginBulkUpdate();
  81590. }
  81591. root.expand(true, callback, scope || me);
  81592. if (!animate) {
  81593. view.endBulkUpdate();
  81594. }
  81595. }
  81596. },
  81597. collapseAll : function(callback, scope) {
  81598. var me = this,
  81599. root = me.getRootNode(),
  81600. animate = me.enableAnimations,
  81601. view = me.getView();
  81602. if (root) {
  81603. if (!animate) {
  81604. view.beginBulkUpdate();
  81605. }
  81606. scope = scope || me;
  81607. if (view.rootVisible) {
  81608. root.collapse(true, callback, scope);
  81609. } else {
  81610. root.collapseChildren(true, callback, scope);
  81611. }
  81612. if (!animate) {
  81613. view.endBulkUpdate();
  81614. }
  81615. }
  81616. },
  81617. expandPath: function(path, field, separator, callback, scope) {
  81618. var me = this,
  81619. current = me.getRootNode(),
  81620. index = 1,
  81621. view = me.getView(),
  81622. keys,
  81623. expander;
  81624. field = field || me.getRootNode().idProperty;
  81625. separator = separator || '/';
  81626. if (Ext.isEmpty(path)) {
  81627. Ext.callback(callback, scope || me, [false, null]);
  81628. return;
  81629. }
  81630. keys = path.split(separator);
  81631. if (current.get(field) != keys[1]) {
  81632. Ext.callback(callback, scope || me, [false, current]);
  81633. return;
  81634. }
  81635. expander = function(){
  81636. if (++index === keys.length) {
  81637. Ext.callback(callback, scope || me, [true, current]);
  81638. return;
  81639. }
  81640. var node = current.findChild(field, keys[index]);
  81641. if (!node) {
  81642. Ext.callback(callback, scope || me, [false, current]);
  81643. return;
  81644. }
  81645. current = node;
  81646. current.expand(false, expander);
  81647. };
  81648. current.expand(false, expander);
  81649. },
  81650. selectPath: function(path, field, separator, callback, scope) {
  81651. var me = this,
  81652. root,
  81653. keys,
  81654. last;
  81655. field = field || me.getRootNode().idProperty;
  81656. separator = separator || '/';
  81657. keys = path.split(separator);
  81658. last = keys.pop();
  81659. if (keys.length > 1) {
  81660. me.expandPath(keys.join(separator), field, separator, function(success, node){
  81661. var lastNode = node;
  81662. if (success && node) {
  81663. node = node.findChild(field, last);
  81664. if (node) {
  81665. me.getSelectionModel().select(node);
  81666. Ext.callback(callback, scope || me, [true, node]);
  81667. return;
  81668. }
  81669. }
  81670. Ext.callback(callback, scope || me, [false, lastNode]);
  81671. }, me);
  81672. } else {
  81673. root = me.getRootNode();
  81674. if (root.getId() === last) {
  81675. me.getSelectionModel().select(root);
  81676. Ext.callback(callback, scope || me, [true, root]);
  81677. } else {
  81678. Ext.callback(callback, scope || me, [false, null]);
  81679. }
  81680. }
  81681. }
  81682. });
  81683. Ext.define('Ext.view.DragZone', {
  81684. extend: 'Ext.dd.DragZone',
  81685. containerScroll: false,
  81686. constructor: function(config) {
  81687. var me = this,
  81688. view,
  81689. ownerCt,
  81690. el;
  81691. Ext.apply(me, config);
  81692. if (!me.ddGroup) {
  81693. me.ddGroup = 'view-dd-zone-' + me.view.id;
  81694. }
  81695. view = me.view;
  81696. ownerCt = view.ownerCt;
  81697. if (ownerCt) {
  81698. el = ownerCt.getTargetEl().dom;
  81699. } else {
  81700. el = view.el.dom.parentNode;
  81701. }
  81702. me.callParent([el]);
  81703. me.ddel = Ext.get(document.createElement('div'));
  81704. me.ddel.addCls(Ext.baseCSSPrefix + 'grid-dd-wrap');
  81705. },
  81706. init: function(id, sGroup, config) {
  81707. this.initTarget(id, sGroup, config);
  81708. this.view.mon(this.view, {
  81709. itemmousedown: this.onItemMouseDown,
  81710. scope: this
  81711. });
  81712. },
  81713. onValidDrop: function(target, e, id) {
  81714. this.callParent();
  81715. target.el.focus();
  81716. },
  81717. onItemMouseDown: function(view, record, item, index, e) {
  81718. if (!this.isPreventDrag(e, record, item, index)) {
  81719. this.view.focus();
  81720. this.handleMouseDown(e);
  81721. if (view.getSelectionModel().selectionMode == 'MULTI' && !e.ctrlKey && view.getSelectionModel().isSelected(record)) {
  81722. return false;
  81723. }
  81724. }
  81725. },
  81726. isPreventDrag: function(e) {
  81727. return false;
  81728. },
  81729. getDragData: function(e) {
  81730. var view = this.view,
  81731. item = e.getTarget(view.getItemSelector());
  81732. if (item) {
  81733. return {
  81734. copy: view.copy || (view.allowCopy && e.ctrlKey),
  81735. event: new Ext.EventObjectImpl(e),
  81736. view: view,
  81737. ddel: this.ddel,
  81738. item: item,
  81739. records: view.getSelectionModel().getSelection(),
  81740. fromPosition: Ext.fly(item).getXY()
  81741. };
  81742. }
  81743. },
  81744. onInitDrag: function(x, y) {
  81745. var me = this,
  81746. data = me.dragData,
  81747. view = data.view,
  81748. selectionModel = view.getSelectionModel(),
  81749. record = view.getRecord(data.item),
  81750. e = data.event;
  81751. if (!selectionModel.isSelected(record)) {
  81752. selectionModel.select(record, true);
  81753. }
  81754. data.records = selectionModel.getSelection();
  81755. me.ddel.update(me.getDragText());
  81756. me.proxy.update(me.ddel.dom);
  81757. me.onStartDrag(x, y);
  81758. return true;
  81759. },
  81760. getDragText: function() {
  81761. var count = this.dragData.records.length;
  81762. return Ext.String.format(this.dragText, count, count == 1 ? '' : 's');
  81763. },
  81764. getRepairXY : function(e, data){
  81765. return data ? data.fromPosition : false;
  81766. }
  81767. });
  81768. Ext.define('Ext.tree.ViewDragZone', {
  81769. extend: 'Ext.view.DragZone',
  81770. isPreventDrag: function(e, record) {
  81771. return (record.get('allowDrag') === false) || !!e.getTarget(this.view.expanderSelector);
  81772. },
  81773. afterRepair: function() {
  81774. var me = this,
  81775. view = me.view,
  81776. selectedRowCls = view.selectedItemCls,
  81777. records = me.dragData.records,
  81778. r,
  81779. rLen = records.length,
  81780. fly = Ext.fly,
  81781. item;
  81782. if (Ext.enableFx && me.repairHighlight) {
  81783. for (r = 0; r < rLen; r++) {
  81784. item = view.getNode(records[r]);
  81785. fly(item.firstChild).highlight(me.repairHighlightColor, {
  81786. listeners: {
  81787. beforeanimate: function() {
  81788. if (view.isSelected(item)) {
  81789. fly(item).removeCls(selectedRowCls);
  81790. }
  81791. },
  81792. afteranimate: function() {
  81793. if (view.isSelected(item)) {
  81794. fly(item).addCls(selectedRowCls);
  81795. }
  81796. }
  81797. }
  81798. });
  81799. }
  81800. }
  81801. me.dragging = false;
  81802. }
  81803. });
  81804. Ext.define('Ext.tree.ViewDropZone', {
  81805. extend: 'Ext.view.DropZone',
  81806. allowParentInserts: false,
  81807. allowContainerDrops: false,
  81808. appendOnly: false,
  81809. expandDelay : 500,
  81810. indicatorCls: Ext.baseCSSPrefix + 'tree-ddindicator',
  81811. expandNode : function(node) {
  81812. var view = this.view;
  81813. if (!node.isLeaf() && !node.isExpanded()) {
  81814. view.expand(node);
  81815. this.expandProcId = false;
  81816. }
  81817. },
  81818. queueExpand : function(node) {
  81819. this.expandProcId = Ext.Function.defer(this.expandNode, this.expandDelay, this, [node]);
  81820. },
  81821. cancelExpand : function() {
  81822. if (this.expandProcId) {
  81823. clearTimeout(this.expandProcId);
  81824. this.expandProcId = false;
  81825. }
  81826. },
  81827. getPosition: function(e, node) {
  81828. var view = this.view,
  81829. record = view.getRecord(node),
  81830. y = e.getPageY(),
  81831. noAppend = record.isLeaf(),
  81832. noBelow = false,
  81833. region = Ext.fly(node).getRegion(),
  81834. fragment;
  81835. if (record.isRoot()) {
  81836. return 'append';
  81837. }
  81838. if (this.appendOnly) {
  81839. return noAppend ? false : 'append';
  81840. }
  81841. if (!this.allowParentInsert) {
  81842. noBelow = record.hasChildNodes() && record.isExpanded();
  81843. }
  81844. fragment = (region.bottom - region.top) / (noAppend ? 2 : 3);
  81845. if (y >= region.top && y < (region.top + fragment)) {
  81846. return 'before';
  81847. }
  81848. else if (!noBelow && (noAppend || (y >= (region.bottom - fragment) && y <= region.bottom))) {
  81849. return 'after';
  81850. }
  81851. else {
  81852. return 'append';
  81853. }
  81854. },
  81855. isValidDropPoint : function(node, position, dragZone, e, data) {
  81856. if (!node || !data.item) {
  81857. return false;
  81858. }
  81859. var view = this.view,
  81860. targetNode = view.getRecord(node),
  81861. draggedRecords = data.records,
  81862. dataLength = draggedRecords.length,
  81863. ln = draggedRecords.length,
  81864. i, record;
  81865. if (!(targetNode && position && dataLength)) {
  81866. return false;
  81867. }
  81868. for (i = 0; i < ln; i++) {
  81869. record = draggedRecords[i];
  81870. if (record.isNode && record.contains(targetNode)) {
  81871. return false;
  81872. }
  81873. }
  81874. if (position === 'append' && targetNode.get('allowDrop') === false) {
  81875. return false;
  81876. }
  81877. else if (position != 'append' && targetNode.parentNode.get('allowDrop') === false) {
  81878. return false;
  81879. }
  81880. if (Ext.Array.contains(draggedRecords, targetNode)) {
  81881. return false;
  81882. }
  81883. return true;
  81884. },
  81885. onNodeOver : function(node, dragZone, e, data) {
  81886. var position = this.getPosition(e, node),
  81887. returnCls = this.dropNotAllowed,
  81888. view = this.view,
  81889. targetNode = view.getRecord(node),
  81890. indicator = this.getIndicator(),
  81891. indicatorX = 0,
  81892. indicatorY = 0;
  81893. this.cancelExpand();
  81894. if (position == 'append' && !this.expandProcId && !Ext.Array.contains(data.records, targetNode) && !targetNode.isLeaf() && !targetNode.isExpanded()) {
  81895. this.queueExpand(targetNode);
  81896. }
  81897. if (this.isValidDropPoint(node, position, dragZone, e, data)) {
  81898. this.valid = true;
  81899. this.currentPosition = position;
  81900. this.overRecord = targetNode;
  81901. indicator.setWidth(Ext.fly(node).getWidth());
  81902. indicatorY = Ext.fly(node).getY() - Ext.fly(view.el).getY() - 1;
  81903. if (position == 'before') {
  81904. returnCls = targetNode.isFirst() ? Ext.baseCSSPrefix + 'tree-drop-ok-above' : Ext.baseCSSPrefix + 'tree-drop-ok-between';
  81905. indicator.showAt(0, indicatorY);
  81906. dragZone.proxy.show();
  81907. } else if (position == 'after') {
  81908. returnCls = targetNode.isLast() ? Ext.baseCSSPrefix + 'tree-drop-ok-below' : Ext.baseCSSPrefix + 'tree-drop-ok-between';
  81909. indicatorY += Ext.fly(node).getHeight();
  81910. indicator.showAt(0, indicatorY);
  81911. dragZone.proxy.show();
  81912. } else {
  81913. returnCls = Ext.baseCSSPrefix + 'tree-drop-ok-append';
  81914. indicator.hide();
  81915. }
  81916. } else {
  81917. this.valid = false;
  81918. }
  81919. this.currentCls = returnCls;
  81920. return returnCls;
  81921. },
  81922. onContainerOver : function(dd, e, data) {
  81923. return e.getTarget('.' + this.indicatorCls) ? this.currentCls : this.dropNotAllowed;
  81924. },
  81925. notifyOut: function() {
  81926. this.callParent(arguments);
  81927. this.cancelExpand();
  81928. },
  81929. handleNodeDrop : function(data, targetNode, position) {
  81930. var me = this,
  81931. view = me.view,
  81932. parentNode = targetNode.parentNode,
  81933. store = view.getStore(),
  81934. recordDomNodes = [],
  81935. records, i, len,
  81936. insertionMethod, argList,
  81937. needTargetExpand,
  81938. transferData,
  81939. processDrop;
  81940. if (data.copy) {
  81941. records = data.records;
  81942. data.records = [];
  81943. for (i = 0, len = records.length; i < len; i++) {
  81944. data.records.push(Ext.apply({}, records[i].data));
  81945. }
  81946. }
  81947. me.cancelExpand();
  81948. if (position == 'before') {
  81949. insertionMethod = parentNode.insertBefore;
  81950. argList = [null, targetNode];
  81951. targetNode = parentNode;
  81952. }
  81953. else if (position == 'after') {
  81954. if (targetNode.nextSibling) {
  81955. insertionMethod = parentNode.insertBefore;
  81956. argList = [null, targetNode.nextSibling];
  81957. }
  81958. else {
  81959. insertionMethod = parentNode.appendChild;
  81960. argList = [null];
  81961. }
  81962. targetNode = parentNode;
  81963. }
  81964. else {
  81965. if (!targetNode.isExpanded()) {
  81966. needTargetExpand = true;
  81967. }
  81968. insertionMethod = targetNode.appendChild;
  81969. argList = [null];
  81970. }
  81971. transferData = function() {
  81972. var node,
  81973. r, rLen, color, n;
  81974. for (i = 0, len = data.records.length; i < len; i++) {
  81975. argList[0] = data.records[i];
  81976. node = insertionMethod.apply(targetNode, argList);
  81977. if (Ext.enableFx && me.dropHighlight) {
  81978. recordDomNodes.push(view.getNode(node));
  81979. }
  81980. }
  81981. if (Ext.enableFx && me.dropHighlight) {
  81982. rLen = recordDomNodes.length;
  81983. color = me.dropHighlightColor;
  81984. for (r = 0; r < rLen; r++) {
  81985. n = recordDomNodes[r];
  81986. if (n) {
  81987. Ext.fly(n.firstChild ? n.firstChild : n).highlight(color);
  81988. }
  81989. }
  81990. }
  81991. };
  81992. if (needTargetExpand) {
  81993. targetNode.expand(false, transferData);
  81994. }
  81995. else {
  81996. transferData();
  81997. }
  81998. }
  81999. });
  82000. Ext.define('Ext.tree.plugin.TreeViewDragDrop', {
  82001. extend: 'Ext.AbstractPlugin',
  82002. alias: 'plugin.treeviewdragdrop',
  82003. uses: [
  82004. 'Ext.tree.ViewDragZone',
  82005. 'Ext.tree.ViewDropZone'
  82006. ],
  82007. dragText : '{0} selected node{1}',
  82008. allowParentInserts: false,
  82009. allowContainerDrops: false,
  82010. appendOnly: false,
  82011. ddGroup : "TreeDD",
  82012. expandDelay : 1000,
  82013. enableDrop: true,
  82014. enableDrag: true,
  82015. nodeHighlightColor: 'c3daf9',
  82016. nodeHighlightOnDrop: Ext.enableFx,
  82017. nodeHighlightOnRepair: Ext.enableFx,
  82018. init : function(view) {
  82019. view.on('render', this.onViewRender, this, {single: true});
  82020. },
  82021. destroy: function() {
  82022. Ext.destroy(this.dragZone, this.dropZone);
  82023. },
  82024. onViewRender : function(view) {
  82025. var me = this;
  82026. if (me.enableDrag) {
  82027. me.dragZone = new Ext.tree.ViewDragZone({
  82028. view: view,
  82029. ddGroup: me.dragGroup || me.ddGroup,
  82030. dragText: me.dragText,
  82031. repairHighlightColor: me.nodeHighlightColor,
  82032. repairHighlight: me.nodeHighlightOnRepair
  82033. });
  82034. }
  82035. if (me.enableDrop) {
  82036. me.dropZone = new Ext.tree.ViewDropZone({
  82037. view: view,
  82038. ddGroup: me.dropGroup || me.ddGroup,
  82039. allowContainerDrops: me.allowContainerDrops,
  82040. appendOnly: me.appendOnly,
  82041. allowParentInserts: me.allowParentInserts,
  82042. expandDelay: me.expandDelay,
  82043. dropHighlightColor: me.nodeHighlightColor,
  82044. dropHighlight: me.nodeHighlightOnDrop
  82045. });
  82046. }
  82047. }
  82048. });
  82049. Ext.define('Ext.util.CSS', (function() {
  82050. var rules = null,
  82051. doc = document,
  82052. camelRe = /(-[a-z])/gi,
  82053. camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
  82054. return {
  82055. singleton: true,
  82056. constructor: function() {
  82057. this.rules = {};
  82058. this.initialized = false;
  82059. },
  82060. createStyleSheet : function(cssText, id) {
  82061. var ss,
  82062. head = doc.getElementsByTagName("head")[0],
  82063. styleEl = doc.createElement("style");
  82064. styleEl.setAttribute("type", "text/css");
  82065. if (id) {
  82066. styleEl.setAttribute("id", id);
  82067. }
  82068. if (Ext.isIE) {
  82069. head.appendChild(styleEl);
  82070. ss = styleEl.styleSheet;
  82071. ss.cssText = cssText;
  82072. } else {
  82073. try{
  82074. styleEl.appendChild(doc.createTextNode(cssText));
  82075. } catch(e) {
  82076. styleEl.cssText = cssText;
  82077. }
  82078. head.appendChild(styleEl);
  82079. ss = styleEl.styleSheet ? styleEl.styleSheet : (styleEl.sheet || doc.styleSheets[doc.styleSheets.length-1]);
  82080. }
  82081. this.cacheStyleSheet(ss);
  82082. return ss;
  82083. },
  82084. removeStyleSheet : function(id) {
  82085. var existing = document.getElementById(id);
  82086. if (existing) {
  82087. existing.parentNode.removeChild(existing);
  82088. }
  82089. },
  82090. swapStyleSheet : function(id, url) {
  82091. var doc = document,
  82092. ss;
  82093. this.removeStyleSheet(id);
  82094. ss = doc.createElement("link");
  82095. ss.setAttribute("rel", "stylesheet");
  82096. ss.setAttribute("type", "text/css");
  82097. ss.setAttribute("id", id);
  82098. ss.setAttribute("href", url);
  82099. doc.getElementsByTagName("head")[0].appendChild(ss);
  82100. },
  82101. refreshCache : function() {
  82102. return this.getRules(true);
  82103. },
  82104. cacheStyleSheet : function(ss) {
  82105. if(!rules){
  82106. rules = {};
  82107. }
  82108. try {
  82109. var ssRules = ss.cssRules || ss.rules,
  82110. selectorText,
  82111. i = ssRules.length - 1,
  82112. j,
  82113. selectors;
  82114. for (; i >= 0; --i) {
  82115. selectorText = ssRules[i].selectorText;
  82116. if (selectorText) {
  82117. selectorText = selectorText.split(',');
  82118. selectors = selectorText.length;
  82119. for (j = 0; j < selectors; j++) {
  82120. rules[Ext.String.trim(selectorText[j]).toLowerCase()] = ssRules[i];
  82121. }
  82122. }
  82123. }
  82124. } catch(e) {}
  82125. },
  82126. getRules : function(refreshCache) {
  82127. if (rules === null || refreshCache) {
  82128. rules = {};
  82129. var ds = doc.styleSheets,
  82130. i = 0,
  82131. len = ds.length;
  82132. for (; i < len; i++) {
  82133. try {
  82134. if (!ds[i].disabled) {
  82135. this.cacheStyleSheet(ds[i]);
  82136. }
  82137. } catch(e) {}
  82138. }
  82139. }
  82140. return rules;
  82141. },
  82142. getRule: function(selector, refreshCache) {
  82143. var rs = this.getRules(refreshCache),
  82144. i;
  82145. if (!Ext.isArray(selector)) {
  82146. return rs[selector.toLowerCase()];
  82147. }
  82148. for (i = 0; i < selector.length; i++) {
  82149. if (rs[selector[i]]) {
  82150. return rs[selector[i].toLowerCase()];
  82151. }
  82152. }
  82153. return null;
  82154. },
  82155. updateRule : function(selector, property, value){
  82156. var rule, i;
  82157. if (!Ext.isArray(selector)) {
  82158. rule = this.getRule(selector);
  82159. if (rule) {
  82160. rule.style[property.replace(camelRe, camelFn)] = value;
  82161. return true;
  82162. }
  82163. } else {
  82164. for (i = 0; i < selector.length; i++) {
  82165. if (this.updateRule(selector[i], property, value)) {
  82166. return true;
  82167. }
  82168. }
  82169. }
  82170. return false;
  82171. }
  82172. };
  82173. }()));
  82174. Ext.define('Ext.util.Cookies', {
  82175. singleton: true,
  82176. set : function(name, value){
  82177. var argv = arguments,
  82178. argc = arguments.length,
  82179. expires = (argc > 2) ? argv[2] : null,
  82180. path = (argc > 3) ? argv[3] : '/',
  82181. domain = (argc > 4) ? argv[4] : null,
  82182. secure = (argc > 5) ? argv[5] : false;
  82183. document.cookie = name + "=" + escape(value) + ((expires === null) ? "" : ("; expires=" + expires.toGMTString())) + ((path === null) ? "" : ("; path=" + path)) + ((domain === null) ? "" : ("; domain=" + domain)) + ((secure === true) ? "; secure" : "");
  82184. },
  82185. get : function(name){
  82186. var arg = name + "=",
  82187. alen = arg.length,
  82188. clen = document.cookie.length,
  82189. i = 0,
  82190. j = 0;
  82191. while(i < clen){
  82192. j = i + alen;
  82193. if(document.cookie.substring(i, j) == arg){
  82194. return this.getCookieVal(j);
  82195. }
  82196. i = document.cookie.indexOf(" ", i) + 1;
  82197. if(i === 0){
  82198. break;
  82199. }
  82200. }
  82201. return null;
  82202. },
  82203. clear : function(name, path){
  82204. if(this.get(name)){
  82205. path = path || '/';
  82206. document.cookie = name + '=' + '; expires=Thu, 01-Jan-70 00:00:01 GMT; path=' + path;
  82207. }
  82208. },
  82209. getCookieVal : function(offset){
  82210. var endstr = document.cookie.indexOf(";", offset);
  82211. if(endstr == -1){
  82212. endstr = document.cookie.length;
  82213. }
  82214. return unescape(document.cookie.substring(offset, endstr));
  82215. }
  82216. });
  82217. Ext.define('Ext.util.Grouper', {
  82218. extend: 'Ext.util.Sorter',
  82219. isGrouper: true,
  82220. getGroupString: function(instance) {
  82221. return instance.get(this.property);
  82222. }
  82223. });
  82224. Ext.define('Ext.util.History', {
  82225. singleton: true,
  82226. alternateClassName: 'Ext.History',
  82227. mixins: {
  82228. observable: 'Ext.util.Observable'
  82229. },
  82230. useTopWindow: true,
  82231. fieldId: Ext.baseCSSPrefix + 'history-field',
  82232. iframeId: Ext.baseCSSPrefix + 'history-frame',
  82233. constructor: function() {
  82234. var me = this;
  82235. me.oldIEMode = Ext.isIE6 || Ext.isIE7 || !Ext.isStrict && Ext.isIE8;
  82236. me.iframe = null;
  82237. me.hiddenField = null;
  82238. me.ready = false;
  82239. me.currentToken = null;
  82240. me.mixins.observable.constructor.call(me);
  82241. },
  82242. getHash: function() {
  82243. var href = window.location.href,
  82244. i = href.indexOf("#");
  82245. return i >= 0 ? href.substr(i + 1) : null;
  82246. },
  82247. setHash: function (hash) {
  82248. var me = this,
  82249. win = me.useTopWindow ? window.top : window;
  82250. try {
  82251. win.location.hash = hash;
  82252. } catch (e) {
  82253. }
  82254. },
  82255. doSave: function() {
  82256. this.hiddenField.value = this.currentToken;
  82257. },
  82258. handleStateChange: function(token) {
  82259. this.currentToken = token;
  82260. this.fireEvent('change', token);
  82261. },
  82262. updateIFrame: function(token) {
  82263. var html = '<html><body><div id="state">' +
  82264. Ext.util.Format.htmlEncode(token) +
  82265. '</div></body></html>',
  82266. doc;
  82267. try {
  82268. doc = this.iframe.contentWindow.document;
  82269. doc.open();
  82270. doc.write(html);
  82271. doc.close();
  82272. return true;
  82273. } catch (e) {
  82274. return false;
  82275. }
  82276. },
  82277. checkIFrame: function () {
  82278. var me = this,
  82279. contentWindow = me.iframe.contentWindow,
  82280. doc, elem, oldToken, oldHash;
  82281. if (!contentWindow || !contentWindow.document) {
  82282. Ext.Function.defer(this.checkIFrame, 10, this);
  82283. return;
  82284. }
  82285. doc = contentWindow.document;
  82286. elem = doc.getElementById("state");
  82287. oldToken = elem ? elem.innerText : null;
  82288. oldHash = me.getHash();
  82289. Ext.TaskManager.start({
  82290. run: function () {
  82291. var doc = contentWindow.document,
  82292. elem = doc.getElementById("state"),
  82293. newToken = elem ? elem.innerText : null,
  82294. newHash = me.getHash();
  82295. if (newToken !== oldToken) {
  82296. oldToken = newToken;
  82297. me.handleStateChange(newToken);
  82298. me.setHash(newToken);
  82299. oldHash = newToken;
  82300. me.doSave();
  82301. } else if (newHash !== oldHash) {
  82302. oldHash = newHash;
  82303. me.updateIFrame(newHash);
  82304. }
  82305. },
  82306. interval: 50,
  82307. scope: me
  82308. });
  82309. me.ready = true;
  82310. me.fireEvent('ready', me);
  82311. },
  82312. startUp: function () {
  82313. var me = this,
  82314. hash;
  82315. me.currentToken = me.hiddenField.value || this.getHash();
  82316. if (me.oldIEMode) {
  82317. me.checkIFrame();
  82318. } else {
  82319. hash = me.getHash();
  82320. Ext.TaskManager.start({
  82321. run: function () {
  82322. var newHash = me.getHash();
  82323. if (newHash !== hash) {
  82324. hash = newHash;
  82325. me.handleStateChange(hash);
  82326. me.doSave();
  82327. }
  82328. },
  82329. interval: 50,
  82330. scope: me
  82331. });
  82332. me.ready = true;
  82333. me.fireEvent('ready', me);
  82334. }
  82335. },
  82336. init: function (onReady, scope) {
  82337. var me = this,
  82338. DomHelper = Ext.DomHelper;
  82339. if (me.ready) {
  82340. Ext.callback(onReady, scope, [me]);
  82341. return;
  82342. }
  82343. if (!Ext.isReady) {
  82344. Ext.onReady(function() {
  82345. me.init(onReady, scope);
  82346. });
  82347. return;
  82348. }
  82349. me.hiddenField = Ext.getDom(me.fieldId);
  82350. if (!me.hiddenField) {
  82351. me.hiddenField = Ext.getBody().createChild({
  82352. id: Ext.id(),
  82353. tag: 'form',
  82354. cls: Ext.baseCSSPrefix + 'hide-display',
  82355. children: [{
  82356. tag: 'input',
  82357. type: 'hidden',
  82358. id: me.fieldId
  82359. }]
  82360. }, false, true).firstChild;
  82361. }
  82362. if (me.oldIEMode) {
  82363. me.iframe = Ext.getDom(me.iframeId);
  82364. if (!me.iframe) {
  82365. me.iframe = DomHelper.append(me.hiddenField.parentNode, {
  82366. tag: 'iframe',
  82367. id: me.iframeId,
  82368. src: Ext.SSL_SECURE_URL
  82369. });
  82370. }
  82371. }
  82372. me.addEvents(
  82373. 'ready',
  82374. 'change'
  82375. );
  82376. if (onReady) {
  82377. me.on('ready', onReady, scope, {single: true});
  82378. }
  82379. me.startUp();
  82380. },
  82381. add: function (token, preventDup) {
  82382. var me = this;
  82383. if (preventDup !== false) {
  82384. if (me.getToken() === token) {
  82385. return true;
  82386. }
  82387. }
  82388. if (me.oldIEMode) {
  82389. return me.updateIFrame(token);
  82390. } else {
  82391. me.setHash(token);
  82392. return true;
  82393. }
  82394. },
  82395. back: function() {
  82396. window.history.go(-1);
  82397. },
  82398. forward: function(){
  82399. window.history.go(1);
  82400. },
  82401. getToken: function() {
  82402. return this.ready ? this.currentToken : this.getHash();
  82403. }
  82404. });
  82405. Ext.define('Ext.util.Point', {
  82406. extend: 'Ext.util.Region',
  82407. statics: {
  82408. fromEvent: function(e) {
  82409. e = (e.changedTouches && e.changedTouches.length > 0) ? e.changedTouches[0] : e;
  82410. return new this(e.pageX, e.pageY);
  82411. }
  82412. },
  82413. constructor: function(x, y) {
  82414. this.callParent([y, x, y, x]);
  82415. },
  82416. toString: function() {
  82417. return "Point[" + this.x + "," + this.y + "]";
  82418. },
  82419. equals: function(p) {
  82420. return (this.x == p.x && this.y == p.y);
  82421. },
  82422. isWithin: function(p, threshold) {
  82423. if (!Ext.isObject(threshold)) {
  82424. threshold = {
  82425. x: threshold,
  82426. y: threshold
  82427. };
  82428. }
  82429. return (this.x <= p.x + threshold.x && this.x >= p.x - threshold.x &&
  82430. this.y <= p.y + threshold.y && this.y >= p.y - threshold.y);
  82431. },
  82432. roundedEquals: function(p) {
  82433. return (Math.round(this.x) == Math.round(p.x) && Math.round(this.y) == Math.round(p.y));
  82434. }
  82435. }, function() {
  82436. this.prototype.translate = Ext.util.Region.prototype.translateBy;
  82437. });
  82438. Ext.define('Ext.view.TableChunker', {
  82439. singleton: true,
  82440. requires: ['Ext.XTemplate'],
  82441. metaTableTpl: [
  82442. '{%if (this.openTableWrap)out.push(this.openTableWrap())%}',
  82443. '<table class="' + Ext.baseCSSPrefix + 'grid-table ' + Ext.baseCSSPrefix + 'grid-table-resizer" border="0" cellspacing="0" cellpadding="0" {[this.embedFullWidth(values)]}>',
  82444. '<tbody>',
  82445. '<tr class="' + Ext.baseCSSPrefix + 'grid-header-row">',
  82446. '<tpl for="columns">',
  82447. '<th class="' + Ext.baseCSSPrefix + 'grid-col-resizer-{id}" style="width: {width}px; height: 0px;"></th>',
  82448. '</tpl>',
  82449. '</tr>',
  82450. '{[this.openRows()]}',
  82451. '{row}',
  82452. '<tpl for="features">',
  82453. '{[this.embedFeature(values, parent, xindex, xcount)]}',
  82454. '</tpl>',
  82455. '{[this.closeRows()]}',
  82456. '</tbody>',
  82457. '</table>',
  82458. '{%if (this.closeTableWrap)out.push(this.closeTableWrap())%}'
  82459. ],
  82460. constructor: function() {
  82461. Ext.XTemplate.prototype.recurse = function(values, reference) {
  82462. return this.apply(reference ? values[reference] : values);
  82463. };
  82464. },
  82465. embedFeature: function(values, parent, x, xcount) {
  82466. var tpl = '';
  82467. if (!values.disabled) {
  82468. tpl = values.getFeatureTpl(values, parent, x, xcount);
  82469. }
  82470. return tpl;
  82471. },
  82472. embedFullWidth: function(values) {
  82473. var result = 'style="width:{fullWidth}px;';
  82474. if (!values.rowCount) {
  82475. result += 'height:1px;';
  82476. }
  82477. return result + '"';
  82478. },
  82479. openRows: function() {
  82480. return '<tpl for="rows">';
  82481. },
  82482. closeRows: function() {
  82483. return '</tpl>';
  82484. },
  82485. metaRowTpl: [
  82486. '<tr class="' + Ext.baseCSSPrefix + 'grid-row {[this.embedRowCls()]}" {[this.embedRowAttr()]}>',
  82487. '<tpl for="columns">',
  82488. '<td class="{cls} ' + Ext.baseCSSPrefix + 'grid-cell ' + Ext.baseCSSPrefix + 'grid-cell-{columnId} {{id}-modified} {{id}-tdCls} {[this.firstOrLastCls(xindex, xcount)]}" {{id}-tdAttr}>',
  82489. '<div {unselectableAttr} class="' + Ext.baseCSSPrefix + 'grid-cell-inner {unselectableCls}" style="text-align: {align}; {{id}-style};">{{id}}</div>',
  82490. '</td>',
  82491. '</tpl>',
  82492. '</tr>'
  82493. ],
  82494. firstOrLastCls: function(xindex, xcount) {
  82495. if (xindex === 1) {
  82496. return Ext.view.Table.prototype.firstCls;
  82497. } else if (xindex === xcount) {
  82498. return Ext.view.Table.prototype.lastCls;
  82499. }
  82500. },
  82501. embedRowCls: function() {
  82502. return '{rowCls}';
  82503. },
  82504. embedRowAttr: function() {
  82505. return '{rowAttr}';
  82506. },
  82507. openTableWrap: undefined,
  82508. closeTableWrap: undefined,
  82509. getTableTpl: function(cfg, textOnly) {
  82510. var tpl,
  82511. tableTplMemberFns = {
  82512. openRows: this.openRows,
  82513. closeRows: this.closeRows,
  82514. embedFeature: this.embedFeature,
  82515. embedFullWidth: this.embedFullWidth,
  82516. openTableWrap: this.openTableWrap,
  82517. closeTableWrap: this.closeTableWrap
  82518. },
  82519. tplMemberFns = {},
  82520. features = cfg.features || [],
  82521. ln = features.length,
  82522. i = 0,
  82523. memberFns = {
  82524. embedRowCls: this.embedRowCls,
  82525. embedRowAttr: this.embedRowAttr,
  82526. firstOrLastCls: this.firstOrLastCls,
  82527. unselectableAttr: cfg.enableTextSelection ? '' : 'unselectable="on"',
  82528. unselectableCls: cfg.enableTextSelection ? '' : Ext.baseCSSPrefix + 'unselectable'
  82529. },
  82530. metaRowTpl = Array.prototype.slice.call(this.metaRowTpl, 0),
  82531. metaTableTpl;
  82532. for (; i < ln; i++) {
  82533. if (!features[i].disabled) {
  82534. features[i].mutateMetaRowTpl(metaRowTpl);
  82535. Ext.apply(memberFns, features[i].getMetaRowTplFragments());
  82536. Ext.apply(tplMemberFns, features[i].getFragmentTpl());
  82537. Ext.apply(tableTplMemberFns, features[i].getTableFragments());
  82538. }
  82539. }
  82540. metaRowTpl = new Ext.XTemplate(metaRowTpl.join(''), memberFns);
  82541. cfg.row = metaRowTpl.applyTemplate(cfg);
  82542. metaTableTpl = new Ext.XTemplate(this.metaTableTpl.join(''), tableTplMemberFns);
  82543. tpl = metaTableTpl.applyTemplate(cfg);
  82544. if (!textOnly) {
  82545. tpl = new Ext.XTemplate(tpl, tplMemberFns);
  82546. }
  82547. return tpl;
  82548. }
  82549. });
  82550. //@tail
  82551. Ext._endTime = new Date().getTime();
  82552. if (Ext._beforereadyhandler){
  82553. Ext._beforereadyhandler();
  82554. }