scripts.bundle.js 221 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841
  1. "use strict";
  2. // Class definition
  3. var KTBlockUI = function(element, options) {
  4. //////////////////////////////
  5. // ** Private variables ** //
  6. //////////////////////////////
  7. var the = this;
  8. if ( typeof element === "undefined" || element === null ) {
  9. return;
  10. }
  11. // Default options
  12. var defaultOptions = {
  13. zIndex: false,
  14. overlayClass: '',
  15. overflow: 'hidden',
  16. message: '<span class="spinner-border text-primary"></span>'
  17. };
  18. ////////////////////////////
  19. // ** Private methods ** //
  20. ////////////////////////////
  21. var _construct = function() {
  22. if ( KTUtil.data(element).has('blockui') ) {
  23. the = KTUtil.data(element).get('blockui');
  24. } else {
  25. _init();
  26. }
  27. }
  28. var _init = function() {
  29. // Variables
  30. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  31. the.element = element;
  32. the.overlayElement = null;
  33. the.blocked = false;
  34. the.positionChanged = false;
  35. the.overflowChanged = false;
  36. // Bind Instance
  37. KTUtil.data(the.element).set('blockui', the);
  38. }
  39. var _block = function() {
  40. if ( KTEventHandler.trigger(the.element, 'kt.blockui.block', the) === false ) {
  41. return;
  42. }
  43. var isPage = (the.element.tagName === 'BODY');
  44. var position = KTUtil.css(the.element, 'position');
  45. var overflow = KTUtil.css(the.element, 'overflow');
  46. var zIndex = isPage ? 10000 : 1;
  47. if (the.options.zIndex > 0) {
  48. zIndex = the.options.zIndex;
  49. } else {
  50. if (KTUtil.css(the.element, 'z-index') != 'auto') {
  51. zIndex = KTUtil.css(the.element, 'z-index');
  52. }
  53. }
  54. the.element.classList.add('blockui');
  55. if (position === "absolute" || position === "relative" || position === "fixed") {
  56. KTUtil.css(the.element, 'position', 'relative');
  57. the.positionChanged = true;
  58. }
  59. if (the.options.overflow === 'hidden' && overflow === 'visible') {
  60. KTUtil.css(the.element, 'overflow', 'hidden');
  61. the.overflowChanged = true;
  62. }
  63. the.overlayElement = document.createElement('DIV');
  64. the.overlayElement.setAttribute('class', 'blockui-overlay ' + the.options.overlayClass);
  65. the.overlayElement.innerHTML = the.options.message;
  66. KTUtil.css(the.overlayElement, 'z-index', zIndex);
  67. the.element.append(the.overlayElement);
  68. the.blocked = true;
  69. KTEventHandler.trigger(the.element, 'kt.blockui.after.blocked', the)
  70. }
  71. var _release = function() {
  72. if ( KTEventHandler.trigger(the.element, 'kt.blockui.release', the) === false ) {
  73. return;
  74. }
  75. the.element.classList.add('blockui');
  76. if (the.positionChanged) {
  77. KTUtil.css(the.element, 'position', '');
  78. }
  79. if (the.overflowChanged) {
  80. KTUtil.css(the.element, 'overflow', '');
  81. }
  82. if (the.overlayElement) {
  83. KTUtil.remove(the.overlayElement);
  84. }
  85. the.blocked = false;
  86. KTEventHandler.trigger(the.element, 'kt.blockui.released', the);
  87. }
  88. var _isBlocked = function() {
  89. return the.blocked;
  90. }
  91. var _destroy = function() {
  92. KTUtil.data(the.element).remove('blockui');
  93. }
  94. // Construct class
  95. _construct();
  96. ///////////////////////
  97. // ** Public API ** //
  98. ///////////////////////
  99. // Plugin API
  100. the.block = function() {
  101. _block();
  102. }
  103. the.release = function() {
  104. _release();
  105. }
  106. the.isBlocked = function() {
  107. return _isBlocked();
  108. }
  109. the.destroy = function() {
  110. return _destroy();
  111. }
  112. // Event API
  113. the.on = function(name, handler) {
  114. return KTEventHandler.on(the.element, name, handler);
  115. }
  116. the.one = function(name, handler) {
  117. return KTEventHandler.one(the.element, name, handler);
  118. }
  119. the.off = function(name, handlerId) {
  120. return KTEventHandler.off(the.element, name, handlerId);
  121. }
  122. the.trigger = function(name, event) {
  123. return KTEventHandler.trigger(the.element, name, event, the, event);
  124. }
  125. };
  126. // Static methods
  127. KTBlockUI.getInstance = function(element) {
  128. if (element !== null && KTUtil.data(element).has('blockui')) {
  129. return KTUtil.data(element).get('blockui');
  130. } else {
  131. return null;
  132. }
  133. }
  134. // Webpack support
  135. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  136. module.exports = KTBlockUI;
  137. }
  138. "use strict";
  139. // DOCS: https://javascript.info/cookie
  140. // Class definition
  141. var KTCookie = function() {
  142. return {
  143. // returns the cookie with the given name,
  144. // or undefined if not found
  145. get: function(name) {
  146. var matches = document.cookie.match(new RegExp(
  147. "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
  148. ));
  149. return matches ? decodeURIComponent(matches[1]) : null;
  150. },
  151. // Please note that a cookie value is encoded,
  152. // so getCookie uses a built-in decodeURIComponent function to decode it.
  153. set: function(name, value, options) {
  154. if ( typeof options === "undefined" || options === null ) {
  155. options = {};
  156. }
  157. options = Object.assign({}, {
  158. path: '/'
  159. }, options);
  160. if ( options.expires instanceof Date ) {
  161. options.expires = options.expires.toUTCString();
  162. }
  163. var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
  164. for ( var optionKey in options ) {
  165. if ( options.hasOwnProperty(optionKey) === false ) {
  166. continue;
  167. }
  168. updatedCookie += "; " + optionKey;
  169. var optionValue = options[optionKey];
  170. if ( optionValue !== true ) {
  171. updatedCookie += "=" + optionValue;
  172. }
  173. }
  174. document.cookie = updatedCookie;
  175. },
  176. // To remove a cookie, we can call it with a negative expiration date:
  177. remove: function(name) {
  178. this.set(name, "", {
  179. 'max-age': -1
  180. });
  181. }
  182. }
  183. }();
  184. // Webpack support
  185. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  186. module.exports = KTCookie;
  187. }
  188. "use strict";
  189. // Class definition
  190. var KTDialer = function(element, options) {
  191. ////////////////////////////
  192. // ** Private variables ** //
  193. ////////////////////////////
  194. var the = this;
  195. if (!element) {
  196. return;
  197. }
  198. // Default options
  199. var defaultOptions = {
  200. min: null,
  201. max: null,
  202. step: 1,
  203. decimals: 0,
  204. prefix: "",
  205. suffix: ""
  206. };
  207. ////////////////////////////
  208. // ** Private methods ** //
  209. ////////////////////////////
  210. // Constructor
  211. var _construct = function() {
  212. if ( KTUtil.data(element).has('dialer') === true ) {
  213. the = KTUtil.data(element).get('dialer');
  214. } else {
  215. _init();
  216. }
  217. }
  218. // Initialize
  219. var _init = function() {
  220. // Variables
  221. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  222. // Elements
  223. the.element = element;
  224. the.incElement = the.element.querySelector('[data-kt-dialer-control="increase"]');
  225. the.decElement = the.element.querySelector('[data-kt-dialer-control="decrease"]');
  226. the.inputElement = the.element.querySelector('input[type]');
  227. // Set Values
  228. if (_getOption('decimals')) {
  229. the.options.decimals = parseInt(_getOption('decimals'));
  230. }
  231. if (_getOption('prefix')) {
  232. the.options.prefix = _getOption('prefix');
  233. }
  234. if (_getOption('suffix')) {
  235. the.options.suffix = _getOption('suffix');
  236. }
  237. if (_getOption('step')) {
  238. the.options.step = parseFloat(_getOption('step'));
  239. }
  240. if (_getOption('min')) {
  241. the.options.min = parseFloat(_getOption('min'));
  242. }
  243. if (_getOption('max')) {
  244. the.options.max = parseFloat(_getOption('max'));
  245. }
  246. the.value = parseFloat(the.inputElement.value.replace(/[^\d.]/g, ''));
  247. _setValue();
  248. // Event Handlers
  249. _handlers();
  250. // Bind Instance
  251. KTUtil.data(the.element).set('dialer', the);
  252. }
  253. // Handlers
  254. var _handlers = function() {
  255. KTUtil.addEvent(the.incElement, 'click', function(e) {
  256. e.preventDefault();
  257. _increase();
  258. });
  259. KTUtil.addEvent(the.decElement, 'click', function(e) {
  260. e.preventDefault();
  261. _decrease();
  262. });
  263. KTUtil.addEvent(the.inputElement, 'input', function(e) {
  264. e.preventDefault();
  265. _setValue();
  266. });
  267. }
  268. // Event handlers
  269. var _increase = function() {
  270. // Trigger "after.dialer" event
  271. KTEventHandler.trigger(the.element, 'kt.dialer.increase', the);
  272. the.inputElement.value = the.value + the.options.step;
  273. _setValue();
  274. // Trigger "before.dialer" event
  275. KTEventHandler.trigger(the.element, 'kt.dialer.increased', the);
  276. return the;
  277. }
  278. var _decrease = function() {
  279. // Trigger "after.dialer" event
  280. KTEventHandler.trigger(the.element, 'kt.dialer.decrease', the);
  281. the.inputElement.value = the.value - the.options.step;
  282. _setValue();
  283. // Trigger "before.dialer" event
  284. KTEventHandler.trigger(the.element, 'kt.dialer.decreased', the);
  285. return the;
  286. }
  287. // Set Input Value
  288. var _setValue = function(value) {
  289. // Trigger "after.dialer" event
  290. KTEventHandler.trigger(the.element, 'kt.dialer.change', the);
  291. if (value !== undefined) {
  292. the.value = value;
  293. } else {
  294. the.value = _parse(the.inputElement.value);
  295. }
  296. if (the.options.min !== null && the.value < the.options.min) {
  297. the.value = the.options.min;
  298. }
  299. if (the.options.max !== null && the.value > the.options.max) {
  300. the.value = the.options.max;
  301. }
  302. the.inputElement.value = _format(the.value);
  303. // Trigger input change event
  304. the.inputElement.dispatchEvent(new Event('change'));
  305. // Trigger "after.dialer" event
  306. KTEventHandler.trigger(the.element, 'kt.dialer.changed', the);
  307. }
  308. var _parse = function(val) {
  309. val = val
  310. .replace(/[^0-9.-]/g, '') // remove chars except number, hyphen, point.
  311. .replace(/(\..*)\./g, '$1') // remove multiple points.
  312. .replace(/(?!^)-/g, '') // remove middle hyphen.
  313. .replace(/^0+(\d)/gm, '$1'); // remove multiple leading zeros. <-- I added this.
  314. val = parseFloat(val);
  315. if (isNaN(val)) {
  316. val = 0;
  317. }
  318. return val;
  319. }
  320. // Format
  321. var _format = function(val){
  322. return the.options.prefix + parseFloat(val).toFixed(the.options.decimals) + the.options.suffix;
  323. }
  324. // Get option
  325. var _getOption = function(name) {
  326. if ( the.element.hasAttribute('data-kt-dialer-' + name) === true ) {
  327. var attr = the.element.getAttribute('data-kt-dialer-' + name);
  328. var value = attr;
  329. return value;
  330. } else {
  331. return null;
  332. }
  333. }
  334. var _destroy = function() {
  335. KTUtil.data(the.element).remove('dialer');
  336. }
  337. // Construct class
  338. _construct();
  339. ///////////////////////
  340. // ** Public API ** //
  341. ///////////////////////
  342. // Plugin API
  343. the.setMinValue = function(value) {
  344. the.options.min = value;
  345. }
  346. the.setMaxValue = function(value) {
  347. the.options.max = value;
  348. }
  349. the.setValue = function(value) {
  350. _setValue(value);
  351. }
  352. the.getValue = function() {
  353. return the.inputElement.value;
  354. }
  355. the.update = function() {
  356. _setValue();
  357. }
  358. the.increase = function() {
  359. return _increase();
  360. }
  361. the.decrease = function() {
  362. return _decrease();
  363. }
  364. the.getElement = function() {
  365. return the.element;
  366. }
  367. the.destroy = function() {
  368. return _destroy();
  369. }
  370. // Event API
  371. the.on = function(name, handler) {
  372. return KTEventHandler.on(the.element, name, handler);
  373. }
  374. the.one = function(name, handler) {
  375. return KTEventHandler.one(the.element, name, handler);
  376. }
  377. the.off = function(name, handlerId) {
  378. return KTEventHandler.off(the.element, name, handlerId);
  379. }
  380. the.trigger = function(name, event) {
  381. return KTEventHandler.trigger(the.element, name, event, the, event);
  382. }
  383. };
  384. // Static methods
  385. KTDialer.getInstance = function(element) {
  386. if ( element !== null && KTUtil.data(element).has('dialer') ) {
  387. return KTUtil.data(element).get('dialer');
  388. } else {
  389. return null;
  390. }
  391. }
  392. // Create instances
  393. KTDialer.createInstances = function(selector = '[data-kt-dialer="true"]') {
  394. // Get instances
  395. var elements = document.querySelectorAll(selector);
  396. if ( elements && elements.length > 0 ) {
  397. for (var i = 0, len = elements.length; i < len; i++) {
  398. new KTDialer(elements[i]);
  399. }
  400. }
  401. }
  402. // Global initialization
  403. KTDialer.init = function() {
  404. KTDialer.createInstances();
  405. };
  406. // Webpack support
  407. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  408. module.exports = KTDialer;
  409. }
  410. "use strict";
  411. // Class definition
  412. var KTDrawer = function(element, options) {
  413. //////////////////////////////
  414. // ** Private variables ** //
  415. //////////////////////////////
  416. var the = this;
  417. if ( typeof element === "undefined" || element === null ) {
  418. return;
  419. }
  420. // Default options
  421. var defaultOptions = {
  422. overlay: true,
  423. direction: 'end',
  424. baseClass: 'drawer',
  425. overlayClass: 'drawer-overlay'
  426. };
  427. ////////////////////////////
  428. // ** Private methods ** //
  429. ////////////////////////////
  430. var _construct = function() {
  431. if ( KTUtil.data(element).has('drawer') ) {
  432. the = KTUtil.data(element).get('drawer');
  433. } else {
  434. _init();
  435. }
  436. }
  437. var _init = function() {
  438. // Variables
  439. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  440. the.uid = KTUtil.getUniqueId('drawer');
  441. the.element = element;
  442. the.overlayElement = null;
  443. the.name = the.element.getAttribute('data-kt-drawer-name');
  444. the.shown = false;
  445. the.lastWidth;
  446. the.toggleElement = null;
  447. // Set initialized
  448. the.element.setAttribute('data-kt-drawer', 'true');
  449. // Event Handlers
  450. _handlers();
  451. // Update Instance
  452. _update();
  453. // Bind Instance
  454. KTUtil.data(the.element).set('drawer', the);
  455. }
  456. var _handlers = function() {
  457. var togglers = _getOption('toggle');
  458. var closers = _getOption('close');
  459. if ( togglers !== null && togglers.length > 0 ) {
  460. KTUtil.on(document.body, togglers, 'click', function(e) {
  461. e.preventDefault();
  462. the.toggleElement = this;
  463. _toggle();
  464. });
  465. }
  466. if ( closers !== null && closers.length > 0 ) {
  467. KTUtil.on(document.body, closers, 'click', function(e) {
  468. e.preventDefault();
  469. the.closeElement = this;
  470. _hide();
  471. });
  472. }
  473. }
  474. var _toggle = function() {
  475. if ( KTEventHandler.trigger(the.element, 'kt.drawer.toggle', the) === false ) {
  476. return;
  477. }
  478. if ( the.shown === true ) {
  479. _hide();
  480. } else {
  481. _show();
  482. }
  483. KTEventHandler.trigger(the.element, 'kt.drawer.toggled', the);
  484. }
  485. var _hide = function() {
  486. if ( KTEventHandler.trigger(the.element, 'kt.drawer.hide', the) === false ) {
  487. return;
  488. }
  489. the.shown = false;
  490. _deleteOverlay();
  491. document.body.removeAttribute('data-kt-drawer-' + the.name, 'on');
  492. document.body.removeAttribute('data-kt-drawer');
  493. KTUtil.removeClass(the.element, the.options.baseClass + '-on');
  494. if ( the.toggleElement !== null ) {
  495. KTUtil.removeClass(the.toggleElement, 'active');
  496. }
  497. KTEventHandler.trigger(the.element, 'kt.drawer.after.hidden', the) === false
  498. }
  499. var _show = function() {
  500. if ( KTEventHandler.trigger(the.element, 'kt.drawer.show', the) === false ) {
  501. return;
  502. }
  503. the.shown = true;
  504. _createOverlay();
  505. document.body.setAttribute('data-kt-drawer-' + the.name, 'on');
  506. document.body.setAttribute('data-kt-drawer', 'on');
  507. KTUtil.addClass(the.element, the.options.baseClass + '-on');
  508. if ( the.toggleElement !== null ) {
  509. KTUtil.addClass(the.toggleElement, 'active');
  510. }
  511. KTEventHandler.trigger(the.element, 'kt.drawer.shown', the);
  512. }
  513. var _update = function() {
  514. var width = _getWidth();
  515. var direction = _getOption('direction');
  516. var top = _getOption('top');
  517. var bottom = _getOption('bottom');
  518. var start = _getOption('start');
  519. var end = _getOption('end');
  520. // Reset state
  521. if ( KTUtil.hasClass(the.element, the.options.baseClass + '-on') === true && String(document.body.getAttribute('data-kt-drawer-' + the.name + '-')) === 'on' ) {
  522. the.shown = true;
  523. } else {
  524. the.shown = false;
  525. }
  526. // Activate/deactivate
  527. if ( _getOption('activate') === true ) {
  528. KTUtil.addClass(the.element, the.options.baseClass);
  529. KTUtil.addClass(the.element, the.options.baseClass + '-' + direction);
  530. KTUtil.css(the.element, 'width', width, true);
  531. the.lastWidth = width;
  532. if (top) {
  533. KTUtil.css(the.element, 'top', top);
  534. }
  535. if (bottom) {
  536. KTUtil.css(the.element, 'bottom', bottom);
  537. }
  538. if (start) {
  539. if (KTUtil.isRTL()) {
  540. KTUtil.css(the.element, 'right', start);
  541. } else {
  542. KTUtil.css(the.element, 'left', start);
  543. }
  544. }
  545. if (end) {
  546. if (KTUtil.isRTL()) {
  547. KTUtil.css(the.element, 'left', end);
  548. } else {
  549. KTUtil.css(the.element, 'right', end);
  550. }
  551. }
  552. } else {
  553. KTUtil.removeClass(the.element, the.options.baseClass);
  554. KTUtil.removeClass(the.element, the.options.baseClass + '-' + direction);
  555. KTUtil.css(the.element, 'width', '');
  556. if (top) {
  557. KTUtil.css(the.element, 'top', '');
  558. }
  559. if (bottom) {
  560. KTUtil.css(the.element, 'bottom', '');
  561. }
  562. if (start) {
  563. if (KTUtil.isRTL()) {
  564. KTUtil.css(the.element, 'right', '');
  565. } else {
  566. KTUtil.css(the.element, 'left', '');
  567. }
  568. }
  569. if (end) {
  570. if (KTUtil.isRTL()) {
  571. KTUtil.css(the.element, 'left', '');
  572. } else {
  573. KTUtil.css(the.element, 'right', '');
  574. }
  575. }
  576. _hide();
  577. }
  578. }
  579. var _createOverlay = function() {
  580. if ( _getOption('overlay') === true ) {
  581. the.overlayElement = document.createElement('DIV');
  582. KTUtil.css(the.overlayElement, 'z-index', KTUtil.css(the.element, 'z-index') - 1); // update
  583. document.body.append(the.overlayElement);
  584. KTUtil.addClass(the.overlayElement, _getOption('overlay-class'));
  585. KTUtil.addEvent(the.overlayElement, 'click', function(e) {
  586. e.preventDefault();
  587. _hide();
  588. });
  589. }
  590. }
  591. var _deleteOverlay = function() {
  592. if ( the.overlayElement !== null ) {
  593. KTUtil.remove(the.overlayElement);
  594. }
  595. }
  596. var _getOption = function(name) {
  597. if ( the.element.hasAttribute('data-kt-drawer-' + name) === true ) {
  598. var attr = the.element.getAttribute('data-kt-drawer-' + name);
  599. var value = KTUtil.getResponsiveValue(attr);
  600. if ( value !== null && String(value) === 'true' ) {
  601. value = true;
  602. } else if ( value !== null && String(value) === 'false' ) {
  603. value = false;
  604. }
  605. return value;
  606. } else {
  607. var optionName = KTUtil.snakeToCamel(name);
  608. if ( the.options[optionName] ) {
  609. return KTUtil.getResponsiveValue(the.options[optionName]);
  610. } else {
  611. return null;
  612. }
  613. }
  614. }
  615. var _getWidth = function() {
  616. var width = _getOption('width');
  617. if ( width === 'auto') {
  618. width = KTUtil.css(the.element, 'width');
  619. }
  620. return width;
  621. }
  622. var _destroy = function() {
  623. KTUtil.data(the.element).remove('drawer');
  624. }
  625. // Construct class
  626. _construct();
  627. ///////////////////////
  628. // ** Public API ** //
  629. ///////////////////////
  630. // Plugin API
  631. the.toggle = function() {
  632. return _toggle();
  633. }
  634. the.show = function() {
  635. return _show();
  636. }
  637. the.hide = function() {
  638. return _hide();
  639. }
  640. the.isShown = function() {
  641. return the.shown;
  642. }
  643. the.update = function() {
  644. _update();
  645. }
  646. the.goElement = function() {
  647. return the.element;
  648. }
  649. the.destroy = function() {
  650. return _destroy();
  651. }
  652. // Event API
  653. the.on = function(name, handler) {
  654. return KTEventHandler.on(the.element, name, handler);
  655. }
  656. the.one = function(name, handler) {
  657. return KTEventHandler.one(the.element, name, handler);
  658. }
  659. the.off = function(name, handlerId) {
  660. return KTEventHandler.off(the.element, name, handlerId);
  661. }
  662. the.trigger = function(name, event) {
  663. return KTEventHandler.trigger(the.element, name, event, the, event);
  664. }
  665. };
  666. // Static methods
  667. KTDrawer.getInstance = function(element) {
  668. if (element !== null && KTUtil.data(element).has('drawer')) {
  669. return KTUtil.data(element).get('drawer');
  670. } else {
  671. return null;
  672. }
  673. }
  674. // Hide all drawers and skip one if provided
  675. KTDrawer.hideAll = function(skip = null, selector = '[data-kt-drawer="true"]') {
  676. var items = document.querySelectorAll(selector);
  677. if (items && items.length > 0) {
  678. for (var i = 0, len = items.length; i < len; i++) {
  679. var item = items[i];
  680. var drawer = KTDrawer.getInstance(item);
  681. if (!drawer) {
  682. continue;
  683. }
  684. if ( skip ) {
  685. if ( item !== skip ) {
  686. drawer.hide();
  687. }
  688. } else {
  689. drawer.hide();
  690. }
  691. }
  692. }
  693. }
  694. // Update all drawers
  695. KTDrawer.updateAll = function(selector = '[data-kt-drawer="true"]') {
  696. var items = document.querySelectorAll(selector);
  697. if (items && items.length > 0) {
  698. for (var i = 0, len = items.length; i < len; i++) {
  699. var drawer = KTDrawer.getInstance(items[i]);
  700. if (drawer) {
  701. drawer.update();
  702. }
  703. }
  704. }
  705. }
  706. // Create instances
  707. KTDrawer.createInstances = function(selector = '[data-kt-drawer="true"]') {
  708. // Initialize Menus
  709. var elements = document.querySelectorAll(selector);
  710. if ( elements && elements.length > 0 ) {
  711. for (var i = 0, len = elements.length; i < len; i++) {
  712. new KTDrawer(elements[i]);
  713. }
  714. }
  715. }
  716. // Toggle instances
  717. KTDrawer.handleShow = function() {
  718. // External drawer toggle handler
  719. KTUtil.on(document.body, '[data-kt-drawer-show="true"][data-kt-drawer-target]', 'click', function(e) {
  720. e.preventDefault();
  721. var element = document.querySelector(this.getAttribute('data-kt-drawer-target'));
  722. if (element) {
  723. KTDrawer.getInstance(element).show();
  724. }
  725. });
  726. }
  727. // Dismiss instances
  728. KTDrawer.handleDismiss = function() {
  729. // External drawer toggle handler
  730. KTUtil.on(document.body, '[data-kt-drawer-dismiss="true"]', 'click', function(e) {
  731. var element = this.closest('[data-kt-drawer="true"]');
  732. if (element) {
  733. var drawer = KTDrawer.getInstance(element);
  734. if (drawer.isShown()) {
  735. drawer.hide();
  736. }
  737. }
  738. });
  739. }
  740. // Handle resize
  741. KTDrawer.handleResize = function() {
  742. // Window resize Handling
  743. window.addEventListener('resize', function() {
  744. var timer;
  745. KTUtil.throttle(timer, function() {
  746. // Locate and update drawer instances on window resize
  747. var elements = document.querySelectorAll('[data-kt-drawer="true"]');
  748. if ( elements && elements.length > 0 ) {
  749. for (var i = 0, len = elements.length; i < len; i++) {
  750. var drawer = KTDrawer.getInstance(elements[i]);
  751. if (drawer) {
  752. drawer.update();
  753. }
  754. }
  755. }
  756. }, 200);
  757. });
  758. }
  759. // Global initialization
  760. KTDrawer.init = function() {
  761. KTDrawer.createInstances();
  762. KTDrawer.handleResize();
  763. KTDrawer.handleShow();
  764. KTDrawer.handleDismiss();
  765. };
  766. // Webpack support
  767. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  768. module.exports = KTDrawer;
  769. }
  770. "use strict";
  771. // Class definition
  772. var KTEventHandler = function() {
  773. ////////////////////////////
  774. // ** Private Variables ** //
  775. ////////////////////////////
  776. var _handlers = {};
  777. ////////////////////////////
  778. // ** Private Methods ** //
  779. ////////////////////////////
  780. var _triggerEvent = function(element, name, target) {
  781. var returnValue = true;
  782. var eventValue;
  783. if ( KTUtil.data(element).has(name) === true ) {
  784. var handlerIds = KTUtil.data(element).get(name);
  785. var handlerId;
  786. for (var i = 0; i < handlerIds.length; i++) {
  787. handlerId = handlerIds[i];
  788. if ( _handlers[name] && _handlers[name][handlerId] ) {
  789. var handler = _handlers[name][handlerId];
  790. var value;
  791. if ( handler.name === name ) {
  792. if ( handler.one == true ) {
  793. if ( handler.fired == false ) {
  794. _handlers[name][handlerId].fired = true;
  795. eventValue = handler.callback.call(this, target);
  796. }
  797. } else {
  798. eventValue = handler.callback.call(this, target);
  799. }
  800. if ( eventValue === false ) {
  801. returnValue = false;
  802. }
  803. }
  804. }
  805. }
  806. }
  807. return returnValue;
  808. }
  809. var _addEvent = function(element, name, callback, one) {
  810. var handlerId = KTUtil.getUniqueId('event');
  811. var handlerIds = KTUtil.data(element).get(name);
  812. if ( !handlerIds ) {
  813. handlerIds = [];
  814. }
  815. handlerIds.push(handlerId);
  816. KTUtil.data(element).set(name, handlerIds);
  817. if ( !_handlers[name] ) {
  818. _handlers[name] = {};
  819. }
  820. _handlers[name][handlerId] = {
  821. name: name,
  822. callback: callback,
  823. one: one,
  824. fired: false
  825. };
  826. return handlerId;
  827. }
  828. var _removeEvent = function(element, name, handlerId) {
  829. var handlerIds = KTUtil.data(element).get(name);
  830. var index = handlerIds && handlerIds.indexOf(handlerId);
  831. if (index !== -1) {
  832. handlerIds.splice(index, 1);
  833. KTUtil.data(element).set(name, handlerIds);
  834. }
  835. if (_handlers[name] && _handlers[name][handlerId]) {
  836. delete _handlers[name][handlerId];
  837. }
  838. }
  839. ////////////////////////////
  840. // ** Public Methods ** //
  841. ////////////////////////////
  842. return {
  843. trigger: function(element, name, target) {
  844. return _triggerEvent(element, name, target);
  845. },
  846. on: function(element, name, handler) {
  847. return _addEvent(element, name, handler);
  848. },
  849. one: function(element, name, handler) {
  850. return _addEvent(element, name, handler, true);
  851. },
  852. off: function(element, name, handlerId) {
  853. return _removeEvent(element, name, handlerId);
  854. },
  855. debug: function() {
  856. for (var b in _handlers) {
  857. if ( _handlers.hasOwnProperty(b) ) console.log(b);
  858. }
  859. }
  860. }
  861. }();
  862. // Webpack support
  863. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  864. module.exports = KTEventHandler;
  865. }
  866. "use strict";
  867. // Class definition
  868. var KTFeedback = function(options) {
  869. ////////////////////////////
  870. // ** Private Variables ** //
  871. ////////////////////////////
  872. var the = this;
  873. // Default options
  874. var defaultOptions = {
  875. 'width' : 100,
  876. 'placement' : 'top-center',
  877. 'content' : '',
  878. 'type': 'popup'
  879. };
  880. ////////////////////////////
  881. // ** Private methods ** //
  882. ////////////////////////////
  883. var _construct = function() {
  884. _init();
  885. }
  886. var _init = function() {
  887. // Variables
  888. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  889. the.uid = KTUtil.getUniqueId('feedback');
  890. the.element;
  891. the.shown = false;
  892. // Event Handlers
  893. _handlers();
  894. // Bind Instance
  895. KTUtil.data(the.element).set('feedback', the);
  896. }
  897. var _handlers = function() {
  898. KTUtil.addEvent(the.element, 'click', function(e) {
  899. e.preventDefault();
  900. _go();
  901. });
  902. }
  903. var _show = function() {
  904. if ( KTEventHandler.trigger(the.element, 'kt.feedback.show', the) === false ) {
  905. return;
  906. }
  907. if ( the.options.type === 'popup') {
  908. _showPopup();
  909. }
  910. KTEventHandler.trigger(the.element, 'kt.feedback.shown', the);
  911. return the;
  912. }
  913. var _hide = function() {
  914. if ( KTEventHandler.trigger(the.element, 'kt.feedback.hide', the) === false ) {
  915. return;
  916. }
  917. if ( the.options.type === 'popup') {
  918. _hidePopup();
  919. }
  920. the.shown = false;
  921. KTEventHandler.trigger(the.element, 'kt.feedback.hidden', the);
  922. return the;
  923. }
  924. var _showPopup = function() {
  925. the.element = document.createElement("DIV");
  926. KTUtil.addClass(the.element, 'feedback feedback-popup');
  927. KTUtil.setHTML(the.element, the.options.content);
  928. if (the.options.placement == 'top-center') {
  929. _setPopupTopCenterPosition();
  930. }
  931. document.body.appendChild(the.element);
  932. KTUtil.addClass(the.element, 'feedback-shown');
  933. the.shown = true;
  934. }
  935. var _setPopupTopCenterPosition = function() {
  936. var width = KTUtil.getResponsiveValue(the.options.width);
  937. var height = KTUtil.css(the.element, 'height');
  938. KTUtil.addClass(the.element, 'feedback-top-center');
  939. KTUtil.css(the.element, 'width', width);
  940. KTUtil.css(the.element, 'left', '50%');
  941. KTUtil.css(the.element, 'top', '-' + height);
  942. }
  943. var _hidePopup = function() {
  944. the.element.remove();
  945. }
  946. var _destroy = function() {
  947. KTUtil.data(the.element).remove('feedback');
  948. }
  949. // Construct class
  950. _construct();
  951. ///////////////////////
  952. // ** Public API ** //
  953. ///////////////////////
  954. // Plugin API
  955. the.show = function() {
  956. return _show();
  957. }
  958. the.hide = function() {
  959. return _hide();
  960. }
  961. the.isShown = function() {
  962. return the.shown;
  963. }
  964. the.getElement = function() {
  965. return the.element;
  966. }
  967. the.destroy = function() {
  968. return _destroy();
  969. }
  970. // Event API
  971. the.on = function(name, handler) {
  972. return KTEventHandler.on(the.element, name, handler);
  973. }
  974. the.one = function(name, handler) {
  975. return KTEventHandler.one(the.element, name, handler);
  976. }
  977. the.off = function(name, handlerId) {
  978. return KTEventHandler.off(the.element, name, handlerId);
  979. }
  980. the.trigger = function(name, event) {
  981. return KTEventHandler.trigger(the.element, name, event, the, event);
  982. }
  983. };
  984. // Webpack support
  985. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  986. module.exports = KTFeedback;
  987. }
  988. "use strict";
  989. // Class definition
  990. var KTImageInput = function(element, options) {
  991. ////////////////////////////
  992. // ** Private Variables ** //
  993. ////////////////////////////
  994. var the = this;
  995. if ( typeof element === "undefined" || element === null ) {
  996. return;
  997. }
  998. // Default Options
  999. var defaultOptions = {
  1000. };
  1001. ////////////////////////////
  1002. // ** Private Methods ** //
  1003. ////////////////////////////
  1004. var _construct = function() {
  1005. if ( KTUtil.data(element).has('image-input') === true ) {
  1006. the = KTUtil.data(element).get('image-input');
  1007. } else {
  1008. _init();
  1009. }
  1010. }
  1011. var _init = function() {
  1012. // Variables
  1013. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  1014. the.uid = KTUtil.getUniqueId('image-input');
  1015. // Elements
  1016. the.element = element;
  1017. the.inputElement = KTUtil.find(element, 'input[type="file"]');
  1018. the.wrapperElement = KTUtil.find(element, '.image-input-wrapper');
  1019. the.cancelElement = KTUtil.find(element, '[data-kt-image-input-action="cancel"]');
  1020. the.removeElement = KTUtil.find(element, '[data-kt-image-input-action="remove"]');
  1021. the.hiddenElement = KTUtil.find(element, 'input[type="hidden"]');
  1022. the.src = KTUtil.css(the.wrapperElement, 'backgroundImage');
  1023. // Set initialized
  1024. the.element.setAttribute('data-kt-image-input', 'true');
  1025. // Event Handlers
  1026. _handlers();
  1027. // Bind Instance
  1028. KTUtil.data(the.element).set('image-input', the);
  1029. }
  1030. // Init Event Handlers
  1031. var _handlers = function() {
  1032. KTUtil.addEvent(the.inputElement, 'change', _change);
  1033. KTUtil.addEvent(the.cancelElement, 'click', _cancel);
  1034. KTUtil.addEvent(the.removeElement, 'click', _remove);
  1035. }
  1036. // Event Handlers
  1037. var _change = function(e) {
  1038. e.preventDefault();
  1039. if ( the.inputElement !== null && the.inputElement.files && the.inputElement.files[0] ) {
  1040. // Fire change event
  1041. if ( KTEventHandler.trigger(the.element, 'kt.imageinput.change', the) === false ) {
  1042. return;
  1043. }
  1044. var reader = new FileReader();
  1045. reader.onload = function(e) {
  1046. KTUtil.css(the.wrapperElement, 'background-image', 'url('+ e.target.result +')');
  1047. }
  1048. reader.readAsDataURL(the.inputElement.files[0]);
  1049. the.element.classList.add('image-input-changed');
  1050. the.element.classList.remove('image-input-empty');
  1051. // Fire removed event
  1052. KTEventHandler.trigger(the.element, 'kt.imageinput.changed', the);
  1053. }
  1054. }
  1055. var _cancel = function(e) {
  1056. e.preventDefault();
  1057. // Fire cancel event
  1058. if ( KTEventHandler.trigger(the.element, 'kt.imageinput.cancel', the) === false ) {
  1059. return;
  1060. }
  1061. the.element.classList.remove('image-input-changed');
  1062. the.element.classList.remove('image-input-empty');
  1063. if (the.src === 'none') {
  1064. KTUtil.css(the.wrapperElement, 'background-image', '');
  1065. the.element.classList.add('image-input-empty');
  1066. } else {
  1067. KTUtil.css(the.wrapperElement, 'background-image', the.src);
  1068. }
  1069. the.inputElement.value = "";
  1070. if ( the.hiddenElement !== null ) {
  1071. the.hiddenElement.value = "0";
  1072. }
  1073. // Fire canceled event
  1074. KTEventHandler.trigger(the.element, 'kt.imageinput.canceled', the);
  1075. }
  1076. var _remove = function(e) {
  1077. e.preventDefault();
  1078. // Fire remove event
  1079. if ( KTEventHandler.trigger(the.element, 'kt.imageinput.remove', the) === false ) {
  1080. return;
  1081. }
  1082. the.element.classList.remove('image-input-changed');
  1083. the.element.classList.add('image-input-empty');
  1084. KTUtil.css(the.wrapperElement, 'background-image', "none");
  1085. the.inputElement.value = "";
  1086. if ( the.hiddenElement !== null ) {
  1087. the.hiddenElement.value = "1";
  1088. }
  1089. // Fire removed event
  1090. KTEventHandler.trigger(the.element, 'kt.imageinput.removed', the);
  1091. }
  1092. var _destroy = function() {
  1093. KTUtil.data(the.element).remove('image-input');
  1094. }
  1095. // Construct Class
  1096. _construct();
  1097. ///////////////////////
  1098. // ** Public API ** //
  1099. ///////////////////////
  1100. // Plugin API
  1101. the.getInputElement = function() {
  1102. return the.inputElement;
  1103. }
  1104. the.goElement = function() {
  1105. return the.element;
  1106. }
  1107. the.destroy = function() {
  1108. return _destroy();
  1109. }
  1110. // Event API
  1111. the.on = function(name, handler) {
  1112. return KTEventHandler.on(the.element, name, handler);
  1113. }
  1114. the.one = function(name, handler) {
  1115. return KTEventHandler.one(the.element, name, handler);
  1116. }
  1117. the.off = function(name, handlerId) {
  1118. return KTEventHandler.off(the.element, name, handlerId);
  1119. }
  1120. the.trigger = function(name, event) {
  1121. return KTEventHandler.trigger(the.element, name, event, the, event);
  1122. }
  1123. };
  1124. // Static methods
  1125. KTImageInput.getInstance = function(element) {
  1126. if ( element !== null && KTUtil.data(element).has('image-input') ) {
  1127. return KTUtil.data(element).get('image-input');
  1128. } else {
  1129. return null;
  1130. }
  1131. }
  1132. // Create instances
  1133. KTImageInput.createInstances = function(selector = '[data-kt-image-input]') {
  1134. // Initialize Menus
  1135. var elements = document.querySelectorAll(selector);
  1136. if ( elements && elements.length > 0 ) {
  1137. for (var i = 0, len = elements.length; i < len; i++) {
  1138. new KTImageInput(elements[i]);
  1139. }
  1140. }
  1141. }
  1142. // Global initialization
  1143. KTImageInput.init = function() {
  1144. KTImageInput.createInstances();
  1145. };
  1146. // Webpack Support
  1147. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  1148. module.exports = KTImageInput;
  1149. }
  1150. "use strict";
  1151. // Class definition
  1152. var KTMenu = function(element, options) {
  1153. ////////////////////////////
  1154. // ** Private Variables ** //
  1155. ////////////////////////////
  1156. var the = this;
  1157. if ( typeof element === "undefined" || element === null ) {
  1158. return;
  1159. }
  1160. // Default Options
  1161. var defaultOptions = {
  1162. dropdown: {
  1163. hoverTimeout: 200,
  1164. zindex: 105
  1165. },
  1166. accordion: {
  1167. slideSpeed: 250,
  1168. expand: false
  1169. }
  1170. };
  1171. ////////////////////////////
  1172. // ** Private Methods ** //
  1173. ////////////////////////////
  1174. var _construct = function() {
  1175. if ( KTUtil.data(element).has('menu') === true ) {
  1176. the = KTUtil.data(element).get('menu');
  1177. } else {
  1178. _init();
  1179. }
  1180. }
  1181. var _init = function() {
  1182. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  1183. the.uid = KTUtil.getUniqueId('menu');
  1184. the.element = element;
  1185. the.triggerElement;
  1186. the.disabled = false;
  1187. // Set initialized
  1188. the.element.setAttribute('data-kt-menu', 'true');
  1189. _setTriggerElement();
  1190. _update();
  1191. KTUtil.data(the.element).set('menu', the);
  1192. }
  1193. var _destroy = function() { // todo
  1194. }
  1195. // Event Handlers
  1196. // Toggle handler
  1197. var _click = function(element, e) {
  1198. e.preventDefault();
  1199. if (the.disabled === true) {
  1200. return;
  1201. }
  1202. var item = _getItemElement(element);
  1203. if ( _getOptionFromElementAttribute(item, 'trigger') !== 'click' ) {
  1204. return;
  1205. }
  1206. if ( _getOptionFromElementAttribute(item, 'toggle') === false ) {
  1207. _show(item);
  1208. } else {
  1209. _toggle(item);
  1210. }
  1211. }
  1212. // Link handler
  1213. var _link = function(element, e) {
  1214. if (the.disabled === true) {
  1215. return;
  1216. }
  1217. if ( KTEventHandler.trigger(the.element, 'kt.menu.link.click', element) === false ) {
  1218. return;
  1219. }
  1220. // Dismiss all shown dropdowns
  1221. KTMenu.hideDropdowns();
  1222. KTEventHandler.trigger(the.element, 'kt.menu.link.clicked', element);
  1223. }
  1224. // Dismiss handler
  1225. var _dismiss = function(element, e) {
  1226. var item = _getItemElement(element);
  1227. var items = _getItemChildElements(item);
  1228. if ( item !== null && _getItemSubType(item) === 'dropdown') {
  1229. _hide(item); // hide items dropdown
  1230. // Hide all child elements as well
  1231. if ( items.length > 0 ) {
  1232. for (var i = 0, len = items.length; i < len; i++) {
  1233. if ( items[i] !== null && _getItemSubType(items[i]) === 'dropdown') {
  1234. _hide(tems[i]);
  1235. }
  1236. }
  1237. }
  1238. }
  1239. }
  1240. // Mouseover handle
  1241. var _mouseover = function(element, e) {
  1242. var item = _getItemElement(element);
  1243. if (the.disabled === true) {
  1244. return;
  1245. }
  1246. if ( item === null ) {
  1247. return;
  1248. }
  1249. if ( _getOptionFromElementAttribute(item, 'trigger') !== 'hover' ) {
  1250. return;
  1251. }
  1252. if ( KTUtil.data(item).get('hover') === '1' ) {
  1253. clearTimeout(KTUtil.data(item).get('timeout'));
  1254. KTUtil.data(item).remove('hover');
  1255. KTUtil.data(item).remove('timeout');
  1256. }
  1257. _show(item);
  1258. }
  1259. // Mouseout handle
  1260. var _mouseout = function(element, e) {
  1261. var item = _getItemElement(element);
  1262. if (the.disabled === true) {
  1263. return;
  1264. }
  1265. if ( item === null ) {
  1266. return;
  1267. }
  1268. if ( _getOptionFromElementAttribute(item, 'trigger') !== 'hover' ) {
  1269. return;
  1270. }
  1271. var timeout = setTimeout(function() {
  1272. if ( KTUtil.data(item).get('hover') === '1' ) {
  1273. _hide(item);
  1274. }
  1275. }, the.options.dropdown.hoverTimeout);
  1276. KTUtil.data(item).set('hover', '1');
  1277. KTUtil.data(item).set('timeout', timeout);
  1278. }
  1279. // Toggle item sub
  1280. var _toggle = function(item) {
  1281. if ( !item ) {
  1282. item = the.triggerElement;
  1283. }
  1284. if ( _isItemSubShown(item) === true ) {
  1285. _hide(item);
  1286. } else {
  1287. _show(item);
  1288. }
  1289. }
  1290. // Show item sub
  1291. var _show = function(item) {
  1292. if ( !item ) {
  1293. item = the.triggerElement;
  1294. }
  1295. if ( _isItemSubShown(item) === true ) {
  1296. return;
  1297. }
  1298. if ( _getItemSubType(item) === 'dropdown' ) {
  1299. _showDropdown(item); // // show current dropdown
  1300. } else if ( _getItemSubType(item) === 'accordion' ) {
  1301. _showAccordion(item);
  1302. }
  1303. // Remember last submenu type
  1304. KTUtil.data(item).set('type', _getItemSubType(item)); // updated
  1305. }
  1306. // Hide item sub
  1307. var _hide = function(item) {
  1308. if ( !item ) {
  1309. item = the.triggerElement;
  1310. }
  1311. if ( _isItemSubShown(item) === false ) {
  1312. return;
  1313. }
  1314. if ( _getItemSubType(item) === 'dropdown' ) {
  1315. _hideDropdown(item);
  1316. } else if ( _getItemSubType(item) === 'accordion' ) {
  1317. _hideAccordion(item);
  1318. }
  1319. }
  1320. // Reset item state classes if item sub type changed
  1321. var _reset = function(item) {
  1322. if ( _hasItemSub(item) === false ) {
  1323. return;
  1324. }
  1325. var sub = _getItemSubElement(item);
  1326. // Reset sub state if sub type is changed during the window resize
  1327. if ( KTUtil.data(item).has('type') && KTUtil.data(item).get('type') !== _getItemSubType(item) ) { // updated
  1328. KTUtil.removeClass(item, 'hover');
  1329. KTUtil.removeClass(item, 'show');
  1330. KTUtil.removeClass(sub, 'show');
  1331. } // updated
  1332. }
  1333. // Update all item state classes if item sub type changed
  1334. var _update = function() {
  1335. var items = the.element.querySelectorAll('.menu-item[data-kt-menu-trigger]');
  1336. if ( items && items.length > 0 ) {
  1337. for (var i = 0, len = items.length; i < len; i++) {
  1338. _reset(items[i]);
  1339. }
  1340. }
  1341. }
  1342. // Set external trigger element
  1343. var _setTriggerElement = function() {
  1344. var target = document.querySelector('[data-kt-menu-target="# ' + the.element.getAttribute('id') + '"]');
  1345. if ( target !== null ) {
  1346. the.triggerElement = target;
  1347. } else if ( the.element.closest('[data-kt-menu-trigger]') ) {
  1348. the.triggerElement = the.element.closest('[data-kt-menu-trigger]');
  1349. } else if ( the.element.parentNode && KTUtil.child(the.element.parentNode, '[data-kt-menu-trigger]')) {
  1350. the.triggerElement = KTUtil.child(the.element.parentNode, '[data-kt-menu-trigger]');
  1351. }
  1352. if ( the.triggerElement ) {
  1353. KTUtil.data(the.triggerElement).set('menu', the);
  1354. }
  1355. }
  1356. // Test if menu has external trigger element
  1357. var _isTriggerElement = function(item) {
  1358. return ( the.triggerElement === item ) ? true : false;
  1359. }
  1360. // Test if item's sub is shown
  1361. var _isItemSubShown = function(item) {
  1362. var sub = _getItemSubElement(item);
  1363. if ( sub !== null ) {
  1364. if ( _getItemSubType(item) === 'dropdown' ) {
  1365. if ( KTUtil.hasClass(sub, 'show') === true && sub.hasAttribute('data-popper-placement') === true ) {
  1366. return true;
  1367. } else {
  1368. return false;
  1369. }
  1370. } else {
  1371. return KTUtil.hasClass(item, 'show');
  1372. }
  1373. } else {
  1374. return false;
  1375. }
  1376. }
  1377. // Test if item dropdown is permanent
  1378. var _isItemDropdownPermanent = function(item) {
  1379. return _getOptionFromElementAttribute(item, 'permanent') === true ? true : false;
  1380. }
  1381. // Test if item's parent is shown
  1382. var _isItemParentShown = function(item) {
  1383. return KTUtil.parents(item, '.menu-item.show').length > 0;
  1384. }
  1385. // Test of it is item sub element
  1386. var _isItemSubElement = function(item) {
  1387. return KTUtil.hasClass(item, 'menu-sub');
  1388. }
  1389. // Test if item has sub
  1390. var _hasItemSub = function(item) {
  1391. return (KTUtil.hasClass(item, 'menu-item') && item.hasAttribute('data-kt-menu-trigger'));
  1392. }
  1393. // Get link element
  1394. var _getItemLinkElement = function(item) {
  1395. return KTUtil.child(item, '.menu-link');
  1396. }
  1397. // Get toggle element
  1398. var _getItemToggleElement = function(item) {
  1399. if ( the.triggerElement ) {
  1400. return the.triggerElement;
  1401. } else {
  1402. return _getItemLinkElement(item);
  1403. }
  1404. }
  1405. // Get item sub element
  1406. var _getItemSubElement = function(item) {
  1407. if ( _isTriggerElement(item) === true ) {
  1408. return the.element;
  1409. } if ( item.classList.contains('menu-sub') === true ) {
  1410. return item;
  1411. } else if ( KTUtil.data(item).has('sub') ) {
  1412. return KTUtil.data(item).get('sub');
  1413. } else {
  1414. return KTUtil.child(item, '.menu-sub');
  1415. }
  1416. }
  1417. // Get item sub type
  1418. var _getItemSubType = function(element) {
  1419. var sub = _getItemSubElement(element);
  1420. if ( sub && parseInt(KTUtil.css(sub, 'z-index')) > 0 ) {
  1421. return "dropdown";
  1422. } else {
  1423. return "accordion";
  1424. }
  1425. }
  1426. // Get item element
  1427. var _getItemElement = function(element) {
  1428. var item, sub;
  1429. // Element is the external trigger element
  1430. if (_isTriggerElement(element) ) {
  1431. return element;
  1432. }
  1433. // Element has item toggler attribute
  1434. if ( element.hasAttribute('data-kt-menu-trigger') ) {
  1435. return element;
  1436. }
  1437. // Element has item DOM reference in it's data storage
  1438. if ( KTUtil.data(element).has('item') ) {
  1439. return KTUtil.data(element).get('item');
  1440. }
  1441. // Item is parent of element
  1442. if ( (item = element.closest('.menu-item[data-kt-menu-trigger]')) ) {
  1443. return item;
  1444. }
  1445. // Element's parent has item DOM reference in it's data storage
  1446. if ( (sub = element.closest('.menu-sub')) ) {
  1447. if ( KTUtil.data(sub).has('item') === true ) {
  1448. return KTUtil.data(sub).get('item')
  1449. }
  1450. }
  1451. }
  1452. // Get item parent element
  1453. var _getItemParentElement = function(item) {
  1454. var sub = item.closest('.menu-sub');
  1455. var parentItem;
  1456. if ( KTUtil.data(sub).has('item') ) {
  1457. return KTUtil.data(sub).get('item');
  1458. }
  1459. if ( sub && (parentItem = sub.closest('.menu-item[data-kt-menu-trigger]')) ) {
  1460. return parentItem;
  1461. }
  1462. return null;
  1463. }
  1464. // Get item parent elements
  1465. var _getItemParentElements = function(item) {
  1466. var parents = [];
  1467. var parent;
  1468. var i = 0;
  1469. do {
  1470. parent = _getItemParentElement(item);
  1471. if ( parent ) {
  1472. parents.push(parent);
  1473. item = parent;
  1474. }
  1475. i++;
  1476. } while (parent !== null && i < 20);
  1477. if ( the.triggerElement ) {
  1478. parents.unshift(the.triggerElement);
  1479. }
  1480. return parents;
  1481. }
  1482. // Get item child element
  1483. var _getItemChildElement = function(item) {
  1484. var selector = item;
  1485. var element;
  1486. if ( KTUtil.data(item).get('sub') ) {
  1487. selector = KTUtil.data(item).get('sub');
  1488. }
  1489. if ( selector !== null ) {
  1490. //element = selector.querySelector('.show.menu-item[data-kt-menu-trigger]');
  1491. element = selector.querySelector('.menu-item[data-kt-menu-trigger]');
  1492. if ( element ) {
  1493. return element;
  1494. } else {
  1495. return null;
  1496. }
  1497. } else {
  1498. return null;
  1499. }
  1500. }
  1501. // Get item child elements
  1502. var _getItemChildElements = function(item) {
  1503. var children = [];
  1504. var child;
  1505. var i = 0;
  1506. do {
  1507. child = _getItemChildElement(item);
  1508. if ( child ) {
  1509. children.push(child);
  1510. item = child;
  1511. }
  1512. i++;
  1513. } while (child !== null && i < 20);
  1514. return children;
  1515. }
  1516. // Show item dropdown
  1517. var _showDropdown = function(item) {
  1518. // Handle dropdown show event
  1519. if ( KTEventHandler.trigger(the.element, 'kt.menu.dropdown.show', item) === false ) {
  1520. return;
  1521. }
  1522. // Hide all currently shown dropdowns except current one
  1523. KTMenu.hideDropdowns(item);
  1524. var toggle = _isTriggerElement(item) ? item : _getItemLinkElement(item);
  1525. var sub = _getItemSubElement(item);
  1526. var width = _getOptionFromElementAttribute(item, 'width');
  1527. var height = _getOptionFromElementAttribute(item, 'height');
  1528. var zindex = the.options.dropdown.zindex; // update
  1529. var parentZindex = KTUtil.getHighestZindex(item); // update
  1530. // Apply a new z-index if dropdown's toggle element or it's parent has greater z-index // update
  1531. if ( parentZindex !== null && parentZindex >= zindex ) {
  1532. zindex = parentZindex + 1;
  1533. }
  1534. if ( zindex > 0 ) {
  1535. KTUtil.css(sub, 'z-index', zindex);
  1536. }
  1537. if ( width !== null ) {
  1538. KTUtil.css(sub, 'width', width);
  1539. }
  1540. if ( height !== null ) {
  1541. KTUtil.css(sub, 'height', height);
  1542. }
  1543. KTUtil.css(sub, 'display', '');
  1544. KTUtil.css(sub, 'overflow', '');
  1545. // Init popper(new)
  1546. _initDropdownPopper(item, sub);
  1547. KTUtil.addClass(item, 'show');
  1548. KTUtil.addClass(item, 'menu-dropdown');
  1549. KTUtil.addClass(sub, 'show');
  1550. // Append the sub the the root of the menu
  1551. if ( _getOptionFromElementAttribute(item, 'overflow') === true ) {
  1552. document.body.appendChild(sub);
  1553. KTUtil.data(item).set('sub', sub);
  1554. KTUtil.data(sub).set('item', item);
  1555. KTUtil.data(sub).set('menu', the);
  1556. } else {
  1557. KTUtil.data(sub).set('item', item);
  1558. }
  1559. // Handle dropdown shown event
  1560. KTEventHandler.trigger(the.element, 'kt.menu.dropdown.shown', item);
  1561. }
  1562. // Hide item dropdown
  1563. var _hideDropdown = function(item) {
  1564. // Handle dropdown hide event
  1565. if ( KTEventHandler.trigger(the.element, 'kt.menu.dropdown.hide', item) === false ) {
  1566. return;
  1567. }
  1568. var sub = _getItemSubElement(item);
  1569. KTUtil.css(sub, 'z-index', '');
  1570. KTUtil.css(sub, 'width', '');
  1571. KTUtil.css(sub, 'height', '');
  1572. KTUtil.removeClass(item, 'show');
  1573. KTUtil.removeClass(item, 'menu-dropdown');
  1574. KTUtil.removeClass(sub, 'show');
  1575. // Append the sub back to it's parent
  1576. if ( _getOptionFromElementAttribute(item, 'overflow') === true ) {
  1577. if (item.classList.contains('menu-item')) {
  1578. item.appendChild(sub);
  1579. } else {
  1580. KTUtil.insertAfter(the.element, item);
  1581. }
  1582. KTUtil.data(item).remove('sub');
  1583. KTUtil.data(sub).remove('item');
  1584. KTUtil.data(sub).remove('menu');
  1585. }
  1586. // Destroy popper(new)
  1587. _destroyDropdownPopper(item);
  1588. // Handle dropdown hidden event
  1589. KTEventHandler.trigger(the.element, 'kt.menu.dropdown.hidden', item);
  1590. }
  1591. // Init dropdown popper(new)
  1592. var _initDropdownPopper = function(item, sub) {
  1593. // Setup popper instance
  1594. var reference;
  1595. var attach = _getOptionFromElementAttribute(item, 'attach');
  1596. if ( attach ) {
  1597. if ( attach === 'parent') {
  1598. reference = item.parentNode;
  1599. } else {
  1600. reference = document.querySelector(attach);
  1601. }
  1602. } else {
  1603. reference = item;
  1604. }
  1605. var popper = Popper.createPopper(reference, sub, _getDropdownPopperConfig(item));
  1606. KTUtil.data(item).set('popper', popper);
  1607. }
  1608. // Destroy dropdown popper(new)
  1609. var _destroyDropdownPopper = function(item) {
  1610. if ( KTUtil.data(item).has('popper') === true ) {
  1611. KTUtil.data(item).get('popper').destroy();
  1612. KTUtil.data(item).remove('popper');
  1613. }
  1614. }
  1615. // Prepare popper config for dropdown(see: https://popper.js.org/docs/v2/)
  1616. var _getDropdownPopperConfig = function(item) {
  1617. // Placement
  1618. var placement = _getOptionFromElementAttribute(item, 'placement');
  1619. if (!placement) {
  1620. placement = 'right';
  1621. }
  1622. // Offset
  1623. var offsetValue = _getOptionFromElementAttribute(item, 'offset');
  1624. var offset = offsetValue ? offsetValue.split(",") : [];
  1625. if (offset.length === 2) {
  1626. offset[0] = parseInt(offset[0]);
  1627. offset[1] = parseInt(offset[1]);
  1628. }
  1629. // Strategy
  1630. var strategy = _getOptionFromElementAttribute(item, 'overflow') === true ? 'absolute' : 'fixed';
  1631. var altAxis = _getOptionFromElementAttribute(item, 'flip') !== false ? true : false;
  1632. var popperConfig = {
  1633. placement: placement,
  1634. strategy: strategy,
  1635. modifiers: [{
  1636. name: 'offset',
  1637. options: {
  1638. offset: offset
  1639. }
  1640. }, {
  1641. name: 'preventOverflow',
  1642. options: {
  1643. altAxis: altAxis
  1644. }
  1645. }, {
  1646. name: 'flip',
  1647. options: {
  1648. flipVariations: false
  1649. }
  1650. }]
  1651. };
  1652. return popperConfig;
  1653. }
  1654. // Show item accordion
  1655. var _showAccordion = function(item) {
  1656. if ( KTEventHandler.trigger(the.element, 'kt.menu.accordion.show', item) === false ) {
  1657. return;
  1658. }
  1659. var sub = _getItemSubElement(item);
  1660. var expand = the.options.accordion.expand;
  1661. if (_getOptionFromElementAttribute(item, 'expand') === true) {
  1662. expand = true;
  1663. } else if (_getOptionFromElementAttribute(item, 'expand') === false) {
  1664. expand = false;
  1665. } else if (_getOptionFromElementAttribute(the.element, 'expand') === true) {
  1666. expand = true;
  1667. }
  1668. if ( expand === false ) {
  1669. _hideAccordions(item);
  1670. }
  1671. if ( KTUtil.data(item).has('popper') === true ) {
  1672. _hideDropdown(item);
  1673. }
  1674. KTUtil.addClass(item, 'hover');
  1675. KTUtil.addClass(item, 'showing');
  1676. KTUtil.slideDown(sub, the.options.accordion.slideSpeed, function() {
  1677. KTUtil.removeClass(item, 'showing');
  1678. KTUtil.addClass(item, 'show');
  1679. KTUtil.addClass(sub, 'show');
  1680. KTEventHandler.trigger(the.element, 'kt.menu.accordion.shown', item);
  1681. });
  1682. }
  1683. // Hide item accordion
  1684. var _hideAccordion = function(item) {
  1685. if ( KTEventHandler.trigger(the.element, 'kt.menu.accordion.hide', item) === false ) {
  1686. return;
  1687. }
  1688. var sub = _getItemSubElement(item);
  1689. KTUtil.addClass(item, 'hiding');
  1690. KTUtil.slideUp(sub, the.options.accordion.slideSpeed, function() {
  1691. KTUtil.removeClass(item, 'hiding');
  1692. KTUtil.removeClass(item, 'show');
  1693. KTUtil.removeClass(sub, 'show');
  1694. KTUtil.removeClass(item, 'hover'); // update
  1695. KTEventHandler.trigger(the.element, 'kt.menu.accordion.hidden', item);
  1696. });
  1697. }
  1698. var _setActiveLink = function(link) {
  1699. var item = _getItemElement(link);
  1700. var parentItems = _getItemParentElements(item);
  1701. var parentTabPane = link.closest('.tab-pane');
  1702. var activeLinks = [].slice.call(the.element.querySelectorAll('.menu-link.active'));
  1703. var activeParentItems = [].slice.call(the.element.querySelectorAll('.menu-item.here, .menu-item.show'));
  1704. if (_getItemSubType(item) === "accordion") {
  1705. _showAccordion(item);
  1706. } else {
  1707. item.classList.add("here");
  1708. }
  1709. if ( parentItems && parentItems.length > 0 ) {
  1710. for (var i = 0, len = parentItems.length; i < len; i++) {
  1711. var parentItem = parentItems[i];
  1712. if (_getItemSubType(parentItem) === "accordion") {
  1713. _showAccordion(parentItem);
  1714. } else {
  1715. parentItem.classList.add("here");
  1716. }
  1717. }
  1718. }
  1719. activeLinks.map(function (activeLink) {
  1720. activeLink.classList.remove("active");
  1721. });
  1722. activeParentItems.map(function (activeParentItem) {
  1723. if (activeParentItem.contains(item) === false) {
  1724. activeParentItem.classList.remove("here");
  1725. activeParentItem.classList.remove("show");
  1726. }
  1727. });
  1728. // Handle tab
  1729. if (parentTabPane && bootstrap.Tab) {
  1730. var tabEl = the.element.querySelector('[data-bs-target="#' + parentTabPane.getAttribute("id") + '"]');
  1731. var tab = new bootstrap.Tab(tabEl);
  1732. if (tab) {
  1733. tab.show();
  1734. }
  1735. }
  1736. link.classList.add("active");
  1737. }
  1738. var _getLinkByAttribute = function(value, name = "href") {
  1739. var link = the.element.querySelector('a[' + name + '="' + value + '"]');
  1740. if (link) {
  1741. return link;
  1742. } else {
  1743. null;
  1744. }
  1745. }
  1746. // Hide all shown accordions of item
  1747. var _hideAccordions = function(item) {
  1748. var itemsToHide = KTUtil.findAll(the.element, '.show[data-kt-menu-trigger]');
  1749. var itemToHide;
  1750. if (itemsToHide && itemsToHide.length > 0) {
  1751. for (var i = 0, len = itemsToHide.length; i < len; i++) {
  1752. itemToHide = itemsToHide[i];
  1753. if ( _getItemSubType(itemToHide) === 'accordion' && itemToHide !== item && item.contains(itemToHide) === false && itemToHide.contains(item) === false ) {
  1754. _hideAccordion(itemToHide);
  1755. }
  1756. }
  1757. }
  1758. }
  1759. // Get item option(through html attributes)
  1760. var _getOptionFromElementAttribute = function(item, name) {
  1761. var attr;
  1762. var value = null;
  1763. if ( item && item.hasAttribute('data-kt-menu-' + name) ) {
  1764. attr = item.getAttribute('data-kt-menu-' + name);
  1765. value = KTUtil.getResponsiveValue(attr);
  1766. if ( value !== null && String(value) === 'true' ) {
  1767. value = true;
  1768. } else if ( value !== null && String(value) === 'false' ) {
  1769. value = false;
  1770. }
  1771. }
  1772. return value;
  1773. }
  1774. var _destroy = function() {
  1775. KTUtil.data(the.element).remove('menu');
  1776. }
  1777. // Construct Class
  1778. _construct();
  1779. ///////////////////////
  1780. // ** Public API ** //
  1781. ///////////////////////
  1782. // Event Handlers
  1783. the.click = function(element, e) {
  1784. return _click(element, e);
  1785. }
  1786. the.link = function(element, e) {
  1787. return _link(element, e);
  1788. }
  1789. the.dismiss = function(element, e) {
  1790. return _dismiss(element, e);
  1791. }
  1792. the.mouseover = function(element, e) {
  1793. return _mouseover(element, e);
  1794. }
  1795. the.mouseout = function(element, e) {
  1796. return _mouseout(element, e);
  1797. }
  1798. // General Methods
  1799. the.getItemTriggerType = function(item) {
  1800. return _getOptionFromElementAttribute(item, 'trigger');
  1801. }
  1802. the.getItemSubType = function(element) {
  1803. return _getItemSubType(element);
  1804. }
  1805. the.show = function(item) {
  1806. return _show(item);
  1807. }
  1808. the.hide = function(item) {
  1809. return _hide(item);
  1810. }
  1811. the.reset = function(item) {
  1812. return _reset(item);
  1813. }
  1814. the.update = function() {
  1815. return _update();
  1816. }
  1817. the.getElement = function() {
  1818. return the.element;
  1819. }
  1820. the.setActiveLink = function(link) {
  1821. return _setActiveLink(link);
  1822. }
  1823. the.getLinkByAttribute = function(value, name = "href") {
  1824. return _getLinkByAttribute(value, name);
  1825. }
  1826. the.getItemLinkElement = function(item) {
  1827. return _getItemLinkElement(item);
  1828. }
  1829. the.getItemToggleElement = function(item) {
  1830. return _getItemToggleElement(item);
  1831. }
  1832. the.getItemSubElement = function(item) {
  1833. return _getItemSubElement(item);
  1834. }
  1835. the.getItemParentElements = function(item) {
  1836. return _getItemParentElements(item);
  1837. }
  1838. the.isItemSubShown = function(item) {
  1839. return _isItemSubShown(item);
  1840. }
  1841. the.isItemParentShown = function(item) {
  1842. return _isItemParentShown(item);
  1843. }
  1844. the.getTriggerElement = function() {
  1845. return the.triggerElement;
  1846. }
  1847. the.isItemDropdownPermanent = function(item) {
  1848. return _isItemDropdownPermanent(item);
  1849. }
  1850. the.destroy = function() {
  1851. return _destroy();
  1852. }
  1853. the.disable = function() {
  1854. the.disabled = true;
  1855. }
  1856. the.enable = function() {
  1857. the.disabled = false;
  1858. }
  1859. // Accordion Mode Methods
  1860. the.hideAccordions = function(item) {
  1861. return _hideAccordions(item);
  1862. }
  1863. // Event API
  1864. the.on = function(name, handler) {
  1865. return KTEventHandler.on(the.element, name, handler);
  1866. }
  1867. the.one = function(name, handler) {
  1868. return KTEventHandler.one(the.element, name, handler);
  1869. }
  1870. the.off = function(name, handlerId) {
  1871. return KTEventHandler.off(the.element, name, handlerId);
  1872. }
  1873. };
  1874. // Get KTMenu instance by element
  1875. KTMenu.getInstance = function(element) {
  1876. var menu;
  1877. var item;
  1878. // Element has menu DOM reference in it's DATA storage
  1879. if ( KTUtil.data(element).has('menu') ) {
  1880. return KTUtil.data(element).get('menu');
  1881. }
  1882. // Element has .menu parent
  1883. if ( menu = element.closest('.menu') ) {
  1884. if ( KTUtil.data(menu).has('menu') ) {
  1885. return KTUtil.data(menu).get('menu');
  1886. }
  1887. }
  1888. // Element has a parent with DOM reference to .menu in it's DATA storage
  1889. if ( KTUtil.hasClass(element, 'menu-link') ) {
  1890. var sub = element.closest('.menu-sub');
  1891. if ( KTUtil.data(sub).has('menu') ) {
  1892. return KTUtil.data(sub).get('menu');
  1893. }
  1894. }
  1895. return null;
  1896. }
  1897. // Hide all dropdowns and skip one if provided
  1898. KTMenu.hideDropdowns = function(skip) {
  1899. var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
  1900. if (items && items.length > 0) {
  1901. for (var i = 0, len = items.length; i < len; i++) {
  1902. var item = items[i];
  1903. var menu = KTMenu.getInstance(item);
  1904. if ( menu && menu.getItemSubType(item) === 'dropdown' ) {
  1905. if ( skip ) {
  1906. if ( menu.getItemSubElement(item).contains(skip) === false && item.contains(skip) === false && item !== skip ) {
  1907. menu.hide(item);
  1908. }
  1909. } else {
  1910. menu.hide(item);
  1911. }
  1912. }
  1913. }
  1914. }
  1915. }
  1916. // Update all dropdowns popover instances
  1917. KTMenu.updateDropdowns = function() {
  1918. var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
  1919. if (items && items.length > 0) {
  1920. for (var i = 0, len = items.length; i < len; i++) {
  1921. var item = items[i];
  1922. if ( KTUtil.data(item).has('popper') ) {
  1923. KTUtil.data(item).get('popper').forceUpdate();
  1924. }
  1925. }
  1926. }
  1927. }
  1928. // Bug fix for menu load initializing
  1929. KTMenu.hasInit = false;
  1930. // Global handlers
  1931. KTMenu.initHandlers = function() {
  1932. if(KTMenu.hasInit)
  1933. return;
  1934. KTMenu.hasInit = true;
  1935. // Dropdown handler
  1936. document.addEventListener("click", function(e) {
  1937. var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
  1938. var menu;
  1939. var item;
  1940. var sub;
  1941. var menuObj;
  1942. if ( items && items.length > 0 ) {
  1943. for ( var i = 0, len = items.length; i < len; i++ ) {
  1944. item = items[i];
  1945. menuObj = KTMenu.getInstance(item);
  1946. if (menuObj && menuObj.getItemSubType(item) === 'dropdown') {
  1947. menu = menuObj.getElement();
  1948. sub = menuObj.getItemSubElement(item);
  1949. if ( item === e.target || item.contains(e.target) ) {
  1950. continue;
  1951. }
  1952. if ( sub === e.target || sub.contains(e.target) ) {
  1953. continue;
  1954. }
  1955. menuObj.hide(item);
  1956. }
  1957. }
  1958. }
  1959. });
  1960. // Sub toggle handler(updated)
  1961. KTUtil.on(document.body, '.menu-item[data-kt-menu-trigger] > .menu-link, [data-kt-menu-trigger]:not(.menu-item):not([data-kt-menu-trigger="auto"])', 'click', function(e) {
  1962. var menu = KTMenu.getInstance(this);
  1963. if ( menu !== null ) {
  1964. return menu.click(this, e);
  1965. }
  1966. });
  1967. // Link handler
  1968. KTUtil.on(document.body, '.menu-item:not([data-kt-menu-trigger]) > .menu-link', 'click', function(e) {
  1969. var menu = KTMenu.getInstance(this);
  1970. if ( menu !== null ) {
  1971. return menu.link(this, e);
  1972. }
  1973. });
  1974. // Dismiss handler
  1975. KTUtil.on(document.body, '[data-kt-menu-dismiss="true"]', 'click', function(e) {
  1976. var menu = KTMenu.getInstance(this);
  1977. if ( menu !== null ) {
  1978. return menu.dismiss(this, e);
  1979. }
  1980. });
  1981. // Mouseover handler
  1982. KTUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseover', function(e) {
  1983. var menu = KTMenu.getInstance(this);
  1984. if ( menu !== null && menu.getItemSubType(this) === 'dropdown' ) {
  1985. return menu.mouseover(this, e);
  1986. }
  1987. });
  1988. // Mouseout handler
  1989. KTUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseout', function(e) {
  1990. var menu = KTMenu.getInstance(this);
  1991. if ( menu !== null && menu.getItemSubType(this) === 'dropdown' ) {
  1992. return menu.mouseout(this, e);
  1993. }
  1994. });
  1995. // Resize handler
  1996. window.addEventListener('resize', function() {
  1997. var menu;
  1998. var timer;
  1999. KTUtil.throttle(timer, function() {
  2000. // Locate and update Offcanvas instances on window resize
  2001. var elements = document.querySelectorAll('[data-kt-menu="true"]');
  2002. if ( elements && elements.length > 0 ) {
  2003. for (var i = 0, len = elements.length; i < len; i++) {
  2004. menu = KTMenu.getInstance(elements[i]);
  2005. if (menu) {
  2006. menu.update();
  2007. }
  2008. }
  2009. }
  2010. }, 200);
  2011. });
  2012. }
  2013. // Render menus by url
  2014. KTMenu.updateByLinkAttribute = function(value, name = "href") {
  2015. // Locate and update Offcanvas instances on window resize
  2016. var elements = document.querySelectorAll('[data-kt-menu="true"]');
  2017. if ( elements && elements.length > 0 ) {
  2018. for (var i = 0, len = elements.length; i < len; i++) {
  2019. var menu = KTMenu.getInstance(elements[i]);
  2020. if (menu) {
  2021. var link = menu.getLinkByAttribute(value, name);
  2022. if (link) {
  2023. menu.setActiveLink(link);
  2024. }
  2025. }
  2026. }
  2027. }
  2028. }
  2029. // Global instances
  2030. KTMenu.createInstances = function(selector = '[data-kt-menu="true"]') {
  2031. // Initialize menus
  2032. var elements = document.querySelectorAll(selector);
  2033. if ( elements && elements.length > 0 ) {
  2034. for (var i = 0, len = elements.length; i < len; i++) {
  2035. new KTMenu(elements[i]);
  2036. }
  2037. }
  2038. }
  2039. // Global initialization
  2040. KTMenu.init = function() {
  2041. // Event handlers
  2042. KTMenu.initHandlers();
  2043. // Initialization
  2044. KTMenu.createInstances();
  2045. };
  2046. // Webpack support
  2047. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  2048. module.exports = KTMenu;
  2049. }
  2050. "use strict";
  2051. // Class definition
  2052. var KTPasswordMeter = function(element, options) {
  2053. ////////////////////////////
  2054. // ** Private variables ** //
  2055. ////////////////////////////
  2056. var the = this;
  2057. if (!element) {
  2058. return;
  2059. }
  2060. // Default Options
  2061. var defaultOptions = {
  2062. minLength: 8,
  2063. checkUppercase: true,
  2064. checkLowercase: true,
  2065. checkDigit: true,
  2066. checkChar: true,
  2067. scoreHighlightClass: 'active'
  2068. };
  2069. ////////////////////////////
  2070. // ** Private methods ** //
  2071. ////////////////////////////
  2072. // Constructor
  2073. var _construct = function() {
  2074. if ( KTUtil.data(element).has('password-meter') === true ) {
  2075. the = KTUtil.data(element).get('password-meter');
  2076. } else {
  2077. _init();
  2078. }
  2079. }
  2080. // Initialize
  2081. var _init = function() {
  2082. // Variables
  2083. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  2084. the.score = 0;
  2085. the.checkSteps = 5;
  2086. // Elements
  2087. the.element = element;
  2088. the.inputElement = the.element.querySelector('input[type]');
  2089. the.visibilityElement = the.element.querySelector('[data-kt-password-meter-control="visibility"]');
  2090. the.highlightElement = the.element.querySelector('[data-kt-password-meter-control="highlight"]');
  2091. // Set initialized
  2092. the.element.setAttribute('data-kt-password-meter', 'true');
  2093. // Event Handlers
  2094. _handlers();
  2095. // Bind Instance
  2096. KTUtil.data(the.element).set('password-meter', the);
  2097. }
  2098. // Handlers
  2099. var _handlers = function() {
  2100. the.inputElement.addEventListener('input', function() {
  2101. _check();
  2102. });
  2103. if (the.visibilityElement) {
  2104. the.visibilityElement.addEventListener('click', function() {
  2105. _visibility();
  2106. });
  2107. }
  2108. }
  2109. // Event handlers
  2110. var _check = function() {
  2111. var score = 0;
  2112. var checkScore = _getCheckScore();
  2113. if (_checkLength() === true) {
  2114. score = score + checkScore;
  2115. }
  2116. if (the.options.checkUppercase === true && _checkLowercase() === true) {
  2117. score = score + checkScore;
  2118. }
  2119. if (the.options.checkLowercase === true && _checkUppercase() === true ) {
  2120. score = score + checkScore;
  2121. }
  2122. if (the.options.checkDigit === true && _checkDigit() === true ) {
  2123. score = score + checkScore;
  2124. }
  2125. if (the.options.checkChar === true && _checkChar() === true ) {
  2126. score = score + checkScore;
  2127. }
  2128. the.score = score;
  2129. _highlight();
  2130. }
  2131. var _checkLength = function() {
  2132. return the.inputElement.value.length >= the.options.minLength; // 20 score
  2133. }
  2134. var _checkLowercase = function() {
  2135. return /[a-z]/.test(the.inputElement.value); // 20 score
  2136. }
  2137. var _checkUppercase = function() {
  2138. return /[A-Z]/.test(the.inputElement.value); // 20 score
  2139. }
  2140. var _checkDigit = function() {
  2141. return /[0-9]/.test(the.inputElement.value); // 20 score
  2142. }
  2143. var _checkChar = function() {
  2144. return /[~`!#@$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(the.inputElement.value); // 20 score
  2145. }
  2146. var _getCheckScore = function() {
  2147. var count = 1;
  2148. if (the.options.checkUppercase === true) {
  2149. count++;
  2150. }
  2151. if (the.options.checkLowercase === true) {
  2152. count++;
  2153. }
  2154. if (the.options.checkDigit === true) {
  2155. count++;
  2156. }
  2157. if (the.options.checkChar === true) {
  2158. count++;
  2159. }
  2160. the.checkSteps = count;
  2161. return 100 / the.checkSteps;
  2162. }
  2163. var _highlight = function() {
  2164. var items = [].slice.call(the.highlightElement.querySelectorAll('div'));
  2165. var total = items.length;
  2166. var index = 0;
  2167. var checkScore = _getCheckScore();
  2168. var score = _getScore();
  2169. items.map(function (item) {
  2170. index++;
  2171. if ( (checkScore * index * (the.checkSteps / total)) <= score ) {
  2172. item.classList.add('active');
  2173. } else {
  2174. item.classList.remove('active');
  2175. }
  2176. });
  2177. }
  2178. var _visibility = function() {
  2179. var visibleIcon = the.visibilityElement.querySelector('i:not(.d-none), .svg-icon:not(.d-none)');
  2180. var hiddenIcon = the.visibilityElement.querySelector('i.d-none, .svg-icon.d-none');
  2181. if (the.inputElement.getAttribute('type').toLowerCase() === 'password' ) {
  2182. the.inputElement.setAttribute('type', 'text');
  2183. } else {
  2184. the.inputElement.setAttribute('type', 'password');
  2185. }
  2186. visibleIcon.classList.add('d-none');
  2187. hiddenIcon.classList.remove('d-none');
  2188. the.inputElement.focus();
  2189. }
  2190. var _reset = function() {
  2191. the.score = 0;
  2192. _highlight();
  2193. }
  2194. // Gets current password score
  2195. var _getScore = function() {
  2196. return the.score;
  2197. }
  2198. var _destroy = function() {
  2199. KTUtil.data(the.element).remove('password-meter');
  2200. }
  2201. // Construct class
  2202. _construct();
  2203. ///////////////////////
  2204. // ** Public API ** //
  2205. ///////////////////////
  2206. // Plugin API
  2207. the.check = function() {
  2208. return _check();
  2209. }
  2210. the.getScore = function() {
  2211. return _getScore();
  2212. }
  2213. the.reset = function() {
  2214. return _reset();
  2215. }
  2216. the.destroy = function() {
  2217. return _destroy();
  2218. }
  2219. };
  2220. // Static methods
  2221. KTPasswordMeter.getInstance = function(element) {
  2222. if ( element !== null && KTUtil.data(element).has('password-meter') ) {
  2223. return KTUtil.data(element).get('password-meter');
  2224. } else {
  2225. return null;
  2226. }
  2227. }
  2228. // Create instances
  2229. KTPasswordMeter.createInstances = function(selector = '[data-kt-password-meter]') {
  2230. // Get instances
  2231. var elements = document.body.querySelectorAll(selector);
  2232. if ( elements && elements.length > 0 ) {
  2233. for (var i = 0, len = elements.length; i < len; i++) {
  2234. // Initialize instances
  2235. new KTPasswordMeter(elements[i]);
  2236. }
  2237. }
  2238. }
  2239. // Global initialization
  2240. KTPasswordMeter.init = function() {
  2241. KTPasswordMeter.createInstances();
  2242. };
  2243. // Webpack support
  2244. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  2245. module.exports = KTPasswordMeter;
  2246. }
  2247. "use strict";
  2248. // Class definition
  2249. var KTScroll = function(element, options) {
  2250. ////////////////////////////
  2251. // ** Private Variables ** //
  2252. ////////////////////////////
  2253. var the = this;
  2254. if (!element) {
  2255. return;
  2256. }
  2257. // Default options
  2258. var defaultOptions = {
  2259. saveState: true
  2260. };
  2261. ////////////////////////////
  2262. // ** Private Methods ** //
  2263. ////////////////////////////
  2264. var _construct = function() {
  2265. if ( KTUtil.data(element).has('scroll') ) {
  2266. the = KTUtil.data(element).get('scroll');
  2267. } else {
  2268. _init();
  2269. }
  2270. }
  2271. var _init = function() {
  2272. // Variables
  2273. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  2274. // Elements
  2275. the.element = element;
  2276. the.id = the.element.getAttribute('id');
  2277. // Set initialized
  2278. the.element.setAttribute('data-kt-scroll', 'true');
  2279. // Update
  2280. _update();
  2281. // Bind Instance
  2282. KTUtil.data(the.element).set('scroll', the);
  2283. }
  2284. var _setupHeight = function() {
  2285. var heightType = _getHeightType();
  2286. var height = _getHeight();
  2287. // Set height
  2288. if ( height !== null && height.length > 0 ) {
  2289. KTUtil.css(the.element, heightType, height);
  2290. } else {
  2291. KTUtil.css(the.element, heightType, '');
  2292. }
  2293. }
  2294. var _setupState = function () {
  2295. var namespace = _getStorageNamespace();
  2296. if ( _getOption('save-state') === true && the.id ) {
  2297. if ( localStorage.getItem(namespace + the.id + 'st') ) {
  2298. var pos = parseInt(localStorage.getItem(namespace + the.id + 'st'));
  2299. if ( pos > 0 ) {
  2300. the.element.scroll({
  2301. top: pos,
  2302. behavior: 'instant'
  2303. });
  2304. }
  2305. }
  2306. }
  2307. }
  2308. var _getStorageNamespace = function(postfix) {
  2309. return document.body.hasAttribute("data-kt-name") ? document.body.getAttribute("data-kt-name") + "_" : "";
  2310. }
  2311. var _setupScrollHandler = function() {
  2312. if ( _getOption('save-state') === true && the.id ) {
  2313. the.element.addEventListener('scroll', _scrollHandler);
  2314. } else {
  2315. the.element.removeEventListener('scroll', _scrollHandler);
  2316. }
  2317. }
  2318. var _destroyScrollHandler = function() {
  2319. the.element.removeEventListener('scroll', _scrollHandler);
  2320. }
  2321. var _resetHeight = function() {
  2322. KTUtil.css(the.element, _getHeightType(), '');
  2323. }
  2324. var _scrollHandler = function () {
  2325. var namespace = _getStorageNamespace();
  2326. localStorage.setItem(namespace + the.id + 'st', the.element.scrollTop);
  2327. }
  2328. var _update = function() {
  2329. // Activate/deactivate
  2330. if ( _getOption('activate') === true || the.element.hasAttribute('data-kt-scroll-activate') === false ) {
  2331. _setupHeight();
  2332. _setupStretchHeight();
  2333. _setupScrollHandler();
  2334. _setupState();
  2335. } else {
  2336. _resetHeight()
  2337. _destroyScrollHandler();
  2338. }
  2339. }
  2340. var _setupStretchHeight = function() {
  2341. var stretch = _getOption('stretch');
  2342. // Stretch
  2343. if ( stretch !== null ) {
  2344. var elements = document.querySelectorAll(stretch);
  2345. if ( elements && elements.length == 2 ) {
  2346. var element1 = elements[0];
  2347. var element2 = elements[1];
  2348. var diff = _getElementHeight(element2) - _getElementHeight(element1);
  2349. if (diff > 0) {
  2350. var height = parseInt(KTUtil.css(the.element, _getHeightType())) + diff;
  2351. KTUtil.css(the.element, _getHeightType(), String(height) + 'px');
  2352. }
  2353. }
  2354. }
  2355. }
  2356. var _getHeight = function() {
  2357. var height = _getOption(_getHeightType());
  2358. if ( height instanceof Function ) {
  2359. return height.call();
  2360. } else if ( height !== null && typeof height === 'string' && height.toLowerCase() === 'auto' ) {
  2361. return _getAutoHeight();
  2362. } else {
  2363. return height;
  2364. }
  2365. }
  2366. var _getAutoHeight = function() {
  2367. var height = KTUtil.getViewPort().height;
  2368. var dependencies = _getOption('dependencies');
  2369. var wrappers = _getOption('wrappers');
  2370. var offset = _getOption('offset');
  2371. // Spacings
  2372. height = height - _getElementSpacing(the.element);
  2373. // Height dependencies
  2374. if ( dependencies !== null ) {
  2375. var elements = document.querySelectorAll(dependencies);
  2376. if ( elements && elements.length > 0 ) {
  2377. for ( var i = 0, len = elements.length; i < len; i++ ) {
  2378. if ( KTUtil.visible(elements[i]) === false ) {
  2379. continue;
  2380. }
  2381. height = height - _getElementHeight(elements[i]);
  2382. }
  2383. }
  2384. }
  2385. // Wrappers
  2386. if ( wrappers !== null ) {
  2387. var elements = document.querySelectorAll(wrappers);
  2388. if ( elements && elements.length > 0 ) {
  2389. for ( var i = 0, len = elements.length; i < len; i++ ) {
  2390. if ( KTUtil.visible(elements[i]) === false ) {
  2391. continue;
  2392. }
  2393. height = height - _getElementSpacing(elements[i]);
  2394. }
  2395. }
  2396. }
  2397. // Custom offset
  2398. if ( offset !== null && typeof offset !== 'object') {
  2399. height = height - parseInt(offset);
  2400. }
  2401. return String(height) + 'px';
  2402. }
  2403. var _getElementHeight = function(element) {
  2404. var height = 0;
  2405. if (element !== null) {
  2406. height = height + parseInt(KTUtil.css(element, 'height'));
  2407. height = height + parseInt(KTUtil.css(element, 'margin-top'));
  2408. height = height + parseInt(KTUtil.css(element, 'margin-bottom'));
  2409. if (KTUtil.css(element, 'border-top')) {
  2410. height = height + parseInt(KTUtil.css(element, 'border-top'));
  2411. }
  2412. if (KTUtil.css(element, 'border-bottom')) {
  2413. height = height + parseInt(KTUtil.css(element, 'border-bottom'));
  2414. }
  2415. }
  2416. return height;
  2417. }
  2418. var _getElementSpacing = function(element) {
  2419. var spacing = 0;
  2420. if (element !== null) {
  2421. spacing = spacing + parseInt(KTUtil.css(element, 'margin-top'));
  2422. spacing = spacing + parseInt(KTUtil.css(element, 'margin-bottom'));
  2423. spacing = spacing + parseInt(KTUtil.css(element, 'padding-top'));
  2424. spacing = spacing + parseInt(KTUtil.css(element, 'padding-bottom'));
  2425. if (KTUtil.css(element, 'border-top')) {
  2426. spacing = spacing + parseInt(KTUtil.css(element, 'border-top'));
  2427. }
  2428. if (KTUtil.css(element, 'border-bottom')) {
  2429. spacing = spacing + parseInt(KTUtil.css(element, 'border-bottom'));
  2430. }
  2431. }
  2432. return spacing;
  2433. }
  2434. var _getOption = function(name) {
  2435. if ( the.element.hasAttribute('data-kt-scroll-' + name) === true ) {
  2436. var attr = the.element.getAttribute('data-kt-scroll-' + name);
  2437. var value = KTUtil.getResponsiveValue(attr);
  2438. if ( value !== null && String(value) === 'true' ) {
  2439. value = true;
  2440. } else if ( value !== null && String(value) === 'false' ) {
  2441. value = false;
  2442. }
  2443. return value;
  2444. } else {
  2445. var optionName = KTUtil.snakeToCamel(name);
  2446. if ( the.options[optionName] ) {
  2447. return KTUtil.getResponsiveValue(the.options[optionName]);
  2448. } else {
  2449. return null;
  2450. }
  2451. }
  2452. }
  2453. var _getHeightType = function() {
  2454. if (_getOption('height')) {
  2455. return 'height';
  2456. } if (_getOption('min-height')) {
  2457. return 'min-height';
  2458. } if (_getOption('max-height')) {
  2459. return 'max-height';
  2460. }
  2461. }
  2462. var _destroy = function() {
  2463. KTUtil.data(the.element).remove('scroll');
  2464. }
  2465. // Construct Class
  2466. _construct();
  2467. ///////////////////////
  2468. // ** Public API ** //
  2469. ///////////////////////
  2470. the.update = function() {
  2471. return _update();
  2472. }
  2473. the.getHeight = function() {
  2474. return _getHeight();
  2475. }
  2476. the.getElement = function() {
  2477. return the.element;
  2478. }
  2479. the.destroy = function() {
  2480. return _destroy();
  2481. }
  2482. };
  2483. // Static methods
  2484. KTScroll.getInstance = function(element) {
  2485. if ( element !== null && KTUtil.data(element).has('scroll') ) {
  2486. return KTUtil.data(element).get('scroll');
  2487. } else {
  2488. return null;
  2489. }
  2490. }
  2491. // Create instances
  2492. KTScroll.createInstances = function(selector = '[data-kt-scroll="true"]') {
  2493. // Initialize Menus
  2494. var elements = document.body.querySelectorAll(selector);
  2495. if ( elements && elements.length > 0 ) {
  2496. for (var i = 0, len = elements.length; i < len; i++) {
  2497. new KTScroll(elements[i]);
  2498. }
  2499. }
  2500. }
  2501. // Window resize handling
  2502. KTScroll.handleResize = function() {
  2503. window.addEventListener('resize', function() {
  2504. var timer;
  2505. KTUtil.throttle(timer, function() {
  2506. // Locate and update Offcanvas instances on window resize
  2507. var elements = document.body.querySelectorAll('[data-kt-scroll="true"]');
  2508. if ( elements && elements.length > 0 ) {
  2509. for (var i = 0, len = elements.length; i < len; i++) {
  2510. var scroll = KTScroll.getInstance(elements[i]);
  2511. if (scroll) {
  2512. scroll.update();
  2513. }
  2514. }
  2515. }
  2516. }, 200);
  2517. });
  2518. }
  2519. // Global initialization
  2520. KTScroll.init = function() {
  2521. KTScroll.createInstances();
  2522. KTScroll.handleResize();
  2523. };
  2524. // Webpack Support
  2525. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  2526. module.exports = KTScroll;
  2527. }
  2528. "use strict";
  2529. // Class definition
  2530. var KTScrolltop = function(element, options) {
  2531. ////////////////////////////
  2532. // ** Private variables ** //
  2533. ////////////////////////////
  2534. var the = this;
  2535. if ( typeof element === "undefined" || element === null ) {
  2536. return;
  2537. }
  2538. // Default options
  2539. var defaultOptions = {
  2540. offset: 300,
  2541. speed: 600
  2542. };
  2543. ////////////////////////////
  2544. // ** Private methods ** //
  2545. ////////////////////////////
  2546. var _construct = function() {
  2547. if (KTUtil.data(element).has('scrolltop')) {
  2548. the = KTUtil.data(element).get('scrolltop');
  2549. } else {
  2550. _init();
  2551. }
  2552. }
  2553. var _init = function() {
  2554. // Variables
  2555. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  2556. the.uid = KTUtil.getUniqueId('scrolltop');
  2557. the.element = element;
  2558. // Set initialized
  2559. the.element.setAttribute('data-kt-scrolltop', 'true');
  2560. // Event Handlers
  2561. _handlers();
  2562. // Bind Instance
  2563. KTUtil.data(the.element).set('scrolltop', the);
  2564. }
  2565. var _handlers = function() {
  2566. var timer;
  2567. window.addEventListener('scroll', function() {
  2568. KTUtil.throttle(timer, function() {
  2569. _scroll();
  2570. }, 200);
  2571. });
  2572. KTUtil.addEvent(the.element, 'click', function(e) {
  2573. e.preventDefault();
  2574. _go();
  2575. });
  2576. }
  2577. var _scroll = function() {
  2578. var offset = parseInt(_getOption('offset'));
  2579. var pos = KTUtil.getScrollTop(); // current vertical position
  2580. if ( pos > offset ) {
  2581. if ( document.body.hasAttribute('data-kt-scrolltop') === false ) {
  2582. document.body.setAttribute('data-kt-scrolltop', 'on');
  2583. }
  2584. } else {
  2585. if ( document.body.hasAttribute('data-kt-scrolltop') === true ) {
  2586. document.body.removeAttribute('data-kt-scrolltop');
  2587. }
  2588. }
  2589. }
  2590. var _go = function() {
  2591. var speed = parseInt(_getOption('speed'));
  2592. window.scrollTo({top: 0, behavior: 'smooth'});
  2593. //KTUtil.scrollTop(0, speed);
  2594. }
  2595. var _getOption = function(name) {
  2596. if ( the.element.hasAttribute('data-kt-scrolltop-' + name) === true ) {
  2597. var attr = the.element.getAttribute('data-kt-scrolltop-' + name);
  2598. var value = KTUtil.getResponsiveValue(attr);
  2599. if ( value !== null && String(value) === 'true' ) {
  2600. value = true;
  2601. } else if ( value !== null && String(value) === 'false' ) {
  2602. value = false;
  2603. }
  2604. return value;
  2605. } else {
  2606. var optionName = KTUtil.snakeToCamel(name);
  2607. if ( the.options[optionName] ) {
  2608. return KTUtil.getResponsiveValue(the.options[optionName]);
  2609. } else {
  2610. return null;
  2611. }
  2612. }
  2613. }
  2614. var _destroy = function() {
  2615. KTUtil.data(the.element).remove('scrolltop');
  2616. }
  2617. // Construct class
  2618. _construct();
  2619. ///////////////////////
  2620. // ** Public API ** //
  2621. ///////////////////////
  2622. // Plugin API
  2623. the.go = function() {
  2624. return _go();
  2625. }
  2626. the.getElement = function() {
  2627. return the.element;
  2628. }
  2629. the.destroy = function() {
  2630. return _destroy();
  2631. }
  2632. };
  2633. // Static methods
  2634. KTScrolltop.getInstance = function(element) {
  2635. if (element && KTUtil.data(element).has('scrolltop')) {
  2636. return KTUtil.data(element).get('scrolltop');
  2637. } else {
  2638. return null;
  2639. }
  2640. }
  2641. // Create instances
  2642. KTScrolltop.createInstances = function(selector = '[data-kt-scrolltop="true"]') {
  2643. // Initialize Menus
  2644. var elements = document.body.querySelectorAll(selector);
  2645. var scrolltop;
  2646. if ( elements && elements.length > 0 ) {
  2647. for (var i = 0, len = elements.length; i < len; i++) {
  2648. scrolltop = new KTScrolltop(elements[i]);
  2649. }
  2650. }
  2651. }
  2652. // Global initialization
  2653. KTScrolltop.init = function() {
  2654. KTScrolltop.createInstances();
  2655. };
  2656. // Webpack support
  2657. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  2658. module.exports = KTScrolltop;
  2659. }
  2660. "use strict";
  2661. // Class definition
  2662. var KTSearch = function(element, options) {
  2663. ////////////////////////////
  2664. // ** Private variables ** //
  2665. ////////////////////////////
  2666. var the = this;
  2667. if (!element) {
  2668. return;
  2669. }
  2670. // Default Options
  2671. var defaultOptions = {
  2672. minLength: 2, // Miniam text lenght to query search
  2673. keypress: true, // Enable search on keypress
  2674. enter: true, // Enable search on enter key press
  2675. layout: 'menu', // Use 'menu' or 'inline' layout options to display search results
  2676. responsive: null, // Pass integer value or bootstrap compatible breakpoint key(sm,md,lg,xl,xxl) to enable reponsive form mode for device width below the breakpoint value
  2677. showOnFocus: true // Always show menu on input focus
  2678. };
  2679. ////////////////////////////
  2680. // ** Private methods ** //
  2681. ////////////////////////////
  2682. // Construct
  2683. var _construct = function() {
  2684. if ( KTUtil.data(element).has('search') === true ) {
  2685. the = KTUtil.data(element).get('search');
  2686. } else {
  2687. _init();
  2688. }
  2689. }
  2690. // Init
  2691. var _init = function() {
  2692. // Variables
  2693. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  2694. the.processing = false;
  2695. // Elements
  2696. the.element = element;
  2697. the.contentElement = _getElement('content');
  2698. the.formElement = _getElement('form');
  2699. the.inputElement = _getElement('input');
  2700. the.spinnerElement = _getElement('spinner');
  2701. the.clearElement = _getElement('clear');
  2702. the.toggleElement = _getElement('toggle');
  2703. the.submitElement = _getElement('submit');
  2704. the.toolbarElement = _getElement('toolbar');
  2705. the.resultsElement = _getElement('results');
  2706. the.suggestionElement = _getElement('suggestion');
  2707. the.emptyElement = _getElement('empty');
  2708. // Set initialized
  2709. the.element.setAttribute('data-kt-search', 'true');
  2710. // Layout
  2711. the.layout = _getOption('layout');
  2712. // Menu
  2713. if ( the.layout === 'menu' ) {
  2714. the.menuObject = new KTMenu(the.contentElement);
  2715. } else {
  2716. the.menuObject = null;
  2717. }
  2718. // Update
  2719. _update();
  2720. // Event Handlers
  2721. _handlers();
  2722. // Bind Instance
  2723. KTUtil.data(the.element).set('search', the);
  2724. }
  2725. // Handlera
  2726. var _handlers = function() {
  2727. // Focus
  2728. the.inputElement.addEventListener('focus', _focus);
  2729. // Blur
  2730. the.inputElement.addEventListener('blur', _blur);
  2731. // Keypress
  2732. if ( _getOption('keypress') === true ) {
  2733. the.inputElement.addEventListener('input', _input);
  2734. }
  2735. // Submit
  2736. if ( the.submitElement ) {
  2737. the.submitElement.addEventListener('click', _search);
  2738. }
  2739. // Enter
  2740. if ( _getOption('enter') === true ) {
  2741. the.inputElement.addEventListener('keypress', _enter);
  2742. }
  2743. // Clear
  2744. if ( the.clearElement ) {
  2745. the.clearElement.addEventListener('click', _clear);
  2746. }
  2747. // Menu
  2748. if ( the.menuObject ) {
  2749. // Toggle menu
  2750. if ( the.toggleElement ) {
  2751. the.toggleElement.addEventListener('click', _show);
  2752. the.menuObject.on('kt.menu.dropdown.show', function(item) {
  2753. if (KTUtil.visible(the.toggleElement)) {
  2754. the.toggleElement.classList.add('active');
  2755. the.toggleElement.classList.add('show');
  2756. }
  2757. });
  2758. the.menuObject.on('kt.menu.dropdown.hide', function(item) {
  2759. if (KTUtil.visible(the.toggleElement)) {
  2760. the.toggleElement.classList.remove('active');
  2761. the.toggleElement.classList.remove('show');
  2762. }
  2763. });
  2764. }
  2765. the.menuObject.on('kt.menu.dropdown.shown', function() {
  2766. the.inputElement.focus();
  2767. });
  2768. }
  2769. // Window resize handling
  2770. window.addEventListener('resize', function() {
  2771. var timer;
  2772. KTUtil.throttle(timer, function() {
  2773. _update();
  2774. }, 200);
  2775. });
  2776. }
  2777. // Focus
  2778. var _focus = function() {
  2779. the.element.classList.add('focus');
  2780. if ( _getOption('show-on-focus') === true || the.inputElement.value.length >= minLength ) {
  2781. _show();
  2782. }
  2783. }
  2784. // Blur
  2785. var _blur = function() {
  2786. the.element.classList.remove('focus');
  2787. }
  2788. // Enter
  2789. var _enter = function(e) {
  2790. var key = e.charCode || e.keyCode || 0;
  2791. if (key == 13) {
  2792. e.preventDefault();
  2793. _search();
  2794. }
  2795. }
  2796. // Input
  2797. var _input = function() {
  2798. if ( _getOption('min-length') ) {
  2799. var minLength = parseInt(_getOption('min-length'));
  2800. if ( the.inputElement.value.length >= minLength ) {
  2801. _search();
  2802. } else if ( the.inputElement.value.length === 0 ) {
  2803. _clear();
  2804. }
  2805. }
  2806. }
  2807. // Search
  2808. var _search = function() {
  2809. if (the.processing === false) {
  2810. // Show search spinner
  2811. if (the.spinnerElement) {
  2812. the.spinnerElement.classList.remove("d-none");
  2813. }
  2814. // Hide search clear button
  2815. if (the.clearElement) {
  2816. the.clearElement.classList.add("d-none");
  2817. }
  2818. // Hide search toolbar
  2819. if (the.toolbarElement && the.formElement.contains(the.toolbarElement)) {
  2820. the.toolbarElement.classList.add("d-none");
  2821. }
  2822. // Focus input
  2823. the.inputElement.focus();
  2824. the.processing = true;
  2825. KTEventHandler.trigger(the.element, 'kt.search.process', the);
  2826. }
  2827. }
  2828. // Complete
  2829. var _complete = function() {
  2830. if (the.spinnerElement) {
  2831. the.spinnerElement.classList.add("d-none");
  2832. }
  2833. // Show search toolbar
  2834. if (the.clearElement) {
  2835. the.clearElement.classList.remove("d-none");
  2836. }
  2837. if ( the.inputElement.value.length === 0 ) {
  2838. _clear();
  2839. }
  2840. // Focus input
  2841. the.inputElement.focus();
  2842. _show();
  2843. the.processing = false;
  2844. }
  2845. // Clear
  2846. var _clear = function() {
  2847. if ( KTEventHandler.trigger(the.element, 'kt.search.clear', the) === false ) {
  2848. return;
  2849. }
  2850. // Clear and focus input
  2851. the.inputElement.value = "";
  2852. the.inputElement.focus();
  2853. // Hide clear icon
  2854. if (the.clearElement) {
  2855. the.clearElement.classList.add("d-none");
  2856. }
  2857. // Show search toolbar
  2858. if (the.toolbarElement && the.formElement.contains(the.toolbarElement)) {
  2859. the.toolbarElement.classList.remove("d-none");
  2860. }
  2861. // Hide menu
  2862. if ( _getOption('show-on-focus') === false ) {
  2863. _hide();
  2864. }
  2865. KTEventHandler.trigger(the.element, 'kt.search.cleared', the);
  2866. }
  2867. // Update
  2868. var _update = function() {
  2869. // Handle responsive form
  2870. if (the.layout === 'menu') {
  2871. var responsiveFormMode = _getResponsiveFormMode();
  2872. if ( responsiveFormMode === 'on' && the.contentElement.contains(the.formElement) === false ) {
  2873. the.contentElement.prepend(the.formElement);
  2874. the.formElement.classList.remove('d-none');
  2875. } else if ( responsiveFormMode === 'off' && the.contentElement.contains(the.formElement) === true ) {
  2876. the.element.prepend(the.formElement);
  2877. the.formElement.classList.add('d-none');
  2878. }
  2879. }
  2880. }
  2881. // Show menu
  2882. var _show = function() {
  2883. if ( the.menuObject ) {
  2884. _update();
  2885. the.menuObject.show(the.element);
  2886. }
  2887. }
  2888. // Hide menu
  2889. var _hide = function() {
  2890. if ( the.menuObject ) {
  2891. _update();
  2892. the.menuObject.hide(the.element);
  2893. }
  2894. }
  2895. // Get option
  2896. var _getOption = function(name) {
  2897. if ( the.element.hasAttribute('data-kt-search-' + name) === true ) {
  2898. var attr = the.element.getAttribute('data-kt-search-' + name);
  2899. var value = KTUtil.getResponsiveValue(attr);
  2900. if ( value !== null && String(value) === 'true' ) {
  2901. value = true;
  2902. } else if ( value !== null && String(value) === 'false' ) {
  2903. value = false;
  2904. }
  2905. return value;
  2906. } else {
  2907. var optionName = KTUtil.snakeToCamel(name);
  2908. if ( the.options[optionName] ) {
  2909. return KTUtil.getResponsiveValue(the.options[optionName]);
  2910. } else {
  2911. return null;
  2912. }
  2913. }
  2914. }
  2915. // Get element
  2916. var _getElement = function(name) {
  2917. return the.element.querySelector('[data-kt-search-element="' + name + '"]');
  2918. }
  2919. // Check if responsive form mode is enabled
  2920. var _getResponsiveFormMode = function() {
  2921. var responsive = _getOption('responsive');
  2922. var width = KTUtil.getViewPort().width;
  2923. if (!responsive) {
  2924. return null;
  2925. }
  2926. var breakpoint = KTUtil.getBreakpoint(responsive);
  2927. if (!breakpoint ) {
  2928. breakpoint = parseInt(responsive);
  2929. }
  2930. if (width < breakpoint) {
  2931. return "on";
  2932. } else {
  2933. return "off";
  2934. }
  2935. }
  2936. var _destroy = function() {
  2937. KTUtil.data(the.element).remove('search');
  2938. }
  2939. // Construct class
  2940. _construct();
  2941. ///////////////////////
  2942. // ** Public API ** //
  2943. ///////////////////////
  2944. // Plugin API
  2945. the.show = function() {
  2946. return _show();
  2947. }
  2948. the.hide = function() {
  2949. return _hide();
  2950. }
  2951. the.update = function() {
  2952. return _update();
  2953. }
  2954. the.search = function() {
  2955. return _search();
  2956. }
  2957. the.complete = function() {
  2958. return _complete();
  2959. }
  2960. the.clear = function() {
  2961. return _clear();
  2962. }
  2963. the.isProcessing = function() {
  2964. return the.processing;
  2965. }
  2966. the.getQuery = function() {
  2967. return the.inputElement.value;
  2968. }
  2969. the.getMenu = function() {
  2970. return the.menuObject;
  2971. }
  2972. the.getFormElement = function() {
  2973. return the.formElement;
  2974. }
  2975. the.getInputElement = function() {
  2976. return the.inputElement;
  2977. }
  2978. the.getContentElement = function() {
  2979. return the.contentElement;
  2980. }
  2981. the.getElement = function() {
  2982. return the.element;
  2983. }
  2984. the.destroy = function() {
  2985. return _destroy();
  2986. }
  2987. // Event API
  2988. the.on = function(name, handler) {
  2989. return KTEventHandler.on(the.element, name, handler);
  2990. }
  2991. the.one = function(name, handler) {
  2992. return KTEventHandler.one(the.element, name, handler);
  2993. }
  2994. the.off = function(name, handlerId) {
  2995. return KTEventHandler.off(the.element, name, handlerId);
  2996. }
  2997. };
  2998. // Static methods
  2999. KTSearch.getInstance = function(element) {
  3000. if ( element !== null && KTUtil.data(element).has('search') ) {
  3001. return KTUtil.data(element).get('search');
  3002. } else {
  3003. return null;
  3004. }
  3005. }
  3006. // Webpack support
  3007. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  3008. module.exports = KTSearch;
  3009. }
  3010. "use strict";
  3011. // Class definition
  3012. var KTStepper = function(element, options) {
  3013. //////////////////////////////
  3014. // ** Private variables ** //
  3015. //////////////////////////////
  3016. var the = this;
  3017. if ( typeof element === "undefined" || element === null ) {
  3018. return;
  3019. }
  3020. // Default Options
  3021. var defaultOptions = {
  3022. startIndex: 1,
  3023. animation: false,
  3024. animationSpeed: '0.3s',
  3025. animationNextClass: 'animate__animated animate__slideInRight animate__fast',
  3026. animationPreviousClass: 'animate__animated animate__slideInLeft animate__fast'
  3027. };
  3028. ////////////////////////////
  3029. // ** Private methods ** //
  3030. ////////////////////////////
  3031. var _construct = function() {
  3032. if ( KTUtil.data(element).has('stepper') === true ) {
  3033. the = KTUtil.data(element).get('stepper');
  3034. } else {
  3035. _init();
  3036. }
  3037. }
  3038. var _init = function() {
  3039. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  3040. the.uid = KTUtil.getUniqueId('stepper');
  3041. the.element = element;
  3042. // Set initialized
  3043. the.element.setAttribute('data-kt-stepper', 'true');
  3044. // Elements
  3045. the.steps = KTUtil.findAll(the.element, '[data-kt-stepper-element="nav"]');
  3046. the.btnNext = KTUtil.find(the.element, '[data-kt-stepper-action="next"]');
  3047. the.btnPrevious = KTUtil.find(the.element, '[data-kt-stepper-action="previous"]');
  3048. the.btnSubmit = KTUtil.find(the.element, '[data-kt-stepper-action="submit"]');
  3049. // Variables
  3050. the.totalStepsNumber = the.steps.length;
  3051. the.passedStepIndex = 0;
  3052. the.currentStepIndex = 1;
  3053. the.clickedStepIndex = 0;
  3054. // Set Current Step
  3055. if ( the.options.startIndex > 1 ) {
  3056. _goTo(the.options.startIndex);
  3057. }
  3058. // Event Handlers
  3059. KTUtil.addEvent(the.btnNext, 'click', function(e) {
  3060. e.preventDefault();
  3061. KTEventHandler.trigger(the.element, 'kt.stepper.next', the);
  3062. });
  3063. KTUtil.addEvent(the.btnPrevious, 'click', function(e) {
  3064. e.preventDefault();
  3065. KTEventHandler.trigger(the.element, 'kt.stepper.previous', the);
  3066. });
  3067. KTUtil.on(the.element, '[data-kt-stepper-action="step"]', 'click', function(e) {
  3068. e.preventDefault();
  3069. if ( the.steps && the.steps.length > 0 ) {
  3070. for (var i = 0, len = the.steps.length; i < len; i++) {
  3071. if ( the.steps[i] === this ) {
  3072. the.clickedStepIndex = i + 1;
  3073. KTEventHandler.trigger(the.element, 'kt.stepper.click', the);
  3074. return;
  3075. }
  3076. }
  3077. }
  3078. });
  3079. // Bind Instance
  3080. KTUtil.data(the.element).set('stepper', the);
  3081. }
  3082. var _goTo = function(index) {
  3083. // Trigger "change" event
  3084. KTEventHandler.trigger(the.element, 'kt.stepper.change', the);
  3085. // Skip if this step is already shown
  3086. if ( index === the.currentStepIndex || index > the.totalStepsNumber || index < 0 ) {
  3087. return;
  3088. }
  3089. // Validate step number
  3090. index = parseInt(index);
  3091. // Set current step
  3092. the.passedStepIndex = the.currentStepIndex;
  3093. the.currentStepIndex = index;
  3094. // Refresh elements
  3095. _refreshUI();
  3096. // Trigger "changed" event
  3097. KTEventHandler.trigger(the.element, 'kt.stepper.changed', the);
  3098. return the;
  3099. }
  3100. var _goNext = function() {
  3101. return _goTo( _getNextStepIndex() );
  3102. }
  3103. var _goPrevious = function() {
  3104. return _goTo( _getPreviousStepIndex() );
  3105. }
  3106. var _goLast = function() {
  3107. return _goTo( _getLastStepIndex() );
  3108. }
  3109. var _goFirst = function() {
  3110. return _goTo( _getFirstStepIndex() );
  3111. }
  3112. var _refreshUI = function() {
  3113. var state = '';
  3114. if ( _isLastStep() ) {
  3115. state = 'last';
  3116. } else if ( _isFirstStep() ) {
  3117. state = 'first';
  3118. } else {
  3119. state = 'between';
  3120. }
  3121. // Set state class
  3122. KTUtil.removeClass(the.element, 'last');
  3123. KTUtil.removeClass(the.element, 'first');
  3124. KTUtil.removeClass(the.element, 'between');
  3125. KTUtil.addClass(the.element, state);
  3126. // Step Items
  3127. var elements = KTUtil.findAll(the.element, '[data-kt-stepper-element="nav"], [data-kt-stepper-element="content"], [data-kt-stepper-element="info"]');
  3128. if ( elements && elements.length > 0 ) {
  3129. for (var i = 0, len = elements.length; i < len; i++) {
  3130. var element = elements[i];
  3131. var index = KTUtil.index(element) + 1;
  3132. KTUtil.removeClass(element, 'current');
  3133. KTUtil.removeClass(element, 'completed');
  3134. KTUtil.removeClass(element, 'pending');
  3135. if ( index == the.currentStepIndex ) {
  3136. KTUtil.addClass(element, 'current');
  3137. if ( the.options.animation !== false && element.getAttribute('data-kt-stepper-element') == 'content' ) {
  3138. KTUtil.css(element, 'animationDuration', the.options.animationSpeed);
  3139. var animation = _getStepDirection(the.passedStepIndex) === 'previous' ? the.options.animationPreviousClass : the.options.animationNextClass;
  3140. KTUtil.animateClass(element, animation);
  3141. }
  3142. } else {
  3143. if ( index < the.currentStepIndex ) {
  3144. KTUtil.addClass(element, 'completed');
  3145. } else {
  3146. KTUtil.addClass(element, 'pending');
  3147. }
  3148. }
  3149. }
  3150. }
  3151. }
  3152. var _isLastStep = function() {
  3153. return the.currentStepIndex === the.totalStepsNumber;
  3154. }
  3155. var _isFirstStep = function() {
  3156. return the.currentStepIndex === 1;
  3157. }
  3158. var _isBetweenStep = function() {
  3159. return _isLastStep() === false && _isFirstStep() === false;
  3160. }
  3161. var _getNextStepIndex = function() {
  3162. if ( the.totalStepsNumber >= ( the.currentStepIndex + 1 ) ) {
  3163. return the.currentStepIndex + 1;
  3164. } else {
  3165. return the.totalStepsNumber;
  3166. }
  3167. }
  3168. var _getPreviousStepIndex = function() {
  3169. if ( ( the.currentStepIndex - 1 ) > 1 ) {
  3170. return the.currentStepIndex - 1;
  3171. } else {
  3172. return 1;
  3173. }
  3174. }
  3175. var _getFirstStepIndex = function(){
  3176. return 1;
  3177. }
  3178. var _getLastStepIndex = function() {
  3179. return the.totalStepsNumber;
  3180. }
  3181. var _getTotalStepsNumber = function() {
  3182. return the.totalStepsNumber;
  3183. }
  3184. var _getStepDirection = function(index) {
  3185. if ( index > the.currentStepIndex ) {
  3186. return 'next';
  3187. } else {
  3188. return 'previous';
  3189. }
  3190. }
  3191. var _getStepContent = function(index) {
  3192. var content = KTUtil.findAll(the.element, '[data-kt-stepper-element="content"]');
  3193. if ( content[index-1] ) {
  3194. return content[index-1];
  3195. } else {
  3196. return false;
  3197. }
  3198. }
  3199. var _destroy = function() {
  3200. KTUtil.data(the.element).remove('stepper');
  3201. }
  3202. // Construct Class
  3203. _construct();
  3204. ///////////////////////
  3205. // ** Public API ** //
  3206. ///////////////////////
  3207. // Plugin API
  3208. the.getElement = function(index) {
  3209. return the.element;
  3210. }
  3211. the.goTo = function(index) {
  3212. return _goTo(index);
  3213. }
  3214. the.goPrevious = function() {
  3215. return _goPrevious();
  3216. }
  3217. the.goNext = function() {
  3218. return _goNext();
  3219. }
  3220. the.goFirst = function() {
  3221. return _goFirst();
  3222. }
  3223. the.goLast = function() {
  3224. return _goLast();
  3225. }
  3226. the.getCurrentStepIndex = function() {
  3227. return the.currentStepIndex;
  3228. }
  3229. the.getNextStepIndex = function() {
  3230. return the.nextStepIndex;
  3231. }
  3232. the.getPassedStepIndex = function() {
  3233. return the.passedStepIndex;
  3234. }
  3235. the.getClickedStepIndex = function() {
  3236. return the.clickedStepIndex;
  3237. }
  3238. the.getPreviousStepIndex = function() {
  3239. return the.PreviousStepIndex;
  3240. }
  3241. the.destroy = function() {
  3242. return _destroy();
  3243. }
  3244. // Event API
  3245. the.on = function(name, handler) {
  3246. return KTEventHandler.on(the.element, name, handler);
  3247. }
  3248. the.one = function(name, handler) {
  3249. return KTEventHandler.one(the.element, name, handler);
  3250. }
  3251. the.off = function(name, handlerId) {
  3252. return KTEventHandler.off(the.element, name, handlerId);
  3253. }
  3254. the.trigger = function(name, event) {
  3255. return KTEventHandler.trigger(the.element, name, event, the, event);
  3256. }
  3257. };
  3258. // Static methods
  3259. KTStepper.getInstance = function(element) {
  3260. if ( element !== null && KTUtil.data(element).has('stepper') ) {
  3261. return KTUtil.data(element).get('stepper');
  3262. } else {
  3263. return null;
  3264. }
  3265. }
  3266. // Webpack support
  3267. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  3268. module.exports = KTStepper;
  3269. }
  3270. "use strict";
  3271. // Class definition
  3272. var KTSticky = function(element, options) {
  3273. ////////////////////////////
  3274. // ** Private Variables ** //
  3275. ////////////////////////////
  3276. var the = this;
  3277. if ( typeof element === "undefined" || element === null ) {
  3278. return;
  3279. }
  3280. // Default Options
  3281. var defaultOptions = {
  3282. offset: 200,
  3283. reverse: false,
  3284. animation: true,
  3285. animationSpeed: '0.3s',
  3286. animationClass: 'animation-slide-in-down'
  3287. };
  3288. ////////////////////////////
  3289. // ** Private Methods ** //
  3290. ////////////////////////////
  3291. var _construct = function() {
  3292. if ( KTUtil.data(element).has('sticky') === true ) {
  3293. the = KTUtil.data(element).get('sticky');
  3294. } else {
  3295. _init();
  3296. }
  3297. }
  3298. var _init = function() {
  3299. the.element = element;
  3300. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  3301. the.uid = KTUtil.getUniqueId('sticky');
  3302. the.name = the.element.getAttribute('data-kt-sticky-name');
  3303. the.attributeName = 'data-kt-sticky-' + the.name;
  3304. the.attributeName2 = 'data-kt-' + the.name;
  3305. the.eventTriggerState = true;
  3306. the.lastScrollTop = 0;
  3307. the.scrollHandler;
  3308. // Set initialized
  3309. the.element.setAttribute('data-kt-sticky', 'true');
  3310. // Event Handlers
  3311. window.addEventListener('scroll', _scroll);
  3312. // Initial Launch
  3313. _scroll();
  3314. // Bind Instance
  3315. KTUtil.data(the.element).set('sticky', the);
  3316. }
  3317. var _scroll = function(e) {
  3318. var offset = _getOption('offset');
  3319. var reverse = _getOption('reverse');
  3320. var st;
  3321. var attrName;
  3322. var diff;
  3323. // Exit if false
  3324. if ( offset === false ) {
  3325. return;
  3326. }
  3327. offset = parseInt(offset);
  3328. st = KTUtil.getScrollTop();
  3329. diff = document.documentElement.scrollHeight - window.innerHeight - KTUtil.getScrollTop();
  3330. if ( reverse === true ) { // Release on reverse scroll mode
  3331. if ( st > offset) {
  3332. if ( document.body.hasAttribute(the.attributeName) === false) {
  3333. if (_enable() === false) {
  3334. return;
  3335. }
  3336. document.body.setAttribute(the.attributeName, 'on');
  3337. document.body.setAttribute(the.attributeName2, 'on');
  3338. }
  3339. if ( the.eventTriggerState === true ) {
  3340. KTEventHandler.trigger(the.element, 'kt.sticky.on', the);
  3341. KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
  3342. the.eventTriggerState = false;
  3343. }
  3344. } else { // Back scroll mode
  3345. if ( document.body.hasAttribute(the.attributeName) === true) {
  3346. _disable();
  3347. document.body.removeAttribute(the.attributeName);
  3348. document.body.removeAttribute(the.attributeName2);
  3349. }
  3350. if ( the.eventTriggerState === false ) {
  3351. KTEventHandler.trigger(the.element, 'kt.sticky.off', the);
  3352. KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
  3353. the.eventTriggerState = true;
  3354. }
  3355. }
  3356. the.lastScrollTop = st;
  3357. } else { // Classic scroll mode
  3358. if ( st > offset) {
  3359. if ( document.body.hasAttribute(the.attributeName) === false) {
  3360. if (_enable() === false) {
  3361. return;
  3362. }
  3363. document.body.setAttribute(the.attributeName, 'on');
  3364. document.body.setAttribute(the.attributeName2, 'on');
  3365. }
  3366. if ( the.eventTriggerState === true ) {
  3367. KTEventHandler.trigger(the.element, 'kt.sticky.on', the);
  3368. KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
  3369. the.eventTriggerState = false;
  3370. }
  3371. } else { // back scroll mode
  3372. if ( document.body.hasAttribute(the.attributeName) === true ) {
  3373. _disable();
  3374. document.body.removeAttribute(the.attributeName);
  3375. document.body.removeAttribute(the.attributeName2);
  3376. }
  3377. if ( the.eventTriggerState === false ) {
  3378. KTEventHandler.trigger(the.element, 'kt.sticky.off', the);
  3379. KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
  3380. the.eventTriggerState = true;
  3381. }
  3382. }
  3383. }
  3384. }
  3385. var _enable = function(update) {
  3386. var top = _getOption('top');
  3387. top = top ? parseInt(top) : 0;
  3388. var left = _getOption('left');
  3389. var right = _getOption('right');
  3390. var width = _getOption('width');
  3391. var zindex = _getOption('zindex');
  3392. var dependencies = _getOption('dependencies');
  3393. var classes = _getOption('class');
  3394. var height = _calculateHeight();
  3395. var heightOffset = _getOption('height-offset');
  3396. heightOffset = heightOffset ? parseInt(heightOffset) : 0;
  3397. if (height + heightOffset + top > KTUtil.getViewPort().height) {
  3398. return false;
  3399. }
  3400. if ( update !== true && _getOption('animation') === true ) {
  3401. KTUtil.css(the.element, 'animationDuration', _getOption('animationSpeed'));
  3402. KTUtil.animateClass(the.element, 'animation ' + _getOption('animationClass'));
  3403. }
  3404. if ( classes !== null ) {
  3405. KTUtil.addClass(the.element, classes);
  3406. }
  3407. if ( zindex !== null ) {
  3408. KTUtil.css(the.element, 'z-index', zindex);
  3409. KTUtil.css(the.element, 'position', 'fixed');
  3410. }
  3411. if ( top > 0 ) {
  3412. KTUtil.css(the.element, 'top', String(top) + 'px');
  3413. }
  3414. if ( width !== null ) {
  3415. if (width['target']) {
  3416. var targetElement = document.querySelector(width['target']);
  3417. if (targetElement) {
  3418. width = KTUtil.css(targetElement, 'width');
  3419. }
  3420. }
  3421. KTUtil.css(the.element, 'width', width);
  3422. }
  3423. if ( left !== null ) {
  3424. if ( String(left).toLowerCase() === 'auto' ) {
  3425. var offsetLeft = KTUtil.offset(the.element).left;
  3426. if ( offsetLeft > 0 ) {
  3427. KTUtil.css(the.element, 'left', String(offsetLeft) + 'px');
  3428. }
  3429. } else {
  3430. KTUtil.css(the.element, 'left', left);
  3431. }
  3432. }
  3433. if ( right !== null ) {
  3434. KTUtil.css(the.element, 'right', right);
  3435. }
  3436. // Height dependencies
  3437. if ( dependencies !== null ) {
  3438. var dependencyElements = document.querySelectorAll(dependencies);
  3439. if ( dependencyElements && dependencyElements.length > 0 ) {
  3440. for ( var i = 0, len = dependencyElements.length; i < len; i++ ) {
  3441. KTUtil.css(dependencyElements[i], 'padding-top', String(height) + 'px');
  3442. }
  3443. }
  3444. }
  3445. }
  3446. var _disable = function() {
  3447. KTUtil.css(the.element, 'top', '');
  3448. KTUtil.css(the.element, 'width', '');
  3449. KTUtil.css(the.element, 'left', '');
  3450. KTUtil.css(the.element, 'right', '');
  3451. KTUtil.css(the.element, 'z-index', '');
  3452. KTUtil.css(the.element, 'position', '');
  3453. var dependencies = _getOption('dependencies');
  3454. var classes = _getOption('class');
  3455. if ( classes !== null ) {
  3456. KTUtil.removeClass(the.element, classes);
  3457. }
  3458. // Height dependencies
  3459. if ( dependencies !== null ) {
  3460. var dependencyElements = document.querySelectorAll(dependencies);
  3461. if ( dependencyElements && dependencyElements.length > 0 ) {
  3462. for ( var i = 0, len = dependencyElements.length; i < len; i++ ) {
  3463. KTUtil.css(dependencyElements[i], 'padding-top', '');
  3464. }
  3465. }
  3466. }
  3467. }
  3468. var _check = function() {
  3469. }
  3470. var _calculateHeight = function() {
  3471. var height = parseFloat(KTUtil.css(the.element, 'height'));
  3472. height = height + parseFloat(KTUtil.css(the.element, 'margin-top'));
  3473. height = height + parseFloat(KTUtil.css(the.element, 'margin-bottom'));
  3474. if (KTUtil.css(element, 'border-top')) {
  3475. height = height + parseFloat(KTUtil.css(the.element, 'border-top'));
  3476. }
  3477. if (KTUtil.css(element, 'border-bottom')) {
  3478. height = height + parseFloat(KTUtil.css(the.element, 'border-bottom'));
  3479. }
  3480. return height;
  3481. }
  3482. var _getOption = function(name) {
  3483. if ( the.element.hasAttribute('data-kt-sticky-' + name) === true ) {
  3484. var attr = the.element.getAttribute('data-kt-sticky-' + name);
  3485. var value = KTUtil.getResponsiveValue(attr);
  3486. if ( value !== null && String(value) === 'true' ) {
  3487. value = true;
  3488. } else if ( value !== null && String(value) === 'false' ) {
  3489. value = false;
  3490. }
  3491. return value;
  3492. } else {
  3493. var optionName = KTUtil.snakeToCamel(name);
  3494. if ( the.options[optionName] ) {
  3495. return KTUtil.getResponsiveValue(the.options[optionName]);
  3496. } else {
  3497. return null;
  3498. }
  3499. }
  3500. }
  3501. var _destroy = function() {
  3502. window.removeEventListener('scroll', _scroll);
  3503. KTUtil.data(the.element).remove('sticky');
  3504. }
  3505. // Construct Class
  3506. _construct();
  3507. ///////////////////////
  3508. // ** Public API ** //
  3509. ///////////////////////
  3510. // Methods
  3511. the.update = function() {
  3512. if ( document.body.hasAttribute(the.attributeName) === true ) {
  3513. _disable();
  3514. document.body.removeAttribute(the.attributeName);
  3515. document.body.removeAttribute(the.attributeName2);
  3516. _enable(true);
  3517. document.body.setAttribute(the.attributeName, 'on');
  3518. document.body.setAttribute(the.attributeName2, 'on');
  3519. }
  3520. }
  3521. the.destroy = function() {
  3522. return _destroy();
  3523. }
  3524. // Event API
  3525. the.on = function(name, handler) {
  3526. return KTEventHandler.on(the.element, name, handler);
  3527. }
  3528. the.one = function(name, handler) {
  3529. return KTEventHandler.one(the.element, name, handler);
  3530. }
  3531. the.off = function(name, handlerId) {
  3532. return KTEventHandler.off(the.element, name, handlerId);
  3533. }
  3534. the.trigger = function(name, event) {
  3535. return KTEventHandler.trigger(the.element, name, event, the, event);
  3536. }
  3537. };
  3538. // Static methods
  3539. KTSticky.getInstance = function(element) {
  3540. if ( element !== null && KTUtil.data(element).has('sticky') ) {
  3541. return KTUtil.data(element).get('sticky');
  3542. } else {
  3543. return null;
  3544. }
  3545. }
  3546. // Create instances
  3547. KTSticky.createInstances = function(selector = '[data-kt-sticky="true"]') {
  3548. // Initialize Menus
  3549. var elements = document.body.querySelectorAll(selector);
  3550. var sticky;
  3551. if ( elements && elements.length > 0 ) {
  3552. for (var i = 0, len = elements.length; i < len; i++) {
  3553. sticky = new KTSticky(elements[i]);
  3554. }
  3555. }
  3556. }
  3557. // Window resize handler
  3558. KTSticky.handleResize = function() {
  3559. window.addEventListener('resize', function() {
  3560. var timer;
  3561. KTUtil.throttle(timer, function() {
  3562. // Locate and update Offcanvas instances on window resize
  3563. var elements = document.body.querySelectorAll('[data-kt-sticky="true"]');
  3564. if ( elements && elements.length > 0 ) {
  3565. for (var i = 0, len = elements.length; i < len; i++) {
  3566. var sticky = KTSticky.getInstance(elements[i]);
  3567. if (sticky) {
  3568. sticky.update();
  3569. }
  3570. }
  3571. }
  3572. }, 200);
  3573. });
  3574. }
  3575. // Global initialization
  3576. KTSticky.init = function() {
  3577. KTSticky.createInstances();
  3578. KTSticky.handleResize();
  3579. };
  3580. // Webpack support
  3581. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  3582. module.exports = KTSticky;
  3583. }
  3584. "use strict";
  3585. // Class definition
  3586. var KTSwapper = function(element, options) {
  3587. ////////////////////////////
  3588. // ** Private Variables ** //
  3589. ////////////////////////////
  3590. var the = this;
  3591. if ( typeof element === "undefined" || element === null ) {
  3592. return;
  3593. }
  3594. // Default Options
  3595. var defaultOptions = {
  3596. mode: 'append'
  3597. };
  3598. ////////////////////////////
  3599. // ** Private Methods ** //
  3600. ////////////////////////////
  3601. var _construct = function() {
  3602. if ( KTUtil.data(element).has('swapper') === true ) {
  3603. the = KTUtil.data(element).get('swapper');
  3604. } else {
  3605. _init();
  3606. }
  3607. }
  3608. var _init = function() {
  3609. the.element = element;
  3610. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  3611. // Set initialized
  3612. the.element.setAttribute('data-kt-swapper', 'true');
  3613. // Initial update
  3614. _update();
  3615. // Bind Instance
  3616. KTUtil.data(the.element).set('swapper', the);
  3617. }
  3618. var _update = function(e) {
  3619. var parentSelector = _getOption('parent');
  3620. var mode = _getOption('mode');
  3621. var parentElement = parentSelector ? document.querySelector(parentSelector) : null;
  3622. if (parentElement && element.parentNode !== parentElement) {
  3623. if (mode === 'prepend') {
  3624. parentElement.prepend(element);
  3625. } else if (mode === 'append') {
  3626. parentElement.append(element);
  3627. }
  3628. }
  3629. }
  3630. var _getOption = function(name) {
  3631. if ( the.element.hasAttribute('data-kt-swapper-' + name) === true ) {
  3632. var attr = the.element.getAttribute('data-kt-swapper-' + name);
  3633. var value = KTUtil.getResponsiveValue(attr);
  3634. if ( value !== null && String(value) === 'true' ) {
  3635. value = true;
  3636. } else if ( value !== null && String(value) === 'false' ) {
  3637. value = false;
  3638. }
  3639. return value;
  3640. } else {
  3641. var optionName = KTUtil.snakeToCamel(name);
  3642. if ( the.options[optionName] ) {
  3643. return KTUtil.getResponsiveValue(the.options[optionName]);
  3644. } else {
  3645. return null;
  3646. }
  3647. }
  3648. }
  3649. var _destroy = function() {
  3650. KTUtil.data(the.element).remove('swapper');
  3651. }
  3652. // Construct Class
  3653. _construct();
  3654. ///////////////////////
  3655. // ** Public API ** //
  3656. ///////////////////////
  3657. // Methods
  3658. the.update = function() {
  3659. _update();
  3660. }
  3661. the.destroy = function() {
  3662. return _destroy();
  3663. }
  3664. // Event API
  3665. the.on = function(name, handler) {
  3666. return KTEventHandler.on(the.element, name, handler);
  3667. }
  3668. the.one = function(name, handler) {
  3669. return KTEventHandler.one(the.element, name, handler);
  3670. }
  3671. the.off = function(name, handlerId) {
  3672. return KTEventHandler.off(the.element, name, handlerId);
  3673. }
  3674. the.trigger = function(name, event) {
  3675. return KTEventHandler.trigger(the.element, name, event, the, event);
  3676. }
  3677. };
  3678. // Static methods
  3679. KTSwapper.getInstance = function(element) {
  3680. if ( element !== null && KTUtil.data(element).has('swapper') ) {
  3681. return KTUtil.data(element).get('swapper');
  3682. } else {
  3683. return null;
  3684. }
  3685. }
  3686. // Create instances
  3687. KTSwapper.createInstances = function(selector = '[data-kt-swapper="true"]') {
  3688. // Initialize Menus
  3689. var elements = document.querySelectorAll(selector);
  3690. var swapper;
  3691. if ( elements && elements.length > 0 ) {
  3692. for (var i = 0, len = elements.length; i < len; i++) {
  3693. swapper = new KTSwapper(elements[i]);
  3694. }
  3695. }
  3696. }
  3697. // Window resize handler
  3698. window.addEventListener('resize', function() {
  3699. var timer;
  3700. KTUtil.throttle(timer, function() {
  3701. // Locate and update Offcanvas instances on window resize
  3702. var elements = document.querySelectorAll('[data-kt-swapper="true"]');
  3703. if ( elements && elements.length > 0 ) {
  3704. for (var i = 0, len = elements.length; i < len; i++) {
  3705. var swapper = KTSwapper.getInstance(elements[i]);
  3706. if (swapper) {
  3707. swapper.update();
  3708. }
  3709. }
  3710. }
  3711. }, 200);
  3712. });
  3713. // Global initialization
  3714. KTSwapper.init = function() {
  3715. KTSwapper.createInstances();
  3716. };
  3717. // Webpack support
  3718. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  3719. module.exports = KTSwapper;
  3720. }
  3721. "use strict";
  3722. // Class definition
  3723. var KTToggle = function(element, options) {
  3724. ////////////////////////////
  3725. // ** Private variables ** //
  3726. ////////////////////////////
  3727. var the = this;
  3728. if (!element) {
  3729. return;
  3730. }
  3731. // Default Options
  3732. var defaultOptions = {
  3733. saveState: true
  3734. };
  3735. ////////////////////////////
  3736. // ** Private methods ** //
  3737. ////////////////////////////
  3738. var _construct = function() {
  3739. if ( KTUtil.data(element).has('toggle') === true ) {
  3740. the = KTUtil.data(element).get('toggle');
  3741. } else {
  3742. _init();
  3743. }
  3744. }
  3745. var _init = function() {
  3746. // Variables
  3747. the.options = KTUtil.deepExtend({}, defaultOptions, options);
  3748. the.uid = KTUtil.getUniqueId('toggle');
  3749. // Elements
  3750. the.element = element;
  3751. the.target = document.querySelector(the.element.getAttribute('data-kt-toggle-target')) ? document.querySelector(the.element.getAttribute('data-kt-toggle-target')) : the.element;
  3752. the.state = the.element.hasAttribute('data-kt-toggle-state') ? the.element.getAttribute('data-kt-toggle-state') : '';
  3753. the.mode = the.element.hasAttribute('data-kt-toggle-mode') ? the.element.getAttribute('data-kt-toggle-mode') : '';
  3754. the.attribute = 'data-kt-' + the.element.getAttribute('data-kt-toggle-name');
  3755. // Event Handlers
  3756. _handlers();
  3757. // Bind Instance
  3758. KTUtil.data(the.element).set('toggle', the);
  3759. }
  3760. var _handlers = function() {
  3761. KTUtil.addEvent(the.element, 'click', function(e) {
  3762. e.preventDefault();
  3763. if ( the.mode !== '' ) {
  3764. if ( the.mode === 'off' && _isEnabled() === false ) {
  3765. _toggle();
  3766. } else if ( the.mode === 'on' && _isEnabled() === true ) {
  3767. _toggle();
  3768. }
  3769. } else {
  3770. _toggle();
  3771. }
  3772. });
  3773. }
  3774. // Event handlers
  3775. var _toggle = function() {
  3776. // Trigger "after.toggle" event
  3777. KTEventHandler.trigger(the.element, 'kt.toggle.change', the);
  3778. if ( _isEnabled() ) {
  3779. _disable();
  3780. } else {
  3781. _enable();
  3782. }
  3783. // Trigger "before.toggle" event
  3784. KTEventHandler.trigger(the.element, 'kt.toggle.changed', the);
  3785. return the;
  3786. }
  3787. var _enable = function() {
  3788. if ( _isEnabled() === true ) {
  3789. return;
  3790. }
  3791. KTEventHandler.trigger(the.element, 'kt.toggle.enable', the);
  3792. the.target.setAttribute(the.attribute, 'on');
  3793. if (the.state.length > 0) {
  3794. the.element.classList.add(the.state);
  3795. }
  3796. if ( typeof KTCookie !== 'undefined' && the.options.saveState === true ) {
  3797. KTCookie.set(the.attribute, 'on');
  3798. }
  3799. KTEventHandler.trigger(the.element, 'kt.toggle.enabled', the);
  3800. return the;
  3801. }
  3802. var _disable = function() {
  3803. if ( _isEnabled() === false ) {
  3804. return;
  3805. }
  3806. KTEventHandler.trigger(the.element, 'kt.toggle.disable', the);
  3807. the.target.removeAttribute(the.attribute);
  3808. if (the.state.length > 0) {
  3809. the.element.classList.remove(the.state);
  3810. }
  3811. if ( typeof KTCookie !== 'undefined' && the.options.saveState === true ) {
  3812. KTCookie.remove(the.attribute);
  3813. }
  3814. KTEventHandler.trigger(the.element, 'kt.toggle.disabled', the);
  3815. return the;
  3816. }
  3817. var _isEnabled = function() {
  3818. return (String(the.target.getAttribute(the.attribute)).toLowerCase() === 'on');
  3819. }
  3820. var _destroy = function() {
  3821. KTUtil.data(the.element).remove('toggle');
  3822. }
  3823. // Construct class
  3824. _construct();
  3825. ///////////////////////
  3826. // ** Public API ** //
  3827. ///////////////////////
  3828. // Plugin API
  3829. the.toggle = function() {
  3830. return _toggle();
  3831. }
  3832. the.enable = function() {
  3833. return _enable();
  3834. }
  3835. the.disable = function() {
  3836. return _disable();
  3837. }
  3838. the.isEnabled = function() {
  3839. return _isEnabled();
  3840. }
  3841. the.goElement = function() {
  3842. return the.element;
  3843. }
  3844. the.destroy = function() {
  3845. return _destroy();
  3846. }
  3847. // Event API
  3848. the.on = function(name, handler) {
  3849. return KTEventHandler.on(the.element, name, handler);
  3850. }
  3851. the.one = function(name, handler) {
  3852. return KTEventHandler.one(the.element, name, handler);
  3853. }
  3854. the.off = function(name, handlerId) {
  3855. return KTEventHandler.off(the.element, name, handlerId);
  3856. }
  3857. the.trigger = function(name, event) {
  3858. return KTEventHandler.trigger(the.element, name, event, the, event);
  3859. }
  3860. };
  3861. // Static methods
  3862. KTToggle.getInstance = function(element) {
  3863. if ( element !== null && KTUtil.data(element).has('toggle') ) {
  3864. return KTUtil.data(element).get('toggle');
  3865. } else {
  3866. return null;
  3867. }
  3868. }
  3869. // Create instances
  3870. KTToggle.createInstances = function(selector = '[data-kt-toggle]') {
  3871. // Get instances
  3872. var elements = document.body.querySelectorAll(selector);
  3873. if ( elements && elements.length > 0 ) {
  3874. for (var i = 0, len = elements.length; i < len; i++) {
  3875. // Initialize instances
  3876. new KTToggle(elements[i]);
  3877. }
  3878. }
  3879. }
  3880. // Global initialization
  3881. KTToggle.init = function() {
  3882. KTToggle.createInstances();
  3883. };
  3884. // Webpack support
  3885. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  3886. module.exports = KTToggle;
  3887. }
  3888. "use strict";
  3889. /**
  3890. * @class KTUtil base utilize class that privides helper functions
  3891. */
  3892. // Polyfills
  3893. // Element.matches() polyfill
  3894. if (!Element.prototype.matches) {
  3895. Element.prototype.matches = function(s) {
  3896. var matches = (this.document || this.ownerDocument).querySelectorAll(s),
  3897. i = matches.length;
  3898. while (--i >= 0 && matches.item(i) !== this) {}
  3899. return i > -1;
  3900. };
  3901. }
  3902. /**
  3903. * Element.closest() polyfill
  3904. * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
  3905. */
  3906. if (!Element.prototype.closest) {
  3907. Element.prototype.closest = function (s) {
  3908. var el = this;
  3909. var ancestor = this;
  3910. if (!document.documentElement.contains(el)) return null;
  3911. do {
  3912. if (ancestor.matches(s)) return ancestor;
  3913. ancestor = ancestor.parentElement;
  3914. } while (ancestor !== null);
  3915. return null;
  3916. };
  3917. }
  3918. /**
  3919. * ChildNode.remove() polyfill
  3920. * https://gomakethings.com/removing-an-element-from-the-dom-the-es6-way/
  3921. * @author Chris Ferdinandi
  3922. * @license MIT
  3923. */
  3924. (function (elem) {
  3925. for (var i = 0; i < elem.length; i++) {
  3926. if (!window[elem[i]] || 'remove' in window[elem[i]].prototype) continue;
  3927. window[elem[i]].prototype.remove = function () {
  3928. this.parentNode.removeChild(this);
  3929. };
  3930. }
  3931. })(['Element', 'CharacterData', 'DocumentType']);
  3932. //
  3933. // requestAnimationFrame polyfill by Erik Möller.
  3934. // With fixes from Paul Irish and Tino Zijdel
  3935. //
  3936. // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
  3937. // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
  3938. //
  3939. // MIT license
  3940. //
  3941. (function() {
  3942. var lastTime = 0;
  3943. var vendors = ['webkit', 'moz'];
  3944. for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
  3945. window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
  3946. window.cancelAnimationFrame =
  3947. window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
  3948. }
  3949. if (!window.requestAnimationFrame)
  3950. window.requestAnimationFrame = function(callback) {
  3951. var currTime = new Date().getTime();
  3952. var timeToCall = Math.max(0, 16 - (currTime - lastTime));
  3953. var id = window.setTimeout(function() {
  3954. callback(currTime + timeToCall);
  3955. }, timeToCall);
  3956. lastTime = currTime + timeToCall;
  3957. return id;
  3958. };
  3959. if (!window.cancelAnimationFrame)
  3960. window.cancelAnimationFrame = function(id) {
  3961. clearTimeout(id);
  3962. };
  3963. }());
  3964. // Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/prepend()/prepend().md
  3965. (function(arr) {
  3966. arr.forEach(function(item) {
  3967. if (item.hasOwnProperty('prepend')) {
  3968. return;
  3969. }
  3970. Object.defineProperty(item, 'prepend', {
  3971. configurable: true,
  3972. enumerable: true,
  3973. writable: true,
  3974. value: function prepend() {
  3975. var argArr = Array.prototype.slice.call(arguments),
  3976. docFrag = document.createDocumentFragment();
  3977. argArr.forEach(function(argItem) {
  3978. var isNode = argItem instanceof Node;
  3979. docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));
  3980. });
  3981. this.insertBefore(docFrag, this.firstChild);
  3982. }
  3983. });
  3984. });
  3985. })([Element.prototype, Document.prototype, DocumentFragment.prototype]);
  3986. // getAttributeNames
  3987. if (Element.prototype.getAttributeNames == undefined) {
  3988. Element.prototype.getAttributeNames = function () {
  3989. var attributes = this.attributes;
  3990. var length = attributes.length;
  3991. var result = new Array(length);
  3992. for (var i = 0; i < length; i++) {
  3993. result[i] = attributes[i].name;
  3994. }
  3995. return result;
  3996. };
  3997. }
  3998. // Global variables
  3999. window.KTUtilElementDataStore = {};
  4000. window.KTUtilElementDataStoreID = 0;
  4001. window.KTUtilDelegatedEventHandlers = {};
  4002. var KTUtil = function() {
  4003. var resizeHandlers = [];
  4004. /**
  4005. * Handle window resize event with some
  4006. * delay to attach event handlers upon resize complete
  4007. */
  4008. var _windowResizeHandler = function() {
  4009. var _runResizeHandlers = function() {
  4010. // reinitialize other subscribed elements
  4011. for (var i = 0; i < resizeHandlers.length; i++) {
  4012. var each = resizeHandlers[i];
  4013. each.call();
  4014. }
  4015. };
  4016. var timer;
  4017. window.addEventListener('resize', function() {
  4018. KTUtil.throttle(timer, function() {
  4019. _runResizeHandlers();
  4020. }, 200);
  4021. });
  4022. };
  4023. return {
  4024. /**
  4025. * Class main initializer.
  4026. * @param {object} settings.
  4027. * @returns null
  4028. */
  4029. //main function to initiate the theme
  4030. init: function(settings) {
  4031. _windowResizeHandler();
  4032. },
  4033. /**
  4034. * Adds window resize event handler.
  4035. * @param {function} callback function.
  4036. */
  4037. addResizeHandler: function(callback) {
  4038. resizeHandlers.push(callback);
  4039. },
  4040. /**
  4041. * Removes window resize event handler.
  4042. * @param {function} callback function.
  4043. */
  4044. removeResizeHandler: function(callback) {
  4045. for (var i = 0; i < resizeHandlers.length; i++) {
  4046. if (callback === resizeHandlers[i]) {
  4047. delete resizeHandlers[i];
  4048. }
  4049. }
  4050. },
  4051. /**
  4052. * Trigger window resize handlers.
  4053. */
  4054. runResizeHandlers: function() {
  4055. _runResizeHandlers();
  4056. },
  4057. resize: function() {
  4058. if (typeof(Event) === 'function') {
  4059. // modern browsers
  4060. window.dispatchEvent(new Event('resize'));
  4061. } else {
  4062. // for IE and other old browsers
  4063. // causes deprecation warning on modern browsers
  4064. var evt = window.document.createEvent('UIEvents');
  4065. evt.initUIEvent('resize', true, false, window, 0);
  4066. window.dispatchEvent(evt);
  4067. }
  4068. },
  4069. /**
  4070. * Get GET parameter value from URL.
  4071. * @param {string} paramName Parameter name.
  4072. * @returns {string}
  4073. */
  4074. getURLParam: function(paramName) {
  4075. var searchString = window.location.search.substring(1),
  4076. i, val, params = searchString.split("&");
  4077. for (i = 0; i < params.length; i++) {
  4078. val = params[i].split("=");
  4079. if (val[0] == paramName) {
  4080. return unescape(val[1]);
  4081. }
  4082. }
  4083. return null;
  4084. },
  4085. /**
  4086. * Checks whether current device is mobile touch.
  4087. * @returns {boolean}
  4088. */
  4089. isMobileDevice: function() {
  4090. var test = (this.getViewPort().width < this.getBreakpoint('lg') ? true : false);
  4091. if (test === false) {
  4092. // For use within normal web clients
  4093. test = navigator.userAgent.match(/iPad/i) != null;
  4094. }
  4095. return test;
  4096. },
  4097. /**
  4098. * Checks whether current device is desktop.
  4099. * @returns {boolean}
  4100. */
  4101. isDesktopDevice: function() {
  4102. return KTUtil.isMobileDevice() ? false : true;
  4103. },
  4104. /**
  4105. * Gets browser window viewport size. Ref:
  4106. * http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/
  4107. * @returns {object}
  4108. */
  4109. getViewPort: function() {
  4110. var e = window,
  4111. a = 'inner';
  4112. if (!('innerWidth' in window)) {
  4113. a = 'client';
  4114. e = document.documentElement || document.body;
  4115. }
  4116. return {
  4117. width: e[a + 'Width'],
  4118. height: e[a + 'Height']
  4119. };
  4120. },
  4121. /**
  4122. * Checks whether given device mode is currently activated.
  4123. * @param {string} mode Responsive mode name(e.g: desktop,
  4124. * desktop-and-tablet, tablet, tablet-and-mobile, mobile)
  4125. * @returns {boolean}
  4126. */
  4127. isBreakpointUp: function(mode) {
  4128. var width = this.getViewPort().width;
  4129. var breakpoint = this.getBreakpoint(mode);
  4130. return (width >= breakpoint);
  4131. },
  4132. isBreakpointDown: function(mode) {
  4133. var width = this.getViewPort().width;
  4134. var breakpoint = this.getBreakpoint(mode);
  4135. return (width < breakpoint);
  4136. },
  4137. getViewportWidth: function() {
  4138. return this.getViewPort().width;
  4139. },
  4140. /**
  4141. * Generates unique ID for give prefix.
  4142. * @param {string} prefix Prefix for generated ID
  4143. * @returns {boolean}
  4144. */
  4145. getUniqueId: function(prefix) {
  4146. return prefix + Math.floor(Math.random() * (new Date()).getTime());
  4147. },
  4148. /**
  4149. * Gets window width for give breakpoint mode.
  4150. * @param {string} mode Responsive mode name(e.g: xl, lg, md, sm)
  4151. * @returns {number}
  4152. */
  4153. getBreakpoint: function(breakpoint) {
  4154. var value = this.getCssVariableValue('--kt-' + breakpoint);
  4155. if ( value ) {
  4156. value = parseInt(value.trim());
  4157. }
  4158. return value;
  4159. },
  4160. /**
  4161. * Checks whether object has property matchs given key path.
  4162. * @param {object} obj Object contains values paired with given key path
  4163. * @param {string} keys Keys path seperated with dots
  4164. * @returns {object}
  4165. */
  4166. isset: function(obj, keys) {
  4167. var stone;
  4168. keys = keys || '';
  4169. if (keys.indexOf('[') !== -1) {
  4170. throw new Error('Unsupported object path notation.');
  4171. }
  4172. keys = keys.split('.');
  4173. do {
  4174. if (obj === undefined) {
  4175. return false;
  4176. }
  4177. stone = keys.shift();
  4178. if (!obj.hasOwnProperty(stone)) {
  4179. return false;
  4180. }
  4181. obj = obj[stone];
  4182. } while (keys.length);
  4183. return true;
  4184. },
  4185. /**
  4186. * Gets highest z-index of the given element parents
  4187. * @param {object} el jQuery element object
  4188. * @returns {number}
  4189. */
  4190. getHighestZindex: function(el) {
  4191. var position, value;
  4192. while (el && el !== document) {
  4193. // Ignore z-index if position is set to a value where z-index is ignored by the browser
  4194. // This makes behavior of this function consistent across browsers
  4195. // WebKit always returns auto if the element is positioned
  4196. position = KTUtil.css(el, 'position');
  4197. if (position === "absolute" || position === "relative" || position === "fixed") {
  4198. // IE returns 0 when zIndex is not specified
  4199. // other browsers return a string
  4200. // we ignore the case of nested elements with an explicit value of 0
  4201. // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
  4202. value = parseInt(KTUtil.css(el, 'z-index'));
  4203. if (!isNaN(value) && value !== 0) {
  4204. return value;
  4205. }
  4206. }
  4207. el = el.parentNode;
  4208. }
  4209. return 1;
  4210. },
  4211. /**
  4212. * Checks whether the element has any parent with fixed positionfreg
  4213. * @param {object} el jQuery element object
  4214. * @returns {boolean}
  4215. */
  4216. hasFixedPositionedParent: function(el) {
  4217. var position;
  4218. while (el && el !== document) {
  4219. position = KTUtil.css(el, 'position');
  4220. if (position === "fixed") {
  4221. return true;
  4222. }
  4223. el = el.parentNode;
  4224. }
  4225. return false;
  4226. },
  4227. /**
  4228. * Simulates delay
  4229. */
  4230. sleep: function(milliseconds) {
  4231. var start = new Date().getTime();
  4232. for (var i = 0; i < 1e7; i++) {
  4233. if ((new Date().getTime() - start) > milliseconds) {
  4234. break;
  4235. }
  4236. }
  4237. },
  4238. /**
  4239. * Gets randomly generated integer value within given min and max range
  4240. * @param {number} min Range start value
  4241. * @param {number} max Range end value
  4242. * @returns {number}
  4243. */
  4244. getRandomInt: function(min, max) {
  4245. return Math.floor(Math.random() * (max - min + 1)) + min;
  4246. },
  4247. /**
  4248. * Checks whether Angular library is included
  4249. * @returns {boolean}
  4250. */
  4251. isAngularVersion: function() {
  4252. return window.Zone !== undefined ? true : false;
  4253. },
  4254. // Deep extend: $.extend(true, {}, objA, objB);
  4255. deepExtend: function(out) {
  4256. out = out || {};
  4257. for (var i = 1; i < arguments.length; i++) {
  4258. var obj = arguments[i];
  4259. if (!obj) continue;
  4260. for (var key in obj) {
  4261. if (!obj.hasOwnProperty(key)) {
  4262. continue;
  4263. }
  4264. // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
  4265. if ( Object.prototype.toString.call(obj[key]) === '[object Object]' ) {
  4266. out[key] = KTUtil.deepExtend(out[key], obj[key]);
  4267. continue;
  4268. }
  4269. out[key] = obj[key];
  4270. }
  4271. }
  4272. return out;
  4273. },
  4274. // extend: $.extend({}, objA, objB);
  4275. extend: function(out) {
  4276. out = out || {};
  4277. for (var i = 1; i < arguments.length; i++) {
  4278. if (!arguments[i])
  4279. continue;
  4280. for (var key in arguments[i]) {
  4281. if (arguments[i].hasOwnProperty(key))
  4282. out[key] = arguments[i][key];
  4283. }
  4284. }
  4285. return out;
  4286. },
  4287. getBody: function() {
  4288. return document.getElementsByTagName('body')[0];
  4289. },
  4290. /**
  4291. * Checks whether the element has given classes
  4292. * @param {object} el jQuery element object
  4293. * @param {string} Classes string
  4294. * @returns {boolean}
  4295. */
  4296. hasClasses: function(el, classes) {
  4297. if (!el) {
  4298. return;
  4299. }
  4300. var classesArr = classes.split(" ");
  4301. for (var i = 0; i < classesArr.length; i++) {
  4302. if (KTUtil.hasClass(el, KTUtil.trim(classesArr[i])) == false) {
  4303. return false;
  4304. }
  4305. }
  4306. return true;
  4307. },
  4308. hasClass: function(el, className) {
  4309. if (!el) {
  4310. return;
  4311. }
  4312. return el.classList ? el.classList.contains(className) : new RegExp('\\b' + className + '\\b').test(el.className);
  4313. },
  4314. addClass: function(el, className) {
  4315. if (!el || typeof className === 'undefined') {
  4316. return;
  4317. }
  4318. var classNames = className.split(' ');
  4319. if (el.classList) {
  4320. for (var i = 0; i < classNames.length; i++) {
  4321. if (classNames[i] && classNames[i].length > 0) {
  4322. el.classList.add(KTUtil.trim(classNames[i]));
  4323. }
  4324. }
  4325. } else if (!KTUtil.hasClass(el, className)) {
  4326. for (var x = 0; x < classNames.length; x++) {
  4327. el.className += ' ' + KTUtil.trim(classNames[x]);
  4328. }
  4329. }
  4330. },
  4331. removeClass: function(el, className) {
  4332. if (!el || typeof className === 'undefined') {
  4333. return;
  4334. }
  4335. var classNames = className.split(' ');
  4336. if (el.classList) {
  4337. for (var i = 0; i < classNames.length; i++) {
  4338. el.classList.remove(KTUtil.trim(classNames[i]));
  4339. }
  4340. } else if (KTUtil.hasClass(el, className)) {
  4341. for (var x = 0; x < classNames.length; x++) {
  4342. el.className = el.className.replace(new RegExp('\\b' + KTUtil.trim(classNames[x]) + '\\b', 'g'), '');
  4343. }
  4344. }
  4345. },
  4346. triggerCustomEvent: function(el, eventName, data) {
  4347. var event;
  4348. if (window.CustomEvent) {
  4349. event = new CustomEvent(eventName, {
  4350. detail: data
  4351. });
  4352. } else {
  4353. event = document.createEvent('CustomEvent');
  4354. event.initCustomEvent(eventName, true, true, data);
  4355. }
  4356. el.dispatchEvent(event);
  4357. },
  4358. triggerEvent: function(node, eventName) {
  4359. // Make sure we use the ownerDocument from the provided node to avoid cross-window problems
  4360. var doc;
  4361. if (node.ownerDocument) {
  4362. doc = node.ownerDocument;
  4363. } else if (node.nodeType == 9) {
  4364. // the node may be the document itself, nodeType 9 = DOCUMENT_NODE
  4365. doc = node;
  4366. } else {
  4367. throw new Error("Invalid node passed to fireEvent: " + node.id);
  4368. }
  4369. if (node.dispatchEvent) {
  4370. // Gecko-style approach (now the standard) takes more work
  4371. var eventClass = "";
  4372. // Different events have different event classes.
  4373. // If this switch statement can't map an eventName to an eventClass,
  4374. // the event firing is going to fail.
  4375. switch (eventName) {
  4376. case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead.
  4377. case "mouseenter":
  4378. case "mouseleave":
  4379. case "mousedown":
  4380. case "mouseup":
  4381. eventClass = "MouseEvents";
  4382. break;
  4383. case "focus":
  4384. case "change":
  4385. case "blur":
  4386. case "select":
  4387. eventClass = "HTMLEvents";
  4388. break;
  4389. default:
  4390. throw "fireEvent: Couldn't find an event class for event '" + eventName + "'.";
  4391. break;
  4392. }
  4393. var event = doc.createEvent(eventClass);
  4394. var bubbles = eventName == "change" ? false : true;
  4395. event.initEvent(eventName, bubbles, true); // All events created as bubbling and cancelable.
  4396. event.synthetic = true; // allow detection of synthetic events
  4397. // The second parameter says go ahead with the default action
  4398. node.dispatchEvent(event, true);
  4399. } else if (node.fireEvent) {
  4400. // IE-old school style
  4401. var event = doc.createEventObject();
  4402. event.synthetic = true; // allow detection of synthetic events
  4403. node.fireEvent("on" + eventName, event);
  4404. }
  4405. },
  4406. index: function( el ){
  4407. var c = el.parentNode.children, i = 0;
  4408. for(; i < c.length; i++ )
  4409. if( c[i] == el ) return i;
  4410. },
  4411. trim: function(string) {
  4412. return string.trim();
  4413. },
  4414. eventTriggered: function(e) {
  4415. if (e.currentTarget.dataset.triggered) {
  4416. return true;
  4417. } else {
  4418. e.currentTarget.dataset.triggered = true;
  4419. return false;
  4420. }
  4421. },
  4422. remove: function(el) {
  4423. if (el && el.parentNode) {
  4424. el.parentNode.removeChild(el);
  4425. }
  4426. },
  4427. find: function(parent, query) {
  4428. if ( parent !== null) {
  4429. return parent.querySelector(query);
  4430. } else {
  4431. return null;
  4432. }
  4433. },
  4434. findAll: function(parent, query) {
  4435. if ( parent !== null ) {
  4436. return parent.querySelectorAll(query);
  4437. } else {
  4438. return null;
  4439. }
  4440. },
  4441. insertAfter: function(el, referenceNode) {
  4442. return referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);
  4443. },
  4444. parents: function(elem, selector) {
  4445. // Set up a parent array
  4446. var parents = [];
  4447. // Push each parent element to the array
  4448. for ( ; elem && elem !== document; elem = elem.parentNode ) {
  4449. if (selector) {
  4450. if (elem.matches(selector)) {
  4451. parents.push(elem);
  4452. }
  4453. continue;
  4454. }
  4455. parents.push(elem);
  4456. }
  4457. // Return our parent array
  4458. return parents;
  4459. },
  4460. children: function(el, selector, log) {
  4461. if (!el || !el.childNodes) {
  4462. return null;
  4463. }
  4464. var result = [],
  4465. i = 0,
  4466. l = el.childNodes.length;
  4467. for (var i; i < l; ++i) {
  4468. if (el.childNodes[i].nodeType == 1 && KTUtil.matches(el.childNodes[i], selector, log)) {
  4469. result.push(el.childNodes[i]);
  4470. }
  4471. }
  4472. return result;
  4473. },
  4474. child: function(el, selector, log) {
  4475. var children = KTUtil.children(el, selector, log);
  4476. return children ? children[0] : null;
  4477. },
  4478. matches: function(el, selector, log) {
  4479. var p = Element.prototype;
  4480. var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function(s) {
  4481. return [].indexOf.call(document.querySelectorAll(s), this) !== -1;
  4482. };
  4483. if (el && el.tagName) {
  4484. return f.call(el, selector);
  4485. } else {
  4486. return false;
  4487. }
  4488. },
  4489. data: function(el) {
  4490. return {
  4491. set: function(name, data) {
  4492. if (!el) {
  4493. return;
  4494. }
  4495. if (el.customDataTag === undefined) {
  4496. window.KTUtilElementDataStoreID++;
  4497. el.customDataTag = window.KTUtilElementDataStoreID;
  4498. }
  4499. if (window.KTUtilElementDataStore[el.customDataTag] === undefined) {
  4500. window.KTUtilElementDataStore[el.customDataTag] = {};
  4501. }
  4502. window.KTUtilElementDataStore[el.customDataTag][name] = data;
  4503. },
  4504. get: function(name) {
  4505. if (!el) {
  4506. return;
  4507. }
  4508. if (el.customDataTag === undefined) {
  4509. return null;
  4510. }
  4511. return this.has(name) ? window.KTUtilElementDataStore[el.customDataTag][name] : null;
  4512. },
  4513. has: function(name) {
  4514. if (!el) {
  4515. return false;
  4516. }
  4517. if (el.customDataTag === undefined) {
  4518. return false;
  4519. }
  4520. return (window.KTUtilElementDataStore[el.customDataTag] && window.KTUtilElementDataStore[el.customDataTag][name]) ? true : false;
  4521. },
  4522. remove: function(name) {
  4523. if (el && this.has(name)) {
  4524. delete window.KTUtilElementDataStore[el.customDataTag][name];
  4525. }
  4526. }
  4527. };
  4528. },
  4529. outerWidth: function(el, margin) {
  4530. var width;
  4531. if (margin === true) {
  4532. width = parseFloat(el.offsetWidth);
  4533. width += parseFloat(KTUtil.css(el, 'margin-left')) + parseFloat(KTUtil.css(el, 'margin-right'));
  4534. return parseFloat(width);
  4535. } else {
  4536. width = parseFloat(el.offsetWidth);
  4537. return width;
  4538. }
  4539. },
  4540. offset: function(el) {
  4541. var rect, win;
  4542. if ( !el ) {
  4543. return;
  4544. }
  4545. // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
  4546. // Support: IE <=11 only
  4547. // Running getBoundingClientRect on a
  4548. // disconnected node in IE throws an error
  4549. if ( !el.getClientRects().length ) {
  4550. return { top: 0, left: 0 };
  4551. }
  4552. // Get document-relative position by adding viewport scroll to viewport-relative gBCR
  4553. rect = el.getBoundingClientRect();
  4554. win = el.ownerDocument.defaultView;
  4555. return {
  4556. top: rect.top + win.pageYOffset,
  4557. left: rect.left + win.pageXOffset,
  4558. right: window.innerWidth - (el.offsetLeft + el.offsetWidth)
  4559. };
  4560. },
  4561. height: function(el) {
  4562. return KTUtil.css(el, 'height');
  4563. },
  4564. outerHeight: function(el, withMargin) {
  4565. var height = el.offsetHeight;
  4566. var style;
  4567. if (typeof withMargin !== 'undefined' && withMargin === true) {
  4568. style = getComputedStyle(el);
  4569. height += parseInt(style.marginTop) + parseInt(style.marginBottom);
  4570. return height;
  4571. } else {
  4572. return height;
  4573. }
  4574. },
  4575. visible: function(el) {
  4576. return !(el.offsetWidth === 0 && el.offsetHeight === 0);
  4577. },
  4578. isVisibleInContainer: function (el, container) {
  4579. const eleTop = el.offsetTop;
  4580. const eleBottom = eleTop + el.clientHeight;
  4581. const containerTop = container.scrollTop;
  4582. const containerBottom = containerTop + container.clientHeight;
  4583. // The element is fully visible in the container
  4584. return (
  4585. (eleTop >= containerTop && eleBottom <= containerBottom) ||
  4586. // Some part of the element is visible in the container
  4587. (eleTop < containerTop && containerTop < eleBottom) ||
  4588. (eleTop < containerBottom && containerBottom < eleBottom)
  4589. );
  4590. },
  4591. getRelativeTopPosition: function (el, container) {
  4592. return el.offsetTop - container.offsetTop;
  4593. },
  4594. attr: function(el, name, value) {
  4595. if (el == undefined) {
  4596. return;
  4597. }
  4598. if (value !== undefined) {
  4599. el.setAttribute(name, value);
  4600. } else {
  4601. return el.getAttribute(name);
  4602. }
  4603. },
  4604. hasAttr: function(el, name) {
  4605. if (el == undefined) {
  4606. return;
  4607. }
  4608. return el.getAttribute(name) ? true : false;
  4609. },
  4610. removeAttr: function(el, name) {
  4611. if (el == undefined) {
  4612. return;
  4613. }
  4614. el.removeAttribute(name);
  4615. },
  4616. animate: function(from, to, duration, update, easing, done) {
  4617. /**
  4618. * TinyAnimate.easings
  4619. * Adapted from jQuery Easing
  4620. */
  4621. var easings = {};
  4622. var easing;
  4623. easings.linear = function(t, b, c, d) {
  4624. return c * t / d + b;
  4625. };
  4626. easing = easings.linear;
  4627. // Early bail out if called incorrectly
  4628. if (typeof from !== 'number' ||
  4629. typeof to !== 'number' ||
  4630. typeof duration !== 'number' ||
  4631. typeof update !== 'function') {
  4632. return;
  4633. }
  4634. // Create mock done() function if necessary
  4635. if (typeof done !== 'function') {
  4636. done = function() {};
  4637. }
  4638. // Pick implementation (requestAnimationFrame | setTimeout)
  4639. var rAF = window.requestAnimationFrame || function(callback) {
  4640. window.setTimeout(callback, 1000 / 50);
  4641. };
  4642. // Animation loop
  4643. var canceled = false;
  4644. var change = to - from;
  4645. function loop(timestamp) {
  4646. var time = (timestamp || +new Date()) - start;
  4647. if (time >= 0) {
  4648. update(easing(time, from, change, duration));
  4649. }
  4650. if (time >= 0 && time >= duration) {
  4651. update(to);
  4652. done();
  4653. } else {
  4654. rAF(loop);
  4655. }
  4656. }
  4657. update(from);
  4658. // Start animation loop
  4659. var start = window.performance && window.performance.now ? window.performance.now() : +new Date();
  4660. rAF(loop);
  4661. },
  4662. actualCss: function(el, prop, cache) {
  4663. var css = '';
  4664. if (el instanceof HTMLElement === false) {
  4665. return;
  4666. }
  4667. if (!el.getAttribute('kt-hidden-' + prop) || cache === false) {
  4668. var value;
  4669. // the element is hidden so:
  4670. // making the el block so we can meassure its height but still be hidden
  4671. css = el.style.cssText;
  4672. el.style.cssText = 'position: absolute; visibility: hidden; display: block;';
  4673. if (prop == 'width') {
  4674. value = el.offsetWidth;
  4675. } else if (prop == 'height') {
  4676. value = el.offsetHeight;
  4677. }
  4678. el.style.cssText = css;
  4679. // store it in cache
  4680. el.setAttribute('kt-hidden-' + prop, value);
  4681. return parseFloat(value);
  4682. } else {
  4683. // store it in cache
  4684. return parseFloat(el.getAttribute('kt-hidden-' + prop));
  4685. }
  4686. },
  4687. actualHeight: function(el, cache) {
  4688. return KTUtil.actualCss(el, 'height', cache);
  4689. },
  4690. actualWidth: function(el, cache) {
  4691. return KTUtil.actualCss(el, 'width', cache);
  4692. },
  4693. getScroll: function(element, method) {
  4694. // The passed in `method` value should be 'Top' or 'Left'
  4695. method = 'scroll' + method;
  4696. return (element == window || element == document) ? (
  4697. self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] ||
  4698. (browserSupportsBoxModel && document.documentElement[method]) ||
  4699. document.body[method]
  4700. ) : element[method];
  4701. },
  4702. css: function(el, styleProp, value, important) {
  4703. if (!el) {
  4704. return;
  4705. }
  4706. if (value !== undefined) {
  4707. if ( important === true ) {
  4708. el.style.setProperty(styleProp, value, 'important');
  4709. } else {
  4710. el.style[styleProp] = value;
  4711. }
  4712. } else {
  4713. var defaultView = (el.ownerDocument || document).defaultView;
  4714. // W3C standard way:
  4715. if (defaultView && defaultView.getComputedStyle) {
  4716. // sanitize property name to css notation
  4717. // (hyphen separated words eg. font-Size)
  4718. styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
  4719. return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
  4720. } else if (el.currentStyle) { // IE
  4721. // sanitize property name to camelCase
  4722. styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) {
  4723. return letter.toUpperCase();
  4724. });
  4725. value = el.currentStyle[styleProp];
  4726. // convert other units to pixels on IE
  4727. if (/^\d+(em|pt|%|ex)?$/i.test(value)) {
  4728. return (function(value) {
  4729. var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
  4730. el.runtimeStyle.left = el.currentStyle.left;
  4731. el.style.left = value || 0;
  4732. value = el.style.pixelLeft + "px";
  4733. el.style.left = oldLeft;
  4734. el.runtimeStyle.left = oldRsLeft;
  4735. return value;
  4736. })(value);
  4737. }
  4738. return value;
  4739. }
  4740. }
  4741. },
  4742. slide: function(el, dir, speed, callback, recalcMaxHeight) {
  4743. if (!el || (dir == 'up' && KTUtil.visible(el) === false) || (dir == 'down' && KTUtil.visible(el) === true)) {
  4744. return;
  4745. }
  4746. speed = (speed ? speed : 600);
  4747. var calcHeight = KTUtil.actualHeight(el);
  4748. var calcPaddingTop = false;
  4749. var calcPaddingBottom = false;
  4750. if (KTUtil.css(el, 'padding-top') && KTUtil.data(el).has('slide-padding-top') !== true) {
  4751. KTUtil.data(el).set('slide-padding-top', KTUtil.css(el, 'padding-top'));
  4752. }
  4753. if (KTUtil.css(el, 'padding-bottom') && KTUtil.data(el).has('slide-padding-bottom') !== true) {
  4754. KTUtil.data(el).set('slide-padding-bottom', KTUtil.css(el, 'padding-bottom'));
  4755. }
  4756. if (KTUtil.data(el).has('slide-padding-top')) {
  4757. calcPaddingTop = parseInt(KTUtil.data(el).get('slide-padding-top'));
  4758. }
  4759. if (KTUtil.data(el).has('slide-padding-bottom')) {
  4760. calcPaddingBottom = parseInt(KTUtil.data(el).get('slide-padding-bottom'));
  4761. }
  4762. if (dir == 'up') { // up
  4763. el.style.cssText = 'display: block; overflow: hidden;';
  4764. if (calcPaddingTop) {
  4765. KTUtil.animate(0, calcPaddingTop, speed, function(value) {
  4766. el.style.paddingTop = (calcPaddingTop - value) + 'px';
  4767. }, 'linear');
  4768. }
  4769. if (calcPaddingBottom) {
  4770. KTUtil.animate(0, calcPaddingBottom, speed, function(value) {
  4771. el.style.paddingBottom = (calcPaddingBottom - value) + 'px';
  4772. }, 'linear');
  4773. }
  4774. KTUtil.animate(0, calcHeight, speed, function(value) {
  4775. el.style.height = (calcHeight - value) + 'px';
  4776. }, 'linear', function() {
  4777. el.style.height = '';
  4778. el.style.display = 'none';
  4779. if (typeof callback === 'function') {
  4780. callback();
  4781. }
  4782. });
  4783. } else if (dir == 'down') { // down
  4784. el.style.cssText = 'display: block; overflow: hidden;';
  4785. if (calcPaddingTop) {
  4786. KTUtil.animate(0, calcPaddingTop, speed, function(value) {//
  4787. el.style.paddingTop = value + 'px';
  4788. }, 'linear', function() {
  4789. el.style.paddingTop = '';
  4790. });
  4791. }
  4792. if (calcPaddingBottom) {
  4793. KTUtil.animate(0, calcPaddingBottom, speed, function(value) {
  4794. el.style.paddingBottom = value + 'px';
  4795. }, 'linear', function() {
  4796. el.style.paddingBottom = '';
  4797. });
  4798. }
  4799. KTUtil.animate(0, calcHeight, speed, function(value) {
  4800. el.style.height = value + 'px';
  4801. }, 'linear', function() {
  4802. el.style.height = '';
  4803. el.style.display = '';
  4804. el.style.overflow = '';
  4805. if (typeof callback === 'function') {
  4806. callback();
  4807. }
  4808. });
  4809. }
  4810. },
  4811. slideUp: function(el, speed, callback) {
  4812. KTUtil.slide(el, 'up', speed, callback);
  4813. },
  4814. slideDown: function(el, speed, callback) {
  4815. KTUtil.slide(el, 'down', speed, callback);
  4816. },
  4817. show: function(el, display) {
  4818. if (typeof el !== 'undefined') {
  4819. el.style.display = (display ? display : 'block');
  4820. }
  4821. },
  4822. hide: function(el) {
  4823. if (typeof el !== 'undefined') {
  4824. el.style.display = 'none';
  4825. }
  4826. },
  4827. addEvent: function(el, type, handler, one) {
  4828. if (typeof el !== 'undefined' && el !== null) {
  4829. el.addEventListener(type, handler);
  4830. }
  4831. },
  4832. removeEvent: function(el, type, handler) {
  4833. if (el !== null) {
  4834. el.removeEventListener(type, handler);
  4835. }
  4836. },
  4837. on: function(element, selector, event, handler) {
  4838. if ( element === null ) {
  4839. return;
  4840. }
  4841. var eventId = KTUtil.getUniqueId('event');
  4842. window.KTUtilDelegatedEventHandlers[eventId] = function(e) {
  4843. var targets = element.querySelectorAll(selector);
  4844. var target = e.target;
  4845. while ( target && target !== element ) {
  4846. for ( var i = 0, j = targets.length; i < j; i++ ) {
  4847. if ( target === targets[i] ) {
  4848. handler.call(target, e);
  4849. }
  4850. }
  4851. target = target.parentNode;
  4852. }
  4853. }
  4854. KTUtil.addEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]);
  4855. return eventId;
  4856. },
  4857. off: function(element, event, eventId) {
  4858. if (!element || !window.KTUtilDelegatedEventHandlers[eventId]) {
  4859. return;
  4860. }
  4861. KTUtil.removeEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]);
  4862. delete window.KTUtilDelegatedEventHandlers[eventId];
  4863. },
  4864. one: function onetime(el, type, callback) {
  4865. el.addEventListener(type, function callee(e) {
  4866. // remove event
  4867. if (e.target && e.target.removeEventListener) {
  4868. e.target.removeEventListener(e.type, callee);
  4869. }
  4870. // need to verify from https://themeforest.net/author_dashboard#comment_23615588
  4871. if (el && el.removeEventListener) {
  4872. e.currentTarget.removeEventListener(e.type, callee);
  4873. }
  4874. // call handler
  4875. return callback(e);
  4876. });
  4877. },
  4878. hash: function(str) {
  4879. var hash = 0,
  4880. i, chr;
  4881. if (str.length === 0) return hash;
  4882. for (i = 0; i < str.length; i++) {
  4883. chr = str.charCodeAt(i);
  4884. hash = ((hash << 5) - hash) + chr;
  4885. hash |= 0; // Convert to 32bit integer
  4886. }
  4887. return hash;
  4888. },
  4889. animateClass: function(el, animationName, callback) {
  4890. var animation;
  4891. var animations = {
  4892. animation: 'animationend',
  4893. OAnimation: 'oAnimationEnd',
  4894. MozAnimation: 'mozAnimationEnd',
  4895. WebkitAnimation: 'webkitAnimationEnd',
  4896. msAnimation: 'msAnimationEnd',
  4897. };
  4898. for (var t in animations) {
  4899. if (el.style[t] !== undefined) {
  4900. animation = animations[t];
  4901. }
  4902. }
  4903. KTUtil.addClass(el, animationName);
  4904. KTUtil.one(el, animation, function() {
  4905. KTUtil.removeClass(el, animationName);
  4906. });
  4907. if (callback) {
  4908. KTUtil.one(el, animation, callback);
  4909. }
  4910. },
  4911. transitionEnd: function(el, callback) {
  4912. var transition;
  4913. var transitions = {
  4914. transition: 'transitionend',
  4915. OTransition: 'oTransitionEnd',
  4916. MozTransition: 'mozTransitionEnd',
  4917. WebkitTransition: 'webkitTransitionEnd',
  4918. msTransition: 'msTransitionEnd'
  4919. };
  4920. for (var t in transitions) {
  4921. if (el.style[t] !== undefined) {
  4922. transition = transitions[t];
  4923. }
  4924. }
  4925. KTUtil.one(el, transition, callback);
  4926. },
  4927. animationEnd: function(el, callback) {
  4928. var animation;
  4929. var animations = {
  4930. animation: 'animationend',
  4931. OAnimation: 'oAnimationEnd',
  4932. MozAnimation: 'mozAnimationEnd',
  4933. WebkitAnimation: 'webkitAnimationEnd',
  4934. msAnimation: 'msAnimationEnd'
  4935. };
  4936. for (var t in animations) {
  4937. if (el.style[t] !== undefined) {
  4938. animation = animations[t];
  4939. }
  4940. }
  4941. KTUtil.one(el, animation, callback);
  4942. },
  4943. animateDelay: function(el, value) {
  4944. var vendors = ['webkit-', 'moz-', 'ms-', 'o-', ''];
  4945. for (var i = 0; i < vendors.length; i++) {
  4946. KTUtil.css(el, vendors[i] + 'animation-delay', value);
  4947. }
  4948. },
  4949. animateDuration: function(el, value) {
  4950. var vendors = ['webkit-', 'moz-', 'ms-', 'o-', ''];
  4951. for (var i = 0; i < vendors.length; i++) {
  4952. KTUtil.css(el, vendors[i] + 'animation-duration', value);
  4953. }
  4954. },
  4955. scrollTo: function(target, offset, duration) {
  4956. var duration = duration ? duration : 500;
  4957. var targetPos = target ? KTUtil.offset(target).top : 0;
  4958. var scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
  4959. var from, to;
  4960. if (offset) {
  4961. targetPos = targetPos - offset;
  4962. }
  4963. from = scrollPos;
  4964. to = targetPos;
  4965. KTUtil.animate(from, to, duration, function(value) {
  4966. document.documentElement.scrollTop = value;
  4967. document.body.parentNode.scrollTop = value;
  4968. document.body.scrollTop = value;
  4969. }); //, easing, done
  4970. },
  4971. scrollTop: function(offset, duration) {
  4972. KTUtil.scrollTo(null, offset, duration);
  4973. },
  4974. isArray: function(obj) {
  4975. return obj && Array.isArray(obj);
  4976. },
  4977. isEmpty: function(obj) {
  4978. for (var prop in obj) {
  4979. if (obj.hasOwnProperty(prop)) {
  4980. return false;
  4981. }
  4982. }
  4983. return true;
  4984. },
  4985. numberString: function(nStr) {
  4986. nStr += '';
  4987. var x = nStr.split('.');
  4988. var x1 = x[0];
  4989. var x2 = x.length > 1 ? '.' + x[1] : '';
  4990. var rgx = /(\d+)(\d{3})/;
  4991. while (rgx.test(x1)) {
  4992. x1 = x1.replace(rgx, '$1' + ',' + '$2');
  4993. }
  4994. return x1 + x2;
  4995. },
  4996. isRTL: function() {
  4997. return (document.querySelector('html').getAttribute("direction") === 'rtl');
  4998. },
  4999. snakeToCamel: function(s){
  5000. return s.replace(/(\-\w)/g, function(m){return m[1].toUpperCase();});
  5001. },
  5002. filterBoolean: function(val) {
  5003. // Convert string boolean
  5004. if (val === true || val === 'true') {
  5005. return true;
  5006. }
  5007. if (val === false || val === 'false') {
  5008. return false;
  5009. }
  5010. return val;
  5011. },
  5012. setHTML: function(el, html) {
  5013. el.innerHTML = html;
  5014. },
  5015. getHTML: function(el) {
  5016. if (el) {
  5017. return el.innerHTML;
  5018. }
  5019. },
  5020. getDocumentHeight: function() {
  5021. var body = document.body;
  5022. var html = document.documentElement;
  5023. return Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight );
  5024. },
  5025. getScrollTop: function() {
  5026. return (document.scrollingElement || document.documentElement).scrollTop;
  5027. },
  5028. colorLighten: function(color, amount) {
  5029. const addLight = function(color, amount){
  5030. let cc = parseInt(color,16) + amount;
  5031. let c = (cc > 255) ? 255 : (cc);
  5032. c = (c.toString(16).length > 1 ) ? c.toString(16) : `0${c.toString(16)}`;
  5033. return c;
  5034. }
  5035. color = (color.indexOf("#")>=0) ? color.substring(1,color.length) : color;
  5036. amount = parseInt((255*amount)/100);
  5037. return color = `#${addLight(color.substring(0,2), amount)}${addLight(color.substring(2,4), amount)}${addLight(color.substring(4,6), amount)}`;
  5038. },
  5039. colorDarken: function(color, amount) {
  5040. const subtractLight = function(color, amount){
  5041. let cc = parseInt(color,16) - amount;
  5042. let c = (cc < 0) ? 0 : (cc);
  5043. c = (c.toString(16).length > 1 ) ? c.toString(16) : `0${c.toString(16)}`;
  5044. return c;
  5045. }
  5046. color = (color.indexOf("#")>=0) ? color.substring(1,color.length) : color;
  5047. amount = parseInt((255*amount)/100);
  5048. return color = `#${subtractLight(color.substring(0,2), amount)}${subtractLight(color.substring(2,4), amount)}${subtractLight(color.substring(4,6), amount)}`;
  5049. },
  5050. // Throttle function: Input as function which needs to be throttled and delay is the time interval in milliseconds
  5051. throttle: function (timer, func, delay) {
  5052. // If setTimeout is already scheduled, no need to do anything
  5053. if (timer) {
  5054. return;
  5055. }
  5056. // Schedule a setTimeout after delay seconds
  5057. timer = setTimeout(function () {
  5058. func();
  5059. // Once setTimeout function execution is finished, timerId = undefined so that in <br>
  5060. // the next scroll event function execution can be scheduled by the setTimeout
  5061. timer = undefined;
  5062. }, delay);
  5063. },
  5064. // Debounce function: Input as function which needs to be debounced and delay is the debounced time in milliseconds
  5065. debounce: function (timer, func, delay) {
  5066. // Cancels the setTimeout method execution
  5067. clearTimeout(timer)
  5068. // Executes the func after delay time.
  5069. timer = setTimeout(func, delay);
  5070. },
  5071. parseJson: function(value) {
  5072. if (typeof value === 'string') {
  5073. value = value.replace(/'/g, "\"");
  5074. var jsonStr = value.replace(/(\w+:)|(\w+ :)/g, function(matched) {
  5075. return '"' + matched.substring(0, matched.length - 1) + '":';
  5076. });
  5077. try {
  5078. value = JSON.parse(jsonStr);
  5079. } catch(e) { }
  5080. }
  5081. return value;
  5082. },
  5083. getResponsiveValue: function(value, defaultValue) {
  5084. var width = this.getViewPort().width;
  5085. var result;
  5086. value = KTUtil.parseJson(value);
  5087. if (typeof value === 'object') {
  5088. var resultKey;
  5089. var resultBreakpoint = -1;
  5090. var breakpoint;
  5091. for (var key in value) {
  5092. if (key === 'default') {
  5093. breakpoint = 0;
  5094. } else {
  5095. breakpoint = this.getBreakpoint(key) ? this.getBreakpoint(key) : parseInt(key);
  5096. }
  5097. if (breakpoint <= width && breakpoint > resultBreakpoint) {
  5098. resultKey = key;
  5099. resultBreakpoint = breakpoint;
  5100. }
  5101. }
  5102. if (resultKey) {
  5103. result = value[resultKey];
  5104. } else {
  5105. result = value;
  5106. }
  5107. } else {
  5108. result = value;
  5109. }
  5110. return result;
  5111. },
  5112. each: function(array, callback) {
  5113. return [].slice.call(array).map(callback);
  5114. },
  5115. getSelectorMatchValue: function(value) {
  5116. var result = null;
  5117. value = KTUtil.parseJson(value);
  5118. if ( typeof value === 'object' ) {
  5119. // Match condition
  5120. if ( value['match'] !== undefined ) {
  5121. var selector = Object.keys(value['match'])[0];
  5122. value = Object.values(value['match'])[0];
  5123. if ( document.querySelector(selector) !== null ) {
  5124. result = value;
  5125. }
  5126. }
  5127. } else {
  5128. result = value;
  5129. }
  5130. return result;
  5131. },
  5132. getConditionalValue: function(value) {
  5133. var value = KTUtil.parseJson(value);
  5134. var result = KTUtil.getResponsiveValue(value);
  5135. if ( result !== null && result['match'] !== undefined ) {
  5136. result = KTUtil.getSelectorMatchValue(result);
  5137. }
  5138. if ( result === null && value !== null && value['default'] !== undefined ) {
  5139. result = value['default'];
  5140. }
  5141. return result;
  5142. },
  5143. getCssVariableValue: function(variableName) {
  5144. var hex = getComputedStyle(document.documentElement).getPropertyValue(variableName);
  5145. if ( hex && hex.length > 0 ) {
  5146. hex = hex.trim();
  5147. }
  5148. return hex;
  5149. },
  5150. isInViewport: function(element) {
  5151. var rect = element.getBoundingClientRect();
  5152. return (
  5153. rect.top >= 0 &&
  5154. rect.left >= 0 &&
  5155. rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
  5156. rect.right <= (window.innerWidth || document.documentElement.clientWidth)
  5157. );
  5158. },
  5159. onDOMContentLoaded: function(callback) {
  5160. if (document.readyState === 'loading') {
  5161. document.addEventListener('DOMContentLoaded', callback);
  5162. } else {
  5163. callback();
  5164. }
  5165. },
  5166. inIframe: function() {
  5167. try {
  5168. return window.self !== window.top;
  5169. } catch (e) {
  5170. return true;
  5171. }
  5172. },
  5173. isHexColor(code) {
  5174. return /^#[0-9A-F]{6}$/i.test(code);
  5175. }
  5176. }
  5177. }();
  5178. // Webpack support
  5179. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  5180. module.exports = KTUtil;
  5181. }
  5182. "use strict";
  5183. // Class definition
  5184. var KTApp = function () {
  5185. var select2FocusFixInitialized = false;
  5186. var countUpInitialized = false;
  5187. var createBootstrapTooltip = function (el, options) {
  5188. if (el.getAttribute("data-kt-initialized") === "1") {
  5189. return;
  5190. }
  5191. var delay = {};
  5192. // Handle delay options
  5193. if (el.hasAttribute('data-bs-delay-hide')) {
  5194. delay['hide'] = el.getAttribute('data-bs-delay-hide');
  5195. }
  5196. if (el.hasAttribute('data-bs-delay-show')) {
  5197. delay['show'] = el.getAttribute('data-bs-delay-show');
  5198. }
  5199. if (delay) {
  5200. options['delay'] = delay;
  5201. }
  5202. // Check dismiss options
  5203. if (el.hasAttribute('data-bs-dismiss') && el.getAttribute('data-bs-dismiss') == 'click') {
  5204. options['dismiss'] = 'click';
  5205. }
  5206. // Initialize popover
  5207. var tp = new bootstrap.Tooltip(el, options);
  5208. // Handle dismiss
  5209. if (options['dismiss'] && options['dismiss'] === 'click') {
  5210. // Hide popover on element click
  5211. el.addEventListener("click", function (e) {
  5212. tp.hide();
  5213. });
  5214. }
  5215. el.setAttribute("data-kt-initialized", "1");
  5216. return tp;
  5217. }
  5218. var createBootstrapTooltips = function () {
  5219. var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
  5220. var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
  5221. createBootstrapTooltip(tooltipTriggerEl, {});
  5222. });
  5223. }
  5224. var createBootstrapPopover = function (el, options) {
  5225. if (el.getAttribute("data-kt-initialized") === "1") {
  5226. return;
  5227. }
  5228. var delay = {};
  5229. // Handle delay options
  5230. if (el.hasAttribute('data-bs-delay-hide')) {
  5231. delay['hide'] = el.getAttribute('data-bs-delay-hide');
  5232. }
  5233. if (el.hasAttribute('data-bs-delay-show')) {
  5234. delay['show'] = el.getAttribute('data-bs-delay-show');
  5235. }
  5236. if (delay) {
  5237. options['delay'] = delay;
  5238. }
  5239. // Handle dismiss option
  5240. if (el.getAttribute('data-bs-dismiss') == 'true') {
  5241. options['dismiss'] = true;
  5242. }
  5243. if (options['dismiss'] === true) {
  5244. options['template'] = '<div class="popover" role="tooltip"><div class="popover-arrow"></div><span class="popover-dismiss btn btn-icon"></span><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
  5245. }
  5246. // Initialize popover
  5247. var popover = new bootstrap.Popover(el, options);
  5248. // Handle dismiss click
  5249. if (options['dismiss'] === true) {
  5250. var dismissHandler = function (e) {
  5251. popover.hide();
  5252. }
  5253. el.addEventListener('shown.bs.popover', function () {
  5254. var dismissEl = document.getElementById(el.getAttribute('aria-describedby'));
  5255. dismissEl.addEventListener('click', dismissHandler);
  5256. });
  5257. el.addEventListener('hide.bs.popover', function () {
  5258. var dismissEl = document.getElementById(el.getAttribute('aria-describedby'));
  5259. dismissEl.removeEventListener('click', dismissHandler);
  5260. });
  5261. }
  5262. el.setAttribute("data-kt-initialized", "1");
  5263. return popover;
  5264. }
  5265. var createBootstrapPopovers = function () {
  5266. var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));
  5267. var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
  5268. createBootstrapPopover(popoverTriggerEl, {});
  5269. });
  5270. }
  5271. var createBootstrapToasts = function () {
  5272. var toastElList = [].slice.call(document.querySelectorAll('.toast'));
  5273. var toastList = toastElList.map(function (toastEl) {
  5274. if (toastEl.getAttribute("data-kt-initialized") === "1") {
  5275. return;
  5276. }
  5277. toastEl.setAttribute("data-kt-initialized", "1");
  5278. return new bootstrap.Toast(toastEl, {})
  5279. });
  5280. }
  5281. var createButtons = function () {
  5282. var buttonsGroup = [].slice.call(document.querySelectorAll('[data-kt-buttons="true"]'));
  5283. buttonsGroup.map(function (group) {
  5284. if (group.getAttribute("data-kt-initialized") === "1") {
  5285. return;
  5286. }
  5287. var selector = group.hasAttribute('data-kt-buttons-target') ? group.getAttribute('data-kt-buttons-target') : '.btn';
  5288. var activeButtons = [].slice.call(group.querySelectorAll(selector));
  5289. // Toggle Handler
  5290. KTUtil.on(group, selector, 'click', function (e) {
  5291. activeButtons.map(function (button) {
  5292. button.classList.remove('active');
  5293. });
  5294. this.classList.add('active');
  5295. });
  5296. group.setAttribute("data-kt-initialized", "1");
  5297. });
  5298. }
  5299. var createDateRangePickers = function() {
  5300. // Check if jQuery included
  5301. if (typeof jQuery == 'undefined') {
  5302. return;
  5303. }
  5304. // Check if daterangepicker included
  5305. if (typeof $.fn.daterangepicker === 'undefined') {
  5306. return;
  5307. }
  5308. var elements = [].slice.call(document.querySelectorAll('[data-kt-daterangepicker="true"]'));
  5309. var start = moment().subtract(29, 'days');
  5310. var end = moment();
  5311. elements.map(function (element) {
  5312. if (element.getAttribute("data-kt-initialized") === "1") {
  5313. return;
  5314. }
  5315. var display = element.querySelector('div');
  5316. var attrOpens = element.hasAttribute('data-kt-daterangepicker-opens') ? element.getAttribute('data-kt-daterangepicker-opens') : 'left';
  5317. var range = element.getAttribute('data-kt-daterangepicker-range');
  5318. var cb = function(start, end) {
  5319. var current = moment();
  5320. if (display) {
  5321. if ( current.isSame(start, "day") && current.isSame(end, "day") ) {
  5322. display.innerHTML = start.format('D MMM YYYY');
  5323. } else {
  5324. display.innerHTML = start.format('D MMM YYYY') + ' - ' + end.format('D MMM YYYY');
  5325. }
  5326. }
  5327. }
  5328. if ( range === "today" ) {
  5329. start = moment();
  5330. end = moment();
  5331. }
  5332. $(element).daterangepicker({
  5333. startDate: start,
  5334. endDate: end,
  5335. opens: attrOpens,
  5336. ranges: {
  5337. 'Today': [moment(), moment()],
  5338. 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
  5339. 'Last 7 Days': [moment().subtract(6, 'days'), moment()],
  5340. 'Last 30 Days': [moment().subtract(29, 'days'), moment()],
  5341. 'This Month': [moment().startOf('month'), moment().endOf('month')],
  5342. 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
  5343. }
  5344. }, cb);
  5345. cb(start, end);
  5346. element.setAttribute("data-kt-initialized", "1");
  5347. });
  5348. }
  5349. var createSelect2 = function () {
  5350. // Check if jQuery included
  5351. if (typeof jQuery == 'undefined') {
  5352. return;
  5353. }
  5354. // Check if select2 included
  5355. if (typeof $.fn.select2 === 'undefined') {
  5356. return;
  5357. }
  5358. var elements = [].slice.call(document.querySelectorAll('[data-control="select2"], [data-kt-select2="true"]'));
  5359. elements.map(function (element) {
  5360. if (element.getAttribute("data-kt-initialized") === "1") {
  5361. return;
  5362. }
  5363. var options = {
  5364. dir: document.body.getAttribute('direction')
  5365. };
  5366. if (element.getAttribute('data-hide-search') == 'true') {
  5367. options.minimumResultsForSearch = Infinity;
  5368. }
  5369. $(element).select2(options);
  5370. element.setAttribute("data-kt-initialized", "1");
  5371. });
  5372. /*
  5373. * Hacky fix for a bug in select2 with jQuery 3.6.0's new nested-focus "protection"
  5374. * see: https://github.com/select2/select2/issues/5993
  5375. * see: https://github.com/jquery/jquery/issues/4382
  5376. *
  5377. * TODO: Recheck with the select2 GH issue and remove once this is fixed on their side
  5378. */
  5379. if (select2FocusFixInitialized === false) {
  5380. select2FocusFixInitialized = true;
  5381. $(document).on('select2:open', function(e) {
  5382. var elements = document.querySelectorAll('.select2-container--open .select2-search__field');
  5383. if (elements.length > 0) {
  5384. elements[elements.length - 1].focus();
  5385. }
  5386. });
  5387. }
  5388. }
  5389. var createAutosize = function () {
  5390. var inputs = [].slice.call(document.querySelectorAll('[data-kt-autosize="true"]'));
  5391. inputs.map(function (input) {
  5392. if (input.getAttribute("data-kt-initialized") === "1") {
  5393. return;
  5394. }
  5395. autosize(input);
  5396. input.setAttribute("data-kt-initialized", "1");
  5397. });
  5398. }
  5399. var createCountUp = function () {
  5400. var elements = [].slice.call(document.querySelectorAll('[data-kt-countup="true"]:not(.counted)'));
  5401. elements.map(function (element) {
  5402. if (KTUtil.isInViewport(element) && KTUtil.visible(element)) {
  5403. if (element.getAttribute("data-kt-initialized") === "1") {
  5404. return;
  5405. }
  5406. var options = {};
  5407. var value = element.getAttribute('data-kt-countup-value');
  5408. value = parseFloat(value.replace(/,/g, ""));
  5409. if (element.hasAttribute('data-kt-countup-start-val')) {
  5410. options.startVal = parseFloat(element.getAttribute('data-kt-countup-start-val'));
  5411. }
  5412. if (element.hasAttribute('data-kt-countup-duration')) {
  5413. options.duration = parseInt(element.getAttribute('data-kt-countup-duration'));
  5414. }
  5415. if (element.hasAttribute('data-kt-countup-decimal-places')) {
  5416. options.decimalPlaces = parseInt(element.getAttribute('data-kt-countup-decimal-places'));
  5417. }
  5418. if (element.hasAttribute('data-kt-countup-prefix')) {
  5419. options.prefix = element.getAttribute('data-kt-countup-prefix');
  5420. }
  5421. if (element.hasAttribute('data-kt-countup-separator')) {
  5422. options.separator = element.getAttribute('data-kt-countup-separator');
  5423. }
  5424. if (element.hasAttribute('data-kt-countup-suffix')) {
  5425. options.suffix = element.getAttribute('data-kt-countup-suffix');
  5426. }
  5427. var count = new countUp.CountUp(element, value, options);
  5428. count.start();
  5429. element.classList.add('counted');
  5430. element.setAttribute("data-kt-initialized", "1");
  5431. }
  5432. });
  5433. }
  5434. var createCountUpTabs = function () {
  5435. if (countUpInitialized === false) {
  5436. // Initial call
  5437. createCountUp();
  5438. // Window scroll event handler
  5439. window.addEventListener('scroll', createCountUp);
  5440. }
  5441. // Tabs shown event handler
  5442. var tabs = [].slice.call(document.querySelectorAll('[data-kt-countup-tabs="true"][data-bs-toggle="tab"]'));
  5443. tabs.map(function (tab) {
  5444. if (tab.getAttribute("data-kt-initialized") === "1") {
  5445. return;
  5446. }
  5447. tab.addEventListener('shown.bs.tab', createCountUp);
  5448. tab.setAttribute("data-kt-initialized", "1");
  5449. });
  5450. countUpInitialized = true;
  5451. }
  5452. var createTinySliders = function () {
  5453. // Init Slider
  5454. var initSlider = function (el) {
  5455. if (!el) {
  5456. return;
  5457. }
  5458. const tnsOptions = {};
  5459. // Convert string boolean
  5460. const checkBool = function (val) {
  5461. if (val === 'true') {
  5462. return true;
  5463. }
  5464. if (val === 'false') {
  5465. return false;
  5466. }
  5467. return val;
  5468. };
  5469. // get extra options via data attributes
  5470. el.getAttributeNames().forEach(function (attrName) {
  5471. // more options; https://github.com/ganlanyuan/tiny-slider#options
  5472. if ((/^data-tns-.*/g).test(attrName)) {
  5473. let optionName = attrName.replace('data-tns-', '').toLowerCase().replace(/(?:[\s-])\w/g, function (match) {
  5474. return match.replace('-', '').toUpperCase();
  5475. });
  5476. if (attrName === 'data-tns-responsive') {
  5477. // fix string with a valid json
  5478. const jsonStr = el.getAttribute(attrName).replace(/(\w+:)|(\w+ :)/g, function (matched) {
  5479. return '"' + matched.substring(0, matched.length - 1) + '":';
  5480. });
  5481. try {
  5482. // convert json string to object
  5483. tnsOptions[optionName] = JSON.parse(jsonStr);
  5484. }
  5485. catch (e) {
  5486. }
  5487. }
  5488. else {
  5489. tnsOptions[optionName] = checkBool(el.getAttribute(attrName));
  5490. }
  5491. }
  5492. });
  5493. const opt = Object.assign({}, {
  5494. container: el,
  5495. slideBy: 'page',
  5496. autoplay: true,
  5497. autoplayButtonOutput: false,
  5498. }, tnsOptions);
  5499. if (el.closest('.tns')) {
  5500. KTUtil.addClass(el.closest('.tns'), 'tns-initiazlied');
  5501. }
  5502. return tns(opt);
  5503. }
  5504. // Sliders
  5505. const elements = Array.prototype.slice.call(document.querySelectorAll('[data-tns="true"]'), 0);
  5506. if (!elements && elements.length === 0) {
  5507. return;
  5508. }
  5509. elements.forEach(function (el) {
  5510. if (el.getAttribute("data-kt-initialized") === "1") {
  5511. return;
  5512. }
  5513. initSlider(el);
  5514. el.setAttribute("data-kt-initialized", "1");
  5515. });
  5516. }
  5517. var initSmoothScroll = function () {
  5518. if (SmoothScroll) {
  5519. new SmoothScroll('a[data-kt-scroll-toggle][href*="#"]', {
  5520. speed: 1000,
  5521. speedAsDuration: true,
  5522. offset: function (anchor, toggle) {
  5523. // Integer or Function returning an integer. How far to offset the scrolling anchor location in pixels
  5524. // This example is a function, but you could do something as simple as `offset: 25`
  5525. // An example returning different values based on whether the clicked link was in the header nav or not
  5526. if (anchor.hasAttribute('data-kt-scroll-offset')) {
  5527. var val = KTUtil.getResponsiveValue(anchor.getAttribute('data-kt-scroll-offset'));
  5528. return val;
  5529. } else {
  5530. return 0;
  5531. }
  5532. }
  5533. });
  5534. }
  5535. }
  5536. var initCheck = function () {
  5537. // Toggle Handler
  5538. KTUtil.on(document.body, '[data-kt-check="true"]', 'change', function (e) {
  5539. var check = this;
  5540. var targets = document.querySelectorAll(check.getAttribute('data-kt-check-target'));
  5541. KTUtil.each(targets, function (target) {
  5542. if (target.type == 'checkbox') {
  5543. target.checked = check.checked;
  5544. } else {
  5545. target.classList.toggle('active');
  5546. }
  5547. });
  5548. });
  5549. }
  5550. var initBootstrapCollapse = function() {
  5551. KTUtil.on(document.body, '.collapsible[data-bs-toggle="collapse"]', 'click', function(e) {
  5552. if (this.classList.contains('collapsed')) {
  5553. this.classList.remove('active');
  5554. this.blur();
  5555. } else {
  5556. this.classList.add('active');
  5557. }
  5558. if (this.hasAttribute('data-kt-toggle-text')) {
  5559. var text = this.getAttribute('data-kt-toggle-text');
  5560. var target = this.querySelector('[data-kt-toggle-text-target="true"]');
  5561. var target = target ? target : this;
  5562. this.setAttribute('data-kt-toggle-text', target.innerText);
  5563. target.innerText = text;
  5564. }
  5565. });
  5566. }
  5567. var initBootstrapRotate = function() {
  5568. KTUtil.on(document.body, '[data-kt-rotate="true"]', 'click', function(e) {
  5569. if (this.classList.contains('active')) {
  5570. this.classList.remove('active');
  5571. this.blur();
  5572. } else {
  5573. this.classList.add('active');
  5574. }
  5575. });
  5576. }
  5577. var initPageLoader = function () {
  5578. // CSS3 Transitions only after page load(.page-loading or .app-page-loading class added to body tag and remove with JS on page load)
  5579. setTimeout(function ()
  5580. {
  5581. KTUtil.removeClass(document.body, 'page-loading');
  5582. document.body.removeAttribute('data-kt-app-page-loading');
  5583. }, 1000 * 3);
  5584. }
  5585. return {
  5586. init: function () {
  5587. initSmoothScroll();
  5588. initCheck();
  5589. initBootstrapCollapse();
  5590. initBootstrapRotate();
  5591. },
  5592. initPageLoader: function () {
  5593. initPageLoader();
  5594. },
  5595. createInstances: function () {
  5596. createBootstrapTooltips();
  5597. createBootstrapPopovers();
  5598. createBootstrapToasts();
  5599. createDateRangePickers();
  5600. createButtons();
  5601. createSelect2();
  5602. createCountUp();
  5603. createCountUpTabs();
  5604. createAutosize();
  5605. createTinySliders();
  5606. }
  5607. };
  5608. }();
  5609. // Initialize app on document ready
  5610. KTUtil.onDOMContentLoaded(function () {
  5611. KTApp.init();
  5612. KTApp.createInstances();
  5613. });
  5614. // Initialize page loader on window load
  5615. window.addEventListener("load", function() {
  5616. KTApp.initPageLoader();
  5617. });
  5618. // Declare KTApp for Webpack support
  5619. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  5620. module.exports = KTApp;
  5621. }
  5622. "use strict";
  5623. // Class definition
  5624. var KTAppLayoutBuilder = function() {
  5625. var form;
  5626. var actionInput;
  5627. var url;
  5628. var previewButton;
  5629. var exportButton;
  5630. var resetButton;
  5631. var handlePreview = function() {
  5632. previewButton.addEventListener("click", function(e) {
  5633. e.preventDefault();
  5634. // Set form action value
  5635. actionInput.value = "preview";
  5636. // Show progress
  5637. previewButton.setAttribute("data-kt-indicator", "on");
  5638. // Prepare form data
  5639. var data = $(form).serialize();
  5640. // Submit
  5641. $.ajax({
  5642. type: "POST",
  5643. dataType: "html",
  5644. url: url,
  5645. data: data,
  5646. success: function(response, status, xhr) {
  5647. if (history.scrollRestoration) {
  5648. history.scrollRestoration = 'manual';
  5649. }
  5650. location.reload();
  5651. return;
  5652. toastr.success(
  5653. "Preview has been updated with current configured layout.",
  5654. "Preview updated!",
  5655. {timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0}
  5656. );
  5657. setTimeout(function() {
  5658. location.reload(); // reload page
  5659. }, 1500);
  5660. },
  5661. error: function(response) {
  5662. toastr.error(
  5663. "Please try it again later.",
  5664. "Something went wrong!",
  5665. {timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0}
  5666. );
  5667. },
  5668. complete: function() {
  5669. previewButton.removeAttribute("data-kt-indicator");
  5670. }
  5671. });
  5672. });
  5673. };
  5674. var handleExport = function() {
  5675. exportButton.addEventListener("click", function(e) {
  5676. e.preventDefault();
  5677. toastr.success(
  5678. "Process has been started and it may take a while.",
  5679. "Generating HTML!",
  5680. {timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0}
  5681. );
  5682. // Show progress
  5683. exportButton.setAttribute("data-kt-indicator", "on");
  5684. // Set form action value
  5685. actionInput.value = "export";
  5686. // Prepare form data
  5687. var data = $(form).serialize();
  5688. $.ajax({
  5689. type: "POST",
  5690. dataType: "html",
  5691. url: url,
  5692. data: data,
  5693. success: function(response, status, xhr) {
  5694. var timer = setInterval(function() {
  5695. $("<iframe/>").attr({
  5696. src: url + "?layout-builder[action]=export&download=1&output=" + response,
  5697. style: "visibility:hidden;display:none",
  5698. }).ready(function() {
  5699. // Stop the timer
  5700. clearInterval(timer);
  5701. exportButton.removeAttribute("data-kt-indicator");
  5702. }).appendTo("body");
  5703. }, 3000);
  5704. },
  5705. error: function(response) {
  5706. toastr.error(
  5707. "Please try it again later.",
  5708. "Something went wrong!",
  5709. {timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0}
  5710. );
  5711. exportButton.removeAttribute("data-kt-indicator");
  5712. },
  5713. });
  5714. });
  5715. };
  5716. var handleReset = function() {
  5717. resetButton.addEventListener("click", function(e) {
  5718. e.preventDefault();
  5719. // Show progress
  5720. resetButton.setAttribute("data-kt-indicator", "on");
  5721. // Set form action value
  5722. actionInput.value = "reset";
  5723. // Prepare form data
  5724. var data = $(form).serialize();
  5725. $.ajax({
  5726. type: "POST",
  5727. dataType: "html",
  5728. url: url,
  5729. data: data,
  5730. success: function(response, status, xhr) {
  5731. if (history.scrollRestoration) {
  5732. history.scrollRestoration = 'manual';
  5733. }
  5734. location.reload();
  5735. return;
  5736. toastr.success(
  5737. "Preview has been successfully reset and the page will be reloaded.",
  5738. "Reset Preview!",
  5739. {timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0}
  5740. );
  5741. setTimeout(function() {
  5742. location.reload(); // reload page
  5743. }, 1500);
  5744. },
  5745. error: function(response) {
  5746. toastr.error(
  5747. "Please try it again later.",
  5748. "Something went wrong!",
  5749. {timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0}
  5750. );
  5751. },
  5752. complete: function() {
  5753. resetButton.removeAttribute("data-kt-indicator");
  5754. },
  5755. });
  5756. });
  5757. };
  5758. var handleThemeMode = function() {
  5759. var checkLight = document.querySelector('#kt_layout_builder_theme_mode_light');
  5760. var checkDark = document.querySelector('#kt_layout_builder_theme_mode_dark');
  5761. var check = document.querySelector('#kt_layout_builder_theme_mode_' + KTThemeMode.getMode());
  5762. if (checkLight) {
  5763. checkLight.addEventListener("click", function() {
  5764. this.checked = true;
  5765. this.closest('[data-kt-buttons="true"]').querySelector('.form-check-image.active').classList.remove('active');
  5766. this.closest('.form-check-image').classList.add('active');
  5767. KTThemeMode.setMode('light');
  5768. });
  5769. }
  5770. if (checkDark) {
  5771. checkDark.addEventListener("click", function() {
  5772. this.checked = true;
  5773. this.closest('[data-kt-buttons="true"]').querySelector('.form-check-image.active').classList.remove('active');
  5774. this.closest('.form-check-image').classList.add('active');
  5775. KTThemeMode.setMode('dark');
  5776. });
  5777. }
  5778. if ( check ) {
  5779. check.closest('.form-check-image').classList.add('active');
  5780. check.checked = true;
  5781. }
  5782. }
  5783. return {
  5784. // Public functions
  5785. init: function() {
  5786. form = document.querySelector("#kt_app_layout_builder_form");
  5787. if ( !form ) {
  5788. return;
  5789. }
  5790. url = form.getAttribute("action");
  5791. actionInput = document.querySelector("#kt_app_layout_builder_action");
  5792. previewButton = document.querySelector("#kt_app_layout_builder_preview");
  5793. exportButton = document.querySelector("#kt_app_layout_builder_export");
  5794. resetButton = document.querySelector("#kt_app_layout_builder_reset");
  5795. if ( previewButton ) {
  5796. handlePreview();
  5797. }
  5798. if ( exportButton ) {
  5799. handleExport();
  5800. }
  5801. if ( resetButton ) {
  5802. handleReset();
  5803. }
  5804. handleThemeMode();
  5805. }
  5806. };
  5807. }();
  5808. // On document ready
  5809. KTUtil.onDOMContentLoaded(function() {
  5810. KTAppLayoutBuilder.init();
  5811. });
  5812. "use strict";
  5813. // Class definition
  5814. var KTLayoutSearch = function() {
  5815. // Private variables
  5816. var element;
  5817. var formElement;
  5818. var mainElement;
  5819. var resultsElement;
  5820. var wrapperElement;
  5821. var emptyElement;
  5822. var preferencesElement;
  5823. var preferencesShowElement;
  5824. var preferencesDismissElement;
  5825. var advancedOptionsFormElement;
  5826. var advancedOptionsFormShowElement;
  5827. var advancedOptionsFormCancelElement;
  5828. var advancedOptionsFormSearchElement;
  5829. var searchObject;
  5830. // Private functions
  5831. var processs = function(search) {
  5832. var timeout = setTimeout(function() {
  5833. var number = KTUtil.getRandomInt(1, 3);
  5834. // Hide recently viewed
  5835. mainElement.classList.add('d-none');
  5836. if (number === 3) {
  5837. // Hide results
  5838. resultsElement.classList.add('d-none');
  5839. // Show empty message
  5840. emptyElement.classList.remove('d-none');
  5841. } else {
  5842. // Show results
  5843. resultsElement.classList.remove('d-none');
  5844. // Hide empty message
  5845. emptyElement.classList.add('d-none');
  5846. }
  5847. // Complete search
  5848. search.complete();
  5849. }, 1500);
  5850. }
  5851. var clear = function(search) {
  5852. // Show recently viewed
  5853. mainElement.classList.remove('d-none');
  5854. // Hide results
  5855. resultsElement.classList.add('d-none');
  5856. // Hide empty message
  5857. emptyElement.classList.add('d-none');
  5858. }
  5859. var handlePreferences = function() {
  5860. // Preference show handler
  5861. preferencesShowElement.addEventListener('click', function() {
  5862. wrapperElement.classList.add('d-none');
  5863. preferencesElement.classList.remove('d-none');
  5864. });
  5865. // Preference dismiss handler
  5866. preferencesDismissElement.addEventListener('click', function() {
  5867. wrapperElement.classList.remove('d-none');
  5868. preferencesElement.classList.add('d-none');
  5869. });
  5870. }
  5871. var handleAdvancedOptionsForm = function() {
  5872. // Show
  5873. advancedOptionsFormShowElement.addEventListener('click', function() {
  5874. wrapperElement.classList.add('d-none');
  5875. advancedOptionsFormElement.classList.remove('d-none');
  5876. });
  5877. // Cancel
  5878. advancedOptionsFormCancelElement.addEventListener('click', function() {
  5879. wrapperElement.classList.remove('d-none');
  5880. advancedOptionsFormElement.classList.add('d-none');
  5881. });
  5882. // Search
  5883. advancedOptionsFormSearchElement.addEventListener('click', function() {
  5884. });
  5885. }
  5886. // Public methods
  5887. return {
  5888. init: function() {
  5889. // Elements
  5890. element = document.querySelector('#kt_header_search');
  5891. if (!element) {
  5892. return;
  5893. }
  5894. wrapperElement = element.querySelector('[data-kt-search-element="wrapper"]');
  5895. formElement = element.querySelector('[data-kt-search-element="form"]');
  5896. mainElement = element.querySelector('[data-kt-search-element="main"]');
  5897. resultsElement = element.querySelector('[data-kt-search-element="results"]');
  5898. emptyElement = element.querySelector('[data-kt-search-element="empty"]');
  5899. preferencesElement = element.querySelector('[data-kt-search-element="preferences"]');
  5900. preferencesShowElement = element.querySelector('[data-kt-search-element="preferences-show"]');
  5901. preferencesDismissElement = element.querySelector('[data-kt-search-element="preferences-dismiss"]');
  5902. advancedOptionsFormElement = element.querySelector('[data-kt-search-element="advanced-options-form"]');
  5903. advancedOptionsFormShowElement = element.querySelector('[data-kt-search-element="advanced-options-form-show"]');
  5904. advancedOptionsFormCancelElement = element.querySelector('[data-kt-search-element="advanced-options-form-cancel"]');
  5905. advancedOptionsFormSearchElement = element.querySelector('[data-kt-search-element="advanced-options-form-search"]');
  5906. // Initialize search handler
  5907. searchObject = new KTSearch(element);
  5908. // Search handler
  5909. searchObject.on('kt.search.process', processs);
  5910. // Clear handler
  5911. searchObject.on('kt.search.clear', clear);
  5912. // Custom handlers
  5913. handlePreferences();
  5914. handleAdvancedOptionsForm();
  5915. }
  5916. };
  5917. }();
  5918. // On document ready
  5919. KTUtil.onDOMContentLoaded(function() {
  5920. KTLayoutSearch.init();
  5921. });
  5922. "use strict";
  5923. // Class definition
  5924. var KTAppSidebar = function () {
  5925. // Private variables
  5926. var toggle;
  5927. var sidebar;
  5928. var headerMenu;
  5929. var menuDashboardsCollapse;
  5930. var menuWrapper;
  5931. // Private functions
  5932. // Handle sidebar minimize mode toggle
  5933. var handleToggle = function () {
  5934. var toggleObj = KTToggle.getInstance(toggle);
  5935. var headerMenuObj = KTMenu.getInstance(headerMenu);
  5936. if ( toggleObj === null || headerMenuObj === null ) {
  5937. return;
  5938. }
  5939. // Add a class to prevent sidebar hover effect after toggle click
  5940. toggleObj.on('kt.toggle.change', function() {
  5941. // Set animation state
  5942. sidebar.classList.add('animating');
  5943. // Wait till animation finishes
  5944. setTimeout(function() {
  5945. // Remove animation state
  5946. sidebar.classList.remove('animating');
  5947. }, 300);
  5948. // Prevent header menu dropdown display on hover
  5949. if (headerMenuObj) {
  5950. headerMenuObj.disable();
  5951. // Timeout to enable header menu
  5952. setTimeout(function() {
  5953. headerMenuObj.enable();
  5954. }, 1000);
  5955. }
  5956. });
  5957. // Store sidebar minimize state in cookie
  5958. toggleObj.on('kt.toggle.changed', function() {
  5959. // In server side check sidebar_minimize_state cookie
  5960. // value and add data-kt-app-sidebar-minimize="on"
  5961. // attribute to Body tag and "active" class to the toggle button
  5962. var date = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); // 30 days from now
  5963. KTCookie.set("sidebar_minimize_state", toggleObj.isEnabled() ? "on" : "off", {expires: date});
  5964. });
  5965. }
  5966. // Handle dashboards menu items collapse mode
  5967. var handleShowMore = function() {
  5968. menuDashboardsCollapse.addEventListener('hide.bs.collapse', event => {
  5969. menuWrapper.scrollTo({
  5970. top: 0,
  5971. behavior: 'instant'
  5972. });
  5973. });
  5974. }
  5975. var handleMenuScroll = function() {
  5976. var menuActiveItem = menuWrapper.querySelector(".menu-link.active");
  5977. if ( !menuActiveItem ) {
  5978. return;
  5979. }
  5980. if ( KTUtil.isVisibleInContainer(menuActiveItem, menuWrapper) === true) {
  5981. return;
  5982. }
  5983. menuWrapper.scroll({
  5984. top: KTUtil.getRelativeTopPosition(menuActiveItem, menuWrapper),
  5985. behavior: 'smooth'
  5986. });
  5987. }
  5988. // Public methods
  5989. return {
  5990. init: function () {
  5991. // Elements
  5992. sidebar = document.querySelector('#kt_app_sidebar');
  5993. toggle = document.querySelector('#kt_app_sidebar_toggle');
  5994. headerMenu = document.querySelector('#kt_app_header_menu');
  5995. menuDashboardsCollapse = document.querySelector('#kt_app_sidebar_menu_dashboards_collapse');
  5996. menuWrapper = document.querySelector('#kt_app_sidebar_menu_wrapper');
  5997. if ( sidebar === null ) {
  5998. return;
  5999. }
  6000. if ( toggle ) {
  6001. handleToggle();
  6002. }
  6003. if ( menuWrapper ) {
  6004. handleMenuScroll();
  6005. }
  6006. if ( menuDashboardsCollapse ) {
  6007. handleShowMore();
  6008. }
  6009. }
  6010. };
  6011. }();
  6012. "use strict";
  6013. // Class definition
  6014. var KTThemeMode = function () {
  6015. var menu;
  6016. var callbacks = [];
  6017. var the = this;
  6018. var element;
  6019. var getParamName = function(postfix) {
  6020. var name = document.body.hasAttribute("data-kt-name") ? document.body.getAttribute("data-kt-name") + "_" : "";
  6021. return "kt_" + name + "theme_mode" + "_" + postfix;
  6022. }
  6023. var getMode = function() {
  6024. var modeParam = getParamName("value");
  6025. var menuMode = getMenuMode();
  6026. if ( localStorage.getItem(modeParam) !== null ) {
  6027. return localStorage.getItem(modeParam);
  6028. }
  6029. if ( element.hasAttribute("data-theme") ) {
  6030. return element.getAttribute("data-theme");
  6031. }
  6032. if ( menuMode ) {
  6033. if ( menuMode === "system" ) {
  6034. return getSystemMode();
  6035. } else {
  6036. return menuMode;
  6037. }
  6038. }
  6039. return "light";
  6040. }
  6041. var setMode = function(mode, menuMode) {
  6042. // Check input values
  6043. if ( mode !== "light" && mode !== "dark" ) {
  6044. return;
  6045. }
  6046. // Get param names
  6047. var modeParam = getParamName("value");
  6048. var menuModeParam = getParamName("menu");
  6049. // Reset mode if system mode was changed
  6050. if ( menuMode === 'system') {
  6051. if ( getSystemMode() !== mode ) {
  6052. mode = getSystemMode();
  6053. }
  6054. }
  6055. // Check menu mode
  6056. if ( !menuMode) {
  6057. menuMode = mode;
  6058. }
  6059. // Read active menu mode value
  6060. var activeMenuItem = menu ? menu.querySelector('[data-kt-element="mode"][data-kt-value="' + menuMode + '"]') : null;
  6061. // Enable switching state
  6062. element.setAttribute("data-kt-theme-mode-switching", "true");
  6063. // Set mode to the target element
  6064. element.setAttribute("data-theme", mode);
  6065. // Disable switching state
  6066. setTimeout(function() {
  6067. element.removeAttribute("data-kt-theme-mode-switching");
  6068. }, 300);
  6069. // Store mode value in storage
  6070. localStorage.setItem(modeParam, mode);
  6071. // Set active menu item
  6072. if ( activeMenuItem ) {
  6073. localStorage.setItem(menuModeParam, menuMode);
  6074. setActiveMenuItem(activeMenuItem);
  6075. }
  6076. }
  6077. var getMenuMode = function() {
  6078. var menuModeParam = getParamName("menu");
  6079. var menuItem = menu ? menu.querySelector('.active[data-kt-element="mode"]') : null;
  6080. if ( menuItem && menuItem.getAttribute('data-kt-value') ) {
  6081. return menuItem.getAttribute('data-kt-value');
  6082. }
  6083. if ( localStorage.getItem(menuModeParam) !== null ) {
  6084. return localStorage.getItem(menuModeParam);
  6085. }
  6086. return "";
  6087. }
  6088. var getSystemMode = function() {
  6089. return window.matchMedia('(prefers-color-scheme: dark)').matches ? "dark" : "light";
  6090. }
  6091. var initMode = function() {
  6092. setMode(getMode(), getMenuMode());
  6093. KTEventHandler.trigger(element, 'kt.thememode.init', the);
  6094. }
  6095. var getActiveMenuItem = function() {
  6096. return menu.querySelector('[data-kt-element="mode"][data-kt-value="' + getMenuMode() + '"]');
  6097. }
  6098. var setActiveMenuItem = function(item) {
  6099. var menuModeParam = getParamName("menu");
  6100. var menuMode = item.getAttribute("data-kt-value");
  6101. var activeItem = menu.querySelector('.active[data-kt-element="mode"]');
  6102. if ( activeItem ) {
  6103. activeItem.classList.remove("active");
  6104. }
  6105. item.classList.add("active");
  6106. localStorage.setItem(menuModeParam, menuMode);
  6107. }
  6108. var handleMenu = function() {
  6109. var param = getParamName("menu");
  6110. var items = [].slice.call(menu.querySelectorAll('[data-kt-element="mode"]'));
  6111. items.map(function (item) {
  6112. item.addEventListener("click", function(e) {
  6113. e.preventDefault();
  6114. var menuMode = item.getAttribute("data-kt-value");
  6115. var mode = menuMode;
  6116. if ( menuMode === "system") {
  6117. mode = getSystemMode();
  6118. }
  6119. setMode(mode, menuMode);
  6120. KTEventHandler.trigger(element, 'kt.thememode.change', the);
  6121. });
  6122. });
  6123. }
  6124. return {
  6125. init: function () {
  6126. menu = document.querySelector('[data-kt-element="theme-mode-menu"]');
  6127. element = document.documentElement;
  6128. initMode();
  6129. if (menu) {
  6130. handleMenu();
  6131. }
  6132. },
  6133. getMode: function () {
  6134. return getMode();
  6135. },
  6136. getMenuMode: function() {
  6137. return getMenuMode();
  6138. },
  6139. getSystemMode: function () {
  6140. return getSystemMode();
  6141. },
  6142. setMode: function(mode) {
  6143. return setMode(mode)
  6144. },
  6145. on: function(name, handler) {
  6146. return KTEventHandler.on(element, name, handler);
  6147. },
  6148. off: function(name, handlerId) {
  6149. return KTEventHandler.off(element, name, handlerId);
  6150. }
  6151. };
  6152. }();
  6153. // Initialize app on document ready
  6154. KTUtil.onDOMContentLoaded(function () {
  6155. KTThemeMode.init();
  6156. });
  6157. // Declare KTThemeMode for Webpack support
  6158. if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  6159. module.exports = KTThemeMode;
  6160. }
  6161. "use strict";
  6162. // Class definition
  6163. var KTLayoutToolbar = function () {
  6164. // Private variables
  6165. var toolbar;
  6166. // Private functions
  6167. var initForm = function () {
  6168. var rangeSlider = document.querySelector("#kt_app_toolbar_slider");
  6169. var rangeSliderValueElement = document.querySelector("#kt_app_toolbar_slider_value");
  6170. if (!rangeSlider) {
  6171. return;
  6172. }
  6173. noUiSlider.create(rangeSlider, {
  6174. start: [5],
  6175. connect: [true, false],
  6176. step: 1,
  6177. format: wNumb({
  6178. decimals: 1
  6179. }),
  6180. range: {
  6181. min: [1],
  6182. max: [10]
  6183. }
  6184. });
  6185. rangeSlider.noUiSlider.on("update", function (values, handle) {
  6186. rangeSliderValueElement.innerHTML = values[handle];
  6187. });
  6188. var handle = rangeSlider.querySelector(".noUi-handle");
  6189. handle.setAttribute("tabindex", 0);
  6190. handle.addEventListener("click", function () {
  6191. this.focus();
  6192. });
  6193. handle.addEventListener("keydown", function (event) {
  6194. var value = Number(rangeSlider.noUiSlider.get());
  6195. switch (event.which) {
  6196. case 37:
  6197. rangeSlider.noUiSlider.set(value - 1);
  6198. break;
  6199. case 39:
  6200. rangeSlider.noUiSlider.set(value + 1);
  6201. break;
  6202. }
  6203. });
  6204. }
  6205. // Public methods
  6206. return {
  6207. init: function () {
  6208. // Elements
  6209. toolbar = document.querySelector('#kt_app_toolbar');
  6210. if (!toolbar) {
  6211. return;
  6212. }
  6213. initForm();
  6214. }
  6215. };
  6216. }();
  6217. // On document ready
  6218. KTUtil.onDOMContentLoaded(function () {
  6219. KTLayoutToolbar.init();
  6220. });