editor.html 386 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=0,user-scalable=yes,maximum-scale=1.0">
  6. <title>JSON在线编辑器</title>
  7. <style>
  8. .jsoneditor-field, .jsoneditor-value, .jsoneditor-field-readonly, .jsoneditor-readonly {
  9. border: 1px solid transparent;
  10. min-height: 16px;
  11. min-width: 24px;
  12. padding: 2px;
  13. margin: 1px;
  14. outline: none;
  15. word-wrap: break-word;
  16. float: left;
  17. }
  18. /* adjust margin of p elements inside editable divs, needed for Opera, IE */
  19. .jsoneditor-field p, .jsoneditor-value p {
  20. margin: 0;
  21. }
  22. .jsoneditor-value {
  23. word-break: break-word;
  24. }
  25. .jsoneditor-empty {
  26. background-color: #E5E5E5;
  27. border-radius: 2px;
  28. }
  29. .jsoneditor-separator {
  30. padding: 3px 0;
  31. vertical-align: top;
  32. }
  33. .jsoneditor-value:focus, .jsoneditor-field:focus,
  34. .jsoneditor-value:hover, .jsoneditor-field:hover,
  35. .jsoneditor-search-highlight {
  36. background-color: #FFFFAB;
  37. border: 1px solid yellow;
  38. border-radius: 2px;
  39. }
  40. .jsoneditor-search-highlight-active,
  41. .jsoneditor-search-highlight-active:focus,
  42. .jsoneditor-search-highlight-active:hover {
  43. background-color: #ffee00;
  44. border: 1px solid #ffc700;
  45. border-radius: 2px;
  46. }
  47. .jsoneditor-field-readonly:hover {
  48. border: 1px solid white;
  49. }
  50. .jsoneditor-readonly {
  51. color: gray;
  52. }
  53. button.jsoneditor-remove, button.jsoneditor-append, button.jsoneditor-duplicate,
  54. button.jsoneditor-collapsed, button.jsoneditor-expanded,
  55. button.jsoneditor-invisible, button.jsoneditor-dragarea,
  56. button.jsoneditor-type-auto, button.jsoneditor-type-string,
  57. button.jsoneditor-type-array, button.jsoneditor-type-object {
  58. width: 24px;
  59. height: 24px;
  60. padding: 0;
  61. margin: 0;
  62. border: none;
  63. cursor: pointer;
  64. background: url('data:image/png;base64,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+QicjbNxdnr6s67/QqkpEvCu37t+7yYmkhyzPn3oebKOS+/evm/7vu37tq2taINog2hDcjLui/vivvfvk9wWGlTf/gyb1qbVVKqGcmMYrcOzhpa19foqNNeFGiRUsaYhZXUNGBqqRD1NtMxvSUlJSctFDDcfGorl6urq6uqq9WjQ43QdFaGhoZKN5bA1Bv3+6lbrYzAYz86t9Fvpt9JLSjxcPFw8XNLSSE5UfQMGTUKT0KTqapyAE3DC3LnEcNHBUEOGTiLbJ9sn27d2Lc7BOTgnMJB4Xuq3ox4ZUtUsOJgYAr/8ohQpRUoRLeeuewp2aVBpUGnQ1KloBVqBVhgYNGioY8CAHzwwdjZ2NnY+dQpUoIIWDFQcsHnA5gGb//pL1VnVWdW5Y0dioNAFJgG4aC6ai7a2JsetrenxUXgUHoXDw1s7h6Uh2npdl6eFqRzPGe1loUc64089Wg1Vf6Ncv379+vXr2ut0pZ+5ubm5ubn1FXgagkg9M3WLDFCPXltDDT+6bS7Ug9aY55LBYDw9U6ZMmTJlikZDci9ef91jpMdIj5F6evh3/Dv+fcoU6AbdoJtajX/GP+OfZ870MvEy8TI5dEhouRntC3G0OFocHRpa/kP5D+U/ODnBN/ANfOPt3eAFf8Af8EdysuRPyZ+SP9evJwd1z3ChcKlcKpdaXk4mAOqXt0br0Xq0/vZtzTTNNM20U6fkafI0eVrLxwrRhTVJ9bGff1bNUM1QzRg0iM/gM/iMXr1oaFnNBY/WdxHKcGkvMAOGoRM0VtxB14o/UJoaMkVDrhgMBqOpUEOGVB+bPdtkoclCk4VmZpwdZ8fZffcdSX4/fFhoORntE5q7MOHchHMTzq1Zo/+C/gv6L+zbR0Llaq3cNx/mw/y8PFI1beVKuY/cR+6ji0kBj8Pn8Dl8DsboEDqEDpWW8if4E/yJrCx9S31LfcurV6N9on2ifdpuCo4aMmTv3LlxL4x7YdwLKSmSNyVvSt50d9cM1AzUDLS3x2IsxuJaVfgEQter2OlQ1CuDwWAwGAwGQwhocjufxWfxWeHhaCPaiDZyHPwKv8Kvb7yhsFHYKGzqr1zPYDAYDAaDwWAwGIIh7SvtK+07eTJZ52nGDKHlYTAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYbcH/AWLj1/vuodg2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEyLTEwLTAxVDIyOjQxOjA1KzAyOjAwuT6y7gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMi0xMC0wMVQyMjo0MTowNSswMjowMMhjClIAAAB1dEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvam9zL0Ryb3Bib3gvSm9zL3Byb2dyYW1taW5nL2phdmFzY3JpcHQvanNvbmVkaXRvcm9ubGluZS9qc29uZWRpdG9yL2ltZy9qc29uZWRpdG9yLWljb25zLnN2Z2qDex0AAAAASUVORK5CYII=');
  65. }
  66. button:disabled {
  67. color: #808080;
  68. }
  69. button.jsoneditor-collapsed {
  70. background-position: -168px 0;
  71. }
  72. button.jsoneditor-expanded {
  73. background-position: -168px -24px;
  74. }
  75. button.jsoneditor-invisible {
  76. visibility: hidden;
  77. background: none;
  78. }
  79. button.jsoneditor-collapsed, button.jsoneditor-expanded,
  80. button.jsoneditor-invisible {
  81. float: left;
  82. }
  83. button.jsoneditor-remove {
  84. background-position: -24px -24px;
  85. }
  86. button.jsoneditor-remove:hover {
  87. background-position: -24px 0;
  88. }
  89. button.jsoneditor-append {
  90. background-position: 0 -24px;
  91. }
  92. button.jsoneditor-append:hover {
  93. background-position: 0 0;
  94. }
  95. button.jsoneditor-duplicate {
  96. background-position: -48px -24px;
  97. }
  98. button.jsoneditor-duplicate:hover {
  99. background-position: -48px 0;
  100. }
  101. button.jsoneditor-type-string {
  102. background-position: -144px -24px;
  103. }
  104. button.jsoneditor-type-string:hover {
  105. background-position: -144px 0;
  106. }
  107. button.jsoneditor-type-auto {
  108. background-position: -120px -24px;
  109. }
  110. button.jsoneditor-type-auto:hover {
  111. background-position: -120px 0;
  112. }
  113. button.jsoneditor-type-object {
  114. background-position: -72px -24px;
  115. }
  116. button.jsoneditor-type-object:hover {
  117. background-position: -72px 0;
  118. }
  119. button.jsoneditor-type-array {
  120. background-position: -96px -24px;
  121. }
  122. button.jsoneditor-type-array:hover {
  123. background-position: -96px 0;
  124. }
  125. div.jsoneditor-select {
  126. border: 1px solid gray;
  127. background-color: white;
  128. box-shadow: 4px 4px 10px rgba(128, 128, 128, 0.5);
  129. }
  130. div.jsoneditor-option {
  131. color: #4D4D4D;
  132. background-color: white;
  133. border: none;
  134. margin: 0;
  135. display: block;
  136. text-align: left;
  137. cursor: pointer;
  138. }
  139. div.jsoneditor-option:hover {
  140. background-color: #FFFFAB;
  141. color: #1A1A1A;
  142. }
  143. div.jsoneditor-option-selected {
  144. background-color: #C1C1C1;
  145. }
  146. div.jsoneditor-option-text {
  147. height: 24px;
  148. line-height: 24px;
  149. padding: 0 12px 0 0;
  150. display: inline-block;
  151. }
  152. div.jsoneditor-option-string, div.jsoneditor-option-auto,
  153. div.jsoneditor-option-object, div.jsoneditor-option-array {
  154. float: left;
  155. width: 24px;
  156. height: 24px;
  157. display: inline-block;
  158. background: url('data:image/png;base64,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+QicjbNxdnr6s67/QqkpEvCu37t+7yYmkhyzPn3oebKOS+/evm/7vu37tq2taINog2hDcjLui/vivvfvk9wWGlTf/gyb1qbVVKqGcmMYrcOzhpa19foqNNeFGiRUsaYhZXUNGBqqRD1NtMxvSUlJSctFDDcfGorl6urq6uqq9WjQ43QdFaGhoZKN5bA1Bv3+6lbrYzAYz86t9Fvpt9JLSjxcPFw8XNLSSE5UfQMGTUKT0KTqapyAE3DC3LnEcNHBUEOGTiLbJ9sn27d2Lc7BOTgnMJB4Xuq3ox4ZUtUsOJgYAr/8ohQpRUoRLeeuewp2aVBpUGnQ1KloBVqBVhgYNGioY8CAHzwwdjZ2NnY+dQpUoIIWDFQcsHnA5gGb//pL1VnVWdW5Y0dioNAFJgG4aC6ai7a2JsetrenxUXgUHoXDw1s7h6Uh2npdl6eFqRzPGe1loUc64089Wg1Vf6Ncv379+vXr2ut0pZ+5ubm5ubn1FXgagkg9M3WLDFCPXltDDT+6bS7Ug9aY55LBYDw9U6ZMmTJlikZDci9ef91jpMdIj5F6evh3/Dv+fcoU6AbdoJtajX/GP+OfZ870MvEy8TI5dEhouRntC3G0OFocHRpa/kP5D+U/ODnBN/ANfOPt3eAFf8Af8EdysuRPyZ+SP9evJwd1z3ChcKlcKpdaXk4mAOqXt0br0Xq0/vZtzTTNNM20U6fkafI0eVrLxwrRhTVJ9bGff1bNUM1QzRg0iM/gM/iMXr1oaFnNBY/WdxHKcGkvMAOGoRM0VtxB14o/UJoaMkVDrhgMBqOpUEOGVB+bPdtkoclCk4VmZpwdZ8fZffcdSX4/fFhoORntE5q7MOHchHMTzq1Zo/+C/gv6L+zbR0Llaq3cNx/mw/y8PFI1beVKuY/cR+6ji0kBj8Pn8Dl8DsboEDqEDpWW8if4E/yJrCx9S31LfcurV6N9on2ifdpuCo4aMmTv3LlxL4x7YdwLKSmSNyVvSt50d9cM1AzUDLS3x2IsxuJaVfgEQter2OlQ1CuDwWAwGAwGQwhocjufxWfxWeHhaCPaiDZyHPwKv8Kvb7yhsFHYKGzqr1zPYDAYDAaDwWAwGIIh7SvtK+07eTJZ52nGDKHlYTAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYbcH/AWLj1/vuodg2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEyLTEwLTAxVDIyOjQxOjA1KzAyOjAwuT6y7gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMi0xMC0wMVQyMjo0MTowNSswMjowMMhjClIAAAB1dEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvam9zL0Ryb3Bib3gvSm9zL3Byb2dyYW1taW5nL2phdmFzY3JpcHQvanNvbmVkaXRvcm9ubGluZS9qc29uZWRpdG9yL2ltZy9qc29uZWRpdG9yLWljb25zLnN2Z2qDex0AAAAASUVORK5CYII=');
  159. }
  160. div.jsoneditor-option-string {
  161. background-position: -144px 0;
  162. }
  163. div.jsoneditor-option-auto {
  164. background-position: -120px 0;
  165. }
  166. div.jsoneditor-option-object {
  167. background-position: -72px 0;
  168. }
  169. div.jsoneditor-option-array {
  170. background-position: -96px 0;
  171. }
  172. div.jsoneditor-frame {
  173. color: #1A1A1A;
  174. border: 1px solid #C1C1C1;
  175. box-sizing: border-box;
  176. width: 100%;
  177. height: 100%;
  178. overflow: auto;
  179. position: relative;
  180. padding: 0;
  181. }
  182. table.jsoneditor-table {
  183. border-collapse: collapse;
  184. border-spacing: 0;
  185. width: 100%;
  186. margin: 0;
  187. }
  188. div.jsoneditor-content-outer, div.jsonformatter-content {
  189. width: 100%;
  190. height: 100%;
  191. margin: -35px 0 0 0;
  192. padding: 35px 0 0 0;
  193. -moz-box-sizing: border-box;
  194. -webkit-box-sizing: border-box;
  195. box-sizing: border-box;
  196. overflow: hidden;
  197. }
  198. div.jsoneditor-content {
  199. width: 100%;
  200. height: 100%;
  201. position: relative;
  202. overflow: auto;
  203. }
  204. textarea.jsonformatter-textarea {
  205. width: 100%;
  206. height: 100%;
  207. margin: 0;
  208. -moz-box-sizing: border-box;
  209. -webkit-box-sizing: border-box;
  210. box-sizing: border-box;
  211. border: none;
  212. background-color: white;
  213. resize: none;
  214. }
  215. tr.jsoneditor-tr-highlight {
  216. background-color: #FFFFAB;
  217. }
  218. button.jsoneditor-dragarea {
  219. width: 16px;
  220. height: 24px;
  221. /*
  222. margin: 3px 0;
  223. background: url('img/dots_gray.gif') top center;
  224. background-repeat: repeat-y;
  225. */
  226. background: url('data:image/png;base64,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+QicjbNxdnr6s67/QqkpEvCu37t+7yYmkhyzPn3oebKOS+/evm/7vu37tq2taINog2hDcjLui/vivvfvk9wWGlTf/gyb1qbVVKqGcmMYrcOzhpa19foqNNeFGiRUsaYhZXUNGBqqRD1NtMxvSUlJSctFDDcfGorl6urq6uqq9WjQ43QdFaGhoZKN5bA1Bv3+6lbrYzAYz86t9Fvpt9JLSjxcPFw8XNLSSE5UfQMGTUKT0KTqapyAE3DC3LnEcNHBUEOGTiLbJ9sn27d2Lc7BOTgnMJB4Xuq3ox4ZUtUsOJgYAr/8ohQpRUoRLeeuewp2aVBpUGnQ1KloBVqBVhgYNGioY8CAHzwwdjZ2NnY+dQpUoIIWDFQcsHnA5gGb//pL1VnVWdW5Y0dioNAFJgG4aC6ai7a2JsetrenxUXgUHoXDw1s7h6Uh2npdl6eFqRzPGe1loUc64089Wg1Vf6Ncv379+vXr2ut0pZ+5ubm5ubn1FXgagkg9M3WLDFCPXltDDT+6bS7Ug9aY55LBYDw9U6ZMmTJlikZDci9ef91jpMdIj5F6evh3/Dv+fcoU6AbdoJtajX/GP+OfZ870MvEy8TI5dEhouRntC3G0OFocHRpa/kP5D+U/ODnBN/ANfOPt3eAFf8Af8EdysuRPyZ+SP9evJwd1z3ChcKlcKpdaXk4mAOqXt0br0Xq0/vZtzTTNNM20U6fkafI0eVrLxwrRhTVJ9bGff1bNUM1QzRg0iM/gM/iMXr1oaFnNBY/WdxHKcGkvMAOGoRM0VtxB14o/UJoaMkVDrhgMBqOpUEOGVB+bPdtkoclCk4VmZpwdZ8fZffcdSX4/fFhoORntE5q7MOHchHMTzq1Zo/+C/gv6L+zbR0Llaq3cNx/mw/y8PFI1beVKuY/cR+6ji0kBj8Pn8Dl8DsboEDqEDpWW8if4E/yJrCx9S31LfcurV6N9on2ifdpuCo4aMmTv3LlxL4x7YdwLKSmSNyVvSt50d9cM1AzUDLS3x2IsxuJaVfgEQter2OlQ1CuDwWAwGAwGQwhocjufxWfxWeHhaCPaiDZyHPwKv8Kvb7yhsFHYKGzqr1zPYDAYDAaDwWAwGIIh7SvtK+07eTJZ52nGDKHlYTAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYbcH/AWLj1/vuodg2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEyLTEwLTAxVDIyOjQxOjA1KzAyOjAwuT6y7gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMi0xMC0wMVQyMjo0MTowNSswMjowMMhjClIAAAB1dEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvam9zL0Ryb3Bib3gvSm9zL3Byb2dyYW1taW5nL2phdmFzY3JpcHQvanNvbmVkaXRvcm9ubGluZS9qc29uZWRpdG9yL2ltZy9qc29uZWRpdG9yLWljb25zLnN2Z2qDex0AAAAASUVORK5CYII=') -220px 0;
  227. display: block;
  228. cursor: move;
  229. }
  230. div.jsoneditor-menu {
  231. width: 100%;
  232. height: 35px;
  233. padding: 2px;
  234. margin: 0;
  235. overflow: hidden;
  236. -moz-box-sizing: border-box;
  237. -webkit-box-sizing: border-box;
  238. box-sizing: border-box;
  239. color: #1A1A1A;
  240. border-bottom: 1px solid #C1C1C1;
  241. }
  242. table.jsoneditor-search {
  243. position: absolute;
  244. right: 2px;
  245. top: 2px;
  246. }
  247. table.jsoneditor-search-input {
  248. border-collapse: collapse;
  249. }
  250. div.jsoneditor-search {
  251. border: 1px solid #C1C1C1;
  252. background-color: white;
  253. padding: 0 2px;
  254. margin: 0;
  255. }
  256. input.jsoneditor-search {
  257. width: 120px;
  258. border: none;
  259. outline: none;
  260. margin: 1px;
  261. }
  262. div.jsoneditor-search-results {
  263. color: #4d4d4d;
  264. padding-right: 5px;
  265. }
  266. button.jsoneditor-search-refresh, button.jsoneditor-search-next,
  267. button.jsoneditor-search-previous {
  268. width: 16px;
  269. height: 24px;
  270. padding: 0;
  271. margin: 0;
  272. border: none;
  273. background: url('data:image/png;base64,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+QicjbNxdnr6s67/QqkpEvCu37t+7yYmkhyzPn3oebKOS+/evm/7vu37tq2taINog2hDcjLui/vivvfvk9wWGlTf/gyb1qbVVKqGcmMYrcOzhpa19foqNNeFGiRUsaYhZXUNGBqqRD1NtMxvSUlJSctFDDcfGorl6urq6uqq9WjQ43QdFaGhoZKN5bA1Bv3+6lbrYzAYz86t9Fvpt9JLSjxcPFw8XNLSSE5UfQMGTUKT0KTqapyAE3DC3LnEcNHBUEOGTiLbJ9sn27d2Lc7BOTgnMJB4Xuq3ox4ZUtUsOJgYAr/8ohQpRUoRLeeuewp2aVBpUGnQ1KloBVqBVhgYNGioY8CAHzwwdjZ2NnY+dQpUoIIWDFQcsHnA5gGb//pL1VnVWdW5Y0dioNAFJgG4aC6ai7a2JsetrenxUXgUHoXDw1s7h6Uh2npdl6eFqRzPGe1loUc64089Wg1Vf6Ncv379+vXr2ut0pZ+5ubm5ubn1FXgagkg9M3WLDFCPXltDDT+6bS7Ug9aY55LBYDw9U6ZMmTJlikZDci9ef91jpMdIj5F6evh3/Dv+fcoU6AbdoJtajX/GP+OfZ870MvEy8TI5dEhouRntC3G0OFocHRpa/kP5D+U/ODnBN/ANfOPt3eAFf8Af8EdysuRPyZ+SP9evJwd1z3ChcKlcKpdaXk4mAOqXt0br0Xq0/vZtzTTNNM20U6fkafI0eVrLxwrRhTVJ9bGff1bNUM1QzRg0iM/gM/iMXr1oaFnNBY/WdxHKcGkvMAOGoRM0VtxB14o/UJoaMkVDrhgMBqOpUEOGVB+bPdtkoclCk4VmZpwdZ8fZffcdSX4/fFhoORntE5q7MOHchHMTzq1Zo/+C/gv6L+zbR0Llaq3cNx/mw/y8PFI1beVKuY/cR+6ji0kBj8Pn8Dl8DsboEDqEDpWW8if4E/yJrCx9S31LfcurV6N9on2ifdpuCo4aMmTv3LlxL4x7YdwLKSmSNyVvSt50d9cM1AzUDLS3x2IsxuJaVfgEQter2OlQ1CuDwWAwGAwGQwhocjufxWfxWeHhaCPaiDZyHPwKv8Kvb7yhsFHYKGzqr1zPYDAYDAaDwWAwGIIh7SvtK+07eTJZ52nGDKHlYTAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYbcH/AWLj1/vuodg2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEyLTEwLTAxVDIyOjQxOjA1KzAyOjAwuT6y7gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMi0xMC0wMVQyMjo0MTowNSswMjowMMhjClIAAAB1dEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvam9zL0Ryb3Bib3gvSm9zL3Byb2dyYW1taW5nL2phdmFzY3JpcHQvanNvbmVkaXRvcm9ubGluZS9qc29uZWRpdG9yL2ltZy9qc29uZWRpdG9yLWljb25zLnN2Z2qDex0AAAAASUVORK5CYII=');
  274. vertical-align: top;
  275. }
  276. button.jsoneditor-search-refresh {
  277. width: 18px;
  278. background-position: -243px -25px;
  279. }
  280. button.jsoneditor-search-next {
  281. cursor: pointer;
  282. background-position: -268px -25px;
  283. }
  284. button.jsoneditor-search-next:hover {
  285. background-position: -268px -1px;
  286. }
  287. button.jsoneditor-search-previous {
  288. cursor: pointer;
  289. background-position: -292px -25px;
  290. margin-right: 2px;
  291. }
  292. button.jsoneditor-search-previous:hover {
  293. background-position: -292px -1px;
  294. }
  295. button.jsoneditor-menu {
  296. width: 26px;
  297. height: 26px;
  298. margin: 2px;
  299. padding: 2px;
  300. border-radius: 2px;
  301. border: 1px solid #aec0f8;
  302. background: #D0F0EF url('data:image/png;base64,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+QicjbNxdnr6s67/QqkpEvCu37t+7yYmkhyzPn3oebKOS+/evm/7vu37tq2taINog2hDcjLui/vivvfvk9wWGlTf/gyb1qbVVKqGcmMYrcOzhpa19foqNNeFGiRUsaYhZXUNGBqqRD1NtMxvSUlJSctFDDcfGorl6urq6uqq9WjQ43QdFaGhoZKN5bA1Bv3+6lbrYzAYz86t9Fvpt9JLSjxcPFw8XNLSSE5UfQMGTUKT0KTqapyAE3DC3LnEcNHBUEOGTiLbJ9sn27d2Lc7BOTgnMJB4Xuq3ox4ZUtUsOJgYAr/8ohQpRUoRLeeuewp2aVBpUGnQ1KloBVqBVhgYNGioY8CAHzwwdjZ2NnY+dQpUoIIWDFQcsHnA5gGb//pL1VnVWdW5Y0dioNAFJgG4aC6ai7a2JsetrenxUXgUHoXDw1s7h6Uh2npdl6eFqRzPGe1loUc64089Wg1Vf6Ncv379+vXr2ut0pZ+5ubm5ubn1FXgagkg9M3WLDFCPXltDDT+6bS7Ug9aY55LBYDw9U6ZMmTJlikZDci9ef91jpMdIj5F6evh3/Dv+fcoU6AbdoJtajX/GP+OfZ870MvEy8TI5dEhouRntC3G0OFocHRpa/kP5D+U/ODnBN/ANfOPt3eAFf8Af8EdysuRPyZ+SP9evJwd1z3ChcKlcKpdaXk4mAOqXt0br0Xq0/vZtzTTNNM20U6fkafI0eVrLxwrRhTVJ9bGff1bNUM1QzRg0iM/gM/iMXr1oaFnNBY/WdxHKcGkvMAOGoRM0VtxB14o/UJoaMkVDrhgMBqOpUEOGVB+bPdtkoclCk4VmZpwdZ8fZffcdSX4/fFhoORntE5q7MOHchHMTzq1Zo/+C/gv6L+zbR0Llaq3cNx/mw/y8PFI1beVKuY/cR+6ji0kBj8Pn8Dl8DsboEDqEDpWW8if4E/yJrCx9S31LfcurV6N9on2ifdpuCo4aMmTv3LlxL4x7YdwLKSmSNyVvSt50d9cM1AzUDLS3x2IsxuJaVfgEQter2OlQ1CuDwWAwGAwGQwhocjufxWfxWeHhaCPaiDZyHPwKv8Kvb7yhsFHYKGzqr1zPYDAYDAaDwWAwGIIh7SvtK+07eTJZ52nGDKHlYTAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYbcH/AWLj1/vuodg2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEyLTEwLTAxVDIyOjQxOjA1KzAyOjAwuT6y7gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMi0xMC0wMVQyMjo0MTowNSswMjowMMhjClIAAAB1dEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvam9zL0Ryb3Bib3gvSm9zL3Byb2dyYW1taW5nL2phdmFzY3JpcHQvanNvbmVkaXRvcm9ubGluZS9qc29uZWRpdG9yL2ltZy9qc29uZWRpdG9yLWljb25zLnN2Z2qDex0AAAAASUVORK5CYII=');
  303. }
  304. button.jsoneditor-menu:hover {
  305. background-color: #FFFFFF;
  306. }
  307. button.jsoneditor-menu:active {
  308. background-color: #ffffff;
  309. }
  310. button.jsoneditor-menu:disabled {
  311. background-color: #D0F0EF;
  312. }
  313. button.jsoneditor-collapse-all {
  314. background-position: -312px 0;
  315. }
  316. button.jsoneditor-expand-all {
  317. background-position: -312px -24px;
  318. }
  319. button.jsoneditor-undo {
  320. background-position: -336px 0;
  321. }
  322. button.jsoneditor-redo {
  323. background-position: -360px 0;
  324. }
  325. button.jsoneditor-undo:disabled {
  326. background-position: -336px -24px;
  327. }
  328. button.jsoneditor-redo:disabled {
  329. background-position: -360px -24px;
  330. }
  331. /* TODO: css for button:disabled is not supported by IE8 */
  332. button.jsoneditor-compact {
  333. background-position: -384px 0;
  334. }
  335. button.jsoneditor-format {
  336. background-position: -384px -24px;
  337. }
  338. tr, th, td {
  339. padding: 0;
  340. margin: 0;
  341. }
  342. td.jsoneditor-td {
  343. vertical-align: top;
  344. }
  345. td.jsoneditor-td {
  346. padding: 0 3px;
  347. }
  348. td.jsoneditor-td-edit {
  349. background-color: #F5F5F5;
  350. padding: 0;
  351. }
  352. td.jsoneditor-td-tree {
  353. vertical-align: top;
  354. }
  355. td.jsoneditor-droparea {
  356. height: 24px;
  357. border-top: 1px dashed gray;
  358. border-bottom: 1px dashed gray;
  359. background-color: #FFFF80;
  360. }
  361. .jsoneditor-field, .jsoneditor-value, .jsoneditor-td, .jsoneditor-th,
  362. .jsoneditor-type,
  363. .jsonformatter-textarea {
  364. font-family: droid sans mono, monospace, courier new, courier, sans-serif;
  365. font-size: 10pt;
  366. color: #1A1A1A;
  367. }
  368. .jsoneditor-hidden-focus {
  369. position: absolute;
  370. left: -1000px;
  371. top: -1000px;
  372. border: none;
  373. outline: none;
  374. }
  375. #by-jsonlint {
  376. text-align: right;
  377. }
  378. body, html {
  379. margin: 0;
  380. padding: 0;
  381. }
  382. #content-wrapper {
  383. padding: 1vh;
  384. }
  385. #jsonformatter, #jsoneditor {
  386. position: absolute;
  387. left: 0;
  388. right: 0;
  389. bottom: 0;
  390. top: 32px;
  391. -moz-box-sizing: border-box;
  392. -webkit-box-sizing: border-box;
  393. box-sizing: border-box;
  394. clear: none;
  395. margin: 0 !important;
  396. }
  397. #jsoneditor {
  398. float: right;
  399. }
  400. .title {
  401. background: rgba(0, 0, 0, .6);
  402. height: 32px;
  403. line-height: 32px;
  404. padding: 0 1vh;
  405. color: #fff;
  406. position: relative;
  407. vertical-align: top;
  408. }
  409. .title .tool {
  410. position: absolute;
  411. left: 50%;
  412. top: 0;
  413. margin-left: -109px;
  414. display: inline-block;
  415. }
  416. .title .tool button + button {
  417. margin-left: 1vw;
  418. }
  419. .title button {
  420. display: inline-block;
  421. border: 1px solid #ccc;
  422. background: rgba(204, 212, 159, .9);
  423. height: 24px;
  424. line-height: 24px;
  425. padding: 0 10px;
  426. cursor: pointer;
  427. }
  428. .title button:hover {
  429. background: rgba(204, 212, 159, .6);
  430. }
  431. #saveAsEditorOnline {
  432. position: absolute;
  433. top: 4px;
  434. right: 1vh;
  435. }
  436. </style>
  437. </head>
  438. <body>
  439. <div class="title">
  440. <span>JSON编辑器</span>
  441. <button id="saveAsEditorOnline">保存JSON</button>
  442. </div>
  443. <!-- start 各个模块代码 -->
  444. <!--内容块开始-->
  445. <div id="content-wrapper" style="min-height:100px" class="t-big-margin">
  446. <div id="jsoneditor"></div>
  447. <div class="clear" style="clear: both; "></div>
  448. </div>
  449. <script>
  450. /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
  451. //@ sourceMappingURL=jquery.min.map
  452. */
  453. (function (e, t) {
  454. var n, r, i = typeof t, o = e.document, a = e.location, s = e.jQuery, u = e.$, l = {}, c = [], p = "1.9.1",
  455. f = c.concat, d = c.push, h = c.slice, g = c.indexOf, m = l.toString, y = l.hasOwnProperty, v = p.trim,
  456. b = function (e, t) {
  457. return new b.fn.init(e, t, r)
  458. }, x = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, w = /\S+/g, T = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
  459. N = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/, C = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, k = /^[\],:{}\s]*$/,
  460. E = /(?:^|:|,)(?:\s*\[)+/g, S = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
  461. A = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, j = /^-ms-/, D = /-([\da-z])/gi,
  462. L = function (e, t) {
  463. return t.toUpperCase()
  464. }, H = function (e) {
  465. (o.addEventListener || "load" === e.type || "complete" === o.readyState) && (q(), b.ready())
  466. }, q = function () {
  467. o.addEventListener ? (o.removeEventListener("DOMContentLoaded", H, !1), e.removeEventListener("load", H, !1)) : (o.detachEvent("onreadystatechange", H), e.detachEvent("onload", H))
  468. };
  469. b.fn = b.prototype = {
  470. jquery: p, constructor: b, init: function (e, n, r) {
  471. var i, a;
  472. if (!e)return this;
  473. if ("string" == typeof e) {
  474. if (i = "<" === e.charAt(0) && ">" === e.charAt(e.length - 1) && e.length >= 3 ? [null, e, null] : N.exec(e), !i || !i[1] && n)return !n || n.jquery ? (n || r).find(e) : this.constructor(n).find(e);
  475. if (i[1]) {
  476. if (n = n instanceof b ? n[0] : n, b.merge(this, b.parseHTML(i[1], n && n.nodeType ? n.ownerDocument || n : o, !0)), C.test(i[1]) && b.isPlainObject(n))for (i in n)b.isFunction(this[i]) ? this[i](n[i]) : this.attr(i, n[i]);
  477. return this
  478. }
  479. if (a = o.getElementById(i[2]), a && a.parentNode) {
  480. if (a.id !== i[2])return r.find(e);
  481. this.length = 1, this[0] = a
  482. }
  483. return this.context = o, this.selector = e, this
  484. }
  485. return e.nodeType ? (this.context = this[0] = e, this.length = 1, this) : b.isFunction(e) ? r.ready(e) : (e.selector !== t && (this.selector = e.selector, this.context = e.context), b.makeArray(e, this))
  486. }, selector: "", length: 0, size: function () {
  487. return this.length
  488. }, toArray: function () {
  489. return h.call(this)
  490. }, get: function (e) {
  491. return null == e ? this.toArray() : 0 > e ? this[this.length + e] : this[e]
  492. }, pushStack: function (e) {
  493. var t = b.merge(this.constructor(), e);
  494. return t.prevObject = this, t.context = this.context, t
  495. }, each: function (e, t) {
  496. return b.each(this, e, t)
  497. }, ready: function (e) {
  498. return b.ready.promise().done(e), this
  499. }, slice: function () {
  500. return this.pushStack(h.apply(this, arguments))
  501. }, first: function () {
  502. return this.eq(0)
  503. }, last: function () {
  504. return this.eq(-1)
  505. }, eq: function (e) {
  506. var t = this.length, n = +e + (0 > e ? t : 0);
  507. return this.pushStack(n >= 0 && t > n ? [this[n]] : [])
  508. }, map: function (e) {
  509. return this.pushStack(b.map(this, function (t, n) {
  510. return e.call(t, n, t)
  511. }))
  512. }, end: function () {
  513. return this.prevObject || this.constructor(null)
  514. }, push: d, sort: [].sort, splice: [].splice
  515. }, b.fn.init.prototype = b.fn, b.extend = b.fn.extend = function () {
  516. var e, n, r, i, o, a, s = arguments[0] || {}, u = 1, l = arguments.length, c = !1;
  517. for ("boolean" == typeof s && (c = s, s = arguments[1] || {}, u = 2), "object" == typeof s || b.isFunction(s) || (s = {}), l === u && (s = this, --u); l > u; u++)if (null != (o = arguments[u]))for (i in o)e = s[i], r = o[i], s !== r && (c && r && (b.isPlainObject(r) || (n = b.isArray(r))) ? (n ? (n = !1, a = e && b.isArray(e) ? e : []) : a = e && b.isPlainObject(e) ? e : {}, s[i] = b.extend(c, a, r)) : r !== t && (s[i] = r));
  518. return s
  519. }, b.extend({
  520. noConflict: function (t) {
  521. return e.$ === b && (e.$ = u), t && e.jQuery === b && (e.jQuery = s), b
  522. }, isReady: !1, readyWait: 1, holdReady: function (e) {
  523. e ? b.readyWait++ : b.ready(!0)
  524. }, ready: function (e) {
  525. if (e === !0 ? !--b.readyWait : !b.isReady) {
  526. if (!o.body)return setTimeout(b.ready);
  527. b.isReady = !0, e !== !0 && --b.readyWait > 0 || (n.resolveWith(o, [b]), b.fn.trigger && b(o).trigger("ready").off("ready"))
  528. }
  529. }, isFunction: function (e) {
  530. return "function" === b.type(e)
  531. }, isArray: Array.isArray || function (e) {
  532. return "array" === b.type(e)
  533. }, isWindow: function (e) {
  534. return null != e && e == e.window
  535. }, isNumeric: function (e) {
  536. return !isNaN(parseFloat(e)) && isFinite(e)
  537. }, type: function (e) {
  538. return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? l[m.call(e)] || "object" : typeof e
  539. }, isPlainObject: function (e) {
  540. if (!e || "object" !== b.type(e) || e.nodeType || b.isWindow(e))return !1;
  541. try {
  542. if (e.constructor && !y.call(e, "constructor") && !y.call(e.constructor.prototype, "isPrototypeOf"))return !1
  543. } catch (n) {
  544. return !1
  545. }
  546. var r;
  547. for (r in e);
  548. return r === t || y.call(e, r)
  549. }, isEmptyObject: function (e) {
  550. var t;
  551. for (t in e)return !1;
  552. return !0
  553. }, error: function (e) {
  554. throw Error(e)
  555. }, parseHTML: function (e, t, n) {
  556. if (!e || "string" != typeof e)return null;
  557. "boolean" == typeof t && (n = t, t = !1), t = t || o;
  558. var r = C.exec(e), i = !n && [];
  559. return r ? [t.createElement(r[1])] : (r = b.buildFragment([e], t, i), i && b(i).remove(), b.merge([], r.childNodes))
  560. }, parseJSON: function (n) {
  561. return e.JSON && e.JSON.parse ? e.JSON.parse(n) : null === n ? n : "string" == typeof n && (n = b.trim(n), n && k.test(n.replace(S, "@").replace(A, "]").replace(E, ""))) ? Function("return " + n)() : (b.error("Invalid JSON: " + n), t)
  562. }, parseXML: function (n) {
  563. var r, i;
  564. if (!n || "string" != typeof n)return null;
  565. try {
  566. e.DOMParser ? (i = new DOMParser, r = i.parseFromString(n, "text/xml")) : (r = new ActiveXObject("Microsoft.XMLDOM"), r.async = "false", r.loadXML(n))
  567. } catch (o) {
  568. r = t
  569. }
  570. return r && r.documentElement && !r.getElementsByTagName("parsererror").length || b.error("Invalid XML: " + n), r
  571. }, noop: function () {
  572. }, globalEval: function (t) {
  573. t && b.trim(t) && (e.execScript || function (t) {
  574. e.eval.call(e, t)
  575. })(t)
  576. }, camelCase: function (e) {
  577. return e.replace(j, "ms-").replace(D, L)
  578. }, nodeName: function (e, t) {
  579. return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase()
  580. }, each: function (e, t, n) {
  581. var r, i = 0, o = e.length, a = M(e);
  582. if (n) {
  583. if (a) {
  584. for (; o > i; i++)if (r = t.apply(e[i], n), r === !1)break
  585. } else for (i in e)if (r = t.apply(e[i], n), r === !1)break
  586. } else if (a) {
  587. for (; o > i; i++)if (r = t.call(e[i], i, e[i]), r === !1)break
  588. } else for (i in e)if (r = t.call(e[i], i, e[i]), r === !1)break;
  589. return e
  590. }, trim: v && !v.call("\ufeff\u00a0") ? function (e) {
  591. return null == e ? "" : v.call(e)
  592. } : function (e) {
  593. return null == e ? "" : (e + "").replace(T, "")
  594. }, makeArray: function (e, t) {
  595. var n = t || [];
  596. return null != e && (M(Object(e)) ? b.merge(n, "string" == typeof e ? [e] : e) : d.call(n, e)), n
  597. }, inArray: function (e, t, n) {
  598. var r;
  599. if (t) {
  600. if (g)return g.call(t, e, n);
  601. for (r = t.length, n = n ? 0 > n ? Math.max(0, r + n) : n : 0; r > n; n++)if (n in t && t[n] === e)return n
  602. }
  603. return -1
  604. }, merge: function (e, n) {
  605. var r = n.length, i = e.length, o = 0;
  606. if ("number" == typeof r)for (; r > o; o++)e[i++] = n[o]; else while (n[o] !== t)e[i++] = n[o++];
  607. return e.length = i, e
  608. }, grep: function (e, t, n) {
  609. var r, i = [], o = 0, a = e.length;
  610. for (n = !!n; a > o; o++)r = !!t(e[o], o), n !== r && i.push(e[o]);
  611. return i
  612. }, map: function (e, t, n) {
  613. var r, i = 0, o = e.length, a = M(e), s = [];
  614. if (a)for (; o > i; i++)r = t(e[i], i, n), null != r && (s[s.length] = r); else for (i in e)r = t(e[i], i, n), null != r && (s[s.length] = r);
  615. return f.apply([], s)
  616. }, guid: 1, proxy: function (e, n) {
  617. var r, i, o;
  618. return "string" == typeof n && (o = e[n], n = e, e = o), b.isFunction(e) ? (r = h.call(arguments, 2), i = function () {
  619. return e.apply(n || this, r.concat(h.call(arguments)))
  620. }, i.guid = e.guid = e.guid || b.guid++, i) : t
  621. }, access: function (e, n, r, i, o, a, s) {
  622. var u = 0, l = e.length, c = null == r;
  623. if ("object" === b.type(r)) {
  624. o = !0;
  625. for (u in r)b.access(e, n, u, r[u], !0, a, s)
  626. } else if (i !== t && (o = !0, b.isFunction(i) || (s = !0), c && (s ? (n.call(e, i), n = null) : (c = n, n = function (e, t, n) {
  627. return c.call(b(e), n)
  628. })), n))for (; l > u; u++)n(e[u], r, s ? i : i.call(e[u], u, n(e[u], r)));
  629. return o ? e : c ? n.call(e) : l ? n(e[0], r) : a
  630. }, now: function () {
  631. return (new Date).getTime()
  632. }
  633. }), b.ready.promise = function (t) {
  634. if (!n)if (n = b.Deferred(), "complete" === o.readyState) setTimeout(b.ready); else if (o.addEventListener) o.addEventListener("DOMContentLoaded", H, !1), e.addEventListener("load", H, !1); else {
  635. o.attachEvent("onreadystatechange", H), e.attachEvent("onload", H);
  636. var r = !1;
  637. try {
  638. r = null == e.frameElement && o.documentElement
  639. } catch (i) {
  640. }
  641. r && r.doScroll && function a() {
  642. if (!b.isReady) {
  643. try {
  644. r.doScroll("left")
  645. } catch (e) {
  646. return setTimeout(a, 50)
  647. }
  648. q(), b.ready()
  649. }
  650. }()
  651. }
  652. return n.promise(t)
  653. }, b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (e, t) {
  654. l["[object " + t + "]"] = t.toLowerCase()
  655. });
  656. function M(e) {
  657. var t = e.length, n = b.type(e);
  658. return b.isWindow(e) ? !1 : 1 === e.nodeType && t ? !0 : "array" === n || "function" !== n && (0 === t || "number" == typeof t && t > 0 && t - 1 in e)
  659. }
  660. r = b(o);
  661. var _ = {};
  662. function F(e) {
  663. var t = _[e] = {};
  664. return b.each(e.match(w) || [], function (e, n) {
  665. t[n] = !0
  666. }), t
  667. }
  668. b.Callbacks = function (e) {
  669. e = "string" == typeof e ? _[e] || F(e) : b.extend({}, e);
  670. var n, r, i, o, a, s, u = [], l = !e.once && [], c = function (t) {
  671. for (r = e.memory && t, i = !0, a = s || 0, s = 0, o = u.length, n = !0; u && o > a; a++)if (u[a].apply(t[0], t[1]) === !1 && e.stopOnFalse) {
  672. r = !1;
  673. break
  674. }
  675. n = !1, u && (l ? l.length && c(l.shift()) : r ? u = [] : p.disable())
  676. }, p = {
  677. add: function () {
  678. if (u) {
  679. var t = u.length;
  680. (function i(t) {
  681. b.each(t, function (t, n) {
  682. var r = b.type(n);
  683. "function" === r ? e.unique && p.has(n) || u.push(n) : n && n.length && "string" !== r && i(n)
  684. })
  685. })(arguments), n ? o = u.length : r && (s = t, c(r))
  686. }
  687. return this
  688. }, remove: function () {
  689. return u && b.each(arguments, function (e, t) {
  690. var r;
  691. while ((r = b.inArray(t, u, r)) > -1)u.splice(r, 1), n && (o >= r && o--, a >= r && a--)
  692. }), this
  693. }, has: function (e) {
  694. return e ? b.inArray(e, u) > -1 : !(!u || !u.length)
  695. }, empty: function () {
  696. return u = [], this
  697. }, disable: function () {
  698. return u = l = r = t, this
  699. }, disabled: function () {
  700. return !u
  701. }, lock: function () {
  702. return l = t, r || p.disable(), this
  703. }, locked: function () {
  704. return !l
  705. }, fireWith: function (e, t) {
  706. return t = t || [], t = [e, t.slice ? t.slice() : t], !u || i && !l || (n ? l.push(t) : c(t)), this
  707. }, fire: function () {
  708. return p.fireWith(this, arguments), this
  709. }, fired: function () {
  710. return !!i
  711. }
  712. };
  713. return p
  714. }, b.extend({
  715. Deferred: function (e) {
  716. var t = [["resolve", "done", b.Callbacks("once memory"), "resolved"], ["reject", "fail", b.Callbacks("once memory"), "rejected"], ["notify", "progress", b.Callbacks("memory")]],
  717. n = "pending", r = {
  718. state: function () {
  719. return n
  720. }, always: function () {
  721. return i.done(arguments).fail(arguments), this
  722. }, then: function () {
  723. var e = arguments;
  724. return b.Deferred(function (n) {
  725. b.each(t, function (t, o) {
  726. var a = o[0], s = b.isFunction(e[t]) && e[t];
  727. i[o[1]](function () {
  728. var e = s && s.apply(this, arguments);
  729. e && b.isFunction(e.promise) ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[a + "With"](this === r ? n.promise() : this, s ? [e] : arguments)
  730. })
  731. }), e = null
  732. }).promise()
  733. }, promise: function (e) {
  734. return null != e ? b.extend(e, r) : r
  735. }
  736. }, i = {};
  737. return r.pipe = r.then, b.each(t, function (e, o) {
  738. var a = o[2], s = o[3];
  739. r[o[1]] = a.add, s && a.add(function () {
  740. n = s
  741. }, t[1 ^ e][2].disable, t[2][2].lock), i[o[0]] = function () {
  742. return i[o[0] + "With"](this === i ? r : this, arguments), this
  743. }, i[o[0] + "With"] = a.fireWith
  744. }), r.promise(i), e && e.call(i, i), i
  745. }, when: function (e) {
  746. var t = 0, n = h.call(arguments), r = n.length, i = 1 !== r || e && b.isFunction(e.promise) ? r : 0,
  747. o = 1 === i ? e : b.Deferred(), a = function (e, t, n) {
  748. return function (r) {
  749. t[e] = this, n[e] = arguments.length > 1 ? h.call(arguments) : r, n === s ? o.notifyWith(t, n) : --i || o.resolveWith(t, n)
  750. }
  751. }, s, u, l;
  752. if (r > 1)for (s = Array(r), u = Array(r), l = Array(r); r > t; t++)n[t] && b.isFunction(n[t].promise) ? n[t].promise().done(a(t, l, n)).fail(o.reject).progress(a(t, u, s)) : --i;
  753. return i || o.resolveWith(l, n), o.promise()
  754. }
  755. }), b.support = function () {
  756. var t, n, r, a, s, u, l, c, p, f, d = o.createElement("div");
  757. if (d.setAttribute("className", "t"), d.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>", n = d.getElementsByTagName("*"), r = d.getElementsByTagName("a")[0], !n || !r || !n.length)return {};
  758. s = o.createElement("select"), l = s.appendChild(o.createElement("option")), a = d.getElementsByTagName("input")[0], r.style.cssText = "top:1px;float:left;opacity:.5", t = {
  759. getSetAttribute: "t" !== d.className,
  760. leadingWhitespace: 3 === d.firstChild.nodeType,
  761. tbody: !d.getElementsByTagName("tbody").length,
  762. htmlSerialize: !!d.getElementsByTagName("link").length,
  763. style: /top/.test(r.getAttribute("style")),
  764. hrefNormalized: "/a" === r.getAttribute("href"),
  765. opacity: /^0.5/.test(r.style.opacity),
  766. cssFloat: !!r.style.cssFloat,
  767. checkOn: !!a.value,
  768. optSelected: l.selected,
  769. enctype: !!o.createElement("form").enctype,
  770. html5Clone: "<:nav></:nav>" !== o.createElement("nav").cloneNode(!0).outerHTML,
  771. boxModel: "CSS1Compat" === o.compatMode,
  772. deleteExpando: !0,
  773. noCloneEvent: !0,
  774. inlineBlockNeedsLayout: !1,
  775. shrinkWrapBlocks: !1,
  776. reliableMarginRight: !0,
  777. boxSizingReliable: !0,
  778. pixelPosition: !1
  779. }, a.checked = !0, t.noCloneChecked = a.cloneNode(!0).checked, s.disabled = !0, t.optDisabled = !l.disabled;
  780. try {
  781. delete d.test
  782. } catch (h) {
  783. t.deleteExpando = !1
  784. }
  785. a = o.createElement("input"), a.setAttribute("value", ""), t.input = "" === a.getAttribute("value"), a.value = "t", a.setAttribute("type", "radio"), t.radioValue = "t" === a.value, a.setAttribute("checked", "t"), a.setAttribute("name", "t"), u = o.createDocumentFragment(), u.appendChild(a), t.appendChecked = a.checked, t.checkClone = u.cloneNode(!0).cloneNode(!0).lastChild.checked, d.attachEvent && (d.attachEvent("onclick", function () {
  786. t.noCloneEvent = !1
  787. }), d.cloneNode(!0).click());
  788. for (f in{
  789. submit: !0,
  790. change: !0,
  791. focusin: !0
  792. })d.setAttribute(c = "on" + f, "t"), t[f + "Bubbles"] = c in e || d.attributes[c].expando === !1;
  793. return d.style.backgroundClip = "content-box", d.cloneNode(!0).style.backgroundClip = "", t.clearCloneStyle = "content-box" === d.style.backgroundClip, b(function () {
  794. var n, r, a,
  795. s = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
  796. u = o.getElementsByTagName("body")[0];
  797. u && (n = o.createElement("div"), n.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px", u.appendChild(n).appendChild(d), d.innerHTML = "<table><tr><td></td><td>t</td></tr></table>", a = d.getElementsByTagName("td"), a[0].style.cssText = "padding:0;margin:0;border:0;display:none", p = 0 === a[0].offsetHeight, a[0].style.display = "", a[1].style.display = "none", t.reliableHiddenOffsets = p && 0 === a[0].offsetHeight, d.innerHTML = "", d.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;", t.boxSizing = 4 === d.offsetWidth, t.doesNotIncludeMarginInBodyOffset = 1 !== u.offsetTop, e.getComputedStyle && (t.pixelPosition = "1%" !== (e.getComputedStyle(d, null) || {}).top, t.boxSizingReliable = "4px" === (e.getComputedStyle(d, null) || {width: "4px"}).width, r = d.appendChild(o.createElement("div")), r.style.cssText = d.style.cssText = s, r.style.marginRight = r.style.width = "0", d.style.width = "1px", t.reliableMarginRight = !parseFloat((e.getComputedStyle(r, null) || {}).marginRight)), typeof d.style.zoom !== i && (d.innerHTML = "", d.style.cssText = s + "width:1px;padding:1px;display:inline;zoom:1", t.inlineBlockNeedsLayout = 3 === d.offsetWidth, d.style.display = "block", d.innerHTML = "<div></div>", d.firstChild.style.width = "5px", t.shrinkWrapBlocks = 3 !== d.offsetWidth, t.inlineBlockNeedsLayout && (u.style.zoom = 1)), u.removeChild(n), n = d = a = r = null)
  798. }), n = s = u = l = r = a = null, t
  799. }();
  800. var O = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, B = /([A-Z])/g;
  801. function P(e, n, r, i) {
  802. if (b.acceptData(e)) {
  803. var o, a, s = b.expando, u = "string" == typeof n, l = e.nodeType, p = l ? b.cache : e,
  804. f = l ? e[s] : e[s] && s;
  805. if (f && p[f] && (i || p[f].data) || !u || r !== t)return f || (l ? e[s] = f = c.pop() || b.guid++ : f = s), p[f] || (p[f] = {}, l || (p[f].toJSON = b.noop)), ("object" == typeof n || "function" == typeof n) && (i ? p[f] = b.extend(p[f], n) : p[f].data = b.extend(p[f].data, n)), o = p[f], i || (o.data || (o.data = {}), o = o.data), r !== t && (o[b.camelCase(n)] = r), u ? (a = o[n], null == a && (a = o[b.camelCase(n)])) : a = o, a
  806. }
  807. }
  808. function R(e, t, n) {
  809. if (b.acceptData(e)) {
  810. var r, i, o, a = e.nodeType, s = a ? b.cache : e, u = a ? e[b.expando] : b.expando;
  811. if (s[u]) {
  812. if (t && (o = n ? s[u] : s[u].data)) {
  813. b.isArray(t) ? t = t.concat(b.map(t, b.camelCase)) : t in o ? t = [t] : (t = b.camelCase(t), t = t in o ? [t] : t.split(" "));
  814. for (r = 0, i = t.length; i > r; r++)delete o[t[r]];
  815. if (!(n ? $ : b.isEmptyObject)(o))return
  816. }
  817. (n || (delete s[u].data, $(s[u]))) && (a ? b.cleanData([e], !0) : b.support.deleteExpando || s != s.window ? delete s[u] : s[u] = null)
  818. }
  819. }
  820. }
  821. b.extend({
  822. cache: {},
  823. expando: "jQuery" + (p + Math.random()).replace(/\D/g, ""),
  824. noData: {embed: !0, object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", applet: !0},
  825. hasData: function (e) {
  826. return e = e.nodeType ? b.cache[e[b.expando]] : e[b.expando], !!e && !$(e)
  827. },
  828. data: function (e, t, n) {
  829. return P(e, t, n)
  830. },
  831. removeData: function (e, t) {
  832. return R(e, t)
  833. },
  834. _data: function (e, t, n) {
  835. return P(e, t, n, !0)
  836. },
  837. _removeData: function (e, t) {
  838. return R(e, t, !0)
  839. },
  840. acceptData: function (e) {
  841. if (e.nodeType && 1 !== e.nodeType && 9 !== e.nodeType)return !1;
  842. var t = e.nodeName && b.noData[e.nodeName.toLowerCase()];
  843. return !t || t !== !0 && e.getAttribute("classid") === t
  844. }
  845. }), b.fn.extend({
  846. data: function (e, n) {
  847. var r, i, o = this[0], a = 0, s = null;
  848. if (e === t) {
  849. if (this.length && (s = b.data(o), 1 === o.nodeType && !b._data(o, "parsedAttrs"))) {
  850. for (r = o.attributes; r.length > a; a++)i = r[a].name, i.indexOf("data-") || (i = b.camelCase(i.slice(5)), W(o, i, s[i]));
  851. b._data(o, "parsedAttrs", !0)
  852. }
  853. return s
  854. }
  855. return "object" == typeof e ? this.each(function () {
  856. b.data(this, e)
  857. }) : b.access(this, function (n) {
  858. return n === t ? o ? W(o, e, b.data(o, e)) : null : (this.each(function () {
  859. b.data(this, e, n)
  860. }), t)
  861. }, null, n, arguments.length > 1, null, !0)
  862. }, removeData: function (e) {
  863. return this.each(function () {
  864. b.removeData(this, e)
  865. })
  866. }
  867. });
  868. function W(e, n, r) {
  869. if (r === t && 1 === e.nodeType) {
  870. var i = "data-" + n.replace(B, "-$1").toLowerCase();
  871. if (r = e.getAttribute(i), "string" == typeof r) {
  872. try {
  873. r = "true" === r ? !0 : "false" === r ? !1 : "null" === r ? null : +r + "" === r ? +r : O.test(r) ? b.parseJSON(r) : r
  874. } catch (o) {
  875. }
  876. b.data(e, n, r)
  877. } else r = t
  878. }
  879. return r
  880. }
  881. function $(e) {
  882. var t;
  883. for (t in e)if (("data" !== t || !b.isEmptyObject(e[t])) && "toJSON" !== t)return !1;
  884. return !0
  885. }
  886. b.extend({
  887. queue: function (e, n, r) {
  888. var i;
  889. return e ? (n = (n || "fx") + "queue", i = b._data(e, n), r && (!i || b.isArray(r) ? i = b._data(e, n, b.makeArray(r)) : i.push(r)), i || []) : t
  890. }, dequeue: function (e, t) {
  891. t = t || "fx";
  892. var n = b.queue(e, t), r = n.length, i = n.shift(), o = b._queueHooks(e, t), a = function () {
  893. b.dequeue(e, t)
  894. };
  895. "inprogress" === i && (i = n.shift(), r--), o.cur = i, i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, a, o)), !r && o && o.empty.fire()
  896. }, _queueHooks: function (e, t) {
  897. var n = t + "queueHooks";
  898. return b._data(e, n) || b._data(e, n, {
  899. empty: b.Callbacks("once memory").add(function () {
  900. b._removeData(e, t + "queue"), b._removeData(e, n)
  901. })
  902. })
  903. }
  904. }), b.fn.extend({
  905. queue: function (e, n) {
  906. var r = 2;
  907. return "string" != typeof e && (n = e, e = "fx", r--), r > arguments.length ? b.queue(this[0], e) : n === t ? this : this.each(function () {
  908. var t = b.queue(this, e, n);
  909. b._queueHooks(this, e), "fx" === e && "inprogress" !== t[0] && b.dequeue(this, e)
  910. })
  911. }, dequeue: function (e) {
  912. return this.each(function () {
  913. b.dequeue(this, e)
  914. })
  915. }, delay: function (e, t) {
  916. return e = b.fx ? b.fx.speeds[e] || e : e, t = t || "fx", this.queue(t, function (t, n) {
  917. var r = setTimeout(t, e);
  918. n.stop = function () {
  919. clearTimeout(r)
  920. }
  921. })
  922. }, clearQueue: function (e) {
  923. return this.queue(e || "fx", [])
  924. }, promise: function (e, n) {
  925. var r, i = 1, o = b.Deferred(), a = this, s = this.length, u = function () {
  926. --i || o.resolveWith(a, [a])
  927. };
  928. "string" != typeof e && (n = e, e = t), e = e || "fx";
  929. while (s--)r = b._data(a[s], e + "queueHooks"), r && r.empty && (i++, r.empty.add(u));
  930. return u(), o.promise(n)
  931. }
  932. });
  933. var I, z, X = /[\t\r\n]/g, U = /\r/g, V = /^(?:input|select|textarea|button|object)$/i, Y = /^(?:a|area)$/i,
  934. J = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
  935. G = /^(?:checked|selected)$/i, Q = b.support.getSetAttribute, K = b.support.input;
  936. b.fn.extend({
  937. attr: function (e, t) {
  938. return b.access(this, b.attr, e, t, arguments.length > 1)
  939. }, removeAttr: function (e) {
  940. return this.each(function () {
  941. b.removeAttr(this, e)
  942. })
  943. }, prop: function (e, t) {
  944. return b.access(this, b.prop, e, t, arguments.length > 1)
  945. }, removeProp: function (e) {
  946. return e = b.propFix[e] || e, this.each(function () {
  947. try {
  948. this[e] = t, delete this[e]
  949. } catch (n) {
  950. }
  951. })
  952. }, addClass: function (e) {
  953. var t, n, r, i, o, a = 0, s = this.length, u = "string" == typeof e && e;
  954. if (b.isFunction(e))return this.each(function (t) {
  955. b(this).addClass(e.call(this, t, this.className))
  956. });
  957. if (u)for (t = (e || "").match(w) || []; s > a; a++)if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(X, " ") : " ")) {
  958. o = 0;
  959. while (i = t[o++])0 > r.indexOf(" " + i + " ") && (r += i + " ");
  960. n.className = b.trim(r)
  961. }
  962. return this
  963. }, removeClass: function (e) {
  964. var t, n, r, i, o, a = 0, s = this.length, u = 0 === arguments.length || "string" == typeof e && e;
  965. if (b.isFunction(e))return this.each(function (t) {
  966. b(this).removeClass(e.call(this, t, this.className))
  967. });
  968. if (u)for (t = (e || "").match(w) || []; s > a; a++)if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(X, " ") : "")) {
  969. o = 0;
  970. while (i = t[o++])while (r.indexOf(" " + i + " ") >= 0)r = r.replace(" " + i + " ", " ");
  971. n.className = e ? b.trim(r) : ""
  972. }
  973. return this
  974. }, toggleClass: function (e, t) {
  975. var n = typeof e, r = "boolean" == typeof t;
  976. return b.isFunction(e) ? this.each(function (n) {
  977. b(this).toggleClass(e.call(this, n, this.className, t), t)
  978. }) : this.each(function () {
  979. if ("string" === n) {
  980. var o, a = 0, s = b(this), u = t, l = e.match(w) || [];
  981. while (o = l[a++])u = r ? u : !s.hasClass(o), s[u ? "addClass" : "removeClass"](o)
  982. } else(n === i || "boolean" === n) && (this.className && b._data(this, "__className__", this.className), this.className = this.className || e === !1 ? "" : b._data(this, "__className__") || "")
  983. })
  984. }, hasClass: function (e) {
  985. var t = " " + e + " ", n = 0, r = this.length;
  986. for (; r > n; n++)if (1 === this[n].nodeType && (" " + this[n].className + " ").replace(X, " ").indexOf(t) >= 0)return !0;
  987. return !1
  988. }, val: function (e) {
  989. var n, r, i, o = this[0];
  990. {
  991. if (arguments.length)return i = b.isFunction(e), this.each(function (n) {
  992. var o, a = b(this);
  993. 1 === this.nodeType && (o = i ? e.call(this, n, a.val()) : e, null == o ? o = "" : "number" == typeof o ? o += "" : b.isArray(o) && (o = b.map(o, function (e) {
  994. return null == e ? "" : e + ""
  995. })), r = b.valHooks[this.type] || b.valHooks[this.nodeName.toLowerCase()], r && "set" in r && r.set(this, o, "value") !== t || (this.value = o))
  996. });
  997. if (o)return r = b.valHooks[o.type] || b.valHooks[o.nodeName.toLowerCase()], r && "get" in r && (n = r.get(o, "value")) !== t ? n : (n = o.value, "string" == typeof n ? n.replace(U, "") : null == n ? "" : n)
  998. }
  999. }
  1000. }), b.extend({
  1001. valHooks: {
  1002. option: {
  1003. get: function (e) {
  1004. var t = e.attributes.value;
  1005. return !t || t.specified ? e.value : e.text
  1006. }
  1007. }, select: {
  1008. get: function (e) {
  1009. var t, n, r = e.options, i = e.selectedIndex, o = "select-one" === e.type || 0 > i,
  1010. a = o ? null : [], s = o ? i + 1 : r.length, u = 0 > i ? s : o ? i : 0;
  1011. for (; s > u; u++)if (n = r[u], !(!n.selected && u !== i || (b.support.optDisabled ? n.disabled : null !== n.getAttribute("disabled")) || n.parentNode.disabled && b.nodeName(n.parentNode, "optgroup"))) {
  1012. if (t = b(n).val(), o)return t;
  1013. a.push(t)
  1014. }
  1015. return a
  1016. }, set: function (e, t) {
  1017. var n = b.makeArray(t);
  1018. return b(e).find("option").each(function () {
  1019. this.selected = b.inArray(b(this).val(), n) >= 0
  1020. }), n.length || (e.selectedIndex = -1), n
  1021. }
  1022. }
  1023. },
  1024. attr: function (e, n, r) {
  1025. var o, a, s, u = e.nodeType;
  1026. if (e && 3 !== u && 8 !== u && 2 !== u)return typeof e.getAttribute === i ? b.prop(e, n, r) : (a = 1 !== u || !b.isXMLDoc(e), a && (n = n.toLowerCase(), o = b.attrHooks[n] || (J.test(n) ? z : I)), r === t ? o && a && "get" in o && null !== (s = o.get(e, n)) ? s : (typeof e.getAttribute !== i && (s = e.getAttribute(n)), null == s ? t : s) : null !== r ? o && a && "set" in o && (s = o.set(e, r, n)) !== t ? s : (e.setAttribute(n, r + ""), r) : (b.removeAttr(e, n), t))
  1027. },
  1028. removeAttr: function (e, t) {
  1029. var n, r, i = 0, o = t && t.match(w);
  1030. if (o && 1 === e.nodeType)while (n = o[i++])r = b.propFix[n] || n, J.test(n) ? !Q && G.test(n) ? e[b.camelCase("default-" + n)] = e[r] = !1 : e[r] = !1 : b.attr(e, n, ""), e.removeAttribute(Q ? n : r)
  1031. },
  1032. attrHooks: {
  1033. type: {
  1034. set: function (e, t) {
  1035. if (!b.support.radioValue && "radio" === t && b.nodeName(e, "input")) {
  1036. var n = e.value;
  1037. return e.setAttribute("type", t), n && (e.value = n), t
  1038. }
  1039. }
  1040. }
  1041. },
  1042. propFix: {
  1043. tabindex: "tabIndex",
  1044. readonly: "readOnly",
  1045. "for": "htmlFor",
  1046. "class": "className",
  1047. maxlength: "maxLength",
  1048. cellspacing: "cellSpacing",
  1049. cellpadding: "cellPadding",
  1050. rowspan: "rowSpan",
  1051. colspan: "colSpan",
  1052. usemap: "useMap",
  1053. frameborder: "frameBorder",
  1054. contenteditable: "contentEditable"
  1055. },
  1056. prop: function (e, n, r) {
  1057. var i, o, a, s = e.nodeType;
  1058. if (e && 3 !== s && 8 !== s && 2 !== s)return a = 1 !== s || !b.isXMLDoc(e), a && (n = b.propFix[n] || n, o = b.propHooks[n]), r !== t ? o && "set" in o && (i = o.set(e, r, n)) !== t ? i : e[n] = r : o && "get" in o && null !== (i = o.get(e, n)) ? i : e[n]
  1059. },
  1060. propHooks: {
  1061. tabIndex: {
  1062. get: function (e) {
  1063. var n = e.getAttributeNode("tabindex");
  1064. return n && n.specified ? parseInt(n.value, 10) : V.test(e.nodeName) || Y.test(e.nodeName) && e.href ? 0 : t
  1065. }
  1066. }
  1067. }
  1068. }), z = {
  1069. get: function (e, n) {
  1070. var r = b.prop(e, n), i = "boolean" == typeof r && e.getAttribute(n),
  1071. o = "boolean" == typeof r ? K && Q ? null != i : G.test(n) ? e[b.camelCase("default-" + n)] : !!i : e.getAttributeNode(n);
  1072. return o && o.value !== !1 ? n.toLowerCase() : t
  1073. }, set: function (e, t, n) {
  1074. return t === !1 ? b.removeAttr(e, n) : K && Q || !G.test(n) ? e.setAttribute(!Q && b.propFix[n] || n, n) : e[b.camelCase("default-" + n)] = e[n] = !0, n
  1075. }
  1076. }, K && Q || (b.attrHooks.value = {
  1077. get: function (e, n) {
  1078. var r = e.getAttributeNode(n);
  1079. return b.nodeName(e, "input") ? e.defaultValue : r && r.specified ? r.value : t
  1080. }, set: function (e, n, r) {
  1081. return b.nodeName(e, "input") ? (e.defaultValue = n, t) : I && I.set(e, n, r)
  1082. }
  1083. }), Q || (I = b.valHooks.button = {
  1084. get: function (e, n) {
  1085. var r = e.getAttributeNode(n);
  1086. return r && ("id" === n || "name" === n || "coords" === n ? "" !== r.value : r.specified) ? r.value : t
  1087. }, set: function (e, n, r) {
  1088. var i = e.getAttributeNode(r);
  1089. return i || e.setAttributeNode(i = e.ownerDocument.createAttribute(r)), i.value = n += "", "value" === r || n === e.getAttribute(r) ? n : t
  1090. }
  1091. }, b.attrHooks.contenteditable = {
  1092. get: I.get, set: function (e, t, n) {
  1093. I.set(e, "" === t ? !1 : t, n)
  1094. }
  1095. }, b.each(["width", "height"], function (e, n) {
  1096. b.attrHooks[n] = b.extend(b.attrHooks[n], {
  1097. set: function (e, r) {
  1098. return "" === r ? (e.setAttribute(n, "auto"), r) : t
  1099. }
  1100. })
  1101. })), b.support.hrefNormalized || (b.each(["href", "src", "width", "height"], function (e, n) {
  1102. b.attrHooks[n] = b.extend(b.attrHooks[n], {
  1103. get: function (e) {
  1104. var r = e.getAttribute(n, 2);
  1105. return null == r ? t : r
  1106. }
  1107. })
  1108. }), b.each(["href", "src"], function (e, t) {
  1109. b.propHooks[t] = {
  1110. get: function (e) {
  1111. return e.getAttribute(t, 4)
  1112. }
  1113. }
  1114. })), b.support.style || (b.attrHooks.style = {
  1115. get: function (e) {
  1116. return e.style.cssText || t
  1117. }, set: function (e, t) {
  1118. return e.style.cssText = t + ""
  1119. }
  1120. }), b.support.optSelected || (b.propHooks.selected = b.extend(b.propHooks.selected, {
  1121. get: function (e) {
  1122. var t = e.parentNode;
  1123. return t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex), null
  1124. }
  1125. })), b.support.enctype || (b.propFix.enctype = "encoding"), b.support.checkOn || b.each(["radio", "checkbox"], function () {
  1126. b.valHooks[this] = {
  1127. get: function (e) {
  1128. return null === e.getAttribute("value") ? "on" : e.value
  1129. }
  1130. }
  1131. }), b.each(["radio", "checkbox"], function () {
  1132. b.valHooks[this] = b.extend(b.valHooks[this], {
  1133. set: function (e, n) {
  1134. return b.isArray(n) ? e.checked = b.inArray(b(e).val(), n) >= 0 : t
  1135. }
  1136. })
  1137. });
  1138. var Z = /^(?:input|select|textarea)$/i, et = /^key/, tt = /^(?:mouse|contextmenu)|click/,
  1139. nt = /^(?:focusinfocus|focusoutblur)$/, rt = /^([^.]*)(?:\.(.+)|)$/;
  1140. function it() {
  1141. return !0
  1142. }
  1143. function ot() {
  1144. return !1
  1145. }
  1146. b.event = {
  1147. global: {},
  1148. add: function (e, n, r, o, a) {
  1149. var s, u, l, c, p, f, d, h, g, m, y, v = b._data(e);
  1150. if (v) {
  1151. r.handler && (c = r, r = c.handler, a = c.selector), r.guid || (r.guid = b.guid++), (u = v.events) || (u = v.events = {}), (f = v.handle) || (f = v.handle = function (e) {
  1152. return typeof b === i || e && b.event.triggered === e.type ? t : b.event.dispatch.apply(f.elem, arguments)
  1153. }, f.elem = e), n = (n || "").match(w) || [""], l = n.length;
  1154. while (l--)s = rt.exec(n[l]) || [], g = y = s[1], m = (s[2] || "").split(".").sort(), p = b.event.special[g] || {}, g = (a ? p.delegateType : p.bindType) || g, p = b.event.special[g] || {}, d = b.extend({
  1155. type: g,
  1156. origType: y,
  1157. data: o,
  1158. handler: r,
  1159. guid: r.guid,
  1160. selector: a,
  1161. needsContext: a && b.expr.match.needsContext.test(a),
  1162. namespace: m.join(".")
  1163. }, c), (h = u[g]) || (h = u[g] = [], h.delegateCount = 0, p.setup && p.setup.call(e, o, m, f) !== !1 || (e.addEventListener ? e.addEventListener(g, f, !1) : e.attachEvent && e.attachEvent("on" + g, f))), p.add && (p.add.call(e, d), d.handler.guid || (d.handler.guid = r.guid)), a ? h.splice(h.delegateCount++, 0, d) : h.push(d), b.event.global[g] = !0;
  1164. e = null
  1165. }
  1166. },
  1167. remove: function (e, t, n, r, i) {
  1168. var o, a, s, u, l, c, p, f, d, h, g, m = b.hasData(e) && b._data(e);
  1169. if (m && (c = m.events)) {
  1170. t = (t || "").match(w) || [""], l = t.length;
  1171. while (l--)if (s = rt.exec(t[l]) || [], d = g = s[1], h = (s[2] || "").split(".").sort(), d) {
  1172. p = b.event.special[d] || {}, d = (r ? p.delegateType : p.bindType) || d, f = c[d] || [], s = s[2] && RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), u = o = f.length;
  1173. while (o--)a = f[o], !i && g !== a.origType || n && n.guid !== a.guid || s && !s.test(a.namespace) || r && r !== a.selector && ("**" !== r || !a.selector) || (f.splice(o, 1), a.selector && f.delegateCount--, p.remove && p.remove.call(e, a));
  1174. u && !f.length && (p.teardown && p.teardown.call(e, h, m.handle) !== !1 || b.removeEvent(e, d, m.handle), delete c[d])
  1175. } else for (d in c)b.event.remove(e, d + t[l], n, r, !0);
  1176. b.isEmptyObject(c) && (delete m.handle, b._removeData(e, "events"))
  1177. }
  1178. },
  1179. trigger: function (n, r, i, a) {
  1180. var s, u, l, c, p, f, d, h = [i || o], g = y.call(n, "type") ? n.type : n,
  1181. m = y.call(n, "namespace") ? n.namespace.split(".") : [];
  1182. if (l = f = i = i || o, 3 !== i.nodeType && 8 !== i.nodeType && !nt.test(g + b.event.triggered) && (g.indexOf(".") >= 0 && (m = g.split("."), g = m.shift(), m.sort()), u = 0 > g.indexOf(":") && "on" + g, n = n[b.expando] ? n : new b.Event(g, "object" == typeof n && n), n.isTrigger = !0, n.namespace = m.join("."), n.namespace_re = n.namespace ? RegExp("(^|\\.)" + m.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, n.result = t, n.target || (n.target = i), r = null == r ? [n] : b.makeArray(r, [n]), p = b.event.special[g] || {}, a || !p.trigger || p.trigger.apply(i, r) !== !1)) {
  1183. if (!a && !p.noBubble && !b.isWindow(i)) {
  1184. for (c = p.delegateType || g, nt.test(c + g) || (l = l.parentNode); l; l = l.parentNode)h.push(l), f = l;
  1185. f === (i.ownerDocument || o) && h.push(f.defaultView || f.parentWindow || e)
  1186. }
  1187. d = 0;
  1188. while ((l = h[d++]) && !n.isPropagationStopped())n.type = d > 1 ? c : p.bindType || g, s = (b._data(l, "events") || {})[n.type] && b._data(l, "handle"), s && s.apply(l, r), s = u && l[u], s && b.acceptData(l) && s.apply && s.apply(l, r) === !1 && n.preventDefault();
  1189. if (n.type = g, !(a || n.isDefaultPrevented() || p._default && p._default.apply(i.ownerDocument, r) !== !1 || "click" === g && b.nodeName(i, "a") || !b.acceptData(i) || !u || !i[g] || b.isWindow(i))) {
  1190. f = i[u], f && (i[u] = null), b.event.triggered = g;
  1191. try {
  1192. i[g]()
  1193. } catch (v) {
  1194. }
  1195. b.event.triggered = t, f && (i[u] = f)
  1196. }
  1197. return n.result
  1198. }
  1199. },
  1200. dispatch: function (e) {
  1201. e = b.event.fix(e);
  1202. var n, r, i, o, a, s = [], u = h.call(arguments), l = (b._data(this, "events") || {})[e.type] || [],
  1203. c = b.event.special[e.type] || {};
  1204. if (u[0] = e, e.delegateTarget = this, !c.preDispatch || c.preDispatch.call(this, e) !== !1) {
  1205. s = b.event.handlers.call(this, e, l), n = 0;
  1206. while ((o = s[n++]) && !e.isPropagationStopped()) {
  1207. e.currentTarget = o.elem, a = 0;
  1208. while ((i = o.handlers[a++]) && !e.isImmediatePropagationStopped())(!e.namespace_re || e.namespace_re.test(i.namespace)) && (e.handleObj = i, e.data = i.data, r = ((b.event.special[i.origType] || {}).handle || i.handler).apply(o.elem, u), r !== t && (e.result = r) === !1 && (e.preventDefault(), e.stopPropagation()))
  1209. }
  1210. return c.postDispatch && c.postDispatch.call(this, e), e.result
  1211. }
  1212. },
  1213. handlers: function (e, n) {
  1214. var r, i, o, a, s = [], u = n.delegateCount, l = e.target;
  1215. if (u && l.nodeType && (!e.button || "click" !== e.type))for (; l != this; l = l.parentNode || this)if (1 === l.nodeType && (l.disabled !== !0 || "click" !== e.type)) {
  1216. for (o = [], a = 0; u > a; a++)i = n[a], r = i.selector + " ", o[r] === t && (o[r] = i.needsContext ? b(r, this).index(l) >= 0 : b.find(r, this, null, [l]).length), o[r] && o.push(i);
  1217. o.length && s.push({elem: l, handlers: o})
  1218. }
  1219. return n.length > u && s.push({elem: this, handlers: n.slice(u)}), s
  1220. },
  1221. fix: function (e) {
  1222. if (e[b.expando])return e;
  1223. var t, n, r, i = e.type, a = e, s = this.fixHooks[i];
  1224. s || (this.fixHooks[i] = s = tt.test(i) ? this.mouseHooks : et.test(i) ? this.keyHooks : {}), r = s.props ? this.props.concat(s.props) : this.props, e = new b.Event(a), t = r.length;
  1225. while (t--)n = r[t], e[n] = a[n];
  1226. return e.target || (e.target = a.srcElement || o), 3 === e.target.nodeType && (e.target = e.target.parentNode), e.metaKey = !!e.metaKey, s.filter ? s.filter(e, a) : e
  1227. },
  1228. props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
  1229. fixHooks: {},
  1230. keyHooks: {
  1231. props: "char charCode key keyCode".split(" "), filter: function (e, t) {
  1232. return null == e.which && (e.which = null != t.charCode ? t.charCode : t.keyCode), e
  1233. }
  1234. },
  1235. mouseHooks: {
  1236. props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
  1237. filter: function (e, n) {
  1238. var r, i, a, s = n.button, u = n.fromElement;
  1239. return null == e.pageX && null != n.clientX && (i = e.target.ownerDocument || o, a = i.documentElement, r = i.body, e.pageX = n.clientX + (a && a.scrollLeft || r && r.scrollLeft || 0) - (a && a.clientLeft || r && r.clientLeft || 0), e.pageY = n.clientY + (a && a.scrollTop || r && r.scrollTop || 0) - (a && a.clientTop || r && r.clientTop || 0)), !e.relatedTarget && u && (e.relatedTarget = u === e.target ? n.toElement : u), e.which || s === t || (e.which = 1 & s ? 1 : 2 & s ? 3 : 4 & s ? 2 : 0), e
  1240. }
  1241. },
  1242. special: {
  1243. load: {noBubble: !0}, click: {
  1244. trigger: function () {
  1245. return b.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : t
  1246. }
  1247. }, focus: {
  1248. trigger: function () {
  1249. if (this !== o.activeElement && this.focus)try {
  1250. return this.focus(), !1
  1251. } catch (e) {
  1252. }
  1253. }, delegateType: "focusin"
  1254. }, blur: {
  1255. trigger: function () {
  1256. return this === o.activeElement && this.blur ? (this.blur(), !1) : t
  1257. }, delegateType: "focusout"
  1258. }, beforeunload: {
  1259. postDispatch: function (e) {
  1260. e.result !== t && (e.originalEvent.returnValue = e.result)
  1261. }
  1262. }
  1263. },
  1264. simulate: function (e, t, n, r) {
  1265. var i = b.extend(new b.Event, n, {type: e, isSimulated: !0, originalEvent: {}});
  1266. r ? b.event.trigger(i, null, t) : b.event.dispatch.call(t, i), i.isDefaultPrevented() && n.preventDefault()
  1267. }
  1268. }, b.removeEvent = o.removeEventListener ? function (e, t, n) {
  1269. e.removeEventListener && e.removeEventListener(t, n, !1)
  1270. } : function (e, t, n) {
  1271. var r = "on" + t;
  1272. e.detachEvent && (typeof e[r] === i && (e[r] = null), e.detachEvent(r, n))
  1273. }, b.Event = function (e, n) {
  1274. return this instanceof b.Event ? (e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || e.returnValue === !1 || e.getPreventDefault && e.getPreventDefault() ? it : ot) : this.type = e, n && b.extend(this, n), this.timeStamp = e && e.timeStamp || b.now(), this[b.expando] = !0, t) : new b.Event(e, n)
  1275. }, b.Event.prototype = {
  1276. isDefaultPrevented: ot,
  1277. isPropagationStopped: ot,
  1278. isImmediatePropagationStopped: ot,
  1279. preventDefault: function () {
  1280. var e = this.originalEvent;
  1281. this.isDefaultPrevented = it, e && (e.preventDefault ? e.preventDefault() : e.returnValue = !1)
  1282. },
  1283. stopPropagation: function () {
  1284. var e = this.originalEvent;
  1285. this.isPropagationStopped = it, e && (e.stopPropagation && e.stopPropagation(), e.cancelBubble = !0)
  1286. },
  1287. stopImmediatePropagation: function () {
  1288. this.isImmediatePropagationStopped = it, this.stopPropagation()
  1289. }
  1290. }, b.each({mouseenter: "mouseover", mouseleave: "mouseout"}, function (e, t) {
  1291. b.event.special[e] = {
  1292. delegateType: t, bindType: t, handle: function (e) {
  1293. var n, r = this, i = e.relatedTarget, o = e.handleObj;
  1294. return (!i || i !== r && !b.contains(r, i)) && (e.type = o.origType, n = o.handler.apply(this, arguments), e.type = t), n
  1295. }
  1296. }
  1297. }), b.support.submitBubbles || (b.event.special.submit = {
  1298. setup: function () {
  1299. return b.nodeName(this, "form") ? !1 : (b.event.add(this, "click._submit keypress._submit", function (e) {
  1300. var n = e.target, r = b.nodeName(n, "input") || b.nodeName(n, "button") ? n.form : t;
  1301. r && !b._data(r, "submitBubbles") && (b.event.add(r, "submit._submit", function (e) {
  1302. e._submit_bubble = !0
  1303. }), b._data(r, "submitBubbles", !0))
  1304. }), t)
  1305. }, postDispatch: function (e) {
  1306. e._submit_bubble && (delete e._submit_bubble, this.parentNode && !e.isTrigger && b.event.simulate("submit", this.parentNode, e, !0))
  1307. }, teardown: function () {
  1308. return b.nodeName(this, "form") ? !1 : (b.event.remove(this, "._submit"), t)
  1309. }
  1310. }), b.support.changeBubbles || (b.event.special.change = {
  1311. setup: function () {
  1312. return Z.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (b.event.add(this, "propertychange._change", function (e) {
  1313. "checked" === e.originalEvent.propertyName && (this._just_changed = !0)
  1314. }), b.event.add(this, "click._change", function (e) {
  1315. this._just_changed && !e.isTrigger && (this._just_changed = !1), b.event.simulate("change", this, e, !0)
  1316. })), !1) : (b.event.add(this, "beforeactivate._change", function (e) {
  1317. var t = e.target;
  1318. Z.test(t.nodeName) && !b._data(t, "changeBubbles") && (b.event.add(t, "change._change", function (e) {
  1319. !this.parentNode || e.isSimulated || e.isTrigger || b.event.simulate("change", this.parentNode, e, !0)
  1320. }), b._data(t, "changeBubbles", !0))
  1321. }), t)
  1322. }, handle: function (e) {
  1323. var n = e.target;
  1324. return this !== n || e.isSimulated || e.isTrigger || "radio" !== n.type && "checkbox" !== n.type ? e.handleObj.handler.apply(this, arguments) : t
  1325. }, teardown: function () {
  1326. return b.event.remove(this, "._change"), !Z.test(this.nodeName)
  1327. }
  1328. }), b.support.focusinBubbles || b.each({focus: "focusin", blur: "focusout"}, function (e, t) {
  1329. var n = 0, r = function (e) {
  1330. b.event.simulate(t, e.target, b.event.fix(e), !0)
  1331. };
  1332. b.event.special[t] = {
  1333. setup: function () {
  1334. 0 === n++ && o.addEventListener(e, r, !0)
  1335. }, teardown: function () {
  1336. 0 === --n && o.removeEventListener(e, r, !0)
  1337. }
  1338. }
  1339. }), b.fn.extend({
  1340. on: function (e, n, r, i, o) {
  1341. var a, s;
  1342. if ("object" == typeof e) {
  1343. "string" != typeof n && (r = r || n, n = t);
  1344. for (a in e)this.on(a, n, r, e[a], o);
  1345. return this
  1346. }
  1347. if (null == r && null == i ? (i = n, r = n = t) : null == i && ("string" == typeof n ? (i = r, r = t) : (i = r, r = n, n = t)), i === !1) i = ot; else if (!i)return this;
  1348. return 1 === o && (s = i, i = function (e) {
  1349. return b().off(e), s.apply(this, arguments)
  1350. }, i.guid = s.guid || (s.guid = b.guid++)), this.each(function () {
  1351. b.event.add(this, e, i, r, n)
  1352. })
  1353. }, one: function (e, t, n, r) {
  1354. return this.on(e, t, n, r, 1)
  1355. }, off: function (e, n, r) {
  1356. var i, o;
  1357. if (e && e.preventDefault && e.handleObj)return i = e.handleObj, b(e.delegateTarget).off(i.namespace ? i.origType + "." + i.namespace : i.origType, i.selector, i.handler), this;
  1358. if ("object" == typeof e) {
  1359. for (o in e)this.off(o, n, e[o]);
  1360. return this
  1361. }
  1362. return (n === !1 || "function" == typeof n) && (r = n, n = t), r === !1 && (r = ot), this.each(function () {
  1363. b.event.remove(this, e, r, n)
  1364. })
  1365. }, bind: function (e, t, n) {
  1366. return this.on(e, null, t, n)
  1367. }, unbind: function (e, t) {
  1368. return this.off(e, null, t)
  1369. }, delegate: function (e, t, n, r) {
  1370. return this.on(t, e, n, r)
  1371. }, undelegate: function (e, t, n) {
  1372. return 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", n)
  1373. }, trigger: function (e, t) {
  1374. return this.each(function () {
  1375. b.event.trigger(e, t, this)
  1376. })
  1377. }, triggerHandler: function (e, n) {
  1378. var r = this[0];
  1379. return r ? b.event.trigger(e, n, r, !0) : t
  1380. }
  1381. }), function (e, t) {
  1382. var n, r, i, o, a, s, u, l, c, p, f, d, h, g, m, y, v, x = "sizzle" + -new Date, w = e.document, T = {},
  1383. N = 0, C = 0, k = it(), E = it(), S = it(), A = typeof t, j = 1 << 31, D = [], L = D.pop, H = D.push,
  1384. q = D.slice, M = D.indexOf || function (e) {
  1385. var t = 0, n = this.length;
  1386. for (; n > t; t++)if (this[t] === e)return t;
  1387. return -1
  1388. }, _ = "[\\x20\\t\\r\\n\\f]", F = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", O = F.replace("w", "w#"),
  1389. B = "([*^$|!~]?=)",
  1390. P = "\\[" + _ + "*(" + F + ")" + _ + "*(?:" + B + _ + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + O + ")|)|)" + _ + "*\\]",
  1391. R = ":(" + F + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + P.replace(3, 8) + ")*)|.*)\\)|)",
  1392. W = RegExp("^" + _ + "+|((?:^|[^\\\\])(?:\\\\.)*)" + _ + "+$", "g"),
  1393. $ = RegExp("^" + _ + "*," + _ + "*"), I = RegExp("^" + _ + "*([\\x20\\t\\r\\n\\f>+~])" + _ + "*"),
  1394. z = RegExp(R), X = RegExp("^" + O + "$"), U = {
  1395. ID: RegExp("^#(" + F + ")"),
  1396. CLASS: RegExp("^\\.(" + F + ")"),
  1397. NAME: RegExp("^\\[name=['\"]?(" + F + ")['\"]?\\]"),
  1398. TAG: RegExp("^(" + F.replace("w", "w*") + ")"),
  1399. ATTR: RegExp("^" + P),
  1400. PSEUDO: RegExp("^" + R),
  1401. CHILD: RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + _ + "*(even|odd|(([+-]|)(\\d*)n|)" + _ + "*(?:([+-]|)" + _ + "*(\\d+)|))" + _ + "*\\)|)", "i"),
  1402. needsContext: RegExp("^" + _ + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + _ + "*((?:-\\d)?\\d*)" + _ + "*\\)|)(?=[^-]|$)", "i")
  1403. }, V = /[\x20\t\r\n\f]*[+~]/, Y = /^[^{]+\{\s*\[native code/, J = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
  1404. G = /^(?:input|select|textarea|button)$/i, Q = /^h\d$/i, K = /'|\\/g,
  1405. Z = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, et = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
  1406. tt = function (e, t) {
  1407. var n = "0x" + t - 65536;
  1408. return n !== n ? t : 0 > n ? String.fromCharCode(n + 65536) : String.fromCharCode(55296 | n >> 10, 56320 | 1023 & n)
  1409. };
  1410. try {
  1411. q.call(w.documentElement.childNodes, 0)[0].nodeType
  1412. } catch (nt) {
  1413. q = function (e) {
  1414. var t, n = [];
  1415. while (t = this[e++])n.push(t);
  1416. return n
  1417. }
  1418. }
  1419. function rt(e) {
  1420. return Y.test(e + "")
  1421. }
  1422. function it() {
  1423. var e, t = [];
  1424. return e = function (n, r) {
  1425. return t.push(n += " ") > i.cacheLength && delete e[t.shift()], e[n] = r
  1426. }
  1427. }
  1428. function ot(e) {
  1429. return e[x] = !0, e
  1430. }
  1431. function at(e) {
  1432. var t = p.createElement("div");
  1433. try {
  1434. return e(t)
  1435. } catch (n) {
  1436. return !1
  1437. } finally {
  1438. t = null
  1439. }
  1440. }
  1441. function st(e, t, n, r) {
  1442. var i, o, a, s, u, l, f, g, m, v;
  1443. if ((t ? t.ownerDocument || t : w) !== p && c(t), t = t || p, n = n || [], !e || "string" != typeof e)return n;
  1444. if (1 !== (s = t.nodeType) && 9 !== s)return [];
  1445. if (!d && !r) {
  1446. if (i = J.exec(e))if (a = i[1]) {
  1447. if (9 === s) {
  1448. if (o = t.getElementById(a), !o || !o.parentNode)return n;
  1449. if (o.id === a)return n.push(o), n
  1450. } else if (t.ownerDocument && (o = t.ownerDocument.getElementById(a)) && y(t, o) && o.id === a)return n.push(o), n
  1451. } else {
  1452. if (i[2])return H.apply(n, q.call(t.getElementsByTagName(e), 0)), n;
  1453. if ((a = i[3]) && T.getByClassName && t.getElementsByClassName)return H.apply(n, q.call(t.getElementsByClassName(a), 0)), n
  1454. }
  1455. if (T.qsa && !h.test(e)) {
  1456. if (f = !0, g = x, m = t, v = 9 === s && e, 1 === s && "object" !== t.nodeName.toLowerCase()) {
  1457. l = ft(e), (f = t.getAttribute("id")) ? g = f.replace(K, "\\$&") : t.setAttribute("id", g), g = "[id='" + g + "'] ", u = l.length;
  1458. while (u--)l[u] = g + dt(l[u]);
  1459. m = V.test(e) && t.parentNode || t, v = l.join(",")
  1460. }
  1461. if (v)try {
  1462. return H.apply(n, q.call(m.querySelectorAll(v), 0)), n
  1463. } catch (b) {
  1464. } finally {
  1465. f || t.removeAttribute("id")
  1466. }
  1467. }
  1468. }
  1469. return wt(e.replace(W, "$1"), t, n, r)
  1470. }
  1471. a = st.isXML = function (e) {
  1472. var t = e && (e.ownerDocument || e).documentElement;
  1473. return t ? "HTML" !== t.nodeName : !1
  1474. }, c = st.setDocument = function (e) {
  1475. var n = e ? e.ownerDocument || e : w;
  1476. return n !== p && 9 === n.nodeType && n.documentElement ? (p = n, f = n.documentElement, d = a(n), T.tagNameNoComments = at(function (e) {
  1477. return e.appendChild(n.createComment("")), !e.getElementsByTagName("*").length
  1478. }), T.attributes = at(function (e) {
  1479. e.innerHTML = "<select></select>";
  1480. var t = typeof e.lastChild.getAttribute("multiple");
  1481. return "boolean" !== t && "string" !== t
  1482. }), T.getByClassName = at(function (e) {
  1483. return e.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>", e.getElementsByClassName && e.getElementsByClassName("e").length ? (e.lastChild.className = "e", 2 === e.getElementsByClassName("e").length) : !1
  1484. }), T.getByName = at(function (e) {
  1485. e.id = x + 0, e.innerHTML = "<a name='" + x + "'></a><div name='" + x + "'></div>", f.insertBefore(e, f.firstChild);
  1486. var t = n.getElementsByName && n.getElementsByName(x).length === 2 + n.getElementsByName(x + 0).length;
  1487. return T.getIdNotName = !n.getElementById(x), f.removeChild(e), t
  1488. }), i.attrHandle = at(function (e) {
  1489. return e.innerHTML = "<a href='#'></a>", e.firstChild && typeof e.firstChild.getAttribute !== A && "#" === e.firstChild.getAttribute("href")
  1490. }) ? {} : {
  1491. href: function (e) {
  1492. return e.getAttribute("href", 2)
  1493. }, type: function (e) {
  1494. return e.getAttribute("type")
  1495. }
  1496. }, T.getIdNotName ? (i.find.ID = function (e, t) {
  1497. if (typeof t.getElementById !== A && !d) {
  1498. var n = t.getElementById(e);
  1499. return n && n.parentNode ? [n] : []
  1500. }
  1501. }, i.filter.ID = function (e) {
  1502. var t = e.replace(et, tt);
  1503. return function (e) {
  1504. return e.getAttribute("id") === t
  1505. }
  1506. }) : (i.find.ID = function (e, n) {
  1507. if (typeof n.getElementById !== A && !d) {
  1508. var r = n.getElementById(e);
  1509. return r ? r.id === e || typeof r.getAttributeNode !== A && r.getAttributeNode("id").value === e ? [r] : t : []
  1510. }
  1511. }, i.filter.ID = function (e) {
  1512. var t = e.replace(et, tt);
  1513. return function (e) {
  1514. var n = typeof e.getAttributeNode !== A && e.getAttributeNode("id");
  1515. return n && n.value === t
  1516. }
  1517. }), i.find.TAG = T.tagNameNoComments ? function (e, n) {
  1518. return typeof n.getElementsByTagName !== A ? n.getElementsByTagName(e) : t
  1519. } : function (e, t) {
  1520. var n, r = [], i = 0, o = t.getElementsByTagName(e);
  1521. if ("*" === e) {
  1522. while (n = o[i++])1 === n.nodeType && r.push(n);
  1523. return r
  1524. }
  1525. return o
  1526. }, i.find.NAME = T.getByName && function (e, n) {
  1527. return typeof n.getElementsByName !== A ? n.getElementsByName(name) : t
  1528. }, i.find.CLASS = T.getByClassName && function (e, n) {
  1529. return typeof n.getElementsByClassName === A || d ? t : n.getElementsByClassName(e)
  1530. }, g = [], h = [":focus"], (T.qsa = rt(n.querySelectorAll)) && (at(function (e) {
  1531. e.innerHTML = "<select><option selected=''></option></select>", e.querySelectorAll("[selected]").length || h.push("\\[" + _ + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)"), e.querySelectorAll(":checked").length || h.push(":checked")
  1532. }), at(function (e) {
  1533. e.innerHTML = "<input type='hidden' i=''/>", e.querySelectorAll("[i^='']").length && h.push("[*^$]=" + _ + "*(?:\"\"|'')"), e.querySelectorAll(":enabled").length || h.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), h.push(",.*:")
  1534. })), (T.matchesSelector = rt(m = f.matchesSelector || f.mozMatchesSelector || f.webkitMatchesSelector || f.oMatchesSelector || f.msMatchesSelector)) && at(function (e) {
  1535. T.disconnectedMatch = m.call(e, "div"), m.call(e, "[s!='']:x"), g.push("!=", R)
  1536. }), h = RegExp(h.join("|")), g = RegExp(g.join("|")), y = rt(f.contains) || f.compareDocumentPosition ? function (e, t) {
  1537. var n = 9 === e.nodeType ? e.documentElement : e, r = t && t.parentNode;
  1538. return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r)))
  1539. } : function (e, t) {
  1540. if (t)while (t = t.parentNode)if (t === e)return !0;
  1541. return !1
  1542. }, v = f.compareDocumentPosition ? function (e, t) {
  1543. var r;
  1544. return e === t ? (u = !0, 0) : (r = t.compareDocumentPosition && e.compareDocumentPosition && e.compareDocumentPosition(t)) ? 1 & r || e.parentNode && 11 === e.parentNode.nodeType ? e === n || y(w, e) ? -1 : t === n || y(w, t) ? 1 : 0 : 4 & r ? -1 : 1 : e.compareDocumentPosition ? -1 : 1
  1545. } : function (e, t) {
  1546. var r, i = 0, o = e.parentNode, a = t.parentNode, s = [e], l = [t];
  1547. if (e === t)return u = !0, 0;
  1548. if (!o || !a)return e === n ? -1 : t === n ? 1 : o ? -1 : a ? 1 : 0;
  1549. if (o === a)return ut(e, t);
  1550. r = e;
  1551. while (r = r.parentNode)s.unshift(r);
  1552. r = t;
  1553. while (r = r.parentNode)l.unshift(r);
  1554. while (s[i] === l[i])i++;
  1555. return i ? ut(s[i], l[i]) : s[i] === w ? -1 : l[i] === w ? 1 : 0
  1556. }, u = !1, [0, 0].sort(v), T.detectDuplicates = u, p) : p
  1557. }, st.matches = function (e, t) {
  1558. return st(e, null, null, t)
  1559. }, st.matchesSelector = function (e, t) {
  1560. if ((e.ownerDocument || e) !== p && c(e), t = t.replace(Z, "='$1']"), !(!T.matchesSelector || d || g && g.test(t) || h.test(t)))try {
  1561. var n = m.call(e, t);
  1562. if (n || T.disconnectedMatch || e.document && 11 !== e.document.nodeType)return n
  1563. } catch (r) {
  1564. }
  1565. return st(t, p, null, [e]).length > 0
  1566. }, st.contains = function (e, t) {
  1567. return (e.ownerDocument || e) !== p && c(e), y(e, t)
  1568. }, st.attr = function (e, t) {
  1569. var n;
  1570. return (e.ownerDocument || e) !== p && c(e), d || (t = t.toLowerCase()), (n = i.attrHandle[t]) ? n(e) : d || T.attributes ? e.getAttribute(t) : ((n = e.getAttributeNode(t)) || e.getAttribute(t)) && e[t] === !0 ? t : n && n.specified ? n.value : null
  1571. }, st.error = function (e) {
  1572. throw Error("Syntax error, unrecognized expression: " + e)
  1573. }, st.uniqueSort = function (e) {
  1574. var t, n = [], r = 1, i = 0;
  1575. if (u = !T.detectDuplicates, e.sort(v), u) {
  1576. for (; t = e[r]; r++)t === e[r - 1] && (i = n.push(r));
  1577. while (i--)e.splice(n[i], 1)
  1578. }
  1579. return e
  1580. };
  1581. function ut(e, t) {
  1582. var n = t && e, r = n && (~t.sourceIndex || j) - (~e.sourceIndex || j);
  1583. if (r)return r;
  1584. if (n)while (n = n.nextSibling)if (n === t)return -1;
  1585. return e ? 1 : -1
  1586. }
  1587. function lt(e) {
  1588. return function (t) {
  1589. var n = t.nodeName.toLowerCase();
  1590. return "input" === n && t.type === e
  1591. }
  1592. }
  1593. function ct(e) {
  1594. return function (t) {
  1595. var n = t.nodeName.toLowerCase();
  1596. return ("input" === n || "button" === n) && t.type === e
  1597. }
  1598. }
  1599. function pt(e) {
  1600. return ot(function (t) {
  1601. return t = +t, ot(function (n, r) {
  1602. var i, o = e([], n.length, t), a = o.length;
  1603. while (a--)n[i = o[a]] && (n[i] = !(r[i] = n[i]))
  1604. })
  1605. })
  1606. }
  1607. o = st.getText = function (e) {
  1608. var t, n = "", r = 0, i = e.nodeType;
  1609. if (i) {
  1610. if (1 === i || 9 === i || 11 === i) {
  1611. if ("string" == typeof e.textContent)return e.textContent;
  1612. for (e = e.firstChild; e; e = e.nextSibling)n += o(e)
  1613. } else if (3 === i || 4 === i)return e.nodeValue
  1614. } else for (; t = e[r]; r++)n += o(t);
  1615. return n
  1616. }, i = st.selectors = {
  1617. cacheLength: 50,
  1618. createPseudo: ot,
  1619. match: U,
  1620. find: {},
  1621. relative: {
  1622. ">": {dir: "parentNode", first: !0},
  1623. " ": {dir: "parentNode"},
  1624. "+": {dir: "previousSibling", first: !0},
  1625. "~": {dir: "previousSibling"}
  1626. },
  1627. preFilter: {
  1628. ATTR: function (e) {
  1629. return e[1] = e[1].replace(et, tt), e[3] = (e[4] || e[5] || "").replace(et, tt), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4)
  1630. }, CHILD: function (e) {
  1631. return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || st.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && st.error(e[0]), e
  1632. }, PSEUDO: function (e) {
  1633. var t, n = !e[5] && e[2];
  1634. return U.CHILD.test(e[0]) ? null : (e[4] ? e[2] = e[4] : n && z.test(n) && (t = ft(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3))
  1635. }
  1636. },
  1637. filter: {
  1638. TAG: function (e) {
  1639. return "*" === e ? function () {
  1640. return !0
  1641. } : (e = e.replace(et, tt).toLowerCase(), function (t) {
  1642. return t.nodeName && t.nodeName.toLowerCase() === e
  1643. })
  1644. }, CLASS: function (e) {
  1645. var t = k[e + " "];
  1646. return t || (t = RegExp("(^|" + _ + ")" + e + "(" + _ + "|$)")) && k(e, function (e) {
  1647. return t.test(e.className || typeof e.getAttribute !== A && e.getAttribute("class") || "")
  1648. })
  1649. }, ATTR: function (e, t, n) {
  1650. return function (r) {
  1651. var i = st.attr(r, e);
  1652. return null == i ? "!=" === t : t ? (i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf(n) : "*=" === t ? n && i.indexOf(n) > -1 : "$=" === t ? n && i.slice(-n.length) === n : "~=" === t ? (" " + i + " ").indexOf(n) > -1 : "|=" === t ? i === n || i.slice(0, n.length + 1) === n + "-" : !1) : !0
  1653. }
  1654. }, CHILD: function (e, t, n, r, i) {
  1655. var o = "nth" !== e.slice(0, 3), a = "last" !== e.slice(-4), s = "of-type" === t;
  1656. return 1 === r && 0 === i ? function (e) {
  1657. return !!e.parentNode
  1658. } : function (t, n, u) {
  1659. var l, c, p, f, d, h, g = o !== a ? "nextSibling" : "previousSibling", m = t.parentNode,
  1660. y = s && t.nodeName.toLowerCase(), v = !u && !s;
  1661. if (m) {
  1662. if (o) {
  1663. while (g) {
  1664. p = t;
  1665. while (p = p[g])if (s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType)return !1;
  1666. h = g = "only" === e && !h && "nextSibling"
  1667. }
  1668. return !0
  1669. }
  1670. if (h = [a ? m.firstChild : m.lastChild], a && v) {
  1671. c = m[x] || (m[x] = {}), l = c[e] || [], d = l[0] === N && l[1], f = l[0] === N && l[2], p = d && m.childNodes[d];
  1672. while (p = ++d && p && p[g] || (f = d = 0) || h.pop())if (1 === p.nodeType && ++f && p === t) {
  1673. c[e] = [N, d, f];
  1674. break
  1675. }
  1676. } else if (v && (l = (t[x] || (t[x] = {}))[e]) && l[0] === N) f = l[1]; else while (p = ++d && p && p[g] || (f = d = 0) || h.pop())if ((s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) && ++f && (v && ((p[x] || (p[x] = {}))[e] = [N, f]), p === t))break;
  1677. return f -= i, f === r || 0 === f % r && f / r >= 0
  1678. }
  1679. }
  1680. }, PSEUDO: function (e, t) {
  1681. var n,
  1682. r = i.pseudos[e] || i.setFilters[e.toLowerCase()] || st.error("unsupported pseudo: " + e);
  1683. return r[x] ? r(t) : r.length > 1 ? (n = [e, e, "", t], i.setFilters.hasOwnProperty(e.toLowerCase()) ? ot(function (e, n) {
  1684. var i, o = r(e, t), a = o.length;
  1685. while (a--)i = M.call(e, o[a]), e[i] = !(n[i] = o[a])
  1686. }) : function (e) {
  1687. return r(e, 0, n)
  1688. }) : r
  1689. }
  1690. },
  1691. pseudos: {
  1692. not: ot(function (e) {
  1693. var t = [], n = [], r = s(e.replace(W, "$1"));
  1694. return r[x] ? ot(function (e, t, n, i) {
  1695. var o, a = r(e, null, i, []), s = e.length;
  1696. while (s--)(o = a[s]) && (e[s] = !(t[s] = o))
  1697. }) : function (e, i, o) {
  1698. return t[0] = e, r(t, null, o, n), !n.pop()
  1699. }
  1700. }), has: ot(function (e) {
  1701. return function (t) {
  1702. return st(e, t).length > 0
  1703. }
  1704. }), contains: ot(function (e) {
  1705. return function (t) {
  1706. return (t.textContent || t.innerText || o(t)).indexOf(e) > -1
  1707. }
  1708. }), lang: ot(function (e) {
  1709. return X.test(e || "") || st.error("unsupported lang: " + e), e = e.replace(et, tt).toLowerCase(), function (t) {
  1710. var n;
  1711. do if (n = d ? t.getAttribute("xml:lang") || t.getAttribute("lang") : t.lang)return n = n.toLowerCase(), n === e || 0 === n.indexOf(e + "-"); while ((t = t.parentNode) && 1 === t.nodeType);
  1712. return !1
  1713. }
  1714. }), target: function (t) {
  1715. var n = e.location && e.location.hash;
  1716. return n && n.slice(1) === t.id
  1717. }, root: function (e) {
  1718. return e === f
  1719. }, focus: function (e) {
  1720. return e === p.activeElement && (!p.hasFocus || p.hasFocus()) && !!(e.type || e.href || ~e.tabIndex)
  1721. }, enabled: function (e) {
  1722. return e.disabled === !1
  1723. }, disabled: function (e) {
  1724. return e.disabled === !0
  1725. }, checked: function (e) {
  1726. var t = e.nodeName.toLowerCase();
  1727. return "input" === t && !!e.checked || "option" === t && !!e.selected
  1728. }, selected: function (e) {
  1729. return e.parentNode && e.parentNode.selectedIndex, e.selected === !0
  1730. }, empty: function (e) {
  1731. for (e = e.firstChild; e; e = e.nextSibling)if (e.nodeName > "@" || 3 === e.nodeType || 4 === e.nodeType)return !1;
  1732. return !0
  1733. }, parent: function (e) {
  1734. return !i.pseudos.empty(e)
  1735. }, header: function (e) {
  1736. return Q.test(e.nodeName)
  1737. }, input: function (e) {
  1738. return G.test(e.nodeName)
  1739. }, button: function (e) {
  1740. var t = e.nodeName.toLowerCase();
  1741. return "input" === t && "button" === e.type || "button" === t
  1742. }, text: function (e) {
  1743. var t;
  1744. return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || t.toLowerCase() === e.type)
  1745. }, first: pt(function () {
  1746. return [0]
  1747. }), last: pt(function (e, t) {
  1748. return [t - 1]
  1749. }), eq: pt(function (e, t, n) {
  1750. return [0 > n ? n + t : n]
  1751. }), even: pt(function (e, t) {
  1752. var n = 0;
  1753. for (; t > n; n += 2)e.push(n);
  1754. return e
  1755. }), odd: pt(function (e, t) {
  1756. var n = 1;
  1757. for (; t > n; n += 2)e.push(n);
  1758. return e
  1759. }), lt: pt(function (e, t, n) {
  1760. var r = 0 > n ? n + t : n;
  1761. for (; --r >= 0;)e.push(r);
  1762. return e
  1763. }), gt: pt(function (e, t, n) {
  1764. var r = 0 > n ? n + t : n;
  1765. for (; t > ++r;)e.push(r);
  1766. return e
  1767. })
  1768. }
  1769. };
  1770. for (n in{radio: !0, checkbox: !0, file: !0, password: !0, image: !0})i.pseudos[n] = lt(n);
  1771. for (n in{submit: !0, reset: !0})i.pseudos[n] = ct(n);
  1772. function ft(e, t) {
  1773. var n, r, o, a, s, u, l, c = E[e + " "];
  1774. if (c)return t ? 0 : c.slice(0);
  1775. s = e, u = [], l = i.preFilter;
  1776. while (s) {
  1777. (!n || (r = $.exec(s))) && (r && (s = s.slice(r[0].length) || s), u.push(o = [])), n = !1, (r = I.exec(s)) && (n = r.shift(), o.push({
  1778. value: n,
  1779. type: r[0].replace(W, " ")
  1780. }), s = s.slice(n.length));
  1781. for (a in i.filter)!(r = U[a].exec(s)) || l[a] && !(r = l[a](r)) || (n = r.shift(), o.push({
  1782. value: n,
  1783. type: a,
  1784. matches: r
  1785. }), s = s.slice(n.length));
  1786. if (!n)break
  1787. }
  1788. return t ? s.length : s ? st.error(e) : E(e, u).slice(0)
  1789. }
  1790. function dt(e) {
  1791. var t = 0, n = e.length, r = "";
  1792. for (; n > t; t++)r += e[t].value;
  1793. return r
  1794. }
  1795. function ht(e, t, n) {
  1796. var i = t.dir, o = n && "parentNode" === i, a = C++;
  1797. return t.first ? function (t, n, r) {
  1798. while (t = t[i])if (1 === t.nodeType || o)return e(t, n, r)
  1799. } : function (t, n, s) {
  1800. var u, l, c, p = N + " " + a;
  1801. if (s) {
  1802. while (t = t[i])if ((1 === t.nodeType || o) && e(t, n, s))return !0
  1803. } else while (t = t[i])if (1 === t.nodeType || o)if (c = t[x] || (t[x] = {}), (l = c[i]) && l[0] === p) {
  1804. if ((u = l[1]) === !0 || u === r)return u === !0
  1805. } else if (l = c[i] = [p], l[1] = e(t, n, s) || r, l[1] === !0)return !0
  1806. }
  1807. }
  1808. function gt(e) {
  1809. return e.length > 1 ? function (t, n, r) {
  1810. var i = e.length;
  1811. while (i--)if (!e[i](t, n, r))return !1;
  1812. return !0
  1813. } : e[0]
  1814. }
  1815. function mt(e, t, n, r, i) {
  1816. var o, a = [], s = 0, u = e.length, l = null != t;
  1817. for (; u > s; s++)(o = e[s]) && (!n || n(o, r, i)) && (a.push(o), l && t.push(s));
  1818. return a
  1819. }
  1820. function yt(e, t, n, r, i, o) {
  1821. return r && !r[x] && (r = yt(r)), i && !i[x] && (i = yt(i, o)), ot(function (o, a, s, u) {
  1822. var l, c, p, f = [], d = [], h = a.length, g = o || xt(t || "*", s.nodeType ? [s] : s, []),
  1823. m = !e || !o && t ? g : mt(g, f, e, s, u), y = n ? i || (o ? e : h || r) ? [] : a : m;
  1824. if (n && n(m, y, s, u), r) {
  1825. l = mt(y, d), r(l, [], s, u), c = l.length;
  1826. while (c--)(p = l[c]) && (y[d[c]] = !(m[d[c]] = p))
  1827. }
  1828. if (o) {
  1829. if (i || e) {
  1830. if (i) {
  1831. l = [], c = y.length;
  1832. while (c--)(p = y[c]) && l.push(m[c] = p);
  1833. i(null, y = [], l, u)
  1834. }
  1835. c = y.length;
  1836. while (c--)(p = y[c]) && (l = i ? M.call(o, p) : f[c]) > -1 && (o[l] = !(a[l] = p))
  1837. }
  1838. } else y = mt(y === a ? y.splice(h, y.length) : y), i ? i(null, a, y, u) : H.apply(a, y)
  1839. })
  1840. }
  1841. function vt(e) {
  1842. var t, n, r, o = e.length, a = i.relative[e[0].type], s = a || i.relative[" "], u = a ? 1 : 0,
  1843. c = ht(function (e) {
  1844. return e === t
  1845. }, s, !0), p = ht(function (e) {
  1846. return M.call(t, e) > -1
  1847. }, s, !0), f = [function (e, n, r) {
  1848. return !a && (r || n !== l) || ((t = n).nodeType ? c(e, n, r) : p(e, n, r))
  1849. }];
  1850. for (; o > u; u++)if (n = i.relative[e[u].type]) f = [ht(gt(f), n)]; else {
  1851. if (n = i.filter[e[u].type].apply(null, e[u].matches), n[x]) {
  1852. for (r = ++u; o > r; r++)if (i.relative[e[r].type])break;
  1853. return yt(u > 1 && gt(f), u > 1 && dt(e.slice(0, u - 1)).replace(W, "$1"), n, r > u && vt(e.slice(u, r)), o > r && vt(e = e.slice(r)), o > r && dt(e))
  1854. }
  1855. f.push(n)
  1856. }
  1857. return gt(f)
  1858. }
  1859. function bt(e, t) {
  1860. var n = 0, o = t.length > 0, a = e.length > 0, s = function (s, u, c, f, d) {
  1861. var h, g, m, y = [], v = 0, b = "0", x = s && [], w = null != d, T = l,
  1862. C = s || a && i.find.TAG("*", d && u.parentNode || u),
  1863. k = N += null == T ? 1 : Math.random() || .1;
  1864. for (w && (l = u !== p && u, r = n); null != (h = C[b]); b++) {
  1865. if (a && h) {
  1866. g = 0;
  1867. while (m = e[g++])if (m(h, u, c)) {
  1868. f.push(h);
  1869. break
  1870. }
  1871. w && (N = k, r = ++n)
  1872. }
  1873. o && ((h = !m && h) && v--, s && x.push(h))
  1874. }
  1875. if (v += b, o && b !== v) {
  1876. g = 0;
  1877. while (m = t[g++])m(x, y, u, c);
  1878. if (s) {
  1879. if (v > 0)while (b--)x[b] || y[b] || (y[b] = L.call(f));
  1880. y = mt(y)
  1881. }
  1882. H.apply(f, y), w && !s && y.length > 0 && v + t.length > 1 && st.uniqueSort(f)
  1883. }
  1884. return w && (N = k, l = T), x
  1885. };
  1886. return o ? ot(s) : s
  1887. }
  1888. s = st.compile = function (e, t) {
  1889. var n, r = [], i = [], o = S[e + " "];
  1890. if (!o) {
  1891. t || (t = ft(e)), n = t.length;
  1892. while (n--)o = vt(t[n]), o[x] ? r.push(o) : i.push(o);
  1893. o = S(e, bt(i, r))
  1894. }
  1895. return o
  1896. };
  1897. function xt(e, t, n) {
  1898. var r = 0, i = t.length;
  1899. for (; i > r; r++)st(e, t[r], n);
  1900. return n
  1901. }
  1902. function wt(e, t, n, r) {
  1903. var o, a, u, l, c, p = ft(e);
  1904. if (!r && 1 === p.length) {
  1905. if (a = p[0] = p[0].slice(0), a.length > 2 && "ID" === (u = a[0]).type && 9 === t.nodeType && !d && i.relative[a[1].type]) {
  1906. if (t = i.find.ID(u.matches[0].replace(et, tt), t)[0], !t)return n;
  1907. e = e.slice(a.shift().value.length)
  1908. }
  1909. o = U.needsContext.test(e) ? 0 : a.length;
  1910. while (o--) {
  1911. if (u = a[o], i.relative[l = u.type])break;
  1912. if ((c = i.find[l]) && (r = c(u.matches[0].replace(et, tt), V.test(a[0].type) && t.parentNode || t))) {
  1913. if (a.splice(o, 1), e = r.length && dt(a), !e)return H.apply(n, q.call(r, 0)), n;
  1914. break
  1915. }
  1916. }
  1917. }
  1918. return s(e, p)(r, t, d, n, V.test(e)), n
  1919. }
  1920. i.pseudos.nth = i.pseudos.eq;
  1921. function Tt() {
  1922. }
  1923. i.filters = Tt.prototype = i.pseudos, i.setFilters = new Tt, c(), st.attr = b.attr, b.find = st, b.expr = st.selectors, b.expr[":"] = b.expr.pseudos, b.unique = st.uniqueSort, b.text = st.getText, b.isXMLDoc = st.isXML, b.contains = st.contains
  1924. }(e);
  1925. var at = /Until$/, st = /^(?:parents|prev(?:Until|All))/, ut = /^.[^:#\[\.,]*$/, lt = b.expr.match.needsContext,
  1926. ct = {children: !0, contents: !0, next: !0, prev: !0};
  1927. b.fn.extend({
  1928. find: function (e) {
  1929. var t, n, r, i = this.length;
  1930. if ("string" != typeof e)return r = this, this.pushStack(b(e).filter(function () {
  1931. for (t = 0; i > t; t++)if (b.contains(r[t], this))return !0
  1932. }));
  1933. for (n = [], t = 0; i > t; t++)b.find(e, this[t], n);
  1934. return n = this.pushStack(i > 1 ? b.unique(n) : n), n.selector = (this.selector ? this.selector + " " : "") + e, n
  1935. }, has: function (e) {
  1936. var t, n = b(e, this), r = n.length;
  1937. return this.filter(function () {
  1938. for (t = 0; r > t; t++)if (b.contains(this, n[t]))return !0
  1939. })
  1940. }, not: function (e) {
  1941. return this.pushStack(ft(this, e, !1))
  1942. }, filter: function (e) {
  1943. return this.pushStack(ft(this, e, !0))
  1944. }, is: function (e) {
  1945. return !!e && ("string" == typeof e ? lt.test(e) ? b(e, this.context).index(this[0]) >= 0 : b.filter(e, this).length > 0 : this.filter(e).length > 0)
  1946. }, closest: function (e, t) {
  1947. var n, r = 0, i = this.length, o = [],
  1948. a = lt.test(e) || "string" != typeof e ? b(e, t || this.context) : 0;
  1949. for (; i > r; r++) {
  1950. n = this[r];
  1951. while (n && n.ownerDocument && n !== t && 11 !== n.nodeType) {
  1952. if (a ? a.index(n) > -1 : b.find.matchesSelector(n, e)) {
  1953. o.push(n);
  1954. break
  1955. }
  1956. n = n.parentNode
  1957. }
  1958. }
  1959. return this.pushStack(o.length > 1 ? b.unique(o) : o)
  1960. }, index: function (e) {
  1961. return e ? "string" == typeof e ? b.inArray(this[0], b(e)) : b.inArray(e.jquery ? e[0] : e, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
  1962. }, add: function (e, t) {
  1963. var n = "string" == typeof e ? b(e, t) : b.makeArray(e && e.nodeType ? [e] : e),
  1964. r = b.merge(this.get(), n);
  1965. return this.pushStack(b.unique(r))
  1966. }, addBack: function (e) {
  1967. return this.add(null == e ? this.prevObject : this.prevObject.filter(e))
  1968. }
  1969. }), b.fn.andSelf = b.fn.addBack;
  1970. function pt(e, t) {
  1971. do e = e[t]; while (e && 1 !== e.nodeType);
  1972. return e
  1973. }
  1974. b.each({
  1975. parent: function (e) {
  1976. var t = e.parentNode;
  1977. return t && 11 !== t.nodeType ? t : null
  1978. }, parents: function (e) {
  1979. return b.dir(e, "parentNode")
  1980. }, parentsUntil: function (e, t, n) {
  1981. return b.dir(e, "parentNode", n)
  1982. }, next: function (e) {
  1983. return pt(e, "nextSibling")
  1984. }, prev: function (e) {
  1985. return pt(e, "previousSibling")
  1986. }, nextAll: function (e) {
  1987. return b.dir(e, "nextSibling")
  1988. }, prevAll: function (e) {
  1989. return b.dir(e, "previousSibling")
  1990. }, nextUntil: function (e, t, n) {
  1991. return b.dir(e, "nextSibling", n)
  1992. }, prevUntil: function (e, t, n) {
  1993. return b.dir(e, "previousSibling", n)
  1994. }, siblings: function (e) {
  1995. return b.sibling((e.parentNode || {}).firstChild, e)
  1996. }, children: function (e) {
  1997. return b.sibling(e.firstChild)
  1998. }, contents: function (e) {
  1999. return b.nodeName(e, "iframe") ? e.contentDocument || e.contentWindow.document : b.merge([], e.childNodes)
  2000. }
  2001. }, function (e, t) {
  2002. b.fn[e] = function (n, r) {
  2003. var i = b.map(this, t, n);
  2004. return at.test(e) || (r = n), r && "string" == typeof r && (i = b.filter(r, i)), i = this.length > 1 && !ct[e] ? b.unique(i) : i, this.length > 1 && st.test(e) && (i = i.reverse()), this.pushStack(i)
  2005. }
  2006. }), b.extend({
  2007. filter: function (e, t, n) {
  2008. return n && (e = ":not(" + e + ")"), 1 === t.length ? b.find.matchesSelector(t[0], e) ? [t[0]] : [] : b.find.matches(e, t)
  2009. }, dir: function (e, n, r) {
  2010. var i = [], o = e[n];
  2011. while (o && 9 !== o.nodeType && (r === t || 1 !== o.nodeType || !b(o).is(r)))1 === o.nodeType && i.push(o), o = o[n];
  2012. return i
  2013. }, sibling: function (e, t) {
  2014. var n = [];
  2015. for (; e; e = e.nextSibling)1 === e.nodeType && e !== t && n.push(e);
  2016. return n
  2017. }
  2018. });
  2019. function ft(e, t, n) {
  2020. if (t = t || 0, b.isFunction(t))return b.grep(e, function (e, r) {
  2021. var i = !!t.call(e, r, e);
  2022. return i === n
  2023. });
  2024. if (t.nodeType)return b.grep(e, function (e) {
  2025. return e === t === n
  2026. });
  2027. if ("string" == typeof t) {
  2028. var r = b.grep(e, function (e) {
  2029. return 1 === e.nodeType
  2030. });
  2031. if (ut.test(t))return b.filter(t, r, !n);
  2032. t = b.filter(t, r)
  2033. }
  2034. return b.grep(e, function (e) {
  2035. return b.inArray(e, t) >= 0 === n
  2036. })
  2037. }
  2038. function dt(e) {
  2039. var t = ht.split("|"), n = e.createDocumentFragment();
  2040. if (n.createElement)while (t.length)n.createElement(t.pop());
  2041. return n
  2042. }
  2043. var ht = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
  2044. gt = / jQuery\d+="(?:null|\d+)"/g, mt = RegExp("<(?:" + ht + ")[\\s/>]", "i"), yt = /^\s+/,
  2045. vt = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, bt = /<([\w:]+)/,
  2046. xt = /<tbody/i, wt = /<|&#?\w+;/, Tt = /<(?:script|style|link)/i, Nt = /^(?:checkbox|radio)$/i,
  2047. Ct = /checked\s*(?:[^=]|=\s*.checked.)/i, kt = /^$|\/(?:java|ecma)script/i, Et = /^true\/(.*)/,
  2048. St = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, At = {
  2049. option: [1, "<select multiple='multiple'>", "</select>"],
  2050. legend: [1, "<fieldset>", "</fieldset>"],
  2051. area: [1, "<map>", "</map>"],
  2052. param: [1, "<object>", "</object>"],
  2053. thead: [1, "<table>", "</table>"],
  2054. tr: [2, "<table><tbody>", "</tbody></table>"],
  2055. col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
  2056. td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
  2057. _default: b.support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"]
  2058. }, jt = dt(o), Dt = jt.appendChild(o.createElement("div"));
  2059. At.optgroup = At.option, At.tbody = At.tfoot = At.colgroup = At.caption = At.thead, At.th = At.td, b.fn.extend({
  2060. text: function (e) {
  2061. return b.access(this, function (e) {
  2062. return e === t ? b.text(this) : this.empty().append((this[0] && this[0].ownerDocument || o).createTextNode(e))
  2063. }, null, e, arguments.length)
  2064. }, wrapAll: function (e) {
  2065. if (b.isFunction(e))return this.each(function (t) {
  2066. b(this).wrapAll(e.call(this, t))
  2067. });
  2068. if (this[0]) {
  2069. var t = b(e, this[0].ownerDocument).eq(0).clone(!0);
  2070. this[0].parentNode && t.insertBefore(this[0]), t.map(function () {
  2071. var e = this;
  2072. while (e.firstChild && 1 === e.firstChild.nodeType)e = e.firstChild;
  2073. return e
  2074. }).append(this)
  2075. }
  2076. return this
  2077. }, wrapInner: function (e) {
  2078. return b.isFunction(e) ? this.each(function (t) {
  2079. b(this).wrapInner(e.call(this, t))
  2080. }) : this.each(function () {
  2081. var t = b(this), n = t.contents();
  2082. n.length ? n.wrapAll(e) : t.append(e)
  2083. })
  2084. }, wrap: function (e) {
  2085. var t = b.isFunction(e);
  2086. return this.each(function (n) {
  2087. b(this).wrapAll(t ? e.call(this, n) : e)
  2088. })
  2089. }, unwrap: function () {
  2090. return this.parent().each(function () {
  2091. b.nodeName(this, "body") || b(this).replaceWith(this.childNodes)
  2092. }).end()
  2093. }, append: function () {
  2094. return this.domManip(arguments, !0, function (e) {
  2095. (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.appendChild(e)
  2096. })
  2097. }, prepend: function () {
  2098. return this.domManip(arguments, !0, function (e) {
  2099. (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.insertBefore(e, this.firstChild)
  2100. })
  2101. }, before: function () {
  2102. return this.domManip(arguments, !1, function (e) {
  2103. this.parentNode && this.parentNode.insertBefore(e, this)
  2104. })
  2105. }, after: function () {
  2106. return this.domManip(arguments, !1, function (e) {
  2107. this.parentNode && this.parentNode.insertBefore(e, this.nextSibling)
  2108. })
  2109. }, remove: function (e, t) {
  2110. var n, r = 0;
  2111. for (; null != (n = this[r]); r++)(!e || b.filter(e, [n]).length > 0) && (t || 1 !== n.nodeType || b.cleanData(Ot(n)), n.parentNode && (t && b.contains(n.ownerDocument, n) && Mt(Ot(n, "script")), n.parentNode.removeChild(n)));
  2112. return this
  2113. }, empty: function () {
  2114. var e, t = 0;
  2115. for (; null != (e = this[t]); t++) {
  2116. 1 === e.nodeType && b.cleanData(Ot(e, !1));
  2117. while (e.firstChild)e.removeChild(e.firstChild);
  2118. e.options && b.nodeName(e, "select") && (e.options.length = 0)
  2119. }
  2120. return this
  2121. }, clone: function (e, t) {
  2122. return e = null == e ? !1 : e, t = null == t ? e : t, this.map(function () {
  2123. return b.clone(this, e, t)
  2124. })
  2125. }, html: function (e) {
  2126. return b.access(this, function (e) {
  2127. var n = this[0] || {}, r = 0, i = this.length;
  2128. if (e === t)return 1 === n.nodeType ? n.innerHTML.replace(gt, "") : t;
  2129. if (!("string" != typeof e || Tt.test(e) || !b.support.htmlSerialize && mt.test(e) || !b.support.leadingWhitespace && yt.test(e) || At[(bt.exec(e) || ["", ""])[1].toLowerCase()])) {
  2130. e = e.replace(vt, "<$1></$2>");
  2131. try {
  2132. for (; i > r; r++)n = this[r] || {}, 1 === n.nodeType && (b.cleanData(Ot(n, !1)), n.innerHTML = e);
  2133. n = 0
  2134. } catch (o) {
  2135. }
  2136. }
  2137. n && this.empty().append(e)
  2138. }, null, e, arguments.length)
  2139. }, replaceWith: function (e) {
  2140. var t = b.isFunction(e);
  2141. return t || "string" == typeof e || (e = b(e).not(this).detach()), this.domManip([e], !0, function (e) {
  2142. var t = this.nextSibling, n = this.parentNode;
  2143. n && (b(this).remove(), n.insertBefore(e, t))
  2144. })
  2145. }, detach: function (e) {
  2146. return this.remove(e, !0)
  2147. }, domManip: function (e, n, r) {
  2148. e = f.apply([], e);
  2149. var i, o, a, s, u, l, c = 0, p = this.length, d = this, h = p - 1, g = e[0], m = b.isFunction(g);
  2150. if (m || !(1 >= p || "string" != typeof g || b.support.checkClone) && Ct.test(g))return this.each(function (i) {
  2151. var o = d.eq(i);
  2152. m && (e[0] = g.call(this, i, n ? o.html() : t)), o.domManip(e, n, r)
  2153. });
  2154. if (p && (l = b.buildFragment(e, this[0].ownerDocument, !1, this), i = l.firstChild, 1 === l.childNodes.length && (l = i), i)) {
  2155. for (n = n && b.nodeName(i, "tr"), s = b.map(Ot(l, "script"), Ht), a = s.length; p > c; c++)o = l, c !== h && (o = b.clone(o, !0, !0), a && b.merge(s, Ot(o, "script"))), r.call(n && b.nodeName(this[c], "table") ? Lt(this[c], "tbody") : this[c], o, c);
  2156. if (a)for (u = s[s.length - 1].ownerDocument, b.map(s, qt), c = 0; a > c; c++)o = s[c], kt.test(o.type || "") && !b._data(o, "globalEval") && b.contains(u, o) && (o.src ? b.ajax({
  2157. url: o.src,
  2158. type: "GET",
  2159. dataType: "script",
  2160. async: !1,
  2161. global: !1,
  2162. "throws": !0
  2163. }) : b.globalEval((o.text || o.textContent || o.innerHTML || "").replace(St, "")));
  2164. l = i = null
  2165. }
  2166. return this
  2167. }
  2168. });
  2169. function Lt(e, t) {
  2170. return e.getElementsByTagName(t)[0] || e.appendChild(e.ownerDocument.createElement(t))
  2171. }
  2172. function Ht(e) {
  2173. var t = e.getAttributeNode("type");
  2174. return e.type = (t && t.specified) + "/" + e.type, e
  2175. }
  2176. function qt(e) {
  2177. var t = Et.exec(e.type);
  2178. return t ? e.type = t[1] : e.removeAttribute("type"), e
  2179. }
  2180. function Mt(e, t) {
  2181. var n, r = 0;
  2182. for (; null != (n = e[r]); r++)b._data(n, "globalEval", !t || b._data(t[r], "globalEval"))
  2183. }
  2184. function _t(e, t) {
  2185. if (1 === t.nodeType && b.hasData(e)) {
  2186. var n, r, i, o = b._data(e), a = b._data(t, o), s = o.events;
  2187. if (s) {
  2188. delete a.handle, a.events = {};
  2189. for (n in s)for (r = 0, i = s[n].length; i > r; r++)b.event.add(t, n, s[n][r])
  2190. }
  2191. a.data && (a.data = b.extend({}, a.data))
  2192. }
  2193. }
  2194. function Ft(e, t) {
  2195. var n, r, i;
  2196. if (1 === t.nodeType) {
  2197. if (n = t.nodeName.toLowerCase(), !b.support.noCloneEvent && t[b.expando]) {
  2198. i = b._data(t);
  2199. for (r in i.events)b.removeEvent(t, r, i.handle);
  2200. t.removeAttribute(b.expando)
  2201. }
  2202. "script" === n && t.text !== e.text ? (Ht(t).text = e.text, qt(t)) : "object" === n ? (t.parentNode && (t.outerHTML = e.outerHTML), b.support.html5Clone && e.innerHTML && !b.trim(t.innerHTML) && (t.innerHTML = e.innerHTML)) : "input" === n && Nt.test(e.type) ? (t.defaultChecked = t.checked = e.checked, t.value !== e.value && (t.value = e.value)) : "option" === n ? t.defaultSelected = t.selected = e.defaultSelected : ("input" === n || "textarea" === n) && (t.defaultValue = e.defaultValue)
  2203. }
  2204. }
  2205. b.each({
  2206. appendTo: "append",
  2207. prependTo: "prepend",
  2208. insertBefore: "before",
  2209. insertAfter: "after",
  2210. replaceAll: "replaceWith"
  2211. }, function (e, t) {
  2212. b.fn[e] = function (e) {
  2213. var n, r = 0, i = [], o = b(e), a = o.length - 1;
  2214. for (; a >= r; r++)n = r === a ? this : this.clone(!0), b(o[r])[t](n), d.apply(i, n.get());
  2215. return this.pushStack(i)
  2216. }
  2217. });
  2218. function Ot(e, n) {
  2219. var r, o, a = 0,
  2220. s = typeof e.getElementsByTagName !== i ? e.getElementsByTagName(n || "*") : typeof e.querySelectorAll !== i ? e.querySelectorAll(n || "*") : t;
  2221. if (!s)for (s = [], r = e.childNodes || e; null != (o = r[a]); a++)!n || b.nodeName(o, n) ? s.push(o) : b.merge(s, Ot(o, n));
  2222. return n === t || n && b.nodeName(e, n) ? b.merge([e], s) : s
  2223. }
  2224. function Bt(e) {
  2225. Nt.test(e.type) && (e.defaultChecked = e.checked)
  2226. }
  2227. b.extend({
  2228. clone: function (e, t, n) {
  2229. var r, i, o, a, s, u = b.contains(e.ownerDocument, e);
  2230. if (b.support.html5Clone || b.isXMLDoc(e) || !mt.test("<" + e.nodeName + ">") ? o = e.cloneNode(!0) : (Dt.innerHTML = e.outerHTML, Dt.removeChild(o = Dt.firstChild)), !(b.support.noCloneEvent && b.support.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || b.isXMLDoc(e)))for (r = Ot(o), s = Ot(e), a = 0; null != (i = s[a]); ++a)r[a] && Ft(i, r[a]);
  2231. if (t)if (n)for (s = s || Ot(e), r = r || Ot(o), a = 0; null != (i = s[a]); a++)_t(i, r[a]); else _t(e, o);
  2232. return r = Ot(o, "script"), r.length > 0 && Mt(r, !u && Ot(e, "script")), r = s = i = null, o
  2233. }, buildFragment: function (e, t, n, r) {
  2234. var i, o, a, s, u, l, c, p = e.length, f = dt(t), d = [], h = 0;
  2235. for (; p > h; h++)if (o = e[h], o || 0 === o)if ("object" === b.type(o)) b.merge(d, o.nodeType ? [o] : o); else if (wt.test(o)) {
  2236. s = s || f.appendChild(t.createElement("div")), u = (bt.exec(o) || ["", ""])[1].toLowerCase(), c = At[u] || At._default, s.innerHTML = c[1] + o.replace(vt, "<$1></$2>") + c[2], i = c[0];
  2237. while (i--)s = s.lastChild;
  2238. if (!b.support.leadingWhitespace && yt.test(o) && d.push(t.createTextNode(yt.exec(o)[0])), !b.support.tbody) {
  2239. o = "table" !== u || xt.test(o) ? "<table>" !== c[1] || xt.test(o) ? 0 : s : s.firstChild, i = o && o.childNodes.length;
  2240. while (i--)b.nodeName(l = o.childNodes[i], "tbody") && !l.childNodes.length && o.removeChild(l)
  2241. }
  2242. b.merge(d, s.childNodes), s.textContent = "";
  2243. while (s.firstChild)s.removeChild(s.firstChild);
  2244. s = f.lastChild
  2245. } else d.push(t.createTextNode(o));
  2246. s && f.removeChild(s), b.support.appendChecked || b.grep(Ot(d, "input"), Bt), h = 0;
  2247. while (o = d[h++])if ((!r || -1 === b.inArray(o, r)) && (a = b.contains(o.ownerDocument, o), s = Ot(f.appendChild(o), "script"), a && Mt(s), n)) {
  2248. i = 0;
  2249. while (o = s[i++])kt.test(o.type || "") && n.push(o)
  2250. }
  2251. return s = null, f
  2252. }, cleanData: function (e, t) {
  2253. var n, r, o, a, s = 0, u = b.expando, l = b.cache, p = b.support.deleteExpando, f = b.event.special;
  2254. for (; null != (n = e[s]); s++)if ((t || b.acceptData(n)) && (o = n[u], a = o && l[o])) {
  2255. if (a.events)for (r in a.events)f[r] ? b.event.remove(n, r) : b.removeEvent(n, r, a.handle);
  2256. l[o] && (delete l[o], p ? delete n[u] : typeof n.removeAttribute !== i ? n.removeAttribute(u) : n[u] = null, c.push(o))
  2257. }
  2258. }
  2259. });
  2260. var Pt, Rt, Wt, $t = /alpha\([^)]*\)/i, It = /opacity\s*=\s*([^)]*)/, zt = /^(top|right|bottom|left)$/,
  2261. Xt = /^(none|table(?!-c[ea]).+)/, Ut = /^margin/, Vt = RegExp("^(" + x + ")(.*)$", "i"),
  2262. Yt = RegExp("^(" + x + ")(?!px)[a-z%]+$", "i"), Jt = RegExp("^([+-])=(" + x + ")", "i"),
  2263. Gt = {BODY: "block"}, Qt = {position: "absolute", visibility: "hidden", display: "block"},
  2264. Kt = {letterSpacing: 0, fontWeight: 400}, Zt = ["Top", "Right", "Bottom", "Left"],
  2265. en = ["Webkit", "O", "Moz", "ms"];
  2266. function tn(e, t) {
  2267. if (t in e)return t;
  2268. var n = t.charAt(0).toUpperCase() + t.slice(1), r = t, i = en.length;
  2269. while (i--)if (t = en[i] + n, t in e)return t;
  2270. return r
  2271. }
  2272. function nn(e, t) {
  2273. return e = t || e, "none" === b.css(e, "display") || !b.contains(e.ownerDocument, e)
  2274. }
  2275. function rn(e, t) {
  2276. var n, r, i, o = [], a = 0, s = e.length;
  2277. for (; s > a; a++)r = e[a], r.style && (o[a] = b._data(r, "olddisplay"), n = r.style.display, t ? (o[a] || "none" !== n || (r.style.display = ""), "" === r.style.display && nn(r) && (o[a] = b._data(r, "olddisplay", un(r.nodeName)))) : o[a] || (i = nn(r), (n && "none" !== n || !i) && b._data(r, "olddisplay", i ? n : b.css(r, "display"))));
  2278. for (a = 0; s > a; a++)r = e[a], r.style && (t && "none" !== r.style.display && "" !== r.style.display || (r.style.display = t ? o[a] || "" : "none"));
  2279. return e
  2280. }
  2281. b.fn.extend({
  2282. css: function (e, n) {
  2283. return b.access(this, function (e, n, r) {
  2284. var i, o, a = {}, s = 0;
  2285. if (b.isArray(n)) {
  2286. for (o = Rt(e), i = n.length; i > s; s++)a[n[s]] = b.css(e, n[s], !1, o);
  2287. return a
  2288. }
  2289. return r !== t ? b.style(e, n, r) : b.css(e, n)
  2290. }, e, n, arguments.length > 1)
  2291. }, show: function () {
  2292. return rn(this, !0)
  2293. }, hide: function () {
  2294. return rn(this)
  2295. }, toggle: function (e) {
  2296. var t = "boolean" == typeof e;
  2297. return this.each(function () {
  2298. (t ? e : nn(this)) ? b(this).show() : b(this).hide()
  2299. })
  2300. }
  2301. }), b.extend({
  2302. cssHooks: {
  2303. opacity: {
  2304. get: function (e, t) {
  2305. if (t) {
  2306. var n = Wt(e, "opacity");
  2307. return "" === n ? "1" : n
  2308. }
  2309. }
  2310. }
  2311. },
  2312. cssNumber: {
  2313. columnCount: !0,
  2314. fillOpacity: !0,
  2315. fontWeight: !0,
  2316. lineHeight: !0,
  2317. opacity: !0,
  2318. orphans: !0,
  2319. widows: !0,
  2320. zIndex: !0,
  2321. zoom: !0
  2322. },
  2323. cssProps: {"float": b.support.cssFloat ? "cssFloat" : "styleFloat"},
  2324. style: function (e, n, r, i) {
  2325. if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) {
  2326. var o, a, s, u = b.camelCase(n), l = e.style;
  2327. if (n = b.cssProps[u] || (b.cssProps[u] = tn(l, u)), s = b.cssHooks[n] || b.cssHooks[u], r === t)return s && "get" in s && (o = s.get(e, !1, i)) !== t ? o : l[n];
  2328. if (a = typeof r, "string" === a && (o = Jt.exec(r)) && (r = (o[1] + 1) * o[2] + parseFloat(b.css(e, n)), a = "number"), !(null == r || "number" === a && isNaN(r) || ("number" !== a || b.cssNumber[u] || (r += "px"), b.support.clearCloneStyle || "" !== r || 0 !== n.indexOf("background") || (l[n] = "inherit"), s && "set" in s && (r = s.set(e, r, i)) === t)))try {
  2329. l[n] = r
  2330. } catch (c) {
  2331. }
  2332. }
  2333. },
  2334. css: function (e, n, r, i) {
  2335. var o, a, s, u = b.camelCase(n);
  2336. return n = b.cssProps[u] || (b.cssProps[u] = tn(e.style, u)), s = b.cssHooks[n] || b.cssHooks[u], s && "get" in s && (a = s.get(e, !0, r)), a === t && (a = Wt(e, n, i)), "normal" === a && n in Kt && (a = Kt[n]), "" === r || r ? (o = parseFloat(a), r === !0 || b.isNumeric(o) ? o || 0 : a) : a
  2337. },
  2338. swap: function (e, t, n, r) {
  2339. var i, o, a = {};
  2340. for (o in t)a[o] = e.style[o], e.style[o] = t[o];
  2341. i = n.apply(e, r || []);
  2342. for (o in t)e.style[o] = a[o];
  2343. return i
  2344. }
  2345. }), e.getComputedStyle ? (Rt = function (t) {
  2346. return e.getComputedStyle(t, null)
  2347. }, Wt = function (e, n, r) {
  2348. var i, o, a, s = r || Rt(e), u = s ? s.getPropertyValue(n) || s[n] : t, l = e.style;
  2349. return s && ("" !== u || b.contains(e.ownerDocument, e) || (u = b.style(e, n)), Yt.test(u) && Ut.test(n) && (i = l.width, o = l.minWidth, a = l.maxWidth, l.minWidth = l.maxWidth = l.width = u, u = s.width, l.width = i, l.minWidth = o, l.maxWidth = a)), u
  2350. }) : o.documentElement.currentStyle && (Rt = function (e) {
  2351. return e.currentStyle
  2352. }, Wt = function (e, n, r) {
  2353. var i, o, a, s = r || Rt(e), u = s ? s[n] : t, l = e.style;
  2354. return null == u && l && l[n] && (u = l[n]), Yt.test(u) && !zt.test(n) && (i = l.left, o = e.runtimeStyle, a = o && o.left, a && (o.left = e.currentStyle.left), l.left = "fontSize" === n ? "1em" : u, u = l.pixelLeft + "px", l.left = i, a && (o.left = a)), "" === u ? "auto" : u
  2355. });
  2356. function on(e, t, n) {
  2357. var r = Vt.exec(t);
  2358. return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t
  2359. }
  2360. function an(e, t, n, r, i) {
  2361. var o = n === (r ? "border" : "content") ? 4 : "width" === t ? 1 : 0, a = 0;
  2362. for (; 4 > o; o += 2)"margin" === n && (a += b.css(e, n + Zt[o], !0, i)), r ? ("content" === n && (a -= b.css(e, "padding" + Zt[o], !0, i)), "margin" !== n && (a -= b.css(e, "border" + Zt[o] + "Width", !0, i))) : (a += b.css(e, "padding" + Zt[o], !0, i), "padding" !== n && (a += b.css(e, "border" + Zt[o] + "Width", !0, i)));
  2363. return a
  2364. }
  2365. function sn(e, t, n) {
  2366. var r = !0, i = "width" === t ? e.offsetWidth : e.offsetHeight, o = Rt(e),
  2367. a = b.support.boxSizing && "border-box" === b.css(e, "boxSizing", !1, o);
  2368. if (0 >= i || null == i) {
  2369. if (i = Wt(e, t, o), (0 > i || null == i) && (i = e.style[t]), Yt.test(i))return i;
  2370. r = a && (b.support.boxSizingReliable || i === e.style[t]), i = parseFloat(i) || 0
  2371. }
  2372. return i + an(e, t, n || (a ? "border" : "content"), r, o) + "px"
  2373. }
  2374. function un(e) {
  2375. var t = o, n = Gt[e];
  2376. return n || (n = ln(e, t), "none" !== n && n || (Pt = (Pt || b("<iframe frameborder='0' width='0' height='0'/>").css("cssText", "display:block !important")).appendTo(t.documentElement), t = (Pt[0].contentWindow || Pt[0].contentDocument).document, t.write("<!doctype html><html><body>"), t.close(), n = ln(e, t), Pt.detach()), Gt[e] = n), n
  2377. }
  2378. function ln(e, t) {
  2379. var n = b(t.createElement(e)).appendTo(t.body), r = b.css(n[0], "display");
  2380. return n.remove(), r
  2381. }
  2382. b.each(["height", "width"], function (e, n) {
  2383. b.cssHooks[n] = {
  2384. get: function (e, r, i) {
  2385. return r ? 0 === e.offsetWidth && Xt.test(b.css(e, "display")) ? b.swap(e, Qt, function () {
  2386. return sn(e, n, i)
  2387. }) : sn(e, n, i) : t
  2388. }, set: function (e, t, r) {
  2389. var i = r && Rt(e);
  2390. return on(e, t, r ? an(e, n, r, b.support.boxSizing && "border-box" === b.css(e, "boxSizing", !1, i), i) : 0)
  2391. }
  2392. }
  2393. }), b.support.opacity || (b.cssHooks.opacity = {
  2394. get: function (e, t) {
  2395. return It.test((t && e.currentStyle ? e.currentStyle.filter : e.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : t ? "1" : ""
  2396. }, set: function (e, t) {
  2397. var n = e.style, r = e.currentStyle, i = b.isNumeric(t) ? "alpha(opacity=" + 100 * t + ")" : "",
  2398. o = r && r.filter || n.filter || "";
  2399. n.zoom = 1, (t >= 1 || "" === t) && "" === b.trim(o.replace($t, "")) && n.removeAttribute && (n.removeAttribute("filter"), "" === t || r && !r.filter) || (n.filter = $t.test(o) ? o.replace($t, i) : o + " " + i)
  2400. }
  2401. }), b(function () {
  2402. b.support.reliableMarginRight || (b.cssHooks.marginRight = {
  2403. get: function (e, n) {
  2404. return n ? b.swap(e, {display: "inline-block"}, Wt, [e, "marginRight"]) : t
  2405. }
  2406. }), !b.support.pixelPosition && b.fn.position && b.each(["top", "left"], function (e, n) {
  2407. b.cssHooks[n] = {
  2408. get: function (e, r) {
  2409. return r ? (r = Wt(e, n), Yt.test(r) ? b(e).position()[n] + "px" : r) : t
  2410. }
  2411. }
  2412. })
  2413. }), b.expr && b.expr.filters && (b.expr.filters.hidden = function (e) {
  2414. return 0 >= e.offsetWidth && 0 >= e.offsetHeight || !b.support.reliableHiddenOffsets && "none" === (e.style && e.style.display || b.css(e, "display"))
  2415. }, b.expr.filters.visible = function (e) {
  2416. return !b.expr.filters.hidden(e)
  2417. }), b.each({margin: "", padding: "", border: "Width"}, function (e, t) {
  2418. b.cssHooks[e + t] = {
  2419. expand: function (n) {
  2420. var r = 0, i = {}, o = "string" == typeof n ? n.split(" ") : [n];
  2421. for (; 4 > r; r++)i[e + Zt[r] + t] = o[r] || o[r - 2] || o[0];
  2422. return i
  2423. }
  2424. }, Ut.test(e) || (b.cssHooks[e + t].set = on)
  2425. });
  2426. var cn = /%20/g, pn = /\[\]$/, fn = /\r?\n/g, dn = /^(?:submit|button|image|reset|file)$/i,
  2427. hn = /^(?:input|select|textarea|keygen)/i;
  2428. b.fn.extend({
  2429. serialize: function () {
  2430. return b.param(this.serializeArray())
  2431. }, serializeArray: function () {
  2432. return this.map(function () {
  2433. var e = b.prop(this, "elements");
  2434. return e ? b.makeArray(e) : this
  2435. }).filter(function () {
  2436. var e = this.type;
  2437. return this.name && !b(this).is(":disabled") && hn.test(this.nodeName) && !dn.test(e) && (this.checked || !Nt.test(e))
  2438. }).map(function (e, t) {
  2439. var n = b(this).val();
  2440. return null == n ? null : b.isArray(n) ? b.map(n, function (e) {
  2441. return {name: t.name, value: e.replace(fn, "\r\n")}
  2442. }) : {name: t.name, value: n.replace(fn, "\r\n")}
  2443. }).get()
  2444. }
  2445. }), b.param = function (e, n) {
  2446. var r, i = [], o = function (e, t) {
  2447. t = b.isFunction(t) ? t() : null == t ? "" : t, i[i.length] = encodeURIComponent(e) + "=" + encodeURIComponent(t)
  2448. };
  2449. if (n === t && (n = b.ajaxSettings && b.ajaxSettings.traditional), b.isArray(e) || e.jquery && !b.isPlainObject(e)) b.each(e, function () {
  2450. o(this.name, this.value)
  2451. }); else for (r in e)gn(r, e[r], n, o);
  2452. return i.join("&").replace(cn, "+")
  2453. };
  2454. function gn(e, t, n, r) {
  2455. var i;
  2456. if (b.isArray(t)) b.each(t, function (t, i) {
  2457. n || pn.test(e) ? r(e, i) : gn(e + "[" + ("object" == typeof i ? t : "") + "]", i, n, r)
  2458. }); else if (n || "object" !== b.type(t)) r(e, t); else for (i in t)gn(e + "[" + i + "]", t[i], n, r)
  2459. }
  2460. b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function (e, t) {
  2461. b.fn[t] = function (e, n) {
  2462. return arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t)
  2463. }
  2464. }), b.fn.hover = function (e, t) {
  2465. return this.mouseenter(e).mouseleave(t || e)
  2466. };
  2467. var mn, yn, vn = b.now(), bn = /\?/, xn = /#.*$/, wn = /([?&])_=[^&]*/, Tn = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm,
  2468. Nn = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, Cn = /^(?:GET|HEAD)$/, kn = /^\/\//,
  2469. En = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, Sn = b.fn.load, An = {}, jn = {}, Dn = "*/".concat("*");
  2470. try {
  2471. yn = a.href
  2472. } catch (Ln) {
  2473. yn = o.createElement("a"), yn.href = "", yn = yn.href
  2474. }
  2475. mn = En.exec(yn.toLowerCase()) || [];
  2476. function Hn(e) {
  2477. return function (t, n) {
  2478. "string" != typeof t && (n = t, t = "*");
  2479. var r, i = 0, o = t.toLowerCase().match(w) || [];
  2480. if (b.isFunction(n))while (r = o[i++])"+" === r[0] ? (r = r.slice(1) || "*", (e[r] = e[r] || []).unshift(n)) : (e[r] = e[r] || []).push(n)
  2481. }
  2482. }
  2483. function qn(e, n, r, i) {
  2484. var o = {}, a = e === jn;
  2485. function s(u) {
  2486. var l;
  2487. return o[u] = !0, b.each(e[u] || [], function (e, u) {
  2488. var c = u(n, r, i);
  2489. return "string" != typeof c || a || o[c] ? a ? !(l = c) : t : (n.dataTypes.unshift(c), s(c), !1)
  2490. }), l
  2491. }
  2492. return s(n.dataTypes[0]) || !o["*"] && s("*")
  2493. }
  2494. function Mn(e, n) {
  2495. var r, i, o = b.ajaxSettings.flatOptions || {};
  2496. for (i in n)n[i] !== t && ((o[i] ? e : r || (r = {}))[i] = n[i]);
  2497. return r && b.extend(!0, e, r), e
  2498. }
  2499. b.fn.load = function (e, n, r) {
  2500. if ("string" != typeof e && Sn)return Sn.apply(this, arguments);
  2501. var i, o, a, s = this, u = e.indexOf(" ");
  2502. return u >= 0 && (i = e.slice(u, e.length), e = e.slice(0, u)), b.isFunction(n) ? (r = n, n = t) : n && "object" == typeof n && (a = "POST"), s.length > 0 && b.ajax({
  2503. url: e,
  2504. type: a,
  2505. dataType: "html",
  2506. data: n
  2507. }).done(function (e) {
  2508. o = arguments, s.html(i ? b("<div>").append(b.parseHTML(e)).find(i) : e)
  2509. }).complete(r && function (e, t) {
  2510. s.each(r, o || [e.responseText, t, e])
  2511. }), this
  2512. }, b.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (e, t) {
  2513. b.fn[t] = function (e) {
  2514. return this.on(t, e)
  2515. }
  2516. }), b.each(["get", "post"], function (e, n) {
  2517. b[n] = function (e, r, i, o) {
  2518. return b.isFunction(r) && (o = o || i, i = r, r = t), b.ajax({
  2519. url: e,
  2520. type: n,
  2521. dataType: o,
  2522. data: r,
  2523. success: i
  2524. })
  2525. }
  2526. }), b.extend({
  2527. active: 0,
  2528. lastModified: {},
  2529. etag: {},
  2530. ajaxSettings: {
  2531. url: yn,
  2532. type: "GET",
  2533. isLocal: Nn.test(mn[1]),
  2534. global: !0,
  2535. processData: !0,
  2536. async: !0,
  2537. contentType: "application/x-www-form-urlencoded; charset=UTF-8",
  2538. accepts: {
  2539. "*": Dn,
  2540. text: "text/plain",
  2541. html: "text/html",
  2542. xml: "application/xml, text/xml",
  2543. json: "application/json, text/javascript"
  2544. },
  2545. contents: {xml: /xml/, html: /html/, json: /json/},
  2546. responseFields: {xml: "responseXML", text: "responseText"},
  2547. converters: {"* text": e.String, "text html": !0, "text json": b.parseJSON, "text xml": b.parseXML},
  2548. flatOptions: {url: !0, context: !0}
  2549. },
  2550. ajaxSetup: function (e, t) {
  2551. return t ? Mn(Mn(e, b.ajaxSettings), t) : Mn(b.ajaxSettings, e)
  2552. },
  2553. ajaxPrefilter: Hn(An),
  2554. ajaxTransport: Hn(jn),
  2555. ajax: function (e, n) {
  2556. "object" == typeof e && (n = e, e = t), n = n || {};
  2557. var r, i, o, a, s, u, l, c, p = b.ajaxSetup({}, n), f = p.context || p,
  2558. d = p.context && (f.nodeType || f.jquery) ? b(f) : b.event, h = b.Deferred(),
  2559. g = b.Callbacks("once memory"), m = p.statusCode || {}, y = {}, v = {}, x = 0, T = "canceled", N = {
  2560. readyState: 0, getResponseHeader: function (e) {
  2561. var t;
  2562. if (2 === x) {
  2563. if (!c) {
  2564. c = {};
  2565. while (t = Tn.exec(a))c[t[1].toLowerCase()] = t[2]
  2566. }
  2567. t = c[e.toLowerCase()]
  2568. }
  2569. return null == t ? null : t
  2570. }, getAllResponseHeaders: function () {
  2571. return 2 === x ? a : null
  2572. }, setRequestHeader: function (e, t) {
  2573. var n = e.toLowerCase();
  2574. return x || (e = v[n] = v[n] || e, y[e] = t), this
  2575. }, overrideMimeType: function (e) {
  2576. return x || (p.mimeType = e), this
  2577. }, statusCode: function (e) {
  2578. var t;
  2579. if (e)if (2 > x)for (t in e)m[t] = [m[t], e[t]]; else N.always(e[N.status]);
  2580. return this
  2581. }, abort: function (e) {
  2582. var t = e || T;
  2583. return l && l.abort(t), k(0, t), this
  2584. }
  2585. };
  2586. if (h.promise(N).complete = g.add, N.success = N.done, N.error = N.fail, p.url = ((e || p.url || yn) + "").replace(xn, "").replace(kn, mn[1] + "//"), p.type = n.method || n.type || p.method || p.type, p.dataTypes = b.trim(p.dataType || "*").toLowerCase().match(w) || [""], null == p.crossDomain && (r = En.exec(p.url.toLowerCase()), p.crossDomain = !(!r || r[1] === mn[1] && r[2] === mn[2] && (r[3] || ("http:" === r[1] ? 80 : 443)) == (mn[3] || ("http:" === mn[1] ? 80 : 443)))), p.data && p.processData && "string" != typeof p.data && (p.data = b.param(p.data, p.traditional)), qn(An, p, n, N), 2 === x)return N;
  2587. u = p.global, u && 0 === b.active++ && b.event.trigger("ajaxStart"), p.type = p.type.toUpperCase(), p.hasContent = !Cn.test(p.type), o = p.url, p.hasContent || (p.data && (o = p.url += (bn.test(o) ? "&" : "?") + p.data, delete p.data), p.cache === !1 && (p.url = wn.test(o) ? o.replace(wn, "$1_=" + vn++) : o + (bn.test(o) ? "&" : "?") + "_=" + vn++)), p.ifModified && (b.lastModified[o] && N.setRequestHeader("If-Modified-Since", b.lastModified[o]), b.etag[o] && N.setRequestHeader("If-None-Match", b.etag[o])), (p.data && p.hasContent && p.contentType !== !1 || n.contentType) && N.setRequestHeader("Content-Type", p.contentType), N.setRequestHeader("Accept", p.dataTypes[0] && p.accepts[p.dataTypes[0]] ? p.accepts[p.dataTypes[0]] + ("*" !== p.dataTypes[0] ? ", " + Dn + "; q=0.01" : "") : p.accepts["*"]);
  2588. for (i in p.headers)N.setRequestHeader(i, p.headers[i]);
  2589. if (p.beforeSend && (p.beforeSend.call(f, N, p) === !1 || 2 === x))return N.abort();
  2590. T = "abort";
  2591. for (i in{success: 1, error: 1, complete: 1})N[i](p[i]);
  2592. if (l = qn(jn, p, n, N)) {
  2593. N.readyState = 1, u && d.trigger("ajaxSend", [N, p]), p.async && p.timeout > 0 && (s = setTimeout(function () {
  2594. N.abort("timeout")
  2595. }, p.timeout));
  2596. try {
  2597. x = 1, l.send(y, k)
  2598. } catch (C) {
  2599. if (!(2 > x))throw C;
  2600. k(-1, C)
  2601. }
  2602. } else k(-1, "No Transport");
  2603. function k(e, n, r, i) {
  2604. var c, y, v, w, T, C = n;
  2605. 2 !== x && (x = 2, s && clearTimeout(s), l = t, a = i || "", N.readyState = e > 0 ? 4 : 0, r && (w = _n(p, N, r)), e >= 200 && 300 > e || 304 === e ? (p.ifModified && (T = N.getResponseHeader("Last-Modified"), T && (b.lastModified[o] = T), T = N.getResponseHeader("etag"), T && (b.etag[o] = T)), 204 === e ? (c = !0, C = "nocontent") : 304 === e ? (c = !0, C = "notmodified") : (c = Fn(p, w), C = c.state, y = c.data, v = c.error, c = !v)) : (v = C, (e || !C) && (C = "error", 0 > e && (e = 0))), N.status = e, N.statusText = (n || C) + "", c ? h.resolveWith(f, [y, C, N]) : h.rejectWith(f, [N, C, v]), N.statusCode(m), m = t, u && d.trigger(c ? "ajaxSuccess" : "ajaxError", [N, p, c ? y : v]), g.fireWith(f, [N, C]), u && (d.trigger("ajaxComplete", [N, p]), --b.active || b.event.trigger("ajaxStop")))
  2606. }
  2607. return N
  2608. },
  2609. getScript: function (e, n) {
  2610. return b.get(e, t, n, "script")
  2611. },
  2612. getJSON: function (e, t, n) {
  2613. return b.get(e, t, n, "json")
  2614. }
  2615. });
  2616. function _n(e, n, r) {
  2617. var i, o, a, s, u = e.contents, l = e.dataTypes, c = e.responseFields;
  2618. for (s in c)s in r && (n[c[s]] = r[s]);
  2619. while ("*" === l[0])l.shift(), o === t && (o = e.mimeType || n.getResponseHeader("Content-Type"));
  2620. if (o)for (s in u)if (u[s] && u[s].test(o)) {
  2621. l.unshift(s);
  2622. break
  2623. }
  2624. if (l[0] in r) a = l[0]; else {
  2625. for (s in r) {
  2626. if (!l[0] || e.converters[s + " " + l[0]]) {
  2627. a = s;
  2628. break
  2629. }
  2630. i || (i = s)
  2631. }
  2632. a = a || i
  2633. }
  2634. return a ? (a !== l[0] && l.unshift(a), r[a]) : t
  2635. }
  2636. function Fn(e, t) {
  2637. var n, r, i, o, a = {}, s = 0, u = e.dataTypes.slice(), l = u[0];
  2638. if (e.dataFilter && (t = e.dataFilter(t, e.dataType)), u[1])for (i in e.converters)a[i.toLowerCase()] = e.converters[i];
  2639. for (; r = u[++s];)if ("*" !== r) {
  2640. if ("*" !== l && l !== r) {
  2641. if (i = a[l + " " + r] || a["* " + r], !i)for (n in a)if (o = n.split(" "), o[1] === r && (i = a[l + " " + o[0]] || a["* " + o[0]])) {
  2642. i === !0 ? i = a[n] : a[n] !== !0 && (r = o[0], u.splice(s--, 0, r));
  2643. break
  2644. }
  2645. if (i !== !0)if (i && e["throws"]) t = i(t); else try {
  2646. t = i(t)
  2647. } catch (c) {
  2648. return {state: "parsererror", error: i ? c : "No conversion from " + l + " to " + r}
  2649. }
  2650. }
  2651. l = r
  2652. }
  2653. return {state: "success", data: t}
  2654. }
  2655. b.ajaxSetup({
  2656. accepts: {script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},
  2657. contents: {script: /(?:java|ecma)script/},
  2658. converters: {
  2659. "text script": function (e) {
  2660. return b.globalEval(e), e
  2661. }
  2662. }
  2663. }), b.ajaxPrefilter("script", function (e) {
  2664. e.cache === t && (e.cache = !1), e.crossDomain && (e.type = "GET", e.global = !1)
  2665. }), b.ajaxTransport("script", function (e) {
  2666. if (e.crossDomain) {
  2667. var n, r = o.head || b("head")[0] || o.documentElement;
  2668. return {
  2669. send: function (t, i) {
  2670. n = o.createElement("script"), n.async = !0, e.scriptCharset && (n.charset = e.scriptCharset), n.src = e.url, n.onload = n.onreadystatechange = function (e, t) {
  2671. (t || !n.readyState || /loaded|complete/.test(n.readyState)) && (n.onload = n.onreadystatechange = null, n.parentNode && n.parentNode.removeChild(n), n = null, t || i(200, "success"))
  2672. }, r.insertBefore(n, r.firstChild)
  2673. }, abort: function () {
  2674. n && n.onload(t, !0)
  2675. }
  2676. }
  2677. }
  2678. });
  2679. var On = [], Bn = /(=)\?(?=&|$)|\?\?/;
  2680. b.ajaxSetup({
  2681. jsonp: "callback", jsonpCallback: function () {
  2682. var e = On.pop() || b.expando + "_" + vn++;
  2683. return this[e] = !0, e
  2684. }
  2685. }), b.ajaxPrefilter("json jsonp", function (n, r, i) {
  2686. var o, a, s,
  2687. u = n.jsonp !== !1 && (Bn.test(n.url) ? "url" : "string" == typeof n.data && !(n.contentType || "").indexOf("application/x-www-form-urlencoded") && Bn.test(n.data) && "data");
  2688. return u || "jsonp" === n.dataTypes[0] ? (o = n.jsonpCallback = b.isFunction(n.jsonpCallback) ? n.jsonpCallback() : n.jsonpCallback, u ? n[u] = n[u].replace(Bn, "$1" + o) : n.jsonp !== !1 && (n.url += (bn.test(n.url) ? "&" : "?") + n.jsonp + "=" + o), n.converters["script json"] = function () {
  2689. return s || b.error(o + " was not called"), s[0]
  2690. }, n.dataTypes[0] = "json", a = e[o], e[o] = function () {
  2691. s = arguments
  2692. }, i.always(function () {
  2693. e[o] = a, n[o] && (n.jsonpCallback = r.jsonpCallback, On.push(o)), s && b.isFunction(a) && a(s[0]), s = a = t
  2694. }), "script") : t
  2695. });
  2696. var Pn, Rn, Wn = 0, $n = e.ActiveXObject && function () {
  2697. var e;
  2698. for (e in Pn)Pn[e](t, !0)
  2699. };
  2700. function In() {
  2701. try {
  2702. return new e.XMLHttpRequest
  2703. } catch (t) {
  2704. }
  2705. }
  2706. function zn() {
  2707. try {
  2708. return new e.ActiveXObject("Microsoft.XMLHTTP")
  2709. } catch (t) {
  2710. }
  2711. }
  2712. b.ajaxSettings.xhr = e.ActiveXObject ? function () {
  2713. return !this.isLocal && In() || zn()
  2714. } : In, Rn = b.ajaxSettings.xhr(), b.support.cors = !!Rn && "withCredentials" in Rn, Rn = b.support.ajax = !!Rn, Rn && b.ajaxTransport(function (n) {
  2715. if (!n.crossDomain || b.support.cors) {
  2716. var r;
  2717. return {
  2718. send: function (i, o) {
  2719. var a, s, u = n.xhr();
  2720. if (n.username ? u.open(n.type, n.url, n.async, n.username, n.password) : u.open(n.type, n.url, n.async), n.xhrFields)for (s in n.xhrFields)u[s] = n.xhrFields[s];
  2721. n.mimeType && u.overrideMimeType && u.overrideMimeType(n.mimeType), n.crossDomain || i["X-Requested-With"] || (i["X-Requested-With"] = "XMLHttpRequest");
  2722. try {
  2723. for (s in i)u.setRequestHeader(s, i[s])
  2724. } catch (l) {
  2725. }
  2726. u.send(n.hasContent && n.data || null), r = function (e, i) {
  2727. var s, l, c, p;
  2728. try {
  2729. if (r && (i || 4 === u.readyState))if (r = t, a && (u.onreadystatechange = b.noop, $n && delete Pn[a]), i) 4 !== u.readyState && u.abort(); else {
  2730. p = {}, s = u.status, l = u.getAllResponseHeaders(), "string" == typeof u.responseText && (p.text = u.responseText);
  2731. try {
  2732. c = u.statusText
  2733. } catch (f) {
  2734. c = ""
  2735. }
  2736. s || !n.isLocal || n.crossDomain ? 1223 === s && (s = 204) : s = p.text ? 200 : 404
  2737. }
  2738. } catch (d) {
  2739. i || o(-1, d)
  2740. }
  2741. p && o(s, c, p, l)
  2742. }, n.async ? 4 === u.readyState ? setTimeout(r) : (a = ++Wn, $n && (Pn || (Pn = {}, b(e).unload($n)), Pn[a] = r), u.onreadystatechange = r) : r()
  2743. }, abort: function () {
  2744. r && r(t, !0)
  2745. }
  2746. }
  2747. }
  2748. });
  2749. var Xn, Un, Vn = /^(?:toggle|show|hide)$/, Yn = RegExp("^(?:([+-])=|)(" + x + ")([a-z%]*)$", "i"),
  2750. Jn = /queueHooks$/, Gn = [nr], Qn = {
  2751. "*": [function (e, t) {
  2752. var n, r, i = this.createTween(e, t), o = Yn.exec(t), a = i.cur(), s = +a || 0, u = 1, l = 20;
  2753. if (o) {
  2754. if (n = +o[2], r = o[3] || (b.cssNumber[e] ? "" : "px"), "px" !== r && s) {
  2755. s = b.css(i.elem, e, !0) || n || 1;
  2756. do u = u || ".5", s /= u, b.style(i.elem, e, s + r); while (u !== (u = i.cur() / a) && 1 !== u && --l)
  2757. }
  2758. i.unit = r, i.start = s, i.end = o[1] ? s + (o[1] + 1) * n : n
  2759. }
  2760. return i
  2761. }]
  2762. };
  2763. function Kn() {
  2764. return setTimeout(function () {
  2765. Xn = t
  2766. }), Xn = b.now()
  2767. }
  2768. function Zn(e, t) {
  2769. b.each(t, function (t, n) {
  2770. var r = (Qn[t] || []).concat(Qn["*"]), i = 0, o = r.length;
  2771. for (; o > i; i++)if (r[i].call(e, t, n))return
  2772. })
  2773. }
  2774. function er(e, t, n) {
  2775. var r, i, o = 0, a = Gn.length, s = b.Deferred().always(function () {
  2776. delete u.elem
  2777. }), u = function () {
  2778. if (i)return !1;
  2779. var t = Xn || Kn(), n = Math.max(0, l.startTime + l.duration - t), r = n / l.duration || 0, o = 1 - r,
  2780. a = 0, u = l.tweens.length;
  2781. for (; u > a; a++)l.tweens[a].run(o);
  2782. return s.notifyWith(e, [l, o, n]), 1 > o && u ? n : (s.resolveWith(e, [l]), !1)
  2783. }, l = s.promise({
  2784. elem: e,
  2785. props: b.extend({}, t),
  2786. opts: b.extend(!0, {specialEasing: {}}, n),
  2787. originalProperties: t,
  2788. originalOptions: n,
  2789. startTime: Xn || Kn(),
  2790. duration: n.duration,
  2791. tweens: [],
  2792. createTween: function (t, n) {
  2793. var r = b.Tween(e, l.opts, t, n, l.opts.specialEasing[t] || l.opts.easing);
  2794. return l.tweens.push(r), r
  2795. },
  2796. stop: function (t) {
  2797. var n = 0, r = t ? l.tweens.length : 0;
  2798. if (i)return this;
  2799. for (i = !0; r > n; n++)l.tweens[n].run(1);
  2800. return t ? s.resolveWith(e, [l, t]) : s.rejectWith(e, [l, t]), this
  2801. }
  2802. }), c = l.props;
  2803. for (tr(c, l.opts.specialEasing); a > o; o++)if (r = Gn[o].call(l, e, c, l.opts))return r;
  2804. return Zn(l, c), b.isFunction(l.opts.start) && l.opts.start.call(e, l), b.fx.timer(b.extend(u, {
  2805. elem: e,
  2806. anim: l,
  2807. queue: l.opts.queue
  2808. })), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always)
  2809. }
  2810. function tr(e, t) {
  2811. var n, r, i, o, a;
  2812. for (i in e)if (r = b.camelCase(i), o = t[r], n = e[i], b.isArray(n) && (o = n[1], n = e[i] = n[0]), i !== r && (e[r] = n, delete e[i]), a = b.cssHooks[r], a && "expand" in a) {
  2813. n = a.expand(n), delete e[r];
  2814. for (i in n)i in e || (e[i] = n[i], t[i] = o)
  2815. } else t[r] = o
  2816. }
  2817. b.Animation = b.extend(er, {
  2818. tweener: function (e, t) {
  2819. b.isFunction(e) ? (t = e, e = ["*"]) : e = e.split(" ");
  2820. var n, r = 0, i = e.length;
  2821. for (; i > r; r++)n = e[r], Qn[n] = Qn[n] || [], Qn[n].unshift(t)
  2822. }, prefilter: function (e, t) {
  2823. t ? Gn.unshift(e) : Gn.push(e)
  2824. }
  2825. });
  2826. function nr(e, t, n) {
  2827. var r, i, o, a, s, u, l, c, p, f = this, d = e.style, h = {}, g = [], m = e.nodeType && nn(e);
  2828. n.queue || (c = b._queueHooks(e, "fx"), null == c.unqueued && (c.unqueued = 0, p = c.empty.fire, c.empty.fire = function () {
  2829. c.unqueued || p()
  2830. }), c.unqueued++, f.always(function () {
  2831. f.always(function () {
  2832. c.unqueued--, b.queue(e, "fx").length || c.empty.fire()
  2833. })
  2834. })), 1 === e.nodeType && ("height" in t || "width" in t) && (n.overflow = [d.overflow, d.overflowX, d.overflowY], "inline" === b.css(e, "display") && "none" === b.css(e, "float") && (b.support.inlineBlockNeedsLayout && "inline" !== un(e.nodeName) ? d.zoom = 1 : d.display = "inline-block")), n.overflow && (d.overflow = "hidden", b.support.shrinkWrapBlocks || f.always(function () {
  2835. d.overflow = n.overflow[0], d.overflowX = n.overflow[1], d.overflowY = n.overflow[2]
  2836. }));
  2837. for (i in t)if (a = t[i], Vn.exec(a)) {
  2838. if (delete t[i], u = u || "toggle" === a, a === (m ? "hide" : "show"))continue;
  2839. g.push(i)
  2840. }
  2841. if (o = g.length) {
  2842. s = b._data(e, "fxshow") || b._data(e, "fxshow", {}), "hidden" in s && (m = s.hidden), u && (s.hidden = !m), m ? b(e).show() : f.done(function () {
  2843. b(e).hide()
  2844. }), f.done(function () {
  2845. var t;
  2846. b._removeData(e, "fxshow");
  2847. for (t in h)b.style(e, t, h[t])
  2848. });
  2849. for (i = 0; o > i; i++)r = g[i], l = f.createTween(r, m ? s[r] : 0), h[r] = s[r] || b.style(e, r), r in s || (s[r] = l.start, m && (l.end = l.start, l.start = "width" === r || "height" === r ? 1 : 0))
  2850. }
  2851. }
  2852. function rr(e, t, n, r, i) {
  2853. return new rr.prototype.init(e, t, n, r, i)
  2854. }
  2855. b.Tween = rr, rr.prototype = {
  2856. constructor: rr, init: function (e, t, n, r, i, o) {
  2857. this.elem = e, this.prop = n, this.easing = i || "swing", this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (b.cssNumber[n] ? "" : "px")
  2858. }, cur: function () {
  2859. var e = rr.propHooks[this.prop];
  2860. return e && e.get ? e.get(this) : rr.propHooks._default.get(this)
  2861. }, run: function (e) {
  2862. var t, n = rr.propHooks[this.prop];
  2863. return this.pos = t = this.options.duration ? b.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : rr.propHooks._default.set(this), this
  2864. }
  2865. }, rr.prototype.init.prototype = rr.prototype, rr.propHooks = {
  2866. _default: {
  2867. get: function (e) {
  2868. var t;
  2869. return null == e.elem[e.prop] || e.elem.style && null != e.elem.style[e.prop] ? (t = b.css(e.elem, e.prop, ""), t && "auto" !== t ? t : 0) : e.elem[e.prop]
  2870. }, set: function (e) {
  2871. b.fx.step[e.prop] ? b.fx.step[e.prop](e) : e.elem.style && (null != e.elem.style[b.cssProps[e.prop]] || b.cssHooks[e.prop]) ? b.style(e.elem, e.prop, e.now + e.unit) : e.elem[e.prop] = e.now
  2872. }
  2873. }
  2874. }, rr.propHooks.scrollTop = rr.propHooks.scrollLeft = {
  2875. set: function (e) {
  2876. e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now)
  2877. }
  2878. }, b.each(["toggle", "show", "hide"], function (e, t) {
  2879. var n = b.fn[t];
  2880. b.fn[t] = function (e, r, i) {
  2881. return null == e || "boolean" == typeof e ? n.apply(this, arguments) : this.animate(ir(t, !0), e, r, i)
  2882. }
  2883. }), b.fn.extend({
  2884. fadeTo: function (e, t, n, r) {
  2885. return this.filter(nn).css("opacity", 0).show().end().animate({opacity: t}, e, n, r)
  2886. }, animate: function (e, t, n, r) {
  2887. var i = b.isEmptyObject(e), o = b.speed(t, n, r), a = function () {
  2888. var t = er(this, b.extend({}, e), o);
  2889. a.finish = function () {
  2890. t.stop(!0)
  2891. }, (i || b._data(this, "finish")) && t.stop(!0)
  2892. };
  2893. return a.finish = a, i || o.queue === !1 ? this.each(a) : this.queue(o.queue, a)
  2894. }, stop: function (e, n, r) {
  2895. var i = function (e) {
  2896. var t = e.stop;
  2897. delete e.stop, t(r)
  2898. };
  2899. return "string" != typeof e && (r = n, n = e, e = t), n && e !== !1 && this.queue(e || "fx", []), this.each(function () {
  2900. var t = !0, n = null != e && e + "queueHooks", o = b.timers, a = b._data(this);
  2901. if (n) a[n] && a[n].stop && i(a[n]); else for (n in a)a[n] && a[n].stop && Jn.test(n) && i(a[n]);
  2902. for (n = o.length; n--;)o[n].elem !== this || null != e && o[n].queue !== e || (o[n].anim.stop(r), t = !1, o.splice(n, 1));
  2903. (t || !r) && b.dequeue(this, e)
  2904. })
  2905. }, finish: function (e) {
  2906. return e !== !1 && (e = e || "fx"), this.each(function () {
  2907. var t, n = b._data(this), r = n[e + "queue"], i = n[e + "queueHooks"], o = b.timers,
  2908. a = r ? r.length : 0;
  2909. for (n.finish = !0, b.queue(this, e, []), i && i.cur && i.cur.finish && i.cur.finish.call(this), t = o.length; t--;)o[t].elem === this && o[t].queue === e && (o[t].anim.stop(!0), o.splice(t, 1));
  2910. for (t = 0; a > t; t++)r[t] && r[t].finish && r[t].finish.call(this);
  2911. delete n.finish
  2912. })
  2913. }
  2914. });
  2915. function ir(e, t) {
  2916. var n, r = {height: e}, i = 0;
  2917. for (t = t ? 1 : 0; 4 > i; i += 2 - t)n = Zt[i], r["margin" + n] = r["padding" + n] = e;
  2918. return t && (r.opacity = r.width = e), r
  2919. }
  2920. b.each({
  2921. slideDown: ir("show"),
  2922. slideUp: ir("hide"),
  2923. slideToggle: ir("toggle"),
  2924. fadeIn: {opacity: "show"},
  2925. fadeOut: {opacity: "hide"},
  2926. fadeToggle: {opacity: "toggle"}
  2927. }, function (e, t) {
  2928. b.fn[e] = function (e, n, r) {
  2929. return this.animate(t, e, n, r)
  2930. }
  2931. }), b.speed = function (e, t, n) {
  2932. var r = e && "object" == typeof e ? b.extend({}, e) : {
  2933. complete: n || !n && t || b.isFunction(e) && e,
  2934. duration: e,
  2935. easing: n && t || t && !b.isFunction(t) && t
  2936. };
  2937. return r.duration = b.fx.off ? 0 : "number" == typeof r.duration ? r.duration : r.duration in b.fx.speeds ? b.fx.speeds[r.duration] : b.fx.speeds._default, (null == r.queue || r.queue === !0) && (r.queue = "fx"), r.old = r.complete, r.complete = function () {
  2938. b.isFunction(r.old) && r.old.call(this), r.queue && b.dequeue(this, r.queue)
  2939. }, r
  2940. }, b.easing = {
  2941. linear: function (e) {
  2942. return e
  2943. }, swing: function (e) {
  2944. return .5 - Math.cos(e * Math.PI) / 2
  2945. }
  2946. }, b.timers = [], b.fx = rr.prototype.init, b.fx.tick = function () {
  2947. var e, n = b.timers, r = 0;
  2948. for (Xn = b.now(); n.length > r; r++)e = n[r], e() || n[r] !== e || n.splice(r--, 1);
  2949. n.length || b.fx.stop(), Xn = t
  2950. }, b.fx.timer = function (e) {
  2951. e() && b.timers.push(e) && b.fx.start()
  2952. }, b.fx.interval = 13, b.fx.start = function () {
  2953. Un || (Un = setInterval(b.fx.tick, b.fx.interval))
  2954. }, b.fx.stop = function () {
  2955. clearInterval(Un), Un = null
  2956. }, b.fx.speeds = {
  2957. slow: 600,
  2958. fast: 200,
  2959. _default: 400
  2960. }, b.fx.step = {}, b.expr && b.expr.filters && (b.expr.filters.animated = function (e) {
  2961. return b.grep(b.timers, function (t) {
  2962. return e === t.elem
  2963. }).length
  2964. }), b.fn.offset = function (e) {
  2965. if (arguments.length)return e === t ? this : this.each(function (t) {
  2966. b.offset.setOffset(this, e, t)
  2967. });
  2968. var n, r, o = {top: 0, left: 0}, a = this[0], s = a && a.ownerDocument;
  2969. if (s)return n = s.documentElement, b.contains(n, a) ? (typeof a.getBoundingClientRect !== i && (o = a.getBoundingClientRect()), r = or(s), {
  2970. top: o.top + (r.pageYOffset || n.scrollTop) - (n.clientTop || 0),
  2971. left: o.left + (r.pageXOffset || n.scrollLeft) - (n.clientLeft || 0)
  2972. }) : o
  2973. }, b.offset = {
  2974. setOffset: function (e, t, n) {
  2975. var r = b.css(e, "position");
  2976. "static" === r && (e.style.position = "relative");
  2977. var i = b(e), o = i.offset(), a = b.css(e, "top"), s = b.css(e, "left"),
  2978. u = ("absolute" === r || "fixed" === r) && b.inArray("auto", [a, s]) > -1, l = {}, c = {}, p, f;
  2979. u ? (c = i.position(), p = c.top, f = c.left) : (p = parseFloat(a) || 0, f = parseFloat(s) || 0), b.isFunction(t) && (t = t.call(e, n, o)), null != t.top && (l.top = t.top - o.top + p), null != t.left && (l.left = t.left - o.left + f), "using" in t ? t.using.call(e, l) : i.css(l)
  2980. }
  2981. }, b.fn.extend({
  2982. position: function () {
  2983. if (this[0]) {
  2984. var e, t, n = {top: 0, left: 0}, r = this[0];
  2985. return "fixed" === b.css(r, "position") ? t = r.getBoundingClientRect() : (e = this.offsetParent(), t = this.offset(), b.nodeName(e[0], "html") || (n = e.offset()), n.top += b.css(e[0], "borderTopWidth", !0), n.left += b.css(e[0], "borderLeftWidth", !0)), {
  2986. top: t.top - n.top - b.css(r, "marginTop", !0),
  2987. left: t.left - n.left - b.css(r, "marginLeft", !0)
  2988. }
  2989. }
  2990. }, offsetParent: function () {
  2991. return this.map(function () {
  2992. var e = this.offsetParent || o.documentElement;
  2993. while (e && !b.nodeName(e, "html") && "static" === b.css(e, "position"))e = e.offsetParent;
  2994. return e || o.documentElement
  2995. })
  2996. }
  2997. }), b.each({scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function (e, n) {
  2998. var r = /Y/.test(n);
  2999. b.fn[e] = function (i) {
  3000. return b.access(this, function (e, i, o) {
  3001. var a = or(e);
  3002. return o === t ? a ? n in a ? a[n] : a.document.documentElement[i] : e[i] : (a ? a.scrollTo(r ? b(a).scrollLeft() : o, r ? o : b(a).scrollTop()) : e[i] = o, t)
  3003. }, e, i, arguments.length, null)
  3004. }
  3005. });
  3006. function or(e) {
  3007. return b.isWindow(e) ? e : 9 === e.nodeType ? e.defaultView || e.parentWindow : !1
  3008. }
  3009. b.each({Height: "height", Width: "width"}, function (e, n) {
  3010. b.each({padding: "inner" + e, content: n, "": "outer" + e}, function (r, i) {
  3011. b.fn[i] = function (i, o) {
  3012. var a = arguments.length && (r || "boolean" != typeof i),
  3013. s = r || (i === !0 || o === !0 ? "margin" : "border");
  3014. return b.access(this, function (n, r, i) {
  3015. var o;
  3016. return b.isWindow(n) ? n.document.documentElement["client" + e] : 9 === n.nodeType ? (o = n.documentElement, Math.max(n.body["scroll" + e], o["scroll" + e], n.body["offset" + e], o["offset" + e], o["client" + e])) : i === t ? b.css(n, r, s) : b.style(n, r, i, s)
  3017. }, n, a ? i : t, a, null)
  3018. }
  3019. })
  3020. }), e.jQuery = e.$ = b, "function" == typeof define && define.amd && define.amd.jQuery && define("jquery", [], function () {
  3021. return b
  3022. })
  3023. })(window);
  3024. </script>
  3025. <script>
  3026. /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
  3027. var saveAs = saveAs || function (e) {
  3028. "use strict";
  3029. if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
  3030. return
  3031. }
  3032. var t = e.document, n = function () {
  3033. return e.URL || e.webkitURL || e
  3034. }, r = t.createElementNS("http://www.w3.org/1999/xhtml", "a"), i = "download" in r, o = function (e) {
  3035. var t = new MouseEvent("click");
  3036. e.dispatchEvent(t)
  3037. }, a = /Version\/[\d\.]+.*Safari/.test(navigator.userAgent), f = e.webkitRequestFileSystem,
  3038. u = e.requestFileSystem || f || e.mozRequestFileSystem, s = function (t) {
  3039. (e.setImmediate || e.setTimeout)(function () {
  3040. throw t
  3041. }, 0)
  3042. }, c = "application/octet-stream", d = 0, l = 500, w = function (t) {
  3043. var r = function () {
  3044. if (typeof t === "string") {
  3045. n().revokeObjectURL(t)
  3046. } else {
  3047. t.remove()
  3048. }
  3049. };
  3050. if (e.chrome) {
  3051. r()
  3052. } else {
  3053. setTimeout(r, l)
  3054. }
  3055. }, p = function (e, t, n) {
  3056. t = [].concat(t);
  3057. var r = t.length;
  3058. while (r--) {
  3059. var i = e["on" + t[r]];
  3060. if (typeof i === "function") {
  3061. try {
  3062. i.call(e, n || e)
  3063. } catch (o) {
  3064. s(o)
  3065. }
  3066. }
  3067. }
  3068. }, v = function (e) {
  3069. if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)) {
  3070. return new Blob(["\ufeff", e], {type: e.type})
  3071. }
  3072. return e
  3073. }, y = function (t, s, l) {
  3074. if (!l) {
  3075. t = v(t)
  3076. }
  3077. var y = this, m = t.type, S = false, h, R, O = function () {
  3078. p(y, "writestart progress write writeend".split(" "))
  3079. }, g = function () {
  3080. if (R && a && typeof FileReader !== "undefined") {
  3081. var r = new FileReader;
  3082. r.onloadend = function () {
  3083. var e = r.result;
  3084. R.location.href = "data:attachment/file" + e.slice(e.search(/[,;]/));
  3085. y.readyState = y.DONE;
  3086. O()
  3087. };
  3088. r.readAsDataURL(t);
  3089. y.readyState = y.INIT;
  3090. return
  3091. }
  3092. if (S || !h) {
  3093. h = n().createObjectURL(t)
  3094. }
  3095. if (R) {
  3096. R.location.href = h
  3097. } else {
  3098. var i = e.open(h, "_blank");
  3099. if (i == undefined && a) {
  3100. e.location.href = h
  3101. }
  3102. }
  3103. y.readyState = y.DONE;
  3104. O();
  3105. w(h)
  3106. }, b = function (e) {
  3107. return function () {
  3108. if (y.readyState !== y.DONE) {
  3109. return e.apply(this, arguments)
  3110. }
  3111. }
  3112. }, E = {create: true, exclusive: false}, N;
  3113. y.readyState = y.INIT;
  3114. if (!s) {
  3115. s = "download"
  3116. }
  3117. if (i) {
  3118. h = n().createObjectURL(t);
  3119. r.href = h;
  3120. r.download = s;
  3121. setTimeout(function () {
  3122. o(r);
  3123. O();
  3124. w(h);
  3125. y.readyState = y.DONE
  3126. });
  3127. return
  3128. }
  3129. if (e.chrome && m && m !== c) {
  3130. N = t.slice || t.webkitSlice;
  3131. t = N.call(t, 0, t.size, c);
  3132. S = true
  3133. }
  3134. if (f && s !== "download") {
  3135. s += ".download"
  3136. }
  3137. if (m === c || f) {
  3138. R = e
  3139. }
  3140. if (!u) {
  3141. g();
  3142. return
  3143. }
  3144. d += t.size;
  3145. u(e.TEMPORARY, d, b(function (e) {
  3146. e.root.getDirectory("saved", E, b(function (e) {
  3147. var n = function () {
  3148. e.getFile(s, E, b(function (e) {
  3149. e.createWriter(b(function (n) {
  3150. n.onwriteend = function (t) {
  3151. R.location.href = e.toURL();
  3152. y.readyState = y.DONE;
  3153. p(y, "writeend", t);
  3154. w(e)
  3155. };
  3156. n.onerror = function () {
  3157. var e = n.error;
  3158. if (e.code !== e.ABORT_ERR) {
  3159. g()
  3160. }
  3161. };
  3162. "writestart progress write abort".split(" ").forEach(function (e) {
  3163. n["on" + e] = y["on" + e]
  3164. });
  3165. n.write(t);
  3166. y.abort = function () {
  3167. n.abort();
  3168. y.readyState = y.DONE
  3169. };
  3170. y.readyState = y.WRITING
  3171. }), g)
  3172. }), g)
  3173. };
  3174. e.getFile(s, {create: false}, b(function (e) {
  3175. e.remove();
  3176. n()
  3177. }), b(function (e) {
  3178. if (e.code === e.NOT_FOUND_ERR) {
  3179. n()
  3180. } else {
  3181. g()
  3182. }
  3183. }))
  3184. }), g)
  3185. }), g)
  3186. }, m = y.prototype, S = function (e, t, n) {
  3187. return new y(e, t, n)
  3188. };
  3189. if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
  3190. return function (e, t, n) {
  3191. if (!n) {
  3192. e = v(e)
  3193. }
  3194. return navigator.msSaveOrOpenBlob(e, t || "download")
  3195. }
  3196. }
  3197. m.abort = function () {
  3198. var e = this;
  3199. e.readyState = e.DONE;
  3200. p(e, "abort")
  3201. };
  3202. m.readyState = m.INIT = 0;
  3203. m.WRITING = 1;
  3204. m.DONE = 2;
  3205. m.error = m.onwritestart = m.onprogress = m.onwrite = m.onabort = m.onerror = m.onwriteend = null;
  3206. return S
  3207. }(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content);
  3208. if (typeof module !== "undefined" && module.exports) {
  3209. module.exports.saveAs = saveAs
  3210. } else if (typeof define !== "undefined" && define !== null && define.amd != null) {
  3211. define([], function () {
  3212. return saveAs
  3213. })
  3214. }
  3215. </script>
  3216. <script>
  3217. /**
  3218. * @file jsoneditor.js
  3219. *
  3220. * @brief
  3221. * JSONEditor is a web-based tool to view, edit, and format JSON.
  3222. * It shows data a clear, editable treeview.
  3223. *
  3224. * Supported browsers: Chrome, Firefox, Safari, Opera, Internet Explorer 8+
  3225. *
  3226. * @license
  3227. * This json editor is open sourced with the intention to use the editor as
  3228. * a component in your own application. Not to just copy and monetize the editor
  3229. * as it is.
  3230. *
  3231. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  3232. * use this file except in compliance with the License. You may obtain a copy
  3233. * of the License at
  3234. *
  3235. * http://www.apache.org/licenses/LICENSE-2.0
  3236. *
  3237. * Unless required by applicable law or agreed to in writing, software
  3238. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  3239. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  3240. * License for the specific language governing permissions and limitations under
  3241. * the License.
  3242. *
  3243. * Copyright (c) 2011-2012 Jos de Jong, http://jsoneditoronline.org
  3244. *
  3245. * @author Jos de Jong, <wjosdejong@gmail.com>
  3246. * @date 2012-12-08
  3247. */
  3248. // Internet Explorer 8 and older does not support Array.indexOf,
  3249. // so we define it here in that case
  3250. // http://soledadpenades.com/2007/05/17/arrayindexof-in-internet-explorer/
  3251. if (!Array.prototype.indexOf) {
  3252. Array.prototype.indexOf = function (obj) {
  3253. for (var i = 0; i < this.length; i++) {
  3254. if (this[i] == obj) {
  3255. return i;
  3256. }
  3257. }
  3258. return -1;
  3259. }
  3260. }
  3261. // Internet Explorer 8 and older does not support Array.forEach,
  3262. // so we define it here in that case
  3263. // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach
  3264. if (!Array.prototype.forEach) {
  3265. Array.prototype.forEach = function (fn, scope) {
  3266. for (var i = 0, len = this.length; i < len; ++i) {
  3267. fn.call(scope || this, this[i], i, this);
  3268. }
  3269. }
  3270. }
  3271. // define variable JSON, needed for correct error handling on IE7 and older
  3272. var JSON;
  3273. /**
  3274. * JSONEditor
  3275. * @param {Element} container Container element
  3276. * @param {Object} [options] Object with options. available options:
  3277. * {String} mode Editor mode. Available values:
  3278. * 'editor' (default), 'viewer'.
  3279. * {Boolean} search Enable search box.
  3280. * True by default
  3281. * {Boolean} history Enable history (undo/redo).
  3282. * True by default
  3283. * {function} change Callback method, triggered
  3284. * on change of contents
  3285. * {String} name Field name for the root node.
  3286. * @param {Object | undefined} json JSON object
  3287. */
  3288. JSONEditor = function (container, options, json) {
  3289. // check availability of JSON parser (not available in IE7 and older)
  3290. if (!JSON) {
  3291. throw new Error('您当前使用的浏览器不支持 JSON. \n\n' +
  3292. '请下载安装最新版本的浏览器, 本站推荐Google Chrome.\n' +
  3293. '(PS: 当前主流浏览器都支持JSON).');
  3294. }
  3295. if (!container) {
  3296. throw new Error('没有提供容器元素.');
  3297. }
  3298. this.container = container;
  3299. this.dom = {};
  3300. this._setOptions(options);
  3301. if (this.options.history && this.editable) {
  3302. this.history = new JSONEditor.History(this);
  3303. }
  3304. this._createFrame();
  3305. this._createTable();
  3306. this.set(json || {});
  3307. };
  3308. /**
  3309. * Initialize and set default options
  3310. * @param {Object} [options] Object with options. available options:
  3311. * {String} mode Editor mode. Available values:
  3312. * 'editor' (default), 'viewer'.
  3313. * {Boolean} search Enable search box.
  3314. * True by default.
  3315. * {Boolean} history Enable history (undo/redo).
  3316. * True by default.
  3317. * {function} change Callback method, triggered
  3318. * on change of contents.
  3319. * {String} name Field name for the root node.
  3320. * @private
  3321. */
  3322. JSONEditor.prototype._setOptions = function (options) {
  3323. this.options = {
  3324. search: true,
  3325. history: true,
  3326. mode: 'editor',
  3327. name: undefined // field name of root node
  3328. };
  3329. // copy all options
  3330. if (options) {
  3331. for (var prop in options) {
  3332. if (options.hasOwnProperty(prop)) {
  3333. this.options[prop] = options[prop];
  3334. }
  3335. }
  3336. // check for deprecated options
  3337. if (options.enableSearch) {
  3338. // deprecated since version 1.6.0, 2012-11-03
  3339. this.options.search = options.enableSearch;
  3340. // console.log('WARNING: Option "enableSearch" is deprecated. Use "search" instead.');
  3341. }
  3342. if (options.enableHistory) {
  3343. // deprecated since version 1.6.0, 2012-11-03
  3344. this.options.search = options.enableHistory;
  3345. // console.log('WARNING: Option "enableHistory" is deprecated. Use "history" instead.');
  3346. }
  3347. }
  3348. // interpret the options
  3349. this.editable = (this.options.mode != 'viewer');
  3350. };
  3351. // node currently being edited
  3352. JSONEditor.focusNode = undefined;
  3353. /**
  3354. * Set JSON object in editor
  3355. * @param {Object | undefined} json JSON data
  3356. * @param {String} [name] Optional field name for the root node.
  3357. * Can also be set using setName(name).
  3358. */
  3359. JSONEditor.prototype.set = function (json, name) {
  3360. // adjust field name for root node
  3361. if (name) {
  3362. this.options.name = name;
  3363. }
  3364. // verify if json is valid JSON, ignore when a function
  3365. if (json instanceof Function || (json === undefined)) {
  3366. this.clear();
  3367. } else {
  3368. this.content.removeChild(this.table); // Take the table offline
  3369. // replace the root node
  3370. var params = {
  3371. 'field': this.options.name,
  3372. 'value': json
  3373. };
  3374. var node = new JSONEditor.Node(this, params);
  3375. this._setRoot(node);
  3376. // expand
  3377. var recurse = false;
  3378. this.node.expand(recurse);
  3379. this.content.appendChild(this.table); // Put the table online again
  3380. }
  3381. // TODO: maintain history, store last state and previous document
  3382. if (this.history) {
  3383. this.history.clear();
  3384. }
  3385. };
  3386. /**
  3387. * Get JSON object from editor
  3388. * @return {Object | undefined} json
  3389. */
  3390. JSONEditor.prototype.get = function () {
  3391. // remove focus from currently edited node
  3392. if (JSONEditor.focusNode) {
  3393. JSONEditor.focusNode.blur();
  3394. }
  3395. if (this.node) {
  3396. return this.node.getValue();
  3397. } else {
  3398. return undefined;
  3399. }
  3400. };
  3401. /**
  3402. * Set a field name for the root node.
  3403. * @param {String | undefined} name
  3404. */
  3405. JSONEditor.prototype.setName = function (name) {
  3406. this.options.name = name;
  3407. if (this.node) {
  3408. this.node.updateField(this.options.name);
  3409. }
  3410. };
  3411. /**
  3412. * Get the field name for the root node.
  3413. * @return {String | undefined} name
  3414. */
  3415. JSONEditor.prototype.getName = function () {
  3416. return this.options.name;
  3417. };
  3418. /**
  3419. * Remove the root node from the editor
  3420. */
  3421. JSONEditor.prototype.clear = function () {
  3422. if (this.node) {
  3423. this.node.collapse();
  3424. this.tbody.removeChild(this.node.getDom());
  3425. delete this.node;
  3426. }
  3427. };
  3428. /**
  3429. * Set the root node for the json editor
  3430. * @param {JSONEditor.Node} node
  3431. * @private
  3432. */
  3433. JSONEditor.prototype._setRoot = function (node) {
  3434. this.clear();
  3435. this.node = node;
  3436. // append to the dom
  3437. this.tbody.appendChild(node.getDom());
  3438. };
  3439. /**
  3440. * Search text in all nodes
  3441. * The nodes will be expanded when the text is found one of its childs,
  3442. * else it will be collapsed. Searches are case insensitive.
  3443. * @param {String} text
  3444. * @return {Object[]} results Array with nodes containing the search results
  3445. * The result objects contains fields:
  3446. * - {JSONEditor.Node} node,
  3447. * - {String} elem the dom element name where
  3448. * the result is found ('field' or
  3449. * 'value')
  3450. */
  3451. JSONEditor.prototype.search = function (text) {
  3452. var results;
  3453. if (this.node) {
  3454. this.content.removeChild(this.table); // Take the table offline
  3455. results = this.node.search(text);
  3456. this.content.appendChild(this.table); // Put the table online again
  3457. } else {
  3458. results = [];
  3459. }
  3460. return results;
  3461. };
  3462. /**
  3463. * Expand all nodes
  3464. */
  3465. JSONEditor.prototype.expandAll = function () {
  3466. if (this.node) {
  3467. this.content.removeChild(this.table); // Take the table offline
  3468. this.node.expand();
  3469. this.content.appendChild(this.table); // Put the table online again
  3470. }
  3471. };
  3472. /**
  3473. * Collapse all nodes
  3474. */
  3475. JSONEditor.prototype.collapseAll = function () {
  3476. if (this.node) {
  3477. this.content.removeChild(this.table); // Take the table offline
  3478. this.node.collapse();
  3479. this.content.appendChild(this.table); // Put the table online again
  3480. }
  3481. };
  3482. /**
  3483. * The method onChange is called whenever a field or value is changed, created,
  3484. * deleted, duplicated, etc.
  3485. * @param {String} action Change action. Available values: "editField",
  3486. * "editValue", "changeType", "appendNode",
  3487. * "removeNode", "duplicateNode", "moveNode", "expand",
  3488. * "collapse".
  3489. * @param {Object} params Object containing parameters describing the change.
  3490. * The parameters in params depend on the action (for
  3491. * example for "editValue" the Node, old value, and new
  3492. * value are provided). params contains all information
  3493. * needed to undo or redo the action.
  3494. */
  3495. JSONEditor.prototype.onAction = function (action, params) {
  3496. // add an action to the history
  3497. if (this.history) {
  3498. this.history.add(action, params);
  3499. }
  3500. // trigger the onChange callback
  3501. if (this.options.change) {
  3502. try {
  3503. this.options.change();
  3504. } catch (err) {
  3505. //console.log('Error in change callback: ', err);
  3506. }
  3507. }
  3508. };
  3509. /**
  3510. * Set the focus to the JSONEditor. A hidden input field will be created
  3511. * which captures key events
  3512. */
  3513. // TODO: use the focus method?
  3514. JSONEditor.prototype.focus = function () {
  3515. /*
  3516. if (!this.dom.focus) {
  3517. this.dom.focus = document.createElement('input');
  3518. this.dom.focus.className = 'jsoneditor-hidden-focus';
  3519. var editor = this;
  3520. this.dom.focus.onblur = function () {
  3521. // remove itself
  3522. if (editor.dom.focus) {
  3523. var focus = editor.dom.focus;
  3524. delete editor.dom.focus;
  3525. editor.frame.removeChild(focus);
  3526. }
  3527. };
  3528. // attach the hidden input box to the DOM
  3529. if (this.frame.firstChild) {
  3530. this.frame.insertBefore(this.dom.focus, this.frame.firstChild);
  3531. }
  3532. else {
  3533. this.frame.appendChild(this.dom.focus);
  3534. }
  3535. }
  3536. this.dom.focus.focus();
  3537. */
  3538. };
  3539. /**
  3540. * Adjust the scroll position such that given top position is shown at 1/4
  3541. * of the window height.
  3542. * @param {Number} top
  3543. */
  3544. JSONEditor.prototype.scrollTo = function (top) {
  3545. var content = this.content;
  3546. if (content) {
  3547. // cancel any running animation
  3548. var editor = this;
  3549. if (editor.animateTimeout) {
  3550. clearTimeout(editor.animateTimeout);
  3551. delete editor.animateTimeout;
  3552. }
  3553. // calculate final scroll position
  3554. var height = content.clientHeight;
  3555. var bottom = content.scrollHeight - height;
  3556. var finalScrollTop = Math.min(Math.max(top - height / 4, 0), bottom);
  3557. // animate towards the new scroll position
  3558. var animate = function () {
  3559. var scrollTop = content.scrollTop;
  3560. var diff = (finalScrollTop - scrollTop);
  3561. if (Math.abs(diff) > 3) {
  3562. content.scrollTop += diff / 3;
  3563. editor.animateTimeout = setTimeout(animate, 50);
  3564. }
  3565. };
  3566. animate();
  3567. }
  3568. };
  3569. /**
  3570. * @constructor JSONEditor.History
  3571. * Store action history, enables undo and redo
  3572. * @param {JSONEditor} editor
  3573. */
  3574. JSONEditor.History = function (editor) {
  3575. this.editor = editor;
  3576. this.clear();
  3577. // map with all supported actions
  3578. this.actions = {
  3579. 'editField': {
  3580. 'undo': function (obj) {
  3581. obj.params.node.updateField(obj.params.oldValue);
  3582. },
  3583. 'redo': function (obj) {
  3584. obj.params.node.updateField(obj.params.newValue);
  3585. }
  3586. },
  3587. 'editValue': {
  3588. 'undo': function (obj) {
  3589. obj.params.node.updateValue(obj.params.oldValue);
  3590. },
  3591. 'redo': function (obj) {
  3592. obj.params.node.updateValue(obj.params.newValue);
  3593. }
  3594. },
  3595. 'appendNode': {
  3596. 'undo': function (obj) {
  3597. obj.params.parent.removeChild(obj.params.node);
  3598. },
  3599. 'redo': function (obj) {
  3600. obj.params.parent.appendChild(obj.params.node);
  3601. }
  3602. },
  3603. 'removeNode': {
  3604. 'undo': function (obj) {
  3605. var parent = obj.params.parent;
  3606. var beforeNode = parent.childs[obj.params.index] || parent.append;
  3607. parent.insertBefore(obj.params.node, beforeNode);
  3608. },
  3609. 'redo': function (obj) {
  3610. obj.params.parent.removeChild(obj.params.node);
  3611. }
  3612. },
  3613. 'duplicateNode': {
  3614. 'undo': function (obj) {
  3615. obj.params.parent.removeChild(obj.params.clone);
  3616. },
  3617. 'redo': function (obj) {
  3618. // TODO: insert after instead of insert before
  3619. obj.params.parent.insertBefore(obj.params.clone, obj.params.node);
  3620. }
  3621. },
  3622. 'changeType': {
  3623. 'undo': function (obj) {
  3624. obj.params.node.changeType(obj.params.oldType);
  3625. },
  3626. 'redo': function (obj) {
  3627. obj.params.node.changeType(obj.params.newType);
  3628. }
  3629. },
  3630. 'moveNode': {
  3631. 'undo': function (obj) {
  3632. obj.params.startParent.moveTo(obj.params.node, obj.params.startIndex);
  3633. },
  3634. 'redo': function (obj) {
  3635. obj.params.endParent.moveTo(obj.params.node, obj.params.endIndex);
  3636. }
  3637. }
  3638. // TODO: restore the original caret position and selection with each undo
  3639. // TODO: implement history for actions "expand", "collapse", "scroll", "setDocument"
  3640. };
  3641. };
  3642. /**
  3643. * The method onChange is executed when the History is changed, and can
  3644. * be overloaded.
  3645. */
  3646. JSONEditor.History.prototype.onChange = function () {
  3647. };
  3648. /**
  3649. * Add a new action to the history
  3650. * @param {String} action The executed action. Available actions: "editField",
  3651. * "editValue", "changeType", "appendNode",
  3652. * "removeNode", "duplicateNode", "moveNode"
  3653. * @param {Object} params Object containing parameters describing the change.
  3654. * The parameters in params depend on the action (for
  3655. * example for "editValue" the Node, old value, and new
  3656. * value are provided). params contains all information
  3657. * needed to undo or redo the action.
  3658. */
  3659. JSONEditor.History.prototype.add = function (action, params) {
  3660. this.index++;
  3661. this.history[this.index] = {
  3662. 'action': action,
  3663. 'params': params,
  3664. 'timestamp': new Date()
  3665. };
  3666. // remove redo actions which are invalid now
  3667. if (this.index < this.history.length - 1) {
  3668. this.history.splice(this.index + 1, this.history.length - this.index - 1);
  3669. }
  3670. // fire onchange event
  3671. this.onChange();
  3672. };
  3673. /**
  3674. * Clear history
  3675. */
  3676. JSONEditor.History.prototype.clear = function () {
  3677. this.history = [];
  3678. this.index = -1;
  3679. // fire onchange event
  3680. this.onChange();
  3681. };
  3682. /**
  3683. * Check if there is an action available for undo
  3684. * @return {Boolean} canUndo
  3685. */
  3686. JSONEditor.History.prototype.canUndo = function () {
  3687. return (this.index >= 0);
  3688. };
  3689. /**
  3690. * Check if there is an action available for redo
  3691. * @return {Boolean} canRedo
  3692. */
  3693. JSONEditor.History.prototype.canRedo = function () {
  3694. return (this.index < this.history.length - 1);
  3695. };
  3696. /**
  3697. * Undo the last action
  3698. */
  3699. JSONEditor.History.prototype.undo = function () {
  3700. if (this.canUndo()) {
  3701. var obj = this.history[this.index];
  3702. if (obj) {
  3703. var action = this.actions[obj.action];
  3704. if (action && action.undo) {
  3705. action.undo(obj);
  3706. } else {
  3707. //console.log('Error: unknown action "' + obj.action + '"');
  3708. }
  3709. }
  3710. this.index--;
  3711. // fire onchange event
  3712. this.onChange();
  3713. }
  3714. };
  3715. /**
  3716. * Redo the last action
  3717. */
  3718. JSONEditor.History.prototype.redo = function () {
  3719. if (this.canRedo()) {
  3720. this.index++;
  3721. var obj = this.history[this.index];
  3722. if (obj) {
  3723. if (obj) {
  3724. var action = this.actions[obj.action];
  3725. if (action && action.redo) {
  3726. action.redo(obj);
  3727. } else {
  3728. //console.log('Error: unknown action "' + obj.action + '"');
  3729. }
  3730. }
  3731. }
  3732. // fire onchange event
  3733. this.onChange();
  3734. }
  3735. };
  3736. /**
  3737. * @constructor JSONEditor.Node
  3738. * Create a new Node
  3739. * @param {JSONEditor} editor
  3740. * @param {Object} params Can contain parameters: field, fieldEditable, value.
  3741. */
  3742. JSONEditor.Node = function (editor, params) {
  3743. this.editor = editor;
  3744. this.dom = {};
  3745. this.expanded = false;
  3746. if (params && (params instanceof Object)) {
  3747. this.setField(params.field, params.fieldEditable);
  3748. this.setValue(params.value);
  3749. } else {
  3750. this.setField();
  3751. this.setValue();
  3752. }
  3753. };
  3754. /**
  3755. * Set parent node
  3756. * @param {JSONEditor.Node} parent
  3757. */
  3758. JSONEditor.Node.prototype.setParent = function (parent) {
  3759. this.parent = parent;
  3760. };
  3761. /**
  3762. * Get parent node. Returns undefined when no parent node is set.
  3763. * @return {JSONEditor.Node} parent
  3764. */
  3765. JSONEditor.Node.prototype.getParent = function () {
  3766. return this.parent;
  3767. };
  3768. /**
  3769. * Set field
  3770. * @param {String} field
  3771. * @param {boolean} fieldEditable
  3772. */
  3773. JSONEditor.Node.prototype.setField = function (field, fieldEditable) {
  3774. this.field = field;
  3775. this.fieldEditable = (fieldEditable == true);
  3776. };
  3777. /**
  3778. * Get field
  3779. * @return {String}
  3780. */
  3781. JSONEditor.Node.prototype.getField = function () {
  3782. if (this.field === undefined) {
  3783. this._getDomField();
  3784. }
  3785. return this.field;
  3786. };
  3787. /**
  3788. * Set value. Value is a JSON structure or an element String, Boolean, etc.
  3789. * @param {*} value
  3790. */
  3791. JSONEditor.Node.prototype.setValue = function (value) {
  3792. var childValue, child;
  3793. // first clear all current childs (if any)
  3794. var childs = this.childs;
  3795. if (childs) {
  3796. while (childs.length) {
  3797. this.removeChild(childs[0]);
  3798. }
  3799. }
  3800. // TODO: remove the DOM of this Node
  3801. this.type = this._getType(value);
  3802. if (this.type == 'array') {
  3803. // array
  3804. this.childs = [];
  3805. for (var i = 0, iMax = value.length; i < iMax; i++) {
  3806. childValue = value[i];
  3807. if (childValue !== undefined && !(childValue instanceof Function)) {
  3808. // ignore undefined and functions
  3809. child = new JSONEditor.Node(this.editor, {
  3810. 'value': childValue
  3811. });
  3812. this.appendChild(child);
  3813. }
  3814. }
  3815. this.value = '';
  3816. } else if (this.type == 'object') {
  3817. // object
  3818. this.childs = [];
  3819. for (var childField in value) {
  3820. if (value.hasOwnProperty(childField)) {
  3821. childValue = value[childField];
  3822. if (childValue !== undefined && !(childValue instanceof Function)) {
  3823. // ignore undefined and functions
  3824. child = new JSONEditor.Node(this.editor, {
  3825. 'field': childField,
  3826. 'value': childValue
  3827. });
  3828. this.appendChild(child);
  3829. }
  3830. }
  3831. }
  3832. this.value = '';
  3833. } else {
  3834. // value
  3835. this.childs = undefined;
  3836. this.value = value;
  3837. /* TODO
  3838. if (typeof(value) == 'string') {
  3839. var escValue = JSON.stringify(value);
  3840. this.value = escValue.substring(1, escValue.length - 1);
  3841. console.log('check', value, this.value);
  3842. }
  3843. else {
  3844. this.value = value;
  3845. }
  3846. */
  3847. }
  3848. };
  3849. /**
  3850. * Get value. Value is a JSON structure
  3851. * @return {*} value
  3852. */
  3853. JSONEditor.Node.prototype.getValue = function () {
  3854. //var childs, i, iMax;
  3855. if (this.type == 'array') {
  3856. var arr = [];
  3857. this.childs.forEach(function (child) {
  3858. arr.push(child.getValue());
  3859. });
  3860. return arr;
  3861. } else if (this.type == 'object') {
  3862. var obj = {};
  3863. this.childs.forEach(function (child) {
  3864. obj[child.getField()] = child.getValue();
  3865. });
  3866. return obj;
  3867. } else {
  3868. if (this.value === undefined) {
  3869. this._getDomValue();
  3870. }
  3871. return this.value;
  3872. }
  3873. };
  3874. /**
  3875. * Get the nesting level of this node
  3876. * @return {Number} level
  3877. */
  3878. JSONEditor.Node.prototype.getLevel = function () {
  3879. return (this.parent ? this.parent.getLevel() + 1 : 0);
  3880. };
  3881. /**
  3882. * Create a clone of a node
  3883. * The complete state of a clone is copied, including whether it is expanded or
  3884. * not. The DOM elements are not cloned.
  3885. * @return {JSONEditor.Node} clone
  3886. */
  3887. JSONEditor.Node.prototype.clone = function () {
  3888. var clone = new JSONEditor.Node(this.editor);
  3889. clone.type = this.type;
  3890. clone.field = this.field;
  3891. clone.fieldInnerText = this.fieldInnerText;
  3892. clone.fieldEditable = this.fieldEditable;
  3893. clone.value = this.value;
  3894. clone.valueInnerText = this.valueInnerText;
  3895. clone.expanded = this.expanded;
  3896. if (this.childs) {
  3897. // an object or array
  3898. var cloneChilds = [];
  3899. this.childs.forEach(function (child) {
  3900. var childClone = child.clone();
  3901. childClone.setParent(clone);
  3902. cloneChilds.push(childClone);
  3903. });
  3904. clone.childs = cloneChilds;
  3905. } else {
  3906. // a value
  3907. clone.childs = undefined;
  3908. }
  3909. return clone;
  3910. };
  3911. /**
  3912. * Expand this node and optionally its childs.
  3913. * @param {boolean} recurse Optional recursion, true by default. When
  3914. * true, all childs will be expanded recursively
  3915. */
  3916. JSONEditor.Node.prototype.expand = function (recurse) {
  3917. if (!this.childs) {
  3918. return;
  3919. }
  3920. // set this node expanded
  3921. this.expanded = true;
  3922. if (this.dom.expand) {
  3923. this.dom.expand.className = 'jsoneditor-expanded';
  3924. }
  3925. this.showChilds();
  3926. if (recurse != false) {
  3927. this.childs.forEach(function (child) {
  3928. child.expand(recurse);
  3929. });
  3930. }
  3931. };
  3932. /**
  3933. * Collapse this node and optionally its childs.
  3934. * @param {Number} recurse Optional recursion, true by default. When
  3935. * true, all childs will be collapsed recursively
  3936. */
  3937. JSONEditor.Node.prototype.collapse = function (recurse) {
  3938. if (!this.childs) {
  3939. return;
  3940. }
  3941. this.hideChilds();
  3942. // collapse childs in case of recurse
  3943. if (recurse != false) {
  3944. this.childs.forEach(function (child) {
  3945. child.collapse(recurse);
  3946. });
  3947. }
  3948. // make this node collapsed
  3949. if (this.dom.expand) {
  3950. this.dom.expand.className = 'jsoneditor-collapsed';
  3951. }
  3952. this.expanded = false;
  3953. };
  3954. /**
  3955. * Recursively show all childs when they are expanded
  3956. */
  3957. JSONEditor.Node.prototype.showChilds = function () {
  3958. var childs = this.childs;
  3959. if (!childs) {
  3960. return;
  3961. }
  3962. if (!this.expanded) {
  3963. return;
  3964. }
  3965. var tr = this.dom.tr;
  3966. var table = tr ? tr.parentNode : undefined;
  3967. if (table) {
  3968. // show row with append button
  3969. var append = this.getAppend();
  3970. var nextTr = tr.nextSibling;
  3971. if (nextTr) {
  3972. table.insertBefore(append, nextTr);
  3973. } else {
  3974. table.appendChild(append);
  3975. }
  3976. // show childs
  3977. this.childs.forEach(function (child) {
  3978. table.insertBefore(child.getDom(), append);
  3979. child.showChilds();
  3980. });
  3981. }
  3982. };
  3983. /**
  3984. * Hide the node with all its childs
  3985. */
  3986. JSONEditor.Node.prototype.hide = function () {
  3987. var tr = this.dom.tr;
  3988. var table = tr ? tr.parentNode : undefined;
  3989. if (table) {
  3990. table.removeChild(tr);
  3991. }
  3992. this.hideChilds();
  3993. };
  3994. /**
  3995. * Recursively hide all childs
  3996. */
  3997. JSONEditor.Node.prototype.hideChilds = function () {
  3998. var childs = this.childs;
  3999. if (!childs) {
  4000. return;
  4001. }
  4002. if (!this.expanded) {
  4003. return;
  4004. }
  4005. // hide append row
  4006. var append = this.getAppend();
  4007. if (append.parentNode) {
  4008. append.parentNode.removeChild(append);
  4009. }
  4010. // hide childs
  4011. this.childs.forEach(function (child) {
  4012. child.hide();
  4013. });
  4014. };
  4015. /**
  4016. * Add a new child to the node.
  4017. * Only applicable when Node value is of type array or object
  4018. * @param {JSONEditor.Node} node
  4019. */
  4020. JSONEditor.Node.prototype.appendChild = function (node) {
  4021. if (this.type == 'array' || this.type == 'object') {
  4022. // adjust the link to the parent
  4023. node.setParent(this);
  4024. node.fieldEditable = (this.type == 'object');
  4025. if (this.type == 'array') {
  4026. node.index = this.childs.length;
  4027. }
  4028. this.childs.push(node);
  4029. if (this.expanded) {
  4030. // insert into the DOM, before the appendRow
  4031. var newtr = node.getDom();
  4032. var appendTr = this.getAppend();
  4033. var table = appendTr ? appendTr.parentNode : undefined;
  4034. if (appendTr && table) {
  4035. table.insertBefore(newtr, appendTr);
  4036. }
  4037. node.showChilds();
  4038. }
  4039. this.updateDom({
  4040. 'updateIndexes': true
  4041. });
  4042. node.updateDom({
  4043. 'recurse': true
  4044. });
  4045. }
  4046. };
  4047. /**
  4048. * Move a node from its current parent to this node
  4049. * Only applicable when Node value is of type array or object
  4050. * @param {JSONEditor.Node} node
  4051. * @param {JSONEditor.Node} beforeNode
  4052. */
  4053. JSONEditor.Node.prototype.moveBefore = function (node, beforeNode) {
  4054. if (this.type == 'array' || this.type == 'object') {
  4055. // create a temporary row, to prevent the scroll position from jumping
  4056. // when removing the node
  4057. var tbody = (this.dom.tr) ? this.dom.tr.parentNode : undefined;
  4058. if (tbody) {
  4059. var trTemp = document.createElement('tr');
  4060. trTemp.style.height = tbody.clientHeight + 'px';
  4061. tbody.appendChild(trTemp);
  4062. }
  4063. var parent = node.getParent();
  4064. if (parent) {
  4065. parent.removeChild(node);
  4066. }
  4067. if (beforeNode instanceof JSONEditor.AppendNode) {
  4068. this.appendChild(node);
  4069. } else {
  4070. this.insertBefore(node, beforeNode);
  4071. }
  4072. if (tbody) {
  4073. tbody.removeChild(trTemp);
  4074. }
  4075. }
  4076. };
  4077. /**
  4078. * Move a node from its current parent to this node
  4079. * Only applicable when Node value is of type array or object.
  4080. * If index is out of range, the node will be appended to the end
  4081. * @param {JSONEditor.Node} node
  4082. * @param {Number} index
  4083. */
  4084. JSONEditor.Node.prototype.moveTo = function (node, index) {
  4085. if (node.parent == this) {
  4086. // same parent
  4087. var currentIndex = this.childs.indexOf(node);
  4088. if (currentIndex < index) {
  4089. // compensate the index for removal of the node itself
  4090. index++;
  4091. }
  4092. }
  4093. var beforeNode = this.childs[index] || this.append;
  4094. this.moveBefore(node, beforeNode);
  4095. };
  4096. /**
  4097. * Insert a new child before a given node
  4098. * Only applicable when Node value is of type array or object
  4099. * @param {JSONEditor.Node} node
  4100. * @param {JSONEditor.Node} beforeNode
  4101. */
  4102. JSONEditor.Node.prototype.insertBefore = function (node, beforeNode) {
  4103. if (this.type == 'array' || this.type == 'object') {
  4104. if (beforeNode == this.append) {
  4105. // append to the child nodes
  4106. // adjust the link to the parent
  4107. node.setParent(this);
  4108. node.fieldEditable = (this.type == 'object');
  4109. this.childs.push(node);
  4110. } else {
  4111. // insert before a child node
  4112. var index = this.childs.indexOf(beforeNode);
  4113. if (index == -1) {
  4114. throw new Error('节点未找到.');
  4115. }
  4116. // adjust the link to the parent
  4117. node.setParent(this);
  4118. node.fieldEditable = (this.type == 'object');
  4119. this.childs.splice(index, 0, node);
  4120. }
  4121. if (this.expanded) {
  4122. // insert into the DOM
  4123. var newTr = node.getDom();
  4124. var nextTr = beforeNode.getDom();
  4125. var table = nextTr ? nextTr.parentNode : undefined;
  4126. if (nextTr && table) {
  4127. table.insertBefore(newTr, nextTr);
  4128. }
  4129. node.showChilds();
  4130. }
  4131. this.updateDom({
  4132. 'updateIndexes': true
  4133. });
  4134. node.updateDom({
  4135. 'recurse': true
  4136. });
  4137. }
  4138. };
  4139. /**
  4140. * Search in this node
  4141. * The node will be expanded when the text is found one of its childs, else
  4142. * it will be collapsed. Searches are case insensitive.
  4143. * @param {String} text
  4144. * @return {JSONEditor.Node[]} results Array with nodes containing the search text
  4145. */
  4146. JSONEditor.Node.prototype.search = function (text) {
  4147. var results = [];
  4148. var index;
  4149. var search = text ? text.toLowerCase() : undefined;
  4150. // delete old search data
  4151. delete this.searchField;
  4152. delete this.searchValue;
  4153. // search in field
  4154. if (this.field != undefined) {
  4155. var field = String(this.field).toLowerCase();
  4156. index = field.indexOf(search);
  4157. if (index != -1) {
  4158. this.searchField = true;
  4159. results.push({
  4160. 'node': this,
  4161. 'elem': 'field'
  4162. });
  4163. }
  4164. // update dom
  4165. this._updateDomField();
  4166. }
  4167. // search in value
  4168. if (this.type == 'array' || this.type == 'object') {
  4169. // array, object
  4170. // search the nodes childs
  4171. if (this.childs) {
  4172. var childResults = [];
  4173. this.childs.forEach(function (child) {
  4174. childResults = childResults.concat(child.search(text));
  4175. });
  4176. results = results.concat(childResults);
  4177. }
  4178. // update dom
  4179. if (search != undefined) {
  4180. var recurse = false;
  4181. if (childResults.length == 0) {
  4182. this.collapse(recurse);
  4183. } else {
  4184. this.expand(recurse);
  4185. }
  4186. }
  4187. } else {
  4188. // string, auto
  4189. if (this.value != undefined) {
  4190. var value = String(this.value).toLowerCase();
  4191. index = value.indexOf(search);
  4192. if (index != -1) {
  4193. this.searchValue = true;
  4194. results.push({
  4195. 'node': this,
  4196. 'elem': 'value'
  4197. });
  4198. }
  4199. }
  4200. // update dom
  4201. this._updateDomValue();
  4202. }
  4203. return results;
  4204. };
  4205. /**
  4206. * Move the scroll position such that this node is in the visible area.
  4207. * The node will not get the focus
  4208. */
  4209. JSONEditor.Node.prototype.scrollTo = function () {
  4210. if (!this.dom.tr || !this.dom.tr.parentNode) {
  4211. // if the node is not visible, expand its parents
  4212. var parent = this.parent;
  4213. var recurse = false;
  4214. while (parent) {
  4215. parent.expand(recurse);
  4216. parent = parent.parent;
  4217. }
  4218. }
  4219. if (this.dom.tr && this.dom.tr.parentNode) {
  4220. this.editor.scrollTo(this.dom.tr.offsetTop);
  4221. }
  4222. };
  4223. /**
  4224. * Set focus to the value of this node
  4225. * @param {String} [field] The field name of the element to get the focus
  4226. * available values: 'field', 'value'
  4227. */
  4228. JSONEditor.Node.prototype.focus = function (field) {
  4229. if (this.dom.tr && this.dom.tr.parentNode) {
  4230. if (field != 'value' && this.fieldEditable) {
  4231. var domField = this.dom.field;
  4232. if (domField) {
  4233. domField.focus();
  4234. }
  4235. } else {
  4236. var domValue = this.dom.value;
  4237. if (domValue) {
  4238. domValue.focus();
  4239. }
  4240. }
  4241. }
  4242. };
  4243. /**
  4244. * Update the values from the DOM field and value of this node
  4245. */
  4246. JSONEditor.Node.prototype.blur = function () {
  4247. // retrieve the actual field and value from the DOM.
  4248. this._getDomValue(false);
  4249. this._getDomField(false);
  4250. };
  4251. /**
  4252. * Duplicate given child node
  4253. * new structure will be added right before the cloned node
  4254. * @param {JSONEditor.Node} node the childNode to be duplicated
  4255. * @return {JSONEditor.Node} clone the clone of the node
  4256. * @private
  4257. */
  4258. JSONEditor.Node.prototype._duplicate = function (node) {
  4259. var clone = node.clone();
  4260. /* TODO: adjust the field name (to prevent equal field names)
  4261. if (this.type == 'object') {
  4262. }
  4263. */
  4264. // TODO: insert after instead of insert before
  4265. this.insertBefore(clone, node);
  4266. return clone;
  4267. };
  4268. /**
  4269. * Check if given node is a child. The method will check recursively to find
  4270. * this node.
  4271. * @param {JSONEditor.Node} node
  4272. * @return {boolean} containsNode
  4273. */
  4274. JSONEditor.Node.prototype.containsNode = function (node) {
  4275. if (this == node) {
  4276. return true;
  4277. }
  4278. var childs = this.childs;
  4279. if (childs) {
  4280. // TOOD: use the js5 Array.some() here?
  4281. for (var i = 0, iMax = childs.length; i < iMax; i++) {
  4282. if (childs[i].containsNode(node)) {
  4283. return true;
  4284. }
  4285. }
  4286. }
  4287. return false;
  4288. };
  4289. /**
  4290. * Move given node into this node
  4291. * @param {JSONEditor.Node} node the childNode to be moved
  4292. * @param {JSONEditor.Node} beforeNode node will be inserted before given
  4293. * node. If no beforeNode is given,
  4294. * the node is appended at the end
  4295. * @private
  4296. */
  4297. JSONEditor.Node.prototype._move = function (node, beforeNode) {
  4298. if (node == beforeNode) {
  4299. // nothing to do...
  4300. return;
  4301. }
  4302. // check if this node is not a child of the node to be moved here
  4303. if (node.containsNode(this)) {
  4304. throw new Error('不能把区域移动到自身的子节点.');
  4305. }
  4306. // remove the original node
  4307. if (node.parent) {
  4308. node.parent.removeChild(node);
  4309. }
  4310. // create a clone of the node
  4311. var clone = node.clone();
  4312. node.clearDom();
  4313. // insert or append the node
  4314. if (beforeNode) {
  4315. this.insertBefore(clone, beforeNode);
  4316. } else {
  4317. this.appendChild(clone);
  4318. }
  4319. /* TODO: adjust the field name (to prevent equal field names)
  4320. if (this.type == 'object') {
  4321. }
  4322. */
  4323. };
  4324. /**
  4325. * Remove a child from the node.
  4326. * Only applicable when Node value is of type array or object
  4327. * @param {JSONEditor.Node} node The child node to be removed;
  4328. * @return {JSONEditor.Node | undefined} node The removed node on success,
  4329. * else undefined
  4330. */
  4331. JSONEditor.Node.prototype.removeChild = function (node) {
  4332. if (this.childs) {
  4333. var index = this.childs.indexOf(node);
  4334. if (index != -1) {
  4335. node.hide();
  4336. // delete old search results
  4337. delete node.searchField;
  4338. delete node.searchValue;
  4339. var removedNode = this.childs.splice(index, 1)[0];
  4340. this.updateDom({
  4341. 'updateIndexes': true
  4342. });
  4343. return removedNode;
  4344. }
  4345. }
  4346. return undefined;
  4347. };
  4348. /**
  4349. * Remove a child node node from this node
  4350. * This method is equal to Node.removeChild, except that _remove firex an
  4351. * onChange event.
  4352. * @param {JSONEditor.Node} node
  4353. * @private
  4354. */
  4355. JSONEditor.Node.prototype._remove = function (node) {
  4356. this.removeChild(node);
  4357. };
  4358. /**
  4359. * Change the type of the value of this Node
  4360. * @param {String} newType
  4361. */
  4362. JSONEditor.Node.prototype.changeType = function (newType) {
  4363. var oldType = this.type;
  4364. if ((newType == 'string' || newType == 'auto') && (oldType == 'string' || oldType == 'auto')) {
  4365. // this is an easy change
  4366. this.type = newType;
  4367. } else {
  4368. // change from array to object, or from string/auto to object/array
  4369. var table = this.dom.tr ? this.dom.tr.parentNode : undefined;
  4370. var lastTr;
  4371. if (this.expanded) {
  4372. lastTr = this.getAppend();
  4373. } else {
  4374. lastTr = this.getDom();
  4375. }
  4376. var nextTr = (lastTr && lastTr.parentNode) ? lastTr.nextSibling : undefined;
  4377. // hide current field and all its childs
  4378. this.hide();
  4379. this.clearDom();
  4380. // adjust the field and the value
  4381. this.type = newType;
  4382. // adjust childs
  4383. if (newType == 'object') {
  4384. if (!this.childs) {
  4385. this.childs = [];
  4386. }
  4387. this.childs.forEach(function (child, index) {
  4388. child.clearDom();
  4389. delete child.index;
  4390. child.fieldEditable = true;
  4391. if (child.field == undefined) {
  4392. child.field = index;
  4393. }
  4394. });
  4395. if (oldType == 'string' || oldType == 'auto') {
  4396. this.expanded = true;
  4397. }
  4398. } else if (newType == 'array') {
  4399. if (!this.childs) {
  4400. this.childs = [];
  4401. }
  4402. this.childs.forEach(function (child, index) {
  4403. child.clearDom();
  4404. child.fieldEditable = false;
  4405. child.index = index;
  4406. });
  4407. if (oldType == 'string' || oldType == 'auto') {
  4408. this.expanded = true;
  4409. }
  4410. } else {
  4411. this.expanded = false;
  4412. }
  4413. // create new DOM
  4414. if (table) {
  4415. if (nextTr) {
  4416. table.insertBefore(this.getDom(), nextTr);
  4417. } else {
  4418. table.appendChild(this.getDom());
  4419. }
  4420. }
  4421. this.showChilds();
  4422. }
  4423. if (newType == 'auto' || newType == 'string') {
  4424. // cast value to the correct type
  4425. if (newType == 'string') {
  4426. this.value = String(this.value);
  4427. } else {
  4428. this.value = this._stringCast(String(this.value));
  4429. }
  4430. this.focus();
  4431. }
  4432. this.updateDom({
  4433. 'updateIndexes': true
  4434. });
  4435. };
  4436. /**
  4437. * Retrieve value from DOM
  4438. * @param {boolean} silent. If true (default), no errors will be thrown in
  4439. * case of invalid data
  4440. * @private
  4441. */
  4442. JSONEditor.Node.prototype._getDomValue = function (silent) {
  4443. if (this.dom.value && this.type != 'array' && this.type != 'object') {
  4444. this.valueInnerText = JSONEditor.getInnerText(this.dom.value);
  4445. }
  4446. if (this.valueInnerText != undefined) {
  4447. try {
  4448. // retrieve the value
  4449. var value;
  4450. if (this.type == 'string') {
  4451. value = this._unescapeHTML(this.valueInnerText);
  4452. } else {
  4453. var str = this._unescapeHTML(this.valueInnerText);
  4454. value = this._stringCast(str);
  4455. }
  4456. if (value !== this.value) {
  4457. var oldValue = this.value;
  4458. this.value = value;
  4459. this.editor.onAction('editValue', {
  4460. 'node': this,
  4461. 'oldValue': oldValue,
  4462. 'newValue': value
  4463. });
  4464. }
  4465. } catch (err) {
  4466. this.value = undefined;
  4467. // TODO: sent an action with the new, invalid value?
  4468. if (silent != true) {
  4469. throw err;
  4470. }
  4471. }
  4472. }
  4473. };
  4474. /**
  4475. * Update dom value:
  4476. * - the text color of the value, depending on the type of the value
  4477. * - the height of the field, depending on the width
  4478. * - background color in case it is empty
  4479. * @private
  4480. */
  4481. JSONEditor.Node.prototype._updateDomValue = function () {
  4482. var domValue = this.dom.value;
  4483. if (domValue) {
  4484. // set text color depending on value type
  4485. var v = this.value;
  4486. var t = (this.type == 'auto') ? typeof (v) : this.type;
  4487. var color = '';
  4488. if (t == 'string') {
  4489. color = 'green';
  4490. } else if (t == 'number') {
  4491. color = 'red';
  4492. } else if (t == 'boolean') {
  4493. color = 'blue';
  4494. } else if (this.type == 'object' || this.type == 'array') {
  4495. // note: typeof(null)=="object", therefore check this.type instead of t
  4496. color = '';
  4497. } else if (v === null) {
  4498. color = 'purple';
  4499. } else if (v === undefined) {
  4500. // invalid value
  4501. color = 'green';
  4502. }
  4503. domValue.style.color = color;
  4504. // make backgound color lightgray when empty
  4505. var isEmpty = (String(this.value) == '' && this.type != 'array' && this.type != 'object');
  4506. if (isEmpty) {
  4507. JSONEditor.addClassName(domValue, 'jsoneditor-empty');
  4508. } else {
  4509. JSONEditor.removeClassName(domValue, 'jsoneditor-empty');
  4510. }
  4511. // highlight when there is a search result
  4512. if (this.searchValueActive) {
  4513. JSONEditor.addClassName(domValue, 'jsoneditor-search-highlight-active');
  4514. } else {
  4515. JSONEditor.removeClassName(domValue, 'jsoneditor-search-highlight-active');
  4516. }
  4517. if (this.searchValue) {
  4518. JSONEditor.addClassName(domValue, 'jsoneditor-search-highlight');
  4519. } else {
  4520. JSONEditor.removeClassName(domValue, 'jsoneditor-search-highlight');
  4521. }
  4522. // strip formatting from the contents of the editable div
  4523. JSONEditor.stripFormatting(domValue);
  4524. }
  4525. };
  4526. /**
  4527. * Update dom field:
  4528. * - the text color of the field, depending on the text
  4529. * - the height of the field, depending on the width
  4530. * - background color in case it is empty
  4531. * @private
  4532. */
  4533. JSONEditor.Node.prototype._updateDomField = function () {
  4534. var domField = this.dom.field;
  4535. if (domField) {
  4536. // make backgound color lightgray when empty
  4537. var isEmpty = (String(this.field) == '');
  4538. if (isEmpty) {
  4539. JSONEditor.addClassName(domField, 'jsoneditor-empty');
  4540. } else {
  4541. JSONEditor.removeClassName(domField, 'jsoneditor-empty');
  4542. }
  4543. // highlight when there is a search result
  4544. if (this.searchFieldActive) {
  4545. JSONEditor.addClassName(domField, 'jsoneditor-search-highlight-active');
  4546. } else {
  4547. JSONEditor.removeClassName(domField, 'jsoneditor-search-highlight-active');
  4548. }
  4549. if (this.searchField) {
  4550. JSONEditor.addClassName(domField, 'jsoneditor-search-highlight');
  4551. } else {
  4552. JSONEditor.removeClassName(domField, 'jsoneditor-search-highlight');
  4553. }
  4554. // strip formatting from the contents of the editable div
  4555. JSONEditor.stripFormatting(domField);
  4556. }
  4557. };
  4558. /**
  4559. * Retrieve field from DOM
  4560. * @param {boolean} silent. If true (default), no errors will be thrown in
  4561. * case of invalid data
  4562. * @private
  4563. */
  4564. JSONEditor.Node.prototype._getDomField = function (silent) {
  4565. if (this.dom.field && this.fieldEditable) {
  4566. this.fieldInnerText = JSONEditor.getInnerText(this.dom.field);
  4567. }
  4568. if (this.fieldInnerText != undefined) {
  4569. try {
  4570. var field = this._unescapeHTML(this.fieldInnerText);
  4571. if (field !== this.field) {
  4572. var oldField = this.field;
  4573. this.field = field;
  4574. this.editor.onAction('editField', {
  4575. 'node': this,
  4576. 'oldValue': oldField,
  4577. 'newValue': field
  4578. });
  4579. }
  4580. } catch (err) {
  4581. this.field = undefined;
  4582. // TODO: sent an action here, with the new, invalid value?
  4583. if (silent != true) {
  4584. throw err;
  4585. }
  4586. }
  4587. }
  4588. };
  4589. /**
  4590. * Clear the dom of the node
  4591. */
  4592. JSONEditor.Node.prototype.clearDom = function () {
  4593. // TODO: hide the node first?
  4594. //this.hide();
  4595. // TOOD: recursively clear dom?
  4596. this.dom = {};
  4597. };
  4598. /**
  4599. * Get the HTML DOM TR element of the node.
  4600. * The dom will be generated when not yet created
  4601. * @return {Element} tr HTML DOM TR Element
  4602. */
  4603. JSONEditor.Node.prototype.getDom = function () {
  4604. var dom = this.dom;
  4605. if (dom.tr) {
  4606. return dom.tr;
  4607. }
  4608. // create row
  4609. dom.tr = document.createElement('tr');
  4610. dom.tr.className = 'jsoneditor-tr';
  4611. dom.tr.node = this;
  4612. if (this.editor.editable) {
  4613. // create draggable area
  4614. var tdDrag = document.createElement('td');
  4615. tdDrag.className = 'jsoneditor-td';
  4616. dom.drag = this._createDomDragArea();
  4617. if (dom.drag) {
  4618. tdDrag.appendChild(dom.drag);
  4619. }
  4620. dom.tr.appendChild(tdDrag);
  4621. }
  4622. // create tree and field
  4623. var tdField = document.createElement('td');
  4624. tdField.className = 'jsoneditor-td';
  4625. dom.tr.appendChild(tdField);
  4626. dom.expand = this._createDomExpandButton();
  4627. dom.field = this._createDomField();
  4628. dom.value = this._createDomValue();
  4629. dom.tree = this._createDomTree(dom.expand, dom.field, dom.value);
  4630. tdField.appendChild(dom.tree);
  4631. if (this.editor.editable) {
  4632. // create type select box
  4633. var tdType = document.createElement('td');
  4634. tdType.className = 'jsoneditor-td jsoneditor-td-edit';
  4635. dom.tr.appendChild(tdType);
  4636. dom.type = this._createDomTypeButton();
  4637. tdType.appendChild(dom.type);
  4638. // create duplicate button
  4639. var tdDuplicate = document.createElement('td');
  4640. tdDuplicate.className = 'jsoneditor-td jsoneditor-td-edit';
  4641. dom.tr.appendChild(tdDuplicate);
  4642. dom.duplicate = this._createDomDuplicateButton();
  4643. if (dom.duplicate) {
  4644. tdDuplicate.appendChild(dom.duplicate);
  4645. }
  4646. // create remove button
  4647. var tdRemove = document.createElement('td');
  4648. tdRemove.className = 'jsoneditor-td jsoneditor-td-edit';
  4649. dom.tr.appendChild(tdRemove);
  4650. dom.remove = this._createDomRemoveButton();
  4651. if (dom.remove) {
  4652. tdRemove.appendChild(dom.remove);
  4653. }
  4654. }
  4655. this.updateDom(); // TODO: recurse here?
  4656. return dom.tr;
  4657. };
  4658. /**
  4659. * DragStart event, fired on mousedown on the dragarea at the left side of a Node
  4660. * @param {Event} event
  4661. * @private
  4662. */
  4663. JSONEditor.Node.prototype._onDragStart = function (event) {
  4664. event = event || window.event;
  4665. var node = this;
  4666. if (!this.mousemove) {
  4667. this.mousemove = JSONEditor.Events.addEventListener(document, 'mousemove',
  4668. function (event) {
  4669. node._onDrag(event);
  4670. });
  4671. }
  4672. if (!this.mouseup) {
  4673. this.mouseup = JSONEditor.Events.addEventListener(document, 'mouseup',
  4674. function (event) {
  4675. node._onDragEnd(event);
  4676. });
  4677. }
  4678. /* TODO: correct highlighting when the TypeDropDown is visible (And has highlighting locked)
  4679. if (JSONEditor.freezeHighlight) {
  4680. console.log('heee');
  4681. JSONEditor.freezeHighlight = false;
  4682. this.setHighlight(true);
  4683. }
  4684. */
  4685. JSONEditor.freezeHighlight = true;
  4686. this.drag = {
  4687. 'oldCursor': document.body.style.cursor,
  4688. 'startParent': this.parent,
  4689. 'startIndex': this.parent.childs.indexOf(this)
  4690. };
  4691. document.body.style.cursor = 'move';
  4692. JSONEditor.Events.preventDefault(event);
  4693. };
  4694. /**
  4695. * Drag event, fired when moving the mouse while dragging a Node
  4696. * @param {Event} event
  4697. * @private
  4698. */
  4699. JSONEditor.Node.prototype._onDrag = function (event) {
  4700. event = event || window.event;
  4701. var trThis = this.dom.tr;
  4702. // TODO: add an ESC option, which resets to the original position
  4703. var topThis = JSONEditor.getAbsoluteTop(trThis);
  4704. var heightThis = trThis.offsetHeight;
  4705. var mouseY = event.pageY || (event.clientY + document.body.scrollTop);
  4706. if (mouseY < topThis) {
  4707. // move up
  4708. var trPrev = trThis.previousSibling;
  4709. var topPrev = JSONEditor.getAbsoluteTop(trPrev);
  4710. var nodePrev = JSONEditor.getNodeFromTarget(trPrev);
  4711. while (trPrev && mouseY < topPrev) {
  4712. nodePrev = JSONEditor.getNodeFromTarget(trPrev);
  4713. trPrev = trPrev.previousSibling;
  4714. topPrev = JSONEditor.getAbsoluteTop(trPrev);
  4715. }
  4716. if (nodePrev) {
  4717. trPrev = nodePrev.dom.tr;
  4718. topPrev = JSONEditor.getAbsoluteTop(trPrev);
  4719. if (mouseY > topPrev + heightThis) {
  4720. nodePrev = undefined;
  4721. }
  4722. }
  4723. if (nodePrev && nodePrev.parent) {
  4724. nodePrev.parent.moveBefore(this, nodePrev);
  4725. }
  4726. } else {
  4727. // move down
  4728. var trLast = (this.expanded && this.append) ? this.append.getDom() : this.dom.tr;
  4729. var trFirst = trLast ? trLast.nextSibling : undefined;
  4730. if (trFirst) {
  4731. var topFirst = JSONEditor.getAbsoluteTop(trFirst);
  4732. var nodeNext = undefined;
  4733. var trNext = trFirst.nextSibling;
  4734. var topNext = JSONEditor.getAbsoluteTop(trNext);
  4735. var heightNext = trNext ? (topNext - topFirst) : 0;
  4736. while (trNext && mouseY > topThis + heightNext) {
  4737. nodeNext = JSONEditor.getNodeFromTarget(trNext);
  4738. trNext = trNext.nextSibling;
  4739. topNext = JSONEditor.getAbsoluteTop(trNext);
  4740. heightNext = trNext ? (topNext - topFirst) : 0;
  4741. }
  4742. if (nodeNext && nodeNext.parent) {
  4743. nodeNext.parent.moveBefore(this, nodeNext);
  4744. }
  4745. }
  4746. }
  4747. JSONEditor.Events.preventDefault(event);
  4748. };
  4749. /**
  4750. * Drag event, fired on mouseup after having dragged a node
  4751. * @param {Event} event
  4752. * @private
  4753. */
  4754. JSONEditor.Node.prototype._onDragEnd = function (event) {
  4755. event = event || window.event;
  4756. var params = {
  4757. 'node': this,
  4758. 'startParent': this.drag.startParent,
  4759. 'startIndex': this.drag.startIndex,
  4760. 'endParent': this.parent,
  4761. 'endIndex': this.parent.childs.indexOf(this)
  4762. };
  4763. if ((params.startParent != params.endParent) || (params.startIndex != params.endIndex)) {
  4764. // only register this action if the node is actually moved to another place
  4765. this.editor.onAction('moveNode', params);
  4766. }
  4767. document.body.style.cursor = this.drag.oldCursor;
  4768. delete JSONEditor.freezeHighlight;
  4769. delete this.drag;
  4770. this.setHighlight(false);
  4771. if (this.mousemove) {
  4772. JSONEditor.Events.removeEventListener(document, 'mousemove', this.mousemove);
  4773. delete this.mousemove;
  4774. }
  4775. if (this.mouseup) {
  4776. JSONEditor.Events.removeEventListener(document, 'mouseup', this.mouseup);
  4777. delete this.mouseup;
  4778. }
  4779. JSONEditor.Events.preventDefault(event);
  4780. };
  4781. /**
  4782. * Create a drag area, displayed at the left side of the node
  4783. * @return {Element | undefined} domDrag
  4784. * @private
  4785. */
  4786. JSONEditor.Node.prototype._createDomDragArea = function () {
  4787. if (!this.parent) {
  4788. return undefined;
  4789. }
  4790. var domDrag = document.createElement('button');
  4791. domDrag.className = 'jsoneditor-dragarea';
  4792. domDrag.title = 'Move field (drag and drop)';
  4793. return domDrag;
  4794. };
  4795. /**
  4796. * Create an editable field
  4797. * @return {Element} domField
  4798. * @private
  4799. */
  4800. JSONEditor.Node.prototype._createDomField = function () {
  4801. return document.createElement('div');
  4802. };
  4803. /**
  4804. * Set highlighting for this node and all its childs.
  4805. * Only applied to the currently visible (expanded childs)
  4806. * @param {boolean} highlight
  4807. */
  4808. JSONEditor.Node.prototype.setHighlight = function (highlight) {
  4809. if (JSONEditor.freezeHighlight) {
  4810. return;
  4811. }
  4812. if (this.dom.tr) {
  4813. this.dom.tr.className = 'jsoneditor-tr' + (highlight ? ' jsoneditor-tr-highlight' : '');
  4814. if (this.append) {
  4815. this.append.setHighlight(highlight);
  4816. }
  4817. if (this.childs) {
  4818. this.childs.forEach(function (child) {
  4819. child.setHighlight(highlight);
  4820. });
  4821. }
  4822. }
  4823. };
  4824. /**
  4825. * Update the value of the node. Only primitive types are allowed, no Object
  4826. * or Array is allowed.
  4827. * @param {String | Number | Boolean | null} value
  4828. */
  4829. JSONEditor.Node.prototype.updateValue = function (value) {
  4830. this.value = value;
  4831. this.updateDom();
  4832. };
  4833. /**
  4834. * Update the field of the node.
  4835. * @param {String} field
  4836. */
  4837. JSONEditor.Node.prototype.updateField = function (field) {
  4838. this.field = field;
  4839. this.updateDom();
  4840. };
  4841. /**
  4842. * Update the HTML DOM, optionally recursing through the childs
  4843. * @param {Object} [options] Available parameters:
  4844. * {boolean} [recurse] If true, the
  4845. * DOM of the childs will be updated recursively.
  4846. * False by default.
  4847. * {boolean} [updateIndexes] If true, the childs
  4848. * indexes of the node will be updated too. False by
  4849. * default.
  4850. */
  4851. JSONEditor.Node.prototype.updateDom = function (options) {
  4852. // update level indentation
  4853. var domTree = this.dom.tree;
  4854. if (domTree) {
  4855. domTree.style.marginLeft = this.getLevel() * 24 + 'px';
  4856. }
  4857. // update field
  4858. var domField = this.dom.field;
  4859. if (domField) {
  4860. if (this.fieldEditable == true) {
  4861. // parent is an object
  4862. domField.contentEditable = this.editor.editable;
  4863. domField.spellcheck = false;
  4864. domField.className = 'jsoneditor-field';
  4865. } else {
  4866. // parent is an array this is the root node
  4867. domField.className = 'jsoneditor-readonly';
  4868. }
  4869. var field;
  4870. if (this.index != undefined) {
  4871. field = this.index;
  4872. } else if (this.field != undefined) {
  4873. field = this.field;
  4874. } else if (this.type == 'array' || this.type == 'object') {
  4875. field = this.type;
  4876. } else {
  4877. field = 'field';
  4878. }
  4879. domField.innerHTML = this._escapeHTML(field);
  4880. }
  4881. // update value
  4882. var domValue = this.dom.value;
  4883. if (domValue) {
  4884. var count = this.childs ? this.childs.length : 0;
  4885. if (this.type == 'array') {
  4886. domValue.innerHTML = '[' + count + ']';
  4887. domValue.title = this.type + ' containing ' + count + ' items';
  4888. } else if (this.type == 'object') {
  4889. domValue.innerHTML = '{' + count + '}';
  4890. domValue.title = this.type + ' containing ' + count + ' items';
  4891. } else {
  4892. domValue.innerHTML = this._escapeHTML(this.value);
  4893. delete domValue.title;
  4894. }
  4895. }
  4896. // update field and value
  4897. this._updateDomField();
  4898. this._updateDomValue();
  4899. // update childs indexes
  4900. if (options && options.updateIndexes == true) {
  4901. // updateIndexes is true or undefined
  4902. this._updateDomIndexes();
  4903. }
  4904. if (options && options.recurse == true) {
  4905. // recurse is true or undefined. update childs recursively
  4906. if (this.childs) {
  4907. this.childs.forEach(function (child) {
  4908. child.updateDom(options);
  4909. });
  4910. }
  4911. // update row with append button
  4912. if (this.append) {
  4913. this.append.updateDom();
  4914. }
  4915. }
  4916. };
  4917. /**
  4918. * Update the DOM of the childs of a node: update indexes and undefined field
  4919. * names.
  4920. * Only applicable when structure is an array or object
  4921. * @private
  4922. */
  4923. JSONEditor.Node.prototype._updateDomIndexes = function () {
  4924. var domValue = this.dom.value;
  4925. var childs = this.childs;
  4926. if (domValue && childs) {
  4927. if (this.type == 'array') {
  4928. childs.forEach(function (child, index) {
  4929. child.index = index;
  4930. var childField = child.dom.field;
  4931. if (childField) {
  4932. childField.innerHTML = index;
  4933. }
  4934. });
  4935. } else if (this.type == 'object') {
  4936. childs.forEach(function (child) {
  4937. if (child.index != undefined) {
  4938. delete child.index;
  4939. if (child.field == undefined) {
  4940. child.field = 'field';
  4941. }
  4942. }
  4943. });
  4944. }
  4945. }
  4946. };
  4947. /**
  4948. * Create an editable value
  4949. * @private
  4950. */
  4951. JSONEditor.Node.prototype._createDomValue = function () {
  4952. var domValue;
  4953. if (this.type == 'array') {
  4954. domValue = document.createElement('div');
  4955. domValue.className = 'jsoneditor-readonly';
  4956. domValue.innerHTML = '[...]';
  4957. } else if (this.type == 'object') {
  4958. domValue = document.createElement('div');
  4959. domValue.className = 'jsoneditor-readonly';
  4960. domValue.innerHTML = '{...}';
  4961. } else if (this.type == 'string') {
  4962. domValue = document.createElement('div');
  4963. domValue.contentEditable = this.editor.editable;
  4964. domValue.spellcheck = false;
  4965. domValue.className = 'jsoneditor-value';
  4966. domValue.innerHTML = this._escapeHTML(this.value);
  4967. } else {
  4968. domValue = document.createElement('div');
  4969. domValue.contentEditable = this.editor.editable;
  4970. domValue.spellcheck = false;
  4971. domValue.className = 'jsoneditor-value';
  4972. domValue.innerHTML = this._escapeHTML(this.value);
  4973. }
  4974. // TODO: in FF spel/check of editable divs is done via the body. quite ugly
  4975. // document.body.spellcheck = false;
  4976. return domValue;
  4977. };
  4978. /**
  4979. * Create an expand/collapse button
  4980. * @return {Element} expand
  4981. * @private
  4982. */
  4983. JSONEditor.Node.prototype._createDomExpandButton = function () {
  4984. // create expand button
  4985. var expand = document.createElement('button');
  4986. var expandable = (this.type == 'array' || this.type == 'object');
  4987. if (expandable) {
  4988. expand.className = this.expanded ? 'jsoneditor-expanded' : 'jsoneditor-collapsed';
  4989. expand.title =
  4990. 'Click to expand/collapse this field. \n' +
  4991. 'Ctrl+Click to expand/collapse including all childs.';
  4992. } else {
  4993. expand.className = 'jsoneditor-invisible';
  4994. expand.title = '';
  4995. }
  4996. return expand;
  4997. };
  4998. /**
  4999. * Create a DOM tree element, containing the expand/collapse button
  5000. * @param {Element} domExpand
  5001. * @param {Element} domField
  5002. * @param {Element} domValue
  5003. * @return {Element} domTree
  5004. * @private
  5005. */
  5006. JSONEditor.Node.prototype._createDomTree = function (domExpand, domField, domValue) {
  5007. var dom = this.dom;
  5008. var domTree = document.createElement('table');
  5009. var tbody = document.createElement('tbody');
  5010. domTree.style.borderCollapse = 'collapse'; // TODO: put in css
  5011. domTree.appendChild(tbody);
  5012. var tr = document.createElement('tr');
  5013. tbody.appendChild(tr);
  5014. // create expand button
  5015. var tdExpand = document.createElement('td');
  5016. tdExpand.className = 'jsoneditor-td-tree';
  5017. tr.appendChild(tdExpand);
  5018. tdExpand.appendChild(domExpand);
  5019. dom.tdExpand = tdExpand;
  5020. // add the field
  5021. var tdField = document.createElement('td');
  5022. tdField.className = 'jsoneditor-td-tree';
  5023. tr.appendChild(tdField);
  5024. tdField.appendChild(domField);
  5025. dom.tdField = tdField;
  5026. // add a separator
  5027. var tdSeparator = document.createElement('td');
  5028. tdSeparator.className = 'jsoneditor-td-tree';
  5029. tr.appendChild(tdSeparator);
  5030. if (this.type != 'object' && this.type != 'array') {
  5031. tdSeparator.appendChild(document.createTextNode(':'));
  5032. tdSeparator.className = 'jsoneditor-separator';
  5033. }
  5034. dom.tdSeparator = tdSeparator;
  5035. // add the value
  5036. var tdValue = document.createElement('td');
  5037. tdValue.className = 'jsoneditor-td-tree';
  5038. tr.appendChild(tdValue);
  5039. tdValue.appendChild(domValue);
  5040. dom.tdValue = tdValue;
  5041. return domTree;
  5042. };
  5043. /**
  5044. * Handle an event. The event is catched centrally by the editor
  5045. * @param {Event} event
  5046. */
  5047. JSONEditor.Node.prototype.onEvent = function (event) {
  5048. var type = event.type;
  5049. var target = event.target || event.srcElement;
  5050. var dom = this.dom;
  5051. var node = this;
  5052. var expandable = (this.type == 'array' || this.type == 'object');
  5053. // value events
  5054. var domValue = dom.value;
  5055. if (target == domValue) {
  5056. switch (type) {
  5057. case 'focus':
  5058. JSONEditor.focusNode = this;
  5059. break;
  5060. case 'blur':
  5061. case 'change':
  5062. this._getDomValue(true);
  5063. this._updateDomValue();
  5064. if (this.value) {
  5065. domValue.innerHTML = this._escapeHTML(this.value);
  5066. }
  5067. break;
  5068. case 'keyup':
  5069. this._getDomValue(true);
  5070. this._updateDomValue();
  5071. break;
  5072. case 'cut':
  5073. case 'paste':
  5074. setTimeout(function () {
  5075. node._getDomValue(true);
  5076. node._updateDomValue();
  5077. }, 1);
  5078. break;
  5079. }
  5080. }
  5081. // field events
  5082. var domField = dom.field;
  5083. if (target == domField) {
  5084. switch (type) {
  5085. case 'focus':
  5086. JSONEditor.focusNode = this;
  5087. break;
  5088. case 'change':
  5089. case 'blur':
  5090. this._getDomField(true);
  5091. this._updateDomField();
  5092. if (this.field) {
  5093. domField.innerHTML = this._escapeHTML(this.field);
  5094. }
  5095. break;
  5096. case 'keyup':
  5097. this._getDomField(true);
  5098. this._updateDomField();
  5099. break;
  5100. case 'cut':
  5101. case 'paste':
  5102. setTimeout(function () {
  5103. node._getDomField(true);
  5104. node._updateDomField();
  5105. }, 1);
  5106. break;
  5107. }
  5108. }
  5109. // drag events
  5110. var domDrag = dom.drag;
  5111. if (target == domDrag) {
  5112. switch (type) {
  5113. case 'mousedown':
  5114. this._onDragStart(event);
  5115. break;
  5116. case 'mouseover':
  5117. this.setHighlight(true);
  5118. break;
  5119. case 'mouseout':
  5120. this.setHighlight(false);
  5121. break;
  5122. }
  5123. }
  5124. // expand events
  5125. var domExpand = dom.expand;
  5126. if (target == domExpand) {
  5127. if (type == 'click') {
  5128. if (expandable) {
  5129. this._onExpand(event);
  5130. }
  5131. }
  5132. }
  5133. // duplicate button
  5134. var domDuplicate = dom.duplicate;
  5135. if (target == domDuplicate) {
  5136. switch (type) {
  5137. case 'click':
  5138. var clone = this.parent._duplicate(this);
  5139. this.editor.onAction('duplicateNode', {
  5140. 'node': this,
  5141. 'clone': clone,
  5142. 'parent': this.parent
  5143. });
  5144. break;
  5145. case 'mouseover':
  5146. this.setHighlight(true);
  5147. break;
  5148. case 'mouseout':
  5149. this.setHighlight(false);
  5150. break;
  5151. }
  5152. }
  5153. // remove button
  5154. var domRemove = dom.remove;
  5155. if (target == domRemove) {
  5156. switch (type) {
  5157. case 'click':
  5158. this._onRemove();
  5159. break;
  5160. case 'mouseover':
  5161. this.setHighlight(true);
  5162. break;
  5163. case 'mouseout':
  5164. this.setHighlight(false);
  5165. break;
  5166. }
  5167. }
  5168. // type button
  5169. var domType = dom.type;
  5170. if (target == domType) {
  5171. switch (type) {
  5172. case 'click':
  5173. this._onChangeType(event);
  5174. break;
  5175. case 'mouseover':
  5176. this.setHighlight(true);
  5177. break;
  5178. case 'mouseout':
  5179. this.setHighlight(false);
  5180. break;
  5181. }
  5182. }
  5183. // focus
  5184. // when clicked in whitespace left or right from the field or value, set focus
  5185. var domTree = dom.tree;
  5186. if (target == domTree.parentNode) {
  5187. switch (type) {
  5188. case 'click':
  5189. var left = (event.offsetX != undefined) ? (event.offsetX < (this.getLevel() + 1) * 24) : (event.clientX < JSONEditor.getAbsoluteLeft(dom.tdSeparator)); // for FF
  5190. if (left || expandable) {
  5191. // node is expandable when it is an object or array
  5192. if (domField) {
  5193. JSONEditor.setEndOfContentEditable(domField);
  5194. domField.focus();
  5195. }
  5196. } else {
  5197. if (domValue) {
  5198. JSONEditor.setEndOfContentEditable(domValue);
  5199. domValue.focus();
  5200. }
  5201. }
  5202. break;
  5203. }
  5204. }
  5205. if ((target == dom.tdExpand && !expandable) || target == dom.tdField || target == dom.tdSeparator) {
  5206. switch (type) {
  5207. case 'click':
  5208. if (domField) {
  5209. JSONEditor.setEndOfContentEditable(domField);
  5210. domField.focus();
  5211. }
  5212. break;
  5213. }
  5214. }
  5215. };
  5216. /**
  5217. * Handle the expand event, when clicked on the expand button
  5218. * @param {Event} event
  5219. * @private
  5220. */
  5221. JSONEditor.Node.prototype._onExpand = function (event) {
  5222. event = event || window.event;
  5223. var recurse = event.ctrlKey; // with ctrl-key, expand/collapse all
  5224. if (recurse) {
  5225. // Take the table offline
  5226. var table = this.dom.tr.parentNode; // TODO: not nice to access the main table like this
  5227. var frame = table.parentNode;
  5228. var scrollTop = frame.scrollTop;
  5229. frame.removeChild(table);
  5230. }
  5231. if (this.expanded) {
  5232. this.collapse(recurse);
  5233. } else {
  5234. this.expand(recurse);
  5235. }
  5236. if (recurse) {
  5237. // Put the table online again
  5238. frame.appendChild(table);
  5239. frame.scrollTop = scrollTop;
  5240. }
  5241. };
  5242. JSONEditor.Node.types = [{
  5243. 'value': 'array',
  5244. 'className': 'jsoneditor-option-array',
  5245. 'title': '"array" 类型: 一个包含了有序值集合的数组.'
  5246. }, {
  5247. 'value': 'auto',
  5248. 'className': 'jsoneditor-option-auto',
  5249. 'title': '"auto" 类型: 节点类型将自动从值中获取, 可以是: string, number, boolean, 或者 null.'
  5250. }, {
  5251. 'value': 'object',
  5252. 'className': 'jsoneditor-option-object',
  5253. 'title': '"object" 类型: 对象包含了一些无序的键/值对.'
  5254. }, {
  5255. 'value': 'string',
  5256. 'className': 'jsoneditor-option-string',
  5257. 'title': '"string" 类型: 节点类型不从值中自动获取, 但永远返回 string.'
  5258. }];
  5259. /**
  5260. * Create a DOM select box containing the node type
  5261. * @return {Element} domType
  5262. * @private
  5263. */
  5264. JSONEditor.Node.prototype._createDomTypeButton = function () {
  5265. var node = this;
  5266. var domType = document.createElement('button');
  5267. domType.className = 'jsoneditor-type-' + node.type;
  5268. domType.title = '改变节点类型';
  5269. return domType;
  5270. };
  5271. /**
  5272. * Remove this node
  5273. * @private
  5274. */
  5275. JSONEditor.Node.prototype._onRemove = function () {
  5276. this.setHighlight(false);
  5277. var index = this.parent.childs.indexOf(this);
  5278. this.parent._remove(this);
  5279. this.editor.onAction('removeNode', {
  5280. 'node': this,
  5281. 'parent': this.parent,
  5282. 'index': index
  5283. });
  5284. };
  5285. /**
  5286. * Handle a click on the Type-button
  5287. * @param {Event} event
  5288. * @private
  5289. */
  5290. JSONEditor.Node.prototype._onChangeType = function (event) {
  5291. JSONEditor.Events.stopPropagation(event);
  5292. var domType = this.dom.type;
  5293. var node = this;
  5294. var x = JSONEditor.getAbsoluteLeft(domType);
  5295. var y = JSONEditor.getAbsoluteTop(domType) + domType.clientHeight;
  5296. var callback = function (newType) {
  5297. var oldType = node.type;
  5298. node.changeType(newType);
  5299. node.editor.onAction('changeType', {
  5300. 'node': node,
  5301. 'oldType': oldType,
  5302. 'newType': newType
  5303. });
  5304. domType.className = 'jsoneditor-type-' + node.type;
  5305. };
  5306. JSONEditor.showDropDownList({
  5307. 'x': x,
  5308. 'y': y,
  5309. 'node': node,
  5310. 'value': node.type,
  5311. 'values': JSONEditor.Node.types,
  5312. 'className': 'jsoneditor-select',
  5313. 'optionSelectedClassName': 'jsoneditor-option-selected',
  5314. 'optionClassName': 'jsoneditor-option',
  5315. 'callback': callback
  5316. });
  5317. };
  5318. /**
  5319. * Show a dropdown list
  5320. * @param {Object} params Available parameters:
  5321. * {Number} x The absolute horizontal position
  5322. * {Number} y The absolute vertical position
  5323. * {JSONEditor.Node} node node used for highlighting
  5324. * {String} value current selected value
  5325. * {Object[]} values the available values. Each object
  5326. * contains a value, title, and
  5327. * className
  5328. * {String} optionSelectedClassName
  5329. * {String} optionClassName
  5330. * {function} callback Callback method, called when
  5331. * the selected value changed.
  5332. */
  5333. JSONEditor.showDropDownList = function (params) {
  5334. var select = document.createElement('div');
  5335. select.className = params.className || '';
  5336. select.style.position = 'absolute';
  5337. select.style.left = (params.x || 0) + 'px';
  5338. select.style.top = (params.y || 0) + 'px';
  5339. params.values.forEach(function (v) {
  5340. var text = v.value || String(v);
  5341. var className = 'jsoneditor-option';
  5342. var selected = (text == params.value);
  5343. if (selected) {
  5344. className += ' ' + params.optionSelectedClassName;
  5345. }
  5346. var option = document.createElement('div');
  5347. option.className = className;
  5348. if (v.title) {
  5349. option.title = v.title;
  5350. }
  5351. var divIcon = document.createElement('div');
  5352. divIcon.className = (v.className || '');
  5353. option.appendChild(divIcon);
  5354. var divText = document.createElement('div');
  5355. divText.className = 'jsoneditor-option-text';
  5356. divText.innerHTML = '<div>' + text + '</div>';
  5357. option.appendChild(divText);
  5358. option.onmousedown = (function (value) {
  5359. return function () {
  5360. params.callback(value);
  5361. };
  5362. })(v.value);
  5363. select.appendChild(option);
  5364. });
  5365. document.body.appendChild(select);
  5366. params.node.setHighlight(true);
  5367. JSONEditor.freezeHighlight = true;
  5368. // TODO: change to onclick? -> but be sure to remove existing dropdown first
  5369. var onmousedown = JSONEditor.Events.addEventListener(document, 'mousedown', function () {
  5370. JSONEditor.freezeHighlight = false;
  5371. params.node.setHighlight(false);
  5372. if (select && select.parentNode) {
  5373. select.parentNode.removeChild(select);
  5374. }
  5375. JSONEditor.Events.removeEventListener(document, 'mousedown', onmousedown);
  5376. });
  5377. var onmousewheel = JSONEditor.Events.addEventListener(document, 'mousewheel', function () {
  5378. JSONEditor.freezeHighlight = false;
  5379. params.node.setHighlight(false);
  5380. if (select && select.parentNode) {
  5381. select.parentNode.removeChild(select);
  5382. }
  5383. JSONEditor.Events.removeEventListener(document, 'mousewheel', onmousewheel);
  5384. });
  5385. };
  5386. /**
  5387. * Create a table row with an append button.
  5388. * @return {Element | undefined} buttonAppend or undefined when inapplicable
  5389. */
  5390. JSONEditor.Node.prototype.getAppend = function () {
  5391. if (!this.append) {
  5392. this.append = new JSONEditor.AppendNode(this.editor);
  5393. this.append.setParent(this);
  5394. }
  5395. return this.append.getDom();
  5396. };
  5397. /**
  5398. * Create a remove button. Returns undefined when the structure cannot
  5399. * be removed
  5400. * @return {Element | undefined} removeButton, or undefined when inapplicable
  5401. * @private
  5402. */
  5403. JSONEditor.Node.prototype._createDomRemoveButton = function () {
  5404. if (this.parent && (this.parent.type == 'array' || this.parent.type == 'object')) {
  5405. var buttonRemove = document.createElement('button');
  5406. buttonRemove.className = 'jsoneditor-remove';
  5407. buttonRemove.title = '删除节点 (包括所有子节点)';
  5408. return buttonRemove;
  5409. } else {
  5410. return undefined;
  5411. }
  5412. };
  5413. /**
  5414. * Create a duplicate button.
  5415. * If the Node is the root node, no duplicate button is available and undefined
  5416. * will be returned
  5417. * @return {Element | undefined} buttonDuplicate
  5418. * @private
  5419. */
  5420. JSONEditor.Node.prototype._createDomDuplicateButton = function () {
  5421. if (this.parent && (this.parent.type == 'array' || this.parent.type == 'object')) {
  5422. var buttonDupliate = document.createElement('button');
  5423. buttonDupliate.className = 'jsoneditor-duplicate';
  5424. buttonDupliate.title = '复制节点 (包括所有子节点)';
  5425. return buttonDupliate;
  5426. } else {
  5427. return undefined;
  5428. }
  5429. };
  5430. /**
  5431. * get the type of a value
  5432. * @param {*} value
  5433. * @return {String} type Can be 'object', 'array', 'string', 'auto'
  5434. * @private
  5435. */
  5436. JSONEditor.Node.prototype._getType = function (value) {
  5437. if (value instanceof Array) {
  5438. return 'array';
  5439. }
  5440. if (value instanceof Object) {
  5441. return 'object';
  5442. }
  5443. if (typeof (value) == 'string' && typeof (this._stringCast(value)) != 'string') {
  5444. return 'string';
  5445. }
  5446. return 'auto';
  5447. };
  5448. /**
  5449. * cast contents of a string to the correct type. This can be a string,
  5450. * a number, a boolean, etc
  5451. * @param {String} str
  5452. * @return {*} castedStr
  5453. * @private
  5454. */
  5455. JSONEditor.Node.prototype._stringCast = function (str) {
  5456. var lower = str.toLowerCase(),
  5457. num = Number(str), // will nicely fail with '123ab'
  5458. numFloat = parseFloat(str); // will nicely fail with ' '
  5459. if (str == '') {
  5460. return '';
  5461. } else if (lower == 'null') {
  5462. return null;
  5463. } else if (lower == 'true') {
  5464. return true;
  5465. } else if (lower == 'false') {
  5466. return false;
  5467. } else if (!isNaN(num) && !isNaN(numFloat)) {
  5468. return num;
  5469. } else {
  5470. return str;
  5471. }
  5472. };
  5473. /**
  5474. * escape a text, such that it can be displayed safely in an HTML element
  5475. * @param {String} text
  5476. * @return {String} escapedText
  5477. * @private
  5478. */
  5479. JSONEditor.Node.prototype._escapeHTML = function (text) {
  5480. var htmlEscaped = String(text)
  5481. .replace(/</g, '&lt;')
  5482. .replace(/>/g, '&gt;')
  5483. .replace(/ /g, ' &nbsp;') // replace double space with an nbsp and space
  5484. .replace(/^ /, '&nbsp;') // space at start
  5485. .replace(/ $/, '&nbsp;'); // space at end
  5486. var json = JSON.stringify(htmlEscaped);
  5487. return json.substring(1, json.length - 1);
  5488. };
  5489. /**
  5490. * unescape a string.
  5491. * @param {String} escapedText
  5492. * @return {String} text
  5493. * @private
  5494. */
  5495. JSONEditor.Node.prototype._unescapeHTML = function (escapedText) {
  5496. var json = '"' + this._escapeJSON(escapedText) + '"';
  5497. var htmlEscaped = JSONEditor.parse(json);
  5498. return htmlEscaped.replace(/&lt;/g, '<')
  5499. .replace(/&gt;/g, '>')
  5500. .replace(/&nbsp;/g, ' ');
  5501. };
  5502. /**
  5503. * escape a text to make it a valid JSON string. The method will:
  5504. * - replace unescaped double quotes with '\"'
  5505. * - replace unescaped backslash with '\\'
  5506. * - replace returns with '\n'
  5507. * @param {String} text
  5508. * @return {String} escapedText
  5509. * @private
  5510. */
  5511. JSONEditor.Node.prototype._escapeJSON = function (text) {
  5512. // TODO: replace with some smart regex (only when a new solution is faster!)
  5513. var escaped = '';
  5514. var i = 0,
  5515. iMax = text.length;
  5516. while (i < iMax) {
  5517. var c = text.charAt(i);
  5518. if (c == '\n') {
  5519. escaped += '\\n';
  5520. } else if (c == '\\') {
  5521. escaped += c;
  5522. i++;
  5523. c = text.charAt(i);
  5524. if ('"\\/bfnrtu'.indexOf(c) == -1) {
  5525. escaped += '\\'; // no valid escape character
  5526. }
  5527. escaped += c;
  5528. } else if (c == '"') {
  5529. escaped += '\\"';
  5530. } else {
  5531. escaped += c;
  5532. }
  5533. i++;
  5534. }
  5535. return escaped;
  5536. };
  5537. /**
  5538. * @constructor JSONEditor.AppendNode
  5539. * @extends JSONEditor.Node
  5540. * @param {JSONEditor} editor
  5541. * Create a new AppendNode. This is a special node which is created at the
  5542. * end of the list with childs for an object or array
  5543. */
  5544. JSONEditor.AppendNode = function (editor) {
  5545. this.editor = editor;
  5546. this.dom = {};
  5547. };
  5548. JSONEditor.AppendNode.prototype = new JSONEditor.Node();
  5549. /**
  5550. * Return a table row with an append button.
  5551. * @return {Element} dom TR element
  5552. */
  5553. JSONEditor.AppendNode.prototype.getDom = function () {
  5554. if (this.dom.tr) {
  5555. return this.dom.tr;
  5556. }
  5557. /**
  5558. * Create a TD element, and give it the provided class name (if any)
  5559. * @param {String} [className]
  5560. * @return {Element} td
  5561. */
  5562. function newTd(className) {
  5563. var td = document.createElement('td');
  5564. td.className = className || '';
  5565. return td;
  5566. }
  5567. // a row for the append button
  5568. var trAppend = document.createElement('tr');
  5569. trAppend.node = this;
  5570. // TODO: do not create an appendNode at all when in viewer mode
  5571. if (!this.editor.editable) {
  5572. return trAppend;
  5573. }
  5574. // a cell for the drag area column
  5575. trAppend.appendChild(newTd('jsoneditor-td'));
  5576. // a cell for the append button
  5577. var tdAppend = document.createElement('td');
  5578. trAppend.appendChild(tdAppend);
  5579. tdAppend.className = 'jsoneditor-td';
  5580. // create the append button
  5581. var buttonAppend = document.createElement('button');
  5582. buttonAppend.className = 'jsoneditor-append';
  5583. buttonAppend.title = '添加';
  5584. this.dom.append = buttonAppend;
  5585. tdAppend.appendChild(buttonAppend);
  5586. trAppend.appendChild(newTd('jsoneditor-td jsoneditor-td-edit'));
  5587. trAppend.appendChild(newTd('jsoneditor-td jsoneditor-td-edit'));
  5588. trAppend.appendChild(newTd('jsoneditor-td jsoneditor-td-edit'));
  5589. this.dom.tr = trAppend;
  5590. this.dom.td = tdAppend;
  5591. this.updateDom();
  5592. return trAppend;
  5593. };
  5594. /**
  5595. * Update the HTML dom of the Node
  5596. */
  5597. JSONEditor.AppendNode.prototype.updateDom = function () {
  5598. var tdAppend = this.dom.td;
  5599. if (tdAppend) {
  5600. tdAppend.style.paddingLeft = (this.getLevel() * 24 + 26) + 'px';
  5601. // TODO: not so nice hard coded offset
  5602. }
  5603. };
  5604. /**
  5605. * Handle an event. The event is catched centrally by the editor
  5606. * @param {Event} event
  5607. */
  5608. JSONEditor.AppendNode.prototype.onEvent = function (event) {
  5609. var type = event.type;
  5610. var target = event.target || event.srcElement;
  5611. var dom = this.dom;
  5612. var domAppend = dom.append;
  5613. if (target == domAppend) {
  5614. switch (type) {
  5615. case 'click':
  5616. this._onAppend();
  5617. break;
  5618. case 'mouseover':
  5619. this.parent.setHighlight(true);
  5620. break;
  5621. case 'mouseout':
  5622. this.parent.setHighlight(false);
  5623. }
  5624. }
  5625. };
  5626. /**
  5627. * Handle append event
  5628. * @private
  5629. */
  5630. JSONEditor.AppendNode.prototype._onAppend = function () {
  5631. var newNode = new JSONEditor.Node(this.editor, {
  5632. 'field': 'field',
  5633. 'value': 'value'
  5634. });
  5635. this.parent.appendChild(newNode);
  5636. this.parent.setHighlight(false);
  5637. newNode.focus();
  5638. this.editor.onAction('appendNode', {
  5639. 'node': newNode,
  5640. 'parent': this.parent
  5641. });
  5642. };
  5643. /**
  5644. * Create main frame
  5645. * @private
  5646. */
  5647. JSONEditor.prototype._createFrame = function () {
  5648. // create the frame
  5649. this.container.innerHTML = '';
  5650. this.frame = document.createElement('div');
  5651. this.frame.className = 'jsoneditor-frame';
  5652. this.container.appendChild(this.frame);
  5653. // create one global event listener to handle all events from all nodes
  5654. var editor = this;
  5655. // TODO: move this onEvent to JSONEditor.prototype.onEvent
  5656. var onEvent = function (event) {
  5657. event = event || window.event;
  5658. var target = event.target || event.srcElement;
  5659. /* TODO: Enable quickkeys Ctrl+F and F3.
  5660. // Requires knowing whether the JSONEditor has focus or not
  5661. // (use a global event listener for that?)
  5662. // Check for search quickkeys, Ctrl+F and F3
  5663. if (editor.options.search) {
  5664. if (event.type == 'keydown') {
  5665. var keynum = event.which || event.keyCode;
  5666. if (keynum == 70 && event.ctrlKey) { // Ctrl+F
  5667. if (editor.searchBox) {
  5668. editor.searchBox.dom.search.focus();
  5669. editor.searchBox.dom.search.select();
  5670. JSONEditor.Events.preventDefault(event);
  5671. JSONEditor.Events.stopPropagation(event);
  5672. }
  5673. }
  5674. else if (keynum == 114) { // F3
  5675. if (!event.shiftKey) {
  5676. // select next search result
  5677. editor.searchBox.next();
  5678. }
  5679. else {
  5680. // select previous search result
  5681. editor.searchBox.previous();
  5682. }
  5683. editor.searchBox.focusActiveResult();
  5684. // set selection to the current
  5685. JSONEditor.Events.preventDefault(event);
  5686. JSONEditor.Events.stopPropagation(event);
  5687. }
  5688. }
  5689. }
  5690. */
  5691. var node = JSONEditor.getNodeFromTarget(target);
  5692. if (node) {
  5693. node.onEvent(event);
  5694. }
  5695. };
  5696. this.frame.onclick = function (event) {
  5697. onEvent(event);
  5698. // prevent default submit action when JSONEditor is located inside a form
  5699. JSONEditor.Events.preventDefault(event);
  5700. };
  5701. this.frame.onchange = onEvent;
  5702. this.frame.onkeydown = onEvent;
  5703. this.frame.onkeyup = onEvent;
  5704. this.frame.oncut = onEvent;
  5705. this.frame.onpaste = onEvent;
  5706. this.frame.onmousedown = onEvent;
  5707. this.frame.onmouseup = onEvent;
  5708. this.frame.onmouseover = onEvent;
  5709. this.frame.onmouseout = onEvent;
  5710. // Note: focus and blur events do not propagate, therefore they defined
  5711. // using an eventListener with useCapture=true
  5712. // see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html
  5713. JSONEditor.Events.addEventListener(this.frame, 'focus', onEvent, true);
  5714. JSONEditor.Events.addEventListener(this.frame, 'blur', onEvent, true);
  5715. this.frame.onfocusin = onEvent; // for IE
  5716. this.frame.onfocusout = onEvent; // for IE
  5717. // create menu
  5718. this.menu = document.createElement('div');
  5719. this.menu.className = 'jsoneditor-menu';
  5720. this.frame.appendChild(this.menu);
  5721. // create expand all button
  5722. var expandAll = document.createElement('button');
  5723. expandAll.className = 'jsoneditor-menu jsoneditor-expand-all';
  5724. expandAll.title = '展开';
  5725. expandAll.onclick = function () {
  5726. editor.expandAll();
  5727. };
  5728. this.menu.appendChild(expandAll);
  5729. // create expand all button
  5730. var collapseAll = document.createElement('button');
  5731. collapseAll.title = '折叠';
  5732. collapseAll.className = 'jsoneditor-menu jsoneditor-collapse-all';
  5733. collapseAll.onclick = function () {
  5734. editor.collapseAll();
  5735. };
  5736. this.menu.appendChild(collapseAll);
  5737. // create expand/collapse buttons
  5738. if (this.history) {
  5739. // create separator
  5740. var separator = document.createElement('span');
  5741. separator.innerHTML = '&nbsp;';
  5742. this.menu.appendChild(separator);
  5743. // create undo button
  5744. var undo = document.createElement('button');
  5745. undo.className = 'jsoneditor-menu jsoneditor-undo';
  5746. undo.title = '撤销';
  5747. undo.onclick = function () {
  5748. // undo last action
  5749. editor.history.undo();
  5750. // trigger change callback
  5751. if (editor.options.change) {
  5752. editor.options.change();
  5753. }
  5754. };
  5755. this.menu.appendChild(undo);
  5756. this.dom.undo = undo;
  5757. // create redo button
  5758. var redo = document.createElement('button');
  5759. redo.className = 'jsoneditor-menu jsoneditor-redo';
  5760. redo.title = '重做';
  5761. redo.onclick = function () {
  5762. // redo last action
  5763. editor.history.redo();
  5764. // trigger change callback
  5765. if (editor.options.change) {
  5766. editor.options.change();
  5767. }
  5768. };
  5769. this.menu.appendChild(redo);
  5770. this.dom.redo = redo;
  5771. // register handler for onchange of history
  5772. this.history.onChange = function () {
  5773. undo.disabled = !editor.history.canUndo();
  5774. redo.disabled = !editor.history.canRedo();
  5775. };
  5776. this.history.onChange();
  5777. }
  5778. // create search box
  5779. if (this.options.search) {
  5780. this.searchBox = new JSONEditor.SearchBox(this, this.menu);
  5781. }
  5782. };
  5783. /**
  5784. * Create main table
  5785. * @private
  5786. */
  5787. JSONEditor.prototype._createTable = function () {
  5788. var contentOuter = document.createElement('div');
  5789. contentOuter.className = 'jsoneditor-content-outer';
  5790. this.contentOuter = contentOuter;
  5791. this.content = document.createElement('div');
  5792. this.content.className = 'jsoneditor-content';
  5793. contentOuter.appendChild(this.content);
  5794. this.table = document.createElement('table');
  5795. this.table.className = 'jsoneditor-table';
  5796. this.content.appendChild(this.table);
  5797. // IE8 does not handle overflow='auto' correctly.
  5798. // Therefore, set overflow to 'scroll'
  5799. var ieVersion = JSONEditor.getInternetExplorerVersion();
  5800. if (ieVersion == 8) {
  5801. this.content.style.overflow = 'scroll';
  5802. }
  5803. // create colgroup where the first two columns don't have a fixed
  5804. // width, and the edit columns do have a fixed width
  5805. var col;
  5806. this.colgroupContent = document.createElement('colgroup');
  5807. col = document.createElement('col');
  5808. col.width = "24px";
  5809. this.colgroupContent.appendChild(col);
  5810. col = document.createElement('col');
  5811. this.colgroupContent.appendChild(col);
  5812. col = document.createElement('col');
  5813. col.width = "24px";
  5814. this.colgroupContent.appendChild(col);
  5815. col = document.createElement('col');
  5816. col.width = "24px";
  5817. this.colgroupContent.appendChild(col);
  5818. col = document.createElement('col');
  5819. col.width = "24px";
  5820. this.colgroupContent.appendChild(col);
  5821. this.table.appendChild(this.colgroupContent);
  5822. this.tbody = document.createElement('tbody');
  5823. this.table.appendChild(this.tbody);
  5824. this.frame.appendChild(contentOuter);
  5825. };
  5826. /**
  5827. * Find the node from an event target
  5828. * @param {Element} target
  5829. * @return {JSONEditor.Node | undefined} node or undefined when not found
  5830. */
  5831. JSONEditor.getNodeFromTarget = function (target) {
  5832. while (target) {
  5833. if (target.node) {
  5834. return target.node;
  5835. }
  5836. target = target.parentNode;
  5837. }
  5838. return undefined;
  5839. };
  5840. /**
  5841. * Create a JSONFormatter and attach it to given container
  5842. * @constructor JSONFormatter
  5843. * @param {Element} container
  5844. * @param {Object} [options] Object with options. available options:
  5845. * {Number} indentation Number of indentation
  5846. * spaces. 4 by default.
  5847. * {function} change Callback method
  5848. * triggered on change
  5849. * @param {JSON | String} [json] initial contents of the formatter
  5850. */
  5851. JSONFormatter = function (container, options, json) {
  5852. // check availability of JSON parser (not available in IE7 and older)
  5853. if (!JSON) {
  5854. throw new Error('您当前使用的浏览器不支持 JSON. \n\n' +
  5855. '请下载安装最新版本的浏览器, 本站推荐Google Chrome.\n' +
  5856. '(PS: 当前主流浏览器都支持JSON).');
  5857. }
  5858. this.container = container;
  5859. this.indentation = 4; // number of spaces
  5860. this.width = container.clientWidth;
  5861. this.height = container.clientHeight;
  5862. this.frame = document.createElement('div');
  5863. this.frame.className = "jsoneditor-frame";
  5864. this.frame.onclick = function (event) {
  5865. // prevent default submit action when JSONFormatter is located inside a form
  5866. JSONEditor.Events.preventDefault(event);
  5867. };
  5868. // create menu
  5869. this.menu = document.createElement('div');
  5870. this.menu.className = 'jsoneditor-menu';
  5871. this.frame.appendChild(this.menu);
  5872. // create format button
  5873. var buttonFormat = document.createElement('button');
  5874. //buttonFormat.innerHTML = 'Format';
  5875. buttonFormat.className = 'jsoneditor-menu jsoneditor-format';
  5876. buttonFormat.title = '格式化JSON数据';
  5877. //buttonFormat.className = 'jsoneditor-button';
  5878. this.menu.appendChild(buttonFormat);
  5879. // create compact button
  5880. var buttonCompact = document.createElement('button');
  5881. //buttonCompact.innerHTML = 'Compact';
  5882. buttonCompact.className = 'jsoneditor-menu jsoneditor-compact';
  5883. buttonCompact.title = '压缩JSON数据, 清除所有空白字符';
  5884. //buttonCompact.className = 'jsoneditor-button';
  5885. this.menu.appendChild(buttonCompact);
  5886. this.content = document.createElement('div');
  5887. this.content.className = 'jsonformatter-content';
  5888. this.frame.appendChild(this.content);
  5889. this.textarea = document.createElement('textarea');
  5890. this.textarea.className = "jsonformatter-textarea";
  5891. this.textarea.spellcheck = false;
  5892. this.content.appendChild(this.textarea);
  5893. var textarea = this.textarea;
  5894. // read the options
  5895. if (options) {
  5896. if (options.change) {
  5897. // register on change event
  5898. if (this.textarea.oninput === null) {
  5899. this.textarea.oninput = function () {
  5900. options.change();
  5901. }
  5902. } else {
  5903. // oninput is undefined. For IE8-
  5904. this.textarea.onchange = function () {
  5905. options.change();
  5906. }
  5907. }
  5908. }
  5909. if (options.indentation) {
  5910. this.indentation = Number(options.indentation);
  5911. }
  5912. }
  5913. var me = this;
  5914. buttonFormat.onclick = function () {
  5915. try {
  5916. var json = JSONEditor.parse(textarea.value);
  5917. textarea.value = JSON.stringify(json, null, me.indentation);
  5918. } catch (err) {
  5919. me.onError(err);
  5920. }
  5921. };
  5922. buttonCompact.onclick = function () {
  5923. try {
  5924. var json = JSONEditor.parse(textarea.value);
  5925. textarea.value = JSON.stringify(json);
  5926. } catch (err) {
  5927. me.onError(err);
  5928. }
  5929. };
  5930. this.container.appendChild(this.frame);
  5931. // load initial json object or string
  5932. if (typeof (json) == 'string') {
  5933. this.setText(json);
  5934. } else {
  5935. this.set(json);
  5936. }
  5937. };
  5938. /**
  5939. * This method is executed on error.
  5940. * It can be overwritten for each instance of the JSONFormatter
  5941. * @param {String} err
  5942. */
  5943. JSONFormatter.prototype.onError = function (err) {
  5944. // action should be implemented for the instance
  5945. };
  5946. /**
  5947. * Set json data in the formatter
  5948. * @param {Object} json
  5949. */
  5950. JSONFormatter.prototype.set = function (json) {
  5951. this.textarea.value = JSON.stringify(json, null, this.indentation);
  5952. };
  5953. /**
  5954. * Get json data from the formatter
  5955. * @return {Object} json
  5956. */
  5957. JSONFormatter.prototype.get = function () {
  5958. return JSONEditor.parse(this.textarea.value);
  5959. };
  5960. /**
  5961. * Get the text contents of the JSONFormatter
  5962. * @return {String} text
  5963. */
  5964. JSONFormatter.prototype.getText = function () {
  5965. return this.textarea.value;
  5966. };
  5967. /**
  5968. * Set the text contents of the JSONFormatter
  5969. * @param {String} text
  5970. */
  5971. JSONFormatter.prototype.setText = function (text) {
  5972. this.textarea.value = text;
  5973. };
  5974. /**
  5975. * @constructor JSONEditor.SearchBox
  5976. * Create a search box in given HTML container
  5977. * @param {JSONEditor} editor The JSON Editor to attach to
  5978. * @param {Element} container HTML container element of where to create the
  5979. * search box
  5980. */
  5981. JSONEditor.SearchBox = function (editor, container) {
  5982. var searchBox = this;
  5983. this.editor = editor;
  5984. this.timeout = undefined;
  5985. this.delay = 200; // ms
  5986. this.lastText = undefined;
  5987. this.dom = {};
  5988. this.dom.container = container;
  5989. var table = document.createElement('table');
  5990. this.dom.table = table;
  5991. table.className = 'jsoneditor-search';
  5992. container.appendChild(table);
  5993. var tbody = document.createElement('tbody');
  5994. this.dom.tbody = tbody;
  5995. table.appendChild(tbody);
  5996. var tr = document.createElement('tr');
  5997. tbody.appendChild(tr);
  5998. var td = document.createElement('td');
  5999. td.className = 'jsoneditor-search';
  6000. tr.appendChild(td);
  6001. var results = document.createElement('div');
  6002. this.dom.results = results;
  6003. results.className = 'jsoneditor-search-results';
  6004. td.appendChild(results);
  6005. td = document.createElement('td');
  6006. td.className = 'jsoneditor-search';
  6007. tr.appendChild(td);
  6008. var divInput = document.createElement('div');
  6009. this.dom.input = divInput;
  6010. divInput.className = 'jsoneditor-search';
  6011. divInput.title = '查找区块和值';
  6012. td.appendChild(divInput);
  6013. // table to contain the text input and search button
  6014. var tableInput = document.createElement('table');
  6015. tableInput.className = 'jsoneditor-search-input';
  6016. divInput.appendChild(tableInput);
  6017. var tbodySearch = document.createElement('tbody');
  6018. tableInput.appendChild(tbodySearch);
  6019. tr = document.createElement('tr');
  6020. tbodySearch.appendChild(tr);
  6021. var refreshSearch = document.createElement('button');
  6022. refreshSearch.className = 'jsoneditor-search-refresh';
  6023. td = document.createElement('td');
  6024. td.appendChild(refreshSearch);
  6025. tr.appendChild(td);
  6026. var search = document.createElement('input');
  6027. this.dom.search = search;
  6028. search.className = 'jsoneditor-search';
  6029. search.oninput = function (event) {
  6030. searchBox.onDelayedSearch(event);
  6031. };
  6032. search.onchange = function (event) { // For IE 8
  6033. searchBox.onSearch(event);
  6034. };
  6035. search.onkeydown = function (event) {
  6036. searchBox.onKeyDown(event);
  6037. };
  6038. search.onkeyup = function (event) {
  6039. searchBox.onKeyUp(event);
  6040. };
  6041. refreshSearch.onclick = function (event) {
  6042. search.select();
  6043. };
  6044. // TODO: ESC in FF restores the last input, is a FF bug, https://bugzilla.mozilla.org/show_bug.cgi?id=598819
  6045. td = document.createElement('td');
  6046. td.appendChild(search);
  6047. tr.appendChild(td);
  6048. var searchNext = document.createElement('button');
  6049. searchNext.title = '下一个 (Enter)';
  6050. searchNext.className = 'jsoneditor-search-next';
  6051. searchNext.onclick = function () {
  6052. searchBox.next();
  6053. };
  6054. td = document.createElement('td');
  6055. td.appendChild(searchNext);
  6056. tr.appendChild(td);
  6057. var searchPrevious = document.createElement('button');
  6058. searchPrevious.title = '上一个 (Shift+Enter)';
  6059. searchPrevious.className = 'jsoneditor-search-previous';
  6060. searchPrevious.onclick = function () {
  6061. searchBox.previous();
  6062. };
  6063. td = document.createElement('td');
  6064. td.appendChild(searchPrevious);
  6065. tr.appendChild(td);
  6066. };
  6067. /**
  6068. * Go to the next search result
  6069. */
  6070. JSONEditor.SearchBox.prototype.next = function () {
  6071. if (this.results != undefined) {
  6072. var index = (this.resultIndex != undefined) ? this.resultIndex + 1 : 0;
  6073. if (index > this.results.length - 1) {
  6074. index = 0;
  6075. }
  6076. this.setActiveResult(index);
  6077. }
  6078. };
  6079. /**
  6080. * Go to the prevous search result
  6081. */
  6082. JSONEditor.SearchBox.prototype.previous = function () {
  6083. if (this.results != undefined) {
  6084. var max = this.results.length - 1;
  6085. var index = (this.resultIndex != undefined) ? this.resultIndex - 1 : max;
  6086. if (index < 0) {
  6087. index = max;
  6088. }
  6089. this.setActiveResult(index);
  6090. }
  6091. };
  6092. /**
  6093. * Set new value for the current active result
  6094. * @param {Number} index
  6095. */
  6096. JSONEditor.SearchBox.prototype.setActiveResult = function (index) {
  6097. // de-activate current active result
  6098. if (this.activeResult) {
  6099. var prevNode = this.activeResult.node;
  6100. var prevElem = this.activeResult.elem;
  6101. if (prevElem == 'field') {
  6102. delete prevNode.searchFieldActive;
  6103. } else {
  6104. delete prevNode.searchValueActive;
  6105. }
  6106. prevNode.updateDom();
  6107. }
  6108. if (!this.results || !this.results[index]) {
  6109. // out of range, set to undefined
  6110. this.resultIndex = undefined;
  6111. this.activeResult = undefined;
  6112. return;
  6113. }
  6114. this.resultIndex = index;
  6115. // set new node active
  6116. var node = this.results[this.resultIndex].node;
  6117. var elem = this.results[this.resultIndex].elem;
  6118. if (elem == 'field') {
  6119. node.searchFieldActive = true;
  6120. } else {
  6121. node.searchValueActive = true;
  6122. }
  6123. this.activeResult = this.results[this.resultIndex];
  6124. node.updateDom();
  6125. node.scrollTo();
  6126. };
  6127. /**
  6128. * Set the focus to the currently active result. If there is no currently
  6129. * active result, the next search result will get focus
  6130. */
  6131. JSONEditor.SearchBox.prototype.focusActiveResult = function () {
  6132. if (!this.activeResult) {
  6133. this.next();
  6134. }
  6135. if (this.activeResult) {
  6136. this.activeResult.node.focus(this.activeResult.elem);
  6137. }
  6138. };
  6139. /**
  6140. * Cancel any running onDelayedSearch.
  6141. */
  6142. JSONEditor.SearchBox.prototype.clearDelay = function () {
  6143. if (this.timeout != undefined) {
  6144. clearTimeout(this.timeout);
  6145. delete this.timeout;
  6146. }
  6147. };
  6148. /**
  6149. * Start a timer to execute a search after a short delay.
  6150. * Used for reducing the number of searches while typing.
  6151. * @param {Event} event
  6152. */
  6153. JSONEditor.SearchBox.prototype.onDelayedSearch = function (event) {
  6154. // execute the search after a short delay (reduces the number of
  6155. // search actions while typing in the search text box)
  6156. this.clearDelay();
  6157. var searchBox = this;
  6158. this.timeout = setTimeout(function (event) {
  6159. searchBox.onSearch(event);
  6160. },
  6161. this.delay);
  6162. };
  6163. /**
  6164. * Handle onSearch event
  6165. * @param {Event} event
  6166. * @param {boolean} [forceSearch] If true, search will be executed again even
  6167. * when the search text is not changed.
  6168. * Default is false.
  6169. */
  6170. JSONEditor.SearchBox.prototype.onSearch = function (event, forceSearch) {
  6171. this.clearDelay();
  6172. var value = this.dom.search.value;
  6173. var text = (value.length > 0) ? value : undefined;
  6174. if (text != this.lastText || forceSearch) {
  6175. // only search again when changed
  6176. this.lastText = text;
  6177. this.results = this.editor.search(text);
  6178. this.setActiveResult(undefined);
  6179. // display search results
  6180. if (text != undefined) {
  6181. var resultCount = this.results.length;
  6182. switch (resultCount) {
  6183. case 0:
  6184. this.dom.results.innerHTML = '区块/值未找到';
  6185. break;
  6186. default:
  6187. this.dom.results.innerHTML = '找到&nbsp;' + resultCount + '&nbsp;个结果';
  6188. break;
  6189. }
  6190. } else {
  6191. this.dom.results.innerHTML = '';
  6192. }
  6193. }
  6194. };
  6195. /**
  6196. * Handle onKeyDown event in the input box
  6197. * @param {Event} event
  6198. */
  6199. JSONEditor.SearchBox.prototype.onKeyDown = function (event) {
  6200. event = event || window.event;
  6201. var keynum = event.which || event.keyCode;
  6202. if (keynum == 27) { // ESC
  6203. this.dom.search.value = ''; // clear search
  6204. this.onSearch(event);
  6205. JSONEditor.Events.preventDefault(event);
  6206. JSONEditor.Events.stopPropagation(event);
  6207. } else if (keynum == 13) { // Enter
  6208. if (event.ctrlKey) {
  6209. // force to search again
  6210. this.onSearch(event, true);
  6211. } else if (event.shiftKey) {
  6212. // move to the previous search result
  6213. this.previous();
  6214. } else {
  6215. // move to the next search result
  6216. this.next();
  6217. }
  6218. JSONEditor.Events.preventDefault(event);
  6219. JSONEditor.Events.stopPropagation(event);
  6220. }
  6221. };
  6222. /**
  6223. * Handle onKeyUp event in the input box
  6224. * @param {Event} event
  6225. */
  6226. JSONEditor.SearchBox.prototype.onKeyUp = function (event) {
  6227. event = event || window.event;
  6228. var keynum = event.which || event.keyCode;
  6229. if (keynum != 27 && keynum != 13) { // !ESC and !Enter
  6230. this.onDelayedSearch(event); // For IE 8
  6231. }
  6232. };
  6233. // create namespace for event methods
  6234. JSONEditor.Events = {};
  6235. /**
  6236. * Add and event listener. Works for all browsers
  6237. * @param {Element} element An html element
  6238. * @param {string} action The action, for example "click",
  6239. * without the prefix "on"
  6240. * @param {function} listener The callback function to be executed
  6241. * @param {boolean} useCapture
  6242. * @return {function} the created event listener
  6243. */
  6244. JSONEditor.Events.addEventListener = function (element, action, listener, useCapture) {
  6245. if (element.addEventListener) {
  6246. if (useCapture === undefined) useCapture = false;
  6247. if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
  6248. action = "DOMMouseScroll"; // For Firefox
  6249. }
  6250. element.addEventListener(action, listener, useCapture);
  6251. return listener;
  6252. } else {
  6253. // IE browsers
  6254. var f = function () {
  6255. return listener.call(element, window.event);
  6256. };
  6257. element.attachEvent("on" + action, f);
  6258. return f;
  6259. }
  6260. };
  6261. /**
  6262. * Remove an event listener from an element
  6263. * @param {Element} element An html dom element
  6264. * @param {string} action The name of the event, for example "mousedown"
  6265. * @param {function} listener The listener function
  6266. * @param {boolean} useCapture
  6267. */
  6268. JSONEditor.Events.removeEventListener = function (element, action, listener, useCapture) {
  6269. if (element.removeEventListener) {
  6270. // non-IE browsers
  6271. if (useCapture === undefined) useCapture = false;
  6272. if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
  6273. action = "DOMMouseScroll"; // For Firefox
  6274. }
  6275. element.removeEventListener(action, listener, useCapture);
  6276. } else {
  6277. // IE browsers
  6278. element.detachEvent("on" + action, listener);
  6279. }
  6280. };
  6281. /**
  6282. * Stop event propagation
  6283. * @param {Event} event
  6284. */
  6285. JSONEditor.Events.stopPropagation = function (event) {
  6286. if (!event) event = window.event;
  6287. if (event.stopPropagation) {
  6288. event.stopPropagation(); // non-IE browsers
  6289. } else {
  6290. event.cancelBubble = true; // IE browsers
  6291. }
  6292. };
  6293. /**
  6294. * Cancels the event if it is cancelable, without stopping further propagation of the event.
  6295. * @param {Event} event
  6296. */
  6297. JSONEditor.Events.preventDefault = function (event) {
  6298. if (!event) event = window.event;
  6299. if (event.preventDefault) {
  6300. event.preventDefault(); // non-IE browsers
  6301. } else {
  6302. event.returnValue = false; // IE browsers
  6303. }
  6304. };
  6305. /**
  6306. * Retrieve the absolute left value of a DOM element
  6307. * @param {Element} elem A dom element, for example a div
  6308. * @return {Number} left The absolute left position of this element
  6309. * in the browser page.
  6310. */
  6311. JSONEditor.getAbsoluteLeft = function (elem) {
  6312. var left = 0;
  6313. var body = document.body;
  6314. while (elem != null && elem != body) {
  6315. left += elem.offsetLeft;
  6316. left -= elem.scrollLeft;
  6317. elem = elem.offsetParent;
  6318. }
  6319. return left;
  6320. };
  6321. /**
  6322. * Retrieve the absolute top value of a DOM element
  6323. * @param {Element} elem A dom element, for example a div
  6324. * @return {Number} top The absolute top position of this element
  6325. * in the browser page.
  6326. */
  6327. JSONEditor.getAbsoluteTop = function (elem) {
  6328. var top = 0;
  6329. var body = document.body;
  6330. while (elem != null && elem != body) {
  6331. top += elem.offsetTop;
  6332. top -= elem.scrollTop;
  6333. elem = elem.offsetParent;
  6334. }
  6335. return top;
  6336. };
  6337. /**
  6338. * add a className to the given elements style
  6339. * @param {Element} elem
  6340. * @param {String} className
  6341. */
  6342. JSONEditor.addClassName = function (elem, className) {
  6343. var classes = elem.className.split(' ');
  6344. if (classes.indexOf(className) == -1) {
  6345. classes.push(className); // add the class to the array
  6346. elem.className = classes.join(' ');
  6347. }
  6348. };
  6349. /**
  6350. * add a className to the given elements style
  6351. * @param {Element} elem
  6352. * @param {String} className
  6353. */
  6354. JSONEditor.removeClassName = function (elem, className) {
  6355. var classes = elem.className.split(' ');
  6356. var index = classes.indexOf(className);
  6357. if (index != -1) {
  6358. classes.splice(index, 1); // remove the class from the array
  6359. elem.className = classes.join(' ');
  6360. }
  6361. };
  6362. /**
  6363. * Strip the formatting from the contents of a div
  6364. * the formatting from the div itself is not stripped, only from its childs.
  6365. * @param {Element} divElement
  6366. */
  6367. JSONEditor.stripFormatting = function (divElement) {
  6368. var childs = divElement.childNodes;
  6369. for (var i = 0, iMax = childs.length; i < iMax; i++) {
  6370. var child = childs[i];
  6371. // remove the style
  6372. if (child.style) {
  6373. // TODO: test if child.attributes does contain style
  6374. child.removeAttribute('style');
  6375. }
  6376. // remove all attributes
  6377. var attributes = child.attributes;
  6378. if (attributes) {
  6379. for (var j = attributes.length - 1; j >= 0; j--) {
  6380. var attribute = attributes[j];
  6381. if (attribute.specified == true) {
  6382. child.removeAttribute(attribute.name);
  6383. }
  6384. }
  6385. }
  6386. // recursively strip childs
  6387. JSONEditor.stripFormatting(child);
  6388. }
  6389. };
  6390. /**
  6391. * Set focus to the end of an editable div
  6392. * code from Nico Burns
  6393. * http://stackoverflow.com/users/140293/nico-burns
  6394. * http://stackoverflow.com/questions/1125292/how-to-move-cursor-to-end-of-contenteditable-entity
  6395. * @param {Element} contentEditableElement
  6396. */
  6397. JSONEditor.setEndOfContentEditable = function (contentEditableElement) {
  6398. var range, selection;
  6399. if (document.createRange) { //Firefox, Chrome, Opera, Safari, IE 9+
  6400. range = document.createRange(); //Create a range (a range is a like the selection but invisible)
  6401. range.selectNodeContents(contentEditableElement); //Select the entire contents of the element with the range
  6402. range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
  6403. selection = window.getSelection(); //get the selection object (allows you to change selection)
  6404. selection.removeAllRanges(); //remove any selections already made
  6405. selection.addRange(range); //make the range you have just created the visible selection
  6406. } else if (document.selection) { //IE 8 and lower
  6407. range = document.body.createTextRange(); //Create a range (a range is a like the selection but invisible)
  6408. range.moveToElementText(contentEditableElement); //Select the entire contents of the element with the range
  6409. range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
  6410. range.select(); //Select the range (make it the visible selection
  6411. }
  6412. };
  6413. /**
  6414. * Get the inner text of an HTML element (for example a div element)
  6415. * @param {Element} element
  6416. * @param {Object} [buffer]
  6417. * @return {String} innerText
  6418. */
  6419. JSONEditor.getInnerText = function (element, buffer) {
  6420. var first = (buffer == undefined);
  6421. if (first) {
  6422. buffer = {
  6423. 'text': '',
  6424. 'flush': function () {
  6425. var text = this.text;
  6426. this.text = '';
  6427. return text;
  6428. },
  6429. 'set': function (text) {
  6430. this.text = text;
  6431. }
  6432. };
  6433. }
  6434. // text node
  6435. if (element.nodeValue) {
  6436. return buffer.flush() + element.nodeValue;
  6437. }
  6438. // divs or other HTML elements
  6439. if (element.hasChildNodes()) {
  6440. var childNodes = element.childNodes;
  6441. var innerText = '';
  6442. for (var i = 0, iMax = childNodes.length; i < iMax; i++) {
  6443. var child = childNodes[i];
  6444. if (child.nodeName == 'DIV' || child.nodeName == 'P') {
  6445. var prevChild = childNodes[i - 1];
  6446. var prevName = prevChild ? prevChild.nodeName : undefined;
  6447. if (prevName && prevName != 'DIV' && prevName != 'P' && prevName != 'BR') {
  6448. innerText += '\n';
  6449. buffer.flush();
  6450. }
  6451. innerText += JSONEditor.getInnerText(child, buffer);
  6452. buffer.set('\n');
  6453. } else if (child.nodeName == 'BR') {
  6454. innerText += buffer.flush();
  6455. buffer.set('\n');
  6456. } else {
  6457. innerText += JSONEditor.getInnerText(child, buffer);
  6458. }
  6459. }
  6460. return innerText;
  6461. } else {
  6462. if (element.nodeName == 'P' && JSONEditor.getInternetExplorerVersion() != -1) {
  6463. // On Internet Explorer, a <p> with hasChildNodes()==false is
  6464. // rendered with a new line. Note that a <p> with
  6465. // hasChildNodes()==true is rendered without a new line
  6466. // Other browsers always ensure there is a <br> inside the <p>,
  6467. // and if not, the <p> does not render a new line
  6468. return buffer.flush();
  6469. }
  6470. }
  6471. // br or unknown
  6472. return '';
  6473. };
  6474. /**
  6475. * Returns the version of Internet Explorer or a -1
  6476. * (indicating the use of another browser).
  6477. * Source: http://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx
  6478. * @return {Number} Internet Explorer version, or -1 in case of an other browser
  6479. */
  6480. JSONEditor._ieVersion = undefined;
  6481. JSONEditor.getInternetExplorerVersion = function () {
  6482. if (JSONEditor._ieVersion == undefined) {
  6483. var rv = -1; // Return value assumes failure.
  6484. if (navigator.appName == 'Microsoft Internet Explorer') {
  6485. var ua = navigator.userAgent;
  6486. var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
  6487. if (re.exec(ua) != null) {
  6488. rv = parseFloat(RegExp.$1);
  6489. }
  6490. }
  6491. JSONEditor._ieVersion = rv;
  6492. }
  6493. return JSONEditor._ieVersion;
  6494. };
  6495. JSONEditor.ieVersion = JSONEditor.getInternetExplorerVersion();
  6496. /**
  6497. * Parse JSON using the parser built-in in the browser.
  6498. * On exception, the jsonString is validated and a detailed error is thrown.
  6499. * @param {String} jsonString
  6500. */
  6501. JSONEditor.parse = function (jsonString) {
  6502. try {
  6503. return JSON.parse(jsonString);
  6504. } catch (err) {
  6505. // get a detailed error message using validate
  6506. var message = JSONEditor.validate(jsonString) || err;
  6507. throw new Error(message);
  6508. }
  6509. };
  6510. /**
  6511. * Validate a string containing a JSON object
  6512. * This method uses JSONLint to validate the String. If JSONLint is not
  6513. * available, the built-in JSON parser of the browser is used.
  6514. * @param {String} jsonString String with an (invalid) JSON object
  6515. * @return {String | undefined} Returns undefined when the string is valid JSON,
  6516. * returns a string with an error message when
  6517. * the data is invalid
  6518. */
  6519. JSONEditor.validate = function (jsonString) {
  6520. var message = undefined;
  6521. try {
  6522. if (window.jsonlint) {
  6523. window.jsonlint.parse(jsonString);
  6524. } else {
  6525. JSON.parse(jsonString);
  6526. }
  6527. } catch (err) {
  6528. message = '<pre class="error">' + err.toString() + '</pre>';
  6529. if (window.jsonlint) {
  6530. message +=
  6531. '<div id="by-jsonlint">由 <a class="error" href="http://zaach.github.com/jsonlint/" target="_blank">' +
  6532. 'JSONLint' +
  6533. '</a> 提供验证.</div>';
  6534. }
  6535. }
  6536. return message;
  6537. };
  6538. </script>
  6539. <script type="text/javascript">
  6540. $("#saveAsEditorOnline").click(function () {
  6541. var content = editor.get();
  6542. //var blob = new Blob([content], {type: "text/plain;charset=utf-8"});
  6543. //saveAs(blob, "content.json");
  6544. //console.log(content);
  6545. parent && parent.editorCall && parent.editorCall("save", content);
  6546. });
  6547. try {
  6548. var json = {
  6549. "name": "loke",
  6550. "isGood": true,
  6551. "links": [{
  6552. "name": "Baidu",
  6553. "url": "http://www.baidu.com"
  6554. }]
  6555. };
  6556. // editor
  6557. container = document.getElementById("jsoneditor");
  6558. editor = new JSONEditor(container, {
  6559. change: function () {
  6560. }
  6561. });
  6562. editor.set(json);
  6563. //--------------------------------------
  6564. document.body.spellcheck = false;
  6565. function appResize() {
  6566. }
  6567. }
  6568. catch (e) {
  6569. }
  6570. $(function () {
  6571. parent && parent.editorCall && parent.editorCall("init", function (json) {
  6572. json = JSON.parse(JSON.stringify(json));
  6573. editor.set(json);
  6574. });
  6575. });
  6576. </script>
  6577. </body>
  6578. </html>