| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400 |
- // Create language switcher instance
- var lang = new Lang();
- var langStrings = { token: {} };
- loadLanguageList();
- var falbackLanguage =
- languageList.filter(
- (p) => p.code == language(moment.locale(navigator.languages[0]))
- ).length > 0
- ? language(moment.locale(navigator.languages[0]))
- : "en";
- lang.init({
- //defaultLang: 'en',
- currentLang: getCookie("organizrLanguage")
- ? getCookie("organizrLanguage")
- : falbackLanguage,
- cookie: {
- name: "organizrLanguage",
- expiry: 365,
- path: "/",
- },
- allowCookieOverride: true,
- });
- var OAuthLoginNeeded = false;
- var directToHash = false;
- var pingOrg = false;
- var checkCommitLoadStatus = false;
- var timeouts = {};
- var increment = 0;
- var tabInformation = {};
- var tabActionsList = [];
- tabActionsList["refresh"] = [];
- tabActionsList["close"] = [];
- var customHTMLEditorObject = [];
- $.xhrPool = [];
- // Add new jquery serializeObject function
- $.fn.serializeObject = function () {
- var o = {};
- var a = this.serializeArray();
- $.each(a, function () {
- if (o[this.name] !== undefined) {
- if (!o[this.name].push) {
- o[this.name] = [o[this.name]];
- }
- o[this.name].push(this.value || "");
- } else {
- o[this.name] = this.value || "";
- }
- });
- return o;
- };
- // Start Organizr
- $(document).ready(function () {
- if (getCookie("organizrOAuth")) {
- OAuthLoginNeeded = true;
- }
- launch();
- local("r", "loggingIn");
- });
- /* NORMAL FUNCTIONS */
- function setLangCookie(lang) {
- Cookies.set("organizrLanguage", lang, {
- expires: 365,
- path: "/",
- });
- }
- function highlightObject(json) {
- if (typeof json != "string") {
- json = JSON.stringify(json, undefined, "\t");
- }
- json = json
- .replace(/&/g, "&")
- .replace(/</g, "<")
- .replace(/>/g, ">");
- return json.replace(
- /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,
- function (match) {
- var cls = "number";
- if (/^"/.test(match)) {
- if (/:$/.test(match)) {
- cls = "key";
- } else {
- cls = "string";
- }
- } else if (/true|false/.test(match)) {
- cls = "boolean";
- } else if (/null/.test(match)) {
- cls = "null";
- }
- return '<span class="' + cls + '">' + match + "</span>";
- }
- );
- }
- function orgDebug() {
- let cmd = $("#debug-input").val();
- let result = "";
- if (cmd !== "") {
- result = eval(cmd);
- }
- if (result !== "") {
- $("#debugResultsBox").removeClass("hidden");
- $("#debugResults").html(formatDebug(result));
- $(".cmdName").text(cmd);
- if (bowser.mobile !== true) {
- $("#debugResults > .whitebox").slimScroll();
- }
- } else {
- }
- }
- function getDepth(object) {
- var level = 1;
- for (var key in object) {
- if (!object.hasOwnProperty(key)) continue;
- if (typeof object[key] == "object") {
- var depth = getDepth(object[key]) + 1;
- level = Math.max(depth, level);
- }
- }
- return level;
- }
- function jsonToHTML(json) {
- var html = "";
- $.each(json, function (i, v) {
- if (typeof v === "object") {
- html += '<p class="tab0">' + i + ":</p>";
- $.each(v, function (index, value) {
- if (typeof value === "object") {
- html += '<p class="tab1">' + index + ":</p>";
- html += jsonToHTML2(value);
- } else {
- html += '<p class="tab1">' + index + ": " + value + "</p>";
- }
- });
- } else {
- html += '<p class="tab0">' + i + ": " + v + "</p>";
- }
- });
- return html;
- }
- function jsonToHTML2(json) {
- var html = "";
- $.each(json, function (i, v) {
- if (typeof v === "object") {
- html += '<p class="tab2">' + i + ":</p>";
- $.each(v, function (index, value) {
- if (typeof value === "object") {
- html += '<p class="tab3">' + index + ":</p>";
- html += jsonToHTML3(value);
- } else {
- html += '<p class="tab3">' + index + ": " + value + "</p>";
- }
- });
- } else {
- html += '<p class="tab2">' + i + ": " + v + "</p>";
- }
- });
- return html;
- }
- function jsonToHTML3(json) {
- var html = "";
- $.each(json, function (i, v) {
- if (typeof v === "object") {
- html += '<p class="tab4">' + i + ":</p>";
- $.each(v, function (index, value) {
- if (typeof value === "object") {
- html += '<p class="tab5">' + index + ":</p>";
- html += jsonToHTML2(value);
- } else {
- html += '<p class="tab5">' + index + ": " + value + "</p>";
- }
- });
- } else {
- html += '<p class="tab4">' + i + ": " + v + "</p>";
- }
- });
- return html;
- }
- function copyDebug() {
- var pre = $("#debugPreInfo").find(".whitebox").text();
- var debug = $("#debugResults").find(".whitebox").text();
- clipboard(true, pre + debug);
- console.log(pre + debug);
- }
- function formatDebug(result) {
- var formatted = "";
- switch (typeof result) {
- case "object":
- formatted = jsonToHTML(result);
- break;
- default:
- formatted = result;
- }
- return (
- '<pre class="whitebox bg-org text-success default-scroller">' +
- formatted +
- "</pre>"
- );
- }
- function getDebugPreInfo() {
- var formatted =
- "Version: " +
- activeInfo.version +
- "<br/>Branch: " +
- activeInfo.branch +
- "<br/>Server OS: " +
- activeInfo.serverOS +
- "<br/>PHP: " +
- activeInfo.phpVersion +
- "<br/>Install Type: " +
- (activeInfo.settings.misc.docker ? "Official Docker" : "Native") +
- "<br/>Auth Type: " +
- activeInfo.settings.misc.authType +
- "<br/>Auth Backend: " +
- activeInfo.settings.misc.authBackend +
- "<br/>Installed Plugins: " +
- formatDebug(activeInfo.settings.misc.installedPlugins) +
- "<br/>Installed Themes: " +
- formatDebug(activeInfo.settings.misc.installedThemes) +
- "<br/>Theme: " +
- activeInfo.theme +
- "<br/>Local: " +
- activeInfo.settings.user.local +
- "<br/>oAuth: " +
- activeInfo.settings.user.oAuthLogin +
- "<br/>Agent: " +
- activeInfo.settings.user.agent;
- formatted =
- '<pre class="whitebox bg-org text-success">' + formatted + "</pre>";
- $("#debugPreInfo").html(formatted);
- if (bowser.mobile !== true) {
- $("#debugPreInfo > .whitebox").slimScroll();
- }
- }
- function orgDebugList(cmd) {
- if (cmd !== "") {
- $("#debug-input").val(cmd);
- orgDebug();
- }
- }
- function updateIssueLink(line) {
- let preNumber = line.match(/\S*\#(.*)/g);
- if (preNumber !== null) {
- preNumber = preNumber.toString();
- let numberSplit = preNumber.split("#");
- let issueType = numberSplit[0].replace("(", "").replace(")", "");
- let issueNumber = numberSplit[1].replace("(", "").replace(")", "");
- let issueWord =
- issueType.toLowerCase() == "fr"
- ? '<i class="icon-arrow-up-circle"></i> feature'
- : '<i class="fa fa-github"></i> issue';
- let colorType =
- issueType.toLowerCase() == "fr" ? "label-info" : "label-primary";
- let issueLink =
- issueType.toLowerCase() == "fr"
- ? "https://feature.organizr.app/posts/" + issueNumber
- : "https://github.com/causefx/Organizr/issues/" + issueNumber;
- issueLink =
- '<span class="label upgrade-label text-uppercase ' +
- colorType +
- ' label-rounded font-12 pull-right"><a class="text-white text-uppercase" href="' +
- issueLink +
- '" target="_blank">' +
- issueWord +
- "</a></span>";
- return line.replace(preNumber, issueLink);
- } else {
- return line;
- }
- }
- function clipboard(trigger = true, string = null) {
- let clipboard = $("#internal-clipboard");
- if (string) {
- clipboard.attr("data-clipboard-text", string);
- }
- if (trigger) {
- clipboard.click();
- }
- }
- function getLangStrings() {
- let strings = JSON.stringify(window.langStrings, null, "\t");
- clipboard(true, strings);
- organizrConsole("JSON Function", "Copied JSON Strings to clipboard");
- }
- function getHiddenProp() {
- var prefixes = ["webkit", "moz", "ms", "o"];
- // if 'hidden' is natively supported just return it
- if ("hidden" in document) return "hidden";
- // otherwise loop over all the known prefixes until we find one
- for (var i = 0; i < prefixes.length; i++) {
- if (prefixes[i] + "Hidden" in document) return prefixes[i] + "Hidden";
- }
- // otherwise it's not supported
- return null;
- }
- function isHidden() {
- var prop = getHiddenProp();
- if (!prop) return false;
- return document[prop];
- }
- function loadLanguageList() {
- $.each(languageList, function (i, v) {
- lang.dynamic(v.code, "js/langpack/" + v.filename);
- });
- }
- function sleep(ms) {
- return new Promise((resolve) => setTimeout(resolve, ms));
- }
- function contains(target, pattern) {
- var value = 0;
- pattern.forEach(function (word) {
- value = value + target.includes(word);
- });
- return value === 1;
- }
- function isNumberKey(evt) {
- var charCode = evt.which ? evt.which : event.keyCode;
- if (charCode < 48 || charCode > 57) return false;
- return true;
- }
- function setTabInfo(id, action, value) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole("Set Tab Info", "No Tab Info Found... Id: " + id, "error");
- return false;
- }
- let tab = cleanClass(tabInfo.name);
- if (
- tab == "Organizr-Support" ||
- tab == "Organizr-Docs" ||
- tab == "Feature-Request"
- ) {
- return false;
- }
- if (tab !== null && action !== null && value !== null) {
- switch (action) {
- case "active":
- $.each(tabInformation, function (i, v) {
- tabInformation[i]["active"] = false;
- });
- break;
- default:
- //nada
- }
- tabInformation[id][action] = value;
- } else {
- return false;
- }
- }
- function tabTimerAction() {
- if (tabActionsList.close.length > 0) {
- $.each(tabActionsList.close, function (i, v) {
- var tab = v.tab;
- var minutes = tabInformation[v.id]["tabInfo"]["timeout_ms"] / 1000 / 60;
- var process = false;
- if (tabInformation[v.id]["loaded"]) {
- if (tabInformation[v.id]["active"] && idleTime >= 1) {
- process = true;
- }
- if (tabInformation[v.id]["active"] === false) {
- process = true;
- }
- if (process) {
- tabInformation[v.id]["increments"] =
- tabInformation[v.id]["increments"] + 1;
- if (tabInformation[v.id]["increments"] >= minutes) {
- tabInformation[v.id]["increments"] = 0;
- organizrConsole("Tab Function", "Auto Closing tab: " + tab);
- closeTab(v.id);
- }
- }
- }
- });
- }
- if (tabActionsList.refresh.length > 0) {
- $.each(tabActionsList.refresh, function (i, v) {
- var tab = v.tab;
- var minutes = tabInformation[v.id]["tabInfo"]["timeout_ms"] / 1000 / 60;
- var process = false;
- if (tabInformation[v.id]["loaded"]) {
- tabInformation[v.id]["increments"] =
- tabInformation[v.id]["increments"] + 1;
- if (tabInformation[v.id]["increments"] >= minutes) {
- tabInformation[v.id]["increments"] = 0;
- organizrConsole("Tab Function", "Auto Reloading tab: " + tab);
- reloadTab(v.id);
- }
- }
- });
- }
- }
- function timerIncrement() {
- increment = increment + 1;
- tabTimerAction();
- //check for cookieExpiry
- if (hasCookie) {
- if (getCookie("organizrToken")) {
- //do nothing
- } else {
- location.reload();
- }
- }
- idleTime = idleTime + 1;
- if (typeof activeInfo !== "undefined") {
- if (
- activeInfo.settings.lockout.enabled &&
- activeInfo.settings.user.oAuthLogin !== true
- ) {
- if (
- idleTime > activeInfo.settings.lockout.timer &&
- $("#lockScreen").length !== 1
- ) {
- if (
- activeInfo.user.groupID <= activeInfo.settings.lockout.minGroup &&
- activeInfo.user.groupID >= activeInfo.settings.lockout.maxGroup
- ) {
- lock();
- }
- }
- }
- }
- }
- function ajaxblocker(
- element = null,
- action = "out",
- message = "Loading...",
- background = "#707cd2",
- border = "#5761a9",
- colorText = "#fff"
- ) {
- switch (action) {
- case "in":
- case "fadein":
- $(element).block({
- message:
- '<p style="margin:0;padding:8px;font-size:24px;" lang="en">' +
- message +
- "</p>",
- css: {
- color: colorText,
- border: "1px solid " + border,
- backgroundColor: background,
- },
- });
- break;
- case "out":
- case "fadeout":
- $(element).unblock();
- break;
- default:
- $(element).unblock();
- }
- }
- function ajaxloader(element = null, action = "out") {
- var loader = `
- <div class="ajaxloader">
- <svg class="circular" viewBox="25 25 50 50">
- <circle class="path" cx="50" cy="50" fill="none" r="20" stroke-miterlimit="10" stroke-width="5"></circle>
- </svg>
- </div>`;
- switch (action) {
- case "in":
- case "fadein":
- $(loader).appendTo(element);
- break;
- case "out":
- case "fadeout":
- $(".ajaxloader").remove();
- break;
- default:
- $(".ajaxloader").remove();
- }
- }
- function getDefault(id) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- if (getHash() === false) {
- organizrConsole("Get Default", "No Tab Info Found... Id: " + id, "error");
- organizrConsole(
- "Get Default",
- "Trying to load next tab in cycle",
- "error"
- );
- loadNextTab(true);
- return false;
- }
- }
- if (
- getHash() === false ||
- (getHash() === "OrganizrLogin" && activeInfo.user.loggedin)
- ) {
- if (tabInfo) {
- switchTab(id);
- } else {
- $(".allTabsList").first().children().click();
- }
- } else if (getHash() == "OrganizrLogin") {
- loadNextTab(true);
- } else {
- let hashTab = getHash();
- let hashType = isNaN(hashTab) ? "name" : "id";
- let tabInfo = findTab(hashTab, hashType);
- if (!tabInfo) {
- organizrConsole(
- "Get Hash",
- "No Tab Info Found... Hash: " + hashTab,
- "error"
- );
- switchTab(id);
- return false;
- }
- let type = tabInfo.type;
- if (typeof hashTab !== "undefined" && typeof type !== "undefined") {
- directToHash = true;
- switchTab(tabInfo.id);
- } else {
- console.warn("Tab Function: " + hashTab + " is not a defined tab");
- switchTab(id);
- }
- }
- }
- function getTabType(id) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Tab Type Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- return tabInfo.type;
- }
- function getHash() {
- if ($(location).attr("hash")) {
- return dirtyHash($(location).attr("hash").substr(1));
- }
- return false;
- }
- function setHash(hash) {
- window.location.hash = "#" + cleanHash(hash);
- }
- function getQueryVariable(variable) {
- var query = window.location.search.substring(1);
- var vars = query.split("&");
- for (var i = 0; i < vars.length; i++) {
- var pair = vars[i].split("=");
- if (pair[0] == variable) {
- return pair[1];
- }
- }
- return false;
- }
- function iconPrefix(source) {
- var tabIcon = source.split("::");
- var icons = {
- materialize: "mdi mdi-",
- fontawesome: "fa fa-",
- themify: "ti-",
- simpleline: "icon-",
- weathericon: "wi wi-",
- alphanumeric: "fa-fw",
- };
- if (Array.isArray(tabIcon) && tabIcon.length === 2) {
- if (tabIcon[0] !== "url" && tabIcon[0] !== "alphanumeric") {
- return '<i class="' + icons[tabIcon[0]] + tabIcon[1] + ' fa-fw"></i>';
- } else if (tabIcon[0] == "alphanumeric") {
- return '<i class="fa-fw">' + tabIcon[1] + "</i>";
- } else {
- return '<img class="fa-fw" src="' + tabIcon[1] + '" alt="tabIcon" />';
- }
- } else {
- return '<img class="fa-fw" src="' + source + '" alt="tabIcon" />';
- }
- }
- function iconPrefixSplash(source) {
- var tabIcon = source.split("::");
- var icons = {
- materialize: "mdi mdi-",
- fontawesome: "fa fa-",
- themify: "ti-",
- simpleline: "icon-",
- weathericon: "wi wi-",
- alphanumeric: "fa-fw",
- };
- if (Array.isArray(tabIcon) && tabIcon.length === 2) {
- if (tabIcon[0] !== "url" && tabIcon[0] !== "alphanumeric") {
- return '<i class="' + icons[tabIcon[0]] + tabIcon[1] + ' fa-fw"></i>';
- } else if (tabIcon[0] == "alphanumeric") {
- return '<i class="fa-fw">' + tabIcon[1] + "</i>";
- } else {
- return tabIcon[1];
- }
- } else {
- return source;
- }
- }
- function cleanClass(string) {
- return string.replace(/ +/g, "-").replace(/\W+/g, "-");
- }
- function cleanHash(hash) {
- hash = encodeURI(hash);
- return hash.replaceAll("%20", "-");
- }
- function dirtyHash(hash) {
- hash = hash.replaceAll("-", "%20");
- return decodeURI(hash);
- }
- // What the hell is this? I don't remember this lol
- function noTabs(arrayItems) {
- if (arrayItems.data.user.loggedin === true) {
- organizrAPI2("GET", "api/v2/page/tabs")
- .success(function (data) {
- try {
- var json = data.response;
- organizrConsole("Organizr Function", "No tabs available");
- $(json.data).appendTo($(".organizr-area"));
- $(".organizr-area").removeClass("hidden");
- $("#preloader").fadeOut();
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Error");
- });
- } else {
- $(".show-login").trigger("click");
- }
- }
- function formatImage(icon) {
- if (!icon.id || icon.text == "Select or type Image") {
- return icon.text;
- }
- var baseUrl = "/user/pages/images/flags";
- var $icon = $(
- '<span><img src="' +
- icon.id +
- '" class="img-chooser" /> ' +
- icon.text +
- "</span>"
- );
- return $icon;
- }
- function formatIcon(icon) {
- if (!icon.id || icon.text == "Select or type Icon") {
- return icon.text;
- }
- var $icon = $("<span>" + iconPrefix(icon.id) + icon.text + "</span>");
- return $icon;
- }
- function logout() {
- message(
- "",
- " Goodbye!",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "10000"
- );
- organizrAPI2("GET", "api/v2/logout")
- .success(function (data) {
- local("set", "message", "Goodbye|Logout Successful|success");
- history.replaceState(null, null, " ");
- if (
- activeInfo.settings.misc.authProxyOverrideLogout &&
- activeInfo.settings.misc.authProxyLogoutURL !== ""
- ) {
- location.href = activeInfo.settings.misc.authProxyLogoutURL;
- } else {
- location.reload();
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Logout Failed");
- });
- }
- function reloadOrganizr() {
- location.reload();
- }
- function hideFrames(split = null) {
- let extra = split ? "-right" : "";
- $(".iFrame-listing" + extra + " div[class^='frame-container']")
- .addClass("hidden")
- .removeClass("show");
- $(".internal-listing" + extra + " div[class^='internal-container']")
- .addClass("hidden")
- .removeClass("show");
- $(".plugin-listing" + extra + " div[class^='plugin-container']")
- .addClass("hidden")
- .removeClass("show");
- }
- function closeSideMenu() {
- $(".content-wrapper").removeClass("show-sidebar");
- }
- function removeMenuActive() {
- $("#side-menu a").removeClass("active");
- }
- function swapDisplay(type, split) {
- let extra = split ? "-right" : "";
- switch (type) {
- case "internal":
- $("body").removeClass("fix-header");
- $(".iFrame-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- $(".internal-listing" + extra)
- .addClass("show")
- .removeClass("hidden");
- $(".login-area").addClass("hidden").removeClass("show");
- $(".plugin-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- //$('body').removeClass('fix-header');
- if (split) {
- $("#page-wrapper").addClass("split");
- $("#page-wrapper-right").removeClass("hidden");
- }
- break;
- case "iframe":
- $("body").addClass("fix-header");
- $(".iFrame-listing" + extra)
- .addClass("show")
- .removeClass("hidden");
- $(".internal-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- $(".login-area").addClass("hidden").removeClass("show");
- $(".plugin-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- //$('body').addClass('fix-header');
- if (split) {
- $("#page-wrapper").addClass("split");
- $("#page-wrapper-right").removeClass("hidden");
- }
- break;
- case "login":
- $("body").removeClass("fix-header");
- $(".iFrame-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- $(".internal-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- $(".login-area").addClass("show").removeClass("hidden");
- $(".plugin-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- if (activeInfo.settings.misc.minimalLoginScreen == true) {
- $(".sidebar").addClass("hidden");
- $(".navbar").addClass("hidden");
- $("#page-wrapper").addClass("hidden");
- }
- if (split) {
- $("#page-wrapper").addClass("split");
- $("#page-wrapper-right").removeClass("hidden");
- }
- break;
- case "plugin":
- $(".iFrame-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- $(".internal-listing" + extra)
- .addClass("hidden")
- .removeClass("show");
- $(".login-area").addClass("hidden").removeClass("show");
- $(".plugin-listing" + extra)
- .addClass("show")
- .removeClass("hidden");
- if (split) {
- $("#page-wrapper").addClass("split");
- $("#page-wrapper-right").removeClass("hidden");
- }
- break;
- default:
- }
- }
- function toggleParentActive(id) {
- var childTab = $("#menu-" + id);
- if (childTab.parent().hasClass("nav-second-level")) {
- if (!childTab.parent().hasClass("in")) {
- childTab.parent().addClass("collapse in");
- childTab.parent().parent().addClass("active");
- }
- }
- }
- function swapBodyClass(id) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole("Swap Body", "No Tab Info Found... Id: " + id, "error");
- return false;
- }
- let prior = $("body").attr("data-active-tab");
- let priorId = $("body").attr("data-active-tab-id");
- if (prior !== "") {
- $("body").removeClass("active-tab-" + prior);
- $("body").removeClass("active-tab-" + priorId);
- }
- $("body").attr("data-active-tab", tabInfo.name);
- $("body").attr("data-active-tab-id", tabInfo.id);
- $("body").addClass("active-tab-" + tabInfo.name);
- $("body").addClass("active-tab-" + tabInfo.id);
- }
- function editPageTitle(title) {
- document.title = title + " - " + activeInfo.appearance.title;
- }
- function switchToPlugin(plugin) {
- closeSideMenu();
- removeMenuActive();
- swapDisplay("plugin");
- $(".plugin-container").each(function () {
- $(this).addClass("hidden").removeClass("show");
- });
- $("#container-plugin-" + plugin)
- .addClass("show")
- .removeClass("hidden");
- }
- function switchTab(id, split = null) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole("Switch Tab", "No Tab Info Found... Id: " + id, "error");
- return false;
- }
- if (activeInfo.settings.misc.collapseSideMenuOnClick) {
- if (!$(".navbar ").hasClass("sidebar-hidden")) {
- toggleSideMenu();
- }
- }
- let extra = split ? "right-" : "";
- let type = tabInfo.type;
- // need to rework for split
- if (type !== 2) {
- hideFrames(split);
- closeSideMenu();
- removeMenuActive();
- toggleParentActive(id);
- swapBodyClass(id);
- }
- if (type !== 2 && type !== "plugin") {
- setHash(tabInfo.name);
- }
- switch (type) {
- case 0:
- case "0":
- case "internal":
- swapDisplay("internal", split);
- var newTab = $("#internal-" + extra + id);
- $("#menu-" + id)
- .find("a")
- .addClass("active");
- editPageTitle(tabInfo.name);
- if (newTab.hasClass("loaded")) {
- organizrConsole("Tab Function", "Switching to tab: " + tabInfo.name);
- newTab.addClass("show").removeClass("hidden");
- setTabInfo(id, "active", true);
- } else {
- //$("#preloader").fadeIn();
- organizrConsole("Tab Function", "Loading new tab for: " + tabInfo.name);
- $("#menu-" + id + " a")
- .children()
- .addClass("tabLoaded");
- newTab.addClass("show loaded").removeClass("hidden");
- loadInternal(id, split);
- setTabInfo(id, "active", true);
- setTabInfo(id, "loaded", true);
- //$("#preloader").fadeOut();
- }
- break;
- case 1:
- case "1":
- case "iframe":
- swapDisplay("iframe", split);
- var newTab = $("#container-" + extra + id);
- var tabURL = newTab.attr("data-url");
- $("#menu-" + id)
- .find("a")
- .addClass("active");
- editPageTitle(tabInfo.name);
- if (newTab.hasClass("loaded")) {
- organizrConsole("Tab Function", "Switching to tab: " + tabInfo.name);
- newTab.addClass("show").removeClass("hidden");
- setTabInfo(id, "active", true);
- } else {
- $("#preloader").fadeIn();
- organizrConsole("Tab Function", "Loading new tab for: " + tabInfo.name);
- $("#menu-" + id + " a")
- .children()
- .addClass("tabLoaded");
- newTab.addClass("show loaded").removeClass("hidden");
- $(buildFrame(id, extra)).appendTo(newTab);
- setTabInfo(id, "active", true);
- setTabInfo(id, "loaded", true);
- $("#preloader").fadeOut();
- }
- $("#frame-" + id).focus();
- break;
- case 2:
- case 3:
- case "2":
- case "3":
- case "_blank":
- case "popout":
- popTab(id);
- break;
- case "plugin":
- swapDisplay("plugin");
- $("#container-plugin-" + id)
- .addClass("show")
- .removeClass("hidden");
- break;
- default:
- organizrConsole("Tab Function", "Action not set", "error");
- }
- }
- function popTab(id) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Pop Tab Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- let name = tabInfo.name;
- switch (tabInfo.type) {
- case 0:
- case "0":
- case "internal":
- console.warn(
- "Tab Function: New window not supported for tab id: " +
- id +
- " | " +
- name
- );
- break;
- case 1:
- case "1":
- case "iframe":
- case 2:
- case 3:
- case "2":
- case "3":
- case "_blank":
- case "popout":
- organizrConsole(
- "Tab Function",
- "Creating New Window for tab id: " + id + " | " + name
- );
- window.open(tabInfo.access_url, "_blank");
- break;
- default:
- organizrConsole("Tab Function", "Action not set", "error");
- }
- }
- function closeTab(id) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Close Tab Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- // check if current tab?
- if ($(".active-tab-" + id).length > 0) {
- closeCurrentTab(event);
- } else {
- if ($(".frame-" + id).hasClass("loaded")) {
- switch (tabInfo.type) {
- case 0:
- case "0":
- case "internal":
- // quick check if homepage
- if (tabInfo.access_url == "api/v2/page/homepage") {
- organizrConsole(
- "Organizr Function",
- "Clearing All Homepage AJAX calls"
- );
- clearAJAX("homepage");
- $.xhrPool.abortAll();
- }
- organizrConsole("Tab Function", "Closing tab: " + tabInfo.name);
- $("#internal-" + id).html("");
- $("#menu-" + id + " a").removeClass("active");
- $("#menu-" + id + " a")
- .children()
- .removeClass("tabLoaded");
- $("#internal-" + id).removeClass("loaded show");
- $("#menu-" + id).removeClass("active");
- setTabInfo(id, "loaded", false);
- break;
- case 1:
- case "1":
- case "iframe":
- organizrConsole("Tab Function", "Closing tab: " + tab);
- $("#menu-" + id + " a").removeClass("active");
- $("#menu-" + id + " a")
- .children()
- .removeClass("tabLoaded");
- $("#container-" + id).removeClass("loaded show");
- $("#frame-" + id).remove();
- setTabInfo(id, "loaded", false);
- break;
- case 2:
- case 3:
- case "2":
- case "3":
- case "_blank":
- case "popout":
- break;
- default:
- organizrConsole("Tab Function", "Action not set", "error");
- }
- }
- }
- }
- function reloadTab(id) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Reload Tab Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- $("#preloader").fadeIn();
- organizrConsole("Tab Function", "Reloading tab: " + tabInfo.name);
- switch (tabInfo.type) {
- case 0:
- case "0":
- case "internal":
- if (tabInfo.access_url == "api/v2/page/homepage") {
- organizrConsole(
- "Organizr Function",
- "Clearing All Homepage AJAX calls"
- );
- clearAJAX("homepage");
- $.xhrPool.abortAll();
- }
- $("#frame-" + id).html("");
- loadInternal(id);
- break;
- case 1:
- case "1":
- case "iframe":
- $("#frame-" + id).attr("src", $("#frame-" + id).attr("src"));
- break;
- case 2:
- case 3:
- case "2":
- case "3":
- case "_blank":
- case "popout":
- break;
- default:
- organizrConsole("Tab Function", "Action not set", "error");
- }
- $("#preloader").fadeOut();
- }
- function reloadCurrentTab() {
- //$("#preloader").fadeIn();
- organizrConsole("Tab Function", "Reloading Current tab");
- let id = null;
- let iframe = $(".iFrame-listing").find(".show");
- let internal = $(".internal-listing").find(".show");
- if (iframe.length > 0) {
- var type = "iframe";
- } else if (internal.length > 0) {
- var type = "internal";
- } else {
- var type = "not set";
- }
- switch (type) {
- case 0:
- case "0":
- case "internal":
- let activeInternal = $(".internal-listing").find(".show");
- if (activeInternal) {
- id = activeInternal.attr("id");
- id = id.split("-")[1];
- }
- if (id) {
- var tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Reload Current Tab Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- } else {
- return false;
- }
- if (tabInfo.access_url == "api/v2/page/homepage") {
- organizrConsole(
- "Organizr Function",
- "Clearing All Homepage AJAX calls"
- );
- clearAJAX("homepage");
- $.xhrPool.abortAll();
- }
- $(activeInternal).html("");
- loadInternal(id);
- break;
- case 1:
- case "1":
- case "iframe":
- let activeFrame = $(".iFrame-listing").find(".show").children("iframe");
- if (RegExp("^/.*").test(activeFrame.attr("src"))) {
- activeFrame.attr("src", activeFrame[0].contentWindow.location.pathname);
- } else {
- activeFrame.attr("src", activeFrame.attr("src"));
- }
- break;
- case 2:
- case 3:
- case "2":
- case "3":
- case "_blank":
- case "popout":
- break;
- default:
- console.error("Tab Function: Action not set");
- }
- //$("#preloader").fadeOut();
- }
- function loadNextTab(loadNextTabIfNotLoaded = false) {
- let next = $("#page-wrapper").find(".loaded").attr("id");
- if (next) {
- next = next.split("-")[1];
- }
- if (typeof next !== "undefined") {
- let parent = $("#menu-" + next).parent();
- if (
- parent.hasClass("in") === false &&
- parent.hasClass("nav-second-level")
- ) {
- parent.parent().find("a").first().trigger("click");
- }
- switchTab(next);
- } else {
- if (loadNextTabIfNotLoaded) {
- if (findTab(0, "type")) {
- var id = findTab(0, "type")["id"];
- } else {
- var id = findTab(1, "type")["id"];
- }
- tabActions(1, id);
- } else {
- organizrConsole("Tab Function", "No Available Tab to open", "error");
- }
- }
- }
- function closeCurrentTab(event) {
- let extra = "";
- let split = "";
- if (typeof event !== "undefined") {
- if (event.ctrlKey && event.altKey && !event.shiftKey) {
- extra = "-right";
- split = true;
- }
- }
- if ($(".plugin-listing").hasClass("show")) {
- hideFrames(split);
- loadNextTab();
- return false;
- }
- let id = $("body").attr("data-active-tab-id");
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Close Current Tab Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- var iframe = $(".iFrame-listing" + extra).find(".show");
- var internal = $(".internal-listing" + extra).find(".show");
- if (iframe.length > 0) {
- var type = "iframe";
- } else if (internal.length > 0) {
- var type = "internal";
- } else {
- var type = "not set";
- }
- switch (type) {
- case 0:
- case "0":
- case "internal":
- // quick check if homepage
- if (tabInfo.access_url == "api/v2/page/homepage") {
- organizrConsole(
- "Organizr Function",
- "Clearing All Homepage AJAX calls"
- );
- clearAJAX("homepage");
- $.xhrPool.abortAll();
- }
- organizrConsole("Organizr Function", "Closing tab: " + tabInfo.name);
- $("#internal" + extra + "-" + id).html("");
- $("#menu-" + id + " a").removeClass("active");
- $("#menu-" + id + " a")
- .children()
- .removeClass("tabLoaded");
- $("#internal" + extra + "-" + id).removeClass("loaded show");
- $("#menu-" + id).removeClass("active");
- setTabInfo(id, "loaded", false);
- setTabInfo(id, "active", false);
- loadNextTab();
- break;
- case 1:
- case "1":
- case "iframe":
- organizrConsole("Organizr Function", "Closing tab: " + tabInfo.name);
- $("#menu-" + id + " a").removeClass("active");
- $("#menu-" + id + " a")
- .children()
- .removeClass("tabLoaded");
- $("#container" + extra + "-" + id)
- .removeClass("loaded show")
- .addClass("hidden");
- $("#frame" + extra + "-" + id).remove();
- setTabInfo(id, "loaded", false);
- setTabInfo(id, "active", false);
- loadNextTab();
- break;
- case 2:
- case 3:
- case "2":
- case "3":
- case "_blank":
- case "popout":
- break;
- default:
- organizrConsole("Tab Function", "No Available Tab to open", "error");
- }
- }
- function openInNewBrowserTab() {
- let id = $("body").attr("data-active-tab-id");
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Open In New Browser Tab Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- let url = tabInfo.access_url;
- window.open(url, "_blank");
- }
- function findTab(query, term = "id") {
- let tabInfo = activeInfo.tabs.filter((tab) => tab[term] == query);
- return tabInfo.length >= 1 ? tabInfo[0] : false;
- }
- function tabActions(event, id, redirectURL = "") {
- if (event.which == 3) {
- return false;
- }
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Tab Action Function",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- let type = tabInfo.type;
- let name = tabInfo.name;
- if ((event.ctrlKey && !event.shiftKey && !event.altKey) || event.which == 2) {
- popTab(id);
- } else if (event.altKey && !event.shiftKey && !event.ctrlKey) {
- closeTab(id);
- } else if (event.shiftKey && !event.ctrlKey && !event.altKey) {
- reloadTab(id);
- } else if (event.ctrlKey && event.shiftKey && !event.altKey) {
- organizrConsole("Tab Function", "Action not defined yet", "info");
- } else if (event.ctrlKey && event.altKey && !event.shiftKey) {
- organizrConsole("Tab Function", "Action not defined yet", "info");
- switchTab(id, true);
- } else if (event.shiftKey && event.altKey && !event.ctrlKey) {
- organizrConsole("Tab Function", "Action not defined yet", "info");
- } else {
- switchTab(id);
- if (type !== 2) {
- $(".splash-screen").removeClass("in").addClass("hidden");
- }
- if (redirectURL) {
- $(".close-popup").trigger("click");
- $("#frame-" + id).attr("src", redirectURL);
- }
- }
- }
- function reverseObject(object) {
- var newObject = {};
- var keys = [];
- for (var key in object) {
- keys.push(key);
- }
- for (var i = keys.length - 1; i >= 0; i--) {
- var value = object[keys[i]];
- newObject[keys[i]] = value;
- }
- return newObject;
- }
- function hasValue(test) {
- if (Array.isArray(test) && test[0] !== "") {
- return true;
- } else {
- return false;
- }
- }
- function arrayContains(needle, arrhaystack) {
- return arrhaystack.indexOf(needle) > -1;
- }
- /* END NORMAL FUNCTIONS */
- /* BUILD FUNCTIONS */
- /* END BUILD FUNCTIONS */
- /* ORGANIZR API FUNCTIONS */
- function selectOptions(options, active) {
- var selectOptions = "";
- $.each(options, function (i, v) {
- activeTest = active.split(",");
- if (activeTest.length > 1) {
- var selected = arrayContains(v.value, activeTest) ? "selected" : "";
- } else {
- var selected = active.toString() == v.value ? "selected" : "";
- }
- var disabled = v.disabled ? " disabled" : "";
- selectOptions +=
- "<option " +
- selected +
- disabled +
- ' value="' +
- v.value +
- '">' +
- v.name +
- "</option>";
- });
- return selectOptions;
- }
- function accordionOptions(options, parentID) {
- var accordionOptions = "";
- $.each(options, function (i, v) {
- var id = v.id;
- var extraClass = v.class ? " " + v.class : "";
- var header = v.header ? " " + v.header : "";
- if (typeof v.body == "object") {
- if (typeof v.body.length == "undefined") {
- var body = buildFormItem(v.body);
- } else {
- var body = "";
- $.each(v.body, function (int, val) {
- body += buildFormItem(val);
- });
- }
- } else {
- var body = v.body;
- }
- accordionOptions +=
- `
- <div class="panel">
- <div class="panel-heading" id="` +
- id +
- `-heading" role="tab">
- <a class="panel-title collapsed" data-toggle="collapse" href="#` +
- id +
- `-collapse" data-parent="#` +
- parentID +
- `" aria-expanded="false" aria-controls="` +
- id +
- `-collapse"><span lang="en">` +
- header +
- `</span></a>
- </div>
- <div class="panel-collapse collapse" id="` +
- id +
- `-collapse" aria-labelledby="` +
- id +
- `-heading" role="tabpanel" aria-expanded="false" style="height: 0px;">
- <div class="panel-body">` +
- body +
- `</div>
- </div>
- </div>
- `;
- });
- return accordionOptions;
- }
- function buildAccordion(array, open = false) {
- var items = "";
- var mainId = createRandomString(10);
- $.each(array, function (i, v) {
- var collapse = open && i == 0 ? "collapse in" : "collapse";
- var collapsed = open && i == 0 ? "" : "collapsed";
- var id = mainId + "-" + i;
- items +=
- `
- <div class="panel">
- <div class="panel-heading bg-org" id="` +
- id +
- `-heading" role="tab"> <a class="panel-title ` +
- collapsed +
- `" data-toggle="collapse" href="#` +
- id +
- `-collapse" data-parent="#` +
- mainId +
- `" aria-expanded="false" aria-controls="` +
- id +
- `-collapse"> <span lang="en">` +
- v.title +
- `</span> </a> </div>
- <div class="panel-collapse ` +
- collapse +
- `" id="` +
- id +
- `-collapse" aria-labelledby="` +
- id +
- `-heading" role="tabpanel">
- <div class="panel-body" lang="en"> ` +
- v.body +
- ` </div>
- </div>
- </div>
- `;
- });
- return (
- '<div class="panel-group" id="' +
- mainId +
- '" aria-multiselectable="true" role="tablist">' +
- items +
- "</div>"
- );
- }
- function buildFormItem(item) {
- var placeholder = item.placeholder
- ? ' placeholder="' + item.placeholder + '"'
- : "";
- var id = item.id ? ' id="' + item.id + '"' : "";
- var type = item.type ? ' data-type="' + item.type + '"' : "";
- var label = item.label ? ' data-label="' + item.label + '"' : "";
- var value = item.value ? ' value="' + item.value + '"' : "";
- var textarea = item.value ? item.value : "";
- var name = item.name ? ' name="' + item.name + '"' : "";
- var extraClass = item.class ? " " + item.class : "";
- var icon = item.icon ? " " + item.icon : "";
- var text = item.text ? " " + item.text : "";
- var attr = item.attr ? " " + item.attr : "";
- var disabled = item.disabled ? " disabled" : "";
- var href = item.href ? ' href="' + item.href + '"' : "";
- var pwd1 = createRandomString(6);
- var pwd2 = createRandomString(6);
- var pwd3 = createRandomString(6);
- var helpInfo = item.help
- ? '<div class="collapse" id="help-info-' +
- item.name +
- '"><blockquote lang="en">' +
- item.help +
- "</blockquote></div>"
- : "";
- var smallLabel = item.smallLabel
- ? '<label><span lang="en">' + item.smallLabel + "</span></label>" + helpInfo
- : "" + helpInfo;
- var pwgMgr =
- `
- <input name="disable-pwd-mgr-` +
- pwd1 +
- `" type="password" id="disable-pwd-mgr-` +
- pwd1 +
- `" style="display: none;" value="disable-pwd-mgr-` +
- pwd1 +
- `" />
- <input name="disable-pwd-mgr-` +
- pwd2 +
- `" type="password" id="disable-pwd-mgr-` +
- pwd2 +
- `" style="display: none;" value="disable-pwd-mgr-` +
- pwd2 +
- `" />
- <input name="disable-pwd-mgr-` +
- pwd3 +
- `" type="password" id="disable-pwd-mgr-` +
- pwd3 +
- `" style="display: none;" value="disable-pwd-mgr-` +
- pwd3 +
- `" />
- `;
- //+tof(item.value,'c')+`
- switch (item.type) {
- case "select-input":
- return (
- smallLabel +
- '<input list="' +
- item.name +
- 'Options" data-changed="false" lang="en" type="text" class="form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' autocomplete="new-password" /><datalist id="' +
- item.name +
- 'Options">' +
- selectOptions(item.options, item.value) +
- "</datalist>"
- );
- case "input":
- case "text":
- return (
- smallLabel +
- '<input data-changed="false" lang="en" type="text" class="form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' autocomplete="new-password" />'
- );
- case "number":
- return (
- smallLabel +
- '<input data-changed="false" lang="en" type="number" class="form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' autocomplete="new-password" />'
- );
- case "textbox":
- return (
- smallLabel +
- '<textarea data-changed="false" class="form-control' +
- extraClass +
- '"' +
- placeholder +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' autocomplete="new-password">' +
- textarea +
- "</textarea>"
- );
- case "password":
- return (
- smallLabel +
- pwgMgr +
- '<input data-changed="false" lang="en" type="password" class="form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' autocomplete="new-password" />'
- );
- case "password-alt":
- return (
- smallLabel +
- '<div class="input-group">' +
- pwgMgr +
- '<input data-changed="false" lang="en" type="password" class="password-alt form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' autocomplete="new-password" /><span class="input-group-btn"> <button class="btn btn-default showPassword" type="button"><i class="fa fa-eye passwordToggle"></i></button></span></div>'
- );
- case "password-alt-copy":
- return (
- smallLabel +
- '<div class="input-group">' +
- pwgMgr +
- '<input data-changed="false" lang="en" type="password" class="password-alt form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' autocomplete="new-password" /><span class="input-group-btn"> <button class="btn btn-primary clipboard" type="button" data-clipboard-text="' +
- item.value +
- '"><i class="fa icon-docs"></i></button></span><span class="input-group-btn"> <button class="btn btn-inverse showPassword" type="button"><i class="fa fa-eye passwordToggle"></i></button></span></div>'
- );
- case "hidden":
- return (
- '<input data-changed="false" lang="en" type="hidden" class="form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- " />"
- );
- case "select":
- return (
- smallLabel +
- '<select data-changed="false" class="form-control' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ">" +
- selectOptions(item.options, item.value) +
- "</select>"
- );
- case "select2":
- var select2ID = item.id ? "#" + item.id : "." + item.name;
- let settings = item.settings ? item.settings : "{}";
- return (
- smallLabel +
- '<select class="m-b-10 ' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' multiple="multiple" data-placeholder="">' +
- selectOptions(item.options, item.value) +
- '</select><script>$("' +
- select2ID +
- '").select2(' +
- settings +
- ').on("select2:unselecting", function() { $(this).data("unselecting", true); }).on("select2:opening", function(e) { if ($(this).data("unselecting")) { $(this).removeData("unselecting"); e.preventDefault(); } });</script>'
- );
- case "switch":
- case "checkbox":
- return (
- smallLabel +
- '<input data-changed="false" type="checkbox" class="js-switch' +
- extraClass +
- '" data-size="medium" data-color="#99d683" data-secondary-color="#f96262"' +
- name +
- value +
- tof(item.value, "c") +
- id +
- disabled +
- type +
- label +
- attr +
- ' /><input data-changed="false" type="hidden"' +
- name +
- 'value="false">'
- );
- case "button":
- return (
- smallLabel +
- '<button class="btn btn-sm btn-success btn-rounded waves-effect waves-light b-none' +
- extraClass +
- '" ' +
- href +
- attr +
- ' type="button"><span class="btn-label"><i class="' +
- icon +
- '"></i></span><span lang="en">' +
- text +
- "</span></button>"
- );
- case "blank":
- return "";
- case "accordion":
- return (
- '<div class="panel-group' +
- extraClass +
- '"' +
- placeholder +
- value +
- id +
- name +
- disabled +
- type +
- label +
- attr +
- ' aria-multiselectable="true" role="tablist">' +
- accordionOptions(item.options, item.id) +
- "</div>"
- );
- case "html":
- return item.html;
- case "arrayMultiple":
- return '<span class="text-danger">BuildFormItem Class not setup...';
- case "cron":
- return `${smallLabel}<div class="input-group"><input data-changed="false" class="form-control ${extraClass}" ${placeholder} ${value} ${id} ${name} ${disabled} ${type} ${label} ${attr} autocomplete="new-password"><span class="input-group-btn"><button class="btn btn-info test-cron" type="button"><i class="fa fa-flask"></i></button></span></div>`;
- case "folder":
- return `${smallLabel}<div class="input-group"><input data-changed="false" class="form-control ${extraClass}" ${placeholder} ${value} ${id} ${name} ${disabled} ${type} ${label} ${attr} autocomplete="new-password"><span class="input-group-btn"><button class="btn btn-info test-folder" type="button"><i class="fa fa-flask"></i></button></span></div>`;
- default:
- return '<span class="text-danger">BuildFormItem Class not setup...';
- }
- }
- function checkCronFile() {
- $(".cron-results-container").removeClass("hidden");
- organizrAPI2("GET", "api/v2/test/cron")
- .success(function (data) {
- try {
- $(".cron-results").text("Cron file is setup correctly");
- } catch (e) {
- $(".cron-results").text("Unknown error");
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- $(".cron-results").text("Cron file is not setup or is setup incorrectly");
- OrganizrApiError(xhr);
- });
- }
- function buildPluginsItem(array, type = "enabled") {
- var activePlugins = "";
- var inactivePlugins = "";
- $.each(array, function (i, v) {
- var settingsPage =
- v.settings == true && type == "enabled"
- ? `
- <!-- Plugin Settings Page -->
- <form id="` +
- v.idPrefix +
- `-settings-page" class="mfp-hide white-popup mfp-with-anim addFormTick col-md-10 col-md-offset-1" autocomplete="off">
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span lang="en">` +
- v.name +
- ` Settings</span>
- <button type="button" class="btn bg-org btn-circle close-popup pull-right"><i class="fa fa-times"></i> </button>
- <button id="` +
- v.idPrefix +
- `-settings-page-save" onclick="submitSettingsForm('` +
- v.idPrefix +
- `-settings-page')" class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right hidden animated loop-animation rubberBand m-r-20" type="button"><span class="btn-label"><i class="fa fa-save"></i></span><span lang="en">Save</span></button>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="bg-org">
- <fieldset id="` +
- v.idPrefix +
- `-settings-items" style="border:0;" class=""><h2>Loading...</h2></fieldset>
- </div>
- <div class="clearfix"></div>
- </div>
- </div>
- </form>
- `
- : "";
- var href =
- v.settings == true
- ? "#" + v.idPrefix + "-settings-page"
- : "javascript:void(0);";
- if (v.enabled == true) {
- var activeToggle =
- `<li><a class="btn default btn-outline disablePlugin" href="javascript:void(0);" data-plugin-name="` +
- v.name +
- `" data-config-prefix="` +
- v.configPrefix +
- `" data-config-name="` +
- v.configPrefix +
- `-enabled"><i class="ti-power-off fa-2x"></i></a></li>`;
- var settings =
- `<li><a class="btn default btn-outline popup-with-form" href="` +
- href +
- `" data-effect="mfp-3d-unfold"data-plugin-name="` +
- v.name +
- `" id="` +
- v.idPrefix +
- `-settings-button" data-config-prefix="` +
- v.configPrefix +
- `" data-api="${v.api}" data-settings="${v.settings}" data-bind="${v.bind}"><i class="ti-panel fa-2x"></i></a></li>`;
- } else {
- var activeToggle =
- `<li><a class="btn default btn-outline enablePlugin" href="javascript:void(0);" data-plugin-name="` +
- v.name +
- `" data-config-prefix="` +
- v.configPrefix +
- `" data-config-name="` +
- v.configPrefix +
- `-enabled"><i class="ti-plug fa-2x"></i></a></li>`;
- var settings = "";
- }
- var plugin =
- `
- <div class="col-lg-2 col-md-2 col-sm-6 col-xs-6 m-b-10">
- <div class="white-box m-0">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0"> <img class="lazyload" data-src="` +
- v.image +
- `">
- <div class="el-overlay">
- <ul class="el-info">
- ${settings} ${activeToggle}
- </ul>
- </div>
- </div>
- <div class="el-card-content">
- <h3 class="box-title elip">` +
- v.name +
- `</h3>
- <small class="elip text-uppercase p-b-10">` +
- v.category +
- `</small>
- </div>
- </div>
- </div>
- </div>
- `;
- if (v.enabled == true) {
- activePlugins += plugin + settingsPage;
- } else {
- inactivePlugins += plugin + settingsPage;
- }
- });
- activePlugins =
- activePlugins.length !== 0
- ? activePlugins
- : '<h2 class="text-center" lang="en">Nothing Active</h2>';
- inactivePlugins =
- inactivePlugins.length !== 0
- ? inactivePlugins
- : '<h2 class="text-center" lang="en">Everything Active</h2>';
- return type === "enabled"
- ? `
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span lang="en">Active Plugins</span>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="panel-body bg-org">
- <div class="row el-element-overlay m-b-40">` +
- activePlugins +
- `</div>
- </div>
- </div>
- </div>
- <div class="clearfix"></div>`
- : `
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span lang="en">Inactive Plugins</span>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="panel-body bg-org">
- <div class="row el-element-overlay m-b-40">` +
- inactivePlugins +
- `</div>
- </div>
- </div>
- </div>`;
- }
- function buildPluginsItemOld(array) {
- var activePlugins = "";
- var inactivePlugins = "";
- $.each(array, function (i, v) {
- var settingsPage =
- v.settings == true
- ? `
- <!-- Plugin Settings Page -->
- <form id="` +
- v.idPrefix +
- `-settings-page" class="mfp-hide white-popup mfp-with-anim addFormTick col-md-10 col-md-offset-1" autocomplete="off">
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span lang="en">` +
- v.name +
- ` Settings</span>
- <button type="button" class="btn bg-org btn-circle close-popup pull-right"><i class="fa fa-times"></i> </button>
- <button id="` +
- v.idPrefix +
- `-settings-page-save" onclick="submitSettingsForm('` +
- v.idPrefix +
- `-settings-page')" class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right hidden animated loop-animation rubberBand m-r-20" type="button"><span class="btn-label"><i class="fa fa-save"></i></span><span lang="en">Save</span></button>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="bg-org">
- <fieldset id="` +
- v.idPrefix +
- `-settings-items" style="border:0;" class=""><h2>Loading...</h2></fieldset>
- </div>
- <div class="clearfix"></div>
- </div>
- </div>
- </form>
- `
- : "";
- var href =
- v.settings == true
- ? "#" + v.idPrefix + "-settings-page"
- : "javascript:void(0);";
- if (v.enabled == true) {
- var activeToggle =
- `<li><a class="btn default btn-outline disablePlugin" href="javascript:void(0);" data-plugin-name="` +
- v.name +
- `" data-config-prefix="` +
- v.configPrefix +
- `" data-config-name="` +
- v.configPrefix +
- `-enabled"><i class="ti-power-off fa-2x"></i></a></li>`;
- var settings =
- `<li><a class="btn default btn-outline popup-with-form" href="` +
- href +
- `" data-effect="mfp-3d-unfold"data-plugin-name="` +
- v.name +
- `" id="` +
- v.idPrefix +
- `-settings-button" data-config-prefix="` +
- v.configPrefix +
- `" data-api="${v.api}" data-settings="${v.settings}" data-bind="${v.bind}"><i class="ti-panel fa-2x"></i></a></li>`;
- } else {
- var activeToggle =
- `<li><a class="btn default btn-outline enablePlugin" href="javascript:void(0);" data-plugin-name="` +
- v.name +
- `" data-config-prefix="` +
- v.configPrefix +
- `" data-config-name="` +
- v.configPrefix +
- `-enabled"><i class="ti-plug fa-2x"></i></a></li>`;
- var settings = "";
- }
- var plugin =
- `
- <div class="col-lg-2 col-md-2 col-sm-4 col-xs-4">
- <div class="white-box m-0">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0"> <img class="lazyload" data-src="` +
- v.image +
- `">
- <div class="el-overlay">
- <ul class="el-info">
- ${settings} ${activeToggle}
- </ul>
- </div>
- </div>
- <div class="el-card-content">
- <h3 class="box-title elip">` +
- v.name +
- `</h3>
- <small class="elip text-uppercase p-b-10">` +
- v.category +
- `</small>
- </div>
- </div>
- </div>
- </div>
- `;
- if (v.enabled == true) {
- activePlugins += plugin + settingsPage;
- } else {
- inactivePlugins += plugin + settingsPage;
- }
- });
- activePlugins =
- activePlugins.length !== 0
- ? activePlugins
- : '<h2 class="text-center" lang="en">Nothing Active</h2>';
- inactivePlugins =
- inactivePlugins.length !== 0
- ? inactivePlugins
- : '<h2 class="text-center" lang="en">Everything Active</h2>';
- var panes =
- `
- <select class="form-control settings-dropdown-box plugin-menu w-100 visible-xs">
- <option value="#settings-plugins-active-anchor" lang="en">Active</option>
- <option value="#settings-plugins-inactive-anchor" lang="en">Inactive</option>
- <option value="#settings-plugins-marketplace-anchor" lang="en">Marketplace</option>
- </select>
- <ul class="nav customtab2 nav-tabs nav-non-mobile hidden-xs" data-dropdown="plugin-menu" role="tablist">
- <li onclick="changeSettingsMenu('Settings::Plugins::Active')" role="presentation" class="active"><a id="settings-plugins-active-anchor" href="#settings-plugins-active" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="ti-file"></i></span><span class="hidden-xs" lang="en">Active</span></a>
- </li>
- <li onclick="changeSettingsMenu('Settings::Plugins::Inactive')" role="presentation" class=""><a id="settings-plugins-inactive-anchor" href="#settings-plugins-inactive" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="ti-zip"></i></span><span class="hidden-xs" lang="en">Inactive</span></a>
- </li>
- <li onclick="changeSettingsMenu('Settings::Plugins::Marketplace');loadMarketplace('plugins');" role="presentation" class=""><a id="settings-plugins-marketplace-anchor" href="#settings-plugins-marketplace" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="ti-shopping-cart-full"></i></span><span class="hidden-xs" lang="en">Marketplace</span></a>
- </li>
- </ul>
- <!-- Tab panes -->
- <div class="tab-content">
- <div role="tabpanel" class="tab-pane fade in active" id="settings-plugins-active">
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span lang="en">Active Plugins</span>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="panel-body bg-org">
- <div class="row el-element-overlay m-b-40">` +
- activePlugins +
- `</div>
- </div>
- </div>
- </div>
- <div class="clearfix"></div>
- </div>
- <div role="tabpanel" class="tab-pane fade" id="settings-plugins-inactive">
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span lang="en">Inactive Plugins</span>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="panel-body bg-org">
- <div class="row el-element-overlay m-b-40">` +
- inactivePlugins +
- `</div>
- </div>
- </div>
- </div>
- </div>
- <div role="tabpanel" class="tab-pane fade" id="settings-plugins-marketplace">
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span lang="en">Plugin Marketplace</span>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="table-responsive">
- <table class="table table-hover manage-u-table">
- <thead>
- <tr>
- <th width="70" class="text-center" lang="en">PLUGIN</th>
- <th></th>
- <th lang="en">CATEGORY</th>
- <th lang="en">STATUS</th>
- <th lang="en" style="text-align:center">INFO</th>
- <th lang="en" style="text-align:center">INSTALL</th>
- <th lang="en" style="text-align:center">DELETE</th>
- </tr>
- </thead>
- <tbody id="managePluginTable"></tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- return panes;
- }
- function loadMarketplace(type) {
- marketplaceJSON(type)
- .success(function (data) {
- try {
- var response = JSON.parse(data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- switch (type) {
- case "plugins":
- loadMarketplacePluginsItems(response);
- break;
- case "themes":
- loadMarketplaceThemesItems(response);
- break;
- default:
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function loadThemeMarketplace() {
- $("#manageThemeTable").html(
- '<td class="text-center" colspan="12"><i class="fa fa-spin fa-spinner"></i></td>'
- );
- organizrAPI2("GET", "api/v2/themes/marketplace")
- .success(function (data) {
- try {
- let response = data.response;
- loadMarketplaceThemesItems(response.data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "loadThemeMarketplace Failed");
- });
- }
- function loadPluginMarketplace() {
- $("#managePluginTable").html(
- '<td class="text-center" colspan="12"><i class="fa fa-spin fa-spinner"></i></td>'
- );
- organizrAPI2("GET", "api/v2/plugins/marketplace")
- .success(function (data) {
- try {
- let response = data.response;
- loadMarketplacePluginsItems(response.data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "loadPluginMarketplace Failed");
- });
- }
- function loadMarketplacePluginsItems(plugins) {
- var pluginList = "";
- $.each(plugins, function (i, v) {
- if (v.icon == null || v.icon == "") {
- v.icon = "test.png";
- }
- var installButton =
- v.status == "Update Available" ? "fa fa-download" : "fa fa-plus";
- var removeButton = v.status == "Not Installed" ? "disabled" : "";
- v.name = i;
- pluginList +=
- `
- <tr class="pluginManagement" data-name="${i}" data-version="${v.version}" data-repo="${v.repo}">
- <td class="text-center el-element-overlay">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0">
- <img alt="user-img" src="` +
- v.icon +
- `" width="45">
- </div>
- </div>
- </td>
- <td>` +
- i +
- `
- <br><span class="text-muted">` +
- v.version +
- `</span>
- <br><span class="text-muted">` +
- v.author +
- `</span>
- </td>
- <td>` +
- v.category +
- `</td>
- <td lang="en">` +
- v.status +
- `</td>
- <td style="text-align:center"><button type="button" onclick='aboutPlugin(` +
- JSON.stringify(v) +
- `);' class="btn btn-success btn-outline btn-circle btn-lg popup-with-form" href="#about-plugin-form" data-effect="mfp-3d-unfold"><i class="fa fa-info"></i></button></td>
- <td style="text-align:center"><button type="button" onclick='installPlugin("` +
- cleanClass(i) +
- `");' class="btn btn-info btn-outline btn-circle btn-lg"><i class="` +
- installButton +
- `"></i></button></td>
- <td style="text-align:center"><button type="button" onclick='removePlugin("` +
- cleanClass(i) +
- `");' class="btn btn-danger btn-outline btn-circle btn-lg" ` +
- removeButton +
- `><i class="fa fa-trash"></i></button></td>
- </tr>
- `;
- });
- $("#managePluginTable").html(pluginList);
- }
- function getRepoUsernameAndRepoName(repo) {
- let parts = repo.split("/");
- if (parts.length) {
- return parts[parts.length - 2] + "/" + parts[parts.length - 1];
- } else {
- return repo;
- }
- }
- function loadMarketplaceThemesItems(themes) {
- var themeList = "";
- $.each(themes, function (i, v) {
- if (v.icon == null || v.icon == "") {
- v.icon = "test.png";
- }
- //v.status = themeStatus(i,v.version);
- var installButton =
- v.status == "Update Available" ? "fa fa-download" : "fa fa-plus";
- var removeButton = v.status == "Not Installed" ? "disabled" : "";
- let category =
- v.repo == "https://github.com/Organizr/Organizr-Themes"
- ? "Official"
- : "3rd Party";
- let categoryTooltip = getRepoUsernameAndRepoName(v.repo);
- v.name = i;
- let cleanName = i.replace(/_/gi, " ");
- themeList += `
- <tr class="themeManagement" data-name="${i}" data-version="${
- v.version
- }">
- <td class="text-center el-element-overlay">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0">
- <img alt="user-img" src="${v.icon}" width="45">
- </div>
- </div>
- </td>
- <td>${cleanName}
- <br><span class="text-muted">${v.version}</span>
- <br><span class="text-muted">${v.author}</span>
- </td>
- <td><span data-toggle="tooltip" title="${categoryTooltip}" data-placement="bottom">${category}</span></td>
- <td lang="en">${v.status}</td>
- <td style="text-align:center"><button type="button" onclick='aboutTheme(${JSON.stringify(
- v
- )});' class="btn btn-success btn-outline btn-circle btn-lg popup-with-form" href="#about-theme-form" data-effect="mfp-3d-unfold"><i class="fa fa-info"></i></button></td>
- <td style="text-align:center"><button type="button" onclick='installTheme("${cleanClass(
- i
- )}");themeAnalytics("${
- v.name
- }");' class="btn btn-info btn-outline btn-circle btn-lg"><i class="${installButton}"></i></button></td>
- <td style="text-align:center"><button type="button" onclick='removeTheme("${cleanClass(
- i
- )}");' class="btn btn-danger btn-outline btn-circle btn-lg" ${removeButton}><i class="fa fa-trash"></i></button></td>
- </tr>
- `;
- });
- $("#manageThemeTable").html(themeList);
- }
- function aboutPluginImages(images) {
- var imageList = "";
- if (Object.keys(images).length !== 0) {
- var imageCount = 0;
- $.each(images, function (i, v) {
- imageCount++;
- var active = imageCount == 1 ? "active" : "";
- imageList +=
- `
- <div class="` +
- active +
- ` item">
- <div class="overlaybg"><img src="` +
- v +
- `" /></div>
- <div class="news-content"><span class="label label-info label-rounded">` +
- i +
- `</span></div>
- </div>
- `;
- });
- } else {
- imageList += `
- <div class="active item">
- <div class="overlaybg"><img src="https://via.placeholder.com/350x150" /></div>
- </div>
- `;
- }
- return imageList;
- }
- function aboutPluginFiles(fileList) {
- var files = [];
- $.each(fileList, function (i, v) {
- var splitFiles = v.split("|");
- var formattedSplit = [];
- $.each(splitFiles, function (i, v) {
- var arrayFilePush = {
- text: v,
- };
- formattedSplit.push(arrayFilePush);
- });
- var arrayPush = {
- text: i,
- nodes: formattedSplit,
- };
- files.push(arrayPush);
- });
- return files;
- }
- function pluginFileList(fileList, folder, type) {
- var files = [];
- $.each(fileList, function (i, v) {
- var splitFiles = v.split("|");
- var formattedSplit = [];
- var prePath = i.length !== 1 ? i + "/" : i;
- $.each(splitFiles, function (i, v) {
- var arrayPush = {
- fileName: v,
- path: prePath,
- githubPath:
- "https://raw.githubusercontent.com/causefx/Organizr/v2-" +
- type +
- "/" +
- folder +
- prePath +
- v,
- };
- files.push(arrayPush);
- });
- });
- return files;
- }
- function aboutTheme(theme) {
- var files = aboutPluginFiles(theme.files);
- var imageList = aboutPluginImages(theme.images);
- var homepageLink =
- theme.website !== "" || theme.website !== null
- ? "onclick=\"window.open('" + theme.website + "','_blank');\""
- : " ";
- var infoBox =
- `
- <div class="row">
- <div class="col-lg-6 col-sm-12 col-xs-12">
- <div class="row">
- <div class="col-lg-12 col-sm-12 col-xs-12">
- <div class="white-box p-10" id="aboutThemeScroll">
- ` +
- theme.description +
- `
- </div>
- </div>
- <div class="clearfix"> </div>
- <div class="col-lg-4 col-sm-4 col-xs-12">
- <div class="white-box mouse">
- <ul class="list-inline two-part text-center m-b-0">
- <li><i class="icon-envelope-open text-info"></i></li>
- </ul>
- </div>
- </div>
- <div class="col-lg-4 col-sm-4 col-xs-12">
- <div class="white-box mouse" ` +
- homepageLink +
- `>
- <ul class="list-inline two-part text-center m-b-0">
- <li><i class="icon-home text-danger"></i></li>
- </ul>
- </div>
- </div>
- <div class="col-lg-4 col-sm-4 col-xs-12">
- <div class="white-box mouse" onclick="$('.themeFileList').toggleClass('hidden');">
- <ul class="list-inline two-part text-center m-b-0">
- <li><i class="icon-folder text-purple"></i></li>
- </ul>
- </div>
- </div>
- <div class="col-sm-12 col-xs-12 themeFileList hidden">
- <div id="treeviewTheme" class=""></div>
- </div>
- </div>
- </div>
- <div class="col-lg-6 col-sm-12 col-xs-12">
- <div class="news-slide m-b-15">
- <div class="vcarousel slide">
- <!-- Carousel items -->
- <div class="carousel-inner">
- ` +
- imageList +
- `
- </div>
- </div>
- </div>
- </div>
- </div>`;
- $("#about-theme-title").html(
- theme.name + " <small>" + theme.version + "</small>"
- );
- $("#about-theme-body").html(infoBox);
- $(".vcarousel").carousel({
- interval: 3000,
- });
- $("#treeviewTheme").treeview({
- levels: 1,
- expandIcon: "ti-angle-right",
- onhoverColor: "rgba(0, 0, 0, 0.05)",
- selectedBackColor: "#03a9f3",
- collapseIcon: "ti-angle-down",
- data: JSON.stringify(files),
- });
- $("#aboutThemeScroll").slimScroll({
- height: "225px",
- });
- }
- function aboutPlugin(plugin) {
- var files = aboutPluginFiles(plugin.files);
- var imageList = aboutPluginImages(plugin.images);
- var homepageLink =
- plugin.website !== "" || plugin.website !== null
- ? "onclick=\"window.open('" + plugin.website + "','_blank');\""
- : " ";
- var infoBox =
- `
- <div class="row">
- <div class="col-lg-6 col-sm-12 col-xs-12">
- <div class="row">
- <div class="col-lg-12 col-sm-12 col-xs-12">
- <div class="white-box p-10" id="aboutPluginScroll">
- ` +
- plugin.description +
- `
- </div>
- </div>
- <div class="clearfix"> </div>
- <div class="col-lg-4 col-sm-4 col-xs-12">
- <div class="white-box mouse">
- <ul class="list-inline two-part text-center m-b-0">
- <li><i class="icon-envelope-open text-info"></i></li>
- </ul>
- </div>
- </div>
- <div class="col-lg-4 col-sm-4 col-xs-12">
- <div class="white-box mouse" ` +
- homepageLink +
- `>
- <ul class="list-inline two-part text-center m-b-0">
- <li><i class="icon-home text-danger"></i></li>
- </ul>
- </div>
- </div>
- <div class="col-lg-4 col-sm-4 col-xs-12">
- <div class="white-box mouse" onclick="$('.pluginFileList').toggleClass('hidden');">
- <ul class="list-inline two-part text-center m-b-0">
- <li><i class="icon-folder text-purple"></i></li>
- </ul>
- </div>
- </div>
- <div class="col-sm-12 col-xs-12 pluginFileList hidden">
- <div id="treeview5" class=""></div>
- </div>
- </div>
- </div>
- <div class="col-lg-6 col-sm-12 col-xs-12">
- <div class="news-slide m-b-15">
- <div class="vcarousel slide">
- <!-- Carousel items -->
- <div class="carousel-inner">
- ` +
- imageList +
- `
- </div>
- </div>
- </div>
- </div>
- </div>`;
- $("#about-plugin-title").html(
- plugin.name + " <small>" + plugin.version + "</small>"
- );
- $("#about-plugin-body").html(infoBox);
- $(".vcarousel").carousel({
- interval: 3000,
- });
- $("#treeview5").treeview({
- levels: 1,
- expandIcon: "ti-angle-right",
- onhoverColor: "rgba(0, 0, 0, 0.05)",
- selectedBackColor: "#03a9f3",
- collapseIcon: "ti-angle-down",
- data: JSON.stringify(files),
- });
- $("#aboutPluginScroll").slimScroll({
- height: "225px",
- });
- }
- function removePlugin(plugin = null) {
- if (plugin == null) {
- return false;
- }
- message(
- "Removing Plugin",
- plugin,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- organizrAPI2("DELETE", "api/v2/plugins/manage/" + plugin, {})
- .success(function (data) {
- try {
- let html = data.response;
- loadPluginMarketplace();
- message(
- plugin + " Removed",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Removal Failed");
- });
- }
- function removeTheme(theme = null) {
- if (theme == null) {
- return false;
- }
- message(
- "Removing Theme",
- theme,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- organizrAPI2("DELETE", "api/v2/themes/manage/" + theme, {})
- .success(function (data) {
- try {
- let html = data.response;
- loadThemeMarketplace();
- message(
- theme + " Removed",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Removal Failed");
- });
- }
- function installPlugin(plugin = null) {
- if (plugin == null) {
- return false;
- }
- message(
- "Installing Plugin",
- plugin,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- organizrAPI2("POST", "api/v2/plugins/manage/" + plugin, {})
- .success(function (data) {
- try {
- var html = data.response;
- loadPluginMarketplace();
- message(
- plugin + " Installed",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Install Failed");
- });
- }
- function installTheme(theme = null) {
- if (theme == null) {
- return false;
- }
- message(
- "Installing Theme",
- theme,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- organizrAPI2("POST", "api/v2/themes/manage/" + theme, {})
- .success(function (data) {
- try {
- var html = data.response;
- loadThemeMarketplace();
- message(
- theme + " Installed",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Install Failed");
- });
- }
- function pluginStatus(name = null, version = null) {
- var installedPlugins = [];
- var installedPluginsList = [];
- if (activeInfo.settings.misc.installedPlugins !== "") {
- installedPlugins = activeInfo.settings.misc.installedPlugins.split("|");
- $.each(installedPlugins, function (i, v) {
- var plugin = v.split(":");
- installedPluginsList[plugin[0]] = plugin[1];
- });
- if (typeof installedPluginsList[name] !== "undefined") {
- if (version !== installedPluginsList[name]) {
- return "Update Available";
- } else {
- return "Up to date";
- }
- } else {
- return "Not Installed";
- }
- } else {
- return "Not Installed";
- }
- }
- function themeStatus(name = null, version = null) {
- var installedThemes = [];
- var installedThemesList = [];
- if (activeInfo.settings.misc.installedThemes !== "") {
- installedThemes = activeInfo.settings.misc.installedThemes.split("|");
- $.each(installedThemes, function (i, v) {
- var theme = v.split(":");
- installedThemesList[theme[0]] = theme[1];
- });
- if (typeof installedThemesList[name] !== "undefined") {
- if (version !== installedThemesList[name]) {
- return "Update Available";
- } else {
- return "Up to date";
- }
- } else {
- return "Not Installed";
- }
- } else {
- return "Not Installed";
- }
- }
- function copyHomepageJSON(item) {
- organizrAPI2("GET", "api/v2/settings/homepage/" + item + "/debug")
- .success(function (data) {
- try {
- let response = data.response;
- let debug = response.data;
- clipboard(true, JSON.stringify(debug, null, "\t"));
- message(
- "",
- window.lang.translate("Copied JSON to clipboard"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Copy JSON Failed");
- });
- }
- function homepageItemFormHTML(v) {
- let docs =
- typeof v.docs == "undefined"
- ? ""
- : `<small class="pull-right m-r-5"><a data-toggle="tooltip" title="Go to Support Doc" data-placement="bottom" class="btn btn-circle btn-primary waves-effect waves-light" href="${v.docs}" target="_blank"> <i class="fa-fw fa fa-question-circle"></i></a></small>`;
- let debug = typeof v.debug == "undefined" ? false : true;
- debug = debug === true ? v.debug : false;
- debug =
- debug === true
- ? `<small class="pull-right m-r-5"><a data-toggle="tooltip" title="Copy JSON Settings" data-placement="bottom" href="javascript:copyHomepageJSON('${v.name}')" class="btn btn-circle btn-info waves-effect waves-light copyHomepageJSON"> <i class="fa-fw ti-clipboard"></i></a></small>`
- : "";
- return (
- `
- <a id="editHomepageItemCall" href="#editHomepageItemDiv" class="hidden">homepage item</a>
- <form id="homepage-` +
- v.name +
- `-form" class="white-popup mfp-with-anim homepageForm addFormTick">
- <fieldset style="border:0;" class="col-md-10 col-md-offset-1">
- <div class="panel bg-org panel-info">
- <div class="panel-heading">
- <span class="" lang="en">` +
- v.name +
- `</span>
- <button data-toggle="tooltip" title="Close" data-placement="bottom" type="button" class="btn btn-default btn-circle close-popup pull-right close-editHomepageItemDiv"><i class="fa fa-times"></i> </button>
- ${docs}${debug}
- <button data-toggle="tooltip" title="Reset" data-placement="bottom" id="homepage-` +
- v.name +
- `-form-reset" onclick="editHomepageItem('` +
- v.name +
- `', true)" class="btn btn-inverse btn-circle waves-effect waves-light pull-right hidden m-r-5" type="button"><span class=""><i class="fa fa-undo"></i></span></button>
- <button data-toggle="tooltip" title="Save" data-placement="bottom" id="homepage-` +
- v.name +
- `-form-save" onclick="submitSettingsForm('homepage-` +
- v.name +
- `-form', true)" class="btn btn-success btn-circle waves-effect waves-light pull-right hidden animated loop-animation rubberBand m-r-5" type="button"><span class=""><i class="fa fa-save"></i></span></button>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="bg-org">
- ` +
- buildFormGroup(v.settings) +
- `
- </div>
- </div>
- </div>
- </fieldset>
- <div class="clearfix"></div>
- </form>
- `
- );
- }
- function clearHomepageOriginal() {
- $("#editHomepageItem").html("");
- }
- function completeHomepageLoad(item, data) {
- /*
- if(item == 'CustomHTML'){
- let iteration = 0;
- $.each(data.settings, function(i,customItem) {
- let iterationString = (parseInt(iteration, 10) + 101).toString().substr(1);
- let customEditor = 'customHTML'+iterationString+'Editor';
- let customTextarea = 'customHTML'+iterationString+'Textarea';
- let HTMLMode = ace.require("ace/mode/html").Mode;
- customHTMLEditorObject[iterationString] = ace.edit(customEditor);
- customHTMLEditorObject[iterationString].session.setMode(new HTMLMode());
- customHTMLEditorObject[iterationString].setTheme("ace/theme/idle_fingers");
- customHTMLEditorObject[iterationString].setShowPrintMargin(false);
- customHTMLEditorObject[iterationString].session.on('change', function(delta) {
- $('.' + customTextarea).val(customHTMLEditorObject[iterationString].getValue());
- //$('#homepage-CustomHTML-form-save').removeClass('hidden');
- });
- iteration++;
- });
- }
- */
- pageLoad();
- }
- function editHomepageItem(item, reload = false) {
- ajaxloader(".editHomepageItemBox-" + item, "in");
- organizrAPI2("GET", "api/v2/settings/homepage/" + item)
- .success(function (data) {
- try {
- let response = data.response;
- let html = homepageItemFormHTML(response.data);
- $("#editHomepageItem").html(html);
- if (reload) {
- ajaxloader(".editHomepageItemBox-" + item);
- return false;
- }
- /*$("#editHomepageItemCall").animatedModal({
- top: '40px',
- left: '0px',
- color: '#000000eb',
- animatedIn: 'bounceInUp',
- animatedOut: 'bounceOutDown',
- position: 'fixed',
- afterClose: function() {
- $('body, html').css({'overflow':'hidden'});
- }
- });*/
- new Custombox.modal({
- content: {
- effect: "slidetogether",
- animateFrom: "bottom",
- animateTo: "bottom",
- target: "#editHomepageItemDiv",
- width: "100%",
- delay: 0,
- fullscreen: true,
- clone: false,
- onComplete: completeHomepageLoad(item, response.data),
- onClose: clearHomepageOriginal,
- },
- loader: { active: true },
- }).open();
- //$('#editHomepageItemCall').click();
- } catch (e) {
- organizrCatchError(e, data);
- }
- ajaxloader(".editHomepageItemBox-" + item);
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Edit Homepage Failed");
- ajaxloader(".editHomepageItemBox-" + item);
- });
- }
- function buildHomepageItem(array) {
- var listing = "";
- if (Array.isArray(array)) {
- $.each(array, function (i, v) {
- if (v.enabled) {
- listing +=
- `
- <div class="col-lg-2 col-md-2 col-sm-6 col-xs-6">
- <div class="white-box bg-org m-0">
- <div class="el-card-item p-0 editHomepageItemBox-` +
- v.name +
- `">
- <div class="el-card-avatar el-overlay-1">
- <a onclick="editHomepageItem('` +
- v.name +
- `')"><img class="lazyload tabImages mouse" data-src="` +
- v.image +
- `"></a>
- </div>
- <div class="el-card-content">
- <h3 class="box-title elip">` +
- v.name +
- `</h3>
- <small class="elip text-uppercase elip">` +
- v.category +
- `</small><br>
- </div>
- </div>
- </div>
- </div>
- `;
- }
- });
- }
- return listing;
- }
- function buildPluginsOLD() {
- organizrAPI2("GET", "api/v2/plugins")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#main-plugin-area").html(buildPluginsItemOLD(response.data));
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildPlugins(status = "enabled") {
- organizrAPI2("GET", "api/v2/plugins/" + status)
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#" + status + "-plugin-area").html(
- buildPluginsItem(response.data, status)
- );
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildHomepage() {
- organizrAPI2("GET", "api/v2/settings/homepage")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#settings-homepage-list").html(buildHomepageItem(response.data));
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildFormGroup(array) {
- var mainCount = 0;
- var group = '<div class="tab-content w-100">';
- var uList =
- '<div class="vtabs customvtab"><ul class="nav tabs-vertical" role="tablist">';
- $.each(array, function (i, v) {
- mainCount++;
- var count = 0;
- var total = v.length;
- var active = mainCount == 1 ? "active" : "";
- var customID = createRandomString(10);
- if (i == "custom") {
- group += v;
- } else {
- uList +=
- `<li role="presentation" class="` +
- active +
- `"><a href="#` +
- customID +
- cleanClass(i) +
- `" aria-controls="` +
- i +
- `" role="tab" data-toggle="tab" aria-expanded="false"><span lang="en">` +
- i +
- `</span></a></li>`;
- group +=
- `
- <!-- FORM GROUP -->
- <div role="tabpanel" class="tab-pane fade in ` +
- active +
- `" id="` +
- customID +
- cleanClass(i) +
- `">
- `;
- $.each(v, function (i, v) {
- var override = "6";
- if (typeof v.override !== "undefined") {
- override = v.override;
- }
- var arrayMultiple = false;
- if (typeof v.type !== "undefined") {
- if (v.type == "arrayMultiple") {
- arrayMultiple = true;
- }
- }
- count++;
- if (count % 2 !== 0) {
- group += '<div class="row start">';
- }
- var helpID = "#help-info-" + v.name;
- var helpTip = v.help
- ? '<sup><a class="help-tip" data-toggle="collapse" href="' +
- helpID +
- '" aria-expanded="true"><i class="m-l-5 fa fa-question-circle text-info" title="Help" data-toggle="tooltip"></i></a></sup>'
- : "";
- var builtItems = "";
- if (arrayMultiple == true) {
- $.each(v.value, function (index, value) {
- if (typeof value === "object") {
- builtItems += '<div class="row m-b-40">';
- $.each(value, function (number, formItem) {
- let clearfix =
- formItem.type == "blank"
- ? '<div class="clearfix"></div>'
- : "";
- builtItems += `
- <!-- INPUT BOX Yes Multiple -->
- <div class="col-md-6 p-b-10">
- <div class="form-group">
- <label class="control-label col-md-12"><span lang="en">${
- formItem.label
- }</span>${helpTip}</label>
- <div class="col-md-12">${buildFormItem(
- formItem
- )}</div> <!-- end div -->
- </div>
- </div>
- ${clearfix}
- <!--/ INPUT BOX -->
- `;
- });
- builtItems += "</div>";
- } else {
- builtItems += buildFormItem(value);
- }
- });
- } else {
- builtItems =
- `
- <!-- INPUT BOX no Multiple-->
- <div class="col-md-` +
- override +
- ` p-b-10">
- <div class="form-group">
- <label class="control-label col-md-12"><span lang="en">${
- v.label
- }</span>${helpTip}</label>
- <div class="col-md-12">
- ${buildFormItem(v)}
- </div>
- </div>
- </div>
- <!--/ INPUT BOX -->
- `;
- }
- group += builtItems;
- if (count % 2 == 0 || count == total) {
- group += "</div><!--end-->";
- }
- });
- group += "</div>";
- }
- });
- return uList + "</ul>" + group + "</div>";
- }
- function createImageSwal(attr) {
- let title = attr.attr("data-title");
- let fullPath = attr.attr("data-image-path");
- let clipboardText = attr.attr("data-clipboard-text");
- let name = attr.attr("data-image-name");
- let extension = attr.attr("data-image-name-ext");
- let div =
- `
- <div class="panel panel-default">
- <div class="panel-heading"><h1><img class="center" src="` +
- fullPath +
- `" style="height: 50px; width: 50px">` +
- title +
- `</h1></div>
- <div class="panel-wrapper collapse in">
- <div class="panel-body">
- <h5 lang="en">Choose action:</h5>
- <div class="button-box">
- <button class="btn btn-info waves-effect waves-light clipboard" type="button" data-clipboard-text="` +
- clipboardText +
- `"><span class="btn-label"><i class="ti-clipboard"></i></span><span lang="en">Copy to Clipboard</span></button>
- <button class="btn btn-danger waves-effect waves-light deleteImage" type="button" data-image-path="` +
- fullPath +
- `" data-image-name="` +
- name +
- `" data-image-name-ext="` +
- extension +
- `"><span class="btn-label"><i class="fa fa-trash"></i></span><span lang="en">Delete</span></button>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- });
- }
- function buildImageManagerViewItem(array) {
- var imageListing = "";
- if (Array.isArray(array)) {
- $.each(array, function (i, v) {
- var filepath = v.split("/");
- var name = filepath[filepath.length - 1].split(".");
- var clipboardText = v.replace(/ /g, "%20");
- var fileAndExt = filepath[filepath.length - 1];
- imageListing +=
- `
- <a class="imageManagerItem" href="javascript:void(0);" data-toggle="lightbox" data-gallery="multiimages" data-title="` +
- name[0] +
- `" data-clipboard-text="` +
- clipboardText +
- `" data-image-path="` +
- v +
- `" data-image-name="` +
- name[0] +
- `" data-image-name-ext="` +
- fileAndExt +
- `"><img data-toggle="tooltip" title="${name[0]}" data-placement="bottom" data-src="` +
- v +
- `" alt="tabImage" class="all studio lazyload" /> </a>
- `;
- });
- }
- return imageListing;
- }
- function buildImageManagerView() {
- organizrAPI2("GET", "api/v2/image")
- .success(function (data) {
- try {
- let response = data.response;
- $(".settings-image-manager-list").html(
- buildImageManagerViewItem(response.data)
- );
- $container = $("#gallery-content-center");
- try {
- if (typeof $container.isotope == "undefined") {
- $container.isotope({ itemSelector: "img" });
- } else {
- $container.isotope({ itemSelector: "img" });
- }
- } catch (e) {
- $container.isotope("destroy");
- $container.isotope({ itemSelector: "img" });
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildPluginsSettings() {
- organizrAPI2("GET", "api/v2/settings/plugin")
- .success(function (data) {
- try {
- let response = data.response;
- $("#plugin-settings-form").html(buildFormGroup(response.data));
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildThemeSettings() {
- organizrAPI2("GET", "api/v2/settings/theme")
- .success(function (data) {
- try {
- let response = data.response;
- $("#theme-settings-form").html(buildFormGroup(response.data));
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildCustomizeAppearance() {
- organizrAPI2("GET", "api/v2/settings/appearance")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#customize-appearance-form").html(buildFormGroup(response.data));
- $("input.pick-a-color-custom-options").ColorPickerSliders({
- placement: "bottom",
- color: "#987654",
- hsvpanel: true,
- previewformat: "hex",
- });
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildSSO() {
- organizrAPI2("GET", "api/v2/settings/sso")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#sso-form").html(buildFormGroup(response.data));
- })
- .fail(function (xhr) {
- console.error("Organizr Function: API Connection Failed");
- });
- }
- function buildSettingsMain() {
- organizrAPI2("GET", "api/v2/settings/main")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#settings-main-form").html(buildFormGroup(response.data));
- changeAuth();
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildUserManagement() {
- organizrAPI2("GET", "api/v2/users?includeGroups")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#manageUserTable").html(buildUserManagementItem(response.data));
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildGroupManagement() {
- organizrAPI2("GET", "api/v2/groups?includeUsers")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#manageGroupTable").html(buildGroupManagementItem(response.data));
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildTabEditor() {
- organizrAPI2("GET", "api/v2/tabs")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#tabEditorTable").html(buildTabEditorItem(response.data));
- checkTabHomepageItems();
- addTabSortable();
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function addTabSortable() {
- let el = document.getElementById("tabEditorTable");
- let tabSorter = new Sortable(el, {
- handle: ".sort-tabs-handle",
- ghostClass: "sortable-ghost",
- multiDrag: true,
- selectedClass: "multi-selected",
- onUpdate: function (evt) {
- $("input.order").each(function (idx) {
- $(this).val(idx + 1);
- });
- newTabsGlobal = $("#submit-tabs-form").serializeToJSON();
- $(".saveTabOrderButton").removeClass("hidden");
- },
- });
- }
- function checkTabHomepageItems() {
- var tabList = $(".checkTabHomepageItem");
- $.each(tabList, function (i, v) {
- var el = $(v);
- var id = el.attr("id");
- var name = el.attr("data-name");
- var url = el.attr("data-url");
- var urlLocal = el.attr("data-url-local");
- checkTabHomepageItem(id, name, url, urlLocal);
- });
- }
- function sortHomepageItemHrefs() {
- var hrefList = $(".popup-with-form");
- window.hrefList = new Array();
- $.each(hrefList, function (i, v) {
- var el = $(v);
- var href = el.attr("href");
- if (href.includes("#homepage-")) {
- var splitHref = href.split("-");
- window.hrefList[splitHref[1]] = i;
- }
- });
- }
- function checkTabHomepageItemList(name, url, urlLocal, id, check, tab) {
- // might use this later
- if (name.includes(check) || url.includes(check) || urlLocal.includes(check)) {
- addEditHomepageItem(id, tab);
- }
- }
- function checkTabHomepageItem(id, name, url, urlLocal) {
- name = name.toLowerCase();
- url = url.toLowerCase();
- urlLocal = urlLocal.toLowerCase();
- try {
- let urlObject = new URL(url);
- if (urlObject.pathname !== "/" && urlObject !== "#") {
- url = urlObject.pathname;
- }
- } catch {
- url = url;
- }
- if (
- name.includes("sonarr") ||
- url.includes("sonarr") ||
- urlLocal.includes("sonarr")
- ) {
- addEditHomepageItem(id, "Sonarr");
- } else if (
- name.includes("radarr") ||
- url.includes("radarr") ||
- urlLocal.includes("radarr")
- ) {
- addEditHomepageItem(id, "Radarr");
- } else if (
- name.includes("lidarr") ||
- url.includes("lidarr") ||
- urlLocal.includes("lidarr")
- ) {
- addEditHomepageItem(id, "Lidarr");
- } else if (
- name.includes("couchpotato") ||
- url.includes("couchpotato") ||
- urlLocal.includes("couchpotato")
- ) {
- addEditHomepageItem(id, "CouchPotato");
- } else if (
- name.includes("sick") ||
- url.includes("sick") ||
- urlLocal.includes("sick")
- ) {
- addEditHomepageItem(id, "SickRage");
- } else if (
- (name.includes("plex") ||
- url.includes("plex") ||
- urlLocal.includes("plex")) &&
- !name.includes("plexpy")
- ) {
- addEditHomepageItem(id, "Plex");
- } else if (
- name.includes("emby") ||
- url.includes("emby") ||
- urlLocal.includes("emby")
- ) {
- addEditHomepageItem(id, "Emby");
- } else if (
- name.includes("jdownloader") ||
- url.includes("jdownloader") ||
- urlLocal.includes("jdownloader") ||
- name.includes("rsscrawler") ||
- url.includes("rsscrawler") ||
- urlLocal.includes("rsscrawler")
- ) {
- addEditHomepageItem(id, "jDownloader");
- } else if (
- name.includes("sab") ||
- url.includes("sab") ||
- urlLocal.includes("sab")
- ) {
- addEditHomepageItem(id, "SabNZBD");
- } else if (
- name.includes("nzbget") ||
- url.includes("nzbget") ||
- urlLocal.includes("nzbget")
- ) {
- addEditHomepageItem(id, "NZBGet");
- } else if (
- name.includes("transmission") ||
- url.includes("transmission") ||
- urlLocal.includes("transmission")
- ) {
- addEditHomepageItem(id, "Transmission");
- } else if (
- name.includes("qbit") ||
- url.includes("qbit") ||
- urlLocal.includes("qbit")
- ) {
- addEditHomepageItem(id, "qBittorrent");
- } else if (
- name.includes("rtorrent") ||
- url.includes("rtorrent") ||
- urlLocal.includes("rtorrent")
- ) {
- addEditHomepageItem(id, "rTorrent");
- } else if (
- name.includes("utorrent") ||
- url.includes("utorrent") ||
- urlLocal.includes("utorrent")
- ) {
- addEditHomepageItem(id, "utorrent");
- } else if (
- name.includes("deluge") ||
- url.includes("deluge") ||
- urlLocal.includes("deluge")
- ) {
- addEditHomepageItem(id, "Deluge");
- } else if (
- name.includes("ombi") ||
- url.includes("ombi") ||
- urlLocal.includes("ombi")
- ) {
- addEditHomepageItem(id, "Ombi");
- } else if (
- name.includes("healthcheck") ||
- url.includes("healthcheck") ||
- urlLocal.includes("healthcheck")
- ) {
- addEditHomepageItem(id, "HealthChecks");
- } else if (
- name.includes("jackett") ||
- url.includes("jackett") ||
- urlLocal.includes("jackett")
- ) {
- addEditHomepageItem(id, "Jackett");
- } else if (
- name.includes("prowlarr") ||
- url.includes("prowlarr") ||
- urlLocal.includes("prowlarr")
- ) {
- addEditHomepageItem(id, "Prowlarr");
- } else if (
- name.includes("unifi") ||
- url.includes("unifi") ||
- urlLocal.includes("unifi")
- ) {
- addEditHomepageItem(id, "Unifi");
- } else if (
- name.includes("tautulli") ||
- url.includes("tautulli") ||
- urlLocal.includes("tautulli")
- ) {
- addEditHomepageItem(id, "Tautulli");
- }
- }
- function addEditHomepageItem(id, type) {
- let html = '<i class="ti-home"></i>';
- $("#" + id).html(html);
- $("#" + id).attr("onclick", 'editHomepageItem("' + type + '")');
- return false;
- }
- function buildCategoryEditor() {
- organizrAPI2("GET", "api/v2/tabs")
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#categoryEditorTable").html(buildCategoryEditorItem(response.data));
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- /* END ORGANIZR API FUNCTIONS */
- function buildLanguage(replace = false, newLang = null) {
- var languageItems = "";
- var currentLanguage = getCookie("organizrLanguage")
- ? getCookie("organizrLanguage")
- : window.lang.currentLang;
- var newLangCode = "";
- $.each(languageList, function (i, v) {
- if (newLang === v.language) {
- newLangCode = v.code;
- }
- var active = v.code == currentLanguage ? "" : "";
- languageItems +=
- `
- <a onclick="window.lang.change('` +
- v.code +
- `');buildLanguage(true,'` +
- v.language +
- `')" href="javascript:void(0);" class="` +
- active +
- `">
- <div class="mail-content"><h5 class="m-0">` +
- v.language +
- `</h5><span class="mail-desc" lang="en">` +
- active +
- `</span></div>
- </a>
- `;
- });
- var lang = `
- <li class="dropdown" id="languageDropdown">
- <a class="dropdown-toggle waves-effect waves-light" data-toggle="dropdown" href="#" aria-expanded="false"> <i class="fa fa-language"></i><span></span></a>
- <ul class="dropdown-menu mailbox animated bounceInDown language-box">
- <li>
- <div class="drop-title" lang="en">Choose Language</div>
- </li>
- <li>
- <div class="message-center default-scrollbar">${languageItems}</div>
- </li>
- </ul>
- <!-- /.dropdown-messages -->
- </li>
- `;
- if (replace == true) {
- setLangCookie(newLangCode);
- $("#languageDropdown").replaceWith(lang);
- message(
- "",
- window.lang.translate("Changed Language To") + ": " + newLang,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "3500"
- );
- } else if (replace == "wizard") {
- $(lang).appendTo(".navbar-right");
- } else {
- return lang;
- }
- }
- function updateUserInformation() {
- var passwordMatch = true;
- var username = $("#accountUsername").val();
- var email = $("#accountEmail").val();
- var password1 = $("#accountPassword1").val();
- var password2 = $("#accountPassword2").val();
- if (password1 != password2) {
- passwordMatch = false;
- messageSingle(
- "",
- "Passwords do not match",
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "5000"
- );
- return false;
- }
- if (username !== "" && email !== "" && passwordMatch == true) {
- var post = {
- username: username,
- email: email,
- };
- if (password1 !== "") {
- post["password"] = password1;
- }
- ajaxloader(".content-wrap", "in");
- organizrAPI2("PUT", "api/v2/users/" + activeInfo.user.userID, post)
- .success(function (data) {
- try {
- var response = data.response;
- $.magnificPopup.close();
- messageSingle(
- "",
- window.lang.translate("User Info Updated"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- ajaxloader();
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update User");
- ajaxloader();
- });
- }
- }
- function twoFA(action, type, secret = null) {
- switch (action) {
- case "activate":
- organizrAPI2("POST", "api/v2/2fa/" + type, {})
- .success(function (data) {
- try {
- var html = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- let div =
- `
- <div class="panel panel-default">
- <div class="panel-heading">Enable 2FA: ` +
- html.data.type +
- `</div>
- <div class="panel-wrapper collapse in">
- <div class="panel-body">
- <p class="twofa-modal-image"><img class="center" src="` +
- html.data.url +
- `"></p>
- <h5 class="twofa-modal-secret text-center">` +
- html.data.secret +
- `</h5>
- <div class="form-group m-t-10">
- <div class="input-group" style="width: 100%;">
- <div class="input-group-addon hidden-xs"><i class="ti-lock"></i></div>
- <input type="text" class="form-control tfa-input" id="twofa-verify" placeholder="Code" autocomplete="off" autocorrect="off" autocapitalize="off" maxlength="6" spellcheck="false" autofocus="" required="">
- </div>
- <br>
- <button class="btn btn-block btn-info" onclick="twoFA('verify','google');">Verify</button>
-
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- });
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "2FA");
- });
- break;
- case "deactivate":
- organizrAPI2("DELETE", "api/v2/2fa")
- .success(function (data) {
- try {
- message(
- "2FA Removed",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- $(".2fa-list").replaceWith(buildTwoFA("internal"));
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "2FA");
- });
- break;
- case "verify":
- var secret = $(".twofa-modal-secret").text();
- var code = $("#twofa-verify").val();
- if (type !== "" && secret !== "" && code !== "") {
- organizrAPI2("POST", "api/v2/2fa", {
- type: type,
- secret: secret,
- code: code,
- })
- .success(function (data) {
- try {
- var html = data.response;
- message(
- "2FA Success",
- "Input Code Validated! Saving...",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- swal.close();
- twoFA("save", type, secret);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "2FA");
- });
- } else {
- message(
- "2FA Failed",
- "Input Code",
- activeInfo.settings.notifications.position,
- "#FFF",
- "warning",
- "5000"
- );
- }
- break;
- case "save":
- organizrAPI2("PUT", "api/v2/2fa", { type: type, secret: secret })
- .success(function (data) {
- try {
- var html = data.response;
- message(
- "2FA Success",
- "2FA Saved",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- $(".2fa-list").replaceWith(buildTwoFA(type));
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "2FA");
- });
- break;
- }
- }
- function buildTwoFA(current) {
- switch (current) {
- case "internal":
- var option = `
- <div class="col-lg-3 col-sm-6 row-in-br">
- <ul class="col-in">
- <li>
- <span class="circle circle-md bg-info"><i class="mdi mdi-webpack mdi-24px"></i></span>
- </li>
- <li class="col-middle">
- <h5>Organizr Authenticator</h5>
- <h5><span lang="en">Current</span></h5>
- </li>
- </ul>
- </div>
- <div class="col-lg-3 col-sm-6 row-in-br">
- <ul class="col-in">
- <li>
- <span class="circle circle-md bg-info"><i class="fa fa-google"></i></span>
- </li>
- <li class="col-middle">
- <h5>Google Authenticator</h5>
- <h5><a href="javascript:void(0)" onclick="twoFA('activate','google');"><span lang="en">Activate</span></a></h5>
- </li>
- </ul>
- </div>
- `;
- break;
- case "google":
- var option = `
- <div class="col-lg-3 col-sm-6 row-in-br">
- <ul class="col-in">
- <li>
- <span class="circle circle-md bg-info"><i class="fa fa-google"></i></span>
- </li>
- <li class="col-middle">
- <h5>Google Authenticator</h5>
- <h5><a href="javascript:void(0)" onclick="twoFA('deactivate','google');"><span lang="en">Deactivate</span></a></h5>
- </li>
- </ul>
- </div>
- `;
- break;
- default:
- break;
- }
- var element =
- `
- <div class="white-box 2fa-list">
- <div class="row row-in">
- ` +
- option +
- `
- </div>
- </div>
- `;
- return element;
- }
- function scrapeCall() {
- // Define the URL to scrape [only supports GET at the moment
- var url = "https://api.github.com/users/causefx/repos";
- // Define callbacks variable first
- var callbacks = $.Callbacks();
- // Add functions that will deal with the data
- callbacks.add(scrapeFunction);
- // Call the API function to scrape the page you want [types = 'json' or 'html']
- scrapeAPI(url, callbacks, "json");
- }
- function scrapeFunction(data) {
- // Here you would do whatever you like
- if (data.data.result == "Success") {
- console.log("Success!!!");
- }
- console.log("data:");
- console.log(data);
- }
- function scrapeAPI(url, callbacks = null, type = null) {
- if (typeof url === "undefined") {
- console.log("error");
- return false;
- }
- organizrAPI2("POST", "api/v2/homepage/scrape", { url: url, type: type })
- .success(function (data) {
- try {
- let response = data.response;
- if (response) {
- if (callbacks) {
- callbacks.fire(response);
- }
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Scrape");
- });
- }
- function revokeToken(id) {
- organizrAPI2("DELETE", "api/v2/token/" + id, {})
- .success(function (data) {
- try {
- $("#token-" + id).fadeOut();
- message(
- window.lang.translate("Removed Token"),
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "3500"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- ajaxloader();
- OrganizrApiError(xhr, "Revoke Token");
- });
- }
- function buildActiveTokens(array) {
- var parser = new UAParser();
- var tokens = "";
- $.each(array, function (i, v) {
- parser.setUA(v.browser);
- var result = parser.getResult();
- var className =
- activeInfo.user.token === v.token ? "bg-success text-inverse" : "";
- var extraText =
- activeInfo.user.token === v.token
- ? '<span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="Current Token">...' +
- v.token.substr(-10, 10) +
- "</span>"
- : v.token.substr(-10, 10);
- if (typeof v.created == "object") {
- v.created = v.created.date;
- }
- if (typeof v.expires == "object") {
- v.expires = v.expires.date;
- }
- v.created = v.created.indexOf("Z") !== -1 ? v.created : v.created + "Z";
- v.expires = v.expires.indexOf("Z") !== -1 ? v.expires : v.expires + "Z";
- tokens +=
- `
- <tr id="token-` +
- v.id +
- `" class="` +
- className +
- `">
- <td>` +
- v.id +
- `</td>
- <td>` +
- extraText +
- `</td>
- <td>` +
- moment(v.created).format("LLL") +
- `</td>
- <td>` +
- moment(v.expires).format("LLL") +
- `</td>
- <td>` +
- v.ip +
- `</td>
- <td>
- <button class="btn btn-danger waves-effect waves-light" type="button" onclick="revokeToken('` +
- v.id +
- `');"><i class="fa fa-ban"></i></button>
- </td>
- </tr>
- `;
- });
- return (
- `
- <div class="col-lg-12">
- <div class="panel panel-info">
- <div class="panel-heading"> <span lang="en">Active Tokens</span>
- <div class="pull-right"><a href="#" data-perform="panel-collapse"><i class="ti-plus"></i></a> </div>
- </div>
- <div class="panel-wrapper collapse" aria-expanded="true">
- <div class="panel-body bg-org p-0">
- <div class="table-responsive">
- <table class="table color-table info-table">
- <thead>
- <tr>
- <th>#</th>
- <th lang="en">Token</th>
- <th lang="en">Created</th>
- <th lang="en">Expires</th>
- <th lang="en">IP</th>
- <th lang="en">Action</th>
- </tr>
- </thead>
- <tbody>
- ` +
- tokens +
- `
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- </div>
- `
- );
- }
- function accountManager(user) {
- var passwordMessage = "";
- switch (activeInfo.settings.misc.authBackend) {
- case "plex":
- passwordMessage = `
- <div class="col-lg-12">
- <div class="panel panel-info">
- <div class="panel-heading"> <span lang="en">Password Notice</span>
- <div class="pull-right"><a href="#" data-perform="panel-collapse"><i class="ti-plus"></i></a> </div>
- </div>
- <div class="panel-wrapper collapse" aria-expanded="true">
- <div class="panel-body bg-org">
- <p lang="en">If you signed in with a Plex Acct... Please use the following link to change your password there:</p><br>
- <p><a href="https://app.plex.tv/auth#?resetPassword" target="_blank" lang="en">Change Password on Plex Website</a></p>
- </div>
- </div>
- </div>
- </div>
- `;
- break;
- case "emby":
- passwordMessage = `
- <div class="col-lg-12">
- <div class="panel panel-info">
- <div class="panel-heading"> <span lang="en">Password Notice</span>
- <div class="pull-right"><a href="#" data-perform="panel-collapse"><i class="ti-minus"></i></a> <a href="#" data-perform="panel-dismiss"><i class="ti-close"></i></a> </div>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="panel-body bg-org">
- <p lang="en">If you signed in with a Emby Acct... Please use the following link to change your password there:</p><br>
- <p><a href="https://emby.media/community/index.php?app=core&module=global§ion=lostpass" target="_blank">Change Password on Emby Website</a></p>
- </div>
- </div>
- </div>
- </div>
- `;
- break;
- default:
- passwordMessage = "";
- break;
- }
- if (user.data.user.loggedin === true) {
- var twoFADisable =
- buildTwoFA(user.data.user.authService) == "internal" ? "" : "disabled";
- var activeTokens = buildActiveTokens(user.data.user.tokenList);
- var accountDiv =
- `
- <div id="account-area" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-10 col-md-offset-1">
- <div class="row">
- <div class="col-md-12">
- <div class="panel panel-info m-0">
- <div class="panel-heading">
- <span lang="en">Account Information</span>
- <div class="btn-group pull-right">
- <button class="btn btn-info waves-effect waves-light" type="button" onclick="updateUserInformation();">
- <i class="fa fa-save"></i>
- </button>
- </div>
- </div>
- <div class="panel-wrapper collapse in main-email-panel" aria-expanded="true">
- <div class="panel-body">
- <div class="form-body">
- ` +
- buildTwoFA(user.data.user.authService) +
- `
- <div class="row">
- <div class="col-lg-12">
- <div class="panel panel-info">
- <div class="panel-heading"> <span lang="en">User Information</span>
- <div class="pull-right"><a href="#" data-perform="panel-collapse"><i class="ti-plus"></i></a> </div>
- </div>
- <div class="panel-wrapper collapse" aria-expanded="true">
- <div class="panel-body bg-org p-0 p-t-10">
- <div class="col-md-6">
- <div class="form-group">
- <label class="control-label" lang="en">Username</label>
- <input ` +
- twoFADisable +
- ` type="text" id="accountUsername" class="form-control" value="` +
- activeInfo.user.username +
- `"></div>
- </div>
- <div class="col-md-6">
- <div class="form-group">
- <label class="control-label" lang="en">Email</label>
- <input ` +
- twoFADisable +
- ` type="text" id="accountEmail" class="form-control" value="` +
- activeInfo.user.email +
- `"></div>
- </div>
- <div class="col-md-6 userManagementPassword">
- <div class="form-group">
- <label class="control-label" lang="en">Password</label>
- <input type="password" id="accountPassword1" class="form-control"></div>
- </div>
- <div class="col-md-6 userManagementPassword">
- <div class="form-group">
- <label class="control-label" lang="en">Verify Password</label>
- <input type="password" id="accountPassword2" class="form-control"></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!--/row-->
- <div class="row">
- ` +
- activeTokens +
- passwordMessage +
- `
- </div>
- <!--/row-->
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- $(".organizr-area").after(accountDiv);
- pageLoad();
- }
- }
- function userMenu(user) {
- $("body").attr("data-active-user-group-name", user.data.user.group);
- $("body").attr("data-active-user-group-id", user.data.user.groupID);
- var sideMenu = "";
- var menuList =
- '<li class="hidden-xs" onclick="toggleFullScreen();"><a class="waves-effect waves-light"> <i class="ti-fullscreen fullscreen-icon"></i></a></li>';
- var showDebug = activeInfo.settings.misc.debugArea
- ? '<li><a href="javascript:void(0)" onclick="toggleDebug();"><i class="mdi mdi-bug fa-fw"></i> <span lang="en">Debug Area</span></a></li>'
- : "";
- menuList += buildLanguage();
- if (user.data.user.loggedin === true) {
- menuList +=
- `
- <li class="dropdown">
- <a class="dropdown-toggle profile-pic" data-toggle="dropdown" href="javascript:void(0)"><img alt="" class="img-circle profile-image" src="` +
- user.data.user.image +
- `" width="36"><b class="hidden-xs">` +
- user.data.user.username +
- `</b><span class="caret"></span></a>
- <ul class="dropdown-menu dropdown-user animated flipInY">
- <li>
- <div class="dw-user-box">
- <div class="u-img"><img alt="user" src="` +
- user.data.user.image +
- `"></div>
- <div class="u-text"><h4>` +
- user.data.user.username +
- `</h4><p class="text-muted">` +
- user.data.user.email +
- `</p><p class="text-muted">` +
- user.data.user.group +
- `</p></div>
- </div>
- </li>
- <li class="divider" role="separator"></li>
- <li class="append-menu"><a class="inline-popups" href="#account-area" data-effect="mfp-zoom-out"><i class="ti-settings fa-fw"></i> <span lang="en">Account Settings</span></a></li>
- <li class="divider" role="separator"></li>
- <li><a href="javascript:void(0)" onclick="lock();"><i class="ti-lock fa-fw"></i> <span lang="en">Lock Screen</span></a></li>
- ${showDebug}
- <li><a href="javascript:void(0)" onclick="logout();"><i class="fa fa-sign-out fa-fw"></i> <span lang="en">Logout</span></a></li>
- </ul><!-- /.dropdown-user -->
- </li><!-- /.dropdown -->
- `;
- sideMenu +=
- `
- <li class="user-pro">
- <a href="#" class="waves-effect">
- <img src="` +
- user.data.user.image +
- `" alt="user-img" class="img-circle">
- <span class="hide-menu">` +
- user.data.user.username +
- `<span class="fa arrow"></span></span>
- </a>
- <ul class="nav nav-second-level collapse" aria-expanded="false" style="height: 0px;">
- <li class="append-menu"><a class="inline-popups" href="#account-area" data-effect="mfp-zoom-out"><i class="ti-settings fa-fw"></i> <span lang="en">Account Settings</span></a></li>
- <li><a href="javascript:void(0)" onclick="lock();"><i class="ti-lock fa-fw"></i> <span lang="en">Lock Screen</span></a></li>
- ${showDebug}
- <li><a href="javascript:void(0)" onclick="logout();"><i class="fa fa-sign-out fa-fw"></i> <span lang="en">Logout</span></a></li>
- </ul>
- </li>
- `;
- } else {
- menuList +=
- `
- <li class="dropdown">
- <a class="dropdown-toggle profile-pic" data-toggle="dropdown" href="javascript:void(0)"><img alt="" class="img-circle profile-image" src="` +
- user.data.user.image +
- `" width="36"><b class="hidden-xs">` +
- user.data.user.username +
- `</b><span class="caret"></span></a>
- <ul class="dropdown-menu dropdown-user animated flipInY">
- <li>
- <div class="dw-user-box">
- <div class="u-img"><img alt="user" src="` +
- user.data.user.image +
- `"></div>
- <div class="u-text"><h4>` +
- user.data.user.username +
- `</h4></div>
- </div>
- </li>
- <li class="divider" role="separator"></li>
- <li class="append-menu"><a href="javascript:void(0)" class="show-login"><i class="fa fa-sign-in fa-fw"></i> <span lang="en">Login/Register</span></a></li>
- </ul><!-- /.dropdown-user -->
- </li><!-- /.dropdown -->
- `;
- sideMenu +=
- `
- <li class="user-pro">
- <a href="#" class="waves-effect">
- <img src="` +
- user.data.user.image +
- `" alt="user-img" class="img-circle">
- <span class="hide-menu">` +
- user.data.user.username +
- `<span class="fa arrow"></span></span>
- </a>
- <ul class="nav nav-second-level collapse" aria-expanded="false" style="height: 0px;">
- <li class="append-menu"><a href="javascript:void(0)" class="show-login"><i class="fa fa-sign-in fa-fw"></i> <span lang="en">Login/Register</span></a></li>
- </ul>
- </li>
- `;
- }
- $(menuList).appendTo(".navbar-right").html;
- //$(sideMenu).appendTo('#side-menu').html;
- //message("",window.lang.translate('Welcome')+" "+user.data.user.username,activeInfo.settings.notifications.position,"#FFF","success","3500");
- console.info(
- "%c " +
- window.lang.translate("Welcome") +
- " %c ".concat(user.data.user.username, " "),
- "color: white; background: #AD80FD; font-weight: 700;",
- "color: #AD80FD; background: white; font-weight: 700;"
- );
- }
- function menuExtraTabs() {
- return [
- {
- id: 99999991,
- type: 2,
- group_id: 1,
- name: "Github Repo",
- access_url: "https://github.com/causefx/organizr",
- url: "https://github.com/causefx/organizr",
- image: "fontawesome::github",
- active: activeInfo.settings.menuLink.githubMenuLink,
- ping_url: null,
- },
- {
- id: 99999992,
- type: 1,
- group_id: 1,
- name: "Organizr Support",
- access_url: "https://organizr.app/support",
- url: "https://organizr.app/support",
- image: "fontawesome::life-ring",
- active: activeInfo.settings.menuLink.organizrSupportMenuLink,
- ping_url: null,
- },
- {
- id: 99999993,
- type: 2,
- group_id: 1,
- name: "Organizr Docs",
- access_url: "https://docs.organizr.app",
- url: "https://docs.organizr.app",
- image: "simpleline::docs",
- active: activeInfo.settings.menuLink.organizrDocsMenuLink,
- ping_url: null,
- },
- {
- id: 99999994,
- type: 1,
- group_id: 1,
- name: "Feature Request",
- access_url: "https://feature.organizr.app",
- url: "https://feature.organizr.app",
- image: "simpleline::arrow-up-circle",
- active: activeInfo.settings.menuLink.organizrFeatureRequestLink,
- ping_url: null,
- },
- ];
- }
- function menuExtras(active) {
- let adminMenu = '<li class="devider"></li>';
- let extraOrganizrLinks = menuExtraTabs();
- activeInfo.tabs = [].concat(activeInfo.tabs, menuExtraTabs());
- $.each(extraOrganizrLinks, function (i, v) {
- tabInformation[v.id] = {
- id: v.id,
- name: cleanClass(v.name),
- active: false,
- loaded: false,
- increments: 0,
- tabInfo: v,
- };
- if (v.type == 1) {
- let frame = buildFrameContainer(v.id);
- $(frame).appendTo($(".iFrame-listing"));
- }
- adminMenu +=
- activeInfo.user.groupID <= v.group_id && v.active
- ? buildMenuList(v.id)
- : "";
- });
- if (active === true) {
- return activeInfo.settings.menuLink.organizrSignoutMenuLink
- ? `
- <li class="devider"></li>
- <li id="sign-out"><a class="waves-effect" onclick="logout();"><i class="fa fa-sign-out fa-fw"></i> <span class="hide-menu" lang="en">Logout</span></a></li>
- ` + adminMenu
- : "" + adminMenu;
- } else {
- return activeInfo.settings.menuLink.organizrSignoutMenuLink
- ? `
- <li class="devider"></li>
- <li id="menu-login"><a class="waves-effect show-login" href="javascript:void(0)"><i class="mdi mdi-login fa-fw"></i> <span class="hide-menu" lang="en">Login/Register</span></a></li>
- `
- : "";
- }
- }
- function categoryProcess(arrayItems) {
- var menuList = "";
- let categoryIn = activeInfo.settings.misc.expandCategoriesByDefault
- ? "in"
- : "";
- let categoryActive = activeInfo.settings.misc.expandCategoriesByDefault
- ? "active"
- : "";
- let categoryExpanded = activeInfo.settings.misc.expandCategoriesByDefault
- ? "true"
- : "false";
- if (
- Array.isArray(arrayItems["data"]["categories"]) &&
- Array.isArray(arrayItems["data"]["tabs"])
- ) {
- $.each(arrayItems["data"]["categories"], function (i, v) {
- if (v.count !== 0 && v.category_id !== 0) {
- menuList +=
- `
- <li class="allGroupsList ` +
- categoryActive +
- `" data-group-name="` +
- cleanClass(v.category) +
- `">
- <a class="waves-effect" href="javascript:void(0)">` +
- iconPrefix(v.image) +
- `<span class="hide-menu">` +
- v.category +
- ` <span class="fa arrow"></span> <span class="label label-rouded label-inverse pull-right">` +
- v.count +
- `</span></span><div class="menu-category-ping" data-good="0" data-bad="0"></div></a>
- <ul class="nav nav-second-level category-` +
- v.category_id +
- ` collapse ` +
- categoryIn +
- `" aria-expanded="` +
- categoryExpanded +
- `"></ul>
- </li>
- `;
- }
- });
- $(menuList).appendTo($("#side-menu"));
- }
- }
- function buildFrame(id, split = null) {
- let extra = split ? "right-" : "";
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole("Build Frame", "No Tab Info Found... Id: " + id, "error");
- return false;
- }
- var sandbox = activeInfo.settings.misc.sandbox;
- sandbox = sandbox.replace(/,/gi, " ");
- sandbox = sandbox ? ' sandbox="' + sandbox + '"' : "";
- var allow = activeInfo.settings.misc.iframeAllow;
- allow = allow.replace(/,/gi, "; ");
- allow = allow ? ' allow="' + allow + '"' : "";
- return (
- `
- <iframe ` +
- allow +
- ` frameborder="0" id="frame-` +
- extra +
- id +
- `" ` +
- sandbox +
- ` scrolling="auto" src="` +
- tabInfo.access_url +
- `" class="iframe"></iframe>
- `
- );
- }
- function buildFrameContainer(id, split = null) {
- let extra = split ? "right-" : "";
- return (
- `<div id="container-` +
- extra +
- id +
- `" class="frame-container frame-${id} hidden" ></div>`
- );
- }
- function buildInternalContainer(id, split = null) {
- let extra = split ? "right-" : "";
- return (
- `<div id="internal-` +
- extra +
- id +
- `" class="internal-container frame-${id} hidden"></div>`
- );
- }
- function buildMenuList(id) {
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole(
- "Build Menu List",
- "No Tab Info Found... Id: " + id,
- "error"
- );
- return false;
- }
- let name = tabInfo.name;
- let icon = tabInfo.image;
- let ping = typeof tabInfo.ping_url !== "undefined" ? tabInfo.ping_url : null;
- ping =
- ping !== null && ping !== ""
- ? `<small class="menu-` +
- cleanClass(ping) +
- `-ping-ms hidden-xs label label-rouded label-inverse pull-right pingTime hidden">
- </small><div class="menu-` +
- cleanClass(ping) +
- `-ping" data-tab-name="` +
- name +
- `" data-previous-state=""></div>`
- : "";
- return (
- `<li class="allTabsList" id="menu-${id}" data-tab-id="${id}"><a class="waves-effect" href="javascript:void(0)" onclick="tabActions(event,'${id}');" onauxclick="tabActions(event,'${id}');">` +
- iconPrefix(icon) +
- `<span class="hide-menu elip sidebar-tabName">` +
- name +
- `</span>` +
- ping +
- `</a></li>`
- );
- }
- function tabProcess(arrayItems) {
- var iFrameList = "";
- var internalList = "";
- var defaultTabId = null;
- if (
- Array.isArray(arrayItems["data"]["tabs"]) &&
- arrayItems["data"]["tabs"].length > 0
- ) {
- $.each(arrayItems["data"]["tabs"], function (i, v) {
- if (v.enabled === 1 && v.access_url) {
- tabInformation[v.id] = {
- id: v.id,
- name: cleanClass(v.name),
- active: false,
- loaded: false,
- increments: 0,
- tabInfo: v,
- };
- switch (v.timeout) {
- case 1:
- case "1":
- tabActionsList["close"].push({
- id: v.id,
- tab: cleanClass(v.name),
- action_ms: v.timeout_ms,
- });
- break;
- case 2:
- case "2":
- tabActionsList["refresh"].push({
- id: v.id,
- tab: cleanClass(v.name),
- action_ms: v.timeout_ms,
- });
- break;
- default:
- //nada
- }
- if (v.default === 1) {
- defaultTabId = v.id;
- }
- var menuList = buildMenuList(v.id);
- if (v.category_id === 0) {
- if (activeInfo.settings.misc.unsortedTabs === "top") {
- $(menuList).prependTo($("#side-menu"));
- } else if (activeInfo.settings.misc.unsortedTabs === "bottom") {
- $(menuList).appendTo($("#side-menu"));
- }
- } else {
- if (activeInfo.settings.misc.unsortedTabs === "top") {
- $(menuList).prependTo($(".category-" + v.category_id));
- } else if (activeInfo.settings.misc.unsortedTabs === "bottom") {
- $(menuList).appendTo($(".category-" + v.category_id));
- }
- }
- switch (v.type) {
- case 0:
- case "0":
- case "internal":
- internalList = buildInternalContainer(v.id);
- $(internalList).appendTo($(".internal-listing"));
- internalList = buildInternalContainer(v.id, true);
- $(internalList).appendTo($(".internal-listing-right"));
- if (v.preload) {
- var newTab = $("#internal-" + v.id);
- organizrConsole(
- "Tab Function",
- "Preloading new tab for: " + cleanClass(v.name)
- );
- $("#menu-" + v.id + " a")
- .children()
- .addClass("tabLoaded");
- newTab.addClass("loaded");
- loadInternal(v.id);
- }
- break;
- case 1:
- case "1":
- case "iframe":
- iFrameList = buildFrameContainer(v.id);
- $(iFrameList).appendTo($(".iFrame-listing"));
- iFrameList = buildFrameContainer(v.id, true);
- $(iFrameList).appendTo($(".iFrame-listing-right"));
- if (v.preload) {
- var newTab = $("#container-" + v.id);
- organizrConsole(
- "Tab Function",
- "Preloading new tab for: " + cleanClass(v.name)
- );
- $("#menu-" + v.id + " a")
- .children()
- .addClass("tabLoaded");
- newTab.addClass("loaded");
- $(buildFrame(v.id)).appendTo(newTab);
- }
- break;
- case 2:
- case 3:
- case "2":
- case "3":
- case "_blank":
- case "popout":
- break;
- default:
- organizrConsole("Tab Function", "Action not set", "error");
- }
- }
- });
- $("#side-menu").metisMenu({
- toggle: activeInfo.settings.misc.autoCollapseCategories,
- });
- getDefault(defaultTabId);
- } else {
- noTabs(arrayItems);
- }
- $(menuExtras(arrayItems.data.user.loggedin)).appendTo($("#side-menu"));
- }
- function buildLogin() {
- swapDisplay("login");
- closeSideMenu();
- removeMenuActive();
- $("#menu-login a").addClass("active");
- organizrAPI2("GET", "api/v2/page/login")
- .success(function (data) {
- try {
- var response = data.response;
- organizrConsole("Organizr Function", "Opening Login Page");
- $(".login-area").html(response.data);
- setHash("OrganizrLogin");
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Login Error");
- });
- $("#preloader").fadeOut();
- }
- function buildLockscreen() {
- $("#preloader").fadeIn();
- closeSideMenu();
- organizrAPI2("GET", "api/v2/page/lockscreen")
- .success(function (data) {
- try {
- var response = data.response;
- organizrConsole("Organizr Function", "Adding Lockscreen");
- $(response.data).appendTo($("body"));
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- $("#preloader").fadeOut();
- }
- function buildSplashScreenItem(arrayItems) {
- var splashList = "";
- if (
- Array.isArray(arrayItems["data"]["tabs"]) &&
- arrayItems["data"]["tabs"].length > 0
- ) {
- arrayItems["data"]["tabs"].sort(
- (a, b) => parseFloat(a.order) - parseFloat(b.order)
- );
- $.each(arrayItems["data"]["tabs"], function (i, v) {
- if (v.enabled === 1 && v.splash === 1 && v.access_url) {
- var image = iconPrefixSplash(v.image);
- if (image.indexOf(".") !== -1) {
- var dataSrc = 'data-src="' + iconPrefixSplash(v.image) + '"';
- var nonImage = "";
- } else {
- var dataSrc = "";
- var nonImage =
- '<span class="text-uppercase badge bg-org splash-badge">' +
- image +
- "</span>";
- }
- splashList += `
- <div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 col-xl-2 mouse hvr-grow m-b-20" id="menu-${cleanClass(
- v.name
- )}" type="${v.type}" data-url="${
- v.access_url
- }" onclick="tabActions(event,'${v.id}');">
- <div class="homepage-drag fc-event bg-org lazyload" ${dataSrc}>
- ${nonImage}
- <span class="homepage-text"> ${v.name}</span>
- </div>
- </div>
- `;
- }
- });
- }
- return splashList !== "" ? splashList : false;
- }
- function buildSplashScreen(json) {
- let hiddenSplash = directToHash ? "hidden" : "in";
- var items = buildSplashScreenItem(json);
- var menu =
- '<li ><a href="javascript:void(0)" onclick="$(\'.splash-screen\').removeClass(\'hidden\').addClass(\'in\')"><i class="ti-layout-grid2 fa-fw"></i> <span lang="en">Splash Page</span></a></li>';
- if (items) {
- closeSideMenu();
- organizrConsole("Organizr Function", "Adding Splash Screen");
- var splash =
- `
- <section id="splashScreen" class="lock-screen splash-screen default-scroller fade ${hiddenSplash}">
- <div class="row p-20 flexbox">` +
- items +
- `</div>
- <div class="row p-20 p-t-0 flexbox">
- <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12 mouse hvr-wobble-bottom bottom-close-splash" onclick="$('.splash-screen').addClass('hidden').removeClass('in')">
- <div class="homepage-drag fc-event bg-danger lazyload" data-src="">
- <span class="homepage-text"> Close Splash</span>
- </div>
- </div>
- </div>
- </section>
- `;
- $(splash).appendTo($("body"));
- $(".append-menu").after(menu);
- }
- }
- function buildUserGroupSelect(array, userID, groupID) {
- var groupSelect = "";
- var selected = "";
- var disabled = "";
- if (groupID == 0 && userID == 1) {
- disabled = "disabled";
- }
- $.each(array, function (i, v) {
- selected = "";
- if (v.group_id == groupID) {
- selected = "selected";
- }
- var selectDisable = v.group_id == 0 || v.group_id == 999 ? "disabled" : "";
- groupSelect +=
- "<option " +
- selected +
- " " +
- selectDisable +
- ' value="' +
- v.group_id +
- '">' +
- v.group +
- "</option>";
- });
- return (
- '<td><select name="userGroupSelect" class="form-control userGroupSelect" ' +
- disabled +
- ">" +
- groupSelect +
- "</select></td>"
- );
- }
- function buildTabGroupSelect(array, tabID, groupID, type) {
- var groupSelect = "";
- var selected = "";
- let name = type == "tabGroupSelectMax" ? "group_id_max" : "group_id";
- $.each(array, function (i, v) {
- selected = "";
- if (v.group_id == groupID) {
- selected = "selected";
- }
- groupSelect +=
- "<option " +
- selected +
- ' value="' +
- v.group_id +
- '">' +
- v.group +
- "</option>";
- });
- return (
- '<td><select name="tab[' +
- tabID +
- "]." +
- name +
- '" class="form-control ' +
- type +
- '">' +
- groupSelect +
- "</select></td>"
- );
- }
- function buildTabTypeSelect(tabID, typeID, disabled) {
- var array = [
- {
- type_id: 0,
- type: "Organizr",
- },
- {
- type_id: 1,
- type: "iFrame",
- },
- {
- type_id: 2,
- type: "New Window",
- },
- ];
- var typeSelect = "";
- var selected = "";
- disabled = disabled == "disabled" && typeID !== 0 ? null : disabled;
- $.each(array, function (i, v) {
- selected = "";
- if (v.type_id == typeID) {
- selected = "selected";
- }
- var disabledAttr =
- disabled === "disabled" && v.type !== "Internal" ? "disabled" : "";
- typeSelect +=
- "<option " +
- selected +
- ' value="' +
- v.type_id +
- '" ' +
- disabledAttr +
- ">" +
- v.type +
- "</option>";
- });
- return (
- '<td><select name="tab[' +
- tabID +
- '].type" class="form-control tabTypeSelect">' +
- typeSelect +
- "</select></td>"
- );
- }
- function buildTabCategorySelect(array, tabID, categoryID) {
- var categorySelect = "";
- var selected = "";
- $.each(array, function (i, v) {
- selected = "";
- if (v.category_id == categoryID) {
- selected = "selected";
- }
- categorySelect +=
- "<option " +
- selected +
- ' value="' +
- v.category_id +
- '">' +
- v.category +
- "</option>";
- });
- return (
- '<td><select name="tab[' +
- tabID +
- '].category_id" class="form-control tabCategorySelect">' +
- categorySelect +
- "</select></td>"
- );
- }
- function buildUserManagementItem(array) {
- var userList = "";
- $.each(array.users, function (i, v) {
- var disabledDelete =
- v.group_id == 999 || v.group_id == 0 ? "disabled" : "deleteUser";
- userList +=
- `
- <tr class="userManagement" data-id="` +
- v.id +
- `" data-username="` +
- v.username +
- `" data-group="` +
- v.group +
- `" data-email="` +
- v.email +
- `">
- <td class="text-center el-element-overlay">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0">
- <img alt="user-img" class="img-circle" src="` +
- v.image +
- `" width="45">
- <div class="el-overlay">
- <ul class="el-info">
- ` +
- v.id +
- `
- </ul>
- </div>
- </div>
- </div>
- </td>
- <td>` +
- v.username +
- `
- <br/><span class="text-muted">` +
- v.email +
- `</span></td>
- <td>` +
- moment(v.register_date).format("ll") +
- `
- <br/><span class="text-muted">` +
- moment(v.register_date).format("LT") +
- `</span></td>
- ` +
- buildUserGroupSelect(array.groups, v.id, v.group_id) +
- `
- <td><button type="button" class="btn btn-info btn-outline btn-circle btn-lg m-r-5 editUserButton popup-with-form" href="#edit-user-form" data-effect="mfp-3d-unfold"><i class="ti-pencil-alt"></i></button></td>
- <td><button type="button" class="btn btn-info btn-outline btn-circle btn-lg m-r-20 emailUser"><i class="ti-email"></i></button></td>
- <td><button type="button" class="btn btn-danger btn-outline btn-circle btn-lg m-r-5 ` +
- disabledDelete +
- `"><i class="ti-trash"></i></button></td>
- </tr>
- `;
- });
- return userList;
- }
- function buildGroupManagementItem(array) {
- var userList = "";
- $.each(array.groups, function (i, v) {
- var userCount = array.users.reduce(function (n, group) {
- return n + (group.group_id == v.group_id);
- }, 0);
- var disabledDefault =
- v.group_id == 0 || v.group_id == 999 ? "disabled" : "";
- var disabledDelete =
- userCount > 0 || v.default == 1 || v.group_id == 999 || v.group_id <= 1
- ? "disabled"
- : "";
- var defaultIcon =
- v.default == 1 ? "icon-user-following" : "icon-user-follow";
- var defaultColor = v.default == 1 ? "btn-info disabled" : "btn-warning";
- userList +=
- `
- <tr class="userManagement" data-id="` +
- v.id +
- `" data-group-id="` +
- v.group_id +
- `" data-group="` +
- v.group +
- `" data-default="` +
- tof(v.default) +
- `" data-image="` +
- v.image +
- `" data-user-count="` +
- userCount +
- `">
- <td class="text-center el-element-overlay">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0">
- <div class="tabEditorIcon">` +
- iconPrefix(v.image) +
- `</div>
- <div class="el-overlay">
- <ul class="el-info">
- ` +
- v.group_id +
- `
- </ul>
- </div>
- </div>
- </div>
- </td>
- <td>` +
- v.group +
- `</td>
- <td>` +
- userCount +
- `</td>
- <td><button type="button" class="btn ` +
- defaultColor +
- ` btn-outline btn-circle btn-lg m-r-5 changeDefaultGroup" ` +
- disabledDefault +
- `><i class="` +
- defaultIcon +
- `"></i></button></td>
- <td><button type="button" class="btn btn-info btn-outline btn-circle btn-lg m-r-5 editGroupButton popup-with-form" href="#edit-group-form" data-effect="mfp-3d-unfold"><i class="ti-pencil-alt"></i></button></td>
- <td><button type="button" class="btn btn-danger btn-outline btn-circle btn-lg m-r-5 deleteUserGroup" ` +
- disabledDelete +
- `><i class="ti-trash"></i></button></td>
- </tr>
- `;
- });
- return userList;
- }
- function buildCategoryEditorItem(array) {
- var categoryList = "";
- $.each(array.categories, function (i, v) {
- var tabCount = array.tabs.reduce(function (n, category) {
- return n + (category.category_id == v.category_id);
- }, 0);
- var disabledDefault = v.default == 1 ? "disabled" : "";
- var disabledDelete =
- tabCount > 0 || v.default == 1 || v.category_id == 0 ? "disabled" : "";
- var defaultIcon =
- v.default == 1 ? "icon-user-following" : "icon-user-follow";
- var defaultColor = v.default == 1 ? "btn-info disabled" : "btn-warning";
- categoryList +=
- `
- <tr class="categoryEditor" data-id="` +
- v.id +
- `" data-order="` +
- v.order +
- `" data-category-id="` +
- v.category_id +
- `" data-name="` +
- v.category +
- `" data-default="` +
- tof(v.default) +
- `" data-image="` +
- v.image +
- `" data-tab-count="` +
- tabCount +
- `">
- <input type="hidden" class="form-control order" name="category[` +
- v.id +
- `].order" value="` +
- v.order +
- `">
- <input type="hidden" class="form-control" name="category[` +
- v.id +
- `].originalOrder" value="` +
- v.order +
- `">
- <input type="hidden" class="form-control" name="category[` +
- v.id +
- `].name" value="` +
- v.category +
- `">
- <input type="hidden" class="form-control" name="category[` +
- v.id +
- `].id" value="` +
- v.id +
- `">
- <td class="text-center el-element-overlay">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0">
- <div class="tabEditorIcon">` +
- iconPrefix(v.image) +
- `</div>
- <div class="el-overlay bg-org">
- <ul class="el-info">
- <i class="fa fa-bars"></i>
- </ul>
- </div>
- </div>
- </div>
- </td>
- <td>` +
- v.category +
- `</td>
- <td style="text-align:center">` +
- tabCount +
- `</td>
- <td style="text-align:center"><button type="button" class="btn ` +
- defaultColor +
- ` btn-outline btn-circle btn-lg m-r-5 changeDefaultCategory" ` +
- disabledDefault +
- `><i class="` +
- defaultIcon +
- `"></i></button></td>
- <td style="text-align:center"><button type="button" class="btn btn-info btn-outline btn-circle btn-lg m-r-5 editCategoryButton popup-with-form" href="#edit-category-form" data-effect="mfp-3d-unfold"><i class="ti-pencil-alt"></i></button></td>
- <td style="text-align:center"><button type="button" class="btn btn-danger btn-outline btn-circle btn-lg m-r-5 deleteCategory" ` +
- disabledDelete +
- `><i class="ti-trash"></i></button></td>
- </tr>
- `;
- });
- return categoryList;
- }
- function buildTabEditorItem(array) {
- var tabList = "";
- $.each(array.tabs, function (i, v) {
- let deleteDisabled = "deleteTab";
- let buttonDisabled = "";
- let typeDisabled = "";
- if (v.url !== null) {
- deleteDisabled =
- v.url.indexOf("/page/settings") > 0 ? "disabled" : "deleteTab";
- buttonDisabled = v.url.indexOf("/page/settings") > 0 ? "disabled" : "";
- typeDisabled = v.url.indexOf("/v2/page/") > 0 ? "disabled" : "";
- }
- tabList +=
- `
- <tr class="tabEditor" data-order="` +
- v.order +
- `" data-original-order="` +
- v.order +
- `" data-id="` +
- v.id +
- `" data-group-id="` +
- v.group_id +
- `" data-category-id="` +
- v.category_id +
- `" data-name="` +
- v.name +
- `" data-url="` +
- v.url +
- `" data-local-url="` +
- v.url_local +
- `" data-ping-url="` +
- v.ping_url +
- `" data-image="` +
- v.image +
- `" data-tab-action-type="` +
- v.timeout +
- `" data-tab-action-time="` +
- v.timeout_ms +
- `">
- <input type="hidden" class="form-control" name="tab[` +
- v.id +
- `].id" value="` +
- v.id +
- `">
- <input type="hidden" class="form-control order" name="tab[` +
- v.id +
- `].order" value="` +
- v.order +
- `">
- <input type="hidden" class="form-control" name="tab[` +
- v.id +
- `].originalOrder" value="` +
- v.order +
- `">
- <td class="mouse-grab sort-tabs-handle">
- <i class="icon-options-vertical m-r-5"></i>
- <!-- May use later on
- <div class="btn-group dropside visible-xs">
- <button aria-expanded="false" data-toggle="dropdown" class="btn btn-default btn-outline dropdown-toggle waves-effect waves-light" type="button"> <i class="icon-options-vertical m-r-5"></i> <span class="caret"></span></button>
- <ul role="menu" class="dropdown-menu">
- <li><a href="#"><i class="fa fa-angle-double-up"></i></a></li>
- <li><a href="#"><i class="fa fa-angle-up"></i></a></li>
- <li><a href="#"><i class="fa fa-angle-double-down"></i></a></li>
- <li><a href="#"><i class="fa fa-angle-down"></i></a></li>
- </ul>
- </div>
- -->
- </td>
- <td style="text-align:center" class="text-center el-element-overlay">
- <div class="el-card-item p-0">
- <div class="el-card-avatar el-overlay-1 m-0 tooltip-info" data-toggle="tooltip" data-placement="top" title="" data-original-title="${v.id}">
- <div class="tabEditorIcon">` +
- iconPrefix(v.image) +
- `</div>
- </div>
- </div>
- </td>
- <td><span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="` +
- v.url +
- `">` +
- v.name +
- `</span><span id="checkTabHomepageItem-` +
- v.id +
- `" data-url="` +
- v.url +
- `" data-url-local="` +
- v.url_local +
- `" data-name="` +
- v.name +
- `" class="checkTabHomepageItem mouse label label-rouded label-inverse pull-right"></span></td>
- ` +
- buildTabCategorySelect(array.categories, v.id, v.category_id) +
- `
- ` +
- buildTabGroupSelect(array.groups, v.id, v.group_id, "tabGroupSelectMin") +
- `
- ` +
- buildTabGroupSelect(
- array.groups,
- v.id,
- v.group_id_max,
- "tabGroupSelectMax"
- ) +
- `
- ` +
- buildTabTypeSelect(v.id, v.type, typeDisabled) +
- `
- <td style="text-align:center"><div class="radio radio-purple"><input onclick="radioLoop(this);" type="radio" class="defaultSwitch" id="tab[` +
- v.id +
- `].default" name="tab[` +
- v.id +
- `].default" value="true" ` +
- tof(v.default, "c") +
- `><label for="tab[` +
- v.id +
- `].default"></label></div></td>
- <td style="text-align:center"><input ` +
- buttonDisabled +
- ` type="checkbox" class="js-switch enabledSwitch ` +
- buttonDisabled +
- `" data-size="small" data-color="#99d683" data-secondary-color="#f96262" name="tab[` +
- v.id +
- `].enabled" value="true" ` +
- tof(v.enabled, "c") +
- `/><input type="hidden" class="form-control" name="tab[` +
- v.id +
- `].enabled" value="false"></td>
- <td style="text-align:center"><input type="checkbox" class="js-switch splashSwitch" data-size="small" data-color="#99d683" data-secondary-color="#f96262" name="tab[` +
- v.id +
- `].splash" value="true" ` +
- tof(v.splash, "c") +
- `/><input type="hidden" class="form-control" name="tab[` +
- v.id +
- `].splash" value="false"></td>
- <td style="text-align:center"><input type="checkbox" class="js-switch pingSwitch" data-size="small" data-color="#99d683" data-secondary-color="#f96262" name="tab[` +
- v.id +
- `].ping" value="true" ` +
- tof(v.ping, "c") +
- `/><input type="hidden" class="form-control" name="tab[` +
- v.id +
- `].ping" value="false"></td>
- <td style="text-align:center"><input type="checkbox" class="js-switch preloadSwitch" data-size="small" data-color="#99d683" data-secondary-color="#f96262" name="tab[` +
- v.id +
- `].preload" value="true" ` +
- tof(v.preload, "c") +
- `/><input type="hidden" class="form-control" name="tab[` +
- v.id +
- `].preload" value="false"></td>
- <td style="text-align:center"><input type="checkbox" class="js-switch addToAdminSwitch" data-size="small" data-color="#99d683" data-secondary-color="#f96262" name="tab[` +
- v.id +
- `].add_to_admin" value="true" ` +
- tof(v.add_to_admin, "c") +
- `/><input type="hidden" class="form-control" name="tab[` +
- v.id +
- `].add_to_admin" value="false"></td>
- <td style="text-align:center"><button type="button" class="btn btn-info btn-outline btn-circle btn-lg m-r-5 editTabButton popup-with-form" onclick="editTabForm('` +
- v.id +
- `')" href="#edit-tab-form" data-effect="mfp-3d-unfold"><i class="ti-pencil-alt"></i></button></td>
- <td style="text-align:center"><button type="button" class="btn btn-danger btn-outline btn-circle btn-lg m-r-5 ` +
- deleteDisabled +
- `"><i class="ti-trash"></i></button></td>
- </tr>
- `;
- });
- return tabList;
- }
- function editTabForm(id) {
- organizrAPI2("GET", "api/v2/tabs/" + id, true)
- .success(function (data) {
- try {
- let response = data.response;
- $(".tabIconImageList").val(null).trigger("change");
- $(".tabIconIconList").val(null).trigger("change");
- $("#edit-tab-form [name=name]").val(response.data.name);
- $("#originalTabName").html(response.data.name);
- $("#edit-tab-form [name=url]").val(response.data.url);
- $("#edit-tab-form [name=url_local]").val(response.data.url_local);
- $("#edit-tab-form [name=ping_url]").val(response.data.ping_url);
- $("#edit-tab-form [name=image]").val(response.data.image);
- $("#edit-tab-form [name=id]").val(response.data.id);
- $("#edit-tab-form [name=timeout_ms]").val(
- convertMsToMinutes(response.data.timeout_ms)
- );
- $("#edit-tab-form [name=timeout]").val(response.data.timeout);
- if (response.data.url.indexOf("/?v") > 0) {
- $("#edit-tab-form [name=url]").prop("disabled", "true");
- } else {
- $("#edit-tab-form [name=url]").prop("disabled", null);
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Tab Error");
- });
- }
- function getSubmitSettingsFormValueSingle(form, index, value) {
- var values = {};
- if (value !== "#987654" && index.includes("disable-pwd-mgr") == false) {
- var input = $("#" + form + " [name='" + index + "']");
- var dataType = input.attr("data-type");
- switch (dataType) {
- case "switch":
- case "checkbox":
- var value = input.prop("checked") ? true : false;
- break;
- case "select2":
- var value = input.val() !== null ? input.val().toString() : "";
- break;
- default:
- var value = input.val();
- }
- values = { name: index, value: value, type: dataType };
- return values;
- }
- return false;
- }
- function getSubmitSettingsFormValueObject(form, index, value) {
- var values = [];
- $.each(value, function (i, v) {
- var objectList = [];
- var object = [];
- $.each(v, function (key, val) {
- if (val !== "#987654" && key.includes("disable-pwd-mgr") == false) {
- var input = $(
- "#" + form + " [name='" + index + "[" + i + "]." + key + "']"
- );
- var dataType = input.attr("data-type");
- var dataLabel = input.attr("data-label");
- switch (dataType) {
- case "switch":
- case "checkbox":
- var value = input.prop("checked") ? true : false;
- break;
- case "select2":
- var value = input.val() !== null ? input.val().toString() : "";
- break;
- default:
- var value = input.val();
- }
- var newKey = index + "[" + i + "]." + key;
- object.push({
- type: dataType,
- name: newKey,
- label: dataLabel,
- value: value,
- });
- }
- });
- values.push(object);
- });
- values = { name: index, value: values, type: "array" };
- return values;
- }
- function submitSettingsForm(form, homepageItem = false) {
- var list = $("#" + form).serializeToJSON();
- var size = 0;
- var submit = {};
- $.each(list, function (i, v) {
- var values = false;
- if (Object.prototype.toString.call(v) === "[object Object]") {
- values = getSubmitSettingsFormValueObject(form, i, v);
- } else {
- values = getSubmitSettingsFormValueSingle(form, i, v);
- }
- size++;
- if (values) {
- submit[i] = values.value;
- }
- });
- var callbacks = $.Callbacks();
- // Custom Callbacks
- switch (form) {
- case "customize-appearance-form":
- break;
- default:
- }
- if (size > 0) {
- organizrAPI2("PUT", "api/v2/config", submit, true)
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- if (callbacks) {
- callbacks.fire();
- }
- if (homepageItem && !activeInfo.settings.misc.disableHomepageModals) {
- let html = `
- <div class="panel panel-default">
- <div class="panel-heading">${response.message}</div>
- <div class="panel-wrapper collapse in">
- <div class="panel-body">
- <div class="overlay-box">
- <div class="user-content">
- <h4 lang="en">Close Homepage Settings?</h4>
- <div class="button-box">
- <button class="btn btn-info waves-effect waves-light" type="button" onclick="swal.close();Custombox.modal.close()"><span class="btn-label"><i class="ti-check"></i></span>Yes</button>
- <button class="btn btn-danger waves-effect waves-light" type="button" onclick="swal.close()"><span class="btn-label"><i class="ti-close"></i></span>No</button>
- </div>
- <p class="close-homepage-timer">Auto Closing in 5 seconds...</p>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(html),
- buttons: false,
- className: "bg-org",
- timer: 5000,
- });
- textTimer(
- 5,
- ".close-homepage-timer",
- "Seconds remaining: ",
- "Closing..."
- );
- } else {
- message(
- "Updated Items",
- response.message,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- $("#" + form + " :input").each(function () {
- var input = $(this);
- input
- .closest(".form-group")
- .removeClass("has-success")
- .removeClass("has-error");
- });
- $("#" + form + "-save").addClass("hidden");
- } else {
- $("#" + form + " :input").each(function () {
- var input = $(this);
- input
- .closest(".form-group")
- .removeClass("has-success")
- .addClass("has-error");
- });
- }
- }
- function textTimer(seconds, el, preText, postText) {
- var seconds_left = seconds;
- var interval = setInterval(function () {
- $(el).html(preText + " " + --seconds_left);
- if (seconds_left <= 0) {
- $(el).html(postText);
- clearInterval(interval);
- }
- }, 1000);
- }
- function submitHomepageOrder() {
- var list = $("#homepage-values").serializeToJSON();
- var size = 0;
- var submit = {};
- $.each(list, function (i, v) {
- if (v !== "") {
- size++;
- submit[i] = v;
- }
- });
- var callbacks = $.Callbacks();
- if (size > 0) {
- organizrAPI2("PUT", "api/v2/config", submit, true)
- .success(function (data) {
- try {
- var response = data.response;
- $("#submitHomepageOrder-save").addClass("hidden");
- } catch (e) {
- organizrCatchError(e, data);
- }
- message(
- "Updated Homepage Order",
- response.message,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- if (callbacks) {
- callbacks.fire();
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- } else {
- console.log("add error");
- }
- }
- function submitTabOrder(newTabs) {
- var data = [];
- var process = false;
- $.each(newTabs.tab, function (i, v) {
- if (v.originalOrder == v.order) {
- delete newTabs.tab[i];
- } else {
- let temp = {
- order: v.order,
- id: v.id,
- };
- data.push(temp);
- process = true;
- }
- });
- if (!process) {
- message(
- "Tab Order Warning",
- "Order was not changed - Submission not needed",
- activeInfo.settings.notifications.position,
- "#FFF",
- "warning",
- "5000"
- );
- $(".saveTabOrderButton").addClass("hidden");
- return false;
- }
- var callbacks = $.Callbacks();
- callbacks.add(buildTabEditor);
- organizrAPI2("PUT", "api/v2/tabs", data, true)
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- message(
- "Tab Order Updated",
- response.message,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- if (callbacks) {
- callbacks.fire();
- }
- $(".saveTabOrderButton").addClass("hidden");
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- }
- function submitCategoryOrder() {
- var data = [];
- var categories = $("#submit-categories-form").serializeToJSON();
- var callbacks = $.Callbacks();
- callbacks.add(buildCategoryEditor);
- $.each(categories.category, function (i, v) {
- if (v.originalOrder == v.order) {
- delete categories.category[i];
- } else {
- let temp = {
- order: v.order,
- id: v.id,
- };
- data.push(temp);
- }
- });
- organizrAPI2("PUT", "api/v2/categories", data, true)
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- message(
- "Category Order Updated",
- response.message,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- if (callbacks) {
- callbacks.fire();
- }
- $(".saveTabOrderButton").addClass("hidden");
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- }
- function buildTR(array, type, badge) {
- var listing = "";
- var arrayItems = array.split("|");
- if (hasValue(arrayItems) === true) {
- $.each(arrayItems, function (i, v) {
- listing +=
- `
- <tr>
- <td width="70"><span class="label label-` +
- badge +
- `"><span lang="en">` +
- type +
- `</span></span></td>
- <td class="text-capitalize">` +
- updateIssueLink(v) +
- `</td>
- </tr>
- `;
- });
- return listing;
- }
- return " ";
- }
- function buildVersion(array) {
- var x = 0;
- var versions =
- '<div class="col-md-3 col-sm-4 col-xs-6 m-b-10 pull-right"><button onclick="manualUpdateCheck()" class="btn btn-sm btn-primary btn-rounded waves-effect waves-light pull-right row b-none buttonManualUpdateCheck" type="button"><span class="btn-label"><i class="fa fa-globe"></i></span><span lang="en">Check For Updates</span></button></div><div class="clearfix"></div>';
- var listing = "";
- var currentV = currentVersion;
- var installed = "";
- var spanClass = "";
- var button = "";
- $.each(array, function (i, v) {
- listing += buildTR(v.new, "NEW", "info");
- listing += buildTR(v.fixed, "FIXED", "success");
- listing += buildTR(v.notes, "NOTE", "warning");
- if (currentV === i) {
- button =
- '<button class="btn btn-sm btn-success btn-rounded waves-effect waves-light disabled pull-right row b-none" type="button"><span class="btn-label"><i class="fa fa-check"></i></span><span lang="en">Installed</span></button>';
- } else if (x === 0) {
- button =
- '<button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none" type="button" onclick="updateNow();"><span class="btn-label"><i class="fa fa-download"></i></span><span lang="en">Install Update</span></button>';
- }
- let tableClass = x == 0 ? "" : "hidden";
- let divClassPadding = x == 0 ? "" : "p-b-0";
- let divClassMargin = x == 0 ? "" : "m-b-0";
- let toggleButtonText = x == 0 ? "Less" : "More";
- let toggleButtonIcon = x == 0 ? "up" : "down";
- let divStatus = x == 0 ? "opened" : "closed";
- versions +=
- `
- <div class="white-box bg-org ${divClassPadding} update-main-div-${x}" data-status="${divStatus}">
- <div class="col-md-3 col-sm-4 col-xs-6 pull-right">` +
- button +
- `</div>
- <h3 class="box-title ${divClassMargin} update-box-title-${x}">` +
- i +
- `</h3>
- <div class="row sales-report">
- <div class="col-md-12 col-sm-12 col-xs-12">
- <div class="pull-left">
- <span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="` +
- moment(v.date).format("LL") +
- `">` +
- moment.utc(v.date, "YYYY-MM-DD hh:mm[Z]").local().fromNow() +
- `</span>
- <p class="text-info p-0">` +
- v.title +
- `</p>
- </div>
- <button class="btn btn-sm btn-primary btn-rounded waves-effect waves-light pull-right" onclick="toggleGithubVersion(${x})" type="button"><span class="btn-label"><i class="fa fa-long-arrow-${toggleButtonIcon} toggleButtonIcon-${x}"></i></span><span lang="en" class="toggleButton-${x}">${toggleButtonText}</span></button>
- </div>
- </div>
- <div class="table-responsive ${tableClass} update-table-${x}">
- <table class="table inverse-bordered-table">
- <tbody>
- ` +
- listing +
- `
- </tbody>
- </table>
- </div>
- </div>
- `;
- listing = "";
- button = "";
- x++;
- });
- return versions;
- }
- function toggleGithubVersion(id) {
- let status = $(".update-main-div-" + id).attr("data-status");
- if (status == "opened") {
- $(".update-main-div-" + id).attr("data-status", "closed");
- $(".update-main-div-" + id).addClass("p-b-0");
- $(".update-box-title-" + id).addClass("m-b-0");
- $(".update-table-" + id).addClass("hidden");
- $(".toggleButton-" + id).text("More");
- $(".toggleButtonIcon-" + id)
- .removeClass("fa-long-arrow-up")
- .addClass("fa-long-arrow-down");
- } else {
- $(".update-main-div-" + id).attr("data-status", "opened");
- $(".update-main-div-" + id).removeClass("p-b-0");
- $(".update-box-title-" + id).removeClass("m-b-0");
- $(".update-table-" + id).removeClass("hidden");
- $(".toggleButton-" + id).text("Less");
- $(".toggleButtonIcon-" + id)
- .addClass("fa-long-arrow-up")
- .removeClass("fa-long-arrow-down");
- }
- }
- function manualUpdateCheck() {
- $(".buttonManualUpdateCheck").addClass("disabled");
- $(".buttonManualUpdateCheck i")
- .removeClass("fa-globe")
- .addClass("fa-refresh fa-spin");
- setTimeout(function () {
- updateCheck();
- checkCommitLoad();
- }, 1000);
- setTimeout(function () {
- $(".buttonManualUpdateCheck").removeClass("disabled");
- $(".buttonManualUpdateCheck i")
- .removeClass("fa-refresh fa-spin fa-globe")
- .addClass("fa-check");
- }, 1500);
- return true;
- }
- function updateCheck() {
- githubVersions()
- .success(function (data) {
- try {
- var response = JSON.parse(data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- for (var a in reverseObject(response)) {
- var latest = a;
- break;
- }
- if (latest !== currentVersion) {
- organizrConsole(
- "Update Function",
- "Update to " + latest + " is available",
- "warning"
- );
- if (activeInfo.settings.misc.docker === false) {
- let tabInfo = findTab("api/v2/page/settings", "access_url");
- if (tabInfo) {
- messageSingle(
- window.lang.translate("Update Available"),
- latest +
- " " +
- window.lang.translate("is available, goto") +
- ' <a href="javascript:void(0)" onclick="tabActions(event,\'' +
- tabInfo.id +
- "');clickPath('update')\"><span lang=\"en\">Update Tab</span></a>",
- activeInfo.settings.notifications.position,
- "#FFF",
- "update",
- "60000"
- );
- }
- }
- } else {
- organizrConsole(
- "Update Function",
- "Already running latest version: " + latest,
- "info"
- );
- }
- $("#githubVersions").html(buildVersion(reverseObject(response)));
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function ignoreNewsId(id) {
- organizrAPI2("POST", "api/v2/news/" + id, {})
- .success(function (data) {
- try {
- let response = data.response;
- message(
- "News Item",
- "Item now ignored",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- $(".newsItem-" + id).remove();
- $(".newsHeart-" + id).remove();
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "News");
- });
- }
- function newsLoad() {
- newsJSON()
- .success(function (data) {
- try {
- var response = JSON.parse(data);
- var items = [];
- var limit = 5;
- var count = 0;
- organizrAPI2("get", "api/v2/news")
- .success(function (data) {
- try {
- let ignoredIds = data.response.data;
- ignoredIds = ignoredIds == null ? [] : ignoredIds;
- $.each(response, function (i, v) {
- count++;
- let ignore = ignoredIds.includes(v.id);
- let alertDefined =
- typeof v.important !== "undefined" && v.important !== false;
- let alert =
- alertDefined && ignore == false
- ? `<span class="animated loop-animation flash text-danger mouse newsItem-${v.id}" onclick="ignoreNewsId('${v.id}')"> <i class="ti-alert"></i> Important Message - Click me to Ignore</span>`
- : "";
- let heartBeat =
- alertDefined && ignore == false
- ? `<div class="notify pull-left newsHeart-${v.id}"><span class="heartbit"></span><span class="point"></span></div>`
- : "";
- let newBody =
- `
- <h5 class="pull-left"><i class="ti-calendar"></i> ` +
- moment(v.date).format("LLL") +
- alert +
- `</h5>
- <h5 class="pull-right">` +
- v.author +
- `</h5>
- <div class="clearfix"></div>
- ` +
- (v.subTitle ? "<h5>" + v.subTitle + "</h5>" : "") +
- `
- <p>` +
- v.body +
- `</p>
- `;
- if (count <= limit) {
- items[i] = {
- title: v.title + heartBeat,
- body: newBody,
- };
- }
- });
- var body = buildAccordion(items, true);
- $("#organizrNewsPanel").html(body);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "News");
- });
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function checkPluginUpdates() {
- if (!activeInfo.user.loggedin || activeInfo.user.groupID > 1) {
- return false;
- }
- organizrAPI2("get", "api/v2/plugins/marketplace")
- .success(function (data) {
- try {
- let update = false;
- let pluginsNeedingUpdate = [];
- let plugins = data.response.data;
- $.each(plugins, function (i, v) {
- if (v.needs_update) {
- update = true;
- pluginsNeedingUpdate.push(i);
- }
- });
- if (update) {
- pluginsNeedingUpdate = "[" + pluginsNeedingUpdate.join(", ") + "]";
- messageSingle(
- window.lang.translate("Update Available"),
- '<a href="javascript:void(0)" onclick="shortcut(\'plugin-marketplace\');"><span lang="en">The following plugin(s) need updates</span></a>: ' +
- pluginsNeedingUpdate,
- activeInfo.settings.notifications.position,
- "#FFF",
- "update",
- "600000"
- );
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Marketplace");
- });
- }
- function checkCommitLoad() {
- if (
- activeInfo.settings.misc.docker &&
- activeInfo.settings.misc.githubCommit !== "n/a" &&
- activeInfo.settings.misc.githubCommit !== null
- ) {
- if (checkCommitLoadStatus == false) {
- checkCommitLoadStatus = true;
- getLatestCommitJSON()
- .success(function (data) {
- try {
- var latest = data.sha.toString().trim();
- var current = activeInfo.settings.misc.githubCommit
- .toString()
- .trim();
- var link =
- "https://github.com/causefx/Organizr/compare/" +
- current +
- "..." +
- latest;
- if (latest !== current) {
- messageSingle(
- window.lang.translate("Update Available"),
- ' <a href="' +
- link +
- '" target="_blank"><span lang="en">Compare Difference</span></a> <span lang="en">or</span> <a href="javascript:void(0)" onclick="updateNow()"><span lang="en">Update Now</span></a>',
- activeInfo.settings.notifications.position,
- "#FFF",
- "update",
- "600000"
- );
- } else {
- organizrConsole(
- "Update Function",
- "Organizr Docker - Up to date"
- );
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- checkCommitLoadStatus = false;
- })
- .fail(function (xhr) {
- console.error("Organizr Function: Github Connection Failed");
- checkCommitLoadStatus = false;
- });
- }
- }
- }
- function sponsorLoad() {
- sponsorsJSON()
- .success(function (data) {
- try {
- var response = JSON.parse(data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#sponsorList").html(buildSponsor(response));
- $("#sponsorListModals").html(buildSponsorModal(response));
- $(".sponsor-items").owlCarousel({
- nav: false,
- autoplay: true,
- dots: false,
- margin: 10,
- autoWidth: true,
- items: 4,
- });
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function backersLoad() {
- organizrAPI2("GET", "api/v2/sponsors/all")
- .success(function (data) {
- try {
- let json = data.response;
- $("#backersList").html(buildBackers(json.data));
- $(".backers-items").owlCarousel({
- nav: false,
- autoplay: true,
- dots: false,
- margin: 10,
- autoWidth: true,
- items: 4,
- });
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function buildBackers(array) {
- let backers = "";
- $.each(array, function (i, v) {
- if (v.type == "USER" && v.role == "BACKER" && v.isActive) {
- v.name = v.name ? v.name : "User";
- v.image = v.image ? v.image : "plugins/images/default_user.png";
- backers += `
- <!-- /.usercard -->
- <div class="item lazyload recent-sponsor imageSource" data-src="${v.image}">
- <span class="elip recent-title">${v.name}</span>
- </div>
- <!-- /.usercard-->
- `;
- }
- });
- backers += `
- <!-- /.usercard -->
- <div class="item lazyload recent-sponsor mouse imageSource mouse" onclick="window.open('https://opencollective.com/organizr', '_blank')" data-src="plugins/images/sponsor-open-collective.png">
- <span class="elip recent-title" lang="en">You</span>
- </div>
- <!-- /.usercard-->
- `;
- return backers;
- }
- function sponsorDetails(id) {
- sponsorsJSON()
- .success(function (data) {
- try {
- let response = JSON.parse(data);
- let coupon = response[id].coupon == null ? false : true;
- let couponAbout = response[id].coupon_about == null ? false : true;
- let extraInfo =
- coupon && couponAbout
- ? `
- <hr/>
- <h3>Coupon Code:</h3>
- <p><span class="label label-rouded label-info pull-right">${response[id].coupon}</span>
- <span class=" pull-left">${response[id].coupon_about}</span></p>
- `
- : "";
- if (typeof response[id].logo_dark !== "undefined") {
- if (activeInfo.style == "dark") {
- response[id].logo = response[id].logo_dark;
- }
- }
- let html = `
- <div class="panel panel-default">
- <div class="panel-heading">${response[id].company_name}</div>
- <div class="panel-wrapper collapse in">
- <div class="panel-body">
- <div class="overlay-box">
- <div class="user-content">
- <a href="javascript:void(0)"><img src="${response[id].logo}" class="thumb-lg img-circle" alt="img"></a>
- <h4 class="text-white">${response[id].company_name}</h4>
- <h5 class="text-white"><a href="${response[id].website}" target="_blank">Website</a></h5>
- </div>
- </div>
- <hr/>
- <div class="text-left">${response[id].about} ${extraInfo}</div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(html),
- buttons: false,
- className: "bg-org",
- });
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function sponsorAbout(id, array) {
- var coupon = array.coupon != null;
- var couponAbout = array.coupon_about != null;
- var extraInfo =
- coupon && couponAbout
- ? `
- <h3>Coupon Code:</h3>
- <p><span class="label label-rouded label-info pull-right">` +
- array.coupon +
- `</span>
- <span class=" pull-left">` +
- array.coupon_about +
- `</span></p>
- `
- : "";
- if (typeof array.logo_dark !== "undefined") {
- if (activeInfo.style == "dark") {
- array.logo = array.logo_dark;
- }
- }
- return (
- `
- <!-- modal content -->
- <div id="sponsor-` +
- id +
- `-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel-` +
- id +
- `" aria-hidden="true" style="display: none;">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
- <h4 class="modal-title" id="mySmallModalLabel-` +
- id +
- `">` +
- array.company_name +
- `</h4> </div>
- <div class="modal-body">
- <div class="row">
- <div class="col-md-12">
- <div class="comment-center p-t-10">
- <div class="comment-body b-none">
- <div class="user-img"> <img src="` +
- array.logo +
- `" alt="user" class="img-circle"> </div>
- <div class="mail-content">
- <h5><a href="` +
- array.website +
- `" target="_blank">` +
- array.company_name +
- `</a></h5>
- ` +
- array.about +
- extraInfo +
- `
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- /.modal-content -->
- </div>
- <!-- /.modal-dialog -->
- </div>
- <!-- /.modal -->
- `
- );
- }
- function buildSponsor(array) {
- var sponsors = "";
- $.each(array, function (i, v) {
- var hasCoupon = "";
- if (v.about) {
- if (v.coupon) {
- hasCoupon = `
- <span class="text-center has-coupon-text">Has Coupon</span>
- <span class="text-center has-coupon"><i class="fa fa-ticket" aria-hidden="true"></i></span>
- `;
- }
- }
- var sponsorAboutModal = v.about
- ? "onclick=\"sponsorDetails('" +
- i +
- "');sponsorAnalytics('" +
- v.company_name +
- "');\""
- : "onclick=\"window.open('" +
- v.website +
- "', '_blank');sponsorAnalytics('" +
- v.company_name +
- "');\"";
- if (typeof v.logo_dark !== "undefined") {
- if (activeInfo.style == "dark") {
- v.logo = v.logo_dark;
- }
- }
- sponsors += `
- <!-- /.usercard -->
- <div class="item lazyload recent-sponsor mouse imageSource mouse" ${sponsorAboutModal} data-src="${v.logo}" data-id="${i}">
- <span class="elip recent-title">${v.company_name}</span>
- ${hasCoupon}
- </div>
- <!-- /.usercard-->
- `;
- });
- sponsors += `
- <!-- /.usercard -->
- <div class="item lazyload recent-sponsor mouse imageSource mouse" onclick="window.open('https://www.patreon.com/bePatron?c=1320444&rid=2874514', '_blank')" data-src="plugins/images/sponsor-patreon.png">
- <span class="elip recent-title" lang="en">Patreon Sponsor</span>
- </div>
- <div class="item lazyload recent-sponsor mouse imageSource mouse" onclick="window.open('https://opencollective.com/organizr', '_blank')" data-src="plugins/images/sponsor-open-collective.png">
- <span class="elip recent-title" lang="en">OpenCollective Sponsor</span>
- </div>
- <!-- /.usercard-->
- `;
- return sponsors;
- }
- function buildSponsorModal(array) {
- var sponsors = "";
- $.each(array, function (i, v) {
- var sponsorAboutModal = v.about ? sponsorAbout(i, v) : "";
- sponsors += sponsorAboutModal;
- });
- return sponsors;
- }
- function sponsorAnalytics(sponsor_name) {
- var uuid = activeInfo.settings.misc.uuid;
- $.ajax({
- type: "POST",
- url: "https://api.organizr.app/",
- data: {
- sponsor_name: sponsor_name,
- user_uuid: uuid,
- cmd: "sponsor",
- },
- cache: false,
- async: true,
- complete: function (xhr, status) {
- if (xhr.status === 200) {
- let result = $.parseJSON(xhr.responseText);
- }
- },
- });
- }
- function themeAnalytics(theme_name) {
- var uuid = activeInfo.settings.misc.uuid;
- $.ajax({
- type: "POST",
- url: "https://api.organizr.app/",
- data: {
- theme_name: theme_name,
- user_uuid: uuid,
- cmd: "theme",
- },
- cache: false,
- async: true,
- complete: function (xhr, status) {
- if (xhr.status === 200) {
- let result = $.parseJSON(xhr.responseText);
- }
- },
- });
- }
- function getOrganizrBackups() {
- organizrAPI2("GET", "api/v2/backup")
- .success(function (data) {
- try {
- let json = data.response;
- $("#backup-file-list").html(buildOrganizrBackups(json.data));
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function createOrganizrBackup() {
- $("#settings-settings-backup").block({
- message:
- '<p style="margin:0;padding:8px;font-size:24px;" lang="en">Backing up...</p>',
- css: {
- color: "#fff",
- border: "1px solid #5761a9",
- backgroundColor: "#707cd2",
- },
- });
- organizrAPI2("POST", "api/v2/backup", {})
- .success(function (data) {
- try {
- let response = data.response;
- if (response) {
- getOrganizrBackups();
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#settings-settings-backup").unblock();
- })
- .fail(function (xhr) {
- $("#settings-settings-backup").unblock();
- OrganizrApiError(xhr, "Backup Error");
- });
- }
- function buildOrganizrBackups(array) {
- let list = "";
- if (array.total_files > 0) {
- $.each(array.files, function (i, v) {
- i++;
- let pattern = /\[[^\]]*\]/gm;
- let version =
- typeof v.name.match(pattern)[1] !== "undefined"
- ? v.name.match(pattern)[1]
- : "N/A";
- list += `
- <tr>
- <td>${i}</td>
- <td class="txt-oflo">${v.name}</td>
- <td><span class="label label-primary label-rouded">${version}</span> </td>
- <td class="txt-oflo">${v.size}</td>
- <td><span class="text-info tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="${moment(
- v.date
- ).format("LLL")}">${moment
- .utc(v.date, "YYYY-MM-DD hh:mm[Z]")
- .local()
- .fromNow()}</span></td>
- <td><span class="text-primary"><a href="api/v2/backup/${
- v.name
- }"><i class="fa fa-download download-backup" data-file="${
- v.name
- }"></i></a> | <a href="javascript:void(0)"><i class="fa fa-trash-o delete-backup" data-file="${
- v.name
- }"></i></a></span></td>
- </tr>
- `;
- });
- } else {
- list =
- '<tr><td class="text-center" colspan="6">No Backups made yet</td></tr>';
- }
- $("#backup-total-files").html(array.total_files);
- $("#backup-total-size").html(array.total_size);
- return list;
- }
- function updateBar() {
- return `
- <div class="white-box m-0">
- <div class="row">
- <div class="col-lg-12">
- <h3 id="update-title" class="box-title pull-left"></h3><h3 id="update-time" class="box-title pull-right hidden"><span id="update-seconds"></span> <span lang="en">Seconds</span></h3>
- <div class="clearfix"></div>
- <div class="progress progress-lg">
- <div id="update-bar" class="progress-bar progress-bar-primary progress-bar-striped active" style="width: 0%;" role="progressbar">0%</div>
- </div>
- </div>
- <h6>If error occurs - Use Esc key to close modal</h6>
- </div>
- </div>
- `;
- }
- function showUpdateBar() {
- swal({
- content: createElementFromHTML(updateBar()),
- buttons: false,
- className: "bg-org",
- closeOnClickOutside: false,
- });
- }
- function updateUpdateBar(title, percent, update = false) {
- $("#update-title").text(title);
- $("#update-bar").text(percent);
- $("#update-bar").css("width", percent);
- if (update) {
- $("#update-time").removeClass("hidden");
- countdown(10);
- }
- }
- function countdown(remaining) {
- if (remaining === 0) {
- local("set", "message", "Organizr Update|Update Successful|update");
- location.reload(true);
- }
- $("#update-seconds").text(remaining);
- setTimeout(function () {
- countdown(remaining - 1);
- }, 1000);
- }
- function dockerUpdate() {
- if (activeInfo.settings.misc.docker) {
- showUpdateBar();
- updateUpdateBar("Starting Download", "20%");
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Starting Update Process"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- organizrAPI2("GET", "api/v2/update/docker")
- .success(function (data) {
- updateUpdateBar("Restarting Organizr in", "100%", true);
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- "Update complete",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- }
- }
- function windowsUpdate() {
- if (activeInfo.serverOS == "win") {
- showUpdateBar();
- updateUpdateBar("Starting Download", "20%");
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Starting Update Process"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- organizrAPI2("GET", "api/v2/update/windows")
- .success(function (data) {
- updateUpdateBar("Restarting Organizr in", "100%", true);
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- "Update complete",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- }
- }
- function linuxUpdate() {
- if (activeInfo.serverOS !== "win" && !activeInfo.settings.misc.docker) {
- showUpdateBar();
- updateUpdateBar("Starting Download", "20%");
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Starting Update Process"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- organizrAPI2("GET", "api/v2/update/linux")
- .success(function (data) {
- updateUpdateBar("Restarting Organizr in", "100%", true);
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- "Update complete",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- }
- }
- function updateNow() {
- clearAJAX();
- if (activeInfo.settings.misc.docker) {
- dockerUpdate();
- return false;
- }
- if (activeInfo.serverOS === "win") {
- windowsUpdate();
- return false;
- }
- if (activeInfo.serverOS !== "win" && !activeInfo.settings.misc.docker) {
- linuxUpdate();
- return false;
- }
- organizrConsole("Update Function", "Starting Update Process");
- showUpdateBar();
- updateUpdateBar("Starting Download", "5%");
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Starting Update Process"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- organizrAPI2("GET", "api/v2/update/download/" + activeInfo.branch)
- .success(function (data) {
- updateUpdateBar("Starting Unzip", "50%");
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Update File Downloaded"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- organizrAPI2("GET", "api/v2/update/unzip/" + activeInfo.branch)
- .success(function (data) {
- updateUpdateBar("Starting Copy", "70%");
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Update File Unzipped"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- organizrAPI2("GET", "api/v2/update/move/" + activeInfo.branch)
- .success(function (data) {
- updateUpdateBar("Starting Cleanup", "90%");
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Update Files Copied"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- organizrAPI2("GET", "api/v2/update/cleanup/" + activeInfo.branch)
- .success(function (data) {
- updateUpdateBar("Restarting Organizr in", "100%", true);
- messageSingle(
- window.lang.translate("[DO NOT CLOSE WINDOW]"),
- window.lang.translate("Update Cleanup Finished"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "60000"
- );
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Update Error");
- });
- }
- function settingsAPI2(post, callbacks = null, asyncValue = true) {
- organizrAPI2("POST", post.api, post.data, asyncValue)
- .success(function (data) {
- try {
- var response = JSON.parse(data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- message(
- post.messageTitle,
- post.messageBody,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- if (callbacks) {
- callbacks.fire();
- }
- })
- .fail(function (xhr) {
- console.error(post.error);
- });
- }
- $.xhrPool.abortAll = function (url) {
- $(this).each(function (i, jqXHR) {
- // cycle through list of recorded connection
- if (!url || url === jqXHR.requestURL) {
- organizrConsole("Organizr API Abort", jqXHR.requestURL, "info");
- jqXHR.abort(); // aborts connection
- $.xhrPool.splice(i, 1); // removes from list by index
- }
- });
- };
- $.ajaxPrefilter(function (options, originalOptions, jqXHR) {
- //organizrConsole('Organizr API Function',options.url,'info');
- jqXHR.requestURL = options.url;
- });
- function organizrAPI2(type, path, data = null, asyncValue = true) {
- $.xhrPool.abortAll(path);
- var timeout = 10000;
- switch (path) {
- case "api/v2/update/windows":
- case "api/v2/update/docker":
- case "api/v2/login":
- timeout = 240000;
- break;
- default:
- timeout = 60000;
- }
- switch (type) {
- case "get":
- case "GET":
- case "g":
- return $.ajax({
- url: path,
- method: "GET",
- beforeSend: function (request) {
- request.setRequestHeader("Token", activeInfo.token);
- request.setRequestHeader("formKey", local("g", "formKey"));
- $.xhrPool.push(request);
- },
- complete: function (jqXHR) {
- var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
- if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
- },
- timeout: timeout,
- });
- case "delete":
- case "DELETE":
- case "d":
- return $.ajax({
- url: path,
- method: "DELETE",
- beforeSend: function (request) {
- request.setRequestHeader("Token", activeInfo.token);
- request.setRequestHeader("formKey", local("g", "formKey"));
- $.xhrPool.push(request);
- },
- complete: function (jqXHR) {
- var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
- if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
- },
- timeout: timeout,
- });
- case "post":
- case "POST":
- case "p":
- data.formKey = local("g", "formKey");
- return $.ajax({
- url: path,
- method: "POST",
- async: asyncValue,
- beforeSend: function (request) {
- request.setRequestHeader("Token", activeInfo.token);
- request.setRequestHeader("formKey", local("g", "formKey"));
- $.xhrPool.push(request);
- },
- complete: function (jqXHR) {
- var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
- if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
- },
- data: data,
- });
- case "put":
- case "PUT":
- data.formKey = local("g", "formKey");
- return $.ajax({
- url: path,
- method: "PUT",
- async: asyncValue,
- beforeSend: function (request) {
- request.setRequestHeader("Token", activeInfo.token);
- request.setRequestHeader("formKey", local("g", "formKey"));
- $.xhrPool.push(request);
- },
- complete: function (jqXHR) {
- var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
- if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
- },
- data: JSON.stringify(data),
- contentType: "application/json",
- });
- default:
- console.warn("Organizr API: Method Not Supported");
- }
- }
- function loadSettingsPage2(api, element, organizrFn) {
- $(element).html(
- '<h2 class="col-lg-12 m-t-0 text-center well bg-org"><i class="fa fa-spin fa-refresh"></i><br> <span lang="en">Loading</span></h2><div class="clearfix"></div>'
- );
- organizrAPI2("get", api)
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- organizrConsole("Organizr Function", "Loading " + organizrFn);
- $(element).html(response.data);
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function loadInternal(id, split = null) {
- let extra = split ? "right-" : "";
- let tabInfo = findTab(id);
- if (!tabInfo) {
- organizrConsole("Load Internal", "No Tab Info Found... Id: " + id, "error");
- return false;
- }
- let url = tabInfo.access_url;
- organizrAPI2("get", url)
- .success(function (data) {
- try {
- var html = data.response;
- $("#internal-" + extra + id).html(html.data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function loadInternalOriginal(url, tabName) {
- organizrAPI("get", url)
- .success(function (data) {
- try {
- var html = JSON.parse(data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- $("#internal-" + tabName).html(html.data);
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function loadSettingsPage(api, element, organizrFn) {
- organizrAPI("get", api)
- .success(function (data) {
- try {
- var response = JSON.parse(data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- organizrConsole("Organizr Function", "Loading " + organizrFn);
- $(element).html(response.data);
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function settingsAPI(post, callbacks = null, asyncValue = true) {
- organizrAPI("POST", post.api, post, asyncValue)
- .success(function (data) {
- try {
- var response = JSON.parse(data);
- } catch (e) {
- organizrCatchError(e, data);
- }
- message(
- post.messageTitle,
- post.messageBody,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- if (callbacks) {
- callbacks.fire();
- }
- })
- .fail(function (xhr) {
- console.error(post.error);
- });
- }
- function organizrAPI(type, path, data = null, asyncValue = true) {
- var timeout = 10000;
- switch (path) {
- case "api/?v1/windows/update":
- case "api/?v1/docker/update":
- timeout = 120000;
- break;
- default:
- timeout = 60000;
- }
- switch (type) {
- case "get":
- case "GET":
- case "g":
- return $.ajax({
- url: path,
- method: "GET",
- beforeSend: function (request) {
- request.setRequestHeader("Token", activeInfo.token);
- request.setRequestHeader("formKey", local("g", "formKey"));
- },
- timeout: timeout,
- });
- case "post":
- case "POST":
- case "p":
- data.formKey = local("g", "formKey");
- return $.ajax({
- url: path,
- method: "POST",
- async: asyncValue,
- beforeSend: function (request) {
- request.setRequestHeader("Token", activeInfo.token);
- request.setRequestHeader("formKey", local("g", "formKey"));
- },
- data: {
- data: data,
- },
- });
- default:
- console.warn("Organizr API: Method Not Supported");
- }
- }
- function githubVersions() {
- return $.ajax({
- url:
- "https://raw.githubusercontent.com/causefx/Organizr/" +
- activeInfo.branch +
- "/js/version.json",
- });
- }
- function sponsorsJSON() {
- return $.ajax({
- url: "https://raw.githubusercontent.com/causefx/Organizr/v2-develop/js/sponsors.json",
- });
- }
- function newsJSON() {
- return $.ajax({
- url: "https://raw.githubusercontent.com/causefx/Organizr/v2-develop/js/news.json",
- });
- }
- function getLatestCommitJSON() {
- return $.ajax({
- url:
- "https://api.github.com/repos/causefx/Organizr/commits/" +
- activeInfo.branch,
- });
- }
- function marketplaceJSON(type) {
- return $.ajax({
- url:
- "https://raw.githubusercontent.com/causefx/Organizr/v2-" +
- type +
- "/" +
- type +
- ".json",
- });
- }
- function allIcons() {
- return $.ajax({
- url: "js/icons.json",
- });
- }
- function organizrConnect(path) {
- return $.ajax({
- url: path,
- });
- }
- function changeSettingsMenu(path) {
- var menuItems = path.split("::");
- var menu = "";
- if (Array.isArray(menuItems)) {
- $.each(menuItems, function (i, v) {
- menu += '<li><a lang="en">' + v + "</a></li>";
- });
- }
- $("#settingsBreadcrumb").html(menu);
- }
- function buildWizard() {
- organizrAPI2("GET", "api/v2/page/wizard")
- .success(function (data) {
- try {
- var json = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- organizrConsole("Organizr Function", "Starting Install Wizard");
- $(json.data).appendTo($(".organizr-area"));
- $(".organizr-area").removeClass("hidden");
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Wiizard Error");
- });
- $("#preloader").fadeOut();
- }
- function buildDependencyCheck(orgdata) {
- organizrAPI2("GET", "api/v2/page/dependencies")
- .success(function (data) {
- try {
- var json = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- organizrConsole("Organizr Function", "Starting Dependencies Check");
- $(json.data).appendTo($(".organizr-area"));
- $(".organizr-area").removeClass("hidden");
- $(buildBrowserInfo()).appendTo($("#browser-info"));
- $("#web-folder").html(buildWebFolder(orgdata));
- $("#php-version-check").html(buildPHPCheck(orgdata));
- $(buildDependencyInfo(orgdata)).appendTo($("#depenency-info"));
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Dependency Error");
- });
- $("#preloader").fadeOut();
- }
- function buildDependencyInfo(arrayItems) {
- let listing = "";
- $.each(arrayItems.data.status.dependenciesActive, function (i, v) {
- listing +=
- '<li class="depenency-item" data-name="' +
- v +
- '"><a href="javascript:void(0)"><i class="fa fa-check text-success"></i> ' +
- v +
- "</a></li>";
- });
- $.each(arrayItems.data.status.dependenciesInactive, function (i, v) {
- listing +=
- '<li class="depenency-item" data-name="' +
- v +
- '"><a href="javascript:void(0)"><i class="fa fa-close text-danger"><div class="notify"><span class="heartbit depend-heartbit"></span></div></i> ' +
- v +
- "</a></li>";
- });
- let className =
- arrayItems.data.status.dependenciesInactive.length !== 0
- ? "bg-danger text-warning"
- : "bg-primary";
- let icon =
- arrayItems.data.status.dependenciesInactive.length !== 0
- ? "fa fa-exclamation-triangle"
- : "fa fa-check-circle"; //dependency-dependencies-check-listing-header
- let header =
- arrayItems.data.status.dependenciesInactive.length !== 0
- ? "panel-danger"
- : "panel-info";
- let listingIcon =
- arrayItems.data.status.dependenciesInactive.length !== 0
- ? "ti-alert"
- : "ti-check-box";
- let listingText =
- arrayItems.data.status.dependenciesInactive.length !== 0
- ? "Dependencies Missing"
- : "Dependencies OK";
- $(".dependency-dependencies-check-listing-header")
- .removeClass("panel-danger")
- .addClass(header);
- $(".dependency-dependencies-check-listing i")
- .first()
- .removeClass("ti-alert")
- .addClass(listingIcon);
- $(".dependency-dependencies-check-listing span").text(listingText);
- $(".dependency-dependencies-check")
- .removeClass("bg-warning")
- .addClass(className);
- $(".dependency-dependencies-check i")
- .removeClass("fa fa-spin fa-spinner")
- .addClass(icon);
- return listing;
- }
- function buildWebFolder(arrayItems) {
- let writable = "Not Writable - Please fix permissions";
- let className = "bg-danger text-warning";
- let icon = "fa fa-exclamation-triangle";
- if (arrayItems.data.status.writable == "yes") {
- writable = "Writable - All Good";
- className = "bg-primary";
- icon = "fa fa-check-circle";
- }
- $(".dependency-permissions-check")
- .removeClass("bg-warning")
- .addClass(className);
- $(".dependency-permissions-check i")
- .removeClass("fa fa-spin fa-spinner")
- .addClass(icon);
- $("#web-folder").addClass(className);
- return writable;
- }
- function buildPHPCheck(arrayItems) {
- let phpTest = "Upgrade PHP Version to 7.2+";
- let className = "bg-danger text-warning";
- let icon = "fa fa-exclamation-triangle";
- if (arrayItems.data.status.minVersion == "yes") {
- phpTest = "PHP Version Approved";
- className = "bg-primary";
- icon = "fa fa-check-circle";
- }
- $(".dependency-phpversion-check")
- .removeClass("bg-warning")
- .addClass(className);
- $(".dependency-phpversion-check i")
- .removeClass("fa fa-spin fa-spinner")
- .addClass(icon);
- $("#php-version-check").addClass(className);
- $("#php-version-check-user").html(
- '<span lang="en">Webserver User</span>: ' + arrayItems.data.status.php_user
- );
- return phpTest;
- }
- function buildBrowserInfo() {
- var listing = "";
- $.each(activeInfo, function (i, v) {
- listing +=
- `
- <tr>
- <td>` +
- i +
- `</td>
- <td>` +
- tof(v) +
- `</td>
- </tr>
- `;
- });
- return (
- `
- <table class="table table-hover">
- <tbody>
- ` +
- listing +
- `
- </tbody>
- </table>
- `
- );
- }
- function tof(string, type) {
- var result;
- if (
- typeof string == "undefined" ||
- string == "false" ||
- string == false ||
- string == null ||
- string == 0 ||
- string == "off" ||
- string == "no"
- ) {
- result = "0";
- } else if (
- string == "true" ||
- string == true ||
- string == 1 ||
- string == "on" ||
- string == "yes"
- ) {
- result = "1";
- }
- switch (type) {
- case "bool":
- case "b":
- return result == "0" ? false : result == "1" ? true : string;
- case "switch":
- case "s":
- return result == "0" ? "off" : result == "1" ? "on" : string;
- case "checkbox":
- case "c":
- return result == "0" ? "" : result == "1" ? "checked" : string;
- case "integer":
- case "number":
- case "i":
- case "n":
- return result == "0" ? 0 : result == "1" ? 1 : string;
- case "question":
- case "q":
- return result == "0" ? "yes" : result == "1" ? "no" : string;
- case "string":
- return string.toString();
- default:
- return result == "0" ? "false" : result == "1" ? "true" : string;
- }
- }
- function createRandomString(length) {
- var str = "";
- for (; str.length < length; str += Math.random().toString(36).substr(2));
- return str.substr(0, length);
- }
- function generateAPI() {
- var string = createRandomString(20);
- $("#form-api").focus();
- $("#form-api").val(string);
- $("#form-api").focusout();
- $("#verify-api").text(string);
- $("#form-username").focus();
- }
- function getCookie(cname) {
- var name = cname + "=";
- var decodedCookie = decodeURIComponent(document.cookie);
- var ca = decodedCookie.split(";");
- for (var i = 0; i < ca.length; i++) {
- var c = ca[i];
- while (c.charAt(0) == " ") {
- c = c.substring(1);
- }
- if (c.indexOf(name) == 0) {
- return c.substring(name.length, c.length);
- }
- }
- return "";
- }
- function localStorageSupport() {
- return "localStorage" in window && window["localStorage"] !== null;
- }
- function local(type, key, value = null) {
- if (localStorageSupport) {
- switch (type) {
- case "set":
- case "s":
- localStorage.setItem(key, value);
- break;
- case "get":
- case "g":
- return localStorage.getItem(key);
- case "remove":
- case "r":
- localStorage.removeItem(key);
- break;
- default:
- console.warn("Organizr Function: localStorage action not defined");
- }
- }
- }
- function language(language) {
- var language = language.split("-");
- return language[0];
- }
- function logIcon(type, label = false) {
- type = type.toLowerCase();
- let info = { color: "info", icon: "fa fa-check" };
- switch (type) {
- case "success":
- info.color = "info";
- info.icon = "fa fa-check";
- break;
- case "info":
- info.color = "info";
- info.icon = "mdi mdi-information";
- break;
- case "notice":
- info.color = "inverse";
- info.icon = "mdi mdi-information-variant";
- break;
- case "debug":
- info.color = "primary";
- info.icon = "mdi mdi-code-tags-check";
- break;
- case "warning":
- info.color = "warning";
- info.icon = "mdi mdi-alert-box";
- break;
- case "error":
- info.color = "danger";
- info.icon = "mdi mdi-alert-outline";
- break;
- case "critical":
- info.color = "danger";
- info.icon = "mdi mdi-alert";
- break;
- case "alert":
- info.color = "danger";
- info.icon = "mdi mdi-alert-octagon";
- break;
- case "emergency":
- info.color = "danger";
- info.icon = "mdi mdi-alert-octagram";
- break;
- default:
- info = { color: "info", icon: "fa fa-check" };
- break;
- }
- if (label) {
- return (
- '<span class="label label-' +
- info.color +
- ' log-label"> <i class="fa ' +
- info.icon +
- ' m-l-5 fa-fw"></i> <span lang="en" class="text-uppercase">' +
- type +
- "</span></span>"
- );
- } else {
- return (
- '<button class="btn btn-xs btn-' +
- info.color +
- ' log-label no-mouse" type="button"><span class="btn-label pull-left"><i class="' +
- info.icon +
- ' fa-fw"></i></span><span class="text-uppercase" lang="en">' +
- type +
- "</span></button>"
- );
- }
- }
- function toggleKillOrganizrLiveUpdate(interval = 5000) {
- if ($(".organizr-log-live-update").hasClass("kill-organizr-log")) {
- clearTimeout(timeouts["organizr-log"]);
- $(".organizr-log-live-update i").toggleClass(
- "fa-dot-circle-o animated loop-animation swing"
- );
- $(".organizr-log-live-update").toggleClass("kill-organizr-log");
- } else {
- $(".organizr-log-live-update").toggleClass("kill-organizr-log");
- organizrLogLiveUpdate(interval);
- }
- }
- function organizrLogLiveUpdate(interval = 5000) {
- var timeout = interval;
- let timeoutTitle = "organizr-log";
- $(".organizr-log-live-update i").toggleClass(
- "fa-dot-circle-o animated loop-animation swing"
- );
- organizrLogTable.ajax.reload(null, false);
- setTimeout(function () {
- if ($(".organizr-log-live-update").hasClass("kill-organizr-log")) {
- $(".organizr-log-live-update i").toggleClass(
- "fa-dot-circle-o animated loop-animation swing"
- );
- }
- }, interval - 500);
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- organizrLogLiveUpdate(timeout);
- }, timeout);
- delete timeout;
- }
- function radioLoop(element) {
- $('[type=radio][id!="' + element.id + '"]').each(function () {
- this.checked = false;
- });
- }
- function loadAppearance(appearance) {
- var cssSettings = "";
- document.title = appearance.title;
- if (appearance.useLogo === false) {
- $("#main-logo").html(appearance.title);
- $("#side-logo").html(appearance.title);
- } else {
- $("#main-logo").html(
- '<img alt="home" class="dark-logo" src="' + appearance.logo + '">'
- );
- $("#side-logo").html(
- '<img alt="home" class="dark-logo-side" src="' + appearance.logo + '">'
- );
- }
- if (appearance.headerColor !== "") {
- cssSettings +=
- `
- .navbar-header{
- background: ` +
- appearance.headerColor +
- `;
- }
- `;
- }
- if (appearance.headerTextColor !== "") {
- cssSettings +=
- `
- .navbar-top-links > li > a {
- color: ` +
- appearance.headerTextColor +
- `;
- }
- `;
- }
- if (appearance.sidebarColor !== "") {
- cssSettings +=
- `
- .sidebar, .sidebar .sidebar-head{
- background: ` +
- appearance.sidebarColor +
- `;
- }
- `;
- }
- if (appearance.sidebarTextColor !== "") {
- cssSettings +=
- `
- #side-menu li a,
- .sidebar .sidebar-head h3,
- #side-menu > li > a.active, #side-menu > li > ul > li > a.active
- {
- color: ` +
- appearance.sidebarTextColor +
- `;
- }
- `;
- }
- if (appearance.accentColor !== "") {
- cssSettings +=
- `
- .bg-info,
- .fc-toolbar,
- .progress-bar-info,
- .label-info,
- .tabs-style-iconbox nav ul li.tab-current a,
- .swapLog.active {
- background-color: ` +
- appearance.accentColor +
- ` !important;
- }
- .panel-blue .panel-heading, .panel-info .panel-heading {
- border-color: ` +
- appearance.accentColor +
- `;
- }
- .tabs-style-iconbox nav ul li.tab-current a::after {
- border-top-color: ` +
- appearance.accentColor +
- `;
- }
- .customvtab .tabs-vertical li.active a,
- .customvtab .tabs-vertical li.active a:focus,
- .customvtab .tabs-vertical li.active a:hover {
- border-right: 2px solid ` +
- appearance.accentColor +
- `;
- }
- .text-info,
- .btn-link, a {
- color: ` +
- appearance.accentColor +
- `;
- }
- `;
- }
- if (appearance.accentTextColor !== "") {
- cssSettings +=
- `
- .bg-info,
- .progress-bar,
- .panel-default .panel-heading,
- .mailbox-widget .customtab li.active a, .mailbox-widget .customtab li.active, .mailbox-widget .customtab li.active a:focus,
- .mailbox-widget .customtab li a,
- .tabs-style-iconbox nav ul li.tab-current a
- .swapLog.active {
- color: ` +
- appearance.accentTextColor +
- `;
- }
- `;
- }
- if (appearance.buttonColor !== "") {
- cssSettings +=
- `
- .btn-info, .btn-info.disabled,
- .btn,
- .paginate_button.current,
- .paginate_button:hover {
- background: ` +
- appearance.buttonColor +
- ` !important;
- border: 1px solid ` +
- appearance.buttonColor +
- ` !important;
- }
- `;
- }
- if (appearance.buttonTextColor !== "") {
- cssSettings +=
- `
- .btn-info, .btn-info.disabled,
- .btn
- .paginate_button.current
- .paginate_button:hover {
- color: ` +
- appearance.buttonTextColor +
- ` !important;
- }
- `;
- }
- if (appearance.loginWallpaper !== "" || appearance.randomMediaImage) {
- if (appearance.randomMediaImage) {
- appearance.loginWallpaper = appearance.randomMediaImage;
- }
- cssSettings +=
- `
- .login-register {
- background: url(` +
- randomCSV(appearance.loginWallpaper) +
- `) center center/cover no-repeat!important;
- height: 100%;
- position: fixed;
- }
- .lock-screen {
- background: url(` +
- randomCSV(appearance.loginWallpaper) +
- `) center center/cover no-repeat!important;
- height: 100%;
- position: fixed;
- z-index: 1001;
- top: 0;
- width: 100%;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- -o-user-select: none;
- user-select: none;
- }
- `;
- }
- if (activeInfo["settings"]["misc"]["autoExpandNavBar"] == false) {
- cssSettings += `
- @media only screen and (min-width: 768px) {
- .sidebar:hover .hide-menu {
- display: none;
- }
- .sidebar:hover .sidebar-head,
- .sidebar:hover {
- width: 60px;
- }
- .sidebar:hover .nav-second-level li a {
- padding-left: 15px;
- }
- }
- `;
- }
- if (cssSettings !== "") {
- $("#user-appearance").html(cssSettings);
- }
- if (appearance.customThemeCss !== "") {
- $("#custom-theme-css").html(appearance.customThemeCss);
- }
- if (appearance.customCss !== "") {
- $("#custom-css").html(appearance.customCss);
- }
- }
- function resetCustomColors() {
- let colors = [
- "headerColor",
- "headerTextColor",
- "sidebarColor",
- "sidebarTextColor",
- "accentColor",
- "accentTextColor",
- "buttonColor",
- "buttonTextColor",
- ];
- $.each(colors, function (i, v) {
- $("#customize-appearance-form [name=" + v + "]")
- .val("")
- .trigger("change");
- });
- messageSingle(
- window.lang.translate("Colors Reverted"),
- window.lang.translate("Please Save"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "10000"
- );
- }
- function randomCSV(values) {
- if (typeof values == "string") {
- if (values.includes(",")) {
- var csv = values.split(",");
- var luckyNumber = Math.floor(Math.random() * csv.length);
- return csv[luckyNumber];
- } else {
- return values;
- }
- }
- return false;
- }
- function loadCustomJava(appearance) {
- if (appearance.customThemeJava !== "") {
- $("#custom-theme-javascript").html(appearance.customThemeJava);
- }
- if (appearance.customJava !== "") {
- $("#custom-javascript").html(appearance.customJava);
- }
- }
- function clearForm(form) {
- $(form + " input[type=text]").each(function () {
- $(this).val("");
- });
- $(form + " input[type=password]").each(function () {
- $(this).val("");
- });
- }
- function checkMessage() {
- var check = local("get", "message") ? local("get", "message") : false;
- if (check) {
- local("remove", "message");
- var message = check.split("|");
- messageSingle(
- window.lang.translate(message[0]),
- window.lang.translate(message[1]),
- activeInfo.settings.notifications.position,
- "#FFF",
- message[2],
- "10000"
- );
- }
- }
- function setError(error) {
- local("set", "error", error);
- var url = window.location.href.split("?")[0];
- url = url.split("#")[0];
- window.location.href = url + "?error";
- }
- function buildErrorPage(error) {
- var description = "";
- var message = "";
- var color = "";
- switch (error) {
- case "401":
- description = "Unauthorized";
- message = "Look, you dont belong here";
- color = "danger";
- break;
- case "404":
- description = "Not Found";
- message = "I think I lost it...";
- color = "primary";
- break;
- default:
- description = "Something happened";
- message = "But I dont know what";
- color = "muted";
- }
- return (
- `
- <div class="error-box">
- <div class="error-body text-center">
- <h1 class="text-` +
- color +
- `">` +
- error +
- `</h1>
- <h3 class="text-uppercase">` +
- description +
- `</h3>
- <p class="text-muted m-t-30 m-b-30" lang="en">` +
- message +
- `</p>
- <a href="javascript:void(0);" class="btn btn-` +
- color +
- ` btn-rounded waves-effect waves-light m-b-40 closeErrorPage animated tada loop-animation" lang="en">OK</a>
- </div>
- </div>
- `
- );
- }
- $.urlParam = function (name) {
- var results = new RegExp("[?&]" + name + "=([^&#]*)").exec(
- window.location.href
- );
- if (results == null) {
- return null;
- } else {
- return decodeURI(results[1]) || 0;
- }
- };
- function errorPage(error = null, uri = null) {
- if (error) {
- local("set", "error", error);
- }
- if (uri) {
- local("set", "uri", uri);
- }
- //var urlParams = new URLSearchParams(window.location.search);
- if ($.urlParam("error") !== null && !isNaN(Number($.urlParam("error")))) {
- local("set", "error", $.urlParam("error"));
- }
- if ($.urlParam("return") !== null && activeInfo.user.loggedin !== true) {
- local("set", "uri", $.urlParam("return"));
- }
- if (window.location !== window.parent.location) {
- var count = 0;
- for (var k in window.parent.location) {
- if (window.parent.location.hasOwnProperty(k)) {
- ++count;
- }
- }
- if (count == 0 || count == "undefined") {
- return false;
- }
- var iframeError = local("get", "error");
- parent.errorPage(iframeError);
- local("remove", "uri");
- $("html").html("");
- return false;
- }
- if (local("get", "error")) {
- //show error page
- $(".error-page").html(buildErrorPage(local("get", "error")));
- $(".error-page").fadeIn();
- local("remove", "error");
- window.history.pushState({}, document.title, "./");
- }
- }
- function uriRedirect(uri = null) {
- if (uri) {
- local("set", "uri", uri);
- }
- if (activeInfo.user.loggedin === true && activeInfo.user.locked !== 1) {
- var redirect = local("get", "uri");
- local("remove", "uri");
- if (redirect !== null) {
- window.location.href = decodeURIComponent(decodeURI(redirect));
- }
- }
- }
- function changeTheme(theme) {
- //$("#preloader").fadeIn();
- $("#theme").attr({
- href: theme + ".css?v=" + activeInfo.version,
- });
- //$("#preloader").fadeOut();
- console.info(
- "%c Theme %c ".concat(theme, " "),
- "color: white; background: #AD80FD; font-weight: 700;",
- "color: #AD80FD; background: white; font-weight: 700;"
- );
- }
- function changeStyle(style) {
- //$("#preloader").fadeIn();
- $("#style").attr({
- href: "css/" + style + ".min.css?v=" + activeInfo.version,
- });
- //$("#preloader").fadeOut();
- console.info(
- "%c Style %c ".concat(style, " "),
- "color: white; background: #AD80FD; font-weight: 700;",
- "color: #AD80FD; background: white; font-weight: 700;"
- );
- }
- function setSSO() {
- $.each(activeInfo.sso, function (i, v) {
- if (v !== false) {
- local("set", i, v);
- } else {
- local("r", i);
- }
- });
- // other items to remove
- $.each(localStorage, function (i, v) {
- if (typeof v == "string") {
- if (i.startsWith("user-")) {
- if (typeof activeInfo.sso[i] == "undefined") {
- local("r", i);
- }
- }
- }
- });
- }
- function buildStreamItem(array, source) {
- var cards = "";
- var count = 0;
- var total = array.length;
- var sourceIcon = source === "jellyfin" ? "fish" : source;
- var streamDetails = {
- direct: 0,
- transcode: 0,
- };
- var bandwidthDetails = {
- wan: 0,
- lan: 0,
- };
- cards += '<div class="flexbox">';
- $.each(array, function (i, v) {
- var icon = "";
- var width = 100;
- var bg = "";
- count++;
- v.nowPlayingImageURL = v.useImage ? v.useImage : v.nowPlayingImageURL;
- switch (v.type) {
- case "music":
- icon = "icon-music-tone-alt";
- width =
- v.nowPlayingImageURL !== "plugins/images/homepage/no-np.png"
- ? 56
- : 100;
- bg =
- v.nowPlayingImageURL !== "plugins/images/homepage/no-np.png"
- ? `
- <img class="imageSource imageSourceLeft" src="` +
- v.nowPlayingImageURL +
- `">
- <img class="imageSource imageSourceRight" src="` +
- v.nowPlayingImageURL +
- `">
- `
- : "";
- break;
- case "movie":
- icon = "icon-film";
- break;
- case "tv":
- icon = "icon-screen-desktop";
- break;
- case "video":
- icon = "icon-screen-film";
- break;
- default:
- }
- var userThumb = v.userThumb
- ? '<img src="' + v.userThumb + '" class="nowPlayingUserThumb" alt="User">'
- : "";
- if (v.sessionType == "Direct Playing") {
- var userStream = "Direct Play";
- var userVideo = "Direct Play";
- var userAudio = "Direct Play";
- streamDetails["direct"] = streamDetails["direct"] + 1;
- } else {
- var userStream = v.userStream.stream;
- var userVideo =
- v.userStream.videoDecision +
- " (" +
- v.userStream.sourceVideoCodec +
- ' <i class="mdi mdi-ray-start-arrow"></i> ' +
- v.userStream.videoCodec +
- " " +
- v.userStream.videoResolution +
- ")";
- var userAudio =
- v.userStream.audioDecision +
- " (" +
- v.userStream.sourceAudioCodec +
- ' <i class="mdi mdi-ray-start-arrow"></i> ' +
- v.userStream.audioCodec +
- ")";
- streamDetails["transcode"] = streamDetails["transcode"] + 1;
- }
- var streamInfo = "";
- streamInfo +=
- `<div class="text-muted m-t-20 text-uppercase"><span class="text-uppercase"><i class="mdi mdi-play-circle-outline"></i> Stream: ` +
- userStream +
- `</span></div>`;
- streamInfo += v.userStream.videoResolution
- ? `<div class="text-muted m-t-20 text-uppercase"><span class="text-uppercase"><i class="mdi mdi-video"></i> Video: ` +
- userVideo +
- `</span></div>`
- : "";
- streamInfo +=
- `<div class="text-muted m-t-20 text-uppercase"><span class="text-uppercase"><i class="mdi mdi-speaker"></i> Audio: ` +
- userAudio +
- `</span></div>`;
- v.session = v.session.replace(/[\W_]+/g, "-");
- bandwidthDetails[v.bandwidthType] =
- bandwidthDetails[v.bandwidthType] + parseFloat(v.bandwidth);
- cards +=
- `
- <div class="col-xl-2 col-lg-3 col-md-4 col-sm-6 col-xs-12 nowPlayingItem">
- <div class="white-box">
- <div class="el-card-item p-b-10">
- <div class="el-card-avatar el-overlay-1 m-b-0">` +
- bg +
- `<img class="imageSource" style="width:` +
- width +
- `%;margin-left: auto;margin-right: auto;" src="` +
- v.nowPlayingImageURL +
- `">
- <div class="el-overlay">
- <ul class="el-info p-t-20 m-t-20">
- <li><a class="btn b-none inline-popups" href="#` +
- v.session +
- `" data-effect="mfp-zoom-out"><i class="mdi mdi-server-network mdi-24px"></i></a></li>
- <li><a class="btn b-none metadata-get" data-source="` +
- source +
- `" data-key="` +
- v.metadataKey +
- `" data-uid="` +
- v.uid +
- `"><i class="mdi mdi-information mdi-24px"></i></a></li>
- <li><a class="btn b-none openTab" data-tab-name="` +
- v.tabName +
- `" data-type="` +
- v.type +
- `" data-open-tab="` +
- v.openTab +
- `" data-url="` +
- v.address +
- `" href="javascript:void(0);"><i class=" mdi mdi-` +
- sourceIcon +
- ` mdi-24px"></i></a></li>
- <li><a class="btn b-none refreshImage" data-type="nowPlaying" data-image="` +
- v.nowPlayingOriginalImage +
- `" href="javascript:void(0);"><i class="mdi mdi-refresh mdi-24px"></i></a></li>
- <a class="inline-popups ` +
- v.uid +
- ` hidden" href="#` +
- v.uid +
- `-metadata-div" data-effect="mfp-zoom-out"></a>
- </ul>
- </div>
- </div>
- <div class="el-card-content">
- <div class="progress">
- <div class="progress-bar progress-bar-info" style="width: ` +
- v.watched +
- `%;" role="progressbar"><span class="hidden">` +
- v.watched +
- `%</span></div>
- <div class="progress-bar progress-bar-inverse" style="width: ` +
- v.transcoded +
- `%;" role="progressbar"></div>
- </div>
- <h3 class="box-title pull-left p-l-10 elip" style="width:90%">` +
- v.nowPlayingTitle +
- `</h3>
- <h3 class="box-title pull-right vertical-middle" style="width:10%"><i class="icon-control-` +
- v.state +
- ` fa-fw text-info" style=""></i></h3>
- <div class="clearfix"></div>
- <small class="pull-left p-l-10 w-50 elip"><span class="pull-left"><i class="` +
- icon +
- ` fa-fw text-info"></i>` +
- v.nowPlayingBottom +
- `</span></small>
- <small class="pull-right p-r-10 w-50"><span class="pull-right"><span class="">` +
- v.user +
- ` <i class="icon-user"></i></span></span></small>
- <br>
- </div>
- </div>
- </div>
- </div>
- <div id="` +
- v.session +
- `" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-6 col-md-offset-3">
- <div class="white-box m-b-0 bg-info">
- <h3 class="text-white box-title m-b-0">` +
- v.sessionType +
- `<span class="pull-right"><i class="mdi mdi-network-upload"></i> ` +
- v.bandwidth +
- ` kbps <button type="button" class="btn bg-org btn-circle close-popup m-l-10"><i class="fa fa-times"></i> </button></span></h3>
- </div>
- <div class="white-box">
- <div class="row">
- <div class="p-l-20 p-r-20">
- <div class="pull-left">
- <span class="text-uppercase"><i class="mdi mdi-` +
- v.bandwidthType +
- `"></i> ` +
- v.bandwidthType +
- `</span>
- <span class="text-uppercase"><i class="mdi mdi-account-network"></i> ` +
- v.userAddress +
- `</span>
- ` +
- streamInfo +
- `
- <div class="text-muted m-t-20 text-uppercase"><span class="text-uppercase"><i class="mdi mdi-` +
- source +
- `"></i> Product: ` +
- v.userStream.product +
- `</span></div>
- <div class="text-muted m-t-20 text-uppercase"><span class="text-uppercase"><i class="mdi mdi-laptop-mac"></i> Device: ` +
- v.userStream.device +
- `</span></div>
- </div>
- <div data-label="` +
- v.watched +
- `%" class="css-bar css-bar-` +
- Math.ceil(v.watched / 5) * 5 +
- ` css-bar-lg m-b-0 css-bar-info pull-right">` +
- userThumb +
- `</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div id="` +
- v.uid +
- `-metadata-div" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-8 col-md-offset-2 ` +
- v.uid +
- `-metadata-info"></div>
- </div>
- `;
- });
- cards += "</div><!--end-->";
- cards += buildStreamTooltip(bandwidthDetails, streamDetails, source);
- return cards;
- }
- function buildStreamTooltip(bandwidth, streams, type) {
- var html = "";
- var streamText = "Streams: ";
- var bandwidthText = " | Bandwidth: ";
- var bandwidthTotal =
- parseFloat(bandwidth["wan"]) + parseFloat(bandwidth["lan"]);
- if (type !== "plex") {
- bandwidthText += (parseFloat(bandwidth["wan"]) / 1000).toFixed(1) + " Mbps";
- } else {
- bandwidthText += (parseFloat(bandwidthTotal) / 1000).toFixed(1) + " Mbps";
- if (bandwidth["wan"] !== 0) {
- bandwidthText +=
- " | WAN: " + (parseFloat(bandwidth["wan"]) / 1000).toFixed(1) + " Mbps";
- }
- if (bandwidth["lan"] !== 0) {
- bandwidthText +=
- " | LAN: " + (parseFloat(bandwidth["lan"]) / 1000).toFixed(1) + " Mbps";
- }
- }
- var spacer = "";
- if (streams["direct"] !== 0) {
- streamText += streams["direct"] + " Direct Play(s)";
- spacer = " & ";
- }
- if (streams["transcode"] !== 0) {
- streamText += spacer + streams["transcode"] + " Transcode(s)";
- }
- html +=
- '<span class="label label-info m-l-20 mouse" title="" data-toggle="tooltip" data-original-title="' +
- streamText +
- bandwidthText +
- '" data-placement="bottom"><i class="fa fa-info"></i></span>';
- return (
- `
- <script>$('.streamDetails-` +
- type +
- `').html('` +
- html +
- `');$('[data-toggle="tooltip"]').tooltip();</script>
- `
- );
- }
- function buildRecentItem(array, type, extra = null) {
- var items = "";
- $.each(array, function (i, v) {
- if (extra == null) {
- var className = "";
- var extraImg = "";
- switch (v.type) {
- case "music":
- className = "recent-cover recent-item recent-music";
- extraImg =
- '<img src="' +
- v.imageURL +
- '" class="imageSourceAlt imageSourceTop recent-cover"><img src="' +
- v.imageURL +
- '" class="imageSourceAlt imageSourceBottom recent-cover">';
- break;
- case "movie":
- className = "recent-poster recent-item recent-movie";
- break;
- case "tv":
- className = "recent-poster recent-item recent-tv";
- break;
- case "video":
- className = "recent-poster recent-item recent-video";
- break;
- default:
- }
- items +=
- `
- <div class="item lazyload ` +
- className +
- ` metadata-get mouse imageSource" data-source="` +
- type +
- `" data-key="` +
- v.metadataKey +
- `" data-uid="` +
- v.uid +
- `" data-src="` +
- v.imageURL +
- `">
- ` +
- extraImg +
- `
- <div class="hover-homepage-item">
- <span class="elip request-title-movie">
- <a class="text-white refreshImage" data-type="recent-item" data-image="` +
- v.originalImage +
- `" href="javascript:void(0);"><i class="mdi mdi-refresh mdi-24px"></i></a>
- </span>
- </div>
- <span class="elip recent-title">` +
- v.title +
- `<br/>` +
- v.secondaryTitle +
- `</span>
- <div id="` +
- v.uid +
- `-metadata-div" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-8 col-md-offset-2 ` +
- v.uid +
- `-metadata-info"></div>
- </div>
- </div>
- `;
- } else {
- items +=
- `
- <a class="inline-popups ` +
- v.uid +
- ` hidden" href="#` +
- v.uid +
- `-metadata-div" data-effect="mfp-zoom-out"></a>
- `;
- }
- });
- return items;
- }
- function buildPlaylistItem(array, type, extra = null) {
- var items = "";
- $.each(array, function (i, v) {
- if (i !== "title") {
- if (extra == null) {
- items +=
- `
- <div class="item lazyload recent-poster metadata-get mouse imageSource" data-source="` +
- type +
- `" data-key="` +
- v.metadataKey +
- `" data-uid="` +
- v.uid +
- `" data-src="` +
- v.imageURL +
- `">
- <div class="hover-homepage-item">
- <span class="elip request-title-movie">
- <a class="text-white refreshImage" data-type="recent-item" data-image="` +
- v.originalImage +
- `" href="javascript:void(0);"><i class="mdi mdi-refresh mdi-24px"></i></a>
- </span>
- </div>
- <span class="elip recent-title">` +
- v.title +
- `</span>
- <div id="` +
- v.uid +
- `-metadata-div" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-8 col-md-offset-2 ` +
- v.uid +
- `-metadata-info"></div>
- </div>
- </div>
- `;
- } else {
- items +=
- `
- <a class="inline-popups ` +
- v.uid +
- ` hidden" href="#` +
- v.uid +
- `-metadata-div" data-effect="mfp-zoom-out"></a>
- `;
- }
- }
- });
- return items;
- }
- function buildRequestAdminMenuItem(value, category, id, type) {
- var action = "";
- var text = "";
- var extra = "";
- switch (category) {
- case "approved":
- if (value) {
- //nada
- } else {
- action = "approve";
- text = "Approve";
- extra =
- `<li><a class="mouse" onclick="requestActions('` +
- id +
- `', 'deny', '` +
- type +
- `');" lang="en">Deny</a></li>`;
- }
- break;
- case "available":
- if (value) {
- action = "unavailable";
- text = "Mark as Unavailable";
- } else {
- action = "available";
- text = "Mark as Available";
- }
- break;
- default:
- }
- return action
- ? `<li><a class="mouse" onclick="requestActions('` +
- id +
- `', '` +
- action +
- `', '` +
- type +
- `');" lang="en">` +
- text +
- `</a></li>` +
- extra
- : "";
- }
- function buildRequestItem(array, extra = null) {
- var items = "";
- let service = activeInfo.settings.homepage.requests.service;
- $.each(array, function (i, v) {
- if (extra == null) {
- var approveID =
- v.type == "tv" && service === "ombi" ? v.id : v.request_id;
- var iconType = v.type == "tv" ? "fa-tv " : "fa-film";
- var badge = "";
- var badge2 = "";
- var bg = v.background.includes(".")
- ? v.background
- : "plugins/images/homepage/no-np.png";
- v.user =
- (activeInfo.settings.homepage.ombi.alias && service === "ombi") ||
- (activeInfo.settings.homepage.overseerr.enabled &&
- service === "overseerr")
- ? v.userAlias
- : v.user;
- //Set Status
- var status = v.approved
- ? '<span class="badge bg-org m-r-10" lang="en">Approved</span>'
- : '<span class="badge bg-danger m-r-10" lang="en">Unapproved</span>';
- status += v.available
- ? '<span class="badge bg-org m-r-10" lang="en">Available</span>'
- : '<span class="badge bg-danger m-r-10" lang="en">Unavailable</span>';
- status += v.denied
- ? '<span class="badge bg-danger m-r-10" lang="en">Denied</span>'
- : "";
- //Set Class
- var className = v.approved ? "request-approved" : "request-unapproved";
- className += v.available ? " request-available" : " request-unavailable";
- className += v.denied ? " request-denied" : " request-notdenied";
- //Set badge
- badge = v.approved ? "bg-info" : "bg-warning";
- badge = v.denied ? "bg-danger" : badge;
- badge2 = v.available ? "bg-success" : "bg-danger";
- //Is Admin?
- var adminFunctions =
- `<div class="btn-group m-r-10">
- <button aria-expanded="false" data-toggle="dropdown" class="btn btn-info btn-outline dropdown-toggle waves-effect waves-light" type="button"> <i class="fa fa-ellipsis-v m-r-5"></i> <span class="caret"></span></button>
- <ul role="menu" class="dropdown-menu">
- <li><h5 class="text-center" lang="en">Request Options</h5></li>
- <li class="divider"></li>
- ` +
- buildRequestAdminMenuItem(v.approved, "approved", approveID, v.type) +
- `
- ` +
- buildRequestAdminMenuItem(v.available, "available", approveID, v.type) +
- `
- <li><a class="mouse" onclick="requestActions('` +
- v.request_id +
- `', 'delete', '` +
- v.type +
- `');" lang="en">Delete</a></li>
- </ul>
- </div>`;
- adminFunctions = activeInfo.user.groupID <= 1 ? adminFunctions : "";
- var user =
- activeInfo.user.groupID <= 1
- ? '<span lang="en">Requested By:</span> ' + v.user
- : "";
- var user2 = activeInfo.user.groupID <= 1 ? "<br>" + v.user : "";
- var divId = v.type == "movie" ? v.request_id : v.id;
- items +=
- `
- <div class="item lazyload recent-poster request-item request-` +
- v.type +
- ` ` +
- className +
- ` request-` +
- divId +
- `-div mouse" data-target="request-` +
- v.id +
- `" data-src="` +
- v.poster +
- `">
- <div class="outside-request-div">
- <div class="inside-over-request-div ` +
- badge2 +
- `"></div>
- <div class="inside-request-div ` +
- badge +
- `"></div>
- </div>
- <div class="hover-homepage-item"></div>
- <span class="elip request-title-` +
- v.type +
- `"><i class="fa ` +
- iconType +
- `"></i></span>
- <span class="elip recent-title">` +
- v.title +
- user2 +
- `</span>
- <div id="request-` +
- v.id +
- `" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-8 col-md-offset-2">
- <div class="white-box m-b-0">
- <div class="user-bg lazyload" data-src="` +
- bg +
- `">
- <div class="col-xs-2 p-10">` +
- adminFunctions +
- `</div>
- <div class="col-xs-10">
- <h2 class="m-b-0 font-medium pull-right text-right">
- ` +
- v.title +
- `<button type="button" class="btn bg-org btn-circle close-popup m-l-10"><i class="fa fa-times"></i> </button><br>
- <small class="m-t-0 text-white">` +
- user +
- `</small><br>
- ` +
- buildYoutubeLink(v.title + " " + v.type) +
- `
- </h2>
- </div>
- <div class="genre-list p-10">` +
- status +
- `</div>
- </div>
- </div>
- <div class="panel panel-info p-b-0 p-t-0">
- <div class="panel-body p-b-0 p-t-0 m-b-0">
- <div class="p-20 text-center">
- <p class="">` +
- v.overview +
- `</p>
- </div>
- <div class="row">
- <div class="col-lg-12">
- <div class="owl-carousel owl-theme metadata-actors p-b-10"></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- } else {
- items +=
- `
- <a class="inline-popups hidden" id="link-request-` +
- v.id +
- `" href="#request-` +
- v.id +
- `" data-effect="mfp-zoom-out" ></a>
- `;
- }
- });
- return items !== "" || extra == null
- ? items
- : '<h2 class="text-center">No items</h2>';
- }
- function buildStream(array, type) {
- var streams =
- typeof array.content !== "undefined" ? array.content.length : false;
- var originalType = type;
- //type = (type === 'emby' && activeInfo.settings.homepage.media.jellyfin) ? 'jellyfin' : type;
- return streams
- ? `
- <div id="` +
- type +
- `Streams">
- <div class="el-element-overlay row">
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">Active</span> ` +
- toUpper(type) +
- ` <span lang="en">Streams</span> : </h4><h4 class="pull-left"> <span class="label label-info m-l-20 checkbox-circle mouse" onclick="homepageStream('` +
- originalType +
- `')">` +
- streams +
- `</span><span class="streamDetails-` +
- type +
- `"></span></h4>
- <hr class="hidden-xs">
- </div>
- <div class="clearfix"></div>
- <!-- .cards -->
- ` +
- buildStreamItem(array.content, type) +
- `
- <!-- /.cards-->
- </div>
- </div>
- <div class="clearfix"></div>
- `
- : "";
- }
- function buildRecent(array, type) {
- var recent = typeof array.content !== "undefined" ? true : false;
- array.content = recent ? Object.values(array.content) : false;
- var movie = recent
- ? array.content.filter((p) => p.type == "movie").length > 0
- ? true
- : false
- : false;
- var tv = recent
- ? array.content.filter((p) => p.type == "tv").length > 0
- ? true
- : false
- : false;
- var video = recent
- ? array.content.filter((p) => p.type == "video").length > 0
- ? true
- : false
- : false;
- var music = recent
- ? array.content.filter((p) => p.type == "music").length > 0
- ? true
- : false
- : false;
- var dropdown = "";
- var header = "";
- var headerAlt = "";
- var refreshType = type;
- //type = (type === 'emby' && activeInfo.settings.homepage.media.jellyfin) ? 'jellyfin' : type;
- dropdown +=
- recent && movie
- ? `<li><a data-filter="recent-movie" server-filter="` +
- type +
- `" href="javascript:void(0);">Movies</a></li>`
- : "";
- dropdown +=
- recent && tv
- ? `<li><a data-filter="recent-tv" server-filter="` +
- type +
- `" href="javascript:void(0);">Shows</a></li>`
- : "";
- dropdown +=
- recent && video
- ? `<li><a data-filter="recent-video" server-filter="` +
- type +
- `" href="javascript:void(0);">Videos</a></li>`
- : "";
- dropdown +=
- recent && music
- ? `<li><a data-filter="recent-music" server-filter="` +
- type +
- `" href="javascript:void(0);">Music</a></li>`
- : "";
- var dropdownMenu =
- `
- <div class="btn-group pull-right">
- <button type="button" class="btn btn-info waves-effect hidden-xs" onclick="owlChange('` +
- type +
- `-recent','previous');"><i class="fa fa-chevron-left"></i></button>
- <button type="button" class="btn btn-info waves-effect hidden-xs" onclick="owlChange('` +
- type +
- `-recent','next');"><i class="fa fa-chevron-right"></i></button>
- <button aria-expanded="false" data-toggle="dropdown" class="btn btn-info dropdown-toggle waves-effect waves-light" type="button">
- <i class="fa fa-filter m-r-5"></i><span class="caret"></span>
- </button>
- <ul role="menu" class="dropdown-menu recent-filter">
- <li><a data-filter="all" server-filter="` +
- type +
- `" href="javascript:void(0);">All</a></li>
- <li class="divider"></li>
- ` +
- dropdown +
- `
- </ul>
- </div>`;
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var headerAlt =
- `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span class="mouse" onclick="homepageRecent('` +
- type +
- `')" lang="en">Recently Added</span> : </h4><h4 class="pull-left"> </h4>
- ` +
- dropdownMenu +
- `
- <hr class="hidden-xs"><div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- `;
- } else {
- var header =
- `
- <div class="panel-heading bg-info p-t-10 p-b-10">
- <span onclick="homepageRecent('` +
- type +
- `')" class="pull-left m-t-5 mouse"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/` +
- type +
- `.png"> <span lang="en">Recently Added</span></span>
- ` +
- dropdownMenu +
- `
- <div class="clearfix"></div>
- </div>
- `;
- }
- return recent
- ? `
- <div id="` +
- type +
- `Recent" class="row">
- ` +
- headerAlt +
- `
- <div class="col-lg-12">
- <div class="panel panel-default">
- ` +
- header +
- `
- <div class="panel-wrapper p-b-0 collapse in">
- <div class="` +
- type +
- `-recent-hidden hidden"></div>
- <div class="owl-carousel owl-theme recent-items ` +
- type +
- `-recent">
- ` +
- buildRecentItem(array.content, type) +
- `
- </div>
- ` +
- buildRecentItem(array.content, type, true) +
- `
- </div>
- </div>
- </div>
- </div>
- `
- : "";
- }
- function owlChange(elm, action) {
- switch (action) {
- case "next":
- $("." + elm).trigger("next.owl");
- break;
- case "previous":
- $("." + elm).trigger("prev.owl");
- break;
- default:
- return false;
- }
- return false;
- }
- function cleanPlaylistTitle(string) {
- var test = string.split(".");
- if (test.length > 1) {
- if (!isNaN(test[0])) {
- return test[1];
- }
- }
- return string;
- }
- function buildPlaylist(array, type) {
- var playlist =
- typeof array.content !== "undefined"
- ? Object.keys(array.content).length
- : false;
- var dropdown = "";
- var first = "";
- var firstButton = "";
- var hidden = "";
- var count = 0;
- var items = "";
- var header = "";
- var headerAlt = "";
- if (playlist) {
- $.each(array.content, function (i, v) {
- v.title = cleanPlaylistTitle(v.title);
- count++;
- first = count == 1 ? v.title : first;
- firstButton = count == 1 ? i + "-playlist" : firstButton;
- hidden = count == 1 ? "" : " owl-hidden hidden";
- dropdown +=
- `<li><a data-filter="` +
- i +
- `" server-filter="` +
- type +
- `" data-title="` +
- encodeURI(v.title) +
- `" href="javascript:void(0);">` +
- v.title +
- `</a></li>`;
- items +=
- `
- <div class="owl-carousel owl-theme playlist-items ` +
- type +
- `-playlist ` +
- hidden +
- ` ` +
- i +
- `-playlist">
- ` +
- buildPlaylistItem(v, type) +
- `
- </div>
- ` +
- buildPlaylistItem(v, type, true) +
- `
- `;
- });
- var builtDropdown =
- `
- <button type="button" class="btn btn-info waves-effect hidden-xs playlist-previous" onclick="owlChange('` +
- firstButton +
- `','previous');"><i class="fa fa-chevron-left"></i></button>
- <button type="button" class="btn btn-info waves-effect hidden-xs playlist-next" onclick="owlChange('` +
- firstButton +
- `','next');"><i class="fa fa-chevron-right"></i></button>
- <button aria-expanded="false" data-toggle="dropdown" class="btn btn-info dropdown-toggle waves-effect waves-light" type="button">
- <i class="mdi mdi-playlist-play m-r-5 fa-lg"></i><span class="caret"></span>
- </button>
- <ul role="menu" class="dropdown-menu playlist-filter">
- ` +
- dropdown +
- `
- </ul>
- `;
- }
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var headerAlt =
- `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span onclick="homepagePlaylist('` +
- type +
- `')" class="` +
- type +
- `-playlistTitle mouse">` +
- first +
- `</span> : </h4><h4 class="pull-left"> </h4>
- <div class="btn-group pull-right">
- ` +
- builtDropdown +
- `
- </div>
- <hr class="hidden-xs"><div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- `;
- } else {
- var header =
- `
- <div class="panel-heading bg-info p-t-10 p-b-10">
- <span class="pull-left m-t-5 mouse homepage-element-title" onclick="homepagePlaylist('` +
- type +
- `')"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/` +
- type +
- `.png"> <span class="` +
- type +
- `-playlistTitle">` +
- first +
- `</span></span>
- <div class="btn-group pull-right">
- ` +
- builtDropdown +
- `
- </div>
- <div class="clearfix"></div>
- </div>
- `;
- }
- return playlist
- ? `
- <div id="` +
- type +
- `Playlist" class="row">
- ` +
- headerAlt +
- `
- <div class="col-lg-12">
- <div class="panel panel-default">
- ` +
- header +
- `
- <div class="panel-wrapper p-b-0 collapse in">
- ` +
- items +
- `
- </div>
- </div>
- </div>
- </div>
- `
- : "";
- }
- function buildRequest(service, div, array) {
- var requests = typeof array.content !== "undefined";
- var dropdown = "";
- var headerAlt = "";
- var header = "";
- var requestButton =
- activeInfo["settings"]["homepage"][service]["enabled"] === true
- ? `<button href="#new-request" id="newRequestButton" class="btn btn-info waves-effect waves-light inline-popups" data-effect="mfp-zoom-out"><i class="fa fa-search m-l-5"></i></button>`
- : "";
- if (requests) {
- var builtDropdown =
- `
- <button type="button" class="btn btn-info waves-effect hidden-xs" onclick="owlChange('request-items-${service}','previous');"><i class="fa fa-chevron-left"></i></button>
- <button type="button" class="btn btn-info waves-effect hidden-xs" onclick="owlChange('request-items-${service}','next');"><i class="fa fa-chevron-right"></i></button>
- <button aria-expanded="false" data-toggle="dropdown" class="btn btn-info dropdown-toggle waves-effect waves-light" type="button">
- <i class="fa fa-filter m-r-5"></i><span class="caret"></span>
- </button>
- ` +
- requestButton +
- `
- <div role="menu" class="dropdown-menu request-filter">
- <div class="checkbox checkbox-success m-l-20 checkbox-circle">
- <input id="request-filter-available-${service}" data-filter="request-available" class="filter-request-input" type="checkbox" checked="">
- <label for="request-filter-available-${service}"> <span lang="en">Available</span> </label>
- </div>
- <div class="checkbox checkbox-danger m-l-20 checkbox-circle">
- <input id="request-filter-unavailable-${service}" data-filter="request-unavailable" class="filter-request-input" type="checkbox" checked="">
- <label for="request-filter-unavailable-${service}"> <span lang="en">Unavailable</span> </label>
- </div>
- <div class="checkbox checkbox-info m-l-20 checkbox-circle">
- <input id="request-filter-approved-${service}" data-filter="request-approved" class="filter-request-input" type="checkbox" checked="">
- <label for="request-filter-approved-${service}"> <span lang="en">Approved</span> </label>
- </div>
- <div class="checkbox checkbox-warning m-l-20 checkbox-circle">
- <input id="request-filter-unapproved-${service}" data-filter="request-unapproved" class="filter-request-input" type="checkbox" checked="">
- <label for="request-filter-unapproved-${service}"> <span lang="en">Unapproved</span> </label>
- </div>
- <div class="checkbox checkbox-purple m-l-20 checkbox-circle">
- <input id="request-filter-denied-${service}" data-filter="request-denied" class="filter-request-input" type="checkbox" checked="">
- <label for="request-filter-denied-${service}"> <span lang="en">Denied</span> </label>
- </div>
- <div class="checkbox checkbox-inverse m-l-20 checkbox-circle">
- <input id="request-filter-movie-${service}" data-filter="request-movie" class="filter-request-input" type="checkbox" checked="">
- <label for="request-filter-movie-${service}"> <span lang="en">Movie</span> </label>
- </div>
- <div class="checkbox checkbox-inverse m-l-20 checkbox-circle">
- <input id="request-filter-tv-${service}" data-filter="request-tv" class="filter-request-input" type="checkbox" checked="">
- <label for="request-filter-tv-${service}"> <span lang="en">TV</span> </label>
- </div>
- </div>
- `;
- }
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var headerAlt =
- `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span class="mouse" onclick="homepageRequests('${service}')" lang="en">Requests</span> : </h4><h4 class="pull-left"> </h4>
- <div class="btn-group pull-right">
- ` +
- builtDropdown +
- `
- </div>
- <hr class="hidden-xs"><div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- `;
- } else {
- var header =
- `
- <div class="panel-heading bg-info p-t-10 p-b-10">
- <span class="pull-left m-t-5 mouse homepage-element-title" onclick="homepageRequests('${service}')"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/` +
- service +
- `.png"> <span lang="en">Requests</span></span>
- <div class="btn-group pull-right">
- ` +
- builtDropdown +
- `
- </div>
- <div class="clearfix"></div>
- </div>
- `;
- }
- return requests
- ? `
- <div id="${service}-requests" class="row">
- ` +
- headerAlt +
- `
- <div class="col-lg-12">
- <div class="panel panel-default">
- ` +
- header +
- `
- <div class="panel-wrapper p-b-0 collapse in">
- <div class="owl-carousel owl-theme request-items-` +
- service +
- `">
- ` +
- buildRequestItem(array.content) +
- `
- </div>
- ` +
- buildRequestItem(array.content, true) +
- `
- </div>
- </div>
- </div>
- </div>
- <div id="new-request" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-8 col-md-offset-2">
- <div class="white-box m-b-0 search-div resultBox-outside">
- <div class="form-group m-b-0">
- <div id="request-input-div" class="input-group">
- <input id="request-input" lang="en" placeholder="Request a Show or Movie" type="text" class="form-control inline-focus">
- <input id="request-page" type="hidden" class="form-control">
- <div class="input-group-btn">
- <button type="button" class="btn waves-effect waves-light btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false"><span lang="en">Suggestions</span> <span class="caret"></span></button>
- <ul class="dropdown-menu dropdown-menu-right">
- <li><a onclick="requestList('org-mod', 'movie');" href="javascript:void(0)" lang="en">Organizr Mod Picks</a></li>
- <li><a onclick="requestList('theatre-movie', 'movie');" href="javascript:void(0)" lang="en">In Theatres</a></li>
- <li><a onclick="requestList('top-movie', 'movie');" href="javascript:void(0)" lang="en">Top Movies</a></li>
- <li><a onclick="requestList('pop-movie', 'movie');" href="javascript:void(0)" lang="en">Popular Movies</a></li>
- <li><a onclick="requestList('up-movie', 'movie');" href="javascript:void(0)" lang="en">Upcoming Movies</a></li>
- <li><a onclick="requestList('top-tv', 'tv');" href="javascript:void(0)" lang="en">Top TV</a></li>
- <li><a onclick="requestList('pop-tv', 'tv');" href="javascript:void(0)" lang="en">Popular TV</a></li>
- <li><a onclick="requestList('today-tv', 'tv');" href="javascript:void(0)" lang="en">Airs Today TV</a></li>
- </ul>
- </div>
- </div>
- <div class="clearfix"></div>
- </div>
- <div id="request-results" class="row el-element-overlay resultBox-inside"></div>
- </div>
- </div>
- </div>
- `
- : "";
- }
- function pagination(c, m) {
- var current = c,
- last = m,
- delta = 2,
- left = current - delta,
- right = current + delta + 1,
- range = [],
- rangeWithDots = [],
- l;
- for (let i = 1; i <= last; i++) {
- if (i == 1 || i == last || (i >= left && i < right)) {
- range.push(i);
- }
- }
- for (let i of range) {
- if (l) {
- if (i - l === 2) {
- rangeWithDots.push(l + 1);
- } else if (i - l !== 1) {
- rangeWithDots.push("...");
- }
- }
- rangeWithDots.push(i);
- l = i;
- }
- return rangeWithDots;
- }
- function buildRequestResult(
- array,
- media_type = null,
- list = null,
- page = null,
- search = false
- ) {
- var comments = typeof array.comments !== "undefined" ? true : false;
- var comment = "";
- var results = ``;
- var buttons = ``;
- var next = ``;
- var tv = 0;
- var movie = 0;
- var total = 0;
- var totalPages = array.total_pages;
- var currentPage = page * 1;
- var pagePrevious = page * 1 - 1;
- var pageNext = page * 1 + 1;
- var pageFirst = 1;
- var pageLast = totalPages;
- var previousHidden = currentPage == 1 ? "disabled" : "";
- var nextHidden = currentPage == totalPages ? "disabled" : "";
- var pageList = "";
- let previousEnabled = pagePrevious !== 0;
- let nextEnabled = pageNext <= totalPages;
- if (array.results.length == 0) {
- return '<h2 class="text-center" lang="en">No Results</h2>';
- }
- $.each(array.results, function (i, v) {
- media_type = v.media_type ? v.media_type : media_type;
- if (media_type == "tv" || media_type == "movie") {
- total = total + 1;
- tv = media_type == "tv" ? tv + 1 : tv;
- movie = media_type == "movie" ? movie + 1 : movie;
- var bg =
- v.poster_path !== null
- ? `https://image.tmdb.org/t/p/w300/` + v.poster_path
- : "plugins/images/homepage/no-list.png";
- var top = v.title
- ? v.title
- : v.original_title
- ? v.original_title
- : v.original_name
- ? v.original_name
- : "";
- var bottom = v.release_date
- ? v.release_date
- : v.first_air_date
- ? v.first_air_date
- : "";
- if (comments) {
- if (array.comments[media_type + ":" + v.id] !== null) {
- comment = array.comments[media_type + ":" + v.id];
- }
- }
- results +=
- `
- <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12 m-t-20 request-result-item request-result-` +
- media_type +
- `">
- <div class="white-box m-b-10">
- <div class="el-card-item p-b-0">
- <div class="el-card-avatar el-overlay-1 m-b-5 preloader-` +
- v.id +
- `"> <img class="lazyload resultImages" data-src="` +
- bg +
- `">
- <div class="el-overlay">
- <span class="text-info p-a-5 font-normal">` +
- comment +
- `</span>
- <ul class="el-info">
- <li><a class="btn default btn-outline" href="javascript:void(0);" onclick="processRequest('` +
- v.id +
- `','` +
- media_type +
- `');"><i class="icon-link"></i> <span lang="en">Request</span></a></li>
- <li><a class="btn default btn-outline" href="https://www.themoviedb.org/` +
- media_type +
- `/` +
- v.id +
- `" target="_blank"><i class="icon-info"></i></a></li>
- </ul>
- </div>
- </div>
- <div class="el-card-content bg-org">
- <h3 class="box-title elip">` +
- top +
- `</h3> <small>` +
- bottom +
- `</small>
- <br>
- </div>
- </div>
- </div>
- </div>
- `;
- }
- comment = "";
- });
- if (list && page && search == false) {
- $.each(pagination(currentPage, totalPages), function (key, value) {
- var activePage = currentPage == value ? "active" : "";
- var disabled = value == "..." ? "disabled" : "";
- var pageLink =
- value == "..."
- ? ""
- : `onclick="requestList('` +
- list +
- `', '` +
- media_type +
- `', '` +
- value +
- `');"`;
- pageList +=
- '<li class="' +
- activePage +
- disabled +
- '"> <a ' +
- pageLink +
- ' href="javascript:void(0)">' +
- value +
- "</a> </li>";
- });
- let previousOnclick = previousEnabled
- ? `onclick="requestList('${list}', '${media_type}', '${pagePrevious}')";`
- : ``;
- let nextOnclick = nextEnabled
- ? `onclick="requestList('${list}', '${media_type}', '${pageNext}')";`
- : ``;
- next =
- `
- <div class="clearfix"></div>
- <div class="button-box text-center p-b-0">
- <ul class="pagination m-b-0">
- <li class="` +
- previousHidden +
- `"> <a href="javascript:void(0)" ${previousOnclick}><i class="fa fa-angle-left"></i></a> </li>
- ` +
- pageList +
- `
- <li class="` +
- nextHidden +
- `"> <a href="javascript:void(0)" ${nextOnclick}><i class="fa fa-angle-right"></i></a> </li>
- </ul>
- </div>
- `;
- }
- if (list && page && search == true) {
- $.each(pagination(currentPage, totalPages), function (key, value) {
- var activePage = currentPage == value ? "active" : "";
- var disabled = value == "..." ? "disabled" : "";
- var pageLink =
- value == "..."
- ? ""
- : `onclick="$('#request-page').val(` + value + `);doneTyping();"`;
- pageList +=
- '<li class="' +
- activePage +
- disabled +
- '"> <a ' +
- pageLink +
- ' href="javascript:void(0)">' +
- value +
- "</a> </li>";
- });
- next =
- `
- <div class="clearfix"></div>
- <div class="button-box text-center p-b-0">
- <ul class="pagination m-b-0">
- <li class="` +
- previousHidden +
- `"> <a href="javascript:void(0)" onclick="$('#request-page').val(` +
- pagePrevious +
- `);doneTyping();"><i class="fa fa-angle-left"></i></a> </li>
- ` +
- pageList +
- `
- <li class="` +
- nextHidden +
- `"> <a href="javascript:void(0)" onclick="$('#request-page').val(` +
- pageNext +
- `);doneTyping();"><i class="fa fa-angle-right"></i></a> </li>
- </ul>
- </div>
- `;
- }
- var buttons =
- `
- <div class="button-box p-20 text-center p-b-0">
- <button class="btn btn-inverse waves-effect waves-light filter-request-result" data-filter="request-result-all"><span>` +
- total +
- `</span> <i class="fa fa-th-large m-l-5 fa-fw"></i></button>
- <button class="btn btn-primary waves-effect waves-light filter-request-result" data-filter="request-result-movie"><span>` +
- movie +
- `</span> <i class="fa fa-film m-l-5 fa-fw"></i></button>
- <button class="btn btn-info waves-effect waves-light filter-request-result" data-filter="request-result-tv"><span>` +
- tv +
- `</span> <i class="fa fa-tv m-l-5 fa-fw"></i></button>
- </div>
- `;
- return buttons + next + results + next;
- }
- function buildRequestOverseerrSeasons(array) {
- var hasSeasons = typeof array.data.seasons !== "undefined";
- if (hasSeasons) {
- let seasons = array.data.seasons;
- let id = array.data.id;
- let SeasonItems = "";
- $.each(seasons, function (i, v) {
- if (v.seasonNumber !== 0) {
- SeasonItems += `
- <tr>
- <td><input type="checkbox" name="overseerr-season-${v.seasonNumber}" class="js-switch overseerr-season" data-seasonNumber="${v.seasonNumber}" data-color="#6164c1" data-size="small" /></td>
- <td>${v.name}</td>
- <td>${v.episodeCount}</td>
- </tr>
- `;
- }
- });
- let html = `
- <div class="panel">
- <div class="bg-org2">
- <div class="panel-heading">Choose Seasons</div>
- <div class="panel-wrapper collapse in text-left">
- <div class="table-responsive">
- <table class="table color-bordered-table primary-bordered-table">
- <thead>
- <tr>
- <th width="20"><input type="checkbox" class="js-switch select-all-overseerr-seasons" data-color="#6164c1" data-size="small" /></th>
- <th lang="en">Season</th>
- <th lang="en"># Of Episodes</th>
- </tr>
- </thead>
- <tbody>${SeasonItems}</tbody>
- </table>
- </div>
- <div class="pull-right p-b-20">
- <button class="fcbtn btn btn-info btn-outline btn-1c" lang="en" onclick="swal.close();">Cancel</button>
- <button class="fcbtn btn btn-success btn-outline btn-1c submit-overseerr-seasons" lang="en" data-seasons="[]" data-id="${id}" disabled onclick="processOverseerrSeasons(this)">Request Seasons</button>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(html),
- button: null,
- className: "bg-org",
- dangerMode: false,
- });
- }
- }
- function processOverseerrSeasons(el) {
- let seasons = $(el).attr("data-seasons");
- let id = $(el).attr("data-id");
- overseerrActions(id, "add", "tv", seasons);
- }
- function processRequest(id, type) {
- let service = activeInfo.settings.homepage.requests.service;
- switch (service) {
- case "ombi":
- requestActions(id, "add", type);
- return false;
- case "overseerr":
- if (
- type === "tv" &&
- activeInfo.settings.homepage.overseerr.userSelectTv === true
- ) {
- organizrAPI2(
- "GET",
- "api/v2/homepage/overseerr/metadata/" + type + "/" + id
- )
- .success(function (data) {
- try {
- let response = data.response;
- buildRequestOverseerrSeasons(response);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Overseerr Error");
- });
- } else {
- requestActions(id, "add", type);
- }
- return false;
- default:
- organizrConsole(
- "Request Function",
- "Service for Processing not setup",
- "error"
- );
- return false;
- }
- }
- function requestActions(id = null, action = null, type = null, extra = null) {
- let service = activeInfo.settings.homepage.requests.service;
- switch (service) {
- case "ombi":
- ombiActions(id, action, type, extra);
- break;
- case "overseerr":
- overseerrActions(id, action, type, extra);
- break;
- default:
- organizrConsole(
- "Request Function",
- "Service for Request not setup",
- "error"
- );
- return false;
- }
- }
- //Overseerr Actions
- function overseerrActions(id, action, type = null, extra = null) {
- ajaxloader(".request-" + id + "-div", "in");
- ajaxloader(".preloader-" + id, "in");
- //$.magnificPopup.close();
- messageSingle(
- window.lang.translate("Submitting Action to Overseerr"),
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "10000"
- );
- switch (action) {
- case "add":
- let seasons = extra !== null ? "/" + extra : "";
- var method = "POST";
- var apiUrl =
- "api/v2/homepage/overseerr/requests/" + type + "/" + id + seasons;
- var data = {};
- break;
- case "available":
- case "pending":
- case "unavailable":
- case "approve":
- var method = "POST";
- var apiUrl =
- "api/v2/homepage/overseerr/requests/" + type + "/" + id + "/" + action;
- var data = {};
- break;
- case "deny":
- var method = "PUT";
- var apiUrl =
- "api/v2/homepage/overseerr/requests/" + type + "/" + id + "/" + action;
- var data = {};
- break;
- case "delete":
- var method = "DELETE";
- var apiUrl = "api/v2/homepage/overseerr/requests/" + type + "/" + id;
- var data = {};
- break;
- default:
- return false;
- }
- organizrAPI2(method, apiUrl, data)
- .success(function (data) {
- try {
- let response = data.response;
- if (action == "add") {
- addTempRequest();
- setTimeout(function () {
- ajaxloader();
- }, 2000);
- }
- messageSingle(
- response.message,
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- homepageRequests("overseerr");
- cleanCloseSwal();
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- ajaxloader();
- OrganizrApiError(xhr, "Overseerr Error");
- });
- }
- //Ombi actions
- function ombiActions(id, action, type, extra = null) {
- var msg =
- activeInfo.user.groupID <= 1
- ? '<a href="https://github.com/tidusjar/Ombi/issues/2176" target="_blank">Not Org Fault - Ask Ombi</a>'
- : "Connection Error to Request Server";
- ajaxloader(".request-" + id + "-div", "in");
- ajaxloader(".preloader-" + id, "in");
- //$.magnificPopup.close();
- messageSingle(
- window.lang.translate("Submitting Action to Ombi"),
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "10000"
- );
- switch (action) {
- case "add":
- var method = "POST";
- var apiUrl = "api/v2/homepage/ombi/requests/" + type + "/" + id;
- var data = {};
- break;
- case "available":
- case "unavailable":
- case "approve":
- var method = "POST";
- var apiUrl =
- "api/v2/homepage/ombi/requests/" + type + "/" + id + "/" + action;
- var data = {};
- break;
- case "deny":
- var method = "PUT";
- var apiUrl =
- "api/v2/homepage/ombi/requests/" + type + "/" + id + "/" + action;
- var data = {};
- break;
- case "delete":
- var method = "DELETE";
- var apiUrl = "api/v2/homepage/ombi/requests/" + type + "/" + id;
- var data = {};
- break;
- default:
- return false;
- }
- organizrAPI2(method, apiUrl, data)
- .success(function (data) {
- try {
- let response = data.response;
- if (action == "add") {
- addTempRequest();
- }
- messageSingle(
- response.message,
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- homepageRequests("ombi");
- ajaxloader();
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- ajaxloader();
- OrganizrApiError(xhr, "Ombi Error");
- });
- }
- function addTempRequest() {
- let service = activeInfo.settings.homepage.requests.service;
- let html = `
- <div class="item lazyload recent-poster request-item request-adding mouse" data-src="">
- <div class="outside-request-div">
- <div class="inside-over-request-div bg-danger"></div>
- <div class="inside-request-div bg-info"></div>
- </div>
- <div class="hover-homepage-item"></div>
- <span class="elip request-title-tv"><i class="fa fa-tv"></i></span>
- <span class="elip recent-title">Adding Request</span>
- </div>
- `;
- $(".request-items-" + service)
- .trigger("add.owl", [html, 0])
- .trigger("refresh.owl");
- setTimeout(function () {
- ajaxloader(".request-adding", "in");
- }, 100);
- }
- function cleanCloseSwal() {
- let state = swal.getState().isOpen;
- if (state === true) {
- swal.close();
- }
- }
- function doneTyping() {
- let title = $("#request-input").val();
- if (title == "") {
- return false;
- }
- var page = $("#request-page").val() ? $("#request-page").val() : 1;
- if (typeof searchTerm !== "undefined") {
- if (searchTerm !== $("#request-input").val()) {
- page = 1;
- }
- }
- ajaxloader(".search-div", "in");
- searchTerm = title;
- $("#request-page").val(page);
- requestSearch(title, page)
- .success(function (data) {
- $("#request-results").html(
- buildRequestResult(data, "", title, page, true)
- );
- if (bowser.mobile !== true) {
- $(".resultBox-inside").slimScroll({
- height: "100%",
- position: "right",
- size: "5px",
- color: "#dcdcdc",
- });
- }
- $(".mfp-wrap").animate(
- {
- scrollTop: "0",
- },
- 500
- );
- ajaxloader();
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "TMDB Error");
- ajaxloader();
- });
- }
- function requestList(list, type, page = 1) {
- ajaxloader(".search-div", "in");
- requestSearchList(list, page)
- .success(function (data) {
- if (typeof data.results !== "undefined") {
- var results = data.results;
- } else if (typeof data.items !== "undefined") {
- var results = data.items;
- }
- $("#request-results").html(buildRequestResult(data, type, list, page));
- if (bowser.mobile !== true) {
- $(".resultBox-inside").slimScroll({
- height: "100%",
- position: "right",
- size: "5px",
- color: "#dcdcdc",
- });
- }
- $(".mfp-wrap").animate(
- {
- scrollTop: "0",
- },
- 500
- );
- ajaxloader();
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "TMDB Error");
- ajaxloader();
- });
- }
- function buildDownloaderItem(array, source, type = "none") {
- var queue = "";
- var count = 0;
- var history = "";
- switch (source) {
- case "jdownloader":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (
- array.content.queueItems.length == 0 &&
- array.content.grabberItems.length == 0 &&
- array.content.encryptedItems.length == 0 &&
- array.content.offlineItems.length == 0
- ) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- } else {
- if (array.content.$status[0] == "RUNNING") {
- queue += `
- <tr><td>
- <a href="#" onclick="return false;"><span class="downloader mouse" data-source="jdownloader" data-action="pause" data-target="main"><i class="fa fa-pause"></i></span></a>
- <a href="#" onclick="return false;"><span class="downloader mouse" data-source="jdownloader" data-action="stop" data-target="main"><i class="fa fa-stop"></i></span></a>
- </td></tr>
- `;
- } else if (array.content.$status[0] == "PAUSE") {
- queue += `<tr><td><a href="#" onclick="return false;"><span class="downloader mouse" data-source="jdownloader" data-action="resume" data-target="main"><i class="fa fa-fast-forward"></i></span></a></td></tr>`;
- } else {
- queue += `<tr><td><a href="#" onclick="return false;"><span class="downloader mouse" data-source="jdownloader" data-action="start" data-target="main"><i class="fa fa-play"></i></span></a></td></tr>`;
- }
- if (array.content.$status[1]) {
- queue += `<tr><td><a href="#" onclick="return false;"><span class="downloader mouse" data-source="jdownloader" data-action="update" data-target="main"><i class="fa fa-globe"></i></span></a></td></tr>`;
- }
- }
- $.each(array.content.queueItems, function (i, v) {
- count = count + 1;
- if (v.speed == null) {
- v.speed = "Stopped";
- }
- if (v.eta == null) {
- if (v.percentage == "100") {
- v.speed = "Completed";
- v.eta = "--";
- } else {
- v.eta = "--";
- }
- }
- if (v.enabled == null) {
- v.speed = "Disabled";
- }
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.name +
- `</td>
- <td>` +
- v.speed +
- `</td>
- <td class="hidden-xs" alt="` +
- v.done +
- `">` +
- v.size +
- `</td>
- <td class="hidden-xs">` +
- v.eta +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- v.percentage +
- `%;" role="progressbar">` +
- v.percentage +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- $.each(array.content.grabberItems, function (i, v) {
- count = count + 1;
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.name +
- `</td>
- <td>Online</td>
- <td class="hidden-xs"> -- </td>
- <td class="hidden-xs"> -- </td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: 0%;" role="progressbar">0%</div>
- </div>
- </td>
- </tr>
- `;
- });
- $.each(array.content.encryptedItems, function (i, v) {
- count = count + 1;
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.name +
- `</td>
- <td>Encrypted</td>
- <td class="hidden-xs"> -- </td>
- <td class="hidden-xs"> -- </td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: 0%;" role="progressbar">0%</div>
- </div>
- </td>
- </tr>
- `;
- });
- $.each(array.content.offlineItems, function (i, v) {
- count = count + 1;
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.name +
- `</td>
- <td>Offline</td>
- <td class="hidden-xs"> -- </td>
- <td class="hidden-xs"> -- </td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: 0%;" role="progressbar">0%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "sabnzbd":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems.queue.paused) {
- var state = `<a href="#" onclick="return false;"><span class="downloader mouse" data-source="sabnzbd" data-action="resume" data-target="main"><i class="fa fa-play"></i></span></a>`;
- var active = "grayscale";
- } else {
- var state = `<a href="#" onclick="return false;"><span class="downloader mouse" data-source="sabnzbd" data-action="pause" data-target="main"><i class="fa fa-pause"></i></span></a>`;
- var active = "";
- }
- $(".sabnzbd-downloader-action").html(state);
- if (array.content.queueItems.queue.slots.length == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- $.each(array.content.queueItems.queue.slots, function (i, v) {
- count = count + 1;
- var action = v.status == "Downloading" ? "pause" : "resume";
- var actionIcon = v.status == "Downloading" ? "pause" : "play";
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.filename +
- `</td>
- <td class="hidden-xs sabnzbd-` +
- cleanClass(v.status) +
- `">` +
- v.status +
- `</td>
- <td class="downloader mouse" data-target="` +
- v.nzo_id +
- `" data-source="sabnzbd" data-action="` +
- action +
- `"><i class="fa fa-` +
- actionIcon +
- `"></i></td>
- <td class="hidden-xs"><span class="label label-info">` +
- v.cat +
- `</span></td>
- <td class="hidden-xs">` +
- v.size +
- `</td>
- <td class="hidden-xs" alt="` +
- v.eta +
- `">` +
- v.timeleft +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- v.percentage +
- `%;" role="progressbar">` +
- v.percentage +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- if (array.content.historyItems.history.slots.length == 0) {
- history =
- '<tr><td class="max-texts" lang="en">Nothing in history</td></tr>';
- }
- $.each(array.content.historyItems.history.slots, function (i, v) {
- history +=
- `
- <tr>
- <td class="max-texts">` +
- v.name +
- `</td>
- <td class="hidden-xs sabnzbd-` +
- cleanClass(v.status) +
- `">` +
- v.status +
- `</td>
- <td class="hidden-xs"><span class="label label-info">` +
- v.category +
- `</span></td>
- <td class="hidden-xs">` +
- v.size +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: 100%;" role="progressbar">100%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "nzbget":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems.result.length == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- $.each(array.content.queueItems.result, function (i, v) {
- count = count + 1;
- var action = v.Status == "Downloading" ? "pause" : "resume";
- var actionIcon = v.Status == "Downloading" ? "pause" : "play";
- var percent = Math.floor(
- ((v.FileSizeMB - v.RemainingSizeMB) * 100) / v.FileSizeMB
- );
- var size = v.FileSizeMB * 1000000;
- v.Category = v.Category !== "" ? v.Category : "Not Set";
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.NZBName +
- `</td>
- <td class="hidden-xs nzbget-` +
- cleanClass(v.Status) +
- `">` +
- v.Status +
- `</td>
- <!--<td class="downloader mouse" data-target="` +
- v.NZBID +
- `" data-source="sabnzbd" data-action="` +
- action +
- `"><i class="fa fa-` +
- actionIcon +
- `"></i></td>-->
- <td class="hidden-xs"><span class="label label-info">` +
- v.Category +
- `</span></td>
- <td class="hidden-xs">` +
- humanFileSize(size, true) +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- percent +
- `%;" role="progressbar">` +
- percent +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- if (array.content.historyItems.result.length == 0) {
- history =
- '<tr><td class="max-texts" lang="en">Nothing in history</td></tr>';
- }
- $.each(array.content.historyItems.result, function (i, v) {
- v.Category = v.Category !== "" ? v.Category : "Not Set";
- var size = v.FileSizeMB * 1000000;
- history +=
- `
- <tr>
- <td class="max-texts">` +
- v.NZBName +
- `</td>
- <td class="hidden-xs nzbget-` +
- cleanClass(v.Status) +
- `">` +
- v.Status +
- `</td>
- <td class="hidden-xs"><span class="label label-info">` +
- v.Category +
- `</span></td>
- <td class="hidden-xs">` +
- humanFileSize(size, true) +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: 100%;" role="progressbar">100%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "transmission":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- $.each(array.content.queueItems, function (i, v) {
- count = count + 1;
- switch (v.status) {
- case 7:
- case "7":
- var status = "No Peers";
- break;
- case 6:
- case "6":
- var status = "Seeding";
- break;
- case 5:
- case "5":
- var status = "Seeding Queued";
- break;
- case 4:
- case "4":
- var status = "Downloading";
- break;
- case 3:
- case "3":
- var status = "Queued";
- break;
- case 2:
- case "2":
- var status = "Checking Files";
- break;
- case 1:
- case "1":
- var status = "File Check Queued";
- break;
- case 0:
- case "0":
- var status = "Complete";
- break;
- default:
- var status = "Complete";
- }
- var percent = Math.floor(v.percentDone * 100);
- v.Category = v.Category !== "" ? v.Category : "Not Set";
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.name +
- `</td>
- <td class="hidden-xs transmission-` +
- cleanClass(status) +
- `">` +
- status +
- `</td>
- <td class="hidden-xs">` +
- v.downloadDir +
- `</td>
- <td class="hidden-xs">` +
- humanFileSize(v.totalSize, true) +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- percent +
- `%;" role="progressbar">` +
- percent +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "rTorrent":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- $.each(array.content.queueItems, function (i, v) {
- count = count + 1;
- var percent = Math.floor((v.downloaded / v.size) * 100);
- var size = v.size != -1 ? humanFileSize(v.size, false) : "?";
- var upload = v.seed !== "" ? humanFileSize(v.seed, true) : "0 B";
- var download = v.leech !== "" ? humanFileSize(v.leech, true) : "0 B";
- var upTotal =
- v.upTotal !== "" ? humanFileSize(v.upTotal, false) : "0 B";
- var downTotal =
- v.downTotal !== "" ? humanFileSize(v.downTotal, false) : "0 B";
- var date = new Date(0);
- date.setUTCSeconds(v.date);
- date = moment(date).format("LLL");
- queue +=
- `
- <tr>
- <td class="max-texts"><span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="` +
- date +
- `">` +
- v.name +
- `</span></td>
- <td class="hidden-xs rtorrent-` +
- cleanClass(v.status) +
- `">` +
- v.status +
- `</td>
- <td class="hidden-xs"><span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="` +
- downTotal +
- `"><i class="fa fa-download"></i> ` +
- download +
- `</span></td>
- <td class="hidden-xs"><span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="` +
- upTotal +
- `"><i class="fa fa-upload"></i> ` +
- upload +
- `</span></td>
- <td class="hidden-xs">` +
- size +
- `</td>
- <td class="hidden-xs"><span class="label label-info">` +
- v.label +
- `</span></td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- percent +
- `%;" role="progressbar">` +
- percent +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "utorrent":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- $.each(array.content.queueItems, function (i, v) {
- count = count + 1;
- var upload = v.upSpeed !== "" ? humanFileSize(v.upSpeed, false) : "0 B";
- var download =
- v.downSpeed !== "" ? humanFileSize(v.downSpeed, false) : "0 B";
- var size = v.Size !== "" ? humanFileSize(v.Size, false) : "0 B";
- queue +=
- `
- <tr>
- <td class="max-texts"><span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="">` +
- v.Name +
- `</span></td>
- <td class="hidden-xs utorrent-` +
- cleanClass(v.Status) +
- `">` +
- v.Status +
- `</td>
- <td class="hidden-xs"><span class="label label-info">` +
- v.Labels +
- `</span></td>
- <td class="hidden-xs"><span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="` +
- download +
- `"><i class="fa fa-download"></i> ` +
- download +
- `</span></td>
- <td class="hidden-xs"><span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="` +
- upload +
- `"><i class="fa fa-upload"></i> ` +
- upload +
- `</span></td>
- <td class="hidden-xs">` +
- size +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- v.Percent +
- `;" role="progressbar">` +
- v.Percent +
- `</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "sonarr":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- break;
- }
- if (array.content.queueItems.records == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- break;
- }
- let sonarrQueueSet =
- typeof array.content.queueItems.records == "undefined"
- ? array.content.queueItems
- : array.content.queueItems.records;
- $.each(sonarrQueueSet, function (i, v) {
- count = count + 1;
- var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100);
- percent = isNaN(percent) ? "0" : percent;
- var size = v.size != -1 ? humanFileSize(v.size, false) : "?";
- v.name = typeof v.series == "undefined" ? v.title : v.series.title;
- queue +=
- `
- <tr>
- <td class="">` +
- v.name +
- `</td>
- <td class="">S` +
- pad(v.episode.seasonNumber, 2) +
- `E` +
- pad(v.episode.episodeNumber, 2) +
- `</td>
- <td class="max-texts">` +
- v.episode.title +
- `</td>
- <td class="hidden-xs sonarr-` +
- cleanClass(v.status) +
- `">` +
- v.status +
- `</td>
- <td class="hidden-xs">` +
- size +
- `</td>
- <td class="hidden-xs"><span class="label label-info">` +
- v.protocol +
- `</span></td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- percent +
- `%;" role="progressbar">` +
- percent +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "radarr":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- break;
- }
- if (array.content.queueItems.records == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- break;
- }
- let queueSet =
- typeof array.content.queueItems.records == "undefined"
- ? array.content.queueItems
- : array.content.queueItems.records;
- $.each(queueSet, function (i, v) {
- count = count + 1;
- var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100);
- percent = isNaN(percent) ? "0" : percent;
- var size = v.size != -1 ? humanFileSize(v.size, false) : "?";
- v.name = typeof v.movie == "undefined" ? v.title : v.movie.title;
- queue += `
- <tr>
- <td class="max-texts">${v.name}</td>
- <td class="hidden-xs sonarr-${cleanClass(v.status)}">${
- v.status
- }</td>
- <td class="hidden-xs">${size}</td>
- <td class="hidden-xs"><span class="label label-info">${
- v.protocol
- }</span></td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ${percent}%;" role="progressbar">${percent}%</div>
- </div>
- </td>
- </tr>
- `;
- });
- if (queue == "") {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- break;
- case "qBittorrent":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- $.each(array.content.queueItems, function (i, v) {
- count = count + 1;
- switch (v.state) {
- case "stalledDL":
- var status = "No Peers";
- break;
- case "metaDL":
- var status = "Getting Metadata";
- break;
- case "uploading":
- var status = "Seeding";
- break;
- case "queuedUP":
- var status = "Seeding Queued";
- break;
- case "downloading":
- var status = "Downloading";
- break;
- case "queuedDL":
- var status = "Queued";
- break;
- case "checkingDL":
- case "checkingUP":
- var status = "Checking Files";
- break;
- case "pausedDL":
- var status = "Paused";
- break;
- case "pausedUP":
- var status = "Complete";
- break;
- default:
- var status = "Complete";
- }
- var percent = Math.floor(v.progress * 100);
- var size = v.total_size != -1 ? humanFileSize(v.total_size, true) : "?";
- queue +=
- `
- <tr>
- <td class="max-texts">` +
- v.name +
- `</td>
- <td class="hidden-xs qbit-` +
- cleanClass(status) +
- `">` +
- status +
- `</td>
- <td class="hidden-xs">` +
- v.save_path +
- `</td>
- <td class="hidden-xs">` +
- size +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- percent +
- `%;" role="progressbar">` +
- percent +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- case "deluge":
- if (array.content === false) {
- queue =
- '<tr><td class="max-texts" lang="en">Connection Error to ' +
- source +
- "</td></tr>";
- break;
- }
- if (array.content.queueItems.length == 0) {
- queue =
- '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
- }
- $.each(array.content.queueItems, function (i, v) {
- count = count + 1;
- var percent = Math.floor(v.progress);
- var size = v.total_size != -1 ? humanFileSize(v.total_size, true) : "?";
- var upload =
- v.upload_payload_rate != -1
- ? humanFileSize(v.upload_payload_rate, true)
- : "?";
- var download =
- v.download_payload_rate != -1
- ? humanFileSize(v.download_payload_rate, true)
- : "?";
- var action = v.Status == "Downloading" ? "pause" : "resume";
- var actionIcon = v.Status == "Downloading" ? "pause" : "play";
- queue +=
- `
- <tr>
- <td class="max-texts">` + v.name;
- if (v.tracker_status != "")
- queue +=
- `<i class="fa fa-caret-down ml-2" style="cursor:pointer" onclick="$(this).toggleClass('fa-caret-down');$(this).toggleClass('fa-caret-up');$('#status-` +
- v.hash +
- `').toggleClass('d-none');" aria-hidden="true"></i><br /><div class="well mb-0 mt-2 p-3 d-none" id="status-` +
- v.hash +
- `">` +
- v.tracker_status +
- `</div>`;
- queue +=
- `</td>
- <td class="hidden-xs deluge-` +
- cleanClass(v.state) +
- `">` +
- v.state +
- `</td>
- <td class="hidden-xs">` +
- size +
- `</td>
- <td class="hidden-xs"><i class="fa fa-download"></i> ` +
- download +
- `</td>
- <td class="hidden-xs"><i class="fa fa-upload"></i> ` +
- upload +
- `</td>
- <td class="text-right">
- <div class="progress progress-lg m-b-0">
- <div class="progress-bar progress-bar-info" style="width: ` +
- percent +
- `%;" role="progressbar">` +
- percent +
- `%</div>
- </div>
- </td>
- </tr>
- `;
- });
- break;
- default:
- return false;
- }
- if (queue !== "") {
- $("." + source + "-queue").html(queue);
- }
- if (history !== "") {
- $("." + source + "-history").html(history);
- }
- $("#count-" + source).html(count);
- }
- function buildDownloader(source) {
- var queueButton = "QUEUE";
- var historyButton = "HISTORY";
- switch (source) {
- case "jdownloader":
- var queue = true;
- var history = false;
- queueButton = "REFRESH";
- break;
- case "sabnzbd":
- case "nzbget":
- var queue = true;
- var history = true;
- break;
- case "transmission":
- case "qBittorrent":
- case "deluge":
- case "utorrent":
- var queue = true;
- break;
- case "rTorrent":
- case "sonarr":
- case "radarr":
- var queue = true;
- var history = false;
- queueButton = "REFRESH";
- break;
- default:
- var queue = false;
- var history = false;
- }
- var menu = `<ul class="nav customtab nav-tabs pull-right" role="tablist">`;
- var listing = "";
- var state = "";
- var active = "";
- var headerAlt = "";
- var header = "";
- //console.log(array);
- //console.log(queueItems);
- //console.log(historyItems);
- //console.log(downloader);
- if (queue) {
- menu +=
- `
- <li role="presentation" class="active" onclick="homepageDownloader('` +
- source +
- `')"><a href="#` +
- source +
- `-queue" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="true"><span class="visible-xs"><i class="ti-download"></i></span><span class="hidden-xs">` +
- queueButton +
- `</span></a></li>
- `;
- listing +=
- `
- <div role="tabpanel" class="tab-pane fade active in" id="` +
- source +
- `-queue">
- <div class="inbox-center table-responsive">
- <table class="table table-hover">
- <tbody class="` +
- source +
- `-queue"></tbody>
- </table>
- </div>
- <div class="clearfix"></div>
- </div>
- `;
- }
- if (history) {
- menu +=
- `
- <li role="presentation" class=""><a href="#` +
- source +
- `-history" aria-controls="profile" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="ti-time"></i></span> <span class="hidden-xs">` +
- historyButton +
- `</span></a></li>
- `;
- listing +=
- `
- <div role="tabpanel" class="tab-pane fade" id="` +
- source +
- `-history">
- <div class="inbox-center table-responsive">
- <table class="table table-hover">
- <tbody class="` +
- source +
- `-history"></tbody>
- </table>
- </div>
- <div class="clearfix"></div>
- </div>
- `;
- }
- menu += "</ul>";
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var headerAlt =
- `
- <div class="col-md-12">
- <h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle ` +
- active +
- `" data-src="plugins/images/tabs/` +
- source +
- `.png"> ` +
- state +
- `</h2>
- ` +
- menu +
- `
- <hr class="hidden-xs"><div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- `;
- } else {
- var header =
- `
- <div class="white-box bg-info m-b-0 p-b-0 p-t-10 mailbox-widget">
- <h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle ` +
- active +
- `" data-src="plugins/images/tabs/` +
- source +
- `.png"> ` +
- state +
- `</h2>
- ` +
- menu +
- `
- <div class="clearfix"></div>
- </div>
- `;
- }
- return (
- `
- <div class="row">
- ` +
- headerAlt +
- `
- <div class="col-lg-12">
- ` +
- header +
- `
- <div class="white-box p-0">
- <div class="tab-content m-t-0">` +
- listing +
- `</div>
- </div>
- </div>
- </div>
- `
- );
- }
- function buildDownloaderCombined(source) {
- var first = $(".combinedDownloadRow").length == 0 ? true : false;
- var active = first ? "active" : "";
- var queueButton = "QUEUE";
- var historyButton = "HISTORY";
- switch (source) {
- case "jdownloader":
- var queue = true;
- var history = false;
- queueButton = "REFRESH";
- break;
- case "sabnzbd":
- case "nzbget":
- var queue = true;
- var history = true;
- break;
- case "utorrent":
- var queue = true;
- break;
- case "transmission":
- case "qBittorrent":
- case "deluge":
- case "rTorrent":
- case "sonarr":
- case "radarr":
- var queue = true;
- var history = false;
- queueButton = "REFRESH";
- break;
- default:
- var queue = false;
- var history = false;
- }
- var mainMenu = `<ul class="nav customtab nav-tabs combinedMenuList" role="tablist">`;
- var addToMainMenu =
- `<li role="presentation" class="` +
- active +
- `"><a onclick="homepageDownloader('` +
- source +
- `')" href="#combined-` +
- source +
- `" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="true"><span class=""><img src="./plugins/images/tabs/` +
- source +
- `.png" class="homepageImageTitle"><span class="badge bg-org downloaderCount" id="count-` +
- source +
- `"><i class="fa fa-spinner fa-spin"></i></span></span></a></li>`;
- var listing = "";
- var headerAlt = "";
- var header = "";
- var menu = `<ul class="nav customtab nav-tabs m-t-5" role="tablist">`;
- if (queue) {
- menu +=
- `
- <li role="presentation" class="active" onclick="homepageDownloader('` +
- source +
- `')"><a href="#` +
- source +
- `-queue" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="true"><span class="visible-xs"><i class="ti-download"></i></span><span class="hidden-xs">` +
- queueButton +
- `</span></a></li>
- `;
- listing +=
- `
- <div role="tabpanel" class="tab-pane fade active in" id="` +
- source +
- `-queue">
- <div class="inbox-center table-responsive">
- <table class="table table-hover">
- <tbody class="` +
- source +
- `-queue"></tbody>
- </table>
- </div>
- <div class="clearfix"></div>
- </div>
- `;
- }
- if (history) {
- menu +=
- `
- <li role="presentation" class=""><a href="#` +
- source +
- `-history" aria-controls="profile" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="ti-time"></i></span> <span class="hidden-xs">` +
- historyButton +
- `</span></a></li>
- `;
- listing +=
- `
- <div role="tabpanel" class="tab-pane fade" id="` +
- source +
- `-history">
- <div class="inbox-center table-responsive">
- <table class="table table-hover">
- <tbody class="` +
- source +
- `-history"></tbody>
- </table>
- </div>
- <div class="clearfix"></div>
- </div>
- `;
- }
- menu +=
- '<li class="' +
- source +
- '-downloader-action"></li></ul><div class="clearfix"></div>';
- menu = queue && history ? menu : "";
- var listingMain =
- '<div role="tabpanel" class="tab-pane fade ' +
- active +
- ' in" id="combined-' +
- source +
- '">' +
- menu +
- '<div class="tab-content m-t-0 listingSingle">' +
- listing +
- "</div></div>";
- mainMenu += first ? addToMainMenu + "</ul>" : "";
- if (first) {
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var headerAlt =
- `
- <div class="col-md-12">
- ` +
- mainMenu +
- `
- <div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- `;
- } else {
- var header =
- `
- <div class="white-box bg-info m-b-0 p-b-0 p-10 mailbox-widget">
- ` +
- mainMenu +
- `
- <div class="clearfix"></div>
- </div>
- `;
- }
- var built =
- `
- <div class="row combinedDownloadRow">
- ` +
- headerAlt +
- `
- <div class="col-lg-12">
- ` +
- header +
- `
- <div class="white-box p-0">
- <div class="tab-content m-t-0 listingMain">` +
- listingMain +
- `</div>
- </div>
- </div>
- </div>
- `;
- $("#homepageOrderdownloader").html(built);
- } else {
- $(addToMainMenu).appendTo(".combinedMenuList");
- $(listingMain).appendTo(".listingMain");
- }
- }
- function buildMetadata(array, source) {
- var metadata = "";
- var genres = "";
- var actors = "";
- var rating = '<div class="col-xs-2 p-10"></div>';
- var sourceIcon = source === "jellyfin" ? "fish" : source;
- $.each(array.content, function (i, v) {
- // Normalize per-item source when coming from JellyStat or unknown
- var itemSource = source;
- try {
- if (
- source === "jellystat" ||
- (source !== "emby" && source !== "jellyfin")
- ) {
- if (v.tabName) {
- var tn = String(v.tabName).toLowerCase();
- if (tn.indexOf("emby") !== -1) {
- itemSource = "emby";
- } else if (tn.indexOf("jellyfin") !== -1) {
- itemSource = "jellyfin";
- }
- }
- // Fallback inference from address if tabName did not resolve
- if (
- (itemSource === source || itemSource === "jellystat") &&
- v.address
- ) {
- var addr = String(v.address).toLowerCase();
- if (addr.indexOf("jellyfin") !== -1) {
- itemSource = "jellyfin";
- } else if (addr.indexOf("emby") !== -1) {
- itemSource = "emby";
- }
- }
- }
- } catch (e) {}
- // Normalize to lowercase to avoid casing issues like 'Emby'
- itemSource = (itemSource || "").toString().toLowerCase();
- var hasActor = typeof v.metadata.actors !== "string" ? true : false;
- var hasGenre = typeof v.metadata.genres !== "string" ? true : false;
- if (hasActor) {
- $.each(v.metadata.actors, function (i, v) {
- actors +=
- '<div class="item lazyload recent-poster" data-src="' +
- v.thumb.replace("http://", "https://") +
- '" alt="' +
- v.name +
- '" ><span class="elip recent-title p-a-5">' +
- v.name +
- '<br><small class="font-light">' +
- v.role +
- "</small></span></div>";
- });
- }
- if (hasGenre) {
- $.each(v.metadata.genres, function (i, v) {
- genres += '<span class="badge bg-org m-r-10">' + v + "</span>";
- });
- }
- if (v.metadata.rating) {
- var ratingRound = Math.ceil(v.metadata.rating) * 10;
- rating =
- `<div class="col-xs-2 p-10"><div data-label="` +
- v.metadata.rating * 10 +
- `%" class="css-bar css-bar-` +
- Math.ceil(ratingRound / 5) * 5 +
- ` css-bar-sm m-b-0 css-bar-info"><img src="plugins/images/rotten.png" class="nowPlayingUserThumb" alt="User"></div></div>`;
- }
- var seconds = v.metadata.duration / 1000; // or "2000"
- seconds = parseInt(seconds); //because moment js dont know to handle number in string format
- var format =
- Math.floor(moment.duration(seconds, "seconds").asHours()) +
- ":" +
- moment.duration(seconds, "seconds").minutes() +
- ":" +
- moment.duration(seconds, "seconds").seconds();
- // Build icon HTML: use image for Emby to avoid missing MDI glyphs; keep MDI for others
- var sourceIconHtml = "";
- var iconChoice = itemSource === "jellyfin" ? "fish" : itemSource;
- if (itemSource === "emby") {
- sourceIconHtml =
- '<img src="plugins/images/tabs/emby.png" class="metadata-source-image" style="height:24px;width:24px;" />';
- } else {
- sourceIconHtml = '<i class="fa mdi mdi-' + iconChoice + ' fa-2x"></i>';
- }
- metadata =
- `
- <div class="white-box m-b-0">
- <div class="user-bg lazyload" data-src="` +
- v.nowPlayingImageURL +
- `">
- ` +
- rating +
- `
- <div class="col-xs-10">
- <h2 class="m-b-0 font-medium pull-right text-right">
- ` +
- v.title +
- `<button type="button" class="btn bg-org btn-circle close-popup m-l-10"><i class="fa fa-times"></i> </button><br>
- <small class="m-t-0 text-white">` +
- v.metadata.tagline +
- `</small><br>
- <button class="btn waves-effect waves-light openTab bg-` +
- itemSource +
- `" type="button" data-tab-name="` +
- cleanClass(v.tabName) +
- `" data-type="` +
- v.type +
- `" data-open-tab="` +
- v.openTab +
- `" data-url="` +
- v.address +
- `" href="javascript:void(0);"> ` +
- sourceIconHtml +
- ` </button>
- ` +
- buildYoutubeLink(v.title + " " + v.metadata.year + " " + v.type) +
- `
- </h2>
- </div>
- <div class="genre-list p-10">` +
- genres +
- `</div>
- </div>
- </div>
- <div class="panel panel-info p-b-0 p-t-0">
- <div class="panel-body p-b-0 p-t-0 m-b-0">
- <div class="p-20 text-center">
- <p class="">` +
- v.metadata.summary +
- `</p>
- </div>
- <div class="row">
- <div class="col-lg-12">
- <div class="owl-carousel owl-theme metadata-actors p-b-10">` +
- actors +
- `</div>
- </div>
- </div>
- </div>
- </div>
- `;
- });
- return metadata;
- }
- function buildYoutubeLink(title) {
- if (title) {
- var str = createRandomString(10);
- return (
- `
- <button class="btn btn-youtube waves-effect waves-light" type="button" onclick="youtubeCheck('` +
- escape(title) +
- `','` +
- str +
- `')"> <i class="fa fa-youtube-play fa-2x"></i> </button>
- <a class="hidden inline-popups ` +
- str +
- `" href="#open-youtube" data-effect="mfp-zoom-out"></a>
- `
- );
- }
- }
- function buildPVRLink(href, ico = "", frame = "", showLink = true) {
- if (href && showLink) {
- var styleOverride = `width:55px;height:44px;background-image: url(${ico});background-repeat:no-repeat;background-size:25px;background-position:center;`;
- if (frame) {
- return `
- <div class="btn btn-inverse waves-effect waves-light" type="button" onclick="tabActions(event,'${frame}','${href}');" style="${styleOverride}"></div>
- `;
- } else {
- return `
- <div class="btn btn-inverse waves-effect waves-light" type="button" onclick="window.open('${href}')" style="${styleOverride}"></div>
- `;
- }
- } else {
- return `
-
- `;
- }
- }
- function buildCalendarMetadata(array) {
- var metadata = "";
- var genres = "";
- var actors = "";
- var rating = '<div class="col-xs-2 p-10"></div>';
- var hasGenre = typeof array.genres !== "string" ? true : false;
- if (hasGenre) {
- $.each(array.genres, function (i, v) {
- genres += '<span class="badge bg-org m-r-10">' + v + "</span>";
- });
- }
- if (array.ratings) {
- var ratingRound = Math.ceil(array.ratings) * 10;
- rating =
- `<div class="col-xs-2 p-10"><div data-label="` +
- array.ratings * 10 +
- `%" class="css-bar css-bar-` +
- Math.ceil(ratingRound / 5) * 5 +
- ` css-bar-sm m-b-0 css-bar-info"><img src="plugins/images/rotten.png" class="nowPlayingUserThumb" alt="User"></div></div>`;
- }
- var seconds = array.runtime / 1000; // or "2000"
- seconds = parseInt(seconds); //because moment js dont know to handle number in string format
- var format =
- Math.floor(moment.duration(seconds, "seconds").asHours()) +
- ":" +
- moment.duration(seconds, "seconds").minutes() +
- ":" +
- moment.duration(seconds, "seconds").seconds();
- metadata =
- `
- <div class="white-box m-b-0">
- <div class="user-bg lazyload" data-src="` +
- array.image +
- `">
- ` +
- rating +
- `
- <div class="col-xs-10">
- <h2 class="m-b-0 font-medium pull-right text-right">
- ` +
- array.topTitle +
- `<button type="button" class="btn bg-org btn-circle close-popup m-l-10"><i class="fa fa-times"></i> </button><br>
- <small class="m-t-0 text-white">` +
- array.bottomTitle +
- `</small><br>
- ` +
- buildPVRLink(array.href, array.icon, array.frame, array.showLink) +
- buildYoutubeLink(array.topTitle) +
- `
- </h2>
- </div>
- <div class="genre-list p-10">` +
- genres +
- `</div>
- </div>
- </div>
- <div class="panel panel-info p-b-0 p-t-0">
- <div class="panel-body p-b-0 p-t-0 m-b-0">
- <div class="p-20 text-center">
- <p class="">` +
- array.overview +
- `</p>
- </div>
- </div>
- </div>
- `;
- return metadata;
- }
- function buildHealthChecks(array) {
- if (array === false) {
- return "";
- }
- var checks =
- typeof array.content.checks !== "undefined"
- ? array.content.checks.length
- : false;
- return checks
- ? `
- <div id="allHealthChecks" class="m-b-30">
- <div class="el-element-overlay row">
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">Health Checks</span> : </h4><h4 class="pull-left"> <span class="label label-info m-l-20 checkbox-circle good-health-checks mouse" onclick="homepageHealthChecks()">` +
- checks +
- `</span></h4>
- <hr class="hidden-xs">
- </div>
- <div class="clearfix"></div>
- <!-- .cards -->
- <div class="healthCheckCards">
- ` +
- buildHealthChecksItem(array) +
- `
- </div>
- <!-- /.cards-->
- </div>
- </div>
- <div class="clearfix"></div>
- `
- : "";
- }
- function buildPihole(array) {
- if (array === false) {
- return "";
- }
- var html = `
- <div id="allPihole">
- <div class="el-element-overlay row">`;
- if (array["options"]["title"]) {
- html += `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">Pi-hole</span> : </h4><h4 class="pull-left"> </h4>
- <hr class="hidden-xs ml-2">
- </div>
- <div class="clearfix"></div>
- `;
- }
- html +=
- `
- <div class="piholeCards col-sm-12 my-3">
- ` +
- buildPiholeItem(array) +
- `
- </div>
- </div>
- </div>
- `;
- return array ? html : "";
- }
- function buildAdGuard(array) {
- if (array === false) {
- return "";
- }
- var html = `
- <div id="allAdGuard">
- <div class="el-element-overlay row">`;
- if (array["options"]["title"]) {
- html += `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">AdGuard Home</span> : </h4><h4 class="pull-left"> </h4>
- <hr class="hidden-xs ml-2">
- </div>
- <div class="clearfix"></div>
- `;
- }
- html +=
- `
- <div class="adguardCards col-sm-12 my-3">
- ` +
- buildAdGuardItem(array) +
- `
- </div>
- </div>
- </div>
- `;
- return array ? html : "";
- }
- function buildUnifi(array) {
- if (array === false) {
- return "";
- }
- var items =
- typeof array.content.unifi.data !== "undefined"
- ? array.content.unifi.data.length
- : false;
- return items
- ? `
- <div id="allUnifi">
-
- <!-- <div class="row">
- <div class="col-md-12">
- <div class="white-box">
- <h3 class="box-title">Unifi</h3>
- ` +
- buildUnifiItemNew(array.content.unifi.data) +
- `
- </div>
- </div>
- </div> -->
-
-
- <div class="row">
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">UniFi</span> : </h4><h4 class="pull-left"> </h4>
- <hr class="hidden-xs">
- </div>
- <div class="clearfix"></div>
- <!-- .cards -->
- <div class="unifiCards">
- ` +
- buildUnifiItem(array.content.unifi.data) +
- `
- </div>
- <!-- /.cards-->
- </div>
- </div>
- <div class="clearfix"></div>
- `
- : "";
- }
- function buildUnifiItemNew(array) {
- let items = "";
- let count = 0;
- let navTabItems = "";
- $.each(array, function (i, v) {
- let name = typeof v.subsystem !== "undefined" ? v.subsystem : "";
- let stats = {};
- let panelColor = "";
- let proceed = v.status == "ok";
- let active = count <= 0 ? "active in" : "";
- let icon = "ti-home";
- count++;
- switch (name) {
- case "wlan":
- panelColor = "info";
- stats["clients"] = v.num_user;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "wan":
- panelColor = "success";
- stats["IP"] = v.wan_ip;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "lan":
- panelColor = "primary";
- stats["clients"] = v.num_user;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "www":
- panelColor = "warning";
- stats["drops"] = v.drops;
- stats["latency"] = v.latency;
- stats["uptime"] = v.uptime;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "vpn":
- panelColor = "inverse";
- stats["clients"] = v.remote_user_num_active;
- stats["tx"] = v.remote_user_tx_bytes;
- stats["rx"] = v.remote_user_rx_bytes;
- break;
- default:
- }
- var statItems = "";
- if (proceed) {
- navTabItems += `<li role="presentation" class="${active}"><a href="#unifi-${name}" aria-controls="unifi-${name}" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="${icon}"></i></span><span class="hidden-xs text-uppercase"> ${name}</span></a></li>`;
- $.each(stats, function (istat, vstat) {
- statItems += `
- <div class="stat-item">
- <h6 class="text-uppercase">${istat}</h6>
- <b>${vstat}</b>
- </div>
- `;
- });
- items += `
- <div role="tabpanel" class="tab-pane fade ${active}" id="unifi-${name}">
- <div class="col-md-12">${statItems}</div>
- <div class="clearfix"></div>
- </div>
- `;
- }
- });
- let navTabs = `<ul class="nav customtab nav-tabs" role="tablist">${navTabItems}</ul>`;
- items = `<div class="tab-content">${items}</div>`;
- return navTabs + items;
- }
- function buildUnifiItem(array) {
- var items = "";
- $.each(array, function (i, v) {
- var name = typeof v.subsystem !== "undefined" ? v.subsystem : "";
- var stats = {};
- var panelColor = "";
- var proceed = v.status == "ok";
- switch (name) {
- case "wlan":
- panelColor = "info";
- stats["clients"] = v.num_user;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "wan":
- panelColor = "success";
- stats["IP"] = v.wan_ip;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "lan":
- panelColor = "primary";
- stats["clients"] = v.num_user;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "www":
- panelColor = "warning";
- stats["drops"] = v.drops;
- stats["latency"] = v.latency;
- stats["uptime"] = v.uptime;
- stats["tx"] = v["tx_bytes-r"];
- stats["rx"] = v["rx_bytes-r"];
- break;
- case "vpn":
- panelColor = "inverse";
- stats["clients"] = v.remote_user_num_active;
- stats["tx"] = v.remote_user_tx_bytes;
- stats["rx"] = v.remote_user_rx_bytes;
- break;
- default:
- }
- var statItems = "";
- if (proceed) {
- $.each(stats, function (istat, vstat) {
- statItems += `
- <div class="stat-item">
- <h6 class="text-uppercase">${istat}</h6>
- <b>${vstat}</b>
- </div>
- `;
- });
- items += `
- <div class="col-lg-4 col-md-6 col-center">
- <div class="panel panel-${panelColor}">
- <div class="panel-heading"> <span class="text-uppercase">${name}</span>
- <div class="pull-right"><a href="#" data-perform="panel-collapse"><i class="ti-minus"></i></a></div>
- </div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="panel-body">
- ${statItems}
- </div>
- </div>
- </div>
- </div>
- `;
- }
- });
- return items;
- }
- function healthCheckIcon(tags) {
- var allTags = tags.split(" ");
- var useIcon = "";
- $.each(allTags, function (i, v) {
- //check for image
- var file =
- v.substring(v.lastIndexOf(".") + 1, v.length).toLowerCase() ||
- v.toLowerCase();
- switch (file) {
- case "png":
- case "jpg":
- case "jpeg":
- case "gif":
- useIcon =
- '<img class="lazyload loginTitle" data-src="' + v + '"> ';
- break;
- default:
- }
- });
- return useIcon;
- }
- function buildHealthChecksItem(array) {
- var checks = "";
- $.each(array.content.checks, function (i, v) {
- var hasIcon = healthCheckIcon(v.tags);
- v.name = v.name ? v.name : "New Item";
- v.desc =
- array.options.desc && v.desc ? "<h5>Notes: " + v.desc + "</h5>" : "";
- switch (v.status) {
- case "up":
- var statusColor = "success";
- var statusIcon = "ti-link text-success";
- var nextPing = moment
- .utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]")
- .local()
- .fromNow();
- var lastPing = moment
- .utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]")
- .local()
- .fromNow();
- break;
- case "down":
- var statusColor = "danger animated-3 loop-animation flash";
- var statusIcon = "ti-unlink text-danger";
- var nextPing = "Service Down";
- var lastPing = moment
- .utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]")
- .local()
- .fromNow();
- break;
- case "new":
- var statusColor = "info";
- var statusIcon = "ti-time text-info";
- var nextPing = "Waiting...";
- var lastPing = "n/a";
- break;
- case "grace":
- var statusColor = "warning";
- var statusIcon = "ti-alert text-warning";
- var nextPing = moment
- .utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]")
- .local()
- .fromNow();
- var lastPing = "Missed";
- break;
- case "paused":
- var statusColor = "primary";
- var statusIcon = "ti-control-pause text-primary";
- var nextPing = "Paused";
- var lastPing = moment
- .utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]")
- .local()
- .fromNow();
- break;
- default:
- var statusColor = "warning";
- var statusIcon = "ti-timer text-warning";
- var nextPing = "Waiting...";
- var lastPing = "n/a";
- }
- var tagPrimaryElem = "",
- tagSecondaryElem = "";
- if (array.options.tags && v.tags) {
- v.tags = v.tags.split(" ");
- $.each(v.tags, function (key, value) {
- if (isURL(value)) {
- v.tags = arrayRemove(v.tags, value);
- }
- });
- tagPrimaryElem =
- '<span class="pull-right mt-3 mr-2"><span class="label text-uppercase bg-' +
- statusColor.replace("animated-3 loop-animation flash", "") +
- ' label-rounded font-12">' +
- v.tags[0] +
- "</span></span>";
- tagSecondaryElem = "<h5>Tags: ";
- tagSecondaryElem += v.tags
- .map((t) => {
- return t;
- })
- .join(", ");
- tagSecondaryElem += "</h5>";
- }
- checks +=
- `
- <div class="col-xl-2 col-lg-3 col-md-4 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 showMoreHealth mouse" data-id="` +
- i +
- `">
- <div class="card-body bg-org-alt pt-1 pb-1">
- <div class="d-flex no-block align-items-center">
- <div class="left-health bg-` +
- statusColor +
- `"></div>
- <div class="ml-1 w-100">
- <span class="pull-right mt-3 mb-2"><i class="` +
- statusIcon +
- ` font-20"></i></span>
- ` +
- tagPrimaryElem +
- `
- <h3 class="d-flex no-block align-items-center mt-2 mb-2">` +
- hasIcon +
- v.name +
- `</h3>
- <div class="clearfix"></div>
- <div class="d-none showMoreHealthDiv-` +
- i +
- `"><h5>Last: ` +
- lastPing +
- `</h5><h5>Next: ` +
- nextPing +
- `</h5>` +
- v.desc +
- tagSecondaryElem +
- `</div>
- <div class="clearfix"></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- });
- return checks;
- }
- function isURL(str) {
- const pattern = new RegExp(
- "^(https?:\\/\\/)?" + // protocol
- "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name
- "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address
- "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path
- "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string
- "(\\#[-a-z\\d_]*)?$",
- "i"
- ); // fragment locator
- return !!pattern.test(str);
- }
- function arrayRemove(arr, value) {
- return arr.filter(function (ele) {
- return ele != value;
- });
- }
- function buildAdGuardItem(array) {
- var stats = `
- <style>
- .bg-green {
- background-color: #00a65a !important;
- }
-
- .bg-aqua {
- background-color: #00c0ef!important;
- }
-
- .bg-yellow {
- background-color: #f39c12!important;
- }
-
- .bg-red {
- background-color: #dd4b39!important;
- }
-
- .adguard-stat {
- color: #fff !important;
- }
-
- .adguard-stat .card-body h3 {
- font-size: 38px;
- font-weight: 700;
- }
- .adguard-stat .card-body i {
- font-size: 5em;
- float: right;
- color: #ffffff6b;
- }
- .inline-block {
- display: inline-block;
- }
- </style>
- `;
- var length = Object.keys(array["data"]).length;
- var combine = array["options"]["combine"];
- var totalQueries = function (data) {
- var card = `
- <div class="col-lg-3 col-md-6 col-sm-6 col-xs-12">
- <div class="card text-white mb-3 adguard-stat bg-green">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Total Queries</p>`;
- for (var key in data) {
- var e = data[key];
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(` + key + `)</p>`;
- }
- card +=
- `<h3 data-toggle="tooltip" data-placement="right" title="` +
- key +
- `">` +
- e["num_dns_queries"].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
- `</h3>`;
- }
- card += `
- </div>
- <i class="fa fa-globe inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var totalBlocked = function (data) {
- var card = `
- <div class="col-lg-3 col-md-6 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 adguard-stat bg-aqua">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Queries Blocked</p>`;
- for (var key in data) {
- var e = data[key];
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- card += `<h3 data-toggle="tooltip" data-placement="right" title="${key}">${e[
- "num_blocked_filtering"
- ]
- .toString()
- .replace(/\B(?=(\d{3})+(?!\d))/g, ",")}</h3>`;
- }
- card += `
- </div>
- <i class="fa fa-hand-paper-o inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var avgProcessingTime = function (data) {
- var card = `
- <div class="col-lg-3 col-md-6 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 adguard-stat bg-purple">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Avg Processing Time</p>`;
- for (var key in data) {
- var e = data[key];
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- ms_time = parseFloat(e["avg_processing_time"]) * 1000;
- card += `<h3 data-toggle="tooltip" data-placement="right" title="${key}">${ms_time.toFixed(
- 2
- )} ms</h3>`;
- }
- card += `
- </div>
- <i class="fa fa-group inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var domainsBlocked = function (data) {
- var card = `
- <div class="col-lg-3 col-md-6 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 adguard-stat bg-red">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Domains on Blocklist</p>`;
- for (var key in data) {
- var e = data[key];
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- var total_domains_blocked = 0;
- for (var key in e["filters"]) {
- total_domains_blocked += parseFloat(e["filters"][key]["rules_count"]);
- }
- card += `<h3 data-toggle="tooltip" data-placement="right" title="${key}">${total_domains_blocked
- .toString()
- .replace(/\B(?=(\d{3})+(?!\d))/g, ",")}</h3>`;
- }
- card += `
- </div>
- <i class="fa fa-list inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var domainsBlocked = function (data) {
- var card = `
- <div class="col-lg-3 col-md-6 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 adguard-stat bg-red">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Domains on Blocklist</p>`;
- for (var key in data) {
- var e = data[key];
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- var total_domains_blocked = 0;
- for (var key in e["filters"]) {
- total_domains_blocked += parseFloat(e["filters"][key]["rules_count"]);
- }
- total_domains_blocked += Object.keys(e["user_rules"]).length;
- card += `<h3 data-toggle="tooltip" data-placement="right" title="${key}">${total_domains_blocked
- .toString()
- .replace(/\B(?=(\d{3})+(?!\d))/g, ",")}</h3>`;
- }
- card += `
- </div>
- <i class="fa fa-list inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var percentBlocked = function (data) {
- var card = `
- <div class="col-lg-3 col-md-6 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 adguard-stat bg-yellow">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Percent Blocked</p>`;
- for (var key in data) {
- var e = data[key];
- if (typeof e["FTLnotrunning"] == "undefined") {
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- var percent =
- 100 *
- (parseFloat(e["num_blocked_filtering"]) /
- parseFloat(e["num_dns_queries"]));
- card += `<h3 data-toggle="tooltip" data-placement="right" title="${key}">${percent.toFixed(
- 2
- )}%</h3>`;
- }
- }
- card += `
- </div>
- <i class="fa fa-pie-chart inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- if (combine) {
- stats += '<div class="row">';
- if (array["options"]["queries"]) {
- stats += totalQueries(array["data"]);
- }
- if (array["options"]["blocked_count"]) {
- stats += totalBlocked(array["data"]);
- }
- if (array["options"]["blocked_percent"]) {
- stats += percentBlocked(array["data"]);
- }
- if (array["options"]["processing_time"]) {
- stats += avgProcessingTime(array["data"]);
- }
- if (array["options"]["domain_count"]) {
- stats += domainsBlocked(array["filters"]);
- }
- stats += "</div>";
- } else {
- for (var key in array["data"]) {
- var data = array["data"][key];
- obj = {};
- obj[key] = data;
- stats += '<div class="row">';
- if (array["options"]["queries"]) {
- stats += totalQueries(array["data"]);
- }
- if (array["options"]["blocked_count"]) {
- stats += totalBlocked(array["data"]);
- }
- if (array["options"]["blocked_percent"]) {
- stats += percentBlocked(array["data"]);
- }
- if (array["options"]["processing_time"]) {
- stats += avgProcessingTime(array["data"]);
- }
- if (array["options"]["domain_count"]) {
- stats += domainsBlocked(array["filters"]);
- }
- stats += "</div>";
- }
- }
- return stats;
- }
- function buildPiholeItem(array) {
- var stats = `
- <style>
- .bg-green {
- background-color: #00a65a !important;
- }
-
- .bg-aqua {
- background-color: #00c0ef!important;
- }
-
- .bg-yellow {
- background-color: #f39c12!important;
- }
-
- .bg-red {
- background-color: #dd4b39!important;
- }
-
- .pihole-stat {
- color: #fff !important;
- }
-
- .pihole-stat .card-body h3 {
- font-size: 38px;
- font-weight: 700;
- }
- .pihole-stat .card-body i {
- font-size: 5em;
- float: right;
- color: #ffffff6b;
- }
- .inline-block {
- display: inline-block;
- }
- ul.multi-column {
- column-count: 1;
- column-gap: 2em;
- }
- @media (min-width: 650px) {
- ul.multi-column {
- column-count: 3;
- }
- }
- @media (min-width: 1200px) {
- ul.multi-column {
- column-count: 5;
- }
- }
- </style>
- `;
- var length = Object.keys(array["data"]).length;
- var combine = array["options"]["combine"];
- var totalQueries = function (data) {
- var card = `
- <div class="col-lg-4 col-md-6 col-sm-6 col-xs-12">
- <div class="card text-white mb-3 pihole-stat bg-green">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Total queries (last 24 hours)</p>`;
- for (var key in data) {
- var e = data[key];
- if (typeof e["FTLnotrunning"] == "undefined") {
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(` + key + `)</p>`;
- }
- let value = "Error";
- if (e.length == undefined) {
- value = e["sum_queries"]
- .toString()
- .replace(/\B(?=(\d{3})+(?!\d))/g, ",");
- }
- card +=
- `<h3 data-toggle="tooltip" data-placement="right" title="` +
- key +
- `">` +
- value +
- `</h3>`;
- }
- }
- card += `
- </div>
- <i class="fa fa-globe inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var totalBlocked = function (data) {
- var card = `
- <div class="col-lg-4 col-md-6 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 pihole-stat bg-aqua">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Queries Blocked (last 24 hours)</p>`;
- for (var key in data) {
- var e = data[key];
- if (typeof e["FTLnotrunning"] == "undefined") {
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- let value = "Error";
- if (e.length == undefined) {
- value = e["sum_blocked"]
- .toString()
- .replace(/\B(?=(\d{3})+(?!\d))/g, ",");
- }
- card +=
- `<h3 data-toggle="tooltip" data-placement="right" title="` +
- key +
- `">` +
- value +
- `</h3>`;
- }
- }
- card += `
- </div>
- <i class="fa fa-hand-paper-o inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var percentBlocked = function (data) {
- var card = `
- <div class="col-lg-4 col-md-6 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 pihole-stat bg-yellow">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Percent Blocked (last 24 hours)</p>`;
- for (var key in data) {
- var e = data[key];
- if (typeof e["FTLnotrunning"] == "undefined") {
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- let value = "Error";
- if (e.length == undefined) {
- value = e["percent_blocked"].toFixed(1);
- }
- card +=
- `<h3 data-toggle="tooltip" data-placement="right" title="` +
- key +
- `">` +
- value +
- `</h3>`;
- }
- }
- card += `
- </div>
- <i class="fa fa-pie-chart inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- var domainsBlocked = function (data) {
- var card = `
- <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
- <div class="card bg-inverse text-white mb-3 pihole-stat bg-red">
- <div class="card-body">
- <div class="inline-block">
- <p class="d-inline mr-1">Domains on Blocklist (last 24 hours)</p>`;
- for (var key in data) {
- var e = data[key];
- if (typeof e["FTLnotrunning"] == "undefined") {
- if (length > 1 && !combine) {
- card += `<p class="d-inline text-muted">(${key})</p>`;
- }
- let value = "Error";
- value = e["domains_being_blocked"]
- .map(function (x) {
- return `<li>${x.toString()}</li>`;
- })
- .join("");
- card +=
- `<ul class="multi-column" data-toggle="tooltip" title="` +
- key +
- `">` +
- value +
- `</ul>`;
- }
- }
- card += `
- </div>
- <i class="fa fa-list inline-block" aria-hidden="true"></i>
- </div>
- </div>
- </div>
- `;
- return card;
- };
- if (combine) {
- stats += '<div class="row">';
- stats += totalQueries(array["data"]);
- stats += totalBlocked(array["data"]);
- stats += percentBlocked(array["data"]);
- stats += domainsBlocked(array["data"]);
- stats += "</div>";
- } else {
- for (var key in array["data"]) {
- var data = array["data"][key];
- obj = {};
- obj[key] = data;
- stats += '<div class="row">';
- stats += totalQueries(obj);
- stats += totalBlocked(obj);
- stats += percentBlocked(obj);
- stats += domainsBlocked(obj);
- stats += "</div>";
- }
- }
- return stats;
- }
- function homepagePihole(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepagePiholeRefresh;
- organizrAPI2("GET", "api/v2/homepage/pihole/stats")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderPihole").innerHTML = "";
- if (response.data !== null) {
- buildPihole(response.data);
- $("#homepageOrderPihole").html(buildPihole(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "PiHole-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepagePihole(timeout);
- }, timeout);
- delete timeout;
- }
- function homepageAdGuard(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageAdGuardRefresh;
- organizrAPI2("GET", "api/v2/homepage/adguard/stats")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderAdGuard").innerHTML = "";
- if (response.data !== null) {
- buildAdGuard(response.data);
- $("#homepageOrderAdGuard").html(buildAdGuard(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "AdGuard-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageAdGuard(timeout);
- }, timeout);
- delete timeout;
- }
- function homepageHealthChecks(tags, timeout) {
- tags =
- typeof tags !== "undefined"
- ? tags
- : activeInfo.settings.homepage.options.healthChecksTags;
- if (tags == "") {
- var apiUrl = "api/v2/homepage/healthchecks";
- } else {
- var apiUrl = "api/v2/homepage/healthchecks/" + tags;
- }
- timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageHealthChecksRefresh;
- organizrAPI2("GET", apiUrl)
- .success(function (data) {
- try {
- var response = data.response;
- document.getElementById("homepageOrderhealthchecks").innerHTML = "";
- if (response.data !== null) {
- $("#homepageOrderhealthchecks").html(
- buildHealthChecks(response.data)
- );
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "HealthChecks-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageHealthChecks(tags, timeout);
- }, timeout);
- delete timeout;
- }
- function homepageUnifi(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageUnifiRefresh;
- organizrAPI2("GET", "api/v2/homepage/unifi/data")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderunifi").innerHTML = "";
- if (response.data !== null) {
- $("#homepageOrderunifi").html(buildUnifi(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- var timeoutTitle = "Unifi-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageUnifi(timeout);
- }, timeout);
- delete timeout;
- }
- function homepageDownloader(type, timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageDownloadRefresh;
- switch (type) {
- case "jdownloader":
- var action = "getJdownloader";
- break;
- case "sabnzbd":
- var action = "getSabnzbd";
- break;
- case "nzbget":
- var action = "getNzbget";
- break;
- case "transmission":
- var action = "getTransmission";
- break;
- case "sonarr":
- var action = "getSonarrQueue";
- break;
- case "radarr":
- var action = "getRadarrQueue";
- break;
- case "qBittorrent":
- var action = "getqBittorrent";
- break;
- case "deluge":
- var action = "getDeluge";
- break;
- case "rTorrent":
- var action = "getrTorrent";
- break;
- case "utorrent":
- var action = "getutorrent";
- break;
- default:
- }
- let lowerType = type.toLowerCase();
- organizrAPI2("GET", "api/v2/homepage/" + lowerType + "/queue")
- .success(function (data) {
- try {
- let response = data.response;
- if (response.data !== null) {
- buildDownloaderItem(response.data, type);
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = type + "-Downloader-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageDownloader(type, timeout);
- }, timeout);
- delete timeout;
- }
- function homepageStream(type, timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageStreamRefresh;
- organizrAPI2("GET", "api/v2/homepage/" + type + "/streams")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById(
- "homepageOrder" + type + "nowplaying"
- ).innerHTML = "";
- $("#homepageOrder" + type + "nowplaying").html(
- buildStream(response.data, type)
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = type + "-Stream-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageStream(type, timeout);
- }, timeout);
- delete timeout;
- }
- function homepageRecent(type, timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageRecentRefresh;
- switch (type) {
- case "plex":
- var action = "getPlexRecent";
- break;
- case "emby":
- case "jellyfin":
- var action = "getEmbyRecent";
- break;
- default:
- }
- organizrAPI2("GET", "api/v2/homepage/" + type + "/recent")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrder" + type + "recent").innerHTML =
- "";
- $("." + type + "-recent").trigger("destroy.owl.carousel");
- $("#homepageOrder" + type + "recent").html(
- buildRecent(response.data, type)
- );
- $(".recent-items").owlCarousel({
- nav: false,
- autoplay: false,
- dots: false,
- margin: 10,
- autoWidth: true,
- items: 4,
- });
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = type + "-Recent-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageRecent(type, timeout);
- }, timeout);
- delete timeout;
- }
- function homepagePlaylist(type, timeout = 30000) {
- organizrAPI2("GET", "api/v2/homepage/" + type + "/playlists")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrder" + type + "playlist").innerHTML =
- "";
- $("#homepageOrder" + type + "playlist").html(
- buildPlaylist(response.data, type)
- );
- $(".playlist-items").owlCarousel({
- nav: false,
- autoplay: false,
- dots: false,
- margin: 10,
- autoWidth: true,
- items: 4,
- });
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function defaultRequestFilter(service) {
- switch (service) {
- case "ombi":
- var defaultFilter = {
- "request-filter-approved-ombi":
- activeInfo.settings.homepage.ombi.ombiDefaultFilterApproved,
- "request-filter-unapproved-ombi":
- activeInfo.settings.homepage.ombi.ombiDefaultFilterUnapproved,
- "request-filter-available-ombi":
- activeInfo.settings.homepage.ombi.ombiDefaultFilterAvailable,
- "request-filter-unavailable-ombi":
- activeInfo.settings.homepage.ombi.ombiDefaultFilterUnavailable,
- "request-filter-denied-ombi":
- activeInfo.settings.homepage.ombi.ombiDefaultFilterDenied,
- };
- $.each(defaultFilter, function (i, v) {
- if (v == false) {
- $("#" + i).click();
- }
- });
- case "overseerr":
- var defaultFilter = {
- "request-filter-approved-overseerr":
- activeInfo.settings.homepage.overseerr.overseerrDefaultFilterApproved,
- "request-filter-unapproved-overseerr":
- activeInfo.settings.homepage.overseerr
- .overseerrDefaultFilterUnapproved,
- "request-filter-available-overseerr":
- activeInfo.settings.homepage.overseerr
- .overseerrDefaultFilterAvailable,
- "request-filter-unavailable-overseerr":
- activeInfo.settings.homepage.overseerr
- .overseerrDefaultFilterUnavailable,
- "request-filter-denied-overseerr":
- activeInfo.settings.homepage.overseerr.overseerrDefaultFilterDenied,
- };
- $.each(defaultFilter, function (i, v) {
- if (v == false) {
- $("#" + i).click();
- }
- });
- }
- }
- function homepageRequests(service, timeout) {
- switch (service) {
- case "ombi":
- var apiUrl = "api/v2/homepage/ombi/requests";
- var div = "homepageOrderombi";
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.ombiRefresh;
- break;
- case "overseerr":
- var apiUrl = "api/v2/homepage/overseerr/requests";
- var div = "homepageOrderoverseerr";
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.overseerrRefresh;
- break;
- default:
- return false;
- }
- organizrAPI2("GET", apiUrl)
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById(div).innerHTML = "";
- if (response.data.content !== false) {
- $("#" + div).html(buildRequest(service, div, response.data));
- }
- $(".request-items-" + service).owlCarousel({
- nav: false,
- autoplay: false,
- dots: false,
- margin: 10,
- autoWidth: true,
- items: 4,
- });
- // Default Filter
- defaultRequestFilter(service);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- if (typeof timeouts[service + "-Requests-Homepage"] !== "undefined") {
- clearTimeout(timeouts[service + "-Requests-Homepage"]);
- }
- timeouts[service + "-Requests-Homepage"] = setTimeout(function () {
- homepageRequests(service, timeout);
- }, timeout);
- delete timeout;
- }
- function testAPIConnection(service, data = "") {
- messageSingle(
- "",
- " Testing now...",
- activeInfo.settings.notifications.position,
- "#FFF",
- "info",
- "60000"
- );
- organizrAPI2("POST", "api/v2/test/" + service, data)
- .success(function (data) {
- try {
- let response = data.response;
- messageSingle(
- "",
- " API Connection Success",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "10000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "API Error");
- });
- }
- function getUnifiSite() {
- messageSingle(
- "",
- " Grabbing now...",
- activeInfo.settings.notifications.position,
- "#FFF",
- "info",
- "10000"
- );
- organizrAPI2("POST", "api/v2/test/unifi/site", {})
- .success(function (data) {
- try {
- var response = data.response;
- if (response.data !== false) {
- var sites = "";
- if (response.data.data) {
- $.each(response.data.data, function (i, v) {
- sites +=
- '<div class="form-group row"><div class="col-sm-12"><h4 class="mouse" onclick="unifiSiteApply(\'' +
- v.name +
- "')\">" +
- v.desc +
- "</h4></div></div>";
- });
- } else {
- //console.log('no');
- }
- var div =
- `
- <div class="row">
- <div class="col-12">
- <div class="card m-b-0">
- <div class="form-horizontal">
- <div class="card-body">
- <h4 class="card-title" lang="en">Choose Unifi Site</h4>
- ` +
- sites +
- `
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- });
- } else {
- messageSingle(
- "API Connection Failed",
- response.data,
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "10000"
- );
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "API Error");
- });
- }
- function unifiSiteApply(name) {
- $("#homepage-UniFi-form [name=unifiSiteName]").val(name);
- $("#homepage-UniFi-form [name=unifiSiteName]").change();
- swal.close();
- messageSingle(
- "",
- " Grabbed Site - Please Save Now",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "10000"
- );
- }
- function homepageCalendar(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.calendarRefresh;
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- $(".fc-toolbar").addClass("fc-alternate");
- }
- organizrAPI2("GET", "api/v2/homepage/calendar")
- .success(function (data) {
- try {
- let response = data.response;
- $("#calendar").fullCalendar("removeEvents");
- $("#calendar").fullCalendar("addEventSource", response.data.events);
- $("#calendar").fullCalendar("addEventSource", response.data.ical);
- $("#calendar").fullCalendar("today");
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- if (typeof timeouts["calendar-Homepage"] !== "undefined") {
- clearTimeout(timeouts["calendar-Homepage"]);
- }
- timeouts["calendar-Homepage"] = setTimeout(function () {
- homepageCalendar(timeout);
- }, timeout);
- delete timeout;
- }
- function buildTautulliItem(array) {
- var cards = "";
- var homestats = array.homestats.data;
- var libstats = array.libstats;
- var options = array.options;
- var friendlyName = array.options.friendlyName;
- var buildLibraries = function (data) {
- var libs = data.data;
- var movies = [];
- var tv = [];
- var audio = [];
- libs.forEach((e) => {
- switch (e["section_type"]) {
- case "movie":
- movies.push(e);
- break;
- case "show":
- tv.push(e);
- break;
- case "artist":
- audio.push(e);
- break;
- default:
- break;
- }
- });
- movies = movies.sort((a, b) =>
- parseInt(a["count"]) > parseInt(b["count"]) ? -1 : 1
- );
- tv = tv.sort((a, b) =>
- parseInt(a["count"]) > parseInt(b["count"]) ? -1 : 1
- );
- audio = audio.sort((a, b) =>
- parseInt(a["count"]) > parseInt(b["count"]) ? -1 : 1
- );
- var buildCard = function (type, data) {
- var extraField = null;
- var section_name = null;
- if (type == "movie") {
- extraField = "Movies";
- section_name = "Movie Libraries";
- } else if (type == "show") {
- extraField = "Shows/Seasons/Episodes";
- section_name = "TV Show Libraries";
- } else if (type == "artist") {
- extraField = "Artists/Albums/Tracks";
- section_name = "Music Libraries";
- }
- var cardTitle =
- '<th><span class="pull-left cardTitle">' +
- section_name.toUpperCase() +
- '</span><span class="pull-right cardCountType">' +
- extraField.toUpperCase() +
- "</th>";
- var card =
- `
- <div class="col-lg-4 col-md-6 col-sm-12 col-xs-12">
- <div class="card text-white mb-3 homepage-tautulli-card library-card">
- <div class="card-body h-100 bg-org-alt">
- <table class="h-100 w-100">
- <tr>
- <td rowspan='2' class="poster-td text-center"><img src="data/cache/tautulli-` +
- type +
- `.svg" class="lib-icon" alt="library icon"></td>
- ${cardTitle}
- </tr>
- <tr>
- <td>
- <div class="scrollable default-scroller">`;
- for (var i = 0; i < data.length; i++) {
- var rowType =
- i == 0
- ? "tautulliFirstItem"
- : i == data.length - 1
- ? "tautulliLastItem"
- : "";
- var rowValue = "";
- var firstDivCol = "";
- var secondDivCol = "";
- if (type == "movie") {
- rowValue = data[i]["count"];
- firstDivCol = "col-md-9";
- secondDivCol = "col-md-2";
- } else {
- rowValue =
- data[i]["count"] +
- '<span class="tautulliSeparator"> / </span>' +
- data[i]["parent_count"] +
- '<span class="tautulliSeparator"> / </span>' +
- data[i]["child_count"];
- firstDivCol = "col-md-5";
- secondDivCol = "col-md-6";
- }
- card += `
- <div class="cardListItem elip row w-100 p-r-0 m-0 ${rowType}">
- <div class="tautulliRank col-md-1 p-0">${
- i + 1
- }</div>
- <div class="${firstDivCol} p-0 text-left elip"> ${
- data[i]["section_name"]
- }</div>
- <div class="${secondDivCol} cardListCount text-right m-l-10 p-0">${rowValue}</div>
- </div>
- `;
- }
- card += `
- </div>
- </td>
- </tr>
- </table>
- </div>
- </div>
- </div>`;
- return card;
- };
- var card = movies.length > 0 ? buildCard("movie", movies) : "";
- card += tv.length > 0 ? buildCard("show", tv) : "";
- card += audio.length > 0 ? buildCard("artist", audio) : "";
- return card;
- };
- var buildStats = function (data, stat, friendlyName = true) {
- var card = "";
- data.forEach((e) => {
- let classes = "";
- if (e["stat_id"] == stat && e["rows"].length > 0) {
- if (stat === "top_platforms") {
- classes = " platform-" + e["rows"][0]["platform_name"] + "-rgba";
- } else {
- classes = " bg-org-alt";
- }
- card += `
- <div class="col-xl-3 col-lg-4 col-md-6 col-sm-12 col-xs-12">
- <div class="card text-white mb-3 homepage-tautulli-card">`;
- if (stat !== "top_users" && stat !== "top_platforms") {
- card +=
- `
- <div class="bg-img-cont">
- <img class="bg-img" src="` +
- e["rows"][0]["art"] +
- `" alt="background art">
- </div>
- `;
- }
- card +=
- `
- <div class="card-body h-100` +
- classes +
- `">
- <table class="h-100 w-100">
- <tr>`;
- if (stat == "top_users") {
- card +=
- `<td rowspan="2" class="poster-td text-center"><img src="` +
- e["rows"][0]["user_thumb"] +
- `" class="poster avatar" alt="user avatar"></td>`;
- } else if (stat == "top_platforms") {
- card +=
- `<td rowspan="2" class="poster-td text-center"><img src="data/cache/tautulli-` +
- e["rows"][0]["platform_name"] +
- `.svg" class="poster" alt="platform icon"></td>`;
- } else {
- card +=
- `<td rowspan="2" class="poster-td"><img src="` +
- e["rows"][0]["thumb"] +
- `" class="poster" alt="movie poster"></td>`;
- }
- var extraField = null;
- if (e["stat_title"].includes("Popular")) {
- extraField = "users";
- } else if (
- e["stat_title"].includes("Watched") ||
- e["stat_title"].includes("Active")
- ) {
- extraField = "plays";
- }
- var cardTitle =
- '<th><span class="pull-left cardTitle">' +
- e["stat_title"].toUpperCase() +
- '</span><span class="pull-right cardCountType">' +
- extraField.toUpperCase() +
- "</th>";
- card +=
- cardTitle +
- `
- </tr>
- <tr>
- <td><div class="scrollable default-scroller">`;
- for (var i = 0; i < e["rows"].length; i++) {
- var item = e["rows"][i];
- var rowType =
- i == 0
- ? "tautulliFirstItem"
- : i == e["rows"].length - 1
- ? "tautulliLastItem"
- : "";
- var rowNameValue = "";
- var rowValue = "";
- if (stat == "top_users") {
- if (friendlyName) {
- rowNameValue = item["friendly_name"];
- } else {
- rowNameValue = item["user"];
- }
- rowValue = item["total_plays"];
- } else if (stat == "top_platforms") {
- rowNameValue = item["platform"];
- rowValue = item["total_plays"];
- } else if (extraField == "users") {
- rowNameValue = item["title"];
- rowValue = item["users_watched"];
- } else {
- rowNameValue = item["title"];
- rowValue = item["total_plays"];
- }
- card += `
- <div class="cardListItem elip row w-100 p-r-0 m-0 ${rowType}">
- <div class="tautulliRank col-md-1 p-0">${
- i + 1
- }</div>
- <div class="col-md-9 p-0 text-left elip">${rowNameValue}</div>
- <div class="col-md-2 cardListCount text-right m-l-10 p-0">${rowValue}</div>
- </div>`;
- }
- card += `
- </div></td>
- </tr>
- </table>
- </div>
- </div>
- </div>`;
- } else {
- return "";
- }
- });
- return card;
- };
- cards += '<div class="row tautulliTop">';
- cards += options["libraries"] ? buildLibraries(libstats) : "";
- cards += options["popularMovies"]
- ? buildStats(homestats, "popular_movies")
- : "";
- cards += options["popularTV"] ? buildStats(homestats, "popular_tv") : "";
- cards += options["topMovies"] ? buildStats(homestats, "top_movies") : "";
- cards += options["topTV"] ? buildStats(homestats, "top_tv") : "";
- cards += options["topUsers"]
- ? buildStats(homestats, "top_users", friendlyName)
- : "";
- cards += options["topPlatforms"]
- ? buildStats(homestats, "top_platforms")
- : "";
- cards += "</div>";
- cards += '<div class="row tautulliLibraries">';
- cards += "</div>";
- return cards;
- }
- function buildTautulli(array) {
- if (array === false) {
- return "";
- }
- var html = `
- <div id="allTautulli">
- <div class="el-element-overlay row">`;
- if (array["options"]["title"]) {
- html +=
- `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span class="mouse" onclick="homepageTautulli()">` +
- activeInfo.settings.homepage.options.titles.tautulli +
- `</span> : </h4><h4 class="pull-left"> </h4>
- <hr class="hidden-xs ml-2">
- </div>
- <div class="clearfix"></div>
- `;
- }
- html +=
- `
- <div class="tautulliCards col-sm-12 my-3">
- ` +
- buildTautulliItem(array) +
- `
- </div>
- </div>
- </div>
- `;
- return array ? html : "";
- }
- function homepageTautulli(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageTautulliRefresh;
- organizrAPI2("GET", "api/v2/homepage/tautulli/data")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrdertautulli").innerHTML = "";
- if (response.data !== null) {
- $("#homepageOrdertautulli").html(buildTautulli(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "Tautulli-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageTautulli(timeout);
- }, timeout);
- delete timeout;
- }
- function weatherIcon(code, daytime = true) {
- switch (code) {
- case 1:
- case 2:
- return daytime ? "wi-day-sunny" : "wi-night-clear";
- case 3:
- case 4:
- case 5:
- case 6:
- case 22:
- return daytime ? "wi-day-sunny-overcast" : "wi-night-alt-partly-cloudy";
- case 7:
- case 8:
- case 9:
- return daytime ? "wi-day-cloudy-high" : "wi-night-partly-cloudy";
- case 10:
- case 11:
- case 12:
- return daytime ? "wi-day-thunderstorm" : "wi-night-thunderstorm";
- case 13:
- case 14:
- case 15:
- return daytime ? "wi-day-haze" : "wi-night-cloudy-windy";
- case 16:
- case 17:
- case 18:
- return daytime ? "wi-day-fog" : "wi-night-fog";
- case 19:
- case 20:
- case 21:
- return daytime ? "wi-day-cloudy-high" : "wi-night-cloudy-high";
- case 23:
- case 25:
- return daytime ? "wi-day-rain" : "wi-night-rain";
- case 24:
- case 26:
- return daytime ? "wi-day-snow" : "wi-night-snow";
- case 27:
- case 28:
- case 30:
- case 31:
- case 33:
- return daytime ? "wi-day-rain-mix" : "wi-night-alt-rain-mix";
- case 29:
- case 32:
- case 34:
- case 35:
- return daytime
- ? "wi-day-snow-thunderstorm"
- : "wi-night-alt-snow-thunderstorm";
- default:
- return daytime ? "wi-day-sunny" : "wi-night-clear";
- }
- }
- function buildWeatherAndAir(array) {
- var returnData = "";
- if (typeof array.content === "undefined") {
- return "";
- }
- if (array.content.weather !== false) {
- if (array.content.weather.error === null) {
- let dates = {};
- $.each(array.content.weather.data, function (i, v) {
- let date = moment(v.datetime).format("YYYY-MM-DD");
- if (typeof dates[date] === "undefined") {
- dates[date] = v;
- dates[date]["temps"] = {
- high: v.temperature.value,
- low: v.temperature.value,
- };
- } else {
- if (moment(v.datetime).format("hh:mm a") == "12:00 pm") {
- dates[date]["icon_code"] = v.icon_code;
- dates[date]["is_day_time"] = v.is_day_time;
- }
- if (v.temperature.value > dates[date]["temps"]["high"]) {
- dates[date]["temps"]["high"] = v.temperature.value;
- }
- if (v.temperature.value < dates[date]["temps"]["low"]) {
- dates[date]["temps"]["low"] = v.temperature.value;
- }
- }
- });
- let weatherItems = '<div class="row">';
- let weatherItemsCount = 0;
- $.each(dates, function (i, v) {
- if (weatherItemsCount === 0) {
- weatherItems +=
- `
- <div class="col-lg-4 col-sm-12 col-xs-12">
- <div class="white-box">
- <h3 class="box-title"><small class="pull-right m-t-10">Feels Like ` +
- Math.round(v.feels_like_temperature.value) +
- `°</small>` +
- moment(v.datetime).format("dddd") +
- `<br/><small class="text-uppercase elip">` +
- v.weather_text +
- `</small></h3>
- <ul class="list-inline two-part" style="margin-top: -13px;">
- <li><i class="wi ` +
- weatherIcon(v.icon_code, v.is_day_time) +
- ` text-info"></i></li>
- <li class="text-right"><span class="counter">` +
- Math.round(v.temperature.value) +
- `<small><sup>°` +
- v.temperature.units +
- `</sup></small></span></li>
- </ul>
- <ul class="list-inline m-b-0">
- <li class="pull-left w-50 hidden-xs"></li>
- <li class="pull-right" style="width:75px"><small><i class="wi wi-strong-wind m-r-5 text-primary tooltip-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Wind"></i>` +
- Math.round(v.wind.speed.value) +
- ` ` +
- v.wind.speed.units +
- `</small></li>
- <li class="pull-right" style="width:75px"><small><i class="wi wi-barometer m-r-5 text-primary tooltip-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Pressure"></i>` +
- Math.round(v.pressure.value) +
- ` ` +
- v.pressure.units +
- `</small></li>
- <li class="pull-right" style="width:45px"><small><i class="wi wi-humidity m-r-5 text-primary tooltip-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Humidity"></i>` +
- Math.round(v.relative_humidity) +
- `</small></li>
- <li class="pull-right" style="width:45px"><small><i class="wi wi-raindrop m-r-5 text-primary tooltip-primary" data-toggle="tooltip" data-placement="top" title="" data-original-title="Dew Point"></i>` +
- Math.round(v.dew_point.value) +
- `°</small></li>
- <div class="clearfix"></div>
- </ul>
- </div>
- </div>
- `;
- } else if (weatherItemsCount !== 5) {
- weatherItems +=
- `
- <div class="col-lg-2 col-sm-3 col-xs-12">
- <div class="white-box">
- <h3 class="box-title">` +
- moment(v.datetime).format("dddd") +
- `</h3>
- <ul class="list-inline two-part">
- <li><i class="wi ` +
- weatherIcon(v.icon_code, v.is_day_time) +
- ` text-info"></i></li>
- <li class="text-right"><span class="counter">` +
- Math.round(v.temps.high) +
- `<small><sup>°` +
- v.temperature.units +
- `</sup></small></span></li>
- </ul>
- <ul class="list-inline m-b-0">
- <li class="pull-left w-100"><small class="text-uppercase elip">` +
- v.weather_text +
- `</small></li>
- <div class="clearfix"></div>
- </ul>
- </div>
- </div>
- `;
- }
- weatherItemsCount++;
- });
- weatherItems += "</div>";
- returnData += weatherItems;
- }
- }
- if (array.content.air !== false) {
- if (array.content.air.error === null) {
- let airItems = '<div class="row">';
- let activeClasses = {
- poor: "",
- low: "",
- moderate: "",
- good: "",
- excellent: "",
- text: "",
- };
- if (array.content.air.data.indexes.baqi.aqi <= 20) {
- activeClasses["poor"] = "active";
- activeClasses["text"] = "text-poor-gradient";
- } else if (array.content.air.data.indexes.baqi.aqi <= 40) {
- activeClasses["low"] = "active";
- activeClasses["text"] = "text-low-gradient";
- } else if (array.content.air.data.indexes.baqi.aqi <= 60) {
- activeClasses["moderate"] = "active";
- activeClasses["text"] = "text-moderate-gradient";
- } else if (array.content.air.data.indexes.baqi.aqi <= 80) {
- activeClasses["good"] = "active";
- activeClasses["text"] = "text-good-gradient";
- } else if (array.content.air.data.indexes.baqi.aqi <= 100) {
- activeClasses["excellent"] = "active";
- activeClasses["text"] = "text-excellent-gradient";
- }
- airItems += `
- <div class="col-lg-4 col-sm-12 col-xs-12">
- <div class="white-box text-white">
- <div class="aqi-scale-component-wrapper">
- <div class="aqi__header">
- <div class="aqi__value">
- <div class="component-wrapper aqi-number ${
- activeClasses["text"]
- }">${
- array.content.air.data.indexes.baqi.aqi
- }</div>
- </div>
- <div class="aqi__text"><h2 >AirQuality Index</h2></div>
- </div>
- <div class="aqi-scale m-t-40">
- <div class="category">
- <div class="chip ${activeClasses["poor"]}">
- <div class="chip__text text-white">Poor</div>
- <div class="chip__bar bg-poor-gradient"></div>
- </div>
- <div class="category__min-value text-white">0</div>
- <div class="category__max-value text-white">20</div>
- </div>
- <div class="category">
- <div class="chip ${activeClasses["low"]}">
- <div class="chip__text text-white">Low</div>
- <div class="chip__bar bg-low-gradient"></div>
- </div>
- <div class="category__max-value text-white">40</div>
- </div>
- <div class="category">
- <div class="chip ${activeClasses["moderate"]}">
- <div class="chip__text text-white">Moderate</div>
- <div class="chip__bar bg-moderate-gradient"></div>
- </div>
- <div class="category__max-value text-white">60</div>
- </div>
- <div class="category">
- <div class="chip ${activeClasses["good"]}">
- <div class="chip__text text-white">Good</div>
- <div class="chip__bar bg-good-gradient"></div>
- </div>
- <div class="category__max-value text-white">80</div>
- </div>
- <div class="category">
- <div class="chip ${activeClasses["excellent"]}">
- <div class="chip__text text-white">Excellent</div>
- <div class="chip__bar bg-excellent-gradient"></div>
- </div>
- <div class="category__max-value text-white">100</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- ${buildPollutant(array.content.air.data.pollutants)}
- ${buildHealthRecommendation(
- array.content.air.data.health_recommendations
- )}
- `;
- airItems += "</div>";
- returnData += airItems;
- }
- }
- if (array.content.pollen !== false) {
- if (array.content.pollen.error === null) {
- }
- }
- return returnData;
- }
- function buildHealthRecommendation(array) {
- var healthHeader = "";
- var healthSection = "";
- $.each(array, function (i, v) {
- var title = i
- .toString()
- .replace("_", " ")
- .toLowerCase()
- .split(" ")
- .map((word) => word.charAt(0).toUpperCase() + word.substring(1))
- .join(" ");
- switch (i) {
- case "general_population":
- var icon = "fa fa-group";
- break;
- case "elderly":
- var icon = "ti ti-wheelchair";
- break;
- case "lung_diseases":
- var icon = "mdi mdi-spray";
- break;
- case "heart_diseases":
- var icon = "mdi mdi-heart-pulse";
- break;
- case "active":
- var icon = "mdi mdi-run-fast";
- break;
- case "pregnant_women":
- var icon = "mdi mdi-human-pregnant";
- break;
- case "children":
- var icon = "fa fa-child";
- break;
- default:
- var icon = "";
- }
- healthHeader +=
- '<li><a href="#section-health-' +
- i +
- '" class="sticon ' +
- icon +
- '"></a></li>';
- healthSection += `
- <section id="section-pollutant-${i}" class="" >
- <h5 class="m-t-0">${title}</h5>
- <span>${v}</span>
- </section>
- `;
- });
- var html = `
- <div class="col-lg-4 hidden-xs hidden-sm">
- <div class="white-box text-white p-0">
- <!-- Tabstyle start -->
- <section class="">
- <div class="sttabs sttabs-main-weather-health-div tabs-style-iconbox">
- <nav>
- <ul>${healthHeader}</ul>
- </nav>
- <div class="content-wrap health-and-pollutant-section default-scroller">${healthSection}</div>
- <!-- /content -->
- </div>
- <!-- /tabs -->
- </section>
- <!-- Tabstyle start -->
- </div>
- </div>
- <script>
- (function() {
- [].slice.call(document.querySelectorAll('.sttabs-main-weather-health-div')).forEach(function(el) {
- new CBPFWTabs(el);
- });
- })();
- </script>`;
- return html;
- }
- function buildPollutant(array) {
- var pollutantHeader = "";
- var pollutantSection = "";
- $.each(array, function (i, v) {
- pollutantHeader +=
- '<li><a href="#section-pollutant-' +
- i +
- '" class="sticon"><strong>' +
- v.display_name +
- '</strong><br/><small class="elip">' +
- v.concentration.value +
- " " +
- v.concentration.units +
- "</small></a></li>";
- pollutantSection += `
- <section id="section-pollutant-${i}">
- <h5 class="m-t-0">${v.full_name}</h5>
- <h6>Sources</h6>
- <span>${v.sources_and_effects.sources}</span>
- <hr>
- <h6>Effects</h6>
- <span>${v.sources_and_effects.effects}</span>
- </section>
- `;
- });
- var html = `
- <div class="col-lg-4 hidden-xs hidden-sm">
- <div class="white-box text-white p-0">
- <!-- Tabstyle start -->
- <section class="">
- <div class="sttabs sttabs-main-weather-pollutant-div tabs-style-iconbox">
- <nav>
- <ul>${pollutantHeader}</ul>
- </nav>
- <div class="content-wrap health-and-pollutant-section default-scroller">${pollutantSection}</div>
- <!-- /content -->
- </div>
- <!-- /tabs -->
- </section>
- <!-- Tabstyle start -->
- </div>
- </div>
- <script>
- (function() {
- [].slice.call(document.querySelectorAll('.sttabs-main-weather-pollutant-div')).forEach(function(el) {
- new CBPFWTabs(el);
- });
- })();
- </script>`;
- return html;
- }
- function homepageWeatherAndAir(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageWeatherAndAirRefresh;
- organizrAPI2("GET", "api/v2/homepage/weather/data")
- .success(function (data) {
- try {
- let response = data.response;
- if (response.data !== null) {
- document.getElementById("homepageOrderWeatherAndAir").innerHTML = "";
- $("#homepageOrderWeatherAndAir").html(
- buildWeatherAndAir(response.data)
- );
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "WeatherAndAir-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageWeatherAndAir(timeout);
- }, timeout);
- delete timeout;
- }
- function buildMonitorrItem(array) {
- var cards = "";
- var options = array["options"];
- var services = array["services"];
- var tabName = "";
- var buildCard = function (name, data) {
- if (data.status == true) {
- var statusColor = "success";
- var imageText = "fa fa-check-circle text-success";
- } else if (data.status == "unresponsive") {
- var statusColor = "warning animated-3 loop-animation flash";
- var imageText = "fa fa-times-circle text-warning";
- } else {
- var statusColor = "danger animated-3 loop-animation flash";
- var imageText = "fa fa-times-circle text-danger";
- }
- if (typeof data.link !== "undefined" && data.link.includes("#")) {
- tabName = data.link.substring(data.link.indexOf("#") + 1);
- console.log(tabName);
- // Need to rework tabActions
- monitorrLink =
- '<a href="javascript:void(0)" onclick="tabActions(event,\'' +
- tabName +
- "',1)\">";
- } else if (typeof data.link !== "undefined") {
- monitorrLink = '<a href="' + data.link + '" target="_blank">';
- }
- if (options["compact"]) {
- var card =
- `
- <div class="col-xl-2 col-lg-3 col-md-4 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 monitorr-card">
- <div class="card-body bg-org-alt pt-1 pb-1">
- <div class="d-flex no-block align-items-center">
- <div class="left-health bg-` +
- statusColor +
- `"></div>
- <div class="ml-1 w-100">
- <i class="` +
- imageText +
- ` font-20 pull-right mt-3 mb-2"></i>
- `;
- if (typeof data.link !== "undefined") {
- card += monitorrLink;
- }
- card +=
- `<h3 class="d-flex no-block align-items-center mt-2 mb-2"><img class="lazyload loginTitle" src="` +
- data.image +
- `"> ` +
- name +
- `</h3>
- `;
- if (typeof data.link !== "undefined") {
- card += `</a>`;
- }
- card += `<div class="clearfix"></div>
- </div>
- </div>
- </div>
- </div>
- </div>`;
- } else {
- var card = `
- <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6">
- <div class="card bg-inverse text-white mb-3 monitorr-card">
- <div class="card-body bg-org-alt text-center">
- `;
- if (typeof data.link !== "undefined") {
- card += `<a href="` + data.link + `" target="_blank">`;
- }
- card +=
- `<div class="d-block">
- <h3 class="mt-0 mb-3">` +
- name +
- `</h3>
- <img class="monitorrImage" src="` +
- data.image +
- `" alt="service icon">
- </div>
- <div class="d-inline-block mt-4 py-2 px-4 badge indicator bg-` +
- statusColor +
- `">
- <p class="mb-0">`;
- if (data.status == true) {
- card += "ONLINE";
- } else if (data.status == "unresponsive") {
- card += "UNRESPONSIVE";
- } else {
- card += "OFFLINE";
- }
- card += `</p>
- </div>
- `;
- if (typeof data.link !== "undefined") {
- card += `</a>`;
- }
- card += `</div>
- </div>
- </div>
- `;
- }
- return card;
- };
- for (var key in services) {
- cards += buildCard(key, services[key]);
- }
- return cards;
- }
- function buildMonitorr(array) {
- if (array === false) {
- return "";
- }
- if (array.error != undefined) {
- organizrConsole("Monitorr Function", array.error, "error");
- } else {
- var services =
- typeof array.services !== "undefined"
- ? Object.keys(array.services).length
- : false;
- var html = `
- <div id="allMonitorr">
- <div class="el-element-overlay row">`;
- if (array["options"]["titleToggle"]) {
- html +=
- `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">` +
- array["options"]["title"] +
- `</span> : </h4><h4 class="pull-left"> <span class="label label-info m-l-20 checkbox-circle good-monitorr-services mouse" onclick="homepageMonitorr()">` +
- services +
- `</span></h4></h4>
- <hr class="hidden-xs ml-2">
- </div>
- <div class="clearfix"></div>
- `;
- }
- html +=
- `
- <div class="monitorrCards">
- ` +
- buildMonitorrItem(array) +
- `
- </div>
- </div>
- </div>
- <div class="clearfix"></div>
- `;
- }
- return array ? html : "";
- }
- function homepageMonitorr(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepagePiholeRefresh;
- organizrAPI2("GET", "api/v2/homepage/monitorr/data")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderMonitorr").innerHTML = "";
- if (response.data !== null) {
- buildMonitorr(response.data);
- $("#homepageOrderMonitorr").html(buildMonitorr(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "Monitorr-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageMonitorr(timeout);
- }, timeout);
- delete timeout;
- }
- function buildUptimeKumaItem(array) {
- var cards = "";
- var options = array["options"];
- var services = array["data"];
- var tabName = "";
- var buildCard = function (name, data) {
- if (data.status == true) {
- var statusColor = "success";
- var imageText = "fa fa-check-circle text-success";
- } else {
- var statusColor = "danger animated-3 loop-animation flash";
- var imageText = "fa fa-times-circle text-danger";
- }
- tabName = data.name;
- kumaLink =
- '<a href="javascript:void(0)" onclick="tabActions(event,\'' +
- tabName +
- "',1)\">";
- if (options["compact"]) {
- var card =
- `
- <div class="col-xl-2 col-lg-3 col-md-4 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 monitorr-card">
- <div class="card-body bg-org-alt pt-1 pb-1">
- <div class="d-flex no-block align-items-center">
- <div class="left-health bg-` +
- statusColor +
- `"></div>
- <div class="ml-1 w-100">
- <i class="` +
- imageText +
- ` font-20 pull-right mt-3 mb-2"></i>
- `;
- if (typeof data.url !== "undefined") {
- card += kumaLink;
- }
- card +=
- `<h3 class="d-flex no-block align-items-center mt-2 mb-2"><img class="lazyload loginTitle"> ` +
- data.name;
- if (data.latency != null && options.showLatency) {
- card +=
- `<span class="ml-3 font-12 align-self-center text-dark">` +
- data.latency +
- `ms</span></h3>`;
- }
- card += `</h3>`;
- if (typeof data.url !== "undefined") {
- card += `</a>`;
- }
- card += `<div class="clearfix"></div>
- </div>
- </div>
- </div>
- </div>
- </div>`;
- } else {
- var card = `
- <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6">
- <div class="card bg-inverse text-white mb-3 monitorr-card">
- <div class="card-body bg-org-alt text-center">
- `;
- if (typeof data.url !== "undefined") {
- card += `<a href="` + data.url + `" target="_blank">`;
- }
- card +=
- `<div class="d-block">
- <h3 class="mt-0 mb-2">` +
- data.name +
- `</h3>`;
- if (data.latency != null && options.showLatency) {
- card += `<p class="text-dark mb-0">` + data.latency + `ms</p>`;
- }
- card +=
- `</div>
- <div class="d-inline-block mt-4 py-2 px-4 badge indicator bg-` +
- statusColor +
- `">
- <p class="mb-0">`;
- if (data.status == true) {
- card += "ONLINE";
- } else {
- card += "OFFLINE";
- }
- card += `</p>
- </div>
- `;
- if (typeof data.url !== "undefined") {
- card += `</a>`;
- }
- card += `</div>
- </div>
- </div>
- `;
- }
- return card;
- };
- for (var key in services) {
- cards += buildCard(key, services[key]);
- }
- return cards;
- }
- function buildUptimeKuma(array) {
- if (array === false) {
- return "";
- }
- if (array.error != undefined) {
- organizrConsole("Uptime Kuma Function", array.error, "error");
- } else {
- var html = `
- <div id="allUptimeKuma">
- <div class="el-element-overlay row">`;
- if (array["options"]["titleToggle"]) {
- html +=
- `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">` +
- array["options"]["title"] +
- `</span> : </h4>
- <hr class="hidden-xs ml-2">
- </div>
- <div class="clearfix"></div>
- `;
- }
- html +=
- `
- <div class="uptimeKumaCards">
- ` +
- buildUptimeKumaItem(array) +
- `
- </div>
- </div>
- </div>
- <div class="clearfix"></div>
- `;
- }
- return array ? html : "";
- }
- function homepageUptimeKuma(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageUptimeKumaRefresh;
- organizrAPI2("GET", "api/v2/homepage/kuma/data")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderUptimeKuma").innerHTML = "";
- if (response.data !== null) {
- buildUptimeKuma(response.data);
- $("#homepageOrderUptimeKuma").html(buildUptimeKuma(response.data));
- }
- } catch (e) {
- console.log(e);
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "UptimeKuma-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageUptimeKuma(timeout);
- }, timeout);
- delete timeout;
- }
- function buildPromPageItem(array) {
- var cards = "";
- var options = array["options"];
- var services = array["data"];
- var tabName = "";
- console.log(options);
- var buildCard = function (name, data) {
- if (data.status == true) {
- var statusColor = "success";
- var imageText = "fa fa-check-circle text-success";
- } else {
- var statusColor = "danger animated-3 loop-animation flash";
- var imageText = "fa fa-times-circle text-danger";
- }
- tabName = data.name;
- if (options["compact"]) {
- var card =
- `
- <div class="col-xl-2 col-lg-3 col-md-4 col-sm-6 col-xs-12">
- <div class="card bg-inverse text-white mb-3 monitorr-card">
- <div class="card-body bg-org-alt pt-1 pb-1">
- <div class="d-flex no-block align-items-center">
- <div class="left-health bg-` +
- statusColor +
- `"></div>
- <div class="ml-1 w-100">
- <i class="` +
- imageText +
- ` font-20 pull-right mt-3 mb-2"></i>
- `;
- card +=
- `<h3 class="d-flex no-block align-items-center mt-2 mb-2"><img class="lazyload loginTitle"> ` +
- data.name;
- if (data.uptime != null && options.showUptime) {
- card +=
- `<span class="ml-3 font-12 align-self-center text-dark">` +
- Math.round(data.uptime * 100) / 100 +
- `%</span></h3>`;
- }
- card += `</h3>`;
- card += `<div class="clearfix"></div>
- </div>
- </div>
- </div>
- </div>
- </div>`;
- } else {
- var card = `
- <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6">
- <div class="card bg-inverse text-white mb-3 monitorr-card">
- <div class="card-body bg-org-alt text-center">
- `;
- card +=
- `<div class="d-block">
- <h3 class="mt-0 mb-2">` +
- data.name +
- `</h3>`;
- if (data.uptime != null && options.showUptime) {
- card +=
- `<p class="text-dark mb-0">` +
- Math.round(data.uptime * 100) / 100 +
- `%</p>`;
- }
- card +=
- `</div>
- <div class="d-inline-block mt-4 py-2 px-4 badge indicator bg-` +
- statusColor +
- `">
- <p class="mb-0">`;
- if (data.status == true) {
- card += "UP";
- } else {
- card += "DOWN";
- }
- card += `</p>
- </div>
- `;
- card += `</div>
- </div>
- </div>
- `;
- }
- return card;
- };
- for (var key in services) {
- cards += buildCard(key, services[key]);
- }
- return cards;
- }
- function buildPromPage(array) {
- if (array === false) {
- return "";
- }
- if (array.error != undefined) {
- organizrConsole("PromPage Function", array.error, "error");
- } else {
- var html = `
- <div id="allPromPage">
- <div class="el-element-overlay row">`;
- if (array["options"]["titleToggle"]) {
- html +=
- `
- <div class="col-md-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">` +
- array["options"]["title"] +
- `</span> : </h4>
- <hr class="hidden-xs ml-2">
- </div>
- <div class="clearfix"></div>
- `;
- }
- html +=
- `
- <div class="promPageCards">
- ` +
- buildPromPageItem(array) +
- `
- </div>
- </div>
- </div>
- <div class="clearfix"></div>
- `;
- }
- return array ? html : "";
- }
- function homepagePromPage(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepagePromPageRefresh;
- organizrAPI2("GET", "api/v2/homepage/prompage/data")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderPromPage").innerHTML = "";
- if (response.data !== null) {
- buildUptimeKuma(response.data);
- $("#homepageOrderPromPage").html(buildPromPage(response.data));
- }
- } catch (e) {
- console.log(e);
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "PromPage-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepagePromPage(timeout);
- }, timeout);
- delete timeout;
- }
- function homepageSpeedtest(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageSpeedtestRefresh;
- organizrAPI2("GET", "api/v2/homepage/speedtest/data")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderSpeedtest").innerHTML = "";
- if (response.data !== null) {
- $("#homepageOrderSpeedtest").html(buildSpeedtest(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "Speedtest-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageSpeedtest(timeout);
- }, timeout);
- delete timeout;
- }
- function buildSpeedtest(array) {
- if (array === false) {
- return "";
- }
- var html = `
- <style>
- .shadow-sm {
- -webkit-box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,0.075) !important;
- box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,0.075) !important;
- }
- .speedtest-card {
- background-color: #2d2c2c;
- }
- .speedtest-card .text-success {
- color: #07db71 !important;
- }
- .speedtest-card .text-warning {
- color: #fca503 !important;
- }
- .speedtest-card .text-primary {
- color: #3e95cd !important;
- }
- .speedtest-card span.icon {
- font-size: 2em;
- }
- .speedtest-card h5 {
- }
- .speedtest-card h4,
- .speedtest-card h3 {
- font-weight: 450;
- line-height: 1.2;
- }
- .speedtest-card .text-muted,
- .speedtest-card h5 {
- color: #9e9e9e !important;
- }
- </style>
- `;
- var current = array.data.current;
- var average = array.data.average;
- var maximum = array.data.maximum;
- var minimum = array.data.minimum;
- var options = array.options;
- html += `
- <div id="allSpeedtest">
- `;
- if (options.titleToggle) {
- html +=
- `
- <div class="row">
- <div class="col-sm-12">
- <h4 class="pull-left homepage-element-title"><span lang="en">` +
- array["options"]["title"] +
- ` : </h4>
- </div>
- </div>
- `;
- }
- html +=
- `
- <div class="row">
- <div class="my-2 col-lg-4 col-md-4 col-sm-12">
- <div class="card speedtest-card shadow-sm mb-3">
- <div class="card-body">
- <div class="d-flex align-items-center justify-content-between">
- <h4>Ping</h4>
- <span class="ti-pulse icon text-success" />
- </div>
- <div class="text-truncate">
- <h3 class="d-inline">` +
- parseFloat(current.ping).toFixed(1) +
- `</h3>
- <p class="d-inline ml-1 text-white">ms (current)</p>
- </div>`;
- if (average != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(average.ping).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">ms (average)</p>
- </div>
- `;
- }
- if (maximum != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(maximum.ping).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">ms (maximum)</p>
- </div>
- `;
- }
- if (minimum != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(minimum.ping).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">ms (minimum)</p>
- </div>
- `;
- }
- html +=
- ` </div>
- </div>
- </div>
- <div class="my-2 col-lg-4 col-md-4 col-sm-12">
- <div class="card speedtest-card shadow-sm mb-3">
- <div class="card-body">
- <div class="d-flex align-items-center justify-content-between">
- <h4>Download</h4>
- <span class="ti-download icon text-warning" />
- </div>
- <div class="text-truncate">
- <h3 class="d-inline">` +
- parseFloat(current.download).toFixed(1) +
- `</h3>
- <p class="d-inline ml-1 text-white">Mbit/s (current)</p>
- </div>`;
- if (average != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(average.download).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">Mbit/s (average)</p>
- </div>
- `;
- }
- if (maximum != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(maximum.download).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">Mbit/s (maximum)</p>
- </div>
- `;
- }
- if (minimum != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(minimum.download).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">Mbit/s (minimum)</p>
- </div>
- `;
- }
- html +=
- ` </div>
- </div>
- </div>
- <div class="my-2 col-lg-4 col-md-4 col-sm-12">
- <div class="card speedtest-card shadow-sm mb-3">
- <div class="card-body">
- <div class="d-flex align-items-center justify-content-between">
- <h4>Upload</h4>
- <span class="ti-upload icon text-primary" />
- </div>
- <div class="text-truncate">
- <h3 class="d-inline">` +
- parseFloat(current.upload).toFixed(1) +
- `</h3>
- <p class="d-inline ml-1 text-white">Mbit/s (current)</p>
- </div>`;
- if (average != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(average.upload).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">Mbit/s (average)</p>
- </div>
- `;
- }
- if (maximum != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(maximum.upload).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">Mbit/s (maximum)</p>
- </div>
- `;
- }
- if (minimum != undefined) {
- html +=
- `
- <div class="text-truncate text-muted">
- <h5 class="d-inline">` +
- parseFloat(minimum.upload).toFixed(1) +
- `</h5>
- <p class="d-inline ml-1">Mbit/s (minimum)</p>
- </div>
- `;
- }
- html += ` </div>
- </div>
- </div>
- </div>
- </div>
- `;
- return array ? html : "";
- }
- function buildNetdataItem(array) {
- var html = `
- <style>
- .all-netdata .easyPieChart-value {
- position: absolute;
- top: 77px;
- width: 100%;
- text-align: center;
- left: 0;
- font-size: 24.4625px;
- font-weight: normal;
- }
- .all-netdata .easyPieChart-title {
- position: absolute;
- width: 100%;
- text-align: center;
- left: 0;
- font-weight: bold;
- }
- .all-netdata .easyPieChart-units {
- position: absolute;
- top: 118px;
- width: 100%;
- text-align: center;
- left: 0;
- font-size: 15px;
- font-weight: normal;
- }
- .all-netdata .gauge-chart .gauge-value {
- position: relative;
- width: 100%;
- text-align: center;
- top: 30px;
- color: #dcdcdc;
- font-weight: bold;
- left: 0;
- font-size: 26px;
- }
- .all-netdata .gauge-chart .gauge-title {
- position: relative;
- width: 100%;
- text-align: center;
- top: -10px;
- //color: #fff;
- font-weight: bold;
- left: 0;
- font-size: 15px;
- }
- .all-netdata .chart-lg .gauge-chart .gauge-value {
- top: 70px;
- font-size: 26px;
- }
- .all-netdata .chart-lg .gauge-chart .gauge-title {
- top: 45px;
- font-size: 15px;
- }
- .all-netdata .chart-md .gauge-chart .gauge-value {
- top: 65px;
- font-size: 26px;
- }
- .all-netdata .chart-md .gauge-chart .gauge-title {
- top: 45px;
- font-size: 15px;
- }
- .all-netdata .chart-sm .gauge-chart .gauge-value {
- top: 65px;
- font-size: 26px;
- }
- .all-netdata .chart-sm .gauge-chart .gauge-title {
- top: 45px;
- font-size: 15px;
- }
- .all-netdata .chart-lg,
- .all-netdata .chart-md,
- .all-netdata .chart-sm {
- display: inline-block;
- margin: 15px;
- }
- .all-netdata .chart-lg,
- .all-netdata .chart-lg .chart {
- height: 180px;
- width: 180px;
- }
- .all-netdata .chart-md,
- .all-netdata .chart-md .chart {
- height: 160px;
- width: 160px;
- }
- .all-netdata .chart-sm,
- .all-netdata .chart-sm .chart {
- height: 140px;
- width: 140px;
- }
- .all-netdata .chart-lg .gauge-chart,
- .all-netdata .gauge-cont.chart-lg {
- //height: 300px;
- width: 300px;
- }
- .all-netdata .chart-md .gauge-chart,
- .all-netdata .gauge-cont.chart-md {
- //height: 275px;
- width: 275px;
- }
- .all-netdata .chart-sm .gauge-chart,
- .all-netdata .gauge-cont.chart-sm {
- //height: 250px;
- width: 250px;
- }
- .all-netdata .chart-lg .easyPieChart-title {
- top: 37px;
- font-size: 15px;
- }
- .all-netdata .chart-md .easyPieChart-title {
- top: 33px;
- font-size: 13.5px;
- }
- .all-netdata .chart-sm .easyPieChart-title {
- top: 30px;
- font-size: 12px;
- }
- .all-netdata .chart-lg .easyPieChart-value {
- top: 75px;
- font-size: 24.4625px;
- }
- .all-netdata .chart-md .easyPieChart-value {
- top: 65px;
- font-size: 24.4625px;
- }
- .all-netdata .chart-sm .easyPieChart-value {
- top: 55px;
- font-size: 24.4625px;
- }
- .all-netdata .chart-lg .easyPieChart-units {
- top: 130px;
- font-size: 15px;
- }
- .all-netdata .chart-md .easyPieChart-units {
- top: 108px;
- font-size: 15px;
- }
- .all-netdata .chart-sm .easyPieChart-units {
- top: 95px;
- font-size: 15px;
- }
- </style>
- `;
- var buildEasyPieChart = function (e, i, size, easySize, display) {
- return (
- `
- <div class="chart-` +
- size +
- ` my-3 text-center ` +
- display +
- `">
- <div class="chart" id="easyPieChart` +
- (i + 1) +
- `" data-percent="` +
- e.percent +
- `">
- <span class="easyPieChart-title">` +
- e.title +
- `</span>
- <span class="easyPieChart-value" id="easyPieChart` +
- (i + 1) +
- `Value">` +
- parseFloat(e.value).toFixed(1) +
- `</span>
- <span class="easyPieChart-units" id="easyPieChart` +
- (i + 1) +
- `Units">` +
- e.units +
- `</span>
- </div>
- </div>
- <script>
- $(function() {
- var opts = {
- size: ` +
- easySize +
- `,
- lineWidth: 7,
- scaleColor: false,
- barColor: '#` +
- e.colour +
- `',
- trackColor: '#636363',
- };
- if(` +
- e.percent +
- ` == 0) {
- opts.lineCap = 'butt';
- }
- $('#easyPieChart` +
- (i + 1) +
- `').easyPieChart(opts);
- });
- </script>
- `
- );
- };
- var buildGaugeChart = function (e, i, size, easySize, display) {
- switch (size) {
- case "lg":
- easySize = 300;
- break;
- case "sm":
- easySize = 275;
- break;
- case "md":
- default:
- easySize = 250;
- break;
- }
- return (
- `
- <div class="mx-0 gauge-cont chart-` +
- size +
- ` my-3 text-center ` +
- display +
- `">
- <div class="gauge-chart text-center">
- <span class="gauge-title d-block" id="gaugeChart` +
- (i + 1) +
- `Title">` +
- e.title +
- `</span>
- <span class="gauge-value d-block" id="gaugeChart` +
- (i + 1) +
- `Value">` +
- parseFloat(e.value).toFixed(1) +
- `</span>
- <canvas id="gaugeChart` +
- (i + 1) +
- `" style="width: 100%"></canvas>
- </div>
- </div>
- <script>
- $(function() {
- var opts = {
- angle: 0.14, // The span of the gauge arc
- lineWidth: 0.54, // The line thickness
- radiusScale: 1, // Relative radius
- pointer: {
- length: 0.77, // // Relative to gauge radius
- strokeWidth: 0.075, // The thickness
- color: '#A1A1A1' // Fill color
- },
- limitMax: false, // If false, max value increases automatically if value > maxValue
- limitMin: false, // If true, the min value of the gauge will be fixed
- colorStart: '#` +
- e.colour +
- `', // Colors
- colorStop: '#` +
- e.colour +
- `', // just experiment with them
- strokeColor: '#636363', // to see which ones work best for you
- generateGradient: true,
- highDpiSupport: true, // High resolution support
-
- };
- var target = document.getElementById('gaugeChart` +
- (i + 1) +
- `'); // your canvas element
- var gauge = new Gauge(target).setOptions(opts); // create sexy gauge!
- gauge.maxValue = ` +
- e.max +
- `; // set max gauge value
- gauge.setMinValue(0); // Prefer setter over gauge.minValue = 0
- gauge.animationSpeed = 8; // set animation speed (32 is default value)
- gauge.set(` +
- e.percent +
- `); // set actual value
- window.netdata[` +
- (i + 1) +
- `] = gauge
- });
- </script>
- `
- );
- };
- array.forEach((e, i) => {
- var size = e.size;
- var easySize;
- if (size == "") {
- size = "md";
- }
- switch (size) {
- case "lg":
- easySize = 180;
- break;
- case "sm":
- easySize = 140;
- break;
- case "md":
- default:
- easySize = 160;
- break;
- }
- var display = " ";
- if (e.lg) {
- display += " d-xl-inline-block d-lg-inline-block";
- } else {
- display += " d-xl-none d-lg-none d-none";
- }
- if (e.md) {
- display += " d-md-inline-block";
- } else {
- display += " d-md-none d-none";
- }
- if (e.sm) {
- display += " d-sm-inline-block d-xs-inline-block";
- } else {
- display += " d-sm-none d-xs-none d-none";
- }
- display += " ";
- if (e.error) {
- organizrConsole(
- "Netdata Function",
- "(Chart " + (i + 1) + "): " + e.error,
- "error"
- );
- } else if (e.chart == "easypiechart") {
- html += buildEasyPieChart(e, i, size, easySize, display);
- } else if (e.chart == "gauge") {
- html += buildGaugeChart(e, i, size, easySize, display);
- }
- });
- return html;
- }
- function buildNetdata(array) {
- var data = array.data;
- if (array === false) {
- return "";
- }
- window.netdata = [];
- var html = `
- <style>
- .clearfix {
- *zoom: 1;
- }
- .all-netdata .clearfix:before,
- .all-netdata .clearfix:after {
- display: table;
- content: "";
- }
- .all-netdata .clearfix:after {
- clear: both;
- }
-
- .all-netdata .easyPieChart {
- position: relative;
- text-align: center;
- }
-
- .all-netdata .easyPieChart canvas {
- position: absolute;
- top: 0;
- left: 0;
- }
-
- .all-netdata .chart {
- float: left;
- //margin: 10px;
- }
-
- .all-netdata .percentage,
- .all-netdata .label {
- text-align: center;
- color: #333;
- font-weight: 100;
- font-size: 1.2em;
- margin-bottom: 0.3em;
- }
-
- .all-netdata .credits {
- padding-top: 0.5em;
- clear: both;
- color: #999;
- }
-
- .all-netdata .credits a {
- color: #333;
- }
-
- .all-netdata .dark {
- background: #333;
- }
-
- .all-netdata .dark .percentage-light,
- .all-netdata .dark .label {
- text-align: center;
- color: #999;
- font-weight: 100;
- font-size: 1.2em;
- margin-bottom: 0.3em;
- }
-
-
- .all-netdata .button {
- -webkit-box-shadow: inset 0 0 1px #000, inset 0 1px 0 1px rgba(255,255,255,0.2), 0 1px 1px -1px rgba(0, 0, 0, .5);
- -moz-box-shadow: inset 0 0 1px #000, inset 0 1px 0 1px rgba(255,255,255,0.2), 0 1px 1px -1px rgba(0, 0, 0, .5);
- box-shadow: inset 0 0 1px #000, inset 0 1px 0 1px rgba(255,255,255,0.2), 0 1px 1px -1px rgba(0, 0, 0, .5);
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- padding: 6px 20px;
- font-weight: bold;
- text-transform: uppercase;
- display: block;
- margin: 0 auto 2em;
- max-width: 200px;
- text-align: center;
- background-color: #5c5c5c;
- background-image: -moz-linear-gradient(top, #666666, #4d4d4d);
- background-image: -ms-linear-gradient(top, #666666, #4d4d4d);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#666666), to(#4d4d4d));
- background-image: -webkit-linear-gradient(top, #666666, #4d4d4d);
- background-image: -o-linear-gradient(top, #666666, #4d4d4d);
- background-image: linear-gradient(top, #666666, #4d4d4d);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#666666', endColorstr='#4d4d4d', GradientType=0);
- color: #ffffff;
- text-shadow: 0 1px 1px #333333;
- }
- .all-netdata .button:hover {
- color: #ffffff;
- text-decoration: none;
- background-color: #616161;
- background-image: -moz-linear-gradient(top, #6b6b6b, #525252);
- background-image: -ms-linear-gradient(top, #6b6b6b, #525252);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6b6b6b), to(#525252));
- background-image: -webkit-linear-gradient(top, #6b6b6b, #525252);
- background-image: -o-linear-gradient(top, #6b6b6b, #525252);
- background-image: linear-gradient(top, #6b6b6b, #525252);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b6b6b', endColorstr='#525252', GradientType=0);
- }
- .all-netdata .button:active {
- background-color: #575757;
- background-image: -moz-linear-gradient(top, #616161, #474747);
- background-image: -ms-linear-gradient(top, #616161, #474747);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#616161), to(#474747));
- background-image: -webkit-linear-gradient(top, #616161, #474747);
- background-image: -o-linear-gradient(top, #616161, #474747);
- background-image: linear-gradient(top, #616161, #474747);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#616161', endColorstr='#474747', GradientType=0);
- -webkit-transform: translate(0, 1px);
- -moz-transform: translate(0, 1px);
- -ms-transform: translate(0, 1px);
- -o-transform: translate(0, 1px);
- transform: translate(0, 1px);
- }
- .all-netdata .button:disabled {
- background-color: #dddddd;
- background-image: -moz-linear-gradient(top, #e7e7e7, #cdcdcd);
- background-image: -ms-linear-gradient(top, #e7e7e7, #cdcdcd);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e7e7e7), to(#cdcdcd));
- background-image: -webkit-linear-gradient(top, #e7e7e7, #cdcdcd);
- background-image: -o-linear-gradient(top, #e7e7e7, #cdcdcd);
- background-image: linear-gradient(top, #e7e7e7, #cdcdcd);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e7e7e7', endColorstr='#cdcdcd', GradientType=0);
- color: #939393;
- text-shadow: 0 1px 1px #fff;
- }
- </style>
- `;
- html += `
- <div class="row m-b-30">
-
- <div class="d-block text-center all-netdata">
- `;
- html += buildNetdataItem(data);
- html += `
- </div>
-
- </div>`;
- return array ? html : "";
- }
- function homepageNetdata(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageNetdataRefresh;
- organizrAPI2("GET", "api/v2/homepage/netdata/data")
- .success(function (data) {
- try {
- let response = data.response;
- if (!tryUpdateNetdata(response.data.data)) {
- document.getElementById("homepageOrderNetdata").innerHTML = "";
- if (response.data !== null) {
- $("#homepageOrderNetdata").html(buildNetdata(response.data));
- }
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- var timeoutTitle = "Netdata-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageNetdata(timeout);
- }, timeout);
- delete timeout;
- }
- function tryUpdateNetdata(array) {
- var existing = false;
- array.forEach((e, i) => {
- var id = i + 1;
- if (e.chart == "easypiechart") {
- if ($("#easyPieChart" + id).length) {
- $("#easyPieChart" + id)
- .data("easyPieChart")
- .update(e.percent);
- $("#easyPieChart" + id + "Value").html(parseFloat(e.value).toFixed(1));
- existing = true;
- }
- } else if (e.chart == "gauge") {
- if (window.netdata) {
- if (window.netdata[i + 1]) {
- window.netdata[i + 1].set(e.percent); // set actual value
- $("#gaugeChart" + (i + 1) + "Value").html(
- parseFloat(e.value).toFixed(1)
- );
- existing = true;
- }
- } else {
- existing = false;
- }
- } else {
- existing = false;
- }
- });
- return existing;
- }
- function homepageJackett() {
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var header = `
- <div class="col-md-12">
- <h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/jackett.png"> <span lang="en">Jackett</span> </h2>
- <hr class="hidden-xs"><div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- <script>$('.jackett-panel').removeClass('panel panel-default');</script>
- `;
- } else {
- var header = `
- <div class="panel-heading bg-info p-t-10 p-b-10">
- <span class="pull-left m-t-5 text-white"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/jackett.png" > <span lang="en">Jackett</span></span>
- <div class="clearfix"></div>
- </div>
- `;
- }
- let html =
- `
- <div id="jackettSearch" class="row">
- <div class="col-lg-12">
- <div class="jackett-panel panel panel-default">
- ` +
- header +
- `
- <div class="panel-wrapper p-b-0 collapse in">
- <div class="white-box">
- <h3 class="box-title m-b-0" lang="en">Search</h3>
-
- <form onsubmit="searchJackett();return false;">
- <div class="input-group m-b-30">
- <span class="input-group-btn hidden">
- <button type="button" class="btn waves-effect waves-light btn-primary clearJackett" onclick="clearJackett();"><i class="fa fa-eraser"></i></button>
- </span>
- <input id="jackett-search-query" class="form-control" placeholder="Search for..." lang="en">
- <span class="input-group-btn">
- <button type="submit" class="btn waves-effect waves-light btn-info"><i class="fa fa-search"></i></button>
- </span>
- </div>
-
- </form>
-
- <div class="jackettDataTable hidden">
- <h3 class="box-title m-b-0" lang="en">Results</h3>
- <div class="table-responsive">
- <table id="jackettDataTable" class="table table-striped">
- <thead>
- <tr>
- <th lang="en">Date</th>
- <th lang="en">Tracker</th>
- <th lang="en">Name</th>
- <th lang="en">Size</th>
- <th lang="en">Files</th>
- <th lang="en">Grabs</th>
- <th lang="en">Seeds</th>
- <th lang="en">Leechers</th>
- <th lang="en">Download</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- </div>
-
- </div>
- </div>
- </div>
- </div>
- `;
- $("#homepageOrderJackett").html(html);
- }
- function clearJackett() {
- $("#jackett-search-query").val("");
- $(".clearJackett").parent().addClass("hidden");
- $("#jackettDataTable").DataTable().destroy();
- $(".jackettDataTable").addClass("hidden");
- }
- function searchJackett() {
- let query = $("#jackett-search-query").val();
- if (query !== "") {
- $(".jackettDataTable").removeClass("hidden");
- //ajaxloader('#jackettSearch .panel-wrapper', 'in');
- ajaxblocker(".jackett-panel .white-box", "in", "Searching...");
- } else {
- return false;
- }
- $.fn.dataTable.ext.errMode = "none";
- $("#jackettDataTable").DataTable().destroy();
- let preferBlackholeDownload =
- activeInfo.settings.homepage.jackett.homepageJackettBackholeDownload;
- let jackettTable = $("#jackettDataTable")
- .on("error.dt", function (e, settings, techNote, message) {
- console.log("An error has been reported by DataTables: ", message);
- $("#jackettDataTable").DataTable().destroy();
- ajaxblocker(".jackett-panel .white-box");
- $(".clearJackett").parent().removeClass("hidden");
- window.message(
- "Jackett Connection Error",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "5000"
- );
- })
- .DataTable({
- ajax: {
- url: "api/v2/homepage/jackett/" + query,
- dataSrc: function (json) {
- return json.response.data.content.Results;
- },
- },
- columns: [
- {
- data: "PublishDate",
- render: function (data, type, row) {
- if (type === "display" || type === "filter") {
- var m = moment.tz(data, activeInfo.timezone);
- return moment.utc(m, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
- }
- return data;
- },
- },
- { data: "Tracker" },
- {
- data: "Title",
- render: function (data, type, row) {
- if (row.Details !== null) {
- return (
- '<a href="' + row.Details + '" target="_blank">' + data + "</a>"
- );
- } else {
- return data;
- }
- },
- },
- {
- data: "Size",
- render: function (data, type, row) {
- if (type === "display" || type === "filter") {
- return humanFileSize(data, false);
- }
- return humanFileSize(data, false);
- },
- },
- { data: "Files" },
- { data: "Grabs" },
- { data: "Seeders" },
- { data: "Peers" },
- {
- data: "MagnetUri",
- render: function (data, type, row) {
- if (type === "display" || type === "filter") {
- if (
- preferBlackholeDownload === true &&
- row.BlackholeLink !== null
- ) {
- return (
- "<a onclick=\"jackettDownload('" +
- row.BlackholeLink +
- '\');return false;" href="#"><i class="fa fa-cloud-download"></i></a>'
- );
- } else if (data !== null) {
- return (
- '<a href="' +
- data +
- '" target="_blank"><i class="fa fa-magnet"></i></a>'
- );
- } else if (row.Details !== null) {
- return (
- '<a href="' +
- row.Details +
- '" target="_blank"><i class="fa fa-cloud-download"></i></a>'
- );
- } else if (row.Guid !== null) {
- return (
- '<a href="' +
- row.Guid +
- '" target="_blank"><i class="fa fa-cloud-download"></i></a>'
- );
- } else if (row.Link !== null) {
- return (
- '<a href="' +
- row.Link +
- '" target="_blank"><i class="fa fa-download"></i></a>'
- );
- } else {
- return "No Download Link";
- }
- }
- return data;
- },
- },
- ],
- order: [[0, "desc"]],
- initComplete: function (settings, json) {
- //ajaxloader();
- ajaxblocker(".jackett-panel .white-box");
- $(".clearJackett").parent().removeClass("hidden");
- },
- });
- }
- function jackettDownload(url) {
- let blackholeLink = url.substring(url.indexOf("/bh/"));
- var post = {
- url: blackholeLink,
- };
- organizrAPI2("POST", "api/v2/homepage/jackett/download/", post, true)
- .success(function () {
- message(
- "Torrent downloaded",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Error downloading torrent");
- });
- }
- function homepageProwlarr() {
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var header = `
- <div class="col-md-12">
- <h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/prowlarr.png"> <span lang="en">Prowlarr</span> </h2>
- <hr class="hidden-xs"><div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- <script>$('.prowlarr-panel').removeClass('panel panel-default');</script>
- `;
- } else {
- var header = `
- <div class="panel-heading bg-info p-t-10 p-b-10">
- <span class="pull-left m-t-5 text-white"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/prowlarr.png" > <span lang="en">Prowlarr</span></span>
- <div class="clearfix"></div>
- </div>
- `;
- }
- let html =
- `
- <div id="prowlarrSearch" class="row">
- <div class="col-lg-12">
- <div class="prowlarr-panel panel panel-default">
- ` +
- header +
- `
- <div class="panel-wrapper p-b-0 collapse in">
- <div class="white-box">
- <h3 class="box-title m-b-0" lang="en">Search</h3>
-
- <form onsubmit="searchProwlarr();return false;">
- <div class="input-group m-b-30">
- <span class="input-group-btn hidden">
- <button type="button" class="btn waves-effect waves-light btn-primary clearProwlarr" onclick="clearProwlarr();"><i class="fa fa-eraser"></i></button>
- </span>
- <input id="prowlarr-search-query" class="form-control" placeholder="Search for..." lang="en">
- <span class="input-group-btn">
- <button type="submit" class="btn waves-effect waves-light btn-info"><i class="fa fa-search"></i></button>
- </span>
- </div>
-
- </form>
-
- <div class="prowlarrDataTable hidden">
- <h3 class="box-title m-b-0" lang="en">Results</h3>
- <div class="table-responsive">
- <table id="prowlarrDataTable" class="table table-striped">
- <thead>
- <tr>
- <th lang="en">Date</th>
- <th lang="en">Indexer</th>
- <th lang="en">Title</th>
- <th lang="en">Size</th>
- <th lang="en">Grabs</th>
- <th lang="en">Seeders</th>
- <th lang="en">Leechers</th>
- <th lang="en">Download</th>
- </tr>
- </thead>
- <tbody></tbody>
- </table>
- </div>
- </div>
- </div>
-
- </div>
- </div>
- </div>
- </div>
- `;
- $("#homepageOrderProwlarr").html(html);
- }
- function clearProwlarr() {
- $("#prowlarr-search-query").val("");
- $(".clearProwlarr").parent().addClass("hidden");
- $("#prowlarrDataTable").DataTable().destroy();
- $(".prowlarrDataTable").addClass("hidden");
- }
- function searchProwlarr() {
- let query = $("#prowlarr-search-query").val();
- if (query !== "") {
- $(".prowlarrDataTable").removeClass("hidden");
- ajaxloader("#prowlarrSearch .panel-wrapper", "in");
- } else {
- return false;
- }
- $.fn.dataTable.ext.errMode = "none";
- $("#prowlarrDataTable").DataTable().destroy();
- let preferBlackholeDownload =
- activeInfo.settings.homepage.prowlarr.homepageProwlarrBackholeDownload;
- let prowlarrTable = $("#prowlarrDataTable")
- .on("error.dt", function (e, settings, techNote, message) {
- console.log("An error has been reported by DataTables: ", message);
- })
- .DataTable({
- ajax: {
- url: "api/v2/homepage/prowlarr/" + query,
- dataSrc: function (json) {
- return json.response.data.content;
- },
- },
- columns: [
- {
- data: "publishDate",
- render: function (data, type, row) {
- if (type === "display" || type === "filter") {
- var m = moment.tz(data, activeInfo.timezone);
- return moment.utc(m, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
- }
- return data;
- },
- },
- { data: "indexer" },
- {
- data: "title",
- render: function (data, type, row) {
- if (row.Details !== null) {
- return (
- '<a href="' +
- row["infoUrl"] +
- '" target="_blank">' +
- data +
- "</a>"
- );
- } else {
- return data;
- }
- },
- },
- {
- data: "size",
- render: function (data) {
- return humanFileSize(data, false);
- },
- },
- { data: "grabs" },
- { data: "seeders" },
- { data: "leechers" },
- {
- data: "downloadUrl",
- render: function (data, type, row) {
- if (type === "display" || type === "filter") {
- if (data !== null) {
- if (preferBlackholeDownload === true && row.guid !== null) {
- return (
- "<a onclick=\"prowlarrDownload('" +
- row.guid +
- "," +
- row.indexerId +
- '\');return false;" href="#"><i class="fa fa-cloud-download"></i></a>'
- );
- } else {
- return (
- '<a href="' +
- data +
- '" target="_blank"><i class="fa fa-download"></i></a>'
- );
- }
- } else {
- return "No Download Link";
- }
- }
- return data;
- },
- },
- ],
- order: [[5, "desc"]],
- initComplete: function (settings, json) {
- ajaxloader();
- //ajaxblocker('.prowlarr-panel .white-box');
- $(".clearProwlarr").parent().removeClass("hidden");
- },
- });
- }
- function prowlarrDownload(url) {
- const args = url.split(",");
- var post = {
- guid: args[0],
- indexerId: args[1],
- };
- organizrAPI2("POST", "api/v2/homepage/prowlarr/download/", post, true)
- .success(function () {
- message(
- "Torrent downloaded",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Error downloading torrent");
- });
- }
- function homepageOctoprint(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageOctoprintRefresh;
- organizrAPI2("GET", "api/v2/homepage/octoprint/data")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderOctoprint").innerHTML = "";
- if (response.data !== null) {
- $("#homepageOrderOctoprint").html(buildOctoprint(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "Octoprint-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageOctoprint(timeout);
- }, timeout);
- delete timeout;
- }
- function buildOctoprint(array) {
- var menu = `<ul class="nav customtab nav-tabs pull-right" role="tablist">`;
- var headerAlt = "";
- var header = "";
- var content = "";
- var webcamUrl = "";
- var webcamHtml = "";
- var css = `
- <style>
- .octoprint-webcam {
- max-height: 400px;
- max-width: 100%;
- float: right;
- }
- .octoprint-block {
- margin-left: 0px;
- margin-right: 0px;
- }
- .octoprint-button-spacer {
- padding-right: 46px;
- }
- </style>
- `;
- menu += `
- <li role="presentation" class="active" ><a href="" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="true" onclick="homepageOctoprint();"><span class="visible-xs"><i class="ti-download"></i></span><span class="hidden-xs">REFRESH</span></a></li>
- `;
- menu += "</ul>";
- if (activeInfo.settings.homepage.options.alternateHomepageHeaders) {
- var headerAlt =
- `
- <div class="col-md-12">
- <h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/octoprint.png"> </h2>
- ` +
- menu +
- `
- <hr class="hidden-xs"><div class="clearfix"></div>
- </div>
- <div class="clearfix"></div>
- `;
- } else {
- var header =
- `
- <div class="white-box bg-info m-b-0 p-b-0 p-t-10 mailbox-widget">
- <h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/octoprint.png"> </h2>
- ` +
- menu +
- `
- <div class="clearfix"></div>
- </div>
- `;
- }
- content = "<p>State: " + array.data.job.state + "</p>";
- if (array.data.job.state == "Printing") {
- content += "<p>File: " + array.data.job.job.file.display + "</p>";
- content +=
- "<p>Progress: " +
- parseFloat(array.data.job.progress.completion).toFixed(0) +
- "%</p>";
- content +=
- "<p>Approx. Total Print Time: " +
- octoprintFormatTime(array.data.job.job.estimatedPrintTime) +
- "</p>";
- content +=
- "<p>Print Time Left: " +
- octoprintFormatTime(array.data.job.progress.printTimeLeft) +
- "</p>";
- }
- if (array.data.settings.webcam.webcamEnabled) {
- webcamUrl = array.data.settings.webcam.streamUrl;
- if (webcamUrl[0] == "/") {
- webcamUrl = array.data.url + webcamUrl;
- }
- }
- if (webcamUrl) {
- var webcamHtml =
- `<div class="col-lg-4"><img class="octoprint-webcam" src="` +
- webcamUrl +
- `"></div>`;
- }
- return (
- css +
- `
- <div class="row">
- ` +
- headerAlt +
- `
- <div class="col-lg-12">
- ` +
- header +
- `
- <div class="row octoprint-block white-box">
- <div class="col-lg-8 text-white">
- <div class="tab-content m-t-0">` +
- content +
- `</div>
- </div>
- ` +
- webcamHtml +
- `
- </div>
- </div>
- </div>
- `
- );
- }
- function octoprintFormatTime(seconds) {
- var format = "";
- var days = Math.floor(moment.duration(seconds, "seconds").asDays());
- var hours = Math.floor(moment.duration(seconds, "seconds").asHours());
- var minutes = moment.duration(seconds, "seconds").minutes();
- var seconds = moment.duration(seconds, "seconds").seconds();
- if (days > 0) {
- format += days + " " + octoprintPluralize("day", days) + " ";
- }
- if (hours > 0) {
- format += hours + " " + octoprintPluralize("hour", hours) + " ";
- }
- if (minutes > 0) {
- format += minutes + " " + octoprintPluralize("minute", minutes) + " ";
- }
- if (seconds > 0) {
- format += seconds + " " + octoprintPluralize("second", seconds) + " ";
- }
- return format;
- }
- function octoprintPluralize(s, n) {
- if (n > 1) {
- return s + "s";
- }
- return s;
- }
- function pad(n, width, z) {
- z = z || "0";
- n = n + "";
- return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
- }
- // Thanks Swifty!
- function PopupCenter(url, title, w, h) {
- // Fixes dual-screen position Most browsers Firefox
- var dualScreenLeft =
- window.screenLeft != undefined ? window.screenLeft : window.screenX;
- var dualScreenTop =
- window.screenTop != undefined ? window.screenTop : window.screenY;
- var width = window.innerWidth
- ? window.innerWidth
- : document.documentElement.clientWidth
- ? document.documentElement.clientWidth
- : screen.width;
- var height = window.innerHeight
- ? window.innerHeight
- : document.documentElement.clientHeight
- ? document.documentElement.clientHeight
- : screen.height;
- var left = width / 2 - w / 2 + dualScreenLeft;
- var top = height / 2 - h / 2 + dualScreenTop;
- var newWindow = window.open(
- url,
- title,
- "scrollbars=yes, width=" +
- w +
- ", height=" +
- h +
- ", top=" +
- top +
- ", left=" +
- left
- );
- // Puts focus on the newWindow
- if (window.focus) {
- newWindow.focus();
- }
- return newWindow;
- }
- function getPlexHeaders() {
- let plexTitle =
- activeInfo.appearance.title == ""
- ? "Organizr"
- : cleanClass(activeInfo.appearance.title);
- return {
- Accept: "application/json",
- "X-Plex-Product": plexTitle,
- "X-Plex-Version": "2.0",
- "X-Plex-Client-Identifier": activeInfo.settings.misc.uuid,
- "X-Plex-Model": "Plex OAuth",
- "X-Plex-Platform": activeInfo.osName,
- "X-Plex-Platform-Version": activeInfo.osVersion,
- "X-Plex-Device": activeInfo.browserName,
- "X-Plex-Device-Name": activeInfo.browserVersion,
- "X-Plex-Device-Screen-Resolution":
- window.screen.width + "x" + window.screen.height,
- "X-Plex-Language": "en",
- };
- }
- var plex_oauth_window = null;
- const plex_oauth_loader =
- "<style>" +
- ".login-loader-container {" +
- 'font-family: "Open Sans", Arial, sans-serif;' +
- "position: absolute;" +
- "top: 0;" +
- "right: 0;" +
- "bottom: 0;" +
- "left: 0;" +
- "}" +
- ".login-loader-message {" +
- "color: #282A2D;" +
- "text-align: center;" +
- "position: absolute;" +
- "left: 50%;" +
- "top: 25%;" +
- "transform: translate(-50%, -50%);" +
- "}" +
- ".login-loader {" +
- "border: 5px solid #ccc;" +
- "-webkit-animation: spin 1s linear infinite;" +
- "animation: spin 1s linear infinite;" +
- "border-top: 5px solid #282A2D;" +
- "border-radius: 50%;" +
- "width: 50px;" +
- "height: 50px;" +
- "position: relative;" +
- "left: calc(50% - 25px);" +
- "}" +
- "@keyframes spin {" +
- "0% { transform: rotate(0deg); }" +
- "100% { transform: rotate(360deg); }" +
- "}" +
- "</style>" +
- '<div class="login-loader-container">' +
- '<div class="login-loader-message">' +
- '<div class="login-loader"></div>' +
- "<br>" +
- "Redirecting to the login page..." +
- "</div>" +
- "</div>";
- function closePlexOAuthWindow() {
- if (plex_oauth_window) {
- plex_oauth_window.close();
- }
- }
- getPlexOAuthPin = function () {
- var x_plex_headers = getPlexHeaders();
- var deferred = $.Deferred();
- $.ajax({
- url: "https://plex.tv/api/v2/pins?strong=true",
- type: "POST",
- headers: x_plex_headers,
- success: function (data) {
- deferred.resolve({ pin: data.id, code: data.code });
- },
- error: function () {
- closePlexOAuthWindow();
- deferred.reject();
- },
- });
- return deferred;
- };
- var polling = null;
- function PlexOAuth(
- successCallback,
- errorCallback,
- maxRetryCallback,
- pollingCallback,
- preFunction,
- clientID = null
- ) {
- if (typeof preFunction === "function") {
- preFunction();
- }
- closePlexOAuthWindow();
- plex_oauth_window = PopupCenter("", "Plex-OAuth", 600, 700);
- $(plex_oauth_window.document.body).html(plex_oauth_loader);
- getPlexOAuthPin().then(
- function (data) {
- var x_plex_headers = getPlexHeaders();
- const pin = data.pin;
- const code = data.code;
- var oauth_params = {
- clientID: x_plex_headers["X-Plex-Client-Identifier"],
- "context[device][product]": x_plex_headers["X-Plex-Product"],
- "context[device][version]": x_plex_headers["X-Plex-Version"],
- "context[device][platform]": x_plex_headers["X-Plex-Platform"],
- "context[device][platformVersion]":
- x_plex_headers["X-Plex-Platform-Version"],
- "context[device][device]": x_plex_headers["X-Plex-Device"],
- "context[device][deviceName]": x_plex_headers["X-Plex-Device-Name"],
- "context[device][model]": x_plex_headers["X-Plex-Model"],
- "context[device][screenResolution]":
- x_plex_headers["X-Plex-Device-Screen-Resolution"],
- "context[device][layout]": "desktop",
- code: code,
- };
- plex_oauth_window.location =
- "https://app.plex.tv/auth/#!?" + encodeData(oauth_params);
- polling = pin;
- let maxPollCount = 120;
- (function poll() {
- maxPollCount--;
- $.ajax({
- url: "https://plex.tv/api/v2/pins/" + pin,
- type: "GET",
- headers: x_plex_headers,
- success: function (data) {
- if (data.authToken) {
- polling = null;
- closePlexOAuthWindow();
- if (typeof successCallback === "function") {
- successCallback("plex", data.authToken, clientID);
- }
- }
- },
- complete: function () {
- if (maxPollCount <= 0) {
- closePlexOAuthWindow();
- if (typeof maxRetryCallback === "function") {
- maxRetryCallback();
- }
- } else if (polling === pin) {
- setTimeout(function () {
- poll();
- }, 1000);
- if (typeof pollingCallback === "function") {
- pollingCallback(maxPollCount);
- }
- }
- },
- timeout: 1000,
- });
- })();
- },
- function () {
- closePlexOAuthWindow();
- if (typeof errorCallback === "function") {
- errorCallback();
- }
- }
- );
- }
- function openOAuth(provider) {
- // will actually fix this later
- closePlexOAuthWindow();
- plex_oauth_window = PopupCenter("", "OAuth", 600, 700);
- $(plex_oauth_window.document.body).html(plex_oauth_loader);
- plex_oauth_window.location = "api/v2/oauth/trakt";
- }
- function encodeData(data) {
- return Object.keys(data)
- .map(function (key) {
- return [key, data[key]].map(encodeURIComponent).join("=");
- })
- .join("&");
- }
- function oAuthSuccess(type, token, id = null) {
- switch (type) {
- case "plex":
- if (id) {
- $(id).val(token);
- $(id).change();
- messageSingle(
- "",
- window.lang.translate("Grabbed Token - Please Save"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } else {
- $("#oAuth-Input").val(token);
- $("#oAuthType-Input").val(type);
- $("#login-username-Input").addClass("hidden");
- $("#login-password-Input").addClass("hidden");
- $("#oAuth-div").removeClass("hidden");
- $(".login-button").first().trigger("click");
- }
- break;
- default:
- break;
- }
- }
- function oAuthError() {
- messageSingle(
- "",
- window.lang.translate("Error Connecting to oAuth Provider"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "5000"
- );
- }
- function oAuthMaxRetry() {
- messageSingle(
- "",
- window.lang.translate("Max Retry Error Connecting to oAuth Provider"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "5000"
- );
- }
- function oAuthStart(type) {
- switch (type) {
- case "plex":
- PlexOAuth(oAuthSuccess, oAuthError, oAuthMaxRetry, null, null);
- break;
- default:
- break;
- }
- }
- function oidcStart(provider) {
- // Redirect in same window to OIDC provider
- window.location.href =
- "api/v2/oidc/" + encodeURIComponent(provider) + "/authorize";
- }
- function testOIDCConnection(provider) {
- organizrAPI2(
- "GET",
- "api/v2/oidc/" + encodeURIComponent(provider) + "/test",
- ""
- )
- .success(function (data) {
- if (data.response.result === "success") {
- messageSingle(
- "OIDC Test",
- data.response.message || "Connection successful",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } else {
- messageSingle(
- "OIDC Test",
- data.response.message || "Connection failed",
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "5000"
- );
- }
- })
- .fail(function (xhr) {
- var msg = "Connection failed";
- try {
- var resp = JSON.parse(xhr.responseText);
- msg = resp.response.message || msg;
- } catch (e) {}
- messageSingle(
- "OIDC Test",
- msg,
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "5000"
- );
- });
- }
- function clearAJAX(id = "all") {
- if (id == "all") {
- $.each(timeouts, function (i, v) {
- clearTimeout(timeouts[i]);
- });
- } else if (id == "homepage") {
- $.each(timeouts, function (i, v) {
- if (i.indexOf("-Homepage") > 0) {
- clearTimeout(timeouts[i]);
- }
- });
- } else {
- clearTimeout(timeouts[id]);
- }
- }
- //Generate API
- function generateCode() {
- var code = "";
- var possible = "abcdefghijklmnopqrstuvwxyz0123456789";
- for (var i = 0; i < 20; i++)
- code += possible.charAt(Math.floor(Math.random() * possible.length));
- return code;
- }
- // uppercase word
- function toUpper(str) {
- return str
- .toLowerCase()
- .split(" ")
- .map(function (word) {
- return word[0].toUpperCase() + word.substr(1);
- })
- .join(" ");
- }
- // human filesize
- function humanFileSize(bytes, si) {
- var thresh = si ? 1000 : 1024;
- if (Math.abs(bytes) < thresh) {
- return bytes + " B";
- }
- var units = si
- ? ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
- : ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
- var u = -1;
- do {
- bytes /= thresh;
- ++u;
- } while (Math.abs(bytes) >= thresh && u < units.length - 1);
- return bytes.toFixed(1) + " " + units[u];
- }
- //youtube search
- function youtubeSearch(searchQuery) {
- return $.ajax({
- url: "api/v2/homepage/youtube/" + searchQuery,
- });
- }
- function youtubeCheck(title, link) {
- youtubeSearch(title)
- .success(function (data) {
- var response = data.response;
- if (response.data) {
- inlineLoad();
- var id = response.data.items["0"].id.videoId;
- var div =
- `
- <div id="player-` +
- link +
- `" data-plyr-provider="youtube" data-plyr-embed-id="` +
- id +
- `"
- ></div>
- <div class="clearfix"></div>
- `;
- $(".youtube-div").html(div);
- $("." + link).trigger("click");
- player = new Plyr("#player-" + link);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "YouTube API Error");
- // Fallback: open YouTube search in a new tab/window
- var q = "";
- try {
- q = decodeURIComponent(title);
- } catch (e1) {
- try {
- q = unescape(title);
- } catch (e2) {
- q = title;
- }
- }
- var url =
- "https://www.youtube.com/results?search_query=" +
- encodeURIComponent(q + " trailer");
- window.open(url, "_blank");
- });
- }
- function requestSearch(title, page = 1) {
- return $.ajax({
- url:
- "https://api.themoviedb.org/3/search/multi?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "&query=" +
- title +
- "&page=" +
- page +
- "&include_adult=false",
- });
- }
- function requestSearchList(list, page = 1) {
- var url = "";
- switch (list) {
- case "top-movie":
- url =
- "https://api.themoviedb.org/3/movie/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "®ion=US&page=" +
- page;
- break;
- case "pop-movie":
- url =
- "https://api.themoviedb.org/3/movie/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "®ion=US&page=" +
- page;
- break;
- case "up-movie":
- url =
- "https://api.themoviedb.org/3/movie/upcoming?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "®ion=US&page=" +
- page;
- break;
- case "theatre-movie":
- url =
- "https://api.themoviedb.org/3/movie/now_playing?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "®ion=US&page=" +
- page;
- break;
- case "top-tv":
- url =
- "https://api.themoviedb.org/3/tv/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "®ion=US&page=" +
- page;
- break;
- case "pop-tv":
- url =
- "https://api.themoviedb.org/3/tv/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "®ion=US&page=" +
- page;
- break;
- case "today-tv":
- url =
- "https://api.themoviedb.org/3/tv/airing_today?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "®ion=US&page=" +
- page;
- break;
- case "org-mod":
- url =
- "https://api.themoviedb.org/4/list/64438?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" +
- activeInfo.language +
- "&page=" +
- page;
- break;
- default:
- }
- return $.ajax({
- url: url,
- });
- }
- function requestNewID(id) {
- return $.ajax({
- url:
- "https://api.themoviedb.org/3/tv/" +
- id +
- "/external_ids?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=en-US",
- });
- }
- function getTmdbImages(id, type) {
- return $.ajax({
- url: `https://api.themoviedb.org/3/${type}/${id}/images?api_key=83cf4ee97bb728eeaf9d4a54e64356a1`,
- });
- }
- function inlineLoad() {
- $(".inline-popups").magnificPopup({
- removalDelay: 500, //delay removal by X to allow out-animation
- closeOnBgClick: true,
- //closeOnContentClick: true,
- callbacks: {
- beforeOpen: function () {
- this.st.mainClass = this.st.el.attr("data-effect");
- this.st.focus = "#request-input";
- },
- close: function () {
- if (typeof player !== "undefined") {
- player.destroy();
- }
- },
- },
- midClick: true, // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source.
- });
- }
- //Import Users
- function importUsers(type) {
- $(".importUsersButton").attr("disabled", true);
- messageSingle(
- "",
- window.lang.translate("Importing Users"),
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- organizrAPI2("POST", "api/v2/users/import/" + type, { type: type })
- .success(function (data) {
- try {
- var response = data.response;
- message(
- "User Import",
- response.message,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- $(".importUsersButton").attr("disabled", false);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Import Error");
- });
- }
- //Settings change auth
- function changeAuth() {
- var type = $("#authSelect").val();
- var service = $("#authBackendSelect").val();
- switch (service) {
- case "plex":
- $(".switchAuth").parent().parent().parent().hide();
- $(".backendAuth").parent().parent().parent().show();
- $(".plexAuth").parent().parent().parent().show();
- break;
- case "emby_local":
- case "emby_connect":
- case "emby_all":
- $(".switchAuth").parent().parent().parent().hide();
- $(".backendAuth").parent().parent().parent().show();
- $(".embyAuth").parent().parent().parent().show();
- break;
- case "jellyfin":
- $(".switchAuth").parent().parent().parent().hide();
- $(".backendAuth").parent().parent().parent().show();
- $(".jellyfinAuth").parent().parent().parent().show();
- break;
- case "ftp":
- $(".switchAuth").parent().parent().parent().hide();
- $(".backendAuth").parent().parent().parent().show();
- $(".ftpAuth").parent().parent().parent().show();
- break;
- case "ldap":
- $(".switchAuth").parent().parent().parent().hide();
- $(".backendAuth").parent().parent().parent().show();
- $(".ldapAuth").parent().parent().parent().show();
- break;
- default:
- $(".switchAuth").parent().parent().parent().hide();
- $(".backendAuth").parent().parent().parent().show();
- }
- if (type == "internal") {
- $(".switchAuth").parent().parent().parent().hide();
- }
- }
- function organizrSpecialSettings(array) {
- //media search
- if (
- array.settings.homepage.search.enabled == true &&
- typeof array.settings.homepage.search.type !== "undefined"
- ) {
- var htmlDOM = `
- <li class=""><a class="waves-effect waves-light inline-popups" href="#mediaSearch-area" data-effect="mfp-zoom-out"> <i class="ti-search"></i></a></li>
- `;
- var searchBoxResults =
- `
- <div id="mediaSearch-area" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-8 col-md-offset-2">
- <div class="white-box m-b-0 resultBox-outside">
- <div class="form-group m-b-0">
- <input id="mediaSearchQuery" data-server="` +
- array.settings.homepage.search.type +
- `" lang="en" placeholder="Search My Media" type="text" class="form-control inline-focus">
- <div class="clearfix"></div>
- </div>
- <div class="row el-element-overlay mediaSearch-div resultBox-inside"></div>
- </div>
- </div>
- </div>
- `;
- $(htmlDOM).prependTo(".navbar-right");
- $(searchBoxResults).appendTo($(".organizr-area"));
- }
- }
- function checkLocalForwardStatus(array) {
- if (
- array.settings.login.enableLocalAddressForward == true &&
- typeof array.settings.login.enableLocalAddressForward !== "undefined"
- ) {
- if (
- array.settings.login.wanDomain !== "" &&
- array.settings.login.localAddress !== ""
- ) {
- organizrConsole("Organizr Function", "Local Login Enabled");
- organizrConsole("Organizr Function", "Local Login Testing...");
- let remoteSite = array.settings.login.wanDomain;
- let localSite = array.settings.login.localAddress;
- try {
- let currentURL = decodeURI(window.location.href);
- let currentSite = window.location.host;
- if (
- activeInfo.settings.user.local &&
- currentSite.indexOf(remoteSite) !== -1 &&
- currentURL.indexOf("override") === -1
- ) {
- organizrConsole(
- "Organizr Function",
- "Local Login Status: Local | Forwarding Now"
- );
- window.location = localSite;
- } else {
- organizrConsole(
- "Organizr Function",
- "Local Login Status: Not Local or Override was set - Ignoring Forward Request"
- );
- }
- } catch (e) {
- console.error(e);
- }
- }
- }
- }
- function forceSearch(term) {
- $.magnificPopup.close();
- let tabInfo = findTab("api/v2/page/homepage", "access_url");
- if (tabInformation[tabInfo.id]["loaded"]) {
- if (tabInformation[tabInfo.id]["active"]) {
- setTimeout(function () {
- $("#newRequestButton").trigger("click");
- $("#request-input").val(term);
- doneTyping();
- }, 500);
- } else {
- tabActions("click", tabInfo.id);
- setTimeout(function () {
- $("#newRequestButton").trigger("click");
- $("#request-input").val(term);
- doneTyping();
- }, 1000);
- }
- } else {
- tabActions("click", tabInfo.id);
- setTimeout(function () {
- $("#newRequestButton").trigger("click");
- $("#request-input").val(term);
- doneTyping();
- }, 3000);
- }
- }
- function splitPoster(str) {
- var words = str.split(" ");
- var newWord = "";
- $.each(words, function (i, v) {
- newWord += v + "<br/>";
- });
- return newWord;
- }
- function buildMediaResults(array, source, term) {
- if (array.content.length == 0) {
- var none =
- '<h2 class="text-center" lang="en">No Results for:</h2><h3 class="text-center" lang="en">' +
- term +
- "</h3>";
- none +=
- activeInfo.settings.homepage.ombi.enabled == true ||
- activeInfo.settings.homepage.overseerr.enabled == true
- ? `<button onclick="forceSearch('` +
- term +
- `')" class="btn btn-block btn-info" lang="en">Would you like to Request it?</button>`
- : "";
- return none;
- }
- var results = "";
- var tv = 0;
- var movie = 0;
- var music = 0;
- var total = 0;
- $.each(array.content, function (i, v) {
- total = total + 1;
- tv = v.type == "tv" ? tv + 1 : tv;
- movie = v.type == "movie" ? movie + 1 : movie;
- music = v.type == "music" ? music + 1 : music;
- var bg = v.imageURL;
- var top = v.title;
- var bottom = v.metadata.originallyAvailableAt;
- results +=
- `
- <div id="` +
- v.uid +
- `-metadata-div" class="white-popup mfp-with-anim mfp-hide">
- <div class="col-md-8 col-md-offset-2 ` +
- v.uid +
- `-metadata-info"></div>
- </div>
- <a class="inline-popups ` +
- v.uid +
- ` hidden" href="#` +
- v.uid +
- `-metadata-div" data-effect="mfp-zoom-out"></a>
- <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12 m-t-20 request-result-item request-result-` +
- v.type +
- ` metadata-get mouse" data-source="` +
- source +
- `" data-key="` +
- v.metadataKey +
- `" data-uid="` +
- v.uid +
- `">
- <div class="white-box m-b-10">
- <div class="el-card-item p-b-0">
- <div class="el-card-avatar el-overlay-1 m-b-5"> <img class="lazyload resultImages" data-src="` +
- bg +
- `"></div>
- <div class="el-card-content bg-org">
- <h3 class="box-title elip">` +
- top +
- `</h3> <small>` +
- bottom +
- `</small>
- <br>
- </div>
- </div>
- </div>
- </div>
- `;
- });
- //requests setup?
- if (
- activeInfo.settings.homepage.ombi.enabled == true ||
- activeInfo.settings.homepage.overseerr.enabled == true
- ) {
- results +=
- `
- <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12 m-t-20 request-result-item request-result-movie mouse" onclick="forceSearch('` +
- term +
- `')">
- <div class="white-box m-b-10">
- <div class="el-card-item p-b-0">
- <div class="el-card-avatar el-overlay-1 m-b-5"> <img class="lazyload resultImages mouse" data-src="plugins/images/homepage/no-request.png">
- <div class="customPoster">
- <a href="javascript:void(0);">` +
- splitPoster(term) +
- `</a>
- </div>
- </div>
- <div class="el-card-content bg-org">
- <h3 class="box-title elip">` +
- term +
- `</h3> <small lang="en">Request Me!</small>
- <br>
- </div>
- </div>
- </div>
- </div>
- `;
- }
- var buttons =
- `
- <div class="button-box p-20 text-center p-b-0">
- <button class="btn btn-inverse waves-effect waves-light filter-request-result" data-filter="request-result-all"><span>` +
- total +
- `</span> <i class="fa fa-th-large m-l-5 fa-fw"></i></button>
- <button class="btn btn-primary waves-effect waves-light filter-request-result" data-filter="request-result-movie"><span>` +
- movie +
- `</span> <i class="fa fa-film m-l-5 fa-fw"></i></button>
- <button class="btn btn-info waves-effect waves-light filter-request-result" data-filter="request-result-tv"><span>` +
- tv +
- `</span> <i class="fa fa-tv m-l-5 fa-fw"></i></button>
- <button class="btn btn-info waves-effect waves-light filter-request-result" data-filter="request-result-music"><span>` +
- music +
- `</span> <i class="fa fa-music m-l-5 fa-fw"></i></button>
- </div>
- `;
- results = '<div class="media-results">' + results + "</div>";
- return buttons + results;
- }
- function getPingList(arrayItems) {
- var pingList = [];
- var timeout =
- activeInfo.user.groupID <= 1
- ? activeInfo.settings.homepage.refresh.adminPingRefresh
- : activeInfo.settings.homepage.refresh.otherPingRefresh;
- if (
- Array.isArray(arrayItems["data"]["tabs"]) &&
- arrayItems["data"]["tabs"].length > 0
- ) {
- $.each(arrayItems["data"]["tabs"], function (i, v) {
- if (v.ping && v.ping_url !== null) {
- pingList.push(v.ping_url);
- }
- });
- }
- return pingList.length > 0 ? pingUpdate(pingList, timeout) : false;
- }
- function pingUpdateItem(ping) {
- if (activeInfo.user.groupID > activeInfo.settings.ping.auth) {
- return false;
- }
- organizrAPI2("GET", "api/v2/ping/" + ping)
- .success(function (data) {
- try {
- var response = data.response;
- } catch (e) {
- organizrCatchError(e, data);
- }
- var i = ping;
- var v = response.data;
- var elm = $(".menu-" + cleanClass(i) + "-ping");
- var elmMs = $(".menu-" + cleanClass(i) + "-ping-ms");
- var catElm = elm
- .parent()
- .parent()
- .parent()
- .parent()
- .children("a")
- .find(".menu-category-ping");
- var error =
- '<div class="ping"><span class="heartbit"></span><span class="point"></span></div>';
- var success = "";
- var badCount = 0;
- var goodCount = 0;
- var previousState =
- elm.attr("data-previous-state") == ""
- ? ""
- : elm.attr("data-previous-state");
- var tabName = elm.attr("data-tab-name");
- var status = v == null ? "down" : "up";
- var ms = v == null ? "down" : v + "ms";
- var sendMessage =
- previousState !== status &&
- previousState !== "" &&
- activeInfo.user.groupID <= activeInfo.settings.ping.authMessage
- ? true
- : false;
- var audioDown = sendMessage
- ? new Audio(activeInfo.settings.ping.offlineSound)
- : "";
- var audioUp = sendMessage
- ? new Audio(activeInfo.settings.ping.onlineSound)
- : "";
- elm.attr("data-previous-state", status);
- let listing = elm
- .parent()
- .parent()
- .parent()
- .parent()
- .children("a")
- .find(".menu-category-ping")
- .parent()
- .parent()
- .find("li")
- .find("div[class$='-ping']");
- $.each(listing, function (i, v) {
- let state = $(v).attr("data-previous-state");
- if (state == "up") {
- goodCount = goodCount + 1;
- } else if (state == "down") {
- badCount = badCount + 1;
- }
- });
- if (catElm.length > 0) {
- catElm.attr("data-bad", badCount);
- catElm.attr("data-good", goodCount);
- if (badCount == 0) {
- catElm.html(success);
- }
- }
- if (
- activeInfo.user.groupID <= activeInfo.settings.ping.authMs &&
- activeInfo.settings.ping.ms
- ) {
- elmMs.removeClass("hidden").html(ms);
- }
- switch (status) {
- case "down":
- elm.html(error);
- catElm.html(error);
- elm.parent().find("img").addClass("grayscale");
- var msg = sendMessage
- ? message(
- tabName,
- "Server Down",
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "600000"
- )
- : "";
- var audio =
- sendMessage && activeInfo.settings.ping.statusSounds
- ? audioDown.play()
- : "";
- break;
- default:
- elm.html(success);
- elm.parent().find("img").removeClass("grayscale");
- var msg = sendMessage
- ? message(
- tabName,
- "Server Back Online",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "600000"
- )
- : "";
- var audio =
- sendMessage && activeInfo.settings.ping.statusSounds
- ? audioUp.play()
- : "";
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function pingUpdate(pingList, timeout) {
- $.each(pingList, function (i, v) {
- pingUpdateItem(v);
- });
- var timeoutTitle = "ping";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- pingUpdate(pingList, timeout);
- }, timeout);
- }
- function include(filename) {
- var type = filename.split(".").pop();
- switch (type) {
- case "js":
- var body = document.getElementsByTagName("body")[0];
- var script = document.createElement("script");
- script.src = filename;
- script.type = "text/javascript";
- body.appendChild(script);
- break;
- case "css":
- var head = document.getElementById("style");
- var script = document.createElement("link");
- script.href = filename;
- script.type = "text/css";
- script.rel = "stylesheet";
- head.appendChild(script);
- break;
- default:
- return false;
- }
- return false;
- }
- function defineNotification() {
- var bb =
- typeof activeInfo !== "undefined"
- ? activeInfo.settings.notifications.backbone
- : "izi";
- switch (bb) {
- case "toastr":
- include("plugins/bower_components/toast-master/css/jquery.toast.css");
- include("plugins/bower_components/toast-master/js/jquery.toast.js");
- window.notificationFunction = "$.toast";
- break;
- case "izi":
- include("plugins/bower_components/iziToast/css/iziToast.min.css");
- include("plugins/bower_components/iziToast/js/iziToast.min.js");
- window.notificationFunction = "iziToast";
- break;
- case "alertify":
- include("plugins/bower_components/alertify/alertify.min.css");
- include("plugins/bower_components/alertify/default.min.css");
- include("plugins/bower_components/alertify/alertify.min.js");
- window.notificationFunction = "alertify";
- break;
- case "noty":
- include("plugins/bower_components/noty/noty.min.js");
- include("plugins/bower_components/noty/mo.min.js");
- include("plugins/bower_components/noty/noty.css");
- include("plugins/bower_components/noty/mint.css");
- window.notificationFunction = "Noty";
- break;
- default:
- return false;
- }
- window.notificationsReady = true;
- }
- function messagePositions() {
- return {
- br: {
- toastr: "bottom-right",
- alertify: "bottom-right",
- izi: "bottomRight",
- noty: "bottomRight",
- },
- bl: {
- toastr: "bottom-left",
- alertify: "bottom-left",
- izi: "bottomLeft",
- noty: "bottomLeft",
- },
- bc: {
- toastr: "bottom-center",
- alertify: "bottom-center",
- izi: "bottomCenter",
- noty: "bottomCenter",
- },
- tr: {
- toastr: "top-right",
- alertify: "top-right",
- izi: "topRight",
- noty: "topRight",
- },
- tl: {
- toastr: "top-left",
- alertify: "top-left",
- izi: "topLeft",
- noty: "topLeft",
- },
- tc: {
- toastr: "top-center",
- alertify: "top-center",
- izi: "topCenter",
- noty: "topCenter",
- },
- c: {
- toastr: "center",
- alertify: "bottom-center",
- izi: "center",
- noty: "center",
- },
- };
- }
- function message(
- heading,
- text,
- position,
- color,
- icon,
- timeout,
- single = false
- ) {
- let bb =
- typeof activeInfo !== "undefined"
- ? activeInfo.settings.notifications.backbone
- : "izi";
- let activePosition =
- typeof activeInfo !== "undefined"
- ? activeInfo.settings.notifications.position
- : "bc";
- position = typeof position !== "undefined" ? position : activePosition;
- text = typeof text !== "undefined" ? text : "";
- color = typeof color !== "undefined" ? color : "#FFF";
- icon = typeof icon !== "undefined" ? icon : "info";
- timeout = typeof timeout !== "undefined" ? timeout : 10000;
- switch (bb) {
- case "toastr":
- var ready = eval(notificationFunction) !== undefined ? true : false;
- break;
- case "izi":
- case "alertify":
- case "noty":
- try {
- var ready =
- typeof eval(notificationFunction) !== undefined ? true : false;
- } catch (e) {
- if (e instanceof SyntaxError) {
- setTimeout(function () {
- message(heading, text, position, color, icon, timeout, single);
- }, 100);
- }
- }
- break;
- default:
- var ready = false;
- }
- if (notificationsReady && ready) {
- oldPosition = position;
- position = messagePositions()[position][bb];
- if (typeof activeInfo === "undefined") {
- setTimeout(function () {
- message(heading, text, oldPosition, color, icon, timeout, single);
- }, 100);
- return false;
- }
- if (single) {
- switch (bb) {
- case "toastr":
- $.toast().reset("all");
- break;
- case "izi":
- iziToast.destroy();
- break;
- case "alertify":
- alertify.dismissAll();
- break;
- case "noty":
- Noty.closeAll();
- break;
- default:
- return false;
- }
- }
- switch (bb) {
- case "toastr":
- $.toast({
- heading: heading,
- text: text,
- position: position,
- loaderBg: color,
- icon: icon,
- hideAfter: timeout,
- stack: 6,
- showHideTransition: "slide",
- });
- break;
- case "izi":
- switch (icon) {
- case "success":
- var msg = {
- icon: "mdi mdi-check-circle-outline",
- };
- break;
- case "info":
- var msg = {
- icon: "mdi mdi-information-outline",
- };
- break;
- case "error":
- var msg = {
- icon: "mdi mdi-close-circle-outline",
- };
- break;
- case "warning":
- var msg = {
- icon: "mdi mdi-alert-circle-outline",
- };
- break;
- case "update":
- var msg = {
- icon: "mdi mdi-webpack",
- };
- break;
- default:
- var msg = {
- icon: "mdi mdi-alert-circle-outline",
- };
- }
- iziToast.show({
- close: true,
- progressBar: true,
- progressBarEasing: "ease",
- class: icon + "-notify",
- title: heading,
- message: text,
- position: position,
- timeout: timeout,
- layout: 2,
- transitionIn: "flipInX",
- transitionOut: "flipOutX",
- balloon: false,
- icon: msg["icon"],
- });
- break;
- case "alertify":
- var msgFull = heading !== "" ? heading + "<br/>" + text : text;
- timeout = timeout / 1000;
- alertify.set("notifier", "position", position);
- alertify.notify(msgFull, icon + "-alertify", timeout);
- break;
- case "noty":
- if (typeof mojs == "undefined") {
- setTimeout(function () {
- message(heading, text, oldPosition, color, icon, timeout);
- }, 100);
- return false;
- }
- var msgFull = heading !== "" ? heading + "<br/>" + text : text;
- new Noty({
- type: icon + "-noty",
- layout: position,
- text: msgFull,
- progressBar: true,
- timeout: timeout,
- animation: {
- open: function (promise) {
- var n = this;
- var Timeline = new mojs.Timeline();
- var body = new mojs.Html({
- el: n.barDom,
- x: { 500: 0, delay: 0, duration: 500, easing: "elastic.out" },
- isForce3d: true,
- onComplete: function () {
- promise(function (resolve) {
- resolve();
- });
- },
- });
- var parent = new mojs.Shape({
- parent: n.barDom,
- width: 200,
- height: n.barDom.getBoundingClientRect().height,
- radius: 0,
- x: { [150]: -150 },
- duration: 1.2 * 500,
- isShowStart: true,
- });
- n.barDom.style["overflow"] = "visible";
- parent.el.style["overflow"] = "hidden";
- var burst = new mojs.Burst({
- parent: parent.el,
- count: 10,
- top: n.barDom.getBoundingClientRect().height + 75,
- degree: 90,
- radius: 75,
- angle: { [-90]: 40 },
- children: {
- fill: "#EBD761",
- delay: "stagger(500, -50)",
- radius: "rand(8, 25)",
- direction: -1,
- isSwirl: true,
- },
- });
- var fadeBurst = new mojs.Burst({
- parent: parent.el,
- count: 2,
- degree: 0,
- angle: 75,
- radius: { 0: 100 },
- top: "90%",
- children: {
- fill: "#EBD761",
- pathScale: [0.65, 1],
- radius: "rand(12, 15)",
- direction: [-1, 1],
- delay: 0.8 * 500,
- isSwirl: true,
- },
- });
- Timeline.add(body, burst, fadeBurst, parent);
- Timeline.play();
- },
- close: function (promise) {
- var n = this;
- new mojs.Html({
- el: n.barDom,
- x: { 0: 500, delay: 10, duration: 500, easing: "cubic.out" },
- skewY: { 0: 10, delay: 10, duration: 500, easing: "cubic.out" },
- isForce3d: true,
- onComplete: function () {
- promise(function (resolve) {
- resolve();
- });
- },
- }).play();
- },
- },
- }).show();
- break;
- default:
- organizrConsole("Organizr Function", "Message case not setup");
- }
- } else {
- setTimeout(function () {
- message(heading, text, position, color, icon, timeout, single);
- }, 100);
- }
- }
- function messageSingle(heading, text, position, color, icon, timeout) {
- let activePosition =
- typeof activeInfo !== "undefined"
- ? activeInfo.settings.notifications.position
- : "bc";
- position = typeof position !== "undefined" ? position : activePosition;
- text = typeof text !== "undefined" ? text : "";
- color = typeof color !== "undefined" ? color : "#FFF";
- icon = typeof icon !== "undefined" ? icon : "info";
- timeout = typeof timeout !== "undefined" ? timeout : 10000;
- message(heading, text, position, color, icon, timeout, true);
- }
- function blockDev(e) {
- var evtobj = window.event ? event : e;
- if (evtobj.keyCode == 73 && evtobj.shiftKey && evtobj.ctrlKey) {
- evtobj.preventDefault();
- }
- }
- function authDebugCheck() {
- if (activeInfo.settings.misc.authDebug == true) {
- message(
- "REMINDER",
- "Auth Debug is still enabled",
- activeInfo.settings.notifications.position,
- "#FFF",
- "warning",
- "20000"
- );
- }
- }
- function lock() {
- if (activeInfo.settings.user.oAuthLogin == true) {
- message(
- "Lock Disabled",
- "Lock function disabled if logged in via oAuth",
- activeInfo.settings.notifications.position,
- "#FFF",
- "warning",
- "5000"
- );
- return false;
- }
- organizrAPI2("POST", "api/v2/users/lock", "")
- .success(function (data) {
- try {
- let html = data.response;
- location.reload();
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "Lock Error");
- });
- }
- function openSettings() {
- let tabInfo = findTab("api/v2/page/settings", "access_url");
- tabActions("click", tabInfo.id);
- }
- function openHomepage() {
- let tabInfo = findTab("api/v2/page/homepage", "access_url");
- tabActions("click", tabInfo.id);
- }
- function toggleFullScreenIcon() {
- $(".fullscreen-icon")
- .toggleClass("ti-fullscreen")
- .toggleClass("mdi mdi-fullscreen-exit");
- }
- function toggleFullScreen() {
- toggleFullScreenIcon();
- if (
- !document.fullscreenElement && // alternative standard method
- !document.mozFullScreenElement &&
- !document.webkitFullscreenElement &&
- !document.msFullscreenElement
- ) {
- // current working methods
- if (document.documentElement.requestFullscreen) {
- document.documentElement.requestFullscreen();
- } else if (document.documentElement.msRequestFullscreen) {
- document.documentElement.msRequestFullscreen();
- } else if (document.documentElement.mozRequestFullScreen) {
- document.documentElement.mozRequestFullScreen();
- } else if (document.documentElement.webkitRequestFullscreen) {
- document.documentElement.webkitRequestFullscreen(
- Element.ALLOW_KEYBOARD_INPUT
- );
- }
- } else {
- if (document.exitFullscreen) {
- document.exitFullscreen();
- } else if (document.msExitFullscreen) {
- document.msExitFullscreen();
- } else if (document.mozCancelFullScreen) {
- document.mozCancelFullScreen();
- } else if (document.webkitExitFullscreen) {
- document.webkitExitFullscreen();
- }
- }
- }
- function orgErrorCode(code) {
- switch (code) {
- case "upgrading":
- window.location.href = "./plugins/static/upgrade.html";
- default:
- }
- }
- function clickPath(type, path = null) {
- switch (type) {
- case "c":
- case "custom":
- if (path !== null) {
- if (typeof path == "object") {
- $.each(path, function (i, v) {
- $(v).trigger("click");
- });
- } else {
- $(path).trigger("click");
- }
- } else {
- return null;
- }
- break;
- case "update":
- $("#settings-main-system-settings-anchor").trigger("click");
- $("#settings-settings-updates-anchor").trigger("click");
- break;
- case "sso":
- $("#settings-main-system-settings-anchor").trigger("click");
- $("#settings-settings-sso-anchor").trigger("click");
- break;
- default:
- return null;
- }
- }
- function toggleWritableFolders() {
- $(".folders-writable").toggleClass("hidden");
- }
- function getAllTabNames() {
- var allTabs = $(".tabEditor");
- var tabList = [];
- $.each(allTabs, function (i, v) {
- tabList[i] = v.getAttribute("data-name").toLowerCase();
- });
- return tabList;
- }
- function checkIfTabNameExists(tabName) {
- if (getAllTabNames().indexOf(tabName.toLowerCase()) == -1) {
- return false;
- } else {
- return true;
- }
- }
- function getLatestBlackberryThemes() {
- return $.ajax({
- url: "https://api.github.com/repos/Archmonger/Blackberry-Themes/contents/Themes",
- });
- }
- function getBlackberryTheme(theme) {
- return $.ajax({
- url:
- "https://api.github.com/repos/Archmonger/Blackberry-Themes/contents/Themes/" +
- theme +
- "/Icons",
- });
- }
- function showBlackberryThemes(target) {
- getLatestBlackberryThemes()
- .success(function (data) {
- try {
- let themes = "";
- $.each(data, function (i, v) {
- if (v.name !== "Beta") {
- themes += `<a href="javascript:selectBlackberryTheme('${v.name}','${target}');" class="list-group-item"><span><img class="themeIcon pull-right" src="https://raw.githubusercontent.com/Archmonger/Blackberry-Themes/master/Themes/${v.name}/Icons/preview.png"></span>${v.name}</a>`;
- }
- });
- themes = `<div class="list-group">${themes}</div>`;
- let html = `
- <div class="panel">
- <div class="bg-org2">
- <div class="panel-heading">Choose a Theme</div>
- <div class="panel-body text-left">${themes}</div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(html),
- button: "Close",
- className: "orgErrorAlert",
- dangerMode: true,
- });
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function selectBlackberryTheme(theme, target) {
- getBlackberryTheme(theme)
- .success(function (data) {
- try {
- let icons = "";
- $.each(data, function (i, v) {
- v.name = v.name.split(".")[0];
- v.name = cleanClass(v.name);
- icons += `<a href="#" onclick="javascript:swal.close();$('#${target}').val('${v.download_url}')"><img alt="${v.name}" data-toggle="tooltip" data-placement="top" title="" data-original-title="${v.name}"src="${v.download_url}" ></a>`;
- });
- icons = `<div id="gallery-content-center">${icons}</div>`;
- let html = `
- <div class="panel">
- <div class="bg-org2">
- <div class="panel-heading">Choose an Icon</div>
- <div class="panel-body text-left">${icons}</div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(html),
- buttons: {
- back: {
- text: "Back To Themes",
- value: "back",
- dangerMode: true,
- className: "bg-org-alt",
- },
- },
- className: "orgErrorAlert",
- dangerMode: true,
- }).then((value) => {
- switch (value) {
- case "back":
- showBlackberryThemes();
- break;
- }
- });
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function orgErrorAlert(error) {
- let showError = false;
- if (typeof activeInfo === "undefined") {
- showError = true;
- } else {
- if (activeInfo.settings.misc.debugErrors) {
- showError = true;
- }
- }
- if (showError) {
- let div = `
- <div class="panel">
- <div class="bg-org2">
- <div class="panel-heading">ERROR</div>
- <div class="panel-body text-left">${error}</div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- button: "OK",
- className: "orgErrorAlert",
- dangerMode: true,
- });
- }
- }
- function toggleDebug() {
- var div = `
- <div class="white-box m-0">
- <div class="steamline">
- <div class="sl-item">
- <div class="sl-left bg-success"><i class="mdi mdi-code-tags"></i></div>
- <div class="sl-right">
- <div class="form-group">
- <div id="" class="input-group">
- <input id="debug-input" lang="en" placeholder="Input Command" type="text"
- class="form-control inline-focus">
- <div class="input-group-btn">
- <button type="button"
- class="btn waves-effect waves-light btn-info dropdown-toggle"
- data-toggle="dropdown" aria-expanded="false"><span lang="en">Commands</span>
- <span class="caret"></span></button>
- <ul class="dropdown-menu dropdown-menu-right">
- <li><a onclick="orgDebugList('activeInfo.settings.sso');"
- href="javascript:void(0)"
- lang="en">SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.plex');"
- href="javascript:void(0)"
- lang="en">Plex SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.tautulli');"
- href="javascript:void(0)"
- lang="en">Tautulli SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.overseerr');"
- href="javascript:void(0)"
- lang="en">Overseerr SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.petio');"
- href="javascript:void(0)"
- lang="en">Petio SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.ombi');"
- href="javascript:void(0)"
- lang="en">Ombi SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.jellyfin');"
- href="javascript:void(0)"
- lang="en">Jellyfin SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.komga');"
- href="javascript:void(0)"
- lang="en">Komga SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.sso.misc');"
- href="javascript:void(0)"
- lang="en">Misc SSO</a></li>
- <li><a onclick="orgDebugList('activeInfo.settings.misc.schema');"
- href="javascript:void(0)"
- lang="en">DB Schema</a></li>
- </ul>
- </div>
- </div>
- <div class="clearfix"></div>
- </div>
- </div>
- </div>
- <div id="debugPreInfoBox" class="sl-item text-left">
- <div class="sl-left bg-info"><i class="mdi mdi-package-variant-closed"></i></div>
- <div class="sl-right">
- <div>
- <span lang="en">Organizr Information:</span>
- </div>
- <div id="debugPreInfo" class="desc"></div>
- </div>
- </div>
- <div id="debugResultsBox" class="sl-item hidden text-left">
- <div class="sl-left bg-info"><i class="mdi mdi-receipt"></i></div>
- <div class="sl-right">
- <div><span lang="en">Results For cmd:</span> <span class="cmdName"></span>
- </div>
- <div id="debugResults" class="desc"></div>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- button: "OK",
- className: "orgErrorAlert",
- });
- getDebugPreInfo();
- }
- function toggleCalendarFilter() {
- var div = `
- <div id="calendar-filter-modal" class="panel panel-inverse">
- <div class="panel-heading"><span class="text-uppercase" lang="en">Filter Calendar</span></div>
- <div class="panel-wrapper collapse in" aria-expanded="true">
- <div class="panel-body">
- <div class="row">
- <div class="col-md-12">
- <label class="control-label" lang="en">Choose Media Type</label>
- <select class="form-control form-white" data-placeholder="Choose media type" id="choose-calender-filter">
- <option value="all" lang="en">All</option>
- <option value="tv" lang="en">TV</option>
- <option value="film" lang="en">Movie</option>
- <option value="music" lang="en">Music</option>
- </select>
- </div>
- <div class="col-md-12">
- <label class="control-label" lang="en">Choose Media Status</label>
- <select class="form-control form-white" data-placeholder="Choose media status" id="choose-calender-filter-status">
- <option value="all" lang="en">All</option>
- <option value="text-success" lang="en">Downloaded</option>
- <option value="text-info" lang="en">Unaired</option>
- <option value="text-danger" lang="en">Missing</option>
- <option value="text-primary animated flash" lang="en">Premier</option>
- </select>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- className: "bg-org",
- button: false,
- });
- }
- function closeOrgError() {
- $("#main-org-error-container").removeClass("show");
- $("#main-org-error").html("");
- }
- function isJSON(data) {
- if (typeof data != "string") {
- data = JSON.stringify(data);
- }
- try {
- JSON.parse(data);
- return true;
- } catch (e) {
- return false;
- }
- }
- function createElementFromHTML(htmlString) {
- var div = document.createElement("div");
- div.innerHTML = htmlString.trim();
- return div.firstChild;
- }
- function addCoordinatesToInput(latitude, longitude) {
- $("#homepage-Weather-Air-form [name=homepageWeatherAndAirLatitude]")
- .val(latitude)
- .change();
- $("#homepage-Weather-Air-form [name=homepageWeatherAndAirLongitude]")
- .val(longitude)
- .change();
- swal.close();
- message(
- "Coordinates Added",
- "Please Save",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "10000"
- );
- }
- function searchCoordinatesAPI(query) {
- messageSingle(
- "Submitting Query",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "info",
- "5000"
- );
- organizrAPI2("POST", "api/v2/homepage/weather/coordinates", { query: query })
- .success(function (data) {
- try {
- let html = data.response;
- if (html.data.type == "FeatureCollection") {
- var entries = "";
- $.each(html.data.features, function (i, v) {
- entries +=
- '<li class="text-left"><i class="fa fa-caret-right text-info"></i><span class="mouse" onclick="addCoordinatesToInput(\'' +
- v.center[1] +
- "','" +
- v.center[0] +
- "')\">" +
- v.place_name +
- "</span></li>";
- });
- var div =
- `
- <div class="row">
- <div class="col-12">
- <div class="card m-b-0">
- <div class="form-horizontal">
- <div class="card-body">
- <h4 class="card-title" lang="en">Select Place</h4>
- <div class="form-group row">
- <div class="col-sm-12">
- <ul class="list-icons">
- ` +
- entries +
- `
- </ul>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- if (entries !== "") {
- swal.close();
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- });
- } else {
- message(
- "API Error",
- "No results found...",
- activeInfo.settings.notifications.position,
- "#FFF",
- "warning",
- "10000"
- );
- }
- } else {
- message(
- "API Error",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "warning",
- "10000"
- );
- console.error("Organizr Function: API failed");
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "API Error");
- });
- }
- function showLookupCoordinatesModal() {
- var div = `
- <div class="row">
- <div class="col-12">
- <div class="card m-b-0">
- <div class="form-horizontal">
- <div class="card-body">
- <h4 class="card-title" lang="en">Enter City or Address</h4>
- <div class="form-group row">
- <div class="col-sm-12">
- <input type="text" class="form-control" id="coordinatesModalCityInput" placeholder="Enter City or Address...">
- </div>
- </div>
- <div class="form-group mb-0 p-r-10 text-right">
- <button type="submit" onclick="searchCoordinatesAPI($('#coordinatesModalCityInput').val())" class="btn btn-info waves-effect waves-light">Submit</button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- });
- }
- function showLDAPLoginTest() {
- var div = `
- <div class="row">
- <div class="col-12">
- <div class="card m-b-0">
- <div class="form-horizontal">
- <div class="card-body">
- <h4 class="card-title" lang="en">LDAP User Info</h4>
- <div class="form-group row">
- <div class="col-sm-12">
- <input type="text" class="form-control" id="ldapUsernameTest" placeholder="Username">
- </div>
- </div>
- <div class="form-group row">
- <div class="col-sm-12">
- <input type="password" class="form-control" id="ldapPasswordTest" placeholder="Password">
- </div>
- </div>
- <div class="form-group mb-0 p-r-10 text-right">
- <button type="submit" onclick="testAPIConnection('ldap/login', {'username':$('#ldapUsernameTest').val(),'password':$('#ldapPasswordTest').val()})" class="btn btn-info waves-effect waves-light">Test Login</button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- });
- }
- function showPlexTokenForm(selector = null) {
- var div =
- `
- <form id="get-plex-token-form">
- <h1 lang="en">Get Plex Token</h1>
- <div class="panel plexTokenHeader">
- <div class="panel-heading plexTokenMessage" lang="en">Enter Plex Details</div>
- </div>
- <fieldset style="border:0;">
- <div class="form-group">
- <label class="control-label" for="plex-token-form-username" lang="en">Plex Username</label>
- <input type="text" class="form-control" id="plex-token-form-username" name="username" required="" autofocus>
- </div>
- <div class="form-group">
- <label class="control-label" for="plex-token-form-password" lang="en">Plex Password</label>
- <input type="password" class="form-control" id="plex-token-form-password" name="password" required="">
- </div>
- <div class="form-group">
- <label class="control-label" for="plex-token-form-tfa" lang="en">Plex 2FA (if applicable)</label>
- <input type="text" class="form-control" id="plex-token-form-tfa" name="tfa" >
- </div>
- </fieldset>
- <button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none" onclick="getPlexToken('` +
- selector +
- `')" type="button"><span class="btn-label"><i class="fa fa-ticket"></i></span><span lang="en">Grab It</span></button>
- <div class="clearfix"></div>
- </form>
- `;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- });
- }
- function getPlexToken(selector) {
- $(".plexTokenMessage").text("Grabbing Token");
- $(".plexTokenHeader")
- .addClass("panel-info")
- .removeClass("panel-warning")
- .removeClass("panel-danger");
- var plex_username = $("#get-plex-token-form [name=username]").val().trim();
- var plex_password = $("#get-plex-token-form [name=password]").val().trim();
- var plex_tfa = $("#get-plex-token-form [name=tfa]").val().trim();
- if (plex_password !== "" && plex_password !== "") {
- $.ajax({
- type: "POST",
- headers: {
- "X-Plex-Product": "Organizr",
- "X-Plex-Version": "2.0",
- "X-Plex-Client-Identifier": "01010101-10101010",
- },
- url: "https://plex.tv/users/sign_in.json",
- data: {
- "user[login]": plex_username,
- "user[password]": plex_password + plex_tfa,
- force: true,
- },
- cache: false,
- async: true,
- complete: function (xhr, status) {
- var result = $.parseJSON(xhr.responseText);
- if (xhr.status === 201) {
- $(".plexTokenMessage").text(xhr.statusText);
- $(".plexTokenHeader")
- .addClass("panel-success")
- .removeClass("panel-info")
- .removeClass("panel-warning")
- .removeClass("panel-danger");
- $(selector).val(result.user.authToken);
- $(selector).change();
- messageSingle(
- "Token created",
- "Please save...",
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } else {
- $(".plexTokenMessage").text(xhr.statusText);
- $(".plexTokenHeader")
- .addClass("panel-danger")
- .removeClass("panel-info")
- .removeClass("panel-warning");
- }
- },
- });
- } else {
- $(".plexTokenMessage").text("Enter Username and Password");
- $(".plexTokenHeader")
- .addClass("panel-warning")
- .removeClass("panel-info")
- .removeClass("panel-danger");
- }
- }
- function showPlexMachineForm(selector = null) {
- var div = `
- <form id="get-plex-machine-form">
- <h1 lang="en">Get Plex Machine</h1>
- <div class="panel plexMachineHeader">
- <div class="panel-heading plexMachineMessage" lang="en">Contacting server...</div>
- </div>
- <fieldset style="border:0;">
- <div class="form-group">
- <label class="control-label" for="plex-machine-form-machine" lang="en">Plex Machine</label>
- <div class="plexMachineListing"></div>
- </div>
- </fieldset>
- <div class="clearfix"></div>
- </form>
- `;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "bg-org",
- }).then(
- organizrAPI2("GET", "api/v2/plex/servers?owned")
- .success(function (data) {
- try {
- let response = data.response;
- $(".plexMachineMessage").text("Choose Plex Server");
- $(".plexMachineHeader")
- .addClass("panel-success")
- .removeClass("panel-info")
- .removeClass("panel-warning");
- let machines = '<option lang="en">Choose Plex Machine</option>';
- $.each(response.data, function (i, v) {
- let name = v.name;
- let machine = v.machineIdentifier;
- name = name + " [" + machine + "]";
- machines += '<option value="' + machine + '">' + name + "</option>";
- });
- let listing =
- '<select class="form-control" id="plexMachineSelector" data-selector="' +
- selector +
- '" data-type="select">' +
- machines +
- "</select>";
- $(".plexMachineListing").html(listing);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr, "API Error");
- $(".plexMachineMessage").text("Plex Token Needed First");
- $(".plexMachineHeader")
- .addClass("panel-warning")
- .removeClass("panel-info")
- .removeClass("panel-danger");
- })
- );
- }
- function bypassLocalLogin() {
- if (activeInfo.settings.user.bypass !== true) {
- return false;
- }
- const bypass = $.urlParam("bypassDisable");
- if (bypass) {
- return false;
- }
- OAuthLoginNeeded = true;
- oAuthLoginNeededCheck("Bypass");
- }
- function oAuthLoginNeededCheck(type = "OAuth") {
- if (OAuthLoginNeeded == false) {
- return false;
- } else {
- if (activeInfo.user.loggedin == true) {
- return false;
- }
- }
- let data = "";
- if (type === "Bypass") {
- const bypass = $.urlParam("bypassDisable");
- if (bypass) {
- data = "bypass";
- }
- }
- message(
- type,
- " Proceeding to login",
- activeInfo.settings.notifications.position,
- "#FFF",
- "info",
- "10000"
- );
- organizrAPI2("POST", "api/v2/login", data)
- .success(function (data) {
- local("set", "message", "Welcome|Login Successful|success");
- local("r", "loggingIn");
- location.reload();
- })
- .fail(function (xhr) {
- $("div.login-box").unblock({});
- switch (xhr.status) {
- case 401:
- if (xhr.responseJSON.response.message == "2FA Code incorrect") {
- $("div.login-box").unblock({});
- $("#tfa-div").removeClass("hidden");
- $("#loginform [name=tfaCode]").focus();
- }
- break;
- case 403:
- $("div.login-box").block({
- message: '<h5><i class="fa fa-close"></i> Locked Out!</h4>',
- css: {
- color: "#fff",
- border: "1px solid #e91e63",
- backgroundColor: "#f44336",
- },
- });
- setTimeout(function () {
- local("r", "loggingIn");
- location.reload();
- }, 10000);
- break;
- case 422:
- $("div.login-box").unblock({});
- $("#tfa-div").removeClass("hidden");
- $("#loginform [name=tfaCode]").focus();
- break;
- default:
- message(
- "Login Error",
- "API Connection Failed",
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "10000"
- );
- console.error("Organizr Function: API Connection Failed");
- }
- message(
- "Login Error",
- xhr.responseJSON.response.message,
- activeInfo.settings.notifications.position,
- "#FFF",
- "warning",
- "10000"
- );
- console.error("Organizr Function: " + xhr.responseJSON.response.message);
- local("r", "loggingIn");
- });
- }
- function ipInfoSpan(ip) {
- return '<span class="ipInfo mouse">' + ip + "</span>";
- }
- function jsFriendlyJSONStringify(s) {
- return JSON.stringify(s)
- .replace("'", "")
- .replace(/\u2028/g, "\\u2028")
- .replace(/\u2029/g, "\\u2029");
- }
- function exportLogs() {
- const query = "api/v2/log/0?filter=NONE&pageSize=1000&offset=0";
- $.get(query, function (data) {
- const logs = data.response.data.results;
- let csvContent =
- "data:text/csv;charset=utf-8,Date,Severity,Function,Message,IP Address,User\n";
- logs.forEach(function (log) {
- const row = [
- log.datetime,
- log.log_level,
- log.channel,
- log.message,
- log.remote_ip_address,
- log.username,
- ].join(",");
- csvContent += row + "\n";
- });
- const encodedUri = encodeURI(csvContent);
- const link = document.createElement("a");
- link.setAttribute("href", encodedUri);
- link.setAttribute("download", "organizr_logs.csv");
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- });
- }
- function logContext(row) {
- let buttons = "";
- buttons +=
- Object.keys(row).length > 0
- ? '<button data-toggle="tooltip" title="" data-original-title="View Details" class="btn btn-xs btn-primary waves-effect waves-light log-details m-r-5" data-trace="' +
- row.trace_id +
- '"><i class="mdi mdi-file-find"></i></button>'
- : "";
- buttons +=
- Object.keys(row).length > 0
- ? '<button data-toggle="tooltip" title="" data-original-title="Copy Log" class="btn btn-xs btn-info waves-effect waves-light log-details m-r-5" data-trace="' +
- row.trace_id +
- '" data-clipboard="true"><i class="mdi mdi-content-copy"></i></button>'
- : "";
- return buttons;
- }
- function formatLogDetails(details) {
- if (!details) {
- return false;
- }
- let m = moment.tz(details.datetime + "Z", activeInfo.timezone);
- details.datetime = moment(m).format("LLL");
- let items = "";
- items += `<li><div class="bg-inverse"><i class="mdi mdi-calendar-text text-white"></i></div> ${details.datetime}<span class="text-muted" lang="en">Date</span></li>`;
- items += `<li><div class="bg-warning"><i class="mdi mdi-robot text-white"></i></div> ${details.trace_id}<span class="text-muted" lang="en">Trace ID</span></li>`;
- items += `<li><div class="bg-primary"><i class="mdi mdi-account-box-outline text-white"></i></div> ${details.username}<span class="text-muted" lang="en">User</span></li>`;
- items += `<li><div class="bg-info"><i class="mdi mdi-function text-white"></i></div> ${details.channel}<span class="text-muted" lang="en">Function</span></li>`;
- items += `<li><div class="bg-plex"><i class="mdi mdi-language-php text-white"></i></div> ${details.file}<code>#L${details.line}</code><span class="text-muted" lang="en">File</span></li>`;
- let items2 = "";
- items2 +=
- Object.keys(details.context).length > 0
- ? `<div class="sl-item"><div class="sl-left bg-inverse"> <i class="mdi mdi-json"></i></div><div class="sl-right"><div class="p-t-10 desc" lang="en">Context</div></div><pre class="m-5 fc-scroller">${JSON.stringify(
- details.context,
- null,
- 5
- )}</pre></div>`
- : "";
- items2 +=
- typeof details.errors !== "undefined"
- ? `<div class="sl-item"><div class="sl-left bg-danger"> <i class="mdi mdi-code-braces"></i></div><div class="sl-right"><div class="p-t-10 desc" lang="en">Errors</div></div><pre class="m-5 fc-scroller">${JSON.stringify(
- details.errors,
- null,
- 5
- )}</pre></div>`
- : "";
- var div = `
- <div class="col-lg-12">
- <div class="panel panel-default text-left">
- <div class="panel-heading"><i class="mdi mdi-file-find fa-lg fa-2x"></i> <span lang="en">Log Details</span> <span class="pull-right">${logIcon(
- details.log_level,
- true
- )}</span></div>
- <div class="panel-wrapper collapse in">
- <div class="panel-body bg-org">
- <h3>${details.message}</h3>
- <div class="white-box">
- <ul class="feeds">
- ${items}
- </ul>
- </div>
- <div class="steamline">
- ${items2}
- </div>
- </div>
- </div>
- </div>
- </div>`;
- swal({
- content: createElementFromHTML(div),
- buttons: false,
- className: "orgAlertTransparent",
- });
- pageLoad();
- }
- function checkToken(activate = false) {
- if (typeof activeInfo !== "undefined") {
- if (typeof activeInfo.settings.misc.uuid !== "undefined") {
- var token = getCookie("organizr_token_" + activeInfo.settings.misc.uuid);
- if (token) {
- setTimeout(function () {
- checkToken(true);
- }, 5000);
- } else {
- if (activate) {
- local(
- "set",
- "message",
- "Token Expired|You have been logged out|error"
- );
- location.reload();
- }
- }
- }
- }
- }
- function objDiff(obj1, obj2) {
- // Make sure an object to compare is provided
- if (!obj2 || Object.prototype.toString.call(obj2) !== "[object Object]") {
- return obj1;
- }
- //
- // Variables
- //
- var diffs = {};
- var key;
- //
- // Methods
- //
- /**
- * Check if two arrays are equal
- * @param {Array} arr1 The first array
- * @param {Array} arr2 The second array
- * @return {Boolean} If true, both arrays are equal
- */
- var arraysMatch = function (arr1, arr2) {
- // Check if the arrays are the same length
- if (arr1.length !== arr2.length) return false;
- // Check if all items exist and are in the same order
- for (var i = 0; i < arr1.length; i++) {
- if (arr1[i] !== arr2[i]) return false;
- }
- // Otherwise, return true
- return true;
- };
- /**
- * Compare two items and push non-matches to object
- * @param {*} item1 The first item
- * @param {*} item2 The second item
- * @param {String} key The key in our object
- */
- var compare = function (item1, item2, key) {
- // Get the object type
- var type1 = Object.prototype.toString.call(item1);
- var type2 = Object.prototype.toString.call(item2);
- // If type2 is undefined it has been removed
- if (type2 === "[object Undefined]") {
- diffs[key] = null;
- return;
- }
- // If items are different types
- if (type1 !== type2) {
- diffs[key] = item2;
- return;
- }
- // If an object, compare recursively
- if (type1 === "[object Object]") {
- var objDifference = objDiff(item1, item2);
- if (Object.keys(objDifference).length > 1) {
- diffs[key] = objDifference;
- }
- return;
- }
- // If an array, compare
- if (type1 === "[object Array]") {
- if (!arraysMatch(item1, item2)) {
- diffs[key] = item2;
- }
- return;
- }
- // Else if it's a function, convert to a string and compare
- // Otherwise, just compare
- if (type1 === "[object Function]") {
- if (item1.toString() !== item2.toString()) {
- diffs[key] = item2;
- }
- } else {
- if (item1 !== item2) {
- diffs[key] = item2;
- }
- }
- };
- //
- // Compare our objects
- //
- // Loop through the first object
- for (key in obj1) {
- if (obj1.hasOwnProperty(key)) {
- compare(obj1[key], obj2[key], key);
- }
- }
- // Loop through the second object and find missing items
- for (key in obj2) {
- if (obj2.hasOwnProperty(key)) {
- if (!obj1[key] && obj1[key] !== obj2[key]) {
- diffs[key] = obj2[key];
- }
- }
- }
- // Return the object of differences
- return diffs;
- }
- function organizrConsole(subject, msg, type = "info") {
- let color;
- switch (type) {
- case "error":
- color = "#ed2e72";
- break;
- case "warning":
- color = "#272361";
- break;
- default:
- color = "#2cabe3";
- break;
- }
- console.info(
- "%c " + subject + " %c ".concat(msg, " "),
- "color: white; background: " + color + "; font-weight: 700;",
- "color: " + color + "; background: white; font-weight: 700;"
- );
- }
- function organizrCatchError(e, data) {
- organizrConsole("Organizr API Function", data, "warning");
- orgErrorAlert(
- "<h4>" +
- e +
- '</h4><p><mark lang="en">Trace Log has been outputted to Browser Console</mark></p><h5 lang="en">Output of last API call</h5>' +
- formatDebug(data)
- );
- console.trace();
- return false;
- }
- function OrganizrApiError(xhr, secondaryMessage = null) {
- let msg = "";
- if (typeof xhr.responseJSON !== "undefined") {
- msg = xhr.responseJSON.response.message;
- } else if (typeof xhr.statusText !== "undefined") {
- msg = xhr.statusText;
- } else if (typeof xhr.responseText !== "undefined") {
- msg = xhr.responseText;
- } else {
- msg = "Connection Error";
- }
- organizrConsole("Organizr API Function", msg, "error");
- if (msg !== "abort") {
- if (secondaryMessage) {
- messageSingle(
- secondaryMessage,
- msg,
- activeInfo.settings.notifications.position,
- "#FFF",
- "error",
- "10000"
- );
- }
- console.trace();
- }
- return false;
- }
- function checkForUpdates() {
- if (
- activeInfo.user.loggedin &&
- activeInfo.user.groupID <= 1 &&
- activeInfo.settings.misc.checkForUpdate
- ) {
- updateCheck();
- checkCommitLoad();
- checkPluginUpdates();
- }
- }
- function loadJavascript(script = null, defer = false) {
- if (script) {
- organizrConsole("JS Loader", script);
- organizrConsole("JS Loader", "Checking if script is loaded...");
- let loaded = $('script[src="' + script + '"]').length;
- if (!loaded) {
- organizrConsole("JS Loader", "Script is NOT loaded... Loading now...");
- let head = document.getElementsByTagName("head")[0];
- let scriptEl = document.createElement("script");
- scriptEl.type = "text/javascript";
- scriptEl.src = script;
- scriptEl.defer = false;
- head.appendChild(scriptEl);
- } else {
- organizrConsole("JS Loader", "Script already loaded");
- }
- }
- }
- function tabShit() {}
- function msToTime(s) {
- let pad = (n, z = 2) => ("00" + n).slice(-z);
- let hours = pad((s / 3.6e6) | 0) !== "00" ? pad((s / 3.6e6) | 0) + ":" : "";
- let mins = pad(((s % 3.6e6) / 6e4) | 0) + ":";
- let secs = pad(((s % 6e4) / 1000) | 0);
- let ms = pad(s % 1000, 3);
- if (ms >= "500") {
- secs = pad(parseFloat(secs) + 1, 2);
- }
- return hours + mins + secs;
- }
- function clickSettingsTab() {
- let tabs = $(".allTabsList");
- $.each(tabs, function (i, v) {
- let tab = $(v);
- if (tab.attr("data-url") == "api/v2/page/settings") {
- tab.find("a").trigger("click");
- }
- });
- }
- function clickMenuItem(selector) {
- if ($(selector).length >= 1) {
- $(selector).click();
- } else {
- $("body").arrive(selector, { onceOnly: true }, function () {
- $(selector).click();
- });
- }
- }
- function shortcut(selectors = "") {
- let timeout = 200;
- if (typeof selectors == "string") {
- if (selectors == "") {
- selectors = [];
- } else {
- switch (selectors) {
- case "log-settings":
- clickSettingsTab();
- selectors = [
- "#settings-main-system-settings-anchor",
- "#settings-settings-main-anchor",
- 'a[href$="Logs"]',
- ];
- break;
- case "plugin-marketplace":
- clickSettingsTab();
- selectors = [
- "#settings-main-plugins-anchor",
- "#settings-plugins-marketplace-anchor",
- ];
- break;
- case "custom-cert":
- clickSettingsTab();
- selectors = [
- "#settings-main-system-settings-anchor",
- "#settings-settings-main-anchor",
- 'a[href$="Certificate"]',
- ];
- break;
- default:
- clickSettingsTab();
- selectors = ["#settings-main-system-settings-anchor"];
- }
- }
- }
- selectors.forEach(function (selector) {
- timeout = timeout + 200;
- setTimeout(function () {
- clickMenuItem(selector);
- }, timeout);
- });
- }
- function getJournalMode() {
- organizrAPI2("GET", "api/v2/database/journal")
- .success(function (data) {
- try {
- let response = data.response;
- $(".journal-mode").html(response.data.journal_mode);
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function setJournalMode(mode) {
- messageSingle(
- "Setting New Journal Mode",
- "",
- activeInfo.settings.notifications.position,
- "#FFF",
- "info",
- "1500"
- );
- organizrAPI2("PUT", "api/v2/database/journal/" + mode, {})
- .success(function (data) {
- try {
- getJournalMode();
- let response = data.response;
- message(
- "Set New Journal Mode",
- response.data.journal_mode,
- activeInfo.settings.notifications.position,
- "#FFF",
- "success",
- "5000"
- );
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- }
- function toggleSideMenuClasses() {
- $("#page-wrapper").toggleClass("sidebar-hidden");
- $(".sidebar").toggleClass("sidebar-hidden");
- $(".navbar").toggleClass("sidebar-hidden");
- }
- function sideMenuCollapsed() {
- if (activeInfo.settings.misc.sideMenuCollapsed) {
- toggleSideMenuClasses();
- }
- }
- function toggleSideMenu() {
- toggleSideMenuClasses();
- $(".sidebar-head .open-close i")
- .first()
- .toggleClass("ti-menu ti-shift-left mouse");
- $(".toggle-side-menu").toggleClass("hidden");
- }
- function toggleTopBarHamburger() {
- toggleSideMenuClasses();
- $(".sidebar-head .hide-menu.hidden-xs").text("Hide Menu");
- $(".sidebar-head .open-close i")
- .first()
- .toggleClass("ti-menu ti-shift-left mouse");
- $(".toggle-side-menu").toggleClass("hidden");
- }
- function toggleLogFilter(filter = "INFO") {
- //choose-organizr-log
- filter = filter.toUpperCase();
- $.each($(".choose-organizr-log").children(), function (i, v) {
- let url = $(v).val();
- let newURL = updateUrlParameter(url, "filter", filter);
- $(v).val(newURL);
- });
- $(".log-filter-text").text(filter);
- $(".log-filter-text").text(filter);
- let currentURL = organizrLogTable.ajax.url();
- let updatedURL = updateUrlParameter(currentURL, "filter", filter);
- organizrLogTable.ajax.url(updatedURL);
- organizrLogTable.clear().draw().ajax.reload(null, false);
- }
- function updateUrlParameter(uri, key, value) {
- // remove the hash part before operating on the uri
- var i = uri.indexOf("#");
- var hash = i === -1 ? "" : uri.substr(i);
- uri = i === -1 ? uri : uri.substr(0, i);
- var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
- var separator = uri.indexOf("?") !== -1 ? "&" : "?";
- if (value === null) {
- // remove key-value pair if value is specifically null
- uri = uri.replace(new RegExp("([?&]?)" + key + "=[^&]*", "i"), "");
- if (uri.slice(-1) === "?") {
- uri = uri.slice(0, -1);
- }
- // replace first occurrence of & by ? if no ? is present
- if (uri.indexOf("?") === -1) uri = uri.replace(/&/, "?");
- } else if (uri.match(re)) {
- uri = uri.replace(re, "$1" + key + "=" + value + "$2");
- } else {
- uri = uri + separator + key + "=" + value;
- }
- return uri + hash;
- }
- function launch() {
- console.info(
- "https://docs.organizr.app/help/faq/migration-guide#version-2-0-greater-than-version-2-1"
- );
- organizrConsole(
- "API V2 API",
- "If you see a 404 Error for api/v2/launch below this line, you have not setup the new location block... See URL above this line",
- "error"
- );
- organizrConnect("api/v2/launch")
- .success(function (data) {
- try {
- let json = data.response;
- if (json.data.user == false) {
- location.reload();
- }
- currentVersion = json.data.version;
- activeInfo = {
- tabs: json.data.tabs,
- categories: json.data.categories,
- timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
- offest: new Date().getTimezoneOffset(),
- language: language(moment.locale(navigator.languages[0])),
- browserVersion: bowser.name,
- browserName: bowser.version,
- mobile: bowser.mobile,
- tablet: bowser.tablet,
- osName: bowser.osname,
- osVersion: bowser.osversion,
- serverOS: json.data.status.os,
- phpVersion: json.data.status.php,
- token: json.data.user.token,
- user: json.data.user,
- plugins: json.data.plugins,
- branch: json.data.branch,
- sso: json.data.sso,
- settings: json.data.settings,
- appearance: json.data.appearance,
- theme: json.data.theme,
- style: json.data.style,
- version: json.data.version,
- };
- // Add element to signal activeInfo Ready
- $("#wrapper").after('<div id="activeInfo"></div>');
- console.info(
- "%c Organizr %c ".concat(currentVersion, " "),
- "color: white; background: #66D9EF; font-weight: 700; font-size: 24px; font-family: Monospace;",
- "color: #66D9EF; background: white; font-weight: 700; font-size: 24px; font-family: Monospace;"
- );
- console.info(
- "%c Status %c ".concat("Starting Up...", " "),
- "color: white; background: #F92671; font-weight: 700;",
- "color: #F92671; background: white; font-weight: 700;"
- );
- //local('set','initial',true);
- //setTimeout(function(){ local('r','initial'); }, 300);
- defineNotification();
- checkMessage();
- errorPage();
- uriRedirect();
- changeStyle(activeInfo.style);
- //changeTheme(activeInfo.theme);
- setSSO();
- checkToken();
- switch (json.data.status.status) {
- case "wizard":
- buildWizard();
- buildLanguage("wizard");
- break;
- case "dependencies":
- buildDependencyCheck(json);
- break;
- case "ok":
- loadAppearance(json.data.appearance);
- sideMenuCollapsed();
- if (activeInfo.user.locked == 1) {
- buildLockscreen();
- } else {
- userMenu(json);
- categoryProcess(json);
- tabProcess(json);
- buildSplashScreen(json);
- accountManager(json);
- organizrSpecialSettings(json.data);
- getPingList(json);
- checkLocalForwardStatus(json.data);
- checkForUpdates();
- }
- loadCustomJava(json.data.appearance);
- if (getCookie("lockout")) {
- $(".show-login").click();
- setTimeout(function () {
- $("div.login-box").block({
- message: '<h5><i class="fa fa-close"></i> Locked Out!</h4>',
- css: {
- color: "#fff",
- border: "1px solid #e91e63",
- backgroundColor: "#f44336",
- },
- });
- }, 1000);
- setTimeout(function () {
- location.reload();
- }, 60000);
- }
- break;
- default:
- console.error("Organizr Function: Action not set or defined");
- }
- console.info(
- "%c Organizr %c ".concat("DOM Fully loaded", " "),
- "color: white; background: #AD80FD; font-weight: 700;",
- "color: #AD80FD; background: white; font-weight: 700;"
- );
- oAuthLoginNeededCheck();
- bypassLocalLogin();
- } catch (e) {
- orgErrorCode(data);
- defineNotification();
- message("FATAL ERROR", data, "br", "#FFF", "error", "60000");
- console.warn(data);
- console.warn(e);
- return false;
- }
- })
- .fail(function (xhr) {
- defineNotification();
- if (xhr.status == 404) {
- orgErrorAlert(
- '<h2>Webserver not setup for Organizr v2.1</h2><h4>Please goto <a href="https://docs.organizr.app/help/faq/migration-guide#version-2-0-greater-than-version-2-1">Migration guide to complete the changes...</a></h4><h3>Webserver Error:</h3>' +
- xhr.responseText
- );
- message(
- "FATAL ERROR",
- "You need to update webserver location block... check browser console for migration URL",
- "br",
- "#FFF",
- "error",
- "60000"
- );
- } else {
- orgErrorAlert("<h3>Webserver Error:</h3>" + xhr.responseText);
- }
- });
- }
- function homepageBookmarks(timeout) {
- var timeout =
- typeof timeout !== "undefined"
- ? timeout
- : activeInfo.settings.homepage.refresh.homepageBookmarksRefresh;
- organizrAPI2("GET", "api/v2/plugins/bookmark/page")
- .success(function (data) {
- try {
- let response = data.response;
- document.getElementById("homepageOrderBookmarks").innerHTML = "";
- if (response.data !== null) {
- $("#homepageOrderBookmarks").html(buildBookmarks(response.data));
- }
- } catch (e) {
- organizrCatchError(e, data);
- }
- })
- .fail(function (xhr) {
- OrganizrApiError(xhr);
- });
- let timeoutTitle = "Bookmarks-Homepage";
- if (typeof timeouts[timeoutTitle] !== "undefined") {
- clearTimeout(timeouts[timeoutTitle]);
- }
- timeouts[timeoutTitle] = setTimeout(function () {
- homepageBookmarks(timeout);
- }, timeout);
- delete timeout;
- }
- function buildBookmarks(data) {
- var returnData = data;
- return returnData;
- }
|