1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=0,user-scalable=yes,maximum-scale=1.0">
- <title>JSON在线编辑器</title>
- <style>
- .jsoneditor-field, .jsoneditor-value, .jsoneditor-field-readonly, .jsoneditor-readonly {
- border: 1px solid transparent;
- min-height: 16px;
- min-width: 24px;
- padding: 2px;
- margin: 1px;
- outline: none;
- word-wrap: break-word;
- float: left;
- }
- /* adjust margin of p elements inside editable divs, needed for Opera, IE */
- .jsoneditor-field p, .jsoneditor-value p {
- margin: 0;
- }
- .jsoneditor-value {
- word-break: break-word;
- }
- .jsoneditor-empty {
- background-color: #E5E5E5;
- border-radius: 2px;
- }
- .jsoneditor-separator {
- padding: 3px 0;
- vertical-align: top;
- }
- .jsoneditor-value:focus, .jsoneditor-field:focus,
- .jsoneditor-value:hover, .jsoneditor-field:hover,
- .jsoneditor-search-highlight {
- background-color: #FFFFAB;
- border: 1px solid yellow;
- border-radius: 2px;
- }
- .jsoneditor-search-highlight-active,
- .jsoneditor-search-highlight-active:focus,
- .jsoneditor-search-highlight-active:hover {
- background-color: #ffee00;
- border: 1px solid #ffc700;
- border-radius: 2px;
- }
- .jsoneditor-field-readonly:hover {
- border: 1px solid white;
- }
- .jsoneditor-readonly {
- color: gray;
- }
- button.jsoneditor-remove, button.jsoneditor-append, button.jsoneditor-duplicate,
- button.jsoneditor-collapsed, button.jsoneditor-expanded,
- button.jsoneditor-invisible, button.jsoneditor-dragarea,
- button.jsoneditor-type-auto, button.jsoneditor-type-string,
- button.jsoneditor-type-array, button.jsoneditor-type-object {
- width: 24px;
- height: 24px;
- padding: 0;
- margin: 0;
- border: none;
- cursor: pointer;
- 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=');
- }
- button:disabled {
- color: #808080;
- }
- button.jsoneditor-collapsed {
- background-position: -168px 0;
- }
- button.jsoneditor-expanded {
- background-position: -168px -24px;
- }
- button.jsoneditor-invisible {
- visibility: hidden;
- background: none;
- }
- button.jsoneditor-collapsed, button.jsoneditor-expanded,
- button.jsoneditor-invisible {
- float: left;
- }
- button.jsoneditor-remove {
- background-position: -24px -24px;
- }
- button.jsoneditor-remove:hover {
- background-position: -24px 0;
- }
- button.jsoneditor-append {
- background-position: 0 -24px;
- }
- button.jsoneditor-append:hover {
- background-position: 0 0;
- }
- button.jsoneditor-duplicate {
- background-position: -48px -24px;
- }
- button.jsoneditor-duplicate:hover {
- background-position: -48px 0;
- }
- button.jsoneditor-type-string {
- background-position: -144px -24px;
- }
- button.jsoneditor-type-string:hover {
- background-position: -144px 0;
- }
- button.jsoneditor-type-auto {
- background-position: -120px -24px;
- }
- button.jsoneditor-type-auto:hover {
- background-position: -120px 0;
- }
- button.jsoneditor-type-object {
- background-position: -72px -24px;
- }
- button.jsoneditor-type-object:hover {
- background-position: -72px 0;
- }
- button.jsoneditor-type-array {
- background-position: -96px -24px;
- }
- button.jsoneditor-type-array:hover {
- background-position: -96px 0;
- }
- div.jsoneditor-select {
- border: 1px solid gray;
- background-color: white;
- box-shadow: 4px 4px 10px rgba(128, 128, 128, 0.5);
- }
- div.jsoneditor-option {
- color: #4D4D4D;
- background-color: white;
- border: none;
- margin: 0;
- display: block;
- text-align: left;
- cursor: pointer;
- }
- div.jsoneditor-option:hover {
- background-color: #FFFFAB;
- color: #1A1A1A;
- }
- div.jsoneditor-option-selected {
- background-color: #C1C1C1;
- }
- div.jsoneditor-option-text {
- height: 24px;
- line-height: 24px;
- padding: 0 12px 0 0;
- display: inline-block;
- }
- div.jsoneditor-option-string, div.jsoneditor-option-auto,
- div.jsoneditor-option-object, div.jsoneditor-option-array {
- float: left;
- width: 24px;
- height: 24px;
- display: inline-block;
- 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=');
- }
- div.jsoneditor-option-string {
- background-position: -144px 0;
- }
- div.jsoneditor-option-auto {
- background-position: -120px 0;
- }
- div.jsoneditor-option-object {
- background-position: -72px 0;
- }
- div.jsoneditor-option-array {
- background-position: -96px 0;
- }
- div.jsoneditor-frame {
- color: #1A1A1A;
- border: 1px solid #C1C1C1;
- box-sizing: border-box;
- width: 100%;
- height: 100%;
- overflow: auto;
- position: relative;
- padding: 0;
- }
- table.jsoneditor-table {
- border-collapse: collapse;
- border-spacing: 0;
- width: 100%;
- margin: 0;
- }
- div.jsoneditor-content-outer, div.jsonformatter-content {
- width: 100%;
- height: 100%;
- margin: -35px 0 0 0;
- padding: 35px 0 0 0;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- overflow: hidden;
- }
- div.jsoneditor-content {
- width: 100%;
- height: 100%;
- position: relative;
- overflow: auto;
- }
- textarea.jsonformatter-textarea {
- width: 100%;
- height: 100%;
- margin: 0;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- border: none;
- background-color: white;
- resize: none;
- }
- tr.jsoneditor-tr-highlight {
- background-color: #FFFFAB;
- }
- button.jsoneditor-dragarea {
- width: 16px;
- height: 24px;
- /*
- margin: 3px 0;
- background: url('img/dots_gray.gif') top center;
- background-repeat: repeat-y;
- */
- 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;
- display: block;
- cursor: move;
- }
- div.jsoneditor-menu {
- width: 100%;
- height: 35px;
- padding: 2px;
- margin: 0;
- overflow: hidden;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- color: #1A1A1A;
- border-bottom: 1px solid #C1C1C1;
- }
- table.jsoneditor-search {
- position: absolute;
- right: 2px;
- top: 2px;
- }
- table.jsoneditor-search-input {
- border-collapse: collapse;
- }
- div.jsoneditor-search {
- border: 1px solid #C1C1C1;
- background-color: white;
- padding: 0 2px;
- margin: 0;
- }
- input.jsoneditor-search {
- width: 120px;
- border: none;
- outline: none;
- margin: 1px;
- }
- div.jsoneditor-search-results {
- color: #4d4d4d;
- padding-right: 5px;
- }
- button.jsoneditor-search-refresh, button.jsoneditor-search-next,
- button.jsoneditor-search-previous {
- width: 16px;
- height: 24px;
- padding: 0;
- margin: 0;
- border: none;
- 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=');
- vertical-align: top;
- }
- button.jsoneditor-search-refresh {
- width: 18px;
- background-position: -243px -25px;
- }
- button.jsoneditor-search-next {
- cursor: pointer;
- background-position: -268px -25px;
- }
- button.jsoneditor-search-next:hover {
- background-position: -268px -1px;
- }
- button.jsoneditor-search-previous {
- cursor: pointer;
- background-position: -292px -25px;
- margin-right: 2px;
- }
- button.jsoneditor-search-previous:hover {
- background-position: -292px -1px;
- }
- button.jsoneditor-menu {
- width: 26px;
- height: 26px;
- margin: 2px;
- padding: 2px;
- border-radius: 2px;
- border: 1px solid #aec0f8;
- 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=');
- }
- button.jsoneditor-menu:hover {
- background-color: #FFFFFF;
- }
- button.jsoneditor-menu:active {
- background-color: #ffffff;
- }
- button.jsoneditor-menu:disabled {
- background-color: #D0F0EF;
- }
- button.jsoneditor-collapse-all {
- background-position: -312px 0;
- }
- button.jsoneditor-expand-all {
- background-position: -312px -24px;
- }
- button.jsoneditor-undo {
- background-position: -336px 0;
- }
- button.jsoneditor-redo {
- background-position: -360px 0;
- }
- button.jsoneditor-undo:disabled {
- background-position: -336px -24px;
- }
- button.jsoneditor-redo:disabled {
- background-position: -360px -24px;
- }
- /* TODO: css for button:disabled is not supported by IE8 */
- button.jsoneditor-compact {
- background-position: -384px 0;
- }
- button.jsoneditor-format {
- background-position: -384px -24px;
- }
- tr, th, td {
- padding: 0;
- margin: 0;
- }
- td.jsoneditor-td {
- vertical-align: top;
- }
- td.jsoneditor-td {
- padding: 0 3px;
- }
- td.jsoneditor-td-edit {
- background-color: #F5F5F5;
- padding: 0;
- }
- td.jsoneditor-td-tree {
- vertical-align: top;
- }
- td.jsoneditor-droparea {
- height: 24px;
- border-top: 1px dashed gray;
- border-bottom: 1px dashed gray;
- background-color: #FFFF80;
- }
- .jsoneditor-field, .jsoneditor-value, .jsoneditor-td, .jsoneditor-th,
- .jsoneditor-type,
- .jsonformatter-textarea {
- font-family: droid sans mono, monospace, courier new, courier, sans-serif;
- font-size: 10pt;
- color: #1A1A1A;
- }
- .jsoneditor-hidden-focus {
- position: absolute;
- left: -1000px;
- top: -1000px;
- border: none;
- outline: none;
- }
- #by-jsonlint {
- text-align: right;
- }
- body, html {
- margin: 0;
- padding: 0;
- }
- #content-wrapper {
- padding: 1vh;
- }
- #jsonformatter, #jsoneditor {
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- top: 32px;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- clear: none;
- margin: 0 !important;
- }
- #jsoneditor {
- float: right;
- }
- .title {
- background: rgba(0, 0, 0, .6);
- height: 32px;
- line-height: 32px;
- padding: 0 1vh;
- color: #fff;
- position: relative;
- vertical-align: top;
- }
- .title .tool {
- position: absolute;
- left: 50%;
- top: 0;
- margin-left: -109px;
- display: inline-block;
- }
- .title .tool button + button {
- margin-left: 1vw;
- }
- .title button {
- display: inline-block;
- border: 1px solid #ccc;
- background: rgba(204, 212, 159, .9);
- height: 24px;
- line-height: 24px;
- padding: 0 10px;
- cursor: pointer;
- }
- .title button:hover {
- background: rgba(204, 212, 159, .6);
- }
- #saveAsEditorOnline {
- position: absolute;
- top: 4px;
- right: 1vh;
- }
- </style>
- </head>
- <body>
- <div class="title">
- <span>JSON编辑器</span>
- <button id="saveAsEditorOnline">保存JSON</button>
- </div>
- <!-- start 各个模块代码 -->
- <!--内容块开始-->
- <div id="content-wrapper" style="min-height:100px" class="t-big-margin">
- <div id="jsoneditor"></div>
- <div class="clear" style="clear: both; "></div>
- </div>
- <script>
- /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
- //@ sourceMappingURL=jquery.min.map
- */
- (function (e, t) {
- var n, r, i = typeof t, o = e.document, a = e.location, s = e.jQuery, u = e.$, l = {}, c = [], p = "1.9.1",
- f = c.concat, d = c.push, h = c.slice, g = c.indexOf, m = l.toString, y = l.hasOwnProperty, v = p.trim,
- b = function (e, t) {
- return new b.fn.init(e, t, r)
- }, x = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, w = /\S+/g, T = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
- N = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/, C = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, k = /^[\],:{}\s]*$/,
- E = /(?:^|:|,)(?:\s*\[)+/g, S = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
- A = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, j = /^-ms-/, D = /-([\da-z])/gi,
- L = function (e, t) {
- return t.toUpperCase()
- }, H = function (e) {
- (o.addEventListener || "load" === e.type || "complete" === o.readyState) && (q(), b.ready())
- }, q = function () {
- o.addEventListener ? (o.removeEventListener("DOMContentLoaded", H, !1), e.removeEventListener("load", H, !1)) : (o.detachEvent("onreadystatechange", H), e.detachEvent("onload", H))
- };
- b.fn = b.prototype = {
- jquery: p, constructor: b, init: function (e, n, r) {
- var i, a;
- if (!e)return this;
- if ("string" == typeof e) {
- 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);
- if (i[1]) {
- 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]);
- return this
- }
- if (a = o.getElementById(i[2]), a && a.parentNode) {
- if (a.id !== i[2])return r.find(e);
- this.length = 1, this[0] = a
- }
- return this.context = o, this.selector = e, this
- }
- 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))
- }, selector: "", length: 0, size: function () {
- return this.length
- }, toArray: function () {
- return h.call(this)
- }, get: function (e) {
- return null == e ? this.toArray() : 0 > e ? this[this.length + e] : this[e]
- }, pushStack: function (e) {
- var t = b.merge(this.constructor(), e);
- return t.prevObject = this, t.context = this.context, t
- }, each: function (e, t) {
- return b.each(this, e, t)
- }, ready: function (e) {
- return b.ready.promise().done(e), this
- }, slice: function () {
- return this.pushStack(h.apply(this, arguments))
- }, first: function () {
- return this.eq(0)
- }, last: function () {
- return this.eq(-1)
- }, eq: function (e) {
- var t = this.length, n = +e + (0 > e ? t : 0);
- return this.pushStack(n >= 0 && t > n ? [this[n]] : [])
- }, map: function (e) {
- return this.pushStack(b.map(this, function (t, n) {
- return e.call(t, n, t)
- }))
- }, end: function () {
- return this.prevObject || this.constructor(null)
- }, push: d, sort: [].sort, splice: [].splice
- }, b.fn.init.prototype = b.fn, b.extend = b.fn.extend = function () {
- var e, n, r, i, o, a, s = arguments[0] || {}, u = 1, l = arguments.length, c = !1;
- 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));
- return s
- }, b.extend({
- noConflict: function (t) {
- return e.$ === b && (e.$ = u), t && e.jQuery === b && (e.jQuery = s), b
- }, isReady: !1, readyWait: 1, holdReady: function (e) {
- e ? b.readyWait++ : b.ready(!0)
- }, ready: function (e) {
- if (e === !0 ? !--b.readyWait : !b.isReady) {
- if (!o.body)return setTimeout(b.ready);
- b.isReady = !0, e !== !0 && --b.readyWait > 0 || (n.resolveWith(o, [b]), b.fn.trigger && b(o).trigger("ready").off("ready"))
- }
- }, isFunction: function (e) {
- return "function" === b.type(e)
- }, isArray: Array.isArray || function (e) {
- return "array" === b.type(e)
- }, isWindow: function (e) {
- return null != e && e == e.window
- }, isNumeric: function (e) {
- return !isNaN(parseFloat(e)) && isFinite(e)
- }, type: function (e) {
- return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? l[m.call(e)] || "object" : typeof e
- }, isPlainObject: function (e) {
- if (!e || "object" !== b.type(e) || e.nodeType || b.isWindow(e))return !1;
- try {
- if (e.constructor && !y.call(e, "constructor") && !y.call(e.constructor.prototype, "isPrototypeOf"))return !1
- } catch (n) {
- return !1
- }
- var r;
- for (r in e);
- return r === t || y.call(e, r)
- }, isEmptyObject: function (e) {
- var t;
- for (t in e)return !1;
- return !0
- }, error: function (e) {
- throw Error(e)
- }, parseHTML: function (e, t, n) {
- if (!e || "string" != typeof e)return null;
- "boolean" == typeof t && (n = t, t = !1), t = t || o;
- var r = C.exec(e), i = !n && [];
- return r ? [t.createElement(r[1])] : (r = b.buildFragment([e], t, i), i && b(i).remove(), b.merge([], r.childNodes))
- }, parseJSON: function (n) {
- 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)
- }, parseXML: function (n) {
- var r, i;
- if (!n || "string" != typeof n)return null;
- try {
- e.DOMParser ? (i = new DOMParser, r = i.parseFromString(n, "text/xml")) : (r = new ActiveXObject("Microsoft.XMLDOM"), r.async = "false", r.loadXML(n))
- } catch (o) {
- r = t
- }
- return r && r.documentElement && !r.getElementsByTagName("parsererror").length || b.error("Invalid XML: " + n), r
- }, noop: function () {
- }, globalEval: function (t) {
- t && b.trim(t) && (e.execScript || function (t) {
- e.eval.call(e, t)
- })(t)
- }, camelCase: function (e) {
- return e.replace(j, "ms-").replace(D, L)
- }, nodeName: function (e, t) {
- return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase()
- }, each: function (e, t, n) {
- var r, i = 0, o = e.length, a = M(e);
- if (n) {
- if (a) {
- for (; o > i; i++)if (r = t.apply(e[i], n), r === !1)break
- } else for (i in e)if (r = t.apply(e[i], n), r === !1)break
- } else if (a) {
- for (; o > i; i++)if (r = t.call(e[i], i, e[i]), r === !1)break
- } else for (i in e)if (r = t.call(e[i], i, e[i]), r === !1)break;
- return e
- }, trim: v && !v.call("\ufeff\u00a0") ? function (e) {
- return null == e ? "" : v.call(e)
- } : function (e) {
- return null == e ? "" : (e + "").replace(T, "")
- }, makeArray: function (e, t) {
- var n = t || [];
- return null != e && (M(Object(e)) ? b.merge(n, "string" == typeof e ? [e] : e) : d.call(n, e)), n
- }, inArray: function (e, t, n) {
- var r;
- if (t) {
- if (g)return g.call(t, e, n);
- 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
- }
- return -1
- }, merge: function (e, n) {
- var r = n.length, i = e.length, o = 0;
- if ("number" == typeof r)for (; r > o; o++)e[i++] = n[o]; else while (n[o] !== t)e[i++] = n[o++];
- return e.length = i, e
- }, grep: function (e, t, n) {
- var r, i = [], o = 0, a = e.length;
- for (n = !!n; a > o; o++)r = !!t(e[o], o), n !== r && i.push(e[o]);
- return i
- }, map: function (e, t, n) {
- var r, i = 0, o = e.length, a = M(e), s = [];
- 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);
- return f.apply([], s)
- }, guid: 1, proxy: function (e, n) {
- var r, i, o;
- return "string" == typeof n && (o = e[n], n = e, e = o), b.isFunction(e) ? (r = h.call(arguments, 2), i = function () {
- return e.apply(n || this, r.concat(h.call(arguments)))
- }, i.guid = e.guid = e.guid || b.guid++, i) : t
- }, access: function (e, n, r, i, o, a, s) {
- var u = 0, l = e.length, c = null == r;
- if ("object" === b.type(r)) {
- o = !0;
- for (u in r)b.access(e, n, u, r[u], !0, a, s)
- } 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) {
- return c.call(b(e), n)
- })), n))for (; l > u; u++)n(e[u], r, s ? i : i.call(e[u], u, n(e[u], r)));
- return o ? e : c ? n.call(e) : l ? n(e[0], r) : a
- }, now: function () {
- return (new Date).getTime()
- }
- }), b.ready.promise = function (t) {
- 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 {
- o.attachEvent("onreadystatechange", H), e.attachEvent("onload", H);
- var r = !1;
- try {
- r = null == e.frameElement && o.documentElement
- } catch (i) {
- }
- r && r.doScroll && function a() {
- if (!b.isReady) {
- try {
- r.doScroll("left")
- } catch (e) {
- return setTimeout(a, 50)
- }
- q(), b.ready()
- }
- }()
- }
- return n.promise(t)
- }, b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (e, t) {
- l["[object " + t + "]"] = t.toLowerCase()
- });
- function M(e) {
- var t = e.length, n = b.type(e);
- 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)
- }
- r = b(o);
- var _ = {};
- function F(e) {
- var t = _[e] = {};
- return b.each(e.match(w) || [], function (e, n) {
- t[n] = !0
- }), t
- }
- b.Callbacks = function (e) {
- e = "string" == typeof e ? _[e] || F(e) : b.extend({}, e);
- var n, r, i, o, a, s, u = [], l = !e.once && [], c = function (t) {
- 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) {
- r = !1;
- break
- }
- n = !1, u && (l ? l.length && c(l.shift()) : r ? u = [] : p.disable())
- }, p = {
- add: function () {
- if (u) {
- var t = u.length;
- (function i(t) {
- b.each(t, function (t, n) {
- var r = b.type(n);
- "function" === r ? e.unique && p.has(n) || u.push(n) : n && n.length && "string" !== r && i(n)
- })
- })(arguments), n ? o = u.length : r && (s = t, c(r))
- }
- return this
- }, remove: function () {
- return u && b.each(arguments, function (e, t) {
- var r;
- while ((r = b.inArray(t, u, r)) > -1)u.splice(r, 1), n && (o >= r && o--, a >= r && a--)
- }), this
- }, has: function (e) {
- return e ? b.inArray(e, u) > -1 : !(!u || !u.length)
- }, empty: function () {
- return u = [], this
- }, disable: function () {
- return u = l = r = t, this
- }, disabled: function () {
- return !u
- }, lock: function () {
- return l = t, r || p.disable(), this
- }, locked: function () {
- return !l
- }, fireWith: function (e, t) {
- return t = t || [], t = [e, t.slice ? t.slice() : t], !u || i && !l || (n ? l.push(t) : c(t)), this
- }, fire: function () {
- return p.fireWith(this, arguments), this
- }, fired: function () {
- return !!i
- }
- };
- return p
- }, b.extend({
- Deferred: function (e) {
- var t = [["resolve", "done", b.Callbacks("once memory"), "resolved"], ["reject", "fail", b.Callbacks("once memory"), "rejected"], ["notify", "progress", b.Callbacks("memory")]],
- n = "pending", r = {
- state: function () {
- return n
- }, always: function () {
- return i.done(arguments).fail(arguments), this
- }, then: function () {
- var e = arguments;
- return b.Deferred(function (n) {
- b.each(t, function (t, o) {
- var a = o[0], s = b.isFunction(e[t]) && e[t];
- i[o[1]](function () {
- var e = s && s.apply(this, arguments);
- 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)
- })
- }), e = null
- }).promise()
- }, promise: function (e) {
- return null != e ? b.extend(e, r) : r
- }
- }, i = {};
- return r.pipe = r.then, b.each(t, function (e, o) {
- var a = o[2], s = o[3];
- r[o[1]] = a.add, s && a.add(function () {
- n = s
- }, t[1 ^ e][2].disable, t[2][2].lock), i[o[0]] = function () {
- return i[o[0] + "With"](this === i ? r : this, arguments), this
- }, i[o[0] + "With"] = a.fireWith
- }), r.promise(i), e && e.call(i, i), i
- }, when: function (e) {
- var t = 0, n = h.call(arguments), r = n.length, i = 1 !== r || e && b.isFunction(e.promise) ? r : 0,
- o = 1 === i ? e : b.Deferred(), a = function (e, t, n) {
- return function (r) {
- t[e] = this, n[e] = arguments.length > 1 ? h.call(arguments) : r, n === s ? o.notifyWith(t, n) : --i || o.resolveWith(t, n)
- }
- }, s, u, l;
- 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;
- return i || o.resolveWith(l, n), o.promise()
- }
- }), b.support = function () {
- var t, n, r, a, s, u, l, c, p, f, d = o.createElement("div");
- 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 {};
- 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 = {
- getSetAttribute: "t" !== d.className,
- leadingWhitespace: 3 === d.firstChild.nodeType,
- tbody: !d.getElementsByTagName("tbody").length,
- htmlSerialize: !!d.getElementsByTagName("link").length,
- style: /top/.test(r.getAttribute("style")),
- hrefNormalized: "/a" === r.getAttribute("href"),
- opacity: /^0.5/.test(r.style.opacity),
- cssFloat: !!r.style.cssFloat,
- checkOn: !!a.value,
- optSelected: l.selected,
- enctype: !!o.createElement("form").enctype,
- html5Clone: "<:nav></:nav>" !== o.createElement("nav").cloneNode(!0).outerHTML,
- boxModel: "CSS1Compat" === o.compatMode,
- deleteExpando: !0,
- noCloneEvent: !0,
- inlineBlockNeedsLayout: !1,
- shrinkWrapBlocks: !1,
- reliableMarginRight: !0,
- boxSizingReliable: !0,
- pixelPosition: !1
- }, a.checked = !0, t.noCloneChecked = a.cloneNode(!0).checked, s.disabled = !0, t.optDisabled = !l.disabled;
- try {
- delete d.test
- } catch (h) {
- t.deleteExpando = !1
- }
- 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 () {
- t.noCloneEvent = !1
- }), d.cloneNode(!0).click());
- for (f in{
- submit: !0,
- change: !0,
- focusin: !0
- })d.setAttribute(c = "on" + f, "t"), t[f + "Bubbles"] = c in e || d.attributes[c].expando === !1;
- return d.style.backgroundClip = "content-box", d.cloneNode(!0).style.backgroundClip = "", t.clearCloneStyle = "content-box" === d.style.backgroundClip, b(function () {
- var n, r, a,
- s = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
- u = o.getElementsByTagName("body")[0];
- 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)
- }), n = s = u = l = r = a = null, t
- }();
- var O = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, B = /([A-Z])/g;
- function P(e, n, r, i) {
- if (b.acceptData(e)) {
- var o, a, s = b.expando, u = "string" == typeof n, l = e.nodeType, p = l ? b.cache : e,
- f = l ? e[s] : e[s] && s;
- 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
- }
- }
- function R(e, t, n) {
- if (b.acceptData(e)) {
- var r, i, o, a = e.nodeType, s = a ? b.cache : e, u = a ? e[b.expando] : b.expando;
- if (s[u]) {
- if (t && (o = n ? s[u] : s[u].data)) {
- 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(" "));
- for (r = 0, i = t.length; i > r; r++)delete o[t[r]];
- if (!(n ? $ : b.isEmptyObject)(o))return
- }
- (n || (delete s[u].data, $(s[u]))) && (a ? b.cleanData([e], !0) : b.support.deleteExpando || s != s.window ? delete s[u] : s[u] = null)
- }
- }
- }
- b.extend({
- cache: {},
- expando: "jQuery" + (p + Math.random()).replace(/\D/g, ""),
- noData: {embed: !0, object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", applet: !0},
- hasData: function (e) {
- return e = e.nodeType ? b.cache[e[b.expando]] : e[b.expando], !!e && !$(e)
- },
- data: function (e, t, n) {
- return P(e, t, n)
- },
- removeData: function (e, t) {
- return R(e, t)
- },
- _data: function (e, t, n) {
- return P(e, t, n, !0)
- },
- _removeData: function (e, t) {
- return R(e, t, !0)
- },
- acceptData: function (e) {
- if (e.nodeType && 1 !== e.nodeType && 9 !== e.nodeType)return !1;
- var t = e.nodeName && b.noData[e.nodeName.toLowerCase()];
- return !t || t !== !0 && e.getAttribute("classid") === t
- }
- }), b.fn.extend({
- data: function (e, n) {
- var r, i, o = this[0], a = 0, s = null;
- if (e === t) {
- if (this.length && (s = b.data(o), 1 === o.nodeType && !b._data(o, "parsedAttrs"))) {
- 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]));
- b._data(o, "parsedAttrs", !0)
- }
- return s
- }
- return "object" == typeof e ? this.each(function () {
- b.data(this, e)
- }) : b.access(this, function (n) {
- return n === t ? o ? W(o, e, b.data(o, e)) : null : (this.each(function () {
- b.data(this, e, n)
- }), t)
- }, null, n, arguments.length > 1, null, !0)
- }, removeData: function (e) {
- return this.each(function () {
- b.removeData(this, e)
- })
- }
- });
- function W(e, n, r) {
- if (r === t && 1 === e.nodeType) {
- var i = "data-" + n.replace(B, "-$1").toLowerCase();
- if (r = e.getAttribute(i), "string" == typeof r) {
- try {
- r = "true" === r ? !0 : "false" === r ? !1 : "null" === r ? null : +r + "" === r ? +r : O.test(r) ? b.parseJSON(r) : r
- } catch (o) {
- }
- b.data(e, n, r)
- } else r = t
- }
- return r
- }
- function $(e) {
- var t;
- for (t in e)if (("data" !== t || !b.isEmptyObject(e[t])) && "toJSON" !== t)return !1;
- return !0
- }
- b.extend({
- queue: function (e, n, r) {
- var i;
- 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
- }, dequeue: function (e, t) {
- t = t || "fx";
- var n = b.queue(e, t), r = n.length, i = n.shift(), o = b._queueHooks(e, t), a = function () {
- b.dequeue(e, t)
- };
- "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()
- }, _queueHooks: function (e, t) {
- var n = t + "queueHooks";
- return b._data(e, n) || b._data(e, n, {
- empty: b.Callbacks("once memory").add(function () {
- b._removeData(e, t + "queue"), b._removeData(e, n)
- })
- })
- }
- }), b.fn.extend({
- queue: function (e, n) {
- var r = 2;
- return "string" != typeof e && (n = e, e = "fx", r--), r > arguments.length ? b.queue(this[0], e) : n === t ? this : this.each(function () {
- var t = b.queue(this, e, n);
- b._queueHooks(this, e), "fx" === e && "inprogress" !== t[0] && b.dequeue(this, e)
- })
- }, dequeue: function (e) {
- return this.each(function () {
- b.dequeue(this, e)
- })
- }, delay: function (e, t) {
- return e = b.fx ? b.fx.speeds[e] || e : e, t = t || "fx", this.queue(t, function (t, n) {
- var r = setTimeout(t, e);
- n.stop = function () {
- clearTimeout(r)
- }
- })
- }, clearQueue: function (e) {
- return this.queue(e || "fx", [])
- }, promise: function (e, n) {
- var r, i = 1, o = b.Deferred(), a = this, s = this.length, u = function () {
- --i || o.resolveWith(a, [a])
- };
- "string" != typeof e && (n = e, e = t), e = e || "fx";
- while (s--)r = b._data(a[s], e + "queueHooks"), r && r.empty && (i++, r.empty.add(u));
- return u(), o.promise(n)
- }
- });
- var I, z, X = /[\t\r\n]/g, U = /\r/g, V = /^(?:input|select|textarea|button|object)$/i, Y = /^(?:a|area)$/i,
- J = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
- G = /^(?:checked|selected)$/i, Q = b.support.getSetAttribute, K = b.support.input;
- b.fn.extend({
- attr: function (e, t) {
- return b.access(this, b.attr, e, t, arguments.length > 1)
- }, removeAttr: function (e) {
- return this.each(function () {
- b.removeAttr(this, e)
- })
- }, prop: function (e, t) {
- return b.access(this, b.prop, e, t, arguments.length > 1)
- }, removeProp: function (e) {
- return e = b.propFix[e] || e, this.each(function () {
- try {
- this[e] = t, delete this[e]
- } catch (n) {
- }
- })
- }, addClass: function (e) {
- var t, n, r, i, o, a = 0, s = this.length, u = "string" == typeof e && e;
- if (b.isFunction(e))return this.each(function (t) {
- b(this).addClass(e.call(this, t, this.className))
- });
- if (u)for (t = (e || "").match(w) || []; s > a; a++)if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(X, " ") : " ")) {
- o = 0;
- while (i = t[o++])0 > r.indexOf(" " + i + " ") && (r += i + " ");
- n.className = b.trim(r)
- }
- return this
- }, removeClass: function (e) {
- var t, n, r, i, o, a = 0, s = this.length, u = 0 === arguments.length || "string" == typeof e && e;
- if (b.isFunction(e))return this.each(function (t) {
- b(this).removeClass(e.call(this, t, this.className))
- });
- if (u)for (t = (e || "").match(w) || []; s > a; a++)if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(X, " ") : "")) {
- o = 0;
- while (i = t[o++])while (r.indexOf(" " + i + " ") >= 0)r = r.replace(" " + i + " ", " ");
- n.className = e ? b.trim(r) : ""
- }
- return this
- }, toggleClass: function (e, t) {
- var n = typeof e, r = "boolean" == typeof t;
- return b.isFunction(e) ? this.each(function (n) {
- b(this).toggleClass(e.call(this, n, this.className, t), t)
- }) : this.each(function () {
- if ("string" === n) {
- var o, a = 0, s = b(this), u = t, l = e.match(w) || [];
- while (o = l[a++])u = r ? u : !s.hasClass(o), s[u ? "addClass" : "removeClass"](o)
- } else(n === i || "boolean" === n) && (this.className && b._data(this, "__className__", this.className), this.className = this.className || e === !1 ? "" : b._data(this, "__className__") || "")
- })
- }, hasClass: function (e) {
- var t = " " + e + " ", n = 0, r = this.length;
- for (; r > n; n++)if (1 === this[n].nodeType && (" " + this[n].className + " ").replace(X, " ").indexOf(t) >= 0)return !0;
- return !1
- }, val: function (e) {
- var n, r, i, o = this[0];
- {
- if (arguments.length)return i = b.isFunction(e), this.each(function (n) {
- var o, a = b(this);
- 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) {
- return null == e ? "" : e + ""
- })), r = b.valHooks[this.type] || b.valHooks[this.nodeName.toLowerCase()], r && "set" in r && r.set(this, o, "value") !== t || (this.value = o))
- });
- 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)
- }
- }
- }), b.extend({
- valHooks: {
- option: {
- get: function (e) {
- var t = e.attributes.value;
- return !t || t.specified ? e.value : e.text
- }
- }, select: {
- get: function (e) {
- var t, n, r = e.options, i = e.selectedIndex, o = "select-one" === e.type || 0 > i,
- a = o ? null : [], s = o ? i + 1 : r.length, u = 0 > i ? s : o ? i : 0;
- 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"))) {
- if (t = b(n).val(), o)return t;
- a.push(t)
- }
- return a
- }, set: function (e, t) {
- var n = b.makeArray(t);
- return b(e).find("option").each(function () {
- this.selected = b.inArray(b(this).val(), n) >= 0
- }), n.length || (e.selectedIndex = -1), n
- }
- }
- },
- attr: function (e, n, r) {
- var o, a, s, u = e.nodeType;
- 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))
- },
- removeAttr: function (e, t) {
- var n, r, i = 0, o = t && t.match(w);
- 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)
- },
- attrHooks: {
- type: {
- set: function (e, t) {
- if (!b.support.radioValue && "radio" === t && b.nodeName(e, "input")) {
- var n = e.value;
- return e.setAttribute("type", t), n && (e.value = n), t
- }
- }
- }
- },
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
- prop: function (e, n, r) {
- var i, o, a, s = e.nodeType;
- 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]
- },
- propHooks: {
- tabIndex: {
- get: function (e) {
- var n = e.getAttributeNode("tabindex");
- return n && n.specified ? parseInt(n.value, 10) : V.test(e.nodeName) || Y.test(e.nodeName) && e.href ? 0 : t
- }
- }
- }
- }), z = {
- get: function (e, n) {
- var r = b.prop(e, n), i = "boolean" == typeof r && e.getAttribute(n),
- o = "boolean" == typeof r ? K && Q ? null != i : G.test(n) ? e[b.camelCase("default-" + n)] : !!i : e.getAttributeNode(n);
- return o && o.value !== !1 ? n.toLowerCase() : t
- }, set: function (e, t, n) {
- 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
- }
- }, K && Q || (b.attrHooks.value = {
- get: function (e, n) {
- var r = e.getAttributeNode(n);
- return b.nodeName(e, "input") ? e.defaultValue : r && r.specified ? r.value : t
- }, set: function (e, n, r) {
- return b.nodeName(e, "input") ? (e.defaultValue = n, t) : I && I.set(e, n, r)
- }
- }), Q || (I = b.valHooks.button = {
- get: function (e, n) {
- var r = e.getAttributeNode(n);
- return r && ("id" === n || "name" === n || "coords" === n ? "" !== r.value : r.specified) ? r.value : t
- }, set: function (e, n, r) {
- var i = e.getAttributeNode(r);
- return i || e.setAttributeNode(i = e.ownerDocument.createAttribute(r)), i.value = n += "", "value" === r || n === e.getAttribute(r) ? n : t
- }
- }, b.attrHooks.contenteditable = {
- get: I.get, set: function (e, t, n) {
- I.set(e, "" === t ? !1 : t, n)
- }
- }, b.each(["width", "height"], function (e, n) {
- b.attrHooks[n] = b.extend(b.attrHooks[n], {
- set: function (e, r) {
- return "" === r ? (e.setAttribute(n, "auto"), r) : t
- }
- })
- })), b.support.hrefNormalized || (b.each(["href", "src", "width", "height"], function (e, n) {
- b.attrHooks[n] = b.extend(b.attrHooks[n], {
- get: function (e) {
- var r = e.getAttribute(n, 2);
- return null == r ? t : r
- }
- })
- }), b.each(["href", "src"], function (e, t) {
- b.propHooks[t] = {
- get: function (e) {
- return e.getAttribute(t, 4)
- }
- }
- })), b.support.style || (b.attrHooks.style = {
- get: function (e) {
- return e.style.cssText || t
- }, set: function (e, t) {
- return e.style.cssText = t + ""
- }
- }), b.support.optSelected || (b.propHooks.selected = b.extend(b.propHooks.selected, {
- get: function (e) {
- var t = e.parentNode;
- return t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex), null
- }
- })), b.support.enctype || (b.propFix.enctype = "encoding"), b.support.checkOn || b.each(["radio", "checkbox"], function () {
- b.valHooks[this] = {
- get: function (e) {
- return null === e.getAttribute("value") ? "on" : e.value
- }
- }
- }), b.each(["radio", "checkbox"], function () {
- b.valHooks[this] = b.extend(b.valHooks[this], {
- set: function (e, n) {
- return b.isArray(n) ? e.checked = b.inArray(b(e).val(), n) >= 0 : t
- }
- })
- });
- var Z = /^(?:input|select|textarea)$/i, et = /^key/, tt = /^(?:mouse|contextmenu)|click/,
- nt = /^(?:focusinfocus|focusoutblur)$/, rt = /^([^.]*)(?:\.(.+)|)$/;
- function it() {
- return !0
- }
- function ot() {
- return !1
- }
- b.event = {
- global: {},
- add: function (e, n, r, o, a) {
- var s, u, l, c, p, f, d, h, g, m, y, v = b._data(e);
- if (v) {
- 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) {
- return typeof b === i || e && b.event.triggered === e.type ? t : b.event.dispatch.apply(f.elem, arguments)
- }, f.elem = e), n = (n || "").match(w) || [""], l = n.length;
- 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({
- type: g,
- origType: y,
- data: o,
- handler: r,
- guid: r.guid,
- selector: a,
- needsContext: a && b.expr.match.needsContext.test(a),
- namespace: m.join(".")
- }, 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;
- e = null
- }
- },
- remove: function (e, t, n, r, i) {
- var o, a, s, u, l, c, p, f, d, h, g, m = b.hasData(e) && b._data(e);
- if (m && (c = m.events)) {
- t = (t || "").match(w) || [""], l = t.length;
- while (l--)if (s = rt.exec(t[l]) || [], d = g = s[1], h = (s[2] || "").split(".").sort(), d) {
- 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;
- 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));
- u && !f.length && (p.teardown && p.teardown.call(e, h, m.handle) !== !1 || b.removeEvent(e, d, m.handle), delete c[d])
- } else for (d in c)b.event.remove(e, d + t[l], n, r, !0);
- b.isEmptyObject(c) && (delete m.handle, b._removeData(e, "events"))
- }
- },
- trigger: function (n, r, i, a) {
- var s, u, l, c, p, f, d, h = [i || o], g = y.call(n, "type") ? n.type : n,
- m = y.call(n, "namespace") ? n.namespace.split(".") : [];
- 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)) {
- if (!a && !p.noBubble && !b.isWindow(i)) {
- for (c = p.delegateType || g, nt.test(c + g) || (l = l.parentNode); l; l = l.parentNode)h.push(l), f = l;
- f === (i.ownerDocument || o) && h.push(f.defaultView || f.parentWindow || e)
- }
- d = 0;
- 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();
- 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))) {
- f = i[u], f && (i[u] = null), b.event.triggered = g;
- try {
- i[g]()
- } catch (v) {
- }
- b.event.triggered = t, f && (i[u] = f)
- }
- return n.result
- }
- },
- dispatch: function (e) {
- e = b.event.fix(e);
- var n, r, i, o, a, s = [], u = h.call(arguments), l = (b._data(this, "events") || {})[e.type] || [],
- c = b.event.special[e.type] || {};
- if (u[0] = e, e.delegateTarget = this, !c.preDispatch || c.preDispatch.call(this, e) !== !1) {
- s = b.event.handlers.call(this, e, l), n = 0;
- while ((o = s[n++]) && !e.isPropagationStopped()) {
- e.currentTarget = o.elem, a = 0;
- 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()))
- }
- return c.postDispatch && c.postDispatch.call(this, e), e.result
- }
- },
- handlers: function (e, n) {
- var r, i, o, a, s = [], u = n.delegateCount, l = e.target;
- 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)) {
- 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);
- o.length && s.push({elem: l, handlers: o})
- }
- return n.length > u && s.push({elem: this, handlers: n.slice(u)}), s
- },
- fix: function (e) {
- if (e[b.expando])return e;
- var t, n, r, i = e.type, a = e, s = this.fixHooks[i];
- 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;
- while (t--)n = r[t], e[n] = a[n];
- 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
- },
- props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
- fixHooks: {},
- keyHooks: {
- props: "char charCode key keyCode".split(" "), filter: function (e, t) {
- return null == e.which && (e.which = null != t.charCode ? t.charCode : t.keyCode), e
- }
- },
- mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
- filter: function (e, n) {
- var r, i, a, s = n.button, u = n.fromElement;
- 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
- }
- },
- special: {
- load: {noBubble: !0}, click: {
- trigger: function () {
- return b.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : t
- }
- }, focus: {
- trigger: function () {
- if (this !== o.activeElement && this.focus)try {
- return this.focus(), !1
- } catch (e) {
- }
- }, delegateType: "focusin"
- }, blur: {
- trigger: function () {
- return this === o.activeElement && this.blur ? (this.blur(), !1) : t
- }, delegateType: "focusout"
- }, beforeunload: {
- postDispatch: function (e) {
- e.result !== t && (e.originalEvent.returnValue = e.result)
- }
- }
- },
- simulate: function (e, t, n, r) {
- var i = b.extend(new b.Event, n, {type: e, isSimulated: !0, originalEvent: {}});
- r ? b.event.trigger(i, null, t) : b.event.dispatch.call(t, i), i.isDefaultPrevented() && n.preventDefault()
- }
- }, b.removeEvent = o.removeEventListener ? function (e, t, n) {
- e.removeEventListener && e.removeEventListener(t, n, !1)
- } : function (e, t, n) {
- var r = "on" + t;
- e.detachEvent && (typeof e[r] === i && (e[r] = null), e.detachEvent(r, n))
- }, b.Event = function (e, n) {
- 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)
- }, b.Event.prototype = {
- isDefaultPrevented: ot,
- isPropagationStopped: ot,
- isImmediatePropagationStopped: ot,
- preventDefault: function () {
- var e = this.originalEvent;
- this.isDefaultPrevented = it, e && (e.preventDefault ? e.preventDefault() : e.returnValue = !1)
- },
- stopPropagation: function () {
- var e = this.originalEvent;
- this.isPropagationStopped = it, e && (e.stopPropagation && e.stopPropagation(), e.cancelBubble = !0)
- },
- stopImmediatePropagation: function () {
- this.isImmediatePropagationStopped = it, this.stopPropagation()
- }
- }, b.each({mouseenter: "mouseover", mouseleave: "mouseout"}, function (e, t) {
- b.event.special[e] = {
- delegateType: t, bindType: t, handle: function (e) {
- var n, r = this, i = e.relatedTarget, o = e.handleObj;
- return (!i || i !== r && !b.contains(r, i)) && (e.type = o.origType, n = o.handler.apply(this, arguments), e.type = t), n
- }
- }
- }), b.support.submitBubbles || (b.event.special.submit = {
- setup: function () {
- return b.nodeName(this, "form") ? !1 : (b.event.add(this, "click._submit keypress._submit", function (e) {
- var n = e.target, r = b.nodeName(n, "input") || b.nodeName(n, "button") ? n.form : t;
- r && !b._data(r, "submitBubbles") && (b.event.add(r, "submit._submit", function (e) {
- e._submit_bubble = !0
- }), b._data(r, "submitBubbles", !0))
- }), t)
- }, postDispatch: function (e) {
- e._submit_bubble && (delete e._submit_bubble, this.parentNode && !e.isTrigger && b.event.simulate("submit", this.parentNode, e, !0))
- }, teardown: function () {
- return b.nodeName(this, "form") ? !1 : (b.event.remove(this, "._submit"), t)
- }
- }), b.support.changeBubbles || (b.event.special.change = {
- setup: function () {
- return Z.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (b.event.add(this, "propertychange._change", function (e) {
- "checked" === e.originalEvent.propertyName && (this._just_changed = !0)
- }), b.event.add(this, "click._change", function (e) {
- this._just_changed && !e.isTrigger && (this._just_changed = !1), b.event.simulate("change", this, e, !0)
- })), !1) : (b.event.add(this, "beforeactivate._change", function (e) {
- var t = e.target;
- Z.test(t.nodeName) && !b._data(t, "changeBubbles") && (b.event.add(t, "change._change", function (e) {
- !this.parentNode || e.isSimulated || e.isTrigger || b.event.simulate("change", this.parentNode, e, !0)
- }), b._data(t, "changeBubbles", !0))
- }), t)
- }, handle: function (e) {
- var n = e.target;
- return this !== n || e.isSimulated || e.isTrigger || "radio" !== n.type && "checkbox" !== n.type ? e.handleObj.handler.apply(this, arguments) : t
- }, teardown: function () {
- return b.event.remove(this, "._change"), !Z.test(this.nodeName)
- }
- }), b.support.focusinBubbles || b.each({focus: "focusin", blur: "focusout"}, function (e, t) {
- var n = 0, r = function (e) {
- b.event.simulate(t, e.target, b.event.fix(e), !0)
- };
- b.event.special[t] = {
- setup: function () {
- 0 === n++ && o.addEventListener(e, r, !0)
- }, teardown: function () {
- 0 === --n && o.removeEventListener(e, r, !0)
- }
- }
- }), b.fn.extend({
- on: function (e, n, r, i, o) {
- var a, s;
- if ("object" == typeof e) {
- "string" != typeof n && (r = r || n, n = t);
- for (a in e)this.on(a, n, r, e[a], o);
- return this
- }
- 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;
- return 1 === o && (s = i, i = function (e) {
- return b().off(e), s.apply(this, arguments)
- }, i.guid = s.guid || (s.guid = b.guid++)), this.each(function () {
- b.event.add(this, e, i, r, n)
- })
- }, one: function (e, t, n, r) {
- return this.on(e, t, n, r, 1)
- }, off: function (e, n, r) {
- var i, o;
- 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;
- if ("object" == typeof e) {
- for (o in e)this.off(o, n, e[o]);
- return this
- }
- return (n === !1 || "function" == typeof n) && (r = n, n = t), r === !1 && (r = ot), this.each(function () {
- b.event.remove(this, e, r, n)
- })
- }, bind: function (e, t, n) {
- return this.on(e, null, t, n)
- }, unbind: function (e, t) {
- return this.off(e, null, t)
- }, delegate: function (e, t, n, r) {
- return this.on(t, e, n, r)
- }, undelegate: function (e, t, n) {
- return 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", n)
- }, trigger: function (e, t) {
- return this.each(function () {
- b.event.trigger(e, t, this)
- })
- }, triggerHandler: function (e, n) {
- var r = this[0];
- return r ? b.event.trigger(e, n, r, !0) : t
- }
- }), function (e, t) {
- 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 = {},
- N = 0, C = 0, k = it(), E = it(), S = it(), A = typeof t, j = 1 << 31, D = [], L = D.pop, H = D.push,
- q = D.slice, M = D.indexOf || function (e) {
- var t = 0, n = this.length;
- for (; n > t; t++)if (this[t] === e)return t;
- return -1
- }, _ = "[\\x20\\t\\r\\n\\f]", F = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", O = F.replace("w", "w#"),
- B = "([*^$|!~]?=)",
- P = "\\[" + _ + "*(" + F + ")" + _ + "*(?:" + B + _ + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + O + ")|)|)" + _ + "*\\]",
- R = ":(" + F + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + P.replace(3, 8) + ")*)|.*)\\)|)",
- W = RegExp("^" + _ + "+|((?:^|[^\\\\])(?:\\\\.)*)" + _ + "+$", "g"),
- $ = RegExp("^" + _ + "*," + _ + "*"), I = RegExp("^" + _ + "*([\\x20\\t\\r\\n\\f>+~])" + _ + "*"),
- z = RegExp(R), X = RegExp("^" + O + "$"), U = {
- ID: RegExp("^#(" + F + ")"),
- CLASS: RegExp("^\\.(" + F + ")"),
- NAME: RegExp("^\\[name=['\"]?(" + F + ")['\"]?\\]"),
- TAG: RegExp("^(" + F.replace("w", "w*") + ")"),
- ATTR: RegExp("^" + P),
- PSEUDO: RegExp("^" + R),
- CHILD: RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + _ + "*(even|odd|(([+-]|)(\\d*)n|)" + _ + "*(?:([+-]|)" + _ + "*(\\d+)|))" + _ + "*\\)|)", "i"),
- needsContext: RegExp("^" + _ + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + _ + "*((?:-\\d)?\\d*)" + _ + "*\\)|)(?=[^-]|$)", "i")
- }, V = /[\x20\t\r\n\f]*[+~]/, Y = /^[^{]+\{\s*\[native code/, J = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
- G = /^(?:input|select|textarea|button)$/i, Q = /^h\d$/i, K = /'|\\/g,
- Z = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, et = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
- tt = function (e, t) {
- var n = "0x" + t - 65536;
- return n !== n ? t : 0 > n ? String.fromCharCode(n + 65536) : String.fromCharCode(55296 | n >> 10, 56320 | 1023 & n)
- };
- try {
- q.call(w.documentElement.childNodes, 0)[0].nodeType
- } catch (nt) {
- q = function (e) {
- var t, n = [];
- while (t = this[e++])n.push(t);
- return n
- }
- }
- function rt(e) {
- return Y.test(e + "")
- }
- function it() {
- var e, t = [];
- return e = function (n, r) {
- return t.push(n += " ") > i.cacheLength && delete e[t.shift()], e[n] = r
- }
- }
- function ot(e) {
- return e[x] = !0, e
- }
- function at(e) {
- var t = p.createElement("div");
- try {
- return e(t)
- } catch (n) {
- return !1
- } finally {
- t = null
- }
- }
- function st(e, t, n, r) {
- var i, o, a, s, u, l, f, g, m, v;
- if ((t ? t.ownerDocument || t : w) !== p && c(t), t = t || p, n = n || [], !e || "string" != typeof e)return n;
- if (1 !== (s = t.nodeType) && 9 !== s)return [];
- if (!d && !r) {
- if (i = J.exec(e))if (a = i[1]) {
- if (9 === s) {
- if (o = t.getElementById(a), !o || !o.parentNode)return n;
- if (o.id === a)return n.push(o), n
- } else if (t.ownerDocument && (o = t.ownerDocument.getElementById(a)) && y(t, o) && o.id === a)return n.push(o), n
- } else {
- if (i[2])return H.apply(n, q.call(t.getElementsByTagName(e), 0)), n;
- if ((a = i[3]) && T.getByClassName && t.getElementsByClassName)return H.apply(n, q.call(t.getElementsByClassName(a), 0)), n
- }
- if (T.qsa && !h.test(e)) {
- if (f = !0, g = x, m = t, v = 9 === s && e, 1 === s && "object" !== t.nodeName.toLowerCase()) {
- l = ft(e), (f = t.getAttribute("id")) ? g = f.replace(K, "\\$&") : t.setAttribute("id", g), g = "[id='" + g + "'] ", u = l.length;
- while (u--)l[u] = g + dt(l[u]);
- m = V.test(e) && t.parentNode || t, v = l.join(",")
- }
- if (v)try {
- return H.apply(n, q.call(m.querySelectorAll(v), 0)), n
- } catch (b) {
- } finally {
- f || t.removeAttribute("id")
- }
- }
- }
- return wt(e.replace(W, "$1"), t, n, r)
- }
- a = st.isXML = function (e) {
- var t = e && (e.ownerDocument || e).documentElement;
- return t ? "HTML" !== t.nodeName : !1
- }, c = st.setDocument = function (e) {
- var n = e ? e.ownerDocument || e : w;
- return n !== p && 9 === n.nodeType && n.documentElement ? (p = n, f = n.documentElement, d = a(n), T.tagNameNoComments = at(function (e) {
- return e.appendChild(n.createComment("")), !e.getElementsByTagName("*").length
- }), T.attributes = at(function (e) {
- e.innerHTML = "<select></select>";
- var t = typeof e.lastChild.getAttribute("multiple");
- return "boolean" !== t && "string" !== t
- }), T.getByClassName = at(function (e) {
- 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
- }), T.getByName = at(function (e) {
- e.id = x + 0, e.innerHTML = "<a name='" + x + "'></a><div name='" + x + "'></div>", f.insertBefore(e, f.firstChild);
- var t = n.getElementsByName && n.getElementsByName(x).length === 2 + n.getElementsByName(x + 0).length;
- return T.getIdNotName = !n.getElementById(x), f.removeChild(e), t
- }), i.attrHandle = at(function (e) {
- return e.innerHTML = "<a href='#'></a>", e.firstChild && typeof e.firstChild.getAttribute !== A && "#" === e.firstChild.getAttribute("href")
- }) ? {} : {
- href: function (e) {
- return e.getAttribute("href", 2)
- }, type: function (e) {
- return e.getAttribute("type")
- }
- }, T.getIdNotName ? (i.find.ID = function (e, t) {
- if (typeof t.getElementById !== A && !d) {
- var n = t.getElementById(e);
- return n && n.parentNode ? [n] : []
- }
- }, i.filter.ID = function (e) {
- var t = e.replace(et, tt);
- return function (e) {
- return e.getAttribute("id") === t
- }
- }) : (i.find.ID = function (e, n) {
- if (typeof n.getElementById !== A && !d) {
- var r = n.getElementById(e);
- return r ? r.id === e || typeof r.getAttributeNode !== A && r.getAttributeNode("id").value === e ? [r] : t : []
- }
- }, i.filter.ID = function (e) {
- var t = e.replace(et, tt);
- return function (e) {
- var n = typeof e.getAttributeNode !== A && e.getAttributeNode("id");
- return n && n.value === t
- }
- }), i.find.TAG = T.tagNameNoComments ? function (e, n) {
- return typeof n.getElementsByTagName !== A ? n.getElementsByTagName(e) : t
- } : function (e, t) {
- var n, r = [], i = 0, o = t.getElementsByTagName(e);
- if ("*" === e) {
- while (n = o[i++])1 === n.nodeType && r.push(n);
- return r
- }
- return o
- }, i.find.NAME = T.getByName && function (e, n) {
- return typeof n.getElementsByName !== A ? n.getElementsByName(name) : t
- }, i.find.CLASS = T.getByClassName && function (e, n) {
- return typeof n.getElementsByClassName === A || d ? t : n.getElementsByClassName(e)
- }, g = [], h = [":focus"], (T.qsa = rt(n.querySelectorAll)) && (at(function (e) {
- 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")
- }), at(function (e) {
- 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(",.*:")
- })), (T.matchesSelector = rt(m = f.matchesSelector || f.mozMatchesSelector || f.webkitMatchesSelector || f.oMatchesSelector || f.msMatchesSelector)) && at(function (e) {
- T.disconnectedMatch = m.call(e, "div"), m.call(e, "[s!='']:x"), g.push("!=", R)
- }), h = RegExp(h.join("|")), g = RegExp(g.join("|")), y = rt(f.contains) || f.compareDocumentPosition ? function (e, t) {
- var n = 9 === e.nodeType ? e.documentElement : e, r = t && t.parentNode;
- return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r)))
- } : function (e, t) {
- if (t)while (t = t.parentNode)if (t === e)return !0;
- return !1
- }, v = f.compareDocumentPosition ? function (e, t) {
- var r;
- 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
- } : function (e, t) {
- var r, i = 0, o = e.parentNode, a = t.parentNode, s = [e], l = [t];
- if (e === t)return u = !0, 0;
- if (!o || !a)return e === n ? -1 : t === n ? 1 : o ? -1 : a ? 1 : 0;
- if (o === a)return ut(e, t);
- r = e;
- while (r = r.parentNode)s.unshift(r);
- r = t;
- while (r = r.parentNode)l.unshift(r);
- while (s[i] === l[i])i++;
- return i ? ut(s[i], l[i]) : s[i] === w ? -1 : l[i] === w ? 1 : 0
- }, u = !1, [0, 0].sort(v), T.detectDuplicates = u, p) : p
- }, st.matches = function (e, t) {
- return st(e, null, null, t)
- }, st.matchesSelector = function (e, t) {
- if ((e.ownerDocument || e) !== p && c(e), t = t.replace(Z, "='$1']"), !(!T.matchesSelector || d || g && g.test(t) || h.test(t)))try {
- var n = m.call(e, t);
- if (n || T.disconnectedMatch || e.document && 11 !== e.document.nodeType)return n
- } catch (r) {
- }
- return st(t, p, null, [e]).length > 0
- }, st.contains = function (e, t) {
- return (e.ownerDocument || e) !== p && c(e), y(e, t)
- }, st.attr = function (e, t) {
- var n;
- 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
- }, st.error = function (e) {
- throw Error("Syntax error, unrecognized expression: " + e)
- }, st.uniqueSort = function (e) {
- var t, n = [], r = 1, i = 0;
- if (u = !T.detectDuplicates, e.sort(v), u) {
- for (; t = e[r]; r++)t === e[r - 1] && (i = n.push(r));
- while (i--)e.splice(n[i], 1)
- }
- return e
- };
- function ut(e, t) {
- var n = t && e, r = n && (~t.sourceIndex || j) - (~e.sourceIndex || j);
- if (r)return r;
- if (n)while (n = n.nextSibling)if (n === t)return -1;
- return e ? 1 : -1
- }
- function lt(e) {
- return function (t) {
- var n = t.nodeName.toLowerCase();
- return "input" === n && t.type === e
- }
- }
- function ct(e) {
- return function (t) {
- var n = t.nodeName.toLowerCase();
- return ("input" === n || "button" === n) && t.type === e
- }
- }
- function pt(e) {
- return ot(function (t) {
- return t = +t, ot(function (n, r) {
- var i, o = e([], n.length, t), a = o.length;
- while (a--)n[i = o[a]] && (n[i] = !(r[i] = n[i]))
- })
- })
- }
- o = st.getText = function (e) {
- var t, n = "", r = 0, i = e.nodeType;
- if (i) {
- if (1 === i || 9 === i || 11 === i) {
- if ("string" == typeof e.textContent)return e.textContent;
- for (e = e.firstChild; e; e = e.nextSibling)n += o(e)
- } else if (3 === i || 4 === i)return e.nodeValue
- } else for (; t = e[r]; r++)n += o(t);
- return n
- }, i = st.selectors = {
- cacheLength: 50,
- createPseudo: ot,
- match: U,
- find: {},
- relative: {
- ">": {dir: "parentNode", first: !0},
- " ": {dir: "parentNode"},
- "+": {dir: "previousSibling", first: !0},
- "~": {dir: "previousSibling"}
- },
- preFilter: {
- ATTR: function (e) {
- 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)
- }, CHILD: function (e) {
- 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
- }, PSEUDO: function (e) {
- var t, n = !e[5] && e[2];
- 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))
- }
- },
- filter: {
- TAG: function (e) {
- return "*" === e ? function () {
- return !0
- } : (e = e.replace(et, tt).toLowerCase(), function (t) {
- return t.nodeName && t.nodeName.toLowerCase() === e
- })
- }, CLASS: function (e) {
- var t = k[e + " "];
- return t || (t = RegExp("(^|" + _ + ")" + e + "(" + _ + "|$)")) && k(e, function (e) {
- return t.test(e.className || typeof e.getAttribute !== A && e.getAttribute("class") || "")
- })
- }, ATTR: function (e, t, n) {
- return function (r) {
- var i = st.attr(r, e);
- 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
- }
- }, CHILD: function (e, t, n, r, i) {
- var o = "nth" !== e.slice(0, 3), a = "last" !== e.slice(-4), s = "of-type" === t;
- return 1 === r && 0 === i ? function (e) {
- return !!e.parentNode
- } : function (t, n, u) {
- var l, c, p, f, d, h, g = o !== a ? "nextSibling" : "previousSibling", m = t.parentNode,
- y = s && t.nodeName.toLowerCase(), v = !u && !s;
- if (m) {
- if (o) {
- while (g) {
- p = t;
- while (p = p[g])if (s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType)return !1;
- h = g = "only" === e && !h && "nextSibling"
- }
- return !0
- }
- if (h = [a ? m.firstChild : m.lastChild], a && v) {
- 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];
- while (p = ++d && p && p[g] || (f = d = 0) || h.pop())if (1 === p.nodeType && ++f && p === t) {
- c[e] = [N, d, f];
- break
- }
- } 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;
- return f -= i, f === r || 0 === f % r && f / r >= 0
- }
- }
- }, PSEUDO: function (e, t) {
- var n,
- r = i.pseudos[e] || i.setFilters[e.toLowerCase()] || st.error("unsupported pseudo: " + e);
- return r[x] ? r(t) : r.length > 1 ? (n = [e, e, "", t], i.setFilters.hasOwnProperty(e.toLowerCase()) ? ot(function (e, n) {
- var i, o = r(e, t), a = o.length;
- while (a--)i = M.call(e, o[a]), e[i] = !(n[i] = o[a])
- }) : function (e) {
- return r(e, 0, n)
- }) : r
- }
- },
- pseudos: {
- not: ot(function (e) {
- var t = [], n = [], r = s(e.replace(W, "$1"));
- return r[x] ? ot(function (e, t, n, i) {
- var o, a = r(e, null, i, []), s = e.length;
- while (s--)(o = a[s]) && (e[s] = !(t[s] = o))
- }) : function (e, i, o) {
- return t[0] = e, r(t, null, o, n), !n.pop()
- }
- }), has: ot(function (e) {
- return function (t) {
- return st(e, t).length > 0
- }
- }), contains: ot(function (e) {
- return function (t) {
- return (t.textContent || t.innerText || o(t)).indexOf(e) > -1
- }
- }), lang: ot(function (e) {
- return X.test(e || "") || st.error("unsupported lang: " + e), e = e.replace(et, tt).toLowerCase(), function (t) {
- var n;
- 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);
- return !1
- }
- }), target: function (t) {
- var n = e.location && e.location.hash;
- return n && n.slice(1) === t.id
- }, root: function (e) {
- return e === f
- }, focus: function (e) {
- return e === p.activeElement && (!p.hasFocus || p.hasFocus()) && !!(e.type || e.href || ~e.tabIndex)
- }, enabled: function (e) {
- return e.disabled === !1
- }, disabled: function (e) {
- return e.disabled === !0
- }, checked: function (e) {
- var t = e.nodeName.toLowerCase();
- return "input" === t && !!e.checked || "option" === t && !!e.selected
- }, selected: function (e) {
- return e.parentNode && e.parentNode.selectedIndex, e.selected === !0
- }, empty: function (e) {
- for (e = e.firstChild; e; e = e.nextSibling)if (e.nodeName > "@" || 3 === e.nodeType || 4 === e.nodeType)return !1;
- return !0
- }, parent: function (e) {
- return !i.pseudos.empty(e)
- }, header: function (e) {
- return Q.test(e.nodeName)
- }, input: function (e) {
- return G.test(e.nodeName)
- }, button: function (e) {
- var t = e.nodeName.toLowerCase();
- return "input" === t && "button" === e.type || "button" === t
- }, text: function (e) {
- var t;
- return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || t.toLowerCase() === e.type)
- }, first: pt(function () {
- return [0]
- }), last: pt(function (e, t) {
- return [t - 1]
- }), eq: pt(function (e, t, n) {
- return [0 > n ? n + t : n]
- }), even: pt(function (e, t) {
- var n = 0;
- for (; t > n; n += 2)e.push(n);
- return e
- }), odd: pt(function (e, t) {
- var n = 1;
- for (; t > n; n += 2)e.push(n);
- return e
- }), lt: pt(function (e, t, n) {
- var r = 0 > n ? n + t : n;
- for (; --r >= 0;)e.push(r);
- return e
- }), gt: pt(function (e, t, n) {
- var r = 0 > n ? n + t : n;
- for (; t > ++r;)e.push(r);
- return e
- })
- }
- };
- for (n in{radio: !0, checkbox: !0, file: !0, password: !0, image: !0})i.pseudos[n] = lt(n);
- for (n in{submit: !0, reset: !0})i.pseudos[n] = ct(n);
- function ft(e, t) {
- var n, r, o, a, s, u, l, c = E[e + " "];
- if (c)return t ? 0 : c.slice(0);
- s = e, u = [], l = i.preFilter;
- while (s) {
- (!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({
- value: n,
- type: r[0].replace(W, " ")
- }), s = s.slice(n.length));
- for (a in i.filter)!(r = U[a].exec(s)) || l[a] && !(r = l[a](r)) || (n = r.shift(), o.push({
- value: n,
- type: a,
- matches: r
- }), s = s.slice(n.length));
- if (!n)break
- }
- return t ? s.length : s ? st.error(e) : E(e, u).slice(0)
- }
- function dt(e) {
- var t = 0, n = e.length, r = "";
- for (; n > t; t++)r += e[t].value;
- return r
- }
- function ht(e, t, n) {
- var i = t.dir, o = n && "parentNode" === i, a = C++;
- return t.first ? function (t, n, r) {
- while (t = t[i])if (1 === t.nodeType || o)return e(t, n, r)
- } : function (t, n, s) {
- var u, l, c, p = N + " " + a;
- if (s) {
- while (t = t[i])if ((1 === t.nodeType || o) && e(t, n, s))return !0
- } else while (t = t[i])if (1 === t.nodeType || o)if (c = t[x] || (t[x] = {}), (l = c[i]) && l[0] === p) {
- if ((u = l[1]) === !0 || u === r)return u === !0
- } else if (l = c[i] = [p], l[1] = e(t, n, s) || r, l[1] === !0)return !0
- }
- }
- function gt(e) {
- return e.length > 1 ? function (t, n, r) {
- var i = e.length;
- while (i--)if (!e[i](t, n, r))return !1;
- return !0
- } : e[0]
- }
- function mt(e, t, n, r, i) {
- var o, a = [], s = 0, u = e.length, l = null != t;
- for (; u > s; s++)(o = e[s]) && (!n || n(o, r, i)) && (a.push(o), l && t.push(s));
- return a
- }
- function yt(e, t, n, r, i, o) {
- return r && !r[x] && (r = yt(r)), i && !i[x] && (i = yt(i, o)), ot(function (o, a, s, u) {
- var l, c, p, f = [], d = [], h = a.length, g = o || xt(t || "*", s.nodeType ? [s] : s, []),
- m = !e || !o && t ? g : mt(g, f, e, s, u), y = n ? i || (o ? e : h || r) ? [] : a : m;
- if (n && n(m, y, s, u), r) {
- l = mt(y, d), r(l, [], s, u), c = l.length;
- while (c--)(p = l[c]) && (y[d[c]] = !(m[d[c]] = p))
- }
- if (o) {
- if (i || e) {
- if (i) {
- l = [], c = y.length;
- while (c--)(p = y[c]) && l.push(m[c] = p);
- i(null, y = [], l, u)
- }
- c = y.length;
- while (c--)(p = y[c]) && (l = i ? M.call(o, p) : f[c]) > -1 && (o[l] = !(a[l] = p))
- }
- } else y = mt(y === a ? y.splice(h, y.length) : y), i ? i(null, a, y, u) : H.apply(a, y)
- })
- }
- function vt(e) {
- var t, n, r, o = e.length, a = i.relative[e[0].type], s = a || i.relative[" "], u = a ? 1 : 0,
- c = ht(function (e) {
- return e === t
- }, s, !0), p = ht(function (e) {
- return M.call(t, e) > -1
- }, s, !0), f = [function (e, n, r) {
- return !a && (r || n !== l) || ((t = n).nodeType ? c(e, n, r) : p(e, n, r))
- }];
- for (; o > u; u++)if (n = i.relative[e[u].type]) f = [ht(gt(f), n)]; else {
- if (n = i.filter[e[u].type].apply(null, e[u].matches), n[x]) {
- for (r = ++u; o > r; r++)if (i.relative[e[r].type])break;
- 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))
- }
- f.push(n)
- }
- return gt(f)
- }
- function bt(e, t) {
- var n = 0, o = t.length > 0, a = e.length > 0, s = function (s, u, c, f, d) {
- var h, g, m, y = [], v = 0, b = "0", x = s && [], w = null != d, T = l,
- C = s || a && i.find.TAG("*", d && u.parentNode || u),
- k = N += null == T ? 1 : Math.random() || .1;
- for (w && (l = u !== p && u, r = n); null != (h = C[b]); b++) {
- if (a && h) {
- g = 0;
- while (m = e[g++])if (m(h, u, c)) {
- f.push(h);
- break
- }
- w && (N = k, r = ++n)
- }
- o && ((h = !m && h) && v--, s && x.push(h))
- }
- if (v += b, o && b !== v) {
- g = 0;
- while (m = t[g++])m(x, y, u, c);
- if (s) {
- if (v > 0)while (b--)x[b] || y[b] || (y[b] = L.call(f));
- y = mt(y)
- }
- H.apply(f, y), w && !s && y.length > 0 && v + t.length > 1 && st.uniqueSort(f)
- }
- return w && (N = k, l = T), x
- };
- return o ? ot(s) : s
- }
- s = st.compile = function (e, t) {
- var n, r = [], i = [], o = S[e + " "];
- if (!o) {
- t || (t = ft(e)), n = t.length;
- while (n--)o = vt(t[n]), o[x] ? r.push(o) : i.push(o);
- o = S(e, bt(i, r))
- }
- return o
- };
- function xt(e, t, n) {
- var r = 0, i = t.length;
- for (; i > r; r++)st(e, t[r], n);
- return n
- }
- function wt(e, t, n, r) {
- var o, a, u, l, c, p = ft(e);
- if (!r && 1 === p.length) {
- 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]) {
- if (t = i.find.ID(u.matches[0].replace(et, tt), t)[0], !t)return n;
- e = e.slice(a.shift().value.length)
- }
- o = U.needsContext.test(e) ? 0 : a.length;
- while (o--) {
- if (u = a[o], i.relative[l = u.type])break;
- if ((c = i.find[l]) && (r = c(u.matches[0].replace(et, tt), V.test(a[0].type) && t.parentNode || t))) {
- if (a.splice(o, 1), e = r.length && dt(a), !e)return H.apply(n, q.call(r, 0)), n;
- break
- }
- }
- }
- return s(e, p)(r, t, d, n, V.test(e)), n
- }
- i.pseudos.nth = i.pseudos.eq;
- function Tt() {
- }
- 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
- }(e);
- var at = /Until$/, st = /^(?:parents|prev(?:Until|All))/, ut = /^.[^:#\[\.,]*$/, lt = b.expr.match.needsContext,
- ct = {children: !0, contents: !0, next: !0, prev: !0};
- b.fn.extend({
- find: function (e) {
- var t, n, r, i = this.length;
- if ("string" != typeof e)return r = this, this.pushStack(b(e).filter(function () {
- for (t = 0; i > t; t++)if (b.contains(r[t], this))return !0
- }));
- for (n = [], t = 0; i > t; t++)b.find(e, this[t], n);
- return n = this.pushStack(i > 1 ? b.unique(n) : n), n.selector = (this.selector ? this.selector + " " : "") + e, n
- }, has: function (e) {
- var t, n = b(e, this), r = n.length;
- return this.filter(function () {
- for (t = 0; r > t; t++)if (b.contains(this, n[t]))return !0
- })
- }, not: function (e) {
- return this.pushStack(ft(this, e, !1))
- }, filter: function (e) {
- return this.pushStack(ft(this, e, !0))
- }, is: function (e) {
- 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)
- }, closest: function (e, t) {
- var n, r = 0, i = this.length, o = [],
- a = lt.test(e) || "string" != typeof e ? b(e, t || this.context) : 0;
- for (; i > r; r++) {
- n = this[r];
- while (n && n.ownerDocument && n !== t && 11 !== n.nodeType) {
- if (a ? a.index(n) > -1 : b.find.matchesSelector(n, e)) {
- o.push(n);
- break
- }
- n = n.parentNode
- }
- }
- return this.pushStack(o.length > 1 ? b.unique(o) : o)
- }, index: function (e) {
- 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
- }, add: function (e, t) {
- var n = "string" == typeof e ? b(e, t) : b.makeArray(e && e.nodeType ? [e] : e),
- r = b.merge(this.get(), n);
- return this.pushStack(b.unique(r))
- }, addBack: function (e) {
- return this.add(null == e ? this.prevObject : this.prevObject.filter(e))
- }
- }), b.fn.andSelf = b.fn.addBack;
- function pt(e, t) {
- do e = e[t]; while (e && 1 !== e.nodeType);
- return e
- }
- b.each({
- parent: function (e) {
- var t = e.parentNode;
- return t && 11 !== t.nodeType ? t : null
- }, parents: function (e) {
- return b.dir(e, "parentNode")
- }, parentsUntil: function (e, t, n) {
- return b.dir(e, "parentNode", n)
- }, next: function (e) {
- return pt(e, "nextSibling")
- }, prev: function (e) {
- return pt(e, "previousSibling")
- }, nextAll: function (e) {
- return b.dir(e, "nextSibling")
- }, prevAll: function (e) {
- return b.dir(e, "previousSibling")
- }, nextUntil: function (e, t, n) {
- return b.dir(e, "nextSibling", n)
- }, prevUntil: function (e, t, n) {
- return b.dir(e, "previousSibling", n)
- }, siblings: function (e) {
- return b.sibling((e.parentNode || {}).firstChild, e)
- }, children: function (e) {
- return b.sibling(e.firstChild)
- }, contents: function (e) {
- return b.nodeName(e, "iframe") ? e.contentDocument || e.contentWindow.document : b.merge([], e.childNodes)
- }
- }, function (e, t) {
- b.fn[e] = function (n, r) {
- var i = b.map(this, t, n);
- 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)
- }
- }), b.extend({
- filter: function (e, t, n) {
- return n && (e = ":not(" + e + ")"), 1 === t.length ? b.find.matchesSelector(t[0], e) ? [t[0]] : [] : b.find.matches(e, t)
- }, dir: function (e, n, r) {
- var i = [], o = e[n];
- while (o && 9 !== o.nodeType && (r === t || 1 !== o.nodeType || !b(o).is(r)))1 === o.nodeType && i.push(o), o = o[n];
- return i
- }, sibling: function (e, t) {
- var n = [];
- for (; e; e = e.nextSibling)1 === e.nodeType && e !== t && n.push(e);
- return n
- }
- });
- function ft(e, t, n) {
- if (t = t || 0, b.isFunction(t))return b.grep(e, function (e, r) {
- var i = !!t.call(e, r, e);
- return i === n
- });
- if (t.nodeType)return b.grep(e, function (e) {
- return e === t === n
- });
- if ("string" == typeof t) {
- var r = b.grep(e, function (e) {
- return 1 === e.nodeType
- });
- if (ut.test(t))return b.filter(t, r, !n);
- t = b.filter(t, r)
- }
- return b.grep(e, function (e) {
- return b.inArray(e, t) >= 0 === n
- })
- }
- function dt(e) {
- var t = ht.split("|"), n = e.createDocumentFragment();
- if (n.createElement)while (t.length)n.createElement(t.pop());
- return n
- }
- 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",
- gt = / jQuery\d+="(?:null|\d+)"/g, mt = RegExp("<(?:" + ht + ")[\\s/>]", "i"), yt = /^\s+/,
- vt = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, bt = /<([\w:]+)/,
- xt = /<tbody/i, wt = /<|&#?\w+;/, Tt = /<(?:script|style|link)/i, Nt = /^(?:checkbox|radio)$/i,
- Ct = /checked\s*(?:[^=]|=\s*.checked.)/i, kt = /^$|\/(?:java|ecma)script/i, Et = /^true\/(.*)/,
- St = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, At = {
- option: [1, "<select multiple='multiple'>", "</select>"],
- legend: [1, "<fieldset>", "</fieldset>"],
- area: [1, "<map>", "</map>"],
- param: [1, "<object>", "</object>"],
- thead: [1, "<table>", "</table>"],
- tr: [2, "<table><tbody>", "</tbody></table>"],
- col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
- td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
- _default: b.support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"]
- }, jt = dt(o), Dt = jt.appendChild(o.createElement("div"));
- At.optgroup = At.option, At.tbody = At.tfoot = At.colgroup = At.caption = At.thead, At.th = At.td, b.fn.extend({
- text: function (e) {
- return b.access(this, function (e) {
- return e === t ? b.text(this) : this.empty().append((this[0] && this[0].ownerDocument || o).createTextNode(e))
- }, null, e, arguments.length)
- }, wrapAll: function (e) {
- if (b.isFunction(e))return this.each(function (t) {
- b(this).wrapAll(e.call(this, t))
- });
- if (this[0]) {
- var t = b(e, this[0].ownerDocument).eq(0).clone(!0);
- this[0].parentNode && t.insertBefore(this[0]), t.map(function () {
- var e = this;
- while (e.firstChild && 1 === e.firstChild.nodeType)e = e.firstChild;
- return e
- }).append(this)
- }
- return this
- }, wrapInner: function (e) {
- return b.isFunction(e) ? this.each(function (t) {
- b(this).wrapInner(e.call(this, t))
- }) : this.each(function () {
- var t = b(this), n = t.contents();
- n.length ? n.wrapAll(e) : t.append(e)
- })
- }, wrap: function (e) {
- var t = b.isFunction(e);
- return this.each(function (n) {
- b(this).wrapAll(t ? e.call(this, n) : e)
- })
- }, unwrap: function () {
- return this.parent().each(function () {
- b.nodeName(this, "body") || b(this).replaceWith(this.childNodes)
- }).end()
- }, append: function () {
- return this.domManip(arguments, !0, function (e) {
- (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.appendChild(e)
- })
- }, prepend: function () {
- return this.domManip(arguments, !0, function (e) {
- (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.insertBefore(e, this.firstChild)
- })
- }, before: function () {
- return this.domManip(arguments, !1, function (e) {
- this.parentNode && this.parentNode.insertBefore(e, this)
- })
- }, after: function () {
- return this.domManip(arguments, !1, function (e) {
- this.parentNode && this.parentNode.insertBefore(e, this.nextSibling)
- })
- }, remove: function (e, t) {
- var n, r = 0;
- 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)));
- return this
- }, empty: function () {
- var e, t = 0;
- for (; null != (e = this[t]); t++) {
- 1 === e.nodeType && b.cleanData(Ot(e, !1));
- while (e.firstChild)e.removeChild(e.firstChild);
- e.options && b.nodeName(e, "select") && (e.options.length = 0)
- }
- return this
- }, clone: function (e, t) {
- return e = null == e ? !1 : e, t = null == t ? e : t, this.map(function () {
- return b.clone(this, e, t)
- })
- }, html: function (e) {
- return b.access(this, function (e) {
- var n = this[0] || {}, r = 0, i = this.length;
- if (e === t)return 1 === n.nodeType ? n.innerHTML.replace(gt, "") : t;
- 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()])) {
- e = e.replace(vt, "<$1></$2>");
- try {
- for (; i > r; r++)n = this[r] || {}, 1 === n.nodeType && (b.cleanData(Ot(n, !1)), n.innerHTML = e);
- n = 0
- } catch (o) {
- }
- }
- n && this.empty().append(e)
- }, null, e, arguments.length)
- }, replaceWith: function (e) {
- var t = b.isFunction(e);
- return t || "string" == typeof e || (e = b(e).not(this).detach()), this.domManip([e], !0, function (e) {
- var t = this.nextSibling, n = this.parentNode;
- n && (b(this).remove(), n.insertBefore(e, t))
- })
- }, detach: function (e) {
- return this.remove(e, !0)
- }, domManip: function (e, n, r) {
- e = f.apply([], e);
- var i, o, a, s, u, l, c = 0, p = this.length, d = this, h = p - 1, g = e[0], m = b.isFunction(g);
- if (m || !(1 >= p || "string" != typeof g || b.support.checkClone) && Ct.test(g))return this.each(function (i) {
- var o = d.eq(i);
- m && (e[0] = g.call(this, i, n ? o.html() : t)), o.domManip(e, n, r)
- });
- if (p && (l = b.buildFragment(e, this[0].ownerDocument, !1, this), i = l.firstChild, 1 === l.childNodes.length && (l = i), i)) {
- 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);
- 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({
- url: o.src,
- type: "GET",
- dataType: "script",
- async: !1,
- global: !1,
- "throws": !0
- }) : b.globalEval((o.text || o.textContent || o.innerHTML || "").replace(St, "")));
- l = i = null
- }
- return this
- }
- });
- function Lt(e, t) {
- return e.getElementsByTagName(t)[0] || e.appendChild(e.ownerDocument.createElement(t))
- }
- function Ht(e) {
- var t = e.getAttributeNode("type");
- return e.type = (t && t.specified) + "/" + e.type, e
- }
- function qt(e) {
- var t = Et.exec(e.type);
- return t ? e.type = t[1] : e.removeAttribute("type"), e
- }
- function Mt(e, t) {
- var n, r = 0;
- for (; null != (n = e[r]); r++)b._data(n, "globalEval", !t || b._data(t[r], "globalEval"))
- }
- function _t(e, t) {
- if (1 === t.nodeType && b.hasData(e)) {
- var n, r, i, o = b._data(e), a = b._data(t, o), s = o.events;
- if (s) {
- delete a.handle, a.events = {};
- for (n in s)for (r = 0, i = s[n].length; i > r; r++)b.event.add(t, n, s[n][r])
- }
- a.data && (a.data = b.extend({}, a.data))
- }
- }
- function Ft(e, t) {
- var n, r, i;
- if (1 === t.nodeType) {
- if (n = t.nodeName.toLowerCase(), !b.support.noCloneEvent && t[b.expando]) {
- i = b._data(t);
- for (r in i.events)b.removeEvent(t, r, i.handle);
- t.removeAttribute(b.expando)
- }
- "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)
- }
- }
- b.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
- }, function (e, t) {
- b.fn[e] = function (e) {
- var n, r = 0, i = [], o = b(e), a = o.length - 1;
- for (; a >= r; r++)n = r === a ? this : this.clone(!0), b(o[r])[t](n), d.apply(i, n.get());
- return this.pushStack(i)
- }
- });
- function Ot(e, n) {
- var r, o, a = 0,
- s = typeof e.getElementsByTagName !== i ? e.getElementsByTagName(n || "*") : typeof e.querySelectorAll !== i ? e.querySelectorAll(n || "*") : t;
- 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));
- return n === t || n && b.nodeName(e, n) ? b.merge([e], s) : s
- }
- function Bt(e) {
- Nt.test(e.type) && (e.defaultChecked = e.checked)
- }
- b.extend({
- clone: function (e, t, n) {
- var r, i, o, a, s, u = b.contains(e.ownerDocument, e);
- 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]);
- 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);
- return r = Ot(o, "script"), r.length > 0 && Mt(r, !u && Ot(e, "script")), r = s = i = null, o
- }, buildFragment: function (e, t, n, r) {
- var i, o, a, s, u, l, c, p = e.length, f = dt(t), d = [], h = 0;
- 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)) {
- 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];
- while (i--)s = s.lastChild;
- if (!b.support.leadingWhitespace && yt.test(o) && d.push(t.createTextNode(yt.exec(o)[0])), !b.support.tbody) {
- o = "table" !== u || xt.test(o) ? "<table>" !== c[1] || xt.test(o) ? 0 : s : s.firstChild, i = o && o.childNodes.length;
- while (i--)b.nodeName(l = o.childNodes[i], "tbody") && !l.childNodes.length && o.removeChild(l)
- }
- b.merge(d, s.childNodes), s.textContent = "";
- while (s.firstChild)s.removeChild(s.firstChild);
- s = f.lastChild
- } else d.push(t.createTextNode(o));
- s && f.removeChild(s), b.support.appendChecked || b.grep(Ot(d, "input"), Bt), h = 0;
- 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)) {
- i = 0;
- while (o = s[i++])kt.test(o.type || "") && n.push(o)
- }
- return s = null, f
- }, cleanData: function (e, t) {
- var n, r, o, a, s = 0, u = b.expando, l = b.cache, p = b.support.deleteExpando, f = b.event.special;
- for (; null != (n = e[s]); s++)if ((t || b.acceptData(n)) && (o = n[u], a = o && l[o])) {
- if (a.events)for (r in a.events)f[r] ? b.event.remove(n, r) : b.removeEvent(n, r, a.handle);
- l[o] && (delete l[o], p ? delete n[u] : typeof n.removeAttribute !== i ? n.removeAttribute(u) : n[u] = null, c.push(o))
- }
- }
- });
- var Pt, Rt, Wt, $t = /alpha\([^)]*\)/i, It = /opacity\s*=\s*([^)]*)/, zt = /^(top|right|bottom|left)$/,
- Xt = /^(none|table(?!-c[ea]).+)/, Ut = /^margin/, Vt = RegExp("^(" + x + ")(.*)$", "i"),
- Yt = RegExp("^(" + x + ")(?!px)[a-z%]+$", "i"), Jt = RegExp("^([+-])=(" + x + ")", "i"),
- Gt = {BODY: "block"}, Qt = {position: "absolute", visibility: "hidden", display: "block"},
- Kt = {letterSpacing: 0, fontWeight: 400}, Zt = ["Top", "Right", "Bottom", "Left"],
- en = ["Webkit", "O", "Moz", "ms"];
- function tn(e, t) {
- if (t in e)return t;
- var n = t.charAt(0).toUpperCase() + t.slice(1), r = t, i = en.length;
- while (i--)if (t = en[i] + n, t in e)return t;
- return r
- }
- function nn(e, t) {
- return e = t || e, "none" === b.css(e, "display") || !b.contains(e.ownerDocument, e)
- }
- function rn(e, t) {
- var n, r, i, o = [], a = 0, s = e.length;
- 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"))));
- 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"));
- return e
- }
- b.fn.extend({
- css: function (e, n) {
- return b.access(this, function (e, n, r) {
- var i, o, a = {}, s = 0;
- if (b.isArray(n)) {
- for (o = Rt(e), i = n.length; i > s; s++)a[n[s]] = b.css(e, n[s], !1, o);
- return a
- }
- return r !== t ? b.style(e, n, r) : b.css(e, n)
- }, e, n, arguments.length > 1)
- }, show: function () {
- return rn(this, !0)
- }, hide: function () {
- return rn(this)
- }, toggle: function (e) {
- var t = "boolean" == typeof e;
- return this.each(function () {
- (t ? e : nn(this)) ? b(this).show() : b(this).hide()
- })
- }
- }), b.extend({
- cssHooks: {
- opacity: {
- get: function (e, t) {
- if (t) {
- var n = Wt(e, "opacity");
- return "" === n ? "1" : n
- }
- }
- }
- },
- cssNumber: {
- columnCount: !0,
- fillOpacity: !0,
- fontWeight: !0,
- lineHeight: !0,
- opacity: !0,
- orphans: !0,
- widows: !0,
- zIndex: !0,
- zoom: !0
- },
- cssProps: {"float": b.support.cssFloat ? "cssFloat" : "styleFloat"},
- style: function (e, n, r, i) {
- if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) {
- var o, a, s, u = b.camelCase(n), l = e.style;
- 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];
- 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 {
- l[n] = r
- } catch (c) {
- }
- }
- },
- css: function (e, n, r, i) {
- var o, a, s, u = b.camelCase(n);
- 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
- },
- swap: function (e, t, n, r) {
- var i, o, a = {};
- for (o in t)a[o] = e.style[o], e.style[o] = t[o];
- i = n.apply(e, r || []);
- for (o in t)e.style[o] = a[o];
- return i
- }
- }), e.getComputedStyle ? (Rt = function (t) {
- return e.getComputedStyle(t, null)
- }, Wt = function (e, n, r) {
- var i, o, a, s = r || Rt(e), u = s ? s.getPropertyValue(n) || s[n] : t, l = e.style;
- 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
- }) : o.documentElement.currentStyle && (Rt = function (e) {
- return e.currentStyle
- }, Wt = function (e, n, r) {
- var i, o, a, s = r || Rt(e), u = s ? s[n] : t, l = e.style;
- 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
- });
- function on(e, t, n) {
- var r = Vt.exec(t);
- return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t
- }
- function an(e, t, n, r, i) {
- var o = n === (r ? "border" : "content") ? 4 : "width" === t ? 1 : 0, a = 0;
- 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)));
- return a
- }
- function sn(e, t, n) {
- var r = !0, i = "width" === t ? e.offsetWidth : e.offsetHeight, o = Rt(e),
- a = b.support.boxSizing && "border-box" === b.css(e, "boxSizing", !1, o);
- if (0 >= i || null == i) {
- if (i = Wt(e, t, o), (0 > i || null == i) && (i = e.style[t]), Yt.test(i))return i;
- r = a && (b.support.boxSizingReliable || i === e.style[t]), i = parseFloat(i) || 0
- }
- return i + an(e, t, n || (a ? "border" : "content"), r, o) + "px"
- }
- function un(e) {
- var t = o, n = Gt[e];
- 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
- }
- function ln(e, t) {
- var n = b(t.createElement(e)).appendTo(t.body), r = b.css(n[0], "display");
- return n.remove(), r
- }
- b.each(["height", "width"], function (e, n) {
- b.cssHooks[n] = {
- get: function (e, r, i) {
- return r ? 0 === e.offsetWidth && Xt.test(b.css(e, "display")) ? b.swap(e, Qt, function () {
- return sn(e, n, i)
- }) : sn(e, n, i) : t
- }, set: function (e, t, r) {
- var i = r && Rt(e);
- return on(e, t, r ? an(e, n, r, b.support.boxSizing && "border-box" === b.css(e, "boxSizing", !1, i), i) : 0)
- }
- }
- }), b.support.opacity || (b.cssHooks.opacity = {
- get: function (e, t) {
- return It.test((t && e.currentStyle ? e.currentStyle.filter : e.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : t ? "1" : ""
- }, set: function (e, t) {
- var n = e.style, r = e.currentStyle, i = b.isNumeric(t) ? "alpha(opacity=" + 100 * t + ")" : "",
- o = r && r.filter || n.filter || "";
- 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)
- }
- }), b(function () {
- b.support.reliableMarginRight || (b.cssHooks.marginRight = {
- get: function (e, n) {
- return n ? b.swap(e, {display: "inline-block"}, Wt, [e, "marginRight"]) : t
- }
- }), !b.support.pixelPosition && b.fn.position && b.each(["top", "left"], function (e, n) {
- b.cssHooks[n] = {
- get: function (e, r) {
- return r ? (r = Wt(e, n), Yt.test(r) ? b(e).position()[n] + "px" : r) : t
- }
- }
- })
- }), b.expr && b.expr.filters && (b.expr.filters.hidden = function (e) {
- return 0 >= e.offsetWidth && 0 >= e.offsetHeight || !b.support.reliableHiddenOffsets && "none" === (e.style && e.style.display || b.css(e, "display"))
- }, b.expr.filters.visible = function (e) {
- return !b.expr.filters.hidden(e)
- }), b.each({margin: "", padding: "", border: "Width"}, function (e, t) {
- b.cssHooks[e + t] = {
- expand: function (n) {
- var r = 0, i = {}, o = "string" == typeof n ? n.split(" ") : [n];
- for (; 4 > r; r++)i[e + Zt[r] + t] = o[r] || o[r - 2] || o[0];
- return i
- }
- }, Ut.test(e) || (b.cssHooks[e + t].set = on)
- });
- var cn = /%20/g, pn = /\[\]$/, fn = /\r?\n/g, dn = /^(?:submit|button|image|reset|file)$/i,
- hn = /^(?:input|select|textarea|keygen)/i;
- b.fn.extend({
- serialize: function () {
- return b.param(this.serializeArray())
- }, serializeArray: function () {
- return this.map(function () {
- var e = b.prop(this, "elements");
- return e ? b.makeArray(e) : this
- }).filter(function () {
- var e = this.type;
- return this.name && !b(this).is(":disabled") && hn.test(this.nodeName) && !dn.test(e) && (this.checked || !Nt.test(e))
- }).map(function (e, t) {
- var n = b(this).val();
- return null == n ? null : b.isArray(n) ? b.map(n, function (e) {
- return {name: t.name, value: e.replace(fn, "\r\n")}
- }) : {name: t.name, value: n.replace(fn, "\r\n")}
- }).get()
- }
- }), b.param = function (e, n) {
- var r, i = [], o = function (e, t) {
- t = b.isFunction(t) ? t() : null == t ? "" : t, i[i.length] = encodeURIComponent(e) + "=" + encodeURIComponent(t)
- };
- if (n === t && (n = b.ajaxSettings && b.ajaxSettings.traditional), b.isArray(e) || e.jquery && !b.isPlainObject(e)) b.each(e, function () {
- o(this.name, this.value)
- }); else for (r in e)gn(r, e[r], n, o);
- return i.join("&").replace(cn, "+")
- };
- function gn(e, t, n, r) {
- var i;
- if (b.isArray(t)) b.each(t, function (t, i) {
- n || pn.test(e) ? r(e, i) : gn(e + "[" + ("object" == typeof i ? t : "") + "]", i, n, r)
- }); else if (n || "object" !== b.type(t)) r(e, t); else for (i in t)gn(e + "[" + i + "]", t[i], n, r)
- }
- 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) {
- b.fn[t] = function (e, n) {
- return arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t)
- }
- }), b.fn.hover = function (e, t) {
- return this.mouseenter(e).mouseleave(t || e)
- };
- var mn, yn, vn = b.now(), bn = /\?/, xn = /#.*$/, wn = /([?&])_=[^&]*/, Tn = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm,
- Nn = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, Cn = /^(?:GET|HEAD)$/, kn = /^\/\//,
- En = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, Sn = b.fn.load, An = {}, jn = {}, Dn = "*/".concat("*");
- try {
- yn = a.href
- } catch (Ln) {
- yn = o.createElement("a"), yn.href = "", yn = yn.href
- }
- mn = En.exec(yn.toLowerCase()) || [];
- function Hn(e) {
- return function (t, n) {
- "string" != typeof t && (n = t, t = "*");
- var r, i = 0, o = t.toLowerCase().match(w) || [];
- 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)
- }
- }
- function qn(e, n, r, i) {
- var o = {}, a = e === jn;
- function s(u) {
- var l;
- return o[u] = !0, b.each(e[u] || [], function (e, u) {
- var c = u(n, r, i);
- return "string" != typeof c || a || o[c] ? a ? !(l = c) : t : (n.dataTypes.unshift(c), s(c), !1)
- }), l
- }
- return s(n.dataTypes[0]) || !o["*"] && s("*")
- }
- function Mn(e, n) {
- var r, i, o = b.ajaxSettings.flatOptions || {};
- for (i in n)n[i] !== t && ((o[i] ? e : r || (r = {}))[i] = n[i]);
- return r && b.extend(!0, e, r), e
- }
- b.fn.load = function (e, n, r) {
- if ("string" != typeof e && Sn)return Sn.apply(this, arguments);
- var i, o, a, s = this, u = e.indexOf(" ");
- 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({
- url: e,
- type: a,
- dataType: "html",
- data: n
- }).done(function (e) {
- o = arguments, s.html(i ? b("<div>").append(b.parseHTML(e)).find(i) : e)
- }).complete(r && function (e, t) {
- s.each(r, o || [e.responseText, t, e])
- }), this
- }, b.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (e, t) {
- b.fn[t] = function (e) {
- return this.on(t, e)
- }
- }), b.each(["get", "post"], function (e, n) {
- b[n] = function (e, r, i, o) {
- return b.isFunction(r) && (o = o || i, i = r, r = t), b.ajax({
- url: e,
- type: n,
- dataType: o,
- data: r,
- success: i
- })
- }
- }), b.extend({
- active: 0,
- lastModified: {},
- etag: {},
- ajaxSettings: {
- url: yn,
- type: "GET",
- isLocal: Nn.test(mn[1]),
- global: !0,
- processData: !0,
- async: !0,
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
- accepts: {
- "*": Dn,
- text: "text/plain",
- html: "text/html",
- xml: "application/xml, text/xml",
- json: "application/json, text/javascript"
- },
- contents: {xml: /xml/, html: /html/, json: /json/},
- responseFields: {xml: "responseXML", text: "responseText"},
- converters: {"* text": e.String, "text html": !0, "text json": b.parseJSON, "text xml": b.parseXML},
- flatOptions: {url: !0, context: !0}
- },
- ajaxSetup: function (e, t) {
- return t ? Mn(Mn(e, b.ajaxSettings), t) : Mn(b.ajaxSettings, e)
- },
- ajaxPrefilter: Hn(An),
- ajaxTransport: Hn(jn),
- ajax: function (e, n) {
- "object" == typeof e && (n = e, e = t), n = n || {};
- var r, i, o, a, s, u, l, c, p = b.ajaxSetup({}, n), f = p.context || p,
- d = p.context && (f.nodeType || f.jquery) ? b(f) : b.event, h = b.Deferred(),
- g = b.Callbacks("once memory"), m = p.statusCode || {}, y = {}, v = {}, x = 0, T = "canceled", N = {
- readyState: 0, getResponseHeader: function (e) {
- var t;
- if (2 === x) {
- if (!c) {
- c = {};
- while (t = Tn.exec(a))c[t[1].toLowerCase()] = t[2]
- }
- t = c[e.toLowerCase()]
- }
- return null == t ? null : t
- }, getAllResponseHeaders: function () {
- return 2 === x ? a : null
- }, setRequestHeader: function (e, t) {
- var n = e.toLowerCase();
- return x || (e = v[n] = v[n] || e, y[e] = t), this
- }, overrideMimeType: function (e) {
- return x || (p.mimeType = e), this
- }, statusCode: function (e) {
- var t;
- if (e)if (2 > x)for (t in e)m[t] = [m[t], e[t]]; else N.always(e[N.status]);
- return this
- }, abort: function (e) {
- var t = e || T;
- return l && l.abort(t), k(0, t), this
- }
- };
- 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;
- 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["*"]);
- for (i in p.headers)N.setRequestHeader(i, p.headers[i]);
- if (p.beforeSend && (p.beforeSend.call(f, N, p) === !1 || 2 === x))return N.abort();
- T = "abort";
- for (i in{success: 1, error: 1, complete: 1})N[i](p[i]);
- if (l = qn(jn, p, n, N)) {
- N.readyState = 1, u && d.trigger("ajaxSend", [N, p]), p.async && p.timeout > 0 && (s = setTimeout(function () {
- N.abort("timeout")
- }, p.timeout));
- try {
- x = 1, l.send(y, k)
- } catch (C) {
- if (!(2 > x))throw C;
- k(-1, C)
- }
- } else k(-1, "No Transport");
- function k(e, n, r, i) {
- var c, y, v, w, T, C = n;
- 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")))
- }
- return N
- },
- getScript: function (e, n) {
- return b.get(e, t, n, "script")
- },
- getJSON: function (e, t, n) {
- return b.get(e, t, n, "json")
- }
- });
- function _n(e, n, r) {
- var i, o, a, s, u = e.contents, l = e.dataTypes, c = e.responseFields;
- for (s in c)s in r && (n[c[s]] = r[s]);
- while ("*" === l[0])l.shift(), o === t && (o = e.mimeType || n.getResponseHeader("Content-Type"));
- if (o)for (s in u)if (u[s] && u[s].test(o)) {
- l.unshift(s);
- break
- }
- if (l[0] in r) a = l[0]; else {
- for (s in r) {
- if (!l[0] || e.converters[s + " " + l[0]]) {
- a = s;
- break
- }
- i || (i = s)
- }
- a = a || i
- }
- return a ? (a !== l[0] && l.unshift(a), r[a]) : t
- }
- function Fn(e, t) {
- var n, r, i, o, a = {}, s = 0, u = e.dataTypes.slice(), l = u[0];
- if (e.dataFilter && (t = e.dataFilter(t, e.dataType)), u[1])for (i in e.converters)a[i.toLowerCase()] = e.converters[i];
- for (; r = u[++s];)if ("*" !== r) {
- if ("*" !== l && l !== r) {
- 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]])) {
- i === !0 ? i = a[n] : a[n] !== !0 && (r = o[0], u.splice(s--, 0, r));
- break
- }
- if (i !== !0)if (i && e["throws"]) t = i(t); else try {
- t = i(t)
- } catch (c) {
- return {state: "parsererror", error: i ? c : "No conversion from " + l + " to " + r}
- }
- }
- l = r
- }
- return {state: "success", data: t}
- }
- b.ajaxSetup({
- accepts: {script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},
- contents: {script: /(?:java|ecma)script/},
- converters: {
- "text script": function (e) {
- return b.globalEval(e), e
- }
- }
- }), b.ajaxPrefilter("script", function (e) {
- e.cache === t && (e.cache = !1), e.crossDomain && (e.type = "GET", e.global = !1)
- }), b.ajaxTransport("script", function (e) {
- if (e.crossDomain) {
- var n, r = o.head || b("head")[0] || o.documentElement;
- return {
- send: function (t, i) {
- n = o.createElement("script"), n.async = !0, e.scriptCharset && (n.charset = e.scriptCharset), n.src = e.url, n.onload = n.onreadystatechange = function (e, t) {
- (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"))
- }, r.insertBefore(n, r.firstChild)
- }, abort: function () {
- n && n.onload(t, !0)
- }
- }
- }
- });
- var On = [], Bn = /(=)\?(?=&|$)|\?\?/;
- b.ajaxSetup({
- jsonp: "callback", jsonpCallback: function () {
- var e = On.pop() || b.expando + "_" + vn++;
- return this[e] = !0, e
- }
- }), b.ajaxPrefilter("json jsonp", function (n, r, i) {
- var o, a, s,
- 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");
- 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 () {
- return s || b.error(o + " was not called"), s[0]
- }, n.dataTypes[0] = "json", a = e[o], e[o] = function () {
- s = arguments
- }, i.always(function () {
- e[o] = a, n[o] && (n.jsonpCallback = r.jsonpCallback, On.push(o)), s && b.isFunction(a) && a(s[0]), s = a = t
- }), "script") : t
- });
- var Pn, Rn, Wn = 0, $n = e.ActiveXObject && function () {
- var e;
- for (e in Pn)Pn[e](t, !0)
- };
- function In() {
- try {
- return new e.XMLHttpRequest
- } catch (t) {
- }
- }
- function zn() {
- try {
- return new e.ActiveXObject("Microsoft.XMLHTTP")
- } catch (t) {
- }
- }
- b.ajaxSettings.xhr = e.ActiveXObject ? function () {
- return !this.isLocal && In() || zn()
- } : In, Rn = b.ajaxSettings.xhr(), b.support.cors = !!Rn && "withCredentials" in Rn, Rn = b.support.ajax = !!Rn, Rn && b.ajaxTransport(function (n) {
- if (!n.crossDomain || b.support.cors) {
- var r;
- return {
- send: function (i, o) {
- var a, s, u = n.xhr();
- 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];
- n.mimeType && u.overrideMimeType && u.overrideMimeType(n.mimeType), n.crossDomain || i["X-Requested-With"] || (i["X-Requested-With"] = "XMLHttpRequest");
- try {
- for (s in i)u.setRequestHeader(s, i[s])
- } catch (l) {
- }
- u.send(n.hasContent && n.data || null), r = function (e, i) {
- var s, l, c, p;
- try {
- 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 {
- p = {}, s = u.status, l = u.getAllResponseHeaders(), "string" == typeof u.responseText && (p.text = u.responseText);
- try {
- c = u.statusText
- } catch (f) {
- c = ""
- }
- s || !n.isLocal || n.crossDomain ? 1223 === s && (s = 204) : s = p.text ? 200 : 404
- }
- } catch (d) {
- i || o(-1, d)
- }
- p && o(s, c, p, l)
- }, n.async ? 4 === u.readyState ? setTimeout(r) : (a = ++Wn, $n && (Pn || (Pn = {}, b(e).unload($n)), Pn[a] = r), u.onreadystatechange = r) : r()
- }, abort: function () {
- r && r(t, !0)
- }
- }
- }
- });
- var Xn, Un, Vn = /^(?:toggle|show|hide)$/, Yn = RegExp("^(?:([+-])=|)(" + x + ")([a-z%]*)$", "i"),
- Jn = /queueHooks$/, Gn = [nr], Qn = {
- "*": [function (e, t) {
- var n, r, i = this.createTween(e, t), o = Yn.exec(t), a = i.cur(), s = +a || 0, u = 1, l = 20;
- if (o) {
- if (n = +o[2], r = o[3] || (b.cssNumber[e] ? "" : "px"), "px" !== r && s) {
- s = b.css(i.elem, e, !0) || n || 1;
- do u = u || ".5", s /= u, b.style(i.elem, e, s + r); while (u !== (u = i.cur() / a) && 1 !== u && --l)
- }
- i.unit = r, i.start = s, i.end = o[1] ? s + (o[1] + 1) * n : n
- }
- return i
- }]
- };
- function Kn() {
- return setTimeout(function () {
- Xn = t
- }), Xn = b.now()
- }
- function Zn(e, t) {
- b.each(t, function (t, n) {
- var r = (Qn[t] || []).concat(Qn["*"]), i = 0, o = r.length;
- for (; o > i; i++)if (r[i].call(e, t, n))return
- })
- }
- function er(e, t, n) {
- var r, i, o = 0, a = Gn.length, s = b.Deferred().always(function () {
- delete u.elem
- }), u = function () {
- if (i)return !1;
- var t = Xn || Kn(), n = Math.max(0, l.startTime + l.duration - t), r = n / l.duration || 0, o = 1 - r,
- a = 0, u = l.tweens.length;
- for (; u > a; a++)l.tweens[a].run(o);
- return s.notifyWith(e, [l, o, n]), 1 > o && u ? n : (s.resolveWith(e, [l]), !1)
- }, l = s.promise({
- elem: e,
- props: b.extend({}, t),
- opts: b.extend(!0, {specialEasing: {}}, n),
- originalProperties: t,
- originalOptions: n,
- startTime: Xn || Kn(),
- duration: n.duration,
- tweens: [],
- createTween: function (t, n) {
- var r = b.Tween(e, l.opts, t, n, l.opts.specialEasing[t] || l.opts.easing);
- return l.tweens.push(r), r
- },
- stop: function (t) {
- var n = 0, r = t ? l.tweens.length : 0;
- if (i)return this;
- for (i = !0; r > n; n++)l.tweens[n].run(1);
- return t ? s.resolveWith(e, [l, t]) : s.rejectWith(e, [l, t]), this
- }
- }), c = l.props;
- for (tr(c, l.opts.specialEasing); a > o; o++)if (r = Gn[o].call(l, e, c, l.opts))return r;
- return Zn(l, c), b.isFunction(l.opts.start) && l.opts.start.call(e, l), b.fx.timer(b.extend(u, {
- elem: e,
- anim: l,
- queue: l.opts.queue
- })), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always)
- }
- function tr(e, t) {
- var n, r, i, o, a;
- 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) {
- n = a.expand(n), delete e[r];
- for (i in n)i in e || (e[i] = n[i], t[i] = o)
- } else t[r] = o
- }
- b.Animation = b.extend(er, {
- tweener: function (e, t) {
- b.isFunction(e) ? (t = e, e = ["*"]) : e = e.split(" ");
- var n, r = 0, i = e.length;
- for (; i > r; r++)n = e[r], Qn[n] = Qn[n] || [], Qn[n].unshift(t)
- }, prefilter: function (e, t) {
- t ? Gn.unshift(e) : Gn.push(e)
- }
- });
- function nr(e, t, n) {
- var r, i, o, a, s, u, l, c, p, f = this, d = e.style, h = {}, g = [], m = e.nodeType && nn(e);
- n.queue || (c = b._queueHooks(e, "fx"), null == c.unqueued && (c.unqueued = 0, p = c.empty.fire, c.empty.fire = function () {
- c.unqueued || p()
- }), c.unqueued++, f.always(function () {
- f.always(function () {
- c.unqueued--, b.queue(e, "fx").length || c.empty.fire()
- })
- })), 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 () {
- d.overflow = n.overflow[0], d.overflowX = n.overflow[1], d.overflowY = n.overflow[2]
- }));
- for (i in t)if (a = t[i], Vn.exec(a)) {
- if (delete t[i], u = u || "toggle" === a, a === (m ? "hide" : "show"))continue;
- g.push(i)
- }
- if (o = g.length) {
- 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 () {
- b(e).hide()
- }), f.done(function () {
- var t;
- b._removeData(e, "fxshow");
- for (t in h)b.style(e, t, h[t])
- });
- 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))
- }
- }
- function rr(e, t, n, r, i) {
- return new rr.prototype.init(e, t, n, r, i)
- }
- b.Tween = rr, rr.prototype = {
- constructor: rr, init: function (e, t, n, r, i, o) {
- 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")
- }, cur: function () {
- var e = rr.propHooks[this.prop];
- return e && e.get ? e.get(this) : rr.propHooks._default.get(this)
- }, run: function (e) {
- var t, n = rr.propHooks[this.prop];
- 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
- }
- }, rr.prototype.init.prototype = rr.prototype, rr.propHooks = {
- _default: {
- get: function (e) {
- var t;
- 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]
- }, set: function (e) {
- 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
- }
- }
- }, rr.propHooks.scrollTop = rr.propHooks.scrollLeft = {
- set: function (e) {
- e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now)
- }
- }, b.each(["toggle", "show", "hide"], function (e, t) {
- var n = b.fn[t];
- b.fn[t] = function (e, r, i) {
- return null == e || "boolean" == typeof e ? n.apply(this, arguments) : this.animate(ir(t, !0), e, r, i)
- }
- }), b.fn.extend({
- fadeTo: function (e, t, n, r) {
- return this.filter(nn).css("opacity", 0).show().end().animate({opacity: t}, e, n, r)
- }, animate: function (e, t, n, r) {
- var i = b.isEmptyObject(e), o = b.speed(t, n, r), a = function () {
- var t = er(this, b.extend({}, e), o);
- a.finish = function () {
- t.stop(!0)
- }, (i || b._data(this, "finish")) && t.stop(!0)
- };
- return a.finish = a, i || o.queue === !1 ? this.each(a) : this.queue(o.queue, a)
- }, stop: function (e, n, r) {
- var i = function (e) {
- var t = e.stop;
- delete e.stop, t(r)
- };
- return "string" != typeof e && (r = n, n = e, e = t), n && e !== !1 && this.queue(e || "fx", []), this.each(function () {
- var t = !0, n = null != e && e + "queueHooks", o = b.timers, a = b._data(this);
- 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]);
- 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));
- (t || !r) && b.dequeue(this, e)
- })
- }, finish: function (e) {
- return e !== !1 && (e = e || "fx"), this.each(function () {
- var t, n = b._data(this), r = n[e + "queue"], i = n[e + "queueHooks"], o = b.timers,
- a = r ? r.length : 0;
- 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));
- for (t = 0; a > t; t++)r[t] && r[t].finish && r[t].finish.call(this);
- delete n.finish
- })
- }
- });
- function ir(e, t) {
- var n, r = {height: e}, i = 0;
- for (t = t ? 1 : 0; 4 > i; i += 2 - t)n = Zt[i], r["margin" + n] = r["padding" + n] = e;
- return t && (r.opacity = r.width = e), r
- }
- b.each({
- slideDown: ir("show"),
- slideUp: ir("hide"),
- slideToggle: ir("toggle"),
- fadeIn: {opacity: "show"},
- fadeOut: {opacity: "hide"},
- fadeToggle: {opacity: "toggle"}
- }, function (e, t) {
- b.fn[e] = function (e, n, r) {
- return this.animate(t, e, n, r)
- }
- }), b.speed = function (e, t, n) {
- var r = e && "object" == typeof e ? b.extend({}, e) : {
- complete: n || !n && t || b.isFunction(e) && e,
- duration: e,
- easing: n && t || t && !b.isFunction(t) && t
- };
- 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 () {
- b.isFunction(r.old) && r.old.call(this), r.queue && b.dequeue(this, r.queue)
- }, r
- }, b.easing = {
- linear: function (e) {
- return e
- }, swing: function (e) {
- return .5 - Math.cos(e * Math.PI) / 2
- }
- }, b.timers = [], b.fx = rr.prototype.init, b.fx.tick = function () {
- var e, n = b.timers, r = 0;
- for (Xn = b.now(); n.length > r; r++)e = n[r], e() || n[r] !== e || n.splice(r--, 1);
- n.length || b.fx.stop(), Xn = t
- }, b.fx.timer = function (e) {
- e() && b.timers.push(e) && b.fx.start()
- }, b.fx.interval = 13, b.fx.start = function () {
- Un || (Un = setInterval(b.fx.tick, b.fx.interval))
- }, b.fx.stop = function () {
- clearInterval(Un), Un = null
- }, b.fx.speeds = {
- slow: 600,
- fast: 200,
- _default: 400
- }, b.fx.step = {}, b.expr && b.expr.filters && (b.expr.filters.animated = function (e) {
- return b.grep(b.timers, function (t) {
- return e === t.elem
- }).length
- }), b.fn.offset = function (e) {
- if (arguments.length)return e === t ? this : this.each(function (t) {
- b.offset.setOffset(this, e, t)
- });
- var n, r, o = {top: 0, left: 0}, a = this[0], s = a && a.ownerDocument;
- if (s)return n = s.documentElement, b.contains(n, a) ? (typeof a.getBoundingClientRect !== i && (o = a.getBoundingClientRect()), r = or(s), {
- top: o.top + (r.pageYOffset || n.scrollTop) - (n.clientTop || 0),
- left: o.left + (r.pageXOffset || n.scrollLeft) - (n.clientLeft || 0)
- }) : o
- }, b.offset = {
- setOffset: function (e, t, n) {
- var r = b.css(e, "position");
- "static" === r && (e.style.position = "relative");
- var i = b(e), o = i.offset(), a = b.css(e, "top"), s = b.css(e, "left"),
- u = ("absolute" === r || "fixed" === r) && b.inArray("auto", [a, s]) > -1, l = {}, c = {}, p, f;
- 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)
- }
- }, b.fn.extend({
- position: function () {
- if (this[0]) {
- var e, t, n = {top: 0, left: 0}, r = this[0];
- 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)), {
- top: t.top - n.top - b.css(r, "marginTop", !0),
- left: t.left - n.left - b.css(r, "marginLeft", !0)
- }
- }
- }, offsetParent: function () {
- return this.map(function () {
- var e = this.offsetParent || o.documentElement;
- while (e && !b.nodeName(e, "html") && "static" === b.css(e, "position"))e = e.offsetParent;
- return e || o.documentElement
- })
- }
- }), b.each({scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function (e, n) {
- var r = /Y/.test(n);
- b.fn[e] = function (i) {
- return b.access(this, function (e, i, o) {
- var a = or(e);
- 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)
- }, e, i, arguments.length, null)
- }
- });
- function or(e) {
- return b.isWindow(e) ? e : 9 === e.nodeType ? e.defaultView || e.parentWindow : !1
- }
- b.each({Height: "height", Width: "width"}, function (e, n) {
- b.each({padding: "inner" + e, content: n, "": "outer" + e}, function (r, i) {
- b.fn[i] = function (i, o) {
- var a = arguments.length && (r || "boolean" != typeof i),
- s = r || (i === !0 || o === !0 ? "margin" : "border");
- return b.access(this, function (n, r, i) {
- var o;
- 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)
- }, n, a ? i : t, a, null)
- }
- })
- }), e.jQuery = e.$ = b, "function" == typeof define && define.amd && define.amd.jQuery && define("jquery", [], function () {
- return b
- })
- })(window);
- </script>
- <script>
- /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
- var saveAs = saveAs || function (e) {
- "use strict";
- if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
- return
- }
- var t = e.document, n = function () {
- return e.URL || e.webkitURL || e
- }, r = t.createElementNS("http://www.w3.org/1999/xhtml", "a"), i = "download" in r, o = function (e) {
- var t = new MouseEvent("click");
- e.dispatchEvent(t)
- }, a = /Version\/[\d\.]+.*Safari/.test(navigator.userAgent), f = e.webkitRequestFileSystem,
- u = e.requestFileSystem || f || e.mozRequestFileSystem, s = function (t) {
- (e.setImmediate || e.setTimeout)(function () {
- throw t
- }, 0)
- }, c = "application/octet-stream", d = 0, l = 500, w = function (t) {
- var r = function () {
- if (typeof t === "string") {
- n().revokeObjectURL(t)
- } else {
- t.remove()
- }
- };
- if (e.chrome) {
- r()
- } else {
- setTimeout(r, l)
- }
- }, p = function (e, t, n) {
- t = [].concat(t);
- var r = t.length;
- while (r--) {
- var i = e["on" + t[r]];
- if (typeof i === "function") {
- try {
- i.call(e, n || e)
- } catch (o) {
- s(o)
- }
- }
- }
- }, v = function (e) {
- if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)) {
- return new Blob(["\ufeff", e], {type: e.type})
- }
- return e
- }, y = function (t, s, l) {
- if (!l) {
- t = v(t)
- }
- var y = this, m = t.type, S = false, h, R, O = function () {
- p(y, "writestart progress write writeend".split(" "))
- }, g = function () {
- if (R && a && typeof FileReader !== "undefined") {
- var r = new FileReader;
- r.onloadend = function () {
- var e = r.result;
- R.location.href = "data:attachment/file" + e.slice(e.search(/[,;]/));
- y.readyState = y.DONE;
- O()
- };
- r.readAsDataURL(t);
- y.readyState = y.INIT;
- return
- }
- if (S || !h) {
- h = n().createObjectURL(t)
- }
- if (R) {
- R.location.href = h
- } else {
- var i = e.open(h, "_blank");
- if (i == undefined && a) {
- e.location.href = h
- }
- }
- y.readyState = y.DONE;
- O();
- w(h)
- }, b = function (e) {
- return function () {
- if (y.readyState !== y.DONE) {
- return e.apply(this, arguments)
- }
- }
- }, E = {create: true, exclusive: false}, N;
- y.readyState = y.INIT;
- if (!s) {
- s = "download"
- }
- if (i) {
- h = n().createObjectURL(t);
- r.href = h;
- r.download = s;
- setTimeout(function () {
- o(r);
- O();
- w(h);
- y.readyState = y.DONE
- });
- return
- }
- if (e.chrome && m && m !== c) {
- N = t.slice || t.webkitSlice;
- t = N.call(t, 0, t.size, c);
- S = true
- }
- if (f && s !== "download") {
- s += ".download"
- }
- if (m === c || f) {
- R = e
- }
- if (!u) {
- g();
- return
- }
- d += t.size;
- u(e.TEMPORARY, d, b(function (e) {
- e.root.getDirectory("saved", E, b(function (e) {
- var n = function () {
- e.getFile(s, E, b(function (e) {
- e.createWriter(b(function (n) {
- n.onwriteend = function (t) {
- R.location.href = e.toURL();
- y.readyState = y.DONE;
- p(y, "writeend", t);
- w(e)
- };
- n.onerror = function () {
- var e = n.error;
- if (e.code !== e.ABORT_ERR) {
- g()
- }
- };
- "writestart progress write abort".split(" ").forEach(function (e) {
- n["on" + e] = y["on" + e]
- });
- n.write(t);
- y.abort = function () {
- n.abort();
- y.readyState = y.DONE
- };
- y.readyState = y.WRITING
- }), g)
- }), g)
- };
- e.getFile(s, {create: false}, b(function (e) {
- e.remove();
- n()
- }), b(function (e) {
- if (e.code === e.NOT_FOUND_ERR) {
- n()
- } else {
- g()
- }
- }))
- }), g)
- }), g)
- }, m = y.prototype, S = function (e, t, n) {
- return new y(e, t, n)
- };
- if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
- return function (e, t, n) {
- if (!n) {
- e = v(e)
- }
- return navigator.msSaveOrOpenBlob(e, t || "download")
- }
- }
- m.abort = function () {
- var e = this;
- e.readyState = e.DONE;
- p(e, "abort")
- };
- m.readyState = m.INIT = 0;
- m.WRITING = 1;
- m.DONE = 2;
- m.error = m.onwritestart = m.onprogress = m.onwrite = m.onabort = m.onerror = m.onwriteend = null;
- return S
- }(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content);
- if (typeof module !== "undefined" && module.exports) {
- module.exports.saveAs = saveAs
- } else if (typeof define !== "undefined" && define !== null && define.amd != null) {
- define([], function () {
- return saveAs
- })
- }
- </script>
- <script>
- /**
- * @file jsoneditor.js
- *
- * @brief
- * JSONEditor is a web-based tool to view, edit, and format JSON.
- * It shows data a clear, editable treeview.
- *
- * Supported browsers: Chrome, Firefox, Safari, Opera, Internet Explorer 8+
- *
- * @license
- * This json editor is open sourced with the intention to use the editor as
- * a component in your own application. Not to just copy and monetize the editor
- * as it is.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * Copyright (c) 2011-2012 Jos de Jong, http://jsoneditoronline.org
- *
- * @author Jos de Jong, <wjosdejong@gmail.com>
- * @date 2012-12-08
- */
- // Internet Explorer 8 and older does not support Array.indexOf,
- // so we define it here in that case
- // http://soledadpenades.com/2007/05/17/arrayindexof-in-internet-explorer/
- if (!Array.prototype.indexOf) {
- Array.prototype.indexOf = function (obj) {
- for (var i = 0; i < this.length; i++) {
- if (this[i] == obj) {
- return i;
- }
- }
- return -1;
- }
- }
- // Internet Explorer 8 and older does not support Array.forEach,
- // so we define it here in that case
- // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach
- if (!Array.prototype.forEach) {
- Array.prototype.forEach = function (fn, scope) {
- for (var i = 0, len = this.length; i < len; ++i) {
- fn.call(scope || this, this[i], i, this);
- }
- }
- }
- // define variable JSON, needed for correct error handling on IE7 and older
- var JSON;
- /**
- * JSONEditor
- * @param {Element} container Container element
- * @param {Object} [options] Object with options. available options:
- * {String} mode Editor mode. Available values:
- * 'editor' (default), 'viewer'.
- * {Boolean} search Enable search box.
- * True by default
- * {Boolean} history Enable history (undo/redo).
- * True by default
- * {function} change Callback method, triggered
- * on change of contents
- * {String} name Field name for the root node.
- * @param {Object | undefined} json JSON object
- */
- JSONEditor = function (container, options, json) {
- // check availability of JSON parser (not available in IE7 and older)
- if (!JSON) {
- throw new Error('您当前使用的浏览器不支持 JSON. \n\n' +
- '请下载安装最新版本的浏览器, 本站推荐Google Chrome.\n' +
- '(PS: 当前主流浏览器都支持JSON).');
- }
- if (!container) {
- throw new Error('没有提供容器元素.');
- }
- this.container = container;
- this.dom = {};
- this._setOptions(options);
- if (this.options.history && this.editable) {
- this.history = new JSONEditor.History(this);
- }
- this._createFrame();
- this._createTable();
- this.set(json || {});
- };
- /**
- * Initialize and set default options
- * @param {Object} [options] Object with options. available options:
- * {String} mode Editor mode. Available values:
- * 'editor' (default), 'viewer'.
- * {Boolean} search Enable search box.
- * True by default.
- * {Boolean} history Enable history (undo/redo).
- * True by default.
- * {function} change Callback method, triggered
- * on change of contents.
- * {String} name Field name for the root node.
- * @private
- */
- JSONEditor.prototype._setOptions = function (options) {
- this.options = {
- search: true,
- history: true,
- mode: 'editor',
- name: undefined // field name of root node
- };
- // copy all options
- if (options) {
- for (var prop in options) {
- if (options.hasOwnProperty(prop)) {
- this.options[prop] = options[prop];
- }
- }
- // check for deprecated options
- if (options.enableSearch) {
- // deprecated since version 1.6.0, 2012-11-03
- this.options.search = options.enableSearch;
- // console.log('WARNING: Option "enableSearch" is deprecated. Use "search" instead.');
- }
- if (options.enableHistory) {
- // deprecated since version 1.6.0, 2012-11-03
- this.options.search = options.enableHistory;
- // console.log('WARNING: Option "enableHistory" is deprecated. Use "history" instead.');
- }
- }
- // interpret the options
- this.editable = (this.options.mode != 'viewer');
- };
- // node currently being edited
- JSONEditor.focusNode = undefined;
- /**
- * Set JSON object in editor
- * @param {Object | undefined} json JSON data
- * @param {String} [name] Optional field name for the root node.
- * Can also be set using setName(name).
- */
- JSONEditor.prototype.set = function (json, name) {
- // adjust field name for root node
- if (name) {
- this.options.name = name;
- }
- // verify if json is valid JSON, ignore when a function
- if (json instanceof Function || (json === undefined)) {
- this.clear();
- } else {
- this.content.removeChild(this.table); // Take the table offline
- // replace the root node
- var params = {
- 'field': this.options.name,
- 'value': json
- };
- var node = new JSONEditor.Node(this, params);
- this._setRoot(node);
- // expand
- var recurse = false;
- this.node.expand(recurse);
- this.content.appendChild(this.table); // Put the table online again
- }
- // TODO: maintain history, store last state and previous document
- if (this.history) {
- this.history.clear();
- }
- };
- /**
- * Get JSON object from editor
- * @return {Object | undefined} json
- */
- JSONEditor.prototype.get = function () {
- // remove focus from currently edited node
- if (JSONEditor.focusNode) {
- JSONEditor.focusNode.blur();
- }
- if (this.node) {
- return this.node.getValue();
- } else {
- return undefined;
- }
- };
- /**
- * Set a field name for the root node.
- * @param {String | undefined} name
- */
- JSONEditor.prototype.setName = function (name) {
- this.options.name = name;
- if (this.node) {
- this.node.updateField(this.options.name);
- }
- };
- /**
- * Get the field name for the root node.
- * @return {String | undefined} name
- */
- JSONEditor.prototype.getName = function () {
- return this.options.name;
- };
- /**
- * Remove the root node from the editor
- */
- JSONEditor.prototype.clear = function () {
- if (this.node) {
- this.node.collapse();
- this.tbody.removeChild(this.node.getDom());
- delete this.node;
- }
- };
- /**
- * Set the root node for the json editor
- * @param {JSONEditor.Node} node
- * @private
- */
- JSONEditor.prototype._setRoot = function (node) {
- this.clear();
- this.node = node;
- // append to the dom
- this.tbody.appendChild(node.getDom());
- };
- /**
- * Search text in all nodes
- * The nodes will be expanded when the text is found one of its childs,
- * else it will be collapsed. Searches are case insensitive.
- * @param {String} text
- * @return {Object[]} results Array with nodes containing the search results
- * The result objects contains fields:
- * - {JSONEditor.Node} node,
- * - {String} elem the dom element name where
- * the result is found ('field' or
- * 'value')
- */
- JSONEditor.prototype.search = function (text) {
- var results;
- if (this.node) {
- this.content.removeChild(this.table); // Take the table offline
- results = this.node.search(text);
- this.content.appendChild(this.table); // Put the table online again
- } else {
- results = [];
- }
- return results;
- };
- /**
- * Expand all nodes
- */
- JSONEditor.prototype.expandAll = function () {
- if (this.node) {
- this.content.removeChild(this.table); // Take the table offline
- this.node.expand();
- this.content.appendChild(this.table); // Put the table online again
- }
- };
- /**
- * Collapse all nodes
- */
- JSONEditor.prototype.collapseAll = function () {
- if (this.node) {
- this.content.removeChild(this.table); // Take the table offline
- this.node.collapse();
- this.content.appendChild(this.table); // Put the table online again
- }
- };
- /**
- * The method onChange is called whenever a field or value is changed, created,
- * deleted, duplicated, etc.
- * @param {String} action Change action. Available values: "editField",
- * "editValue", "changeType", "appendNode",
- * "removeNode", "duplicateNode", "moveNode", "expand",
- * "collapse".
- * @param {Object} params Object containing parameters describing the change.
- * The parameters in params depend on the action (for
- * example for "editValue" the Node, old value, and new
- * value are provided). params contains all information
- * needed to undo or redo the action.
- */
- JSONEditor.prototype.onAction = function (action, params) {
- // add an action to the history
- if (this.history) {
- this.history.add(action, params);
- }
- // trigger the onChange callback
- if (this.options.change) {
- try {
- this.options.change();
- } catch (err) {
- //console.log('Error in change callback: ', err);
- }
- }
- };
- /**
- * Set the focus to the JSONEditor. A hidden input field will be created
- * which captures key events
- */
- // TODO: use the focus method?
- JSONEditor.prototype.focus = function () {
- /*
- if (!this.dom.focus) {
- this.dom.focus = document.createElement('input');
- this.dom.focus.className = 'jsoneditor-hidden-focus';
- var editor = this;
- this.dom.focus.onblur = function () {
- // remove itself
- if (editor.dom.focus) {
- var focus = editor.dom.focus;
- delete editor.dom.focus;
- editor.frame.removeChild(focus);
- }
- };
- // attach the hidden input box to the DOM
- if (this.frame.firstChild) {
- this.frame.insertBefore(this.dom.focus, this.frame.firstChild);
- }
- else {
- this.frame.appendChild(this.dom.focus);
- }
- }
- this.dom.focus.focus();
- */
- };
- /**
- * Adjust the scroll position such that given top position is shown at 1/4
- * of the window height.
- * @param {Number} top
- */
- JSONEditor.prototype.scrollTo = function (top) {
- var content = this.content;
- if (content) {
- // cancel any running animation
- var editor = this;
- if (editor.animateTimeout) {
- clearTimeout(editor.animateTimeout);
- delete editor.animateTimeout;
- }
- // calculate final scroll position
- var height = content.clientHeight;
- var bottom = content.scrollHeight - height;
- var finalScrollTop = Math.min(Math.max(top - height / 4, 0), bottom);
- // animate towards the new scroll position
- var animate = function () {
- var scrollTop = content.scrollTop;
- var diff = (finalScrollTop - scrollTop);
- if (Math.abs(diff) > 3) {
- content.scrollTop += diff / 3;
- editor.animateTimeout = setTimeout(animate, 50);
- }
- };
- animate();
- }
- };
- /**
- * @constructor JSONEditor.History
- * Store action history, enables undo and redo
- * @param {JSONEditor} editor
- */
- JSONEditor.History = function (editor) {
- this.editor = editor;
- this.clear();
- // map with all supported actions
- this.actions = {
- 'editField': {
- 'undo': function (obj) {
- obj.params.node.updateField(obj.params.oldValue);
- },
- 'redo': function (obj) {
- obj.params.node.updateField(obj.params.newValue);
- }
- },
- 'editValue': {
- 'undo': function (obj) {
- obj.params.node.updateValue(obj.params.oldValue);
- },
- 'redo': function (obj) {
- obj.params.node.updateValue(obj.params.newValue);
- }
- },
- 'appendNode': {
- 'undo': function (obj) {
- obj.params.parent.removeChild(obj.params.node);
- },
- 'redo': function (obj) {
- obj.params.parent.appendChild(obj.params.node);
- }
- },
- 'removeNode': {
- 'undo': function (obj) {
- var parent = obj.params.parent;
- var beforeNode = parent.childs[obj.params.index] || parent.append;
- parent.insertBefore(obj.params.node, beforeNode);
- },
- 'redo': function (obj) {
- obj.params.parent.removeChild(obj.params.node);
- }
- },
- 'duplicateNode': {
- 'undo': function (obj) {
- obj.params.parent.removeChild(obj.params.clone);
- },
- 'redo': function (obj) {
- // TODO: insert after instead of insert before
- obj.params.parent.insertBefore(obj.params.clone, obj.params.node);
- }
- },
- 'changeType': {
- 'undo': function (obj) {
- obj.params.node.changeType(obj.params.oldType);
- },
- 'redo': function (obj) {
- obj.params.node.changeType(obj.params.newType);
- }
- },
- 'moveNode': {
- 'undo': function (obj) {
- obj.params.startParent.moveTo(obj.params.node, obj.params.startIndex);
- },
- 'redo': function (obj) {
- obj.params.endParent.moveTo(obj.params.node, obj.params.endIndex);
- }
- }
- // TODO: restore the original caret position and selection with each undo
- // TODO: implement history for actions "expand", "collapse", "scroll", "setDocument"
- };
- };
- /**
- * The method onChange is executed when the History is changed, and can
- * be overloaded.
- */
- JSONEditor.History.prototype.onChange = function () {
- };
- /**
- * Add a new action to the history
- * @param {String} action The executed action. Available actions: "editField",
- * "editValue", "changeType", "appendNode",
- * "removeNode", "duplicateNode", "moveNode"
- * @param {Object} params Object containing parameters describing the change.
- * The parameters in params depend on the action (for
- * example for "editValue" the Node, old value, and new
- * value are provided). params contains all information
- * needed to undo or redo the action.
- */
- JSONEditor.History.prototype.add = function (action, params) {
- this.index++;
- this.history[this.index] = {
- 'action': action,
- 'params': params,
- 'timestamp': new Date()
- };
- // remove redo actions which are invalid now
- if (this.index < this.history.length - 1) {
- this.history.splice(this.index + 1, this.history.length - this.index - 1);
- }
- // fire onchange event
- this.onChange();
- };
- /**
- * Clear history
- */
- JSONEditor.History.prototype.clear = function () {
- this.history = [];
- this.index = -1;
- // fire onchange event
- this.onChange();
- };
- /**
- * Check if there is an action available for undo
- * @return {Boolean} canUndo
- */
- JSONEditor.History.prototype.canUndo = function () {
- return (this.index >= 0);
- };
- /**
- * Check if there is an action available for redo
- * @return {Boolean} canRedo
- */
- JSONEditor.History.prototype.canRedo = function () {
- return (this.index < this.history.length - 1);
- };
- /**
- * Undo the last action
- */
- JSONEditor.History.prototype.undo = function () {
- if (this.canUndo()) {
- var obj = this.history[this.index];
- if (obj) {
- var action = this.actions[obj.action];
- if (action && action.undo) {
- action.undo(obj);
- } else {
- //console.log('Error: unknown action "' + obj.action + '"');
- }
- }
- this.index--;
- // fire onchange event
- this.onChange();
- }
- };
- /**
- * Redo the last action
- */
- JSONEditor.History.prototype.redo = function () {
- if (this.canRedo()) {
- this.index++;
- var obj = this.history[this.index];
- if (obj) {
- if (obj) {
- var action = this.actions[obj.action];
- if (action && action.redo) {
- action.redo(obj);
- } else {
- //console.log('Error: unknown action "' + obj.action + '"');
- }
- }
- }
- // fire onchange event
- this.onChange();
- }
- };
- /**
- * @constructor JSONEditor.Node
- * Create a new Node
- * @param {JSONEditor} editor
- * @param {Object} params Can contain parameters: field, fieldEditable, value.
- */
- JSONEditor.Node = function (editor, params) {
- this.editor = editor;
- this.dom = {};
- this.expanded = false;
- if (params && (params instanceof Object)) {
- this.setField(params.field, params.fieldEditable);
- this.setValue(params.value);
- } else {
- this.setField();
- this.setValue();
- }
- };
- /**
- * Set parent node
- * @param {JSONEditor.Node} parent
- */
- JSONEditor.Node.prototype.setParent = function (parent) {
- this.parent = parent;
- };
- /**
- * Get parent node. Returns undefined when no parent node is set.
- * @return {JSONEditor.Node} parent
- */
- JSONEditor.Node.prototype.getParent = function () {
- return this.parent;
- };
- /**
- * Set field
- * @param {String} field
- * @param {boolean} fieldEditable
- */
- JSONEditor.Node.prototype.setField = function (field, fieldEditable) {
- this.field = field;
- this.fieldEditable = (fieldEditable == true);
- };
- /**
- * Get field
- * @return {String}
- */
- JSONEditor.Node.prototype.getField = function () {
- if (this.field === undefined) {
- this._getDomField();
- }
- return this.field;
- };
- /**
- * Set value. Value is a JSON structure or an element String, Boolean, etc.
- * @param {*} value
- */
- JSONEditor.Node.prototype.setValue = function (value) {
- var childValue, child;
- // first clear all current childs (if any)
- var childs = this.childs;
- if (childs) {
- while (childs.length) {
- this.removeChild(childs[0]);
- }
- }
- // TODO: remove the DOM of this Node
- this.type = this._getType(value);
- if (this.type == 'array') {
- // array
- this.childs = [];
- for (var i = 0, iMax = value.length; i < iMax; i++) {
- childValue = value[i];
- if (childValue !== undefined && !(childValue instanceof Function)) {
- // ignore undefined and functions
- child = new JSONEditor.Node(this.editor, {
- 'value': childValue
- });
- this.appendChild(child);
- }
- }
- this.value = '';
- } else if (this.type == 'object') {
- // object
- this.childs = [];
- for (var childField in value) {
- if (value.hasOwnProperty(childField)) {
- childValue = value[childField];
- if (childValue !== undefined && !(childValue instanceof Function)) {
- // ignore undefined and functions
- child = new JSONEditor.Node(this.editor, {
- 'field': childField,
- 'value': childValue
- });
- this.appendChild(child);
- }
- }
- }
- this.value = '';
- } else {
- // value
- this.childs = undefined;
- this.value = value;
- /* TODO
- if (typeof(value) == 'string') {
- var escValue = JSON.stringify(value);
- this.value = escValue.substring(1, escValue.length - 1);
- console.log('check', value, this.value);
- }
- else {
- this.value = value;
- }
- */
- }
- };
- /**
- * Get value. Value is a JSON structure
- * @return {*} value
- */
- JSONEditor.Node.prototype.getValue = function () {
- //var childs, i, iMax;
- if (this.type == 'array') {
- var arr = [];
- this.childs.forEach(function (child) {
- arr.push(child.getValue());
- });
- return arr;
- } else if (this.type == 'object') {
- var obj = {};
- this.childs.forEach(function (child) {
- obj[child.getField()] = child.getValue();
- });
- return obj;
- } else {
- if (this.value === undefined) {
- this._getDomValue();
- }
- return this.value;
- }
- };
- /**
- * Get the nesting level of this node
- * @return {Number} level
- */
- JSONEditor.Node.prototype.getLevel = function () {
- return (this.parent ? this.parent.getLevel() + 1 : 0);
- };
- /**
- * Create a clone of a node
- * The complete state of a clone is copied, including whether it is expanded or
- * not. The DOM elements are not cloned.
- * @return {JSONEditor.Node} clone
- */
- JSONEditor.Node.prototype.clone = function () {
- var clone = new JSONEditor.Node(this.editor);
- clone.type = this.type;
- clone.field = this.field;
- clone.fieldInnerText = this.fieldInnerText;
- clone.fieldEditable = this.fieldEditable;
- clone.value = this.value;
- clone.valueInnerText = this.valueInnerText;
- clone.expanded = this.expanded;
- if (this.childs) {
- // an object or array
- var cloneChilds = [];
- this.childs.forEach(function (child) {
- var childClone = child.clone();
- childClone.setParent(clone);
- cloneChilds.push(childClone);
- });
- clone.childs = cloneChilds;
- } else {
- // a value
- clone.childs = undefined;
- }
- return clone;
- };
- /**
- * Expand this node and optionally its childs.
- * @param {boolean} recurse Optional recursion, true by default. When
- * true, all childs will be expanded recursively
- */
- JSONEditor.Node.prototype.expand = function (recurse) {
- if (!this.childs) {
- return;
- }
- // set this node expanded
- this.expanded = true;
- if (this.dom.expand) {
- this.dom.expand.className = 'jsoneditor-expanded';
- }
- this.showChilds();
- if (recurse != false) {
- this.childs.forEach(function (child) {
- child.expand(recurse);
- });
- }
- };
- /**
- * Collapse this node and optionally its childs.
- * @param {Number} recurse Optional recursion, true by default. When
- * true, all childs will be collapsed recursively
- */
- JSONEditor.Node.prototype.collapse = function (recurse) {
- if (!this.childs) {
- return;
- }
- this.hideChilds();
- // collapse childs in case of recurse
- if (recurse != false) {
- this.childs.forEach(function (child) {
- child.collapse(recurse);
- });
- }
- // make this node collapsed
- if (this.dom.expand) {
- this.dom.expand.className = 'jsoneditor-collapsed';
- }
- this.expanded = false;
- };
- /**
- * Recursively show all childs when they are expanded
- */
- JSONEditor.Node.prototype.showChilds = function () {
- var childs = this.childs;
- if (!childs) {
- return;
- }
- if (!this.expanded) {
- return;
- }
- var tr = this.dom.tr;
- var table = tr ? tr.parentNode : undefined;
- if (table) {
- // show row with append button
- var append = this.getAppend();
- var nextTr = tr.nextSibling;
- if (nextTr) {
- table.insertBefore(append, nextTr);
- } else {
- table.appendChild(append);
- }
- // show childs
- this.childs.forEach(function (child) {
- table.insertBefore(child.getDom(), append);
- child.showChilds();
- });
- }
- };
- /**
- * Hide the node with all its childs
- */
- JSONEditor.Node.prototype.hide = function () {
- var tr = this.dom.tr;
- var table = tr ? tr.parentNode : undefined;
- if (table) {
- table.removeChild(tr);
- }
- this.hideChilds();
- };
- /**
- * Recursively hide all childs
- */
- JSONEditor.Node.prototype.hideChilds = function () {
- var childs = this.childs;
- if (!childs) {
- return;
- }
- if (!this.expanded) {
- return;
- }
- // hide append row
- var append = this.getAppend();
- if (append.parentNode) {
- append.parentNode.removeChild(append);
- }
- // hide childs
- this.childs.forEach(function (child) {
- child.hide();
- });
- };
- /**
- * Add a new child to the node.
- * Only applicable when Node value is of type array or object
- * @param {JSONEditor.Node} node
- */
- JSONEditor.Node.prototype.appendChild = function (node) {
- if (this.type == 'array' || this.type == 'object') {
- // adjust the link to the parent
- node.setParent(this);
- node.fieldEditable = (this.type == 'object');
- if (this.type == 'array') {
- node.index = this.childs.length;
- }
- this.childs.push(node);
- if (this.expanded) {
- // insert into the DOM, before the appendRow
- var newtr = node.getDom();
- var appendTr = this.getAppend();
- var table = appendTr ? appendTr.parentNode : undefined;
- if (appendTr && table) {
- table.insertBefore(newtr, appendTr);
- }
- node.showChilds();
- }
- this.updateDom({
- 'updateIndexes': true
- });
- node.updateDom({
- 'recurse': true
- });
- }
- };
- /**
- * Move a node from its current parent to this node
- * Only applicable when Node value is of type array or object
- * @param {JSONEditor.Node} node
- * @param {JSONEditor.Node} beforeNode
- */
- JSONEditor.Node.prototype.moveBefore = function (node, beforeNode) {
- if (this.type == 'array' || this.type == 'object') {
- // create a temporary row, to prevent the scroll position from jumping
- // when removing the node
- var tbody = (this.dom.tr) ? this.dom.tr.parentNode : undefined;
- if (tbody) {
- var trTemp = document.createElement('tr');
- trTemp.style.height = tbody.clientHeight + 'px';
- tbody.appendChild(trTemp);
- }
- var parent = node.getParent();
- if (parent) {
- parent.removeChild(node);
- }
- if (beforeNode instanceof JSONEditor.AppendNode) {
- this.appendChild(node);
- } else {
- this.insertBefore(node, beforeNode);
- }
- if (tbody) {
- tbody.removeChild(trTemp);
- }
- }
- };
- /**
- * Move a node from its current parent to this node
- * Only applicable when Node value is of type array or object.
- * If index is out of range, the node will be appended to the end
- * @param {JSONEditor.Node} node
- * @param {Number} index
- */
- JSONEditor.Node.prototype.moveTo = function (node, index) {
- if (node.parent == this) {
- // same parent
- var currentIndex = this.childs.indexOf(node);
- if (currentIndex < index) {
- // compensate the index for removal of the node itself
- index++;
- }
- }
- var beforeNode = this.childs[index] || this.append;
- this.moveBefore(node, beforeNode);
- };
- /**
- * Insert a new child before a given node
- * Only applicable when Node value is of type array or object
- * @param {JSONEditor.Node} node
- * @param {JSONEditor.Node} beforeNode
- */
- JSONEditor.Node.prototype.insertBefore = function (node, beforeNode) {
- if (this.type == 'array' || this.type == 'object') {
- if (beforeNode == this.append) {
- // append to the child nodes
- // adjust the link to the parent
- node.setParent(this);
- node.fieldEditable = (this.type == 'object');
- this.childs.push(node);
- } else {
- // insert before a child node
- var index = this.childs.indexOf(beforeNode);
- if (index == -1) {
- throw new Error('节点未找到.');
- }
- // adjust the link to the parent
- node.setParent(this);
- node.fieldEditable = (this.type == 'object');
- this.childs.splice(index, 0, node);
- }
- if (this.expanded) {
- // insert into the DOM
- var newTr = node.getDom();
- var nextTr = beforeNode.getDom();
- var table = nextTr ? nextTr.parentNode : undefined;
- if (nextTr && table) {
- table.insertBefore(newTr, nextTr);
- }
- node.showChilds();
- }
- this.updateDom({
- 'updateIndexes': true
- });
- node.updateDom({
- 'recurse': true
- });
- }
- };
- /**
- * Search in this node
- * The node will be expanded when the text is found one of its childs, else
- * it will be collapsed. Searches are case insensitive.
- * @param {String} text
- * @return {JSONEditor.Node[]} results Array with nodes containing the search text
- */
- JSONEditor.Node.prototype.search = function (text) {
- var results = [];
- var index;
- var search = text ? text.toLowerCase() : undefined;
- // delete old search data
- delete this.searchField;
- delete this.searchValue;
- // search in field
- if (this.field != undefined) {
- var field = String(this.field).toLowerCase();
- index = field.indexOf(search);
- if (index != -1) {
- this.searchField = true;
- results.push({
- 'node': this,
- 'elem': 'field'
- });
- }
- // update dom
- this._updateDomField();
- }
- // search in value
- if (this.type == 'array' || this.type == 'object') {
- // array, object
- // search the nodes childs
- if (this.childs) {
- var childResults = [];
- this.childs.forEach(function (child) {
- childResults = childResults.concat(child.search(text));
- });
- results = results.concat(childResults);
- }
- // update dom
- if (search != undefined) {
- var recurse = false;
- if (childResults.length == 0) {
- this.collapse(recurse);
- } else {
- this.expand(recurse);
- }
- }
- } else {
- // string, auto
- if (this.value != undefined) {
- var value = String(this.value).toLowerCase();
- index = value.indexOf(search);
- if (index != -1) {
- this.searchValue = true;
- results.push({
- 'node': this,
- 'elem': 'value'
- });
- }
- }
- // update dom
- this._updateDomValue();
- }
- return results;
- };
- /**
- * Move the scroll position such that this node is in the visible area.
- * The node will not get the focus
- */
- JSONEditor.Node.prototype.scrollTo = function () {
- if (!this.dom.tr || !this.dom.tr.parentNode) {
- // if the node is not visible, expand its parents
- var parent = this.parent;
- var recurse = false;
- while (parent) {
- parent.expand(recurse);
- parent = parent.parent;
- }
- }
- if (this.dom.tr && this.dom.tr.parentNode) {
- this.editor.scrollTo(this.dom.tr.offsetTop);
- }
- };
- /**
- * Set focus to the value of this node
- * @param {String} [field] The field name of the element to get the focus
- * available values: 'field', 'value'
- */
- JSONEditor.Node.prototype.focus = function (field) {
- if (this.dom.tr && this.dom.tr.parentNode) {
- if (field != 'value' && this.fieldEditable) {
- var domField = this.dom.field;
- if (domField) {
- domField.focus();
- }
- } else {
- var domValue = this.dom.value;
- if (domValue) {
- domValue.focus();
- }
- }
- }
- };
- /**
- * Update the values from the DOM field and value of this node
- */
- JSONEditor.Node.prototype.blur = function () {
- // retrieve the actual field and value from the DOM.
- this._getDomValue(false);
- this._getDomField(false);
- };
- /**
- * Duplicate given child node
- * new structure will be added right before the cloned node
- * @param {JSONEditor.Node} node the childNode to be duplicated
- * @return {JSONEditor.Node} clone the clone of the node
- * @private
- */
- JSONEditor.Node.prototype._duplicate = function (node) {
- var clone = node.clone();
- /* TODO: adjust the field name (to prevent equal field names)
- if (this.type == 'object') {
- }
- */
- // TODO: insert after instead of insert before
- this.insertBefore(clone, node);
- return clone;
- };
- /**
- * Check if given node is a child. The method will check recursively to find
- * this node.
- * @param {JSONEditor.Node} node
- * @return {boolean} containsNode
- */
- JSONEditor.Node.prototype.containsNode = function (node) {
- if (this == node) {
- return true;
- }
- var childs = this.childs;
- if (childs) {
- // TOOD: use the js5 Array.some() here?
- for (var i = 0, iMax = childs.length; i < iMax; i++) {
- if (childs[i].containsNode(node)) {
- return true;
- }
- }
- }
- return false;
- };
- /**
- * Move given node into this node
- * @param {JSONEditor.Node} node the childNode to be moved
- * @param {JSONEditor.Node} beforeNode node will be inserted before given
- * node. If no beforeNode is given,
- * the node is appended at the end
- * @private
- */
- JSONEditor.Node.prototype._move = function (node, beforeNode) {
- if (node == beforeNode) {
- // nothing to do...
- return;
- }
- // check if this node is not a child of the node to be moved here
- if (node.containsNode(this)) {
- throw new Error('不能把区域移动到自身的子节点.');
- }
- // remove the original node
- if (node.parent) {
- node.parent.removeChild(node);
- }
- // create a clone of the node
- var clone = node.clone();
- node.clearDom();
- // insert or append the node
- if (beforeNode) {
- this.insertBefore(clone, beforeNode);
- } else {
- this.appendChild(clone);
- }
- /* TODO: adjust the field name (to prevent equal field names)
- if (this.type == 'object') {
- }
- */
- };
- /**
- * Remove a child from the node.
- * Only applicable when Node value is of type array or object
- * @param {JSONEditor.Node} node The child node to be removed;
- * @return {JSONEditor.Node | undefined} node The removed node on success,
- * else undefined
- */
- JSONEditor.Node.prototype.removeChild = function (node) {
- if (this.childs) {
- var index = this.childs.indexOf(node);
- if (index != -1) {
- node.hide();
- // delete old search results
- delete node.searchField;
- delete node.searchValue;
- var removedNode = this.childs.splice(index, 1)[0];
- this.updateDom({
- 'updateIndexes': true
- });
- return removedNode;
- }
- }
- return undefined;
- };
- /**
- * Remove a child node node from this node
- * This method is equal to Node.removeChild, except that _remove firex an
- * onChange event.
- * @param {JSONEditor.Node} node
- * @private
- */
- JSONEditor.Node.prototype._remove = function (node) {
- this.removeChild(node);
- };
- /**
- * Change the type of the value of this Node
- * @param {String} newType
- */
- JSONEditor.Node.prototype.changeType = function (newType) {
- var oldType = this.type;
- if ((newType == 'string' || newType == 'auto') && (oldType == 'string' || oldType == 'auto')) {
- // this is an easy change
- this.type = newType;
- } else {
- // change from array to object, or from string/auto to object/array
- var table = this.dom.tr ? this.dom.tr.parentNode : undefined;
- var lastTr;
- if (this.expanded) {
- lastTr = this.getAppend();
- } else {
- lastTr = this.getDom();
- }
- var nextTr = (lastTr && lastTr.parentNode) ? lastTr.nextSibling : undefined;
- // hide current field and all its childs
- this.hide();
- this.clearDom();
- // adjust the field and the value
- this.type = newType;
- // adjust childs
- if (newType == 'object') {
- if (!this.childs) {
- this.childs = [];
- }
- this.childs.forEach(function (child, index) {
- child.clearDom();
- delete child.index;
- child.fieldEditable = true;
- if (child.field == undefined) {
- child.field = index;
- }
- });
- if (oldType == 'string' || oldType == 'auto') {
- this.expanded = true;
- }
- } else if (newType == 'array') {
- if (!this.childs) {
- this.childs = [];
- }
- this.childs.forEach(function (child, index) {
- child.clearDom();
- child.fieldEditable = false;
- child.index = index;
- });
- if (oldType == 'string' || oldType == 'auto') {
- this.expanded = true;
- }
- } else {
- this.expanded = false;
- }
- // create new DOM
- if (table) {
- if (nextTr) {
- table.insertBefore(this.getDom(), nextTr);
- } else {
- table.appendChild(this.getDom());
- }
- }
- this.showChilds();
- }
- if (newType == 'auto' || newType == 'string') {
- // cast value to the correct type
- if (newType == 'string') {
- this.value = String(this.value);
- } else {
- this.value = this._stringCast(String(this.value));
- }
- this.focus();
- }
- this.updateDom({
- 'updateIndexes': true
- });
- };
- /**
- * Retrieve value from DOM
- * @param {boolean} silent. If true (default), no errors will be thrown in
- * case of invalid data
- * @private
- */
- JSONEditor.Node.prototype._getDomValue = function (silent) {
- if (this.dom.value && this.type != 'array' && this.type != 'object') {
- this.valueInnerText = JSONEditor.getInnerText(this.dom.value);
- }
- if (this.valueInnerText != undefined) {
- try {
- // retrieve the value
- var value;
- if (this.type == 'string') {
- value = this._unescapeHTML(this.valueInnerText);
- } else {
- var str = this._unescapeHTML(this.valueInnerText);
- value = this._stringCast(str);
- }
- if (value !== this.value) {
- var oldValue = this.value;
- this.value = value;
- this.editor.onAction('editValue', {
- 'node': this,
- 'oldValue': oldValue,
- 'newValue': value
- });
- }
- } catch (err) {
- this.value = undefined;
- // TODO: sent an action with the new, invalid value?
- if (silent != true) {
- throw err;
- }
- }
- }
- };
- /**
- * Update dom value:
- * - the text color of the value, depending on the type of the value
- * - the height of the field, depending on the width
- * - background color in case it is empty
- * @private
- */
- JSONEditor.Node.prototype._updateDomValue = function () {
- var domValue = this.dom.value;
- if (domValue) {
- // set text color depending on value type
- var v = this.value;
- var t = (this.type == 'auto') ? typeof (v) : this.type;
- var color = '';
- if (t == 'string') {
- color = 'green';
- } else if (t == 'number') {
- color = 'red';
- } else if (t == 'boolean') {
- color = 'blue';
- } else if (this.type == 'object' || this.type == 'array') {
- // note: typeof(null)=="object", therefore check this.type instead of t
- color = '';
- } else if (v === null) {
- color = 'purple';
- } else if (v === undefined) {
- // invalid value
- color = 'green';
- }
- domValue.style.color = color;
- // make backgound color lightgray when empty
- var isEmpty = (String(this.value) == '' && this.type != 'array' && this.type != 'object');
- if (isEmpty) {
- JSONEditor.addClassName(domValue, 'jsoneditor-empty');
- } else {
- JSONEditor.removeClassName(domValue, 'jsoneditor-empty');
- }
- // highlight when there is a search result
- if (this.searchValueActive) {
- JSONEditor.addClassName(domValue, 'jsoneditor-search-highlight-active');
- } else {
- JSONEditor.removeClassName(domValue, 'jsoneditor-search-highlight-active');
- }
- if (this.searchValue) {
- JSONEditor.addClassName(domValue, 'jsoneditor-search-highlight');
- } else {
- JSONEditor.removeClassName(domValue, 'jsoneditor-search-highlight');
- }
- // strip formatting from the contents of the editable div
- JSONEditor.stripFormatting(domValue);
- }
- };
- /**
- * Update dom field:
- * - the text color of the field, depending on the text
- * - the height of the field, depending on the width
- * - background color in case it is empty
- * @private
- */
- JSONEditor.Node.prototype._updateDomField = function () {
- var domField = this.dom.field;
- if (domField) {
- // make backgound color lightgray when empty
- var isEmpty = (String(this.field) == '');
- if (isEmpty) {
- JSONEditor.addClassName(domField, 'jsoneditor-empty');
- } else {
- JSONEditor.removeClassName(domField, 'jsoneditor-empty');
- }
- // highlight when there is a search result
- if (this.searchFieldActive) {
- JSONEditor.addClassName(domField, 'jsoneditor-search-highlight-active');
- } else {
- JSONEditor.removeClassName(domField, 'jsoneditor-search-highlight-active');
- }
- if (this.searchField) {
- JSONEditor.addClassName(domField, 'jsoneditor-search-highlight');
- } else {
- JSONEditor.removeClassName(domField, 'jsoneditor-search-highlight');
- }
- // strip formatting from the contents of the editable div
- JSONEditor.stripFormatting(domField);
- }
- };
- /**
- * Retrieve field from DOM
- * @param {boolean} silent. If true (default), no errors will be thrown in
- * case of invalid data
- * @private
- */
- JSONEditor.Node.prototype._getDomField = function (silent) {
- if (this.dom.field && this.fieldEditable) {
- this.fieldInnerText = JSONEditor.getInnerText(this.dom.field);
- }
- if (this.fieldInnerText != undefined) {
- try {
- var field = this._unescapeHTML(this.fieldInnerText);
- if (field !== this.field) {
- var oldField = this.field;
- this.field = field;
- this.editor.onAction('editField', {
- 'node': this,
- 'oldValue': oldField,
- 'newValue': field
- });
- }
- } catch (err) {
- this.field = undefined;
- // TODO: sent an action here, with the new, invalid value?
- if (silent != true) {
- throw err;
- }
- }
- }
- };
- /**
- * Clear the dom of the node
- */
- JSONEditor.Node.prototype.clearDom = function () {
- // TODO: hide the node first?
- //this.hide();
- // TOOD: recursively clear dom?
- this.dom = {};
- };
- /**
- * Get the HTML DOM TR element of the node.
- * The dom will be generated when not yet created
- * @return {Element} tr HTML DOM TR Element
- */
- JSONEditor.Node.prototype.getDom = function () {
- var dom = this.dom;
- if (dom.tr) {
- return dom.tr;
- }
- // create row
- dom.tr = document.createElement('tr');
- dom.tr.className = 'jsoneditor-tr';
- dom.tr.node = this;
- if (this.editor.editable) {
- // create draggable area
- var tdDrag = document.createElement('td');
- tdDrag.className = 'jsoneditor-td';
- dom.drag = this._createDomDragArea();
- if (dom.drag) {
- tdDrag.appendChild(dom.drag);
- }
- dom.tr.appendChild(tdDrag);
- }
- // create tree and field
- var tdField = document.createElement('td');
- tdField.className = 'jsoneditor-td';
- dom.tr.appendChild(tdField);
- dom.expand = this._createDomExpandButton();
- dom.field = this._createDomField();
- dom.value = this._createDomValue();
- dom.tree = this._createDomTree(dom.expand, dom.field, dom.value);
- tdField.appendChild(dom.tree);
- if (this.editor.editable) {
- // create type select box
- var tdType = document.createElement('td');
- tdType.className = 'jsoneditor-td jsoneditor-td-edit';
- dom.tr.appendChild(tdType);
- dom.type = this._createDomTypeButton();
- tdType.appendChild(dom.type);
- // create duplicate button
- var tdDuplicate = document.createElement('td');
- tdDuplicate.className = 'jsoneditor-td jsoneditor-td-edit';
- dom.tr.appendChild(tdDuplicate);
- dom.duplicate = this._createDomDuplicateButton();
- if (dom.duplicate) {
- tdDuplicate.appendChild(dom.duplicate);
- }
- // create remove button
- var tdRemove = document.createElement('td');
- tdRemove.className = 'jsoneditor-td jsoneditor-td-edit';
- dom.tr.appendChild(tdRemove);
- dom.remove = this._createDomRemoveButton();
- if (dom.remove) {
- tdRemove.appendChild(dom.remove);
- }
- }
- this.updateDom(); // TODO: recurse here?
- return dom.tr;
- };
- /**
- * DragStart event, fired on mousedown on the dragarea at the left side of a Node
- * @param {Event} event
- * @private
- */
- JSONEditor.Node.prototype._onDragStart = function (event) {
- event = event || window.event;
- var node = this;
- if (!this.mousemove) {
- this.mousemove = JSONEditor.Events.addEventListener(document, 'mousemove',
- function (event) {
- node._onDrag(event);
- });
- }
- if (!this.mouseup) {
- this.mouseup = JSONEditor.Events.addEventListener(document, 'mouseup',
- function (event) {
- node._onDragEnd(event);
- });
- }
- /* TODO: correct highlighting when the TypeDropDown is visible (And has highlighting locked)
- if (JSONEditor.freezeHighlight) {
- console.log('heee');
- JSONEditor.freezeHighlight = false;
- this.setHighlight(true);
- }
- */
- JSONEditor.freezeHighlight = true;
- this.drag = {
- 'oldCursor': document.body.style.cursor,
- 'startParent': this.parent,
- 'startIndex': this.parent.childs.indexOf(this)
- };
- document.body.style.cursor = 'move';
- JSONEditor.Events.preventDefault(event);
- };
- /**
- * Drag event, fired when moving the mouse while dragging a Node
- * @param {Event} event
- * @private
- */
- JSONEditor.Node.prototype._onDrag = function (event) {
- event = event || window.event;
- var trThis = this.dom.tr;
- // TODO: add an ESC option, which resets to the original position
- var topThis = JSONEditor.getAbsoluteTop(trThis);
- var heightThis = trThis.offsetHeight;
- var mouseY = event.pageY || (event.clientY + document.body.scrollTop);
- if (mouseY < topThis) {
- // move up
- var trPrev = trThis.previousSibling;
- var topPrev = JSONEditor.getAbsoluteTop(trPrev);
- var nodePrev = JSONEditor.getNodeFromTarget(trPrev);
- while (trPrev && mouseY < topPrev) {
- nodePrev = JSONEditor.getNodeFromTarget(trPrev);
- trPrev = trPrev.previousSibling;
- topPrev = JSONEditor.getAbsoluteTop(trPrev);
- }
- if (nodePrev) {
- trPrev = nodePrev.dom.tr;
- topPrev = JSONEditor.getAbsoluteTop(trPrev);
- if (mouseY > topPrev + heightThis) {
- nodePrev = undefined;
- }
- }
- if (nodePrev && nodePrev.parent) {
- nodePrev.parent.moveBefore(this, nodePrev);
- }
- } else {
- // move down
- var trLast = (this.expanded && this.append) ? this.append.getDom() : this.dom.tr;
- var trFirst = trLast ? trLast.nextSibling : undefined;
- if (trFirst) {
- var topFirst = JSONEditor.getAbsoluteTop(trFirst);
- var nodeNext = undefined;
- var trNext = trFirst.nextSibling;
- var topNext = JSONEditor.getAbsoluteTop(trNext);
- var heightNext = trNext ? (topNext - topFirst) : 0;
- while (trNext && mouseY > topThis + heightNext) {
- nodeNext = JSONEditor.getNodeFromTarget(trNext);
- trNext = trNext.nextSibling;
- topNext = JSONEditor.getAbsoluteTop(trNext);
- heightNext = trNext ? (topNext - topFirst) : 0;
- }
- if (nodeNext && nodeNext.parent) {
- nodeNext.parent.moveBefore(this, nodeNext);
- }
- }
- }
- JSONEditor.Events.preventDefault(event);
- };
- /**
- * Drag event, fired on mouseup after having dragged a node
- * @param {Event} event
- * @private
- */
- JSONEditor.Node.prototype._onDragEnd = function (event) {
- event = event || window.event;
- var params = {
- 'node': this,
- 'startParent': this.drag.startParent,
- 'startIndex': this.drag.startIndex,
- 'endParent': this.parent,
- 'endIndex': this.parent.childs.indexOf(this)
- };
- if ((params.startParent != params.endParent) || (params.startIndex != params.endIndex)) {
- // only register this action if the node is actually moved to another place
- this.editor.onAction('moveNode', params);
- }
- document.body.style.cursor = this.drag.oldCursor;
- delete JSONEditor.freezeHighlight;
- delete this.drag;
- this.setHighlight(false);
- if (this.mousemove) {
- JSONEditor.Events.removeEventListener(document, 'mousemove', this.mousemove);
- delete this.mousemove;
- }
- if (this.mouseup) {
- JSONEditor.Events.removeEventListener(document, 'mouseup', this.mouseup);
- delete this.mouseup;
- }
- JSONEditor.Events.preventDefault(event);
- };
- /**
- * Create a drag area, displayed at the left side of the node
- * @return {Element | undefined} domDrag
- * @private
- */
- JSONEditor.Node.prototype._createDomDragArea = function () {
- if (!this.parent) {
- return undefined;
- }
- var domDrag = document.createElement('button');
- domDrag.className = 'jsoneditor-dragarea';
- domDrag.title = 'Move field (drag and drop)';
- return domDrag;
- };
- /**
- * Create an editable field
- * @return {Element} domField
- * @private
- */
- JSONEditor.Node.prototype._createDomField = function () {
- return document.createElement('div');
- };
- /**
- * Set highlighting for this node and all its childs.
- * Only applied to the currently visible (expanded childs)
- * @param {boolean} highlight
- */
- JSONEditor.Node.prototype.setHighlight = function (highlight) {
- if (JSONEditor.freezeHighlight) {
- return;
- }
- if (this.dom.tr) {
- this.dom.tr.className = 'jsoneditor-tr' + (highlight ? ' jsoneditor-tr-highlight' : '');
- if (this.append) {
- this.append.setHighlight(highlight);
- }
- if (this.childs) {
- this.childs.forEach(function (child) {
- child.setHighlight(highlight);
- });
- }
- }
- };
- /**
- * Update the value of the node. Only primitive types are allowed, no Object
- * or Array is allowed.
- * @param {String | Number | Boolean | null} value
- */
- JSONEditor.Node.prototype.updateValue = function (value) {
- this.value = value;
- this.updateDom();
- };
- /**
- * Update the field of the node.
- * @param {String} field
- */
- JSONEditor.Node.prototype.updateField = function (field) {
- this.field = field;
- this.updateDom();
- };
- /**
- * Update the HTML DOM, optionally recursing through the childs
- * @param {Object} [options] Available parameters:
- * {boolean} [recurse] If true, the
- * DOM of the childs will be updated recursively.
- * False by default.
- * {boolean} [updateIndexes] If true, the childs
- * indexes of the node will be updated too. False by
- * default.
- */
- JSONEditor.Node.prototype.updateDom = function (options) {
- // update level indentation
- var domTree = this.dom.tree;
- if (domTree) {
- domTree.style.marginLeft = this.getLevel() * 24 + 'px';
- }
- // update field
- var domField = this.dom.field;
- if (domField) {
- if (this.fieldEditable == true) {
- // parent is an object
- domField.contentEditable = this.editor.editable;
- domField.spellcheck = false;
- domField.className = 'jsoneditor-field';
- } else {
- // parent is an array this is the root node
- domField.className = 'jsoneditor-readonly';
- }
- var field;
- if (this.index != undefined) {
- field = this.index;
- } else if (this.field != undefined) {
- field = this.field;
- } else if (this.type == 'array' || this.type == 'object') {
- field = this.type;
- } else {
- field = 'field';
- }
- domField.innerHTML = this._escapeHTML(field);
- }
- // update value
- var domValue = this.dom.value;
- if (domValue) {
- var count = this.childs ? this.childs.length : 0;
- if (this.type == 'array') {
- domValue.innerHTML = '[' + count + ']';
- domValue.title = this.type + ' containing ' + count + ' items';
- } else if (this.type == 'object') {
- domValue.innerHTML = '{' + count + '}';
- domValue.title = this.type + ' containing ' + count + ' items';
- } else {
- domValue.innerHTML = this._escapeHTML(this.value);
- delete domValue.title;
- }
- }
- // update field and value
- this._updateDomField();
- this._updateDomValue();
- // update childs indexes
- if (options && options.updateIndexes == true) {
- // updateIndexes is true or undefined
- this._updateDomIndexes();
- }
- if (options && options.recurse == true) {
- // recurse is true or undefined. update childs recursively
- if (this.childs) {
- this.childs.forEach(function (child) {
- child.updateDom(options);
- });
- }
- // update row with append button
- if (this.append) {
- this.append.updateDom();
- }
- }
- };
- /**
- * Update the DOM of the childs of a node: update indexes and undefined field
- * names.
- * Only applicable when structure is an array or object
- * @private
- */
- JSONEditor.Node.prototype._updateDomIndexes = function () {
- var domValue = this.dom.value;
- var childs = this.childs;
- if (domValue && childs) {
- if (this.type == 'array') {
- childs.forEach(function (child, index) {
- child.index = index;
- var childField = child.dom.field;
- if (childField) {
- childField.innerHTML = index;
- }
- });
- } else if (this.type == 'object') {
- childs.forEach(function (child) {
- if (child.index != undefined) {
- delete child.index;
- if (child.field == undefined) {
- child.field = 'field';
- }
- }
- });
- }
- }
- };
- /**
- * Create an editable value
- * @private
- */
- JSONEditor.Node.prototype._createDomValue = function () {
- var domValue;
- if (this.type == 'array') {
- domValue = document.createElement('div');
- domValue.className = 'jsoneditor-readonly';
- domValue.innerHTML = '[...]';
- } else if (this.type == 'object') {
- domValue = document.createElement('div');
- domValue.className = 'jsoneditor-readonly';
- domValue.innerHTML = '{...}';
- } else if (this.type == 'string') {
- domValue = document.createElement('div');
- domValue.contentEditable = this.editor.editable;
- domValue.spellcheck = false;
- domValue.className = 'jsoneditor-value';
- domValue.innerHTML = this._escapeHTML(this.value);
- } else {
- domValue = document.createElement('div');
- domValue.contentEditable = this.editor.editable;
- domValue.spellcheck = false;
- domValue.className = 'jsoneditor-value';
- domValue.innerHTML = this._escapeHTML(this.value);
- }
- // TODO: in FF spel/check of editable divs is done via the body. quite ugly
- // document.body.spellcheck = false;
- return domValue;
- };
- /**
- * Create an expand/collapse button
- * @return {Element} expand
- * @private
- */
- JSONEditor.Node.prototype._createDomExpandButton = function () {
- // create expand button
- var expand = document.createElement('button');
- var expandable = (this.type == 'array' || this.type == 'object');
- if (expandable) {
- expand.className = this.expanded ? 'jsoneditor-expanded' : 'jsoneditor-collapsed';
- expand.title =
- 'Click to expand/collapse this field. \n' +
- 'Ctrl+Click to expand/collapse including all childs.';
- } else {
- expand.className = 'jsoneditor-invisible';
- expand.title = '';
- }
- return expand;
- };
- /**
- * Create a DOM tree element, containing the expand/collapse button
- * @param {Element} domExpand
- * @param {Element} domField
- * @param {Element} domValue
- * @return {Element} domTree
- * @private
- */
- JSONEditor.Node.prototype._createDomTree = function (domExpand, domField, domValue) {
- var dom = this.dom;
- var domTree = document.createElement('table');
- var tbody = document.createElement('tbody');
- domTree.style.borderCollapse = 'collapse'; // TODO: put in css
- domTree.appendChild(tbody);
- var tr = document.createElement('tr');
- tbody.appendChild(tr);
- // create expand button
- var tdExpand = document.createElement('td');
- tdExpand.className = 'jsoneditor-td-tree';
- tr.appendChild(tdExpand);
- tdExpand.appendChild(domExpand);
- dom.tdExpand = tdExpand;
- // add the field
- var tdField = document.createElement('td');
- tdField.className = 'jsoneditor-td-tree';
- tr.appendChild(tdField);
- tdField.appendChild(domField);
- dom.tdField = tdField;
- // add a separator
- var tdSeparator = document.createElement('td');
- tdSeparator.className = 'jsoneditor-td-tree';
- tr.appendChild(tdSeparator);
- if (this.type != 'object' && this.type != 'array') {
- tdSeparator.appendChild(document.createTextNode(':'));
- tdSeparator.className = 'jsoneditor-separator';
- }
- dom.tdSeparator = tdSeparator;
- // add the value
- var tdValue = document.createElement('td');
- tdValue.className = 'jsoneditor-td-tree';
- tr.appendChild(tdValue);
- tdValue.appendChild(domValue);
- dom.tdValue = tdValue;
- return domTree;
- };
- /**
- * Handle an event. The event is catched centrally by the editor
- * @param {Event} event
- */
- JSONEditor.Node.prototype.onEvent = function (event) {
- var type = event.type;
- var target = event.target || event.srcElement;
- var dom = this.dom;
- var node = this;
- var expandable = (this.type == 'array' || this.type == 'object');
- // value events
- var domValue = dom.value;
- if (target == domValue) {
- switch (type) {
- case 'focus':
- JSONEditor.focusNode = this;
- break;
- case 'blur':
- case 'change':
- this._getDomValue(true);
- this._updateDomValue();
- if (this.value) {
- domValue.innerHTML = this._escapeHTML(this.value);
- }
- break;
- case 'keyup':
- this._getDomValue(true);
- this._updateDomValue();
- break;
- case 'cut':
- case 'paste':
- setTimeout(function () {
- node._getDomValue(true);
- node._updateDomValue();
- }, 1);
- break;
- }
- }
- // field events
- var domField = dom.field;
- if (target == domField) {
- switch (type) {
- case 'focus':
- JSONEditor.focusNode = this;
- break;
- case 'change':
- case 'blur':
- this._getDomField(true);
- this._updateDomField();
- if (this.field) {
- domField.innerHTML = this._escapeHTML(this.field);
- }
- break;
- case 'keyup':
- this._getDomField(true);
- this._updateDomField();
- break;
- case 'cut':
- case 'paste':
- setTimeout(function () {
- node._getDomField(true);
- node._updateDomField();
- }, 1);
- break;
- }
- }
- // drag events
- var domDrag = dom.drag;
- if (target == domDrag) {
- switch (type) {
- case 'mousedown':
- this._onDragStart(event);
- break;
- case 'mouseover':
- this.setHighlight(true);
- break;
- case 'mouseout':
- this.setHighlight(false);
- break;
- }
- }
- // expand events
- var domExpand = dom.expand;
- if (target == domExpand) {
- if (type == 'click') {
- if (expandable) {
- this._onExpand(event);
- }
- }
- }
- // duplicate button
- var domDuplicate = dom.duplicate;
- if (target == domDuplicate) {
- switch (type) {
- case 'click':
- var clone = this.parent._duplicate(this);
- this.editor.onAction('duplicateNode', {
- 'node': this,
- 'clone': clone,
- 'parent': this.parent
- });
- break;
- case 'mouseover':
- this.setHighlight(true);
- break;
- case 'mouseout':
- this.setHighlight(false);
- break;
- }
- }
- // remove button
- var domRemove = dom.remove;
- if (target == domRemove) {
- switch (type) {
- case 'click':
- this._onRemove();
- break;
- case 'mouseover':
- this.setHighlight(true);
- break;
- case 'mouseout':
- this.setHighlight(false);
- break;
- }
- }
- // type button
- var domType = dom.type;
- if (target == domType) {
- switch (type) {
- case 'click':
- this._onChangeType(event);
- break;
- case 'mouseover':
- this.setHighlight(true);
- break;
- case 'mouseout':
- this.setHighlight(false);
- break;
- }
- }
- // focus
- // when clicked in whitespace left or right from the field or value, set focus
- var domTree = dom.tree;
- if (target == domTree.parentNode) {
- switch (type) {
- case 'click':
- var left = (event.offsetX != undefined) ? (event.offsetX < (this.getLevel() + 1) * 24) : (event.clientX < JSONEditor.getAbsoluteLeft(dom.tdSeparator)); // for FF
- if (left || expandable) {
- // node is expandable when it is an object or array
- if (domField) {
- JSONEditor.setEndOfContentEditable(domField);
- domField.focus();
- }
- } else {
- if (domValue) {
- JSONEditor.setEndOfContentEditable(domValue);
- domValue.focus();
- }
- }
- break;
- }
- }
- if ((target == dom.tdExpand && !expandable) || target == dom.tdField || target == dom.tdSeparator) {
- switch (type) {
- case 'click':
- if (domField) {
- JSONEditor.setEndOfContentEditable(domField);
- domField.focus();
- }
- break;
- }
- }
- };
- /**
- * Handle the expand event, when clicked on the expand button
- * @param {Event} event
- * @private
- */
- JSONEditor.Node.prototype._onExpand = function (event) {
- event = event || window.event;
- var recurse = event.ctrlKey; // with ctrl-key, expand/collapse all
- if (recurse) {
- // Take the table offline
- var table = this.dom.tr.parentNode; // TODO: not nice to access the main table like this
- var frame = table.parentNode;
- var scrollTop = frame.scrollTop;
- frame.removeChild(table);
- }
- if (this.expanded) {
- this.collapse(recurse);
- } else {
- this.expand(recurse);
- }
- if (recurse) {
- // Put the table online again
- frame.appendChild(table);
- frame.scrollTop = scrollTop;
- }
- };
- JSONEditor.Node.types = [{
- 'value': 'array',
- 'className': 'jsoneditor-option-array',
- 'title': '"array" 类型: 一个包含了有序值集合的数组.'
- }, {
- 'value': 'auto',
- 'className': 'jsoneditor-option-auto',
- 'title': '"auto" 类型: 节点类型将自动从值中获取, 可以是: string, number, boolean, 或者 null.'
- }, {
- 'value': 'object',
- 'className': 'jsoneditor-option-object',
- 'title': '"object" 类型: 对象包含了一些无序的键/值对.'
- }, {
- 'value': 'string',
- 'className': 'jsoneditor-option-string',
- 'title': '"string" 类型: 节点类型不从值中自动获取, 但永远返回 string.'
- }];
- /**
- * Create a DOM select box containing the node type
- * @return {Element} domType
- * @private
- */
- JSONEditor.Node.prototype._createDomTypeButton = function () {
- var node = this;
- var domType = document.createElement('button');
- domType.className = 'jsoneditor-type-' + node.type;
- domType.title = '改变节点类型';
- return domType;
- };
- /**
- * Remove this node
- * @private
- */
- JSONEditor.Node.prototype._onRemove = function () {
- this.setHighlight(false);
- var index = this.parent.childs.indexOf(this);
- this.parent._remove(this);
- this.editor.onAction('removeNode', {
- 'node': this,
- 'parent': this.parent,
- 'index': index
- });
- };
- /**
- * Handle a click on the Type-button
- * @param {Event} event
- * @private
- */
- JSONEditor.Node.prototype._onChangeType = function (event) {
- JSONEditor.Events.stopPropagation(event);
- var domType = this.dom.type;
- var node = this;
- var x = JSONEditor.getAbsoluteLeft(domType);
- var y = JSONEditor.getAbsoluteTop(domType) + domType.clientHeight;
- var callback = function (newType) {
- var oldType = node.type;
- node.changeType(newType);
- node.editor.onAction('changeType', {
- 'node': node,
- 'oldType': oldType,
- 'newType': newType
- });
- domType.className = 'jsoneditor-type-' + node.type;
- };
- JSONEditor.showDropDownList({
- 'x': x,
- 'y': y,
- 'node': node,
- 'value': node.type,
- 'values': JSONEditor.Node.types,
- 'className': 'jsoneditor-select',
- 'optionSelectedClassName': 'jsoneditor-option-selected',
- 'optionClassName': 'jsoneditor-option',
- 'callback': callback
- });
- };
- /**
- * Show a dropdown list
- * @param {Object} params Available parameters:
- * {Number} x The absolute horizontal position
- * {Number} y The absolute vertical position
- * {JSONEditor.Node} node node used for highlighting
- * {String} value current selected value
- * {Object[]} values the available values. Each object
- * contains a value, title, and
- * className
- * {String} optionSelectedClassName
- * {String} optionClassName
- * {function} callback Callback method, called when
- * the selected value changed.
- */
- JSONEditor.showDropDownList = function (params) {
- var select = document.createElement('div');
- select.className = params.className || '';
- select.style.position = 'absolute';
- select.style.left = (params.x || 0) + 'px';
- select.style.top = (params.y || 0) + 'px';
- params.values.forEach(function (v) {
- var text = v.value || String(v);
- var className = 'jsoneditor-option';
- var selected = (text == params.value);
- if (selected) {
- className += ' ' + params.optionSelectedClassName;
- }
- var option = document.createElement('div');
- option.className = className;
- if (v.title) {
- option.title = v.title;
- }
- var divIcon = document.createElement('div');
- divIcon.className = (v.className || '');
- option.appendChild(divIcon);
- var divText = document.createElement('div');
- divText.className = 'jsoneditor-option-text';
- divText.innerHTML = '<div>' + text + '</div>';
- option.appendChild(divText);
- option.onmousedown = (function (value) {
- return function () {
- params.callback(value);
- };
- })(v.value);
- select.appendChild(option);
- });
- document.body.appendChild(select);
- params.node.setHighlight(true);
- JSONEditor.freezeHighlight = true;
- // TODO: change to onclick? -> but be sure to remove existing dropdown first
- var onmousedown = JSONEditor.Events.addEventListener(document, 'mousedown', function () {
- JSONEditor.freezeHighlight = false;
- params.node.setHighlight(false);
- if (select && select.parentNode) {
- select.parentNode.removeChild(select);
- }
- JSONEditor.Events.removeEventListener(document, 'mousedown', onmousedown);
- });
- var onmousewheel = JSONEditor.Events.addEventListener(document, 'mousewheel', function () {
- JSONEditor.freezeHighlight = false;
- params.node.setHighlight(false);
- if (select && select.parentNode) {
- select.parentNode.removeChild(select);
- }
- JSONEditor.Events.removeEventListener(document, 'mousewheel', onmousewheel);
- });
- };
- /**
- * Create a table row with an append button.
- * @return {Element | undefined} buttonAppend or undefined when inapplicable
- */
- JSONEditor.Node.prototype.getAppend = function () {
- if (!this.append) {
- this.append = new JSONEditor.AppendNode(this.editor);
- this.append.setParent(this);
- }
- return this.append.getDom();
- };
- /**
- * Create a remove button. Returns undefined when the structure cannot
- * be removed
- * @return {Element | undefined} removeButton, or undefined when inapplicable
- * @private
- */
- JSONEditor.Node.prototype._createDomRemoveButton = function () {
- if (this.parent && (this.parent.type == 'array' || this.parent.type == 'object')) {
- var buttonRemove = document.createElement('button');
- buttonRemove.className = 'jsoneditor-remove';
- buttonRemove.title = '删除节点 (包括所有子节点)';
- return buttonRemove;
- } else {
- return undefined;
- }
- };
- /**
- * Create a duplicate button.
- * If the Node is the root node, no duplicate button is available and undefined
- * will be returned
- * @return {Element | undefined} buttonDuplicate
- * @private
- */
- JSONEditor.Node.prototype._createDomDuplicateButton = function () {
- if (this.parent && (this.parent.type == 'array' || this.parent.type == 'object')) {
- var buttonDupliate = document.createElement('button');
- buttonDupliate.className = 'jsoneditor-duplicate';
- buttonDupliate.title = '复制节点 (包括所有子节点)';
- return buttonDupliate;
- } else {
- return undefined;
- }
- };
- /**
- * get the type of a value
- * @param {*} value
- * @return {String} type Can be 'object', 'array', 'string', 'auto'
- * @private
- */
- JSONEditor.Node.prototype._getType = function (value) {
- if (value instanceof Array) {
- return 'array';
- }
- if (value instanceof Object) {
- return 'object';
- }
- if (typeof (value) == 'string' && typeof (this._stringCast(value)) != 'string') {
- return 'string';
- }
- return 'auto';
- };
- /**
- * cast contents of a string to the correct type. This can be a string,
- * a number, a boolean, etc
- * @param {String} str
- * @return {*} castedStr
- * @private
- */
- JSONEditor.Node.prototype._stringCast = function (str) {
- var lower = str.toLowerCase(),
- num = Number(str), // will nicely fail with '123ab'
- numFloat = parseFloat(str); // will nicely fail with ' '
- if (str == '') {
- return '';
- } else if (lower == 'null') {
- return null;
- } else if (lower == 'true') {
- return true;
- } else if (lower == 'false') {
- return false;
- } else if (!isNaN(num) && !isNaN(numFloat)) {
- return num;
- } else {
- return str;
- }
- };
- /**
- * escape a text, such that it can be displayed safely in an HTML element
- * @param {String} text
- * @return {String} escapedText
- * @private
- */
- JSONEditor.Node.prototype._escapeHTML = function (text) {
- var htmlEscaped = String(text)
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/ /g, ' ') // replace double space with an nbsp and space
- .replace(/^ /, ' ') // space at start
- .replace(/ $/, ' '); // space at end
- var json = JSON.stringify(htmlEscaped);
- return json.substring(1, json.length - 1);
- };
- /**
- * unescape a string.
- * @param {String} escapedText
- * @return {String} text
- * @private
- */
- JSONEditor.Node.prototype._unescapeHTML = function (escapedText) {
- var json = '"' + this._escapeJSON(escapedText) + '"';
- var htmlEscaped = JSONEditor.parse(json);
- return htmlEscaped.replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/ /g, ' ');
- };
- /**
- * escape a text to make it a valid JSON string. The method will:
- * - replace unescaped double quotes with '\"'
- * - replace unescaped backslash with '\\'
- * - replace returns with '\n'
- * @param {String} text
- * @return {String} escapedText
- * @private
- */
- JSONEditor.Node.prototype._escapeJSON = function (text) {
- // TODO: replace with some smart regex (only when a new solution is faster!)
- var escaped = '';
- var i = 0,
- iMax = text.length;
- while (i < iMax) {
- var c = text.charAt(i);
- if (c == '\n') {
- escaped += '\\n';
- } else if (c == '\\') {
- escaped += c;
- i++;
- c = text.charAt(i);
- if ('"\\/bfnrtu'.indexOf(c) == -1) {
- escaped += '\\'; // no valid escape character
- }
- escaped += c;
- } else if (c == '"') {
- escaped += '\\"';
- } else {
- escaped += c;
- }
- i++;
- }
- return escaped;
- };
- /**
- * @constructor JSONEditor.AppendNode
- * @extends JSONEditor.Node
- * @param {JSONEditor} editor
- * Create a new AppendNode. This is a special node which is created at the
- * end of the list with childs for an object or array
- */
- JSONEditor.AppendNode = function (editor) {
- this.editor = editor;
- this.dom = {};
- };
- JSONEditor.AppendNode.prototype = new JSONEditor.Node();
- /**
- * Return a table row with an append button.
- * @return {Element} dom TR element
- */
- JSONEditor.AppendNode.prototype.getDom = function () {
- if (this.dom.tr) {
- return this.dom.tr;
- }
- /**
- * Create a TD element, and give it the provided class name (if any)
- * @param {String} [className]
- * @return {Element} td
- */
- function newTd(className) {
- var td = document.createElement('td');
- td.className = className || '';
- return td;
- }
- // a row for the append button
- var trAppend = document.createElement('tr');
- trAppend.node = this;
- // TODO: do not create an appendNode at all when in viewer mode
- if (!this.editor.editable) {
- return trAppend;
- }
- // a cell for the drag area column
- trAppend.appendChild(newTd('jsoneditor-td'));
- // a cell for the append button
- var tdAppend = document.createElement('td');
- trAppend.appendChild(tdAppend);
- tdAppend.className = 'jsoneditor-td';
- // create the append button
- var buttonAppend = document.createElement('button');
- buttonAppend.className = 'jsoneditor-append';
- buttonAppend.title = '添加';
- this.dom.append = buttonAppend;
- tdAppend.appendChild(buttonAppend);
- trAppend.appendChild(newTd('jsoneditor-td jsoneditor-td-edit'));
- trAppend.appendChild(newTd('jsoneditor-td jsoneditor-td-edit'));
- trAppend.appendChild(newTd('jsoneditor-td jsoneditor-td-edit'));
- this.dom.tr = trAppend;
- this.dom.td = tdAppend;
- this.updateDom();
- return trAppend;
- };
- /**
- * Update the HTML dom of the Node
- */
- JSONEditor.AppendNode.prototype.updateDom = function () {
- var tdAppend = this.dom.td;
- if (tdAppend) {
- tdAppend.style.paddingLeft = (this.getLevel() * 24 + 26) + 'px';
- // TODO: not so nice hard coded offset
- }
- };
- /**
- * Handle an event. The event is catched centrally by the editor
- * @param {Event} event
- */
- JSONEditor.AppendNode.prototype.onEvent = function (event) {
- var type = event.type;
- var target = event.target || event.srcElement;
- var dom = this.dom;
- var domAppend = dom.append;
- if (target == domAppend) {
- switch (type) {
- case 'click':
- this._onAppend();
- break;
- case 'mouseover':
- this.parent.setHighlight(true);
- break;
- case 'mouseout':
- this.parent.setHighlight(false);
- }
- }
- };
- /**
- * Handle append event
- * @private
- */
- JSONEditor.AppendNode.prototype._onAppend = function () {
- var newNode = new JSONEditor.Node(this.editor, {
- 'field': 'field',
- 'value': 'value'
- });
- this.parent.appendChild(newNode);
- this.parent.setHighlight(false);
- newNode.focus();
- this.editor.onAction('appendNode', {
- 'node': newNode,
- 'parent': this.parent
- });
- };
- /**
- * Create main frame
- * @private
- */
- JSONEditor.prototype._createFrame = function () {
- // create the frame
- this.container.innerHTML = '';
- this.frame = document.createElement('div');
- this.frame.className = 'jsoneditor-frame';
- this.container.appendChild(this.frame);
- // create one global event listener to handle all events from all nodes
- var editor = this;
- // TODO: move this onEvent to JSONEditor.prototype.onEvent
- var onEvent = function (event) {
- event = event || window.event;
- var target = event.target || event.srcElement;
- /* TODO: Enable quickkeys Ctrl+F and F3.
- // Requires knowing whether the JSONEditor has focus or not
- // (use a global event listener for that?)
- // Check for search quickkeys, Ctrl+F and F3
- if (editor.options.search) {
- if (event.type == 'keydown') {
- var keynum = event.which || event.keyCode;
- if (keynum == 70 && event.ctrlKey) { // Ctrl+F
- if (editor.searchBox) {
- editor.searchBox.dom.search.focus();
- editor.searchBox.dom.search.select();
- JSONEditor.Events.preventDefault(event);
- JSONEditor.Events.stopPropagation(event);
- }
- }
- else if (keynum == 114) { // F3
- if (!event.shiftKey) {
- // select next search result
- editor.searchBox.next();
- }
- else {
- // select previous search result
- editor.searchBox.previous();
- }
- editor.searchBox.focusActiveResult();
- // set selection to the current
- JSONEditor.Events.preventDefault(event);
- JSONEditor.Events.stopPropagation(event);
- }
- }
- }
- */
- var node = JSONEditor.getNodeFromTarget(target);
- if (node) {
- node.onEvent(event);
- }
- };
- this.frame.onclick = function (event) {
- onEvent(event);
- // prevent default submit action when JSONEditor is located inside a form
- JSONEditor.Events.preventDefault(event);
- };
- this.frame.onchange = onEvent;
- this.frame.onkeydown = onEvent;
- this.frame.onkeyup = onEvent;
- this.frame.oncut = onEvent;
- this.frame.onpaste = onEvent;
- this.frame.onmousedown = onEvent;
- this.frame.onmouseup = onEvent;
- this.frame.onmouseover = onEvent;
- this.frame.onmouseout = onEvent;
- // Note: focus and blur events do not propagate, therefore they defined
- // using an eventListener with useCapture=true
- // see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html
- JSONEditor.Events.addEventListener(this.frame, 'focus', onEvent, true);
- JSONEditor.Events.addEventListener(this.frame, 'blur', onEvent, true);
- this.frame.onfocusin = onEvent; // for IE
- this.frame.onfocusout = onEvent; // for IE
- // create menu
- this.menu = document.createElement('div');
- this.menu.className = 'jsoneditor-menu';
- this.frame.appendChild(this.menu);
- // create expand all button
- var expandAll = document.createElement('button');
- expandAll.className = 'jsoneditor-menu jsoneditor-expand-all';
- expandAll.title = '展开';
- expandAll.onclick = function () {
- editor.expandAll();
- };
- this.menu.appendChild(expandAll);
- // create expand all button
- var collapseAll = document.createElement('button');
- collapseAll.title = '折叠';
- collapseAll.className = 'jsoneditor-menu jsoneditor-collapse-all';
- collapseAll.onclick = function () {
- editor.collapseAll();
- };
- this.menu.appendChild(collapseAll);
- // create expand/collapse buttons
- if (this.history) {
- // create separator
- var separator = document.createElement('span');
- separator.innerHTML = ' ';
- this.menu.appendChild(separator);
- // create undo button
- var undo = document.createElement('button');
- undo.className = 'jsoneditor-menu jsoneditor-undo';
- undo.title = '撤销';
- undo.onclick = function () {
- // undo last action
- editor.history.undo();
- // trigger change callback
- if (editor.options.change) {
- editor.options.change();
- }
- };
- this.menu.appendChild(undo);
- this.dom.undo = undo;
- // create redo button
- var redo = document.createElement('button');
- redo.className = 'jsoneditor-menu jsoneditor-redo';
- redo.title = '重做';
- redo.onclick = function () {
- // redo last action
- editor.history.redo();
- // trigger change callback
- if (editor.options.change) {
- editor.options.change();
- }
- };
- this.menu.appendChild(redo);
- this.dom.redo = redo;
- // register handler for onchange of history
- this.history.onChange = function () {
- undo.disabled = !editor.history.canUndo();
- redo.disabled = !editor.history.canRedo();
- };
- this.history.onChange();
- }
- // create search box
- if (this.options.search) {
- this.searchBox = new JSONEditor.SearchBox(this, this.menu);
- }
- };
- /**
- * Create main table
- * @private
- */
- JSONEditor.prototype._createTable = function () {
- var contentOuter = document.createElement('div');
- contentOuter.className = 'jsoneditor-content-outer';
- this.contentOuter = contentOuter;
- this.content = document.createElement('div');
- this.content.className = 'jsoneditor-content';
- contentOuter.appendChild(this.content);
- this.table = document.createElement('table');
- this.table.className = 'jsoneditor-table';
- this.content.appendChild(this.table);
- // IE8 does not handle overflow='auto' correctly.
- // Therefore, set overflow to 'scroll'
- var ieVersion = JSONEditor.getInternetExplorerVersion();
- if (ieVersion == 8) {
- this.content.style.overflow = 'scroll';
- }
- // create colgroup where the first two columns don't have a fixed
- // width, and the edit columns do have a fixed width
- var col;
- this.colgroupContent = document.createElement('colgroup');
- col = document.createElement('col');
- col.width = "24px";
- this.colgroupContent.appendChild(col);
- col = document.createElement('col');
- this.colgroupContent.appendChild(col);
- col = document.createElement('col');
- col.width = "24px";
- this.colgroupContent.appendChild(col);
- col = document.createElement('col');
- col.width = "24px";
- this.colgroupContent.appendChild(col);
- col = document.createElement('col');
- col.width = "24px";
- this.colgroupContent.appendChild(col);
- this.table.appendChild(this.colgroupContent);
- this.tbody = document.createElement('tbody');
- this.table.appendChild(this.tbody);
- this.frame.appendChild(contentOuter);
- };
- /**
- * Find the node from an event target
- * @param {Element} target
- * @return {JSONEditor.Node | undefined} node or undefined when not found
- */
- JSONEditor.getNodeFromTarget = function (target) {
- while (target) {
- if (target.node) {
- return target.node;
- }
- target = target.parentNode;
- }
- return undefined;
- };
- /**
- * Create a JSONFormatter and attach it to given container
- * @constructor JSONFormatter
- * @param {Element} container
- * @param {Object} [options] Object with options. available options:
- * {Number} indentation Number of indentation
- * spaces. 4 by default.
- * {function} change Callback method
- * triggered on change
- * @param {JSON | String} [json] initial contents of the formatter
- */
- JSONFormatter = function (container, options, json) {
- // check availability of JSON parser (not available in IE7 and older)
- if (!JSON) {
- throw new Error('您当前使用的浏览器不支持 JSON. \n\n' +
- '请下载安装最新版本的浏览器, 本站推荐Google Chrome.\n' +
- '(PS: 当前主流浏览器都支持JSON).');
- }
- this.container = container;
- this.indentation = 4; // number of spaces
- this.width = container.clientWidth;
- this.height = container.clientHeight;
- this.frame = document.createElement('div');
- this.frame.className = "jsoneditor-frame";
- this.frame.onclick = function (event) {
- // prevent default submit action when JSONFormatter is located inside a form
- JSONEditor.Events.preventDefault(event);
- };
- // create menu
- this.menu = document.createElement('div');
- this.menu.className = 'jsoneditor-menu';
- this.frame.appendChild(this.menu);
- // create format button
- var buttonFormat = document.createElement('button');
- //buttonFormat.innerHTML = 'Format';
- buttonFormat.className = 'jsoneditor-menu jsoneditor-format';
- buttonFormat.title = '格式化JSON数据';
- //buttonFormat.className = 'jsoneditor-button';
- this.menu.appendChild(buttonFormat);
- // create compact button
- var buttonCompact = document.createElement('button');
- //buttonCompact.innerHTML = 'Compact';
- buttonCompact.className = 'jsoneditor-menu jsoneditor-compact';
- buttonCompact.title = '压缩JSON数据, 清除所有空白字符';
- //buttonCompact.className = 'jsoneditor-button';
- this.menu.appendChild(buttonCompact);
- this.content = document.createElement('div');
- this.content.className = 'jsonformatter-content';
- this.frame.appendChild(this.content);
- this.textarea = document.createElement('textarea');
- this.textarea.className = "jsonformatter-textarea";
- this.textarea.spellcheck = false;
- this.content.appendChild(this.textarea);
- var textarea = this.textarea;
- // read the options
- if (options) {
- if (options.change) {
- // register on change event
- if (this.textarea.oninput === null) {
- this.textarea.oninput = function () {
- options.change();
- }
- } else {
- // oninput is undefined. For IE8-
- this.textarea.onchange = function () {
- options.change();
- }
- }
- }
- if (options.indentation) {
- this.indentation = Number(options.indentation);
- }
- }
- var me = this;
- buttonFormat.onclick = function () {
- try {
- var json = JSONEditor.parse(textarea.value);
- textarea.value = JSON.stringify(json, null, me.indentation);
- } catch (err) {
- me.onError(err);
- }
- };
- buttonCompact.onclick = function () {
- try {
- var json = JSONEditor.parse(textarea.value);
- textarea.value = JSON.stringify(json);
- } catch (err) {
- me.onError(err);
- }
- };
- this.container.appendChild(this.frame);
- // load initial json object or string
- if (typeof (json) == 'string') {
- this.setText(json);
- } else {
- this.set(json);
- }
- };
- /**
- * This method is executed on error.
- * It can be overwritten for each instance of the JSONFormatter
- * @param {String} err
- */
- JSONFormatter.prototype.onError = function (err) {
- // action should be implemented for the instance
- };
- /**
- * Set json data in the formatter
- * @param {Object} json
- */
- JSONFormatter.prototype.set = function (json) {
- this.textarea.value = JSON.stringify(json, null, this.indentation);
- };
- /**
- * Get json data from the formatter
- * @return {Object} json
- */
- JSONFormatter.prototype.get = function () {
- return JSONEditor.parse(this.textarea.value);
- };
- /**
- * Get the text contents of the JSONFormatter
- * @return {String} text
- */
- JSONFormatter.prototype.getText = function () {
- return this.textarea.value;
- };
- /**
- * Set the text contents of the JSONFormatter
- * @param {String} text
- */
- JSONFormatter.prototype.setText = function (text) {
- this.textarea.value = text;
- };
- /**
- * @constructor JSONEditor.SearchBox
- * Create a search box in given HTML container
- * @param {JSONEditor} editor The JSON Editor to attach to
- * @param {Element} container HTML container element of where to create the
- * search box
- */
- JSONEditor.SearchBox = function (editor, container) {
- var searchBox = this;
- this.editor = editor;
- this.timeout = undefined;
- this.delay = 200; // ms
- this.lastText = undefined;
- this.dom = {};
- this.dom.container = container;
- var table = document.createElement('table');
- this.dom.table = table;
- table.className = 'jsoneditor-search';
- container.appendChild(table);
- var tbody = document.createElement('tbody');
- this.dom.tbody = tbody;
- table.appendChild(tbody);
- var tr = document.createElement('tr');
- tbody.appendChild(tr);
- var td = document.createElement('td');
- td.className = 'jsoneditor-search';
- tr.appendChild(td);
- var results = document.createElement('div');
- this.dom.results = results;
- results.className = 'jsoneditor-search-results';
- td.appendChild(results);
- td = document.createElement('td');
- td.className = 'jsoneditor-search';
- tr.appendChild(td);
- var divInput = document.createElement('div');
- this.dom.input = divInput;
- divInput.className = 'jsoneditor-search';
- divInput.title = '查找区块和值';
- td.appendChild(divInput);
- // table to contain the text input and search button
- var tableInput = document.createElement('table');
- tableInput.className = 'jsoneditor-search-input';
- divInput.appendChild(tableInput);
- var tbodySearch = document.createElement('tbody');
- tableInput.appendChild(tbodySearch);
- tr = document.createElement('tr');
- tbodySearch.appendChild(tr);
- var refreshSearch = document.createElement('button');
- refreshSearch.className = 'jsoneditor-search-refresh';
- td = document.createElement('td');
- td.appendChild(refreshSearch);
- tr.appendChild(td);
- var search = document.createElement('input');
- this.dom.search = search;
- search.className = 'jsoneditor-search';
- search.oninput = function (event) {
- searchBox.onDelayedSearch(event);
- };
- search.onchange = function (event) { // For IE 8
- searchBox.onSearch(event);
- };
- search.onkeydown = function (event) {
- searchBox.onKeyDown(event);
- };
- search.onkeyup = function (event) {
- searchBox.onKeyUp(event);
- };
- refreshSearch.onclick = function (event) {
- search.select();
- };
- // TODO: ESC in FF restores the last input, is a FF bug, https://bugzilla.mozilla.org/show_bug.cgi?id=598819
- td = document.createElement('td');
- td.appendChild(search);
- tr.appendChild(td);
- var searchNext = document.createElement('button');
- searchNext.title = '下一个 (Enter)';
- searchNext.className = 'jsoneditor-search-next';
- searchNext.onclick = function () {
- searchBox.next();
- };
- td = document.createElement('td');
- td.appendChild(searchNext);
- tr.appendChild(td);
- var searchPrevious = document.createElement('button');
- searchPrevious.title = '上一个 (Shift+Enter)';
- searchPrevious.className = 'jsoneditor-search-previous';
- searchPrevious.onclick = function () {
- searchBox.previous();
- };
- td = document.createElement('td');
- td.appendChild(searchPrevious);
- tr.appendChild(td);
- };
- /**
- * Go to the next search result
- */
- JSONEditor.SearchBox.prototype.next = function () {
- if (this.results != undefined) {
- var index = (this.resultIndex != undefined) ? this.resultIndex + 1 : 0;
- if (index > this.results.length - 1) {
- index = 0;
- }
- this.setActiveResult(index);
- }
- };
- /**
- * Go to the prevous search result
- */
- JSONEditor.SearchBox.prototype.previous = function () {
- if (this.results != undefined) {
- var max = this.results.length - 1;
- var index = (this.resultIndex != undefined) ? this.resultIndex - 1 : max;
- if (index < 0) {
- index = max;
- }
- this.setActiveResult(index);
- }
- };
- /**
- * Set new value for the current active result
- * @param {Number} index
- */
- JSONEditor.SearchBox.prototype.setActiveResult = function (index) {
- // de-activate current active result
- if (this.activeResult) {
- var prevNode = this.activeResult.node;
- var prevElem = this.activeResult.elem;
- if (prevElem == 'field') {
- delete prevNode.searchFieldActive;
- } else {
- delete prevNode.searchValueActive;
- }
- prevNode.updateDom();
- }
- if (!this.results || !this.results[index]) {
- // out of range, set to undefined
- this.resultIndex = undefined;
- this.activeResult = undefined;
- return;
- }
- this.resultIndex = index;
- // set new node active
- var node = this.results[this.resultIndex].node;
- var elem = this.results[this.resultIndex].elem;
- if (elem == 'field') {
- node.searchFieldActive = true;
- } else {
- node.searchValueActive = true;
- }
- this.activeResult = this.results[this.resultIndex];
- node.updateDom();
- node.scrollTo();
- };
- /**
- * Set the focus to the currently active result. If there is no currently
- * active result, the next search result will get focus
- */
- JSONEditor.SearchBox.prototype.focusActiveResult = function () {
- if (!this.activeResult) {
- this.next();
- }
- if (this.activeResult) {
- this.activeResult.node.focus(this.activeResult.elem);
- }
- };
- /**
- * Cancel any running onDelayedSearch.
- */
- JSONEditor.SearchBox.prototype.clearDelay = function () {
- if (this.timeout != undefined) {
- clearTimeout(this.timeout);
- delete this.timeout;
- }
- };
- /**
- * Start a timer to execute a search after a short delay.
- * Used for reducing the number of searches while typing.
- * @param {Event} event
- */
- JSONEditor.SearchBox.prototype.onDelayedSearch = function (event) {
- // execute the search after a short delay (reduces the number of
- // search actions while typing in the search text box)
- this.clearDelay();
- var searchBox = this;
- this.timeout = setTimeout(function (event) {
- searchBox.onSearch(event);
- },
- this.delay);
- };
- /**
- * Handle onSearch event
- * @param {Event} event
- * @param {boolean} [forceSearch] If true, search will be executed again even
- * when the search text is not changed.
- * Default is false.
- */
- JSONEditor.SearchBox.prototype.onSearch = function (event, forceSearch) {
- this.clearDelay();
- var value = this.dom.search.value;
- var text = (value.length > 0) ? value : undefined;
- if (text != this.lastText || forceSearch) {
- // only search again when changed
- this.lastText = text;
- this.results = this.editor.search(text);
- this.setActiveResult(undefined);
- // display search results
- if (text != undefined) {
- var resultCount = this.results.length;
- switch (resultCount) {
- case 0:
- this.dom.results.innerHTML = '区块/值未找到';
- break;
- default:
- this.dom.results.innerHTML = '找到 ' + resultCount + ' 个结果';
- break;
- }
- } else {
- this.dom.results.innerHTML = '';
- }
- }
- };
- /**
- * Handle onKeyDown event in the input box
- * @param {Event} event
- */
- JSONEditor.SearchBox.prototype.onKeyDown = function (event) {
- event = event || window.event;
- var keynum = event.which || event.keyCode;
- if (keynum == 27) { // ESC
- this.dom.search.value = ''; // clear search
- this.onSearch(event);
- JSONEditor.Events.preventDefault(event);
- JSONEditor.Events.stopPropagation(event);
- } else if (keynum == 13) { // Enter
- if (event.ctrlKey) {
- // force to search again
- this.onSearch(event, true);
- } else if (event.shiftKey) {
- // move to the previous search result
- this.previous();
- } else {
- // move to the next search result
- this.next();
- }
- JSONEditor.Events.preventDefault(event);
- JSONEditor.Events.stopPropagation(event);
- }
- };
- /**
- * Handle onKeyUp event in the input box
- * @param {Event} event
- */
- JSONEditor.SearchBox.prototype.onKeyUp = function (event) {
- event = event || window.event;
- var keynum = event.which || event.keyCode;
- if (keynum != 27 && keynum != 13) { // !ESC and !Enter
- this.onDelayedSearch(event); // For IE 8
- }
- };
- // create namespace for event methods
- JSONEditor.Events = {};
- /**
- * Add and event listener. Works for all browsers
- * @param {Element} element An html element
- * @param {string} action The action, for example "click",
- * without the prefix "on"
- * @param {function} listener The callback function to be executed
- * @param {boolean} useCapture
- * @return {function} the created event listener
- */
- JSONEditor.Events.addEventListener = function (element, action, listener, useCapture) {
- if (element.addEventListener) {
- if (useCapture === undefined) useCapture = false;
- if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
- action = "DOMMouseScroll"; // For Firefox
- }
- element.addEventListener(action, listener, useCapture);
- return listener;
- } else {
- // IE browsers
- var f = function () {
- return listener.call(element, window.event);
- };
- element.attachEvent("on" + action, f);
- return f;
- }
- };
- /**
- * Remove an event listener from an element
- * @param {Element} element An html dom element
- * @param {string} action The name of the event, for example "mousedown"
- * @param {function} listener The listener function
- * @param {boolean} useCapture
- */
- JSONEditor.Events.removeEventListener = function (element, action, listener, useCapture) {
- if (element.removeEventListener) {
- // non-IE browsers
- if (useCapture === undefined) useCapture = false;
- if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
- action = "DOMMouseScroll"; // For Firefox
- }
- element.removeEventListener(action, listener, useCapture);
- } else {
- // IE browsers
- element.detachEvent("on" + action, listener);
- }
- };
- /**
- * Stop event propagation
- * @param {Event} event
- */
- JSONEditor.Events.stopPropagation = function (event) {
- if (!event) event = window.event;
- if (event.stopPropagation) {
- event.stopPropagation(); // non-IE browsers
- } else {
- event.cancelBubble = true; // IE browsers
- }
- };
- /**
- * Cancels the event if it is cancelable, without stopping further propagation of the event.
- * @param {Event} event
- */
- JSONEditor.Events.preventDefault = function (event) {
- if (!event) event = window.event;
- if (event.preventDefault) {
- event.preventDefault(); // non-IE browsers
- } else {
- event.returnValue = false; // IE browsers
- }
- };
- /**
- * Retrieve the absolute left value of a DOM element
- * @param {Element} elem A dom element, for example a div
- * @return {Number} left The absolute left position of this element
- * in the browser page.
- */
- JSONEditor.getAbsoluteLeft = function (elem) {
- var left = 0;
- var body = document.body;
- while (elem != null && elem != body) {
- left += elem.offsetLeft;
- left -= elem.scrollLeft;
- elem = elem.offsetParent;
- }
- return left;
- };
- /**
- * Retrieve the absolute top value of a DOM element
- * @param {Element} elem A dom element, for example a div
- * @return {Number} top The absolute top position of this element
- * in the browser page.
- */
- JSONEditor.getAbsoluteTop = function (elem) {
- var top = 0;
- var body = document.body;
- while (elem != null && elem != body) {
- top += elem.offsetTop;
- top -= elem.scrollTop;
- elem = elem.offsetParent;
- }
- return top;
- };
- /**
- * add a className to the given elements style
- * @param {Element} elem
- * @param {String} className
- */
- JSONEditor.addClassName = function (elem, className) {
- var classes = elem.className.split(' ');
- if (classes.indexOf(className) == -1) {
- classes.push(className); // add the class to the array
- elem.className = classes.join(' ');
- }
- };
- /**
- * add a className to the given elements style
- * @param {Element} elem
- * @param {String} className
- */
- JSONEditor.removeClassName = function (elem, className) {
- var classes = elem.className.split(' ');
- var index = classes.indexOf(className);
- if (index != -1) {
- classes.splice(index, 1); // remove the class from the array
- elem.className = classes.join(' ');
- }
- };
- /**
- * Strip the formatting from the contents of a div
- * the formatting from the div itself is not stripped, only from its childs.
- * @param {Element} divElement
- */
- JSONEditor.stripFormatting = function (divElement) {
- var childs = divElement.childNodes;
- for (var i = 0, iMax = childs.length; i < iMax; i++) {
- var child = childs[i];
- // remove the style
- if (child.style) {
- // TODO: test if child.attributes does contain style
- child.removeAttribute('style');
- }
- // remove all attributes
- var attributes = child.attributes;
- if (attributes) {
- for (var j = attributes.length - 1; j >= 0; j--) {
- var attribute = attributes[j];
- if (attribute.specified == true) {
- child.removeAttribute(attribute.name);
- }
- }
- }
- // recursively strip childs
- JSONEditor.stripFormatting(child);
- }
- };
- /**
- * Set focus to the end of an editable div
- * code from Nico Burns
- * http://stackoverflow.com/users/140293/nico-burns
- * http://stackoverflow.com/questions/1125292/how-to-move-cursor-to-end-of-contenteditable-entity
- * @param {Element} contentEditableElement
- */
- JSONEditor.setEndOfContentEditable = function (contentEditableElement) {
- var range, selection;
- if (document.createRange) { //Firefox, Chrome, Opera, Safari, IE 9+
- range = document.createRange(); //Create a range (a range is a like the selection but invisible)
- range.selectNodeContents(contentEditableElement); //Select the entire contents of the element with the range
- range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
- selection = window.getSelection(); //get the selection object (allows you to change selection)
- selection.removeAllRanges(); //remove any selections already made
- selection.addRange(range); //make the range you have just created the visible selection
- } else if (document.selection) { //IE 8 and lower
- range = document.body.createTextRange(); //Create a range (a range is a like the selection but invisible)
- range.moveToElementText(contentEditableElement); //Select the entire contents of the element with the range
- range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
- range.select(); //Select the range (make it the visible selection
- }
- };
- /**
- * Get the inner text of an HTML element (for example a div element)
- * @param {Element} element
- * @param {Object} [buffer]
- * @return {String} innerText
- */
- JSONEditor.getInnerText = function (element, buffer) {
- var first = (buffer == undefined);
- if (first) {
- buffer = {
- 'text': '',
- 'flush': function () {
- var text = this.text;
- this.text = '';
- return text;
- },
- 'set': function (text) {
- this.text = text;
- }
- };
- }
- // text node
- if (element.nodeValue) {
- return buffer.flush() + element.nodeValue;
- }
- // divs or other HTML elements
- if (element.hasChildNodes()) {
- var childNodes = element.childNodes;
- var innerText = '';
- for (var i = 0, iMax = childNodes.length; i < iMax; i++) {
- var child = childNodes[i];
- if (child.nodeName == 'DIV' || child.nodeName == 'P') {
- var prevChild = childNodes[i - 1];
- var prevName = prevChild ? prevChild.nodeName : undefined;
- if (prevName && prevName != 'DIV' && prevName != 'P' && prevName != 'BR') {
- innerText += '\n';
- buffer.flush();
- }
- innerText += JSONEditor.getInnerText(child, buffer);
- buffer.set('\n');
- } else if (child.nodeName == 'BR') {
- innerText += buffer.flush();
- buffer.set('\n');
- } else {
- innerText += JSONEditor.getInnerText(child, buffer);
- }
- }
- return innerText;
- } else {
- if (element.nodeName == 'P' && JSONEditor.getInternetExplorerVersion() != -1) {
- // On Internet Explorer, a <p> with hasChildNodes()==false is
- // rendered with a new line. Note that a <p> with
- // hasChildNodes()==true is rendered without a new line
- // Other browsers always ensure there is a <br> inside the <p>,
- // and if not, the <p> does not render a new line
- return buffer.flush();
- }
- }
- // br or unknown
- return '';
- };
- /**
- * Returns the version of Internet Explorer or a -1
- * (indicating the use of another browser).
- * Source: http://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx
- * @return {Number} Internet Explorer version, or -1 in case of an other browser
- */
- JSONEditor._ieVersion = undefined;
- JSONEditor.getInternetExplorerVersion = function () {
- if (JSONEditor._ieVersion == undefined) {
- var rv = -1; // Return value assumes failure.
- if (navigator.appName == 'Microsoft Internet Explorer') {
- var ua = navigator.userAgent;
- var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
- if (re.exec(ua) != null) {
- rv = parseFloat(RegExp.$1);
- }
- }
- JSONEditor._ieVersion = rv;
- }
- return JSONEditor._ieVersion;
- };
- JSONEditor.ieVersion = JSONEditor.getInternetExplorerVersion();
- /**
- * Parse JSON using the parser built-in in the browser.
- * On exception, the jsonString is validated and a detailed error is thrown.
- * @param {String} jsonString
- */
- JSONEditor.parse = function (jsonString) {
- try {
- return JSON.parse(jsonString);
- } catch (err) {
- // get a detailed error message using validate
- var message = JSONEditor.validate(jsonString) || err;
- throw new Error(message);
- }
- };
- /**
- * Validate a string containing a JSON object
- * This method uses JSONLint to validate the String. If JSONLint is not
- * available, the built-in JSON parser of the browser is used.
- * @param {String} jsonString String with an (invalid) JSON object
- * @return {String | undefined} Returns undefined when the string is valid JSON,
- * returns a string with an error message when
- * the data is invalid
- */
- JSONEditor.validate = function (jsonString) {
- var message = undefined;
- try {
- if (window.jsonlint) {
- window.jsonlint.parse(jsonString);
- } else {
- JSON.parse(jsonString);
- }
- } catch (err) {
- message = '<pre class="error">' + err.toString() + '</pre>';
- if (window.jsonlint) {
- message +=
- '<div id="by-jsonlint">由 <a class="error" href="http://zaach.github.com/jsonlint/" target="_blank">' +
- 'JSONLint' +
- '</a> 提供验证.</div>';
- }
- }
- return message;
- };
- </script>
- <script type="text/javascript">
- $("#saveAsEditorOnline").click(function () {
- var content = editor.get();
- //var blob = new Blob([content], {type: "text/plain;charset=utf-8"});
- //saveAs(blob, "content.json");
- //console.log(content);
- parent && parent.editorCall && parent.editorCall("save", content);
- });
- try {
- var json = {
- "name": "loke",
- "isGood": true,
- "links": [{
- "name": "Baidu",
- "url": "http://www.baidu.com"
- }]
- };
- // editor
- container = document.getElementById("jsoneditor");
- editor = new JSONEditor(container, {
- change: function () {
- }
- });
- editor.set(json);
- //--------------------------------------
- document.body.spellcheck = false;
- function appResize() {
- }
- }
- catch (e) {
- }
- $(function () {
- parent && parent.editorCall && parent.editorCall("init", function (json) {
- json = JSON.parse(JSON.stringify(json));
- editor.set(json);
- });
- });
- </script>
- </body>
- </html>
|