12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012 |
- (function( root, factory ) {
- var modules = {},
-
-
- _require = function( deps, callback ) {
- var args, len, i;
-
- if ( typeof deps === 'string' ) {
- return getModule( deps );
- } else {
- args = [];
- for( len = deps.length, i = 0; i < len; i++ ) {
- args.push( getModule( deps[ i ] ) );
- }
- return callback.apply( null, args );
- }
- },
-
- _define = function( id, deps, factory ) {
- if ( arguments.length === 2 ) {
- factory = deps;
- deps = null;
- }
- _require( deps || [], function() {
- setModule( id, factory, arguments );
- });
- },
-
- setModule = function( id, factory, args ) {
- var module = {
- exports: factory
- },
- returned;
- if ( typeof factory === 'function' ) {
- args.length || (args = [ _require, module.exports, module ]);
- returned = factory.apply( null, args );
- returned !== undefined && (module.exports = returned);
- }
- modules[ id ] = module.exports;
- },
-
- getModule = function( id ) {
- var module = modules[ id ] || root[ id ];
- if ( !module ) {
- throw new Error( '`' + id + '` is undefined' );
- }
- return module;
- },
-
- exportsTo = function( obj ) {
- var key, host, parts, part, last, ucFirst;
-
- ucFirst = function( str ) {
- return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
- };
- for ( key in modules ) {
- host = obj;
- if ( !modules.hasOwnProperty( key ) ) {
- continue;
- }
- parts = key.split('/');
- last = ucFirst( parts.pop() );
- while( (part = ucFirst( parts.shift() )) ) {
- host[ part ] = host[ part ] || {};
- host = host[ part ];
- }
- host[ last ] = modules[ key ];
- }
- return obj;
- },
- makeExport = function( dollar ) {
- root.__dollar = dollar;
-
- return exportsTo( factory( root, _define, _require ) );
- },
- origin;
- if ( typeof module === 'object' && typeof module.exports === 'object' ) {
-
- module.exports = makeExport();
- } else if ( typeof define === 'function' && define.amd ) {
-
-
-
-
- define([ 'jquery' ], makeExport );
- } else {
-
-
- origin = root.WebUploader;
- root.WebUploader = makeExport();
- root.WebUploader.noConflict = function() {
- root.WebUploader = origin;
- };
- }
- })( window, function( window, define, require ) {
-
- define('dollar-third',[],function() {
- var $ = window.__dollar || window.jQuery || window.Zepto;
- if ( !$ ) {
- throw new Error('jQuery or Zepto not found!');
- }
- return $;
- });
-
- define('dollar',[
- 'dollar-third'
- ], function( _ ) {
- return _;
- });
-
- define('promise-third',[
- 'dollar'
- ], function( $ ) {
- return {
- Deferred: $.Deferred,
- when: $.when,
- isPromise: function( anything ) {
- return anything && typeof anything.then === 'function';
- }
- };
- });
-
- define('promise',[
- 'promise-third'
- ], function( _ ) {
- return _;
- });
-
-
- define('base',[
- 'dollar',
- 'promise'
- ], function( $, promise ) {
- var noop = function() {},
- call = Function.call;
-
-
- function uncurryThis( fn ) {
- return function() {
- return call.apply( fn, arguments );
- };
- }
- function bindFn( fn, context ) {
- return function() {
- return fn.apply( context, arguments );
- };
- }
- function createObject( proto ) {
- var f;
- if ( Object.create ) {
- return Object.create( proto );
- } else {
- f = function() {};
- f.prototype = proto;
- return new f();
- }
- }
-
- return {
-
- version: '0.1.5',
-
- $: $,
- Deferred: promise.Deferred,
- isPromise: promise.isPromise,
- when: promise.when,
-
- browser: (function( ua ) {
- var ret = {},
- webkit = ua.match( /WebKit\/([\d.]+)/ ),
- chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
- ua.match( /CriOS\/([\d.]+)/ ),
- ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
- ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
- firefox = ua.match( /Firefox\/([\d.]+)/ ),
- safari = ua.match( /Safari\/([\d.]+)/ ),
- opera = ua.match( /OPR\/([\d.]+)/ );
- webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
- chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
- ie && (ret.ie = parseFloat( ie[ 1 ] ));
- firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
- safari && (ret.safari = parseFloat( safari[ 1 ] ));
- opera && (ret.opera = parseFloat( opera[ 1 ] ));
- return ret;
- })( navigator.userAgent ),
-
- os: (function( ua ) {
- var ret = {},
-
- android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
- ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
-
- android && (ret.android = parseFloat( android[ 1 ] ));
- ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
- return ret;
- })( navigator.userAgent ),
-
- inherits: function( Super, protos, staticProtos ) {
- var child;
- if ( typeof protos === 'function' ) {
- child = protos;
- protos = null;
- } else if ( protos && protos.hasOwnProperty('constructor') ) {
- child = protos.constructor;
- } else {
- child = function() {
- return Super.apply( this, arguments );
- };
- }
-
- $.extend( true, child, Super, staticProtos || {} );
-
-
- child.__super__ = Super.prototype;
-
-
- child.prototype = createObject( Super.prototype );
- protos && $.extend( true, child.prototype, protos );
- return child;
- },
-
- noop: noop,
-
- bindFn: bindFn,
-
- log: (function() {
- if ( window.console ) {
- return bindFn( console.log, console );
- }
- return noop;
- })(),
- nextTick: (function() {
- return function( cb ) {
- setTimeout( cb, 1 );
- };
-
-
-
-
-
-
-
-
-
- })(),
-
- slice: uncurryThis( [].slice ),
-
- guid: (function() {
- var counter = 0;
- return function( prefix ) {
- var guid = (+new Date()).toString( 32 ),
- i = 0;
- for ( ; i < 5; i++ ) {
- guid += Math.floor( Math.random() * 65535 ).toString( 32 );
- }
- return (prefix || 'wu_') + guid + (counter++).toString( 32 );
- };
- })(),
-
- formatSize: function( size, pointLength, units ) {
- var unit;
- units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
- while ( (unit = units.shift()) && size > 1024 ) {
- size = size / 1024;
- }
- return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
- unit;
- }
- };
- });
-
- define('mediator',[
- 'base'
- ], function( Base ) {
- var $ = Base.$,
- slice = [].slice,
- separator = /\s+/,
- protos;
-
- function findHandlers( arr, name, callback, context ) {
- return $.grep( arr, function( handler ) {
- return handler &&
- (!name || handler.e === name) &&
- (!callback || handler.cb === callback ||
- handler.cb._cb === callback) &&
- (!context || handler.ctx === context);
- });
- }
- function eachEvent( events, callback, iterator ) {
-
- $.each( (events || '').split( separator ), function( _, key ) {
- iterator( key, callback );
- });
- }
- function triggerHanders( events, args ) {
- var stoped = false,
- i = -1,
- len = events.length,
- handler;
- while ( ++i < len ) {
- handler = events[ i ];
- if ( handler.cb.apply( handler.ctx2, args ) === false ) {
- stoped = true;
- break;
- }
- }
- return !stoped;
- }
- protos = {
-
- on: function( name, callback, context ) {
- var me = this,
- set;
- if ( !callback ) {
- return this;
- }
- set = this._events || (this._events = []);
- eachEvent( name, callback, function( name, callback ) {
- var handler = { e: name };
- handler.cb = callback;
- handler.ctx = context;
- handler.ctx2 = context || me;
- handler.id = set.length;
- set.push( handler );
- });
- return this;
- },
-
- once: function( name, callback, context ) {
- var me = this;
- if ( !callback ) {
- return me;
- }
- eachEvent( name, callback, function( name, callback ) {
- var once = function() {
- me.off( name, once );
- return callback.apply( context || me, arguments );
- };
- once._cb = callback;
- me.on( name, once, context );
- });
- return me;
- },
-
- off: function( name, cb, ctx ) {
- var events = this._events;
- if ( !events ) {
- return this;
- }
- if ( !name && !cb && !ctx ) {
- this._events = [];
- return this;
- }
- eachEvent( name, cb, function( name, cb ) {
- $.each( findHandlers( events, name, cb, ctx ), function() {
- delete events[ this.id ];
- });
- });
- return this;
- },
-
- trigger: function( type ) {
- var args, events, allEvents;
- if ( !this._events || !type ) {
- return this;
- }
- args = slice.call( arguments, 1 );
- events = findHandlers( this._events, type );
- allEvents = findHandlers( this._events, 'all' );
- return triggerHanders( events, args ) &&
- triggerHanders( allEvents, arguments );
- }
- };
-
- return $.extend({
-
- installTo: function( obj ) {
- return $.extend( obj, protos );
- }
- }, protos );
- });
-
- define('uploader',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
- var $ = Base.$;
-
- function Uploader( opts ) {
- this.options = $.extend( true, {}, Uploader.options, opts );
- this._init( this.options );
- }
-
-
- Uploader.options = {};
- Mediator.installTo( Uploader.prototype );
-
- $.each({
- upload: 'start-upload',
- stop: 'stop-upload',
- getFile: 'get-file',
- getFiles: 'get-files',
- addFile: 'add-file',
- addFiles: 'add-file',
- sort: 'sort-files',
- removeFile: 'remove-file',
- cancelFile: 'cancel-file',
- skipFile: 'skip-file',
- retry: 'retry',
- isInProgress: 'is-in-progress',
- makeThumb: 'make-thumb',
- md5File: 'md5-file',
- getDimension: 'get-dimension',
- addButton: 'add-btn',
- predictRuntimeType: 'predict-runtime-type',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable',
- reset: 'reset'
- }, function( fn, command ) {
- Uploader.prototype[ fn ] = function() {
- return this.request( command, arguments );
- };
- });
- $.extend( Uploader.prototype, {
- state: 'pending',
- _init: function( opts ) {
- var me = this;
- me.request( 'init', opts, function() {
- me.state = 'ready';
- me.trigger('ready');
- });
- },
-
- option: function( key, val ) {
- var opts = this.options;
-
- if ( arguments.length > 1 ) {
- if ( $.isPlainObject( val ) &&
- $.isPlainObject( opts[ key ] ) ) {
- $.extend( opts[ key ], val );
- } else {
- opts[ key ] = val;
- }
- } else {
- return key ? opts[ key ] : opts;
- }
- },
-
- getStats: function() {
-
- var stats = this.request('get-stats');
- return stats ? {
- successNum: stats.numOfSuccess,
- progressNum: stats.numOfProgress,
-
-
- cancelNum: stats.numOfCancel,
- invalidNum: stats.numOfInvalid,
- uploadFailNum: stats.numOfUploadFailed,
- queueNum: stats.numOfQueue,
- interruptNum: stats.numofInterrupt
- } : {};
- },
-
- trigger: function( type ) {
- var args = [].slice.call( arguments, 1 ),
- opts = this.options,
- name = 'on' + type.substring( 0, 1 ).toUpperCase() +
- type.substring( 1 );
- if (
-
- Mediator.trigger.apply( this, arguments ) === false ||
-
- $.isFunction( opts[ name ] ) &&
- opts[ name ].apply( this, args ) === false ||
-
- $.isFunction( this[ name ] ) &&
- this[ name ].apply( this, args ) === false ||
-
- Mediator.trigger.apply( Mediator,
- [ this, type ].concat( args ) ) === false ) {
- return false;
- }
- return true;
- },
-
- destroy: function() {
- this.request( 'destroy', arguments );
- this.off();
- },
-
- request: Base.noop
- });
-
- Base.create = Uploader.create = function( opts ) {
- return new Uploader( opts );
- };
-
- Base.Uploader = Uploader;
- return Uploader;
- });
-
- define('runtime/runtime',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
- var $ = Base.$,
- factories = {},
-
- getFirstKey = function( obj ) {
- for ( var key in obj ) {
- if ( obj.hasOwnProperty( key ) ) {
- return key;
- }
- }
- return null;
- };
-
- function Runtime( options ) {
- this.options = $.extend({
- container: document.body
- }, options );
- this.uid = Base.guid('rt_');
- }
- $.extend( Runtime.prototype, {
- getContainer: function() {
- var opts = this.options,
- parent, container;
- if ( this._container ) {
- return this._container;
- }
- parent = $( opts.container || document.body );
- container = $( document.createElement('div') );
- container.attr( 'id', 'rt_' + this.uid );
- container.css({
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
- parent.append( container );
- parent.addClass('webuploader-container');
- this._container = container;
- this._parent = parent;
- return container;
- },
- init: Base.noop,
- exec: Base.noop,
- destroy: function() {
- this._container && this._container.remove();
- this._parent && this._parent.removeClass('webuploader-container');
- this.off();
- }
- });
- Runtime.orders = 'html5,flash';
-
- Runtime.addRuntime = function( type, factory ) {
- factories[ type ] = factory;
- };
- Runtime.hasRuntime = function( type ) {
- return !!(type ? factories[ type ] : getFirstKey( factories ));
- };
- Runtime.create = function( opts, orders ) {
- var type, runtime;
- orders = orders || Runtime.orders;
- $.each( orders.split( /\s*,\s*/g ), function() {
- if ( factories[ this ] ) {
- type = this;
- return false;
- }
- });
- type = type || getFirstKey( factories );
- if ( !type ) {
- throw new Error('Runtime Error');
- }
- runtime = new factories[ type ]( opts );
- return runtime;
- };
- Mediator.installTo( Runtime.prototype );
- return Runtime;
- });
-
- define('runtime/client',[
- 'base',
- 'mediator',
- 'runtime/runtime'
- ], function( Base, Mediator, Runtime ) {
- var cache;
- cache = (function() {
- var obj = {};
- return {
- add: function( runtime ) {
- obj[ runtime.uid ] = runtime;
- },
- get: function( ruid, standalone ) {
- var i;
- if ( ruid ) {
- return obj[ ruid ];
- }
- for ( i in obj ) {
-
- if ( standalone && obj[ i ].__standalone ) {
- continue;
- }
- return obj[ i ];
- }
- return null;
- },
- remove: function( runtime ) {
- delete obj[ runtime.uid ];
- }
- };
- })();
- function RuntimeClient( component, standalone ) {
- var deferred = Base.Deferred(),
- runtime;
- this.uid = Base.guid('client_');
-
- this.runtimeReady = function( cb ) {
- return deferred.done( cb );
- };
- this.connectRuntime = function( opts, cb ) {
-
- if ( runtime ) {
- throw new Error('already connected!');
- }
- deferred.done( cb );
- if ( typeof opts === 'string' && cache.get( opts ) ) {
- runtime = cache.get( opts );
- }
-
- runtime = runtime || cache.get( null, standalone );
-
- if ( !runtime ) {
- runtime = Runtime.create( opts, opts.runtimeOrder );
- runtime.__promise = deferred.promise();
- runtime.once( 'ready', deferred.resolve );
- runtime.init();
- cache.add( runtime );
- runtime.__client = 1;
- } else {
-
- Base.$.extend( runtime.options, opts );
- runtime.__promise.then( deferred.resolve );
- runtime.__client++;
- }
- standalone && (runtime.__standalone = standalone);
- return runtime;
- };
- this.getRuntime = function() {
- return runtime;
- };
- this.disconnectRuntime = function() {
- if ( !runtime ) {
- return;
- }
- runtime.__client--;
- if ( runtime.__client <= 0 ) {
- cache.remove( runtime );
- delete runtime.__promise;
- runtime.destroy();
- }
- runtime = null;
- };
- this.exec = function() {
- if ( !runtime ) {
- return;
- }
- var args = Base.slice( arguments );
- component && args.unshift( component );
- return runtime.exec.apply( this, args );
- };
- this.getRuid = function() {
- return runtime && runtime.uid;
- };
- this.destroy = (function( destroy ) {
- return function() {
- destroy && destroy.apply( this, arguments );
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- };
- })( this.destroy );
- }
- Mediator.installTo( RuntimeClient.prototype );
- return RuntimeClient;
- });
-
- define('lib/dnd',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
- var $ = Base.$;
- function DragAndDrop( opts ) {
- opts = this.options = $.extend({}, DragAndDrop.options, opts );
- opts.container = $( opts.container );
- if ( !opts.container.length ) {
- return;
- }
- RuntimeClent.call( this, 'DragAndDrop' );
- }
- DragAndDrop.options = {
- accept: null,
- disableGlobalDnd: false
- };
- Base.inherits( RuntimeClent, {
- constructor: DragAndDrop,
- init: function() {
- var me = this;
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- }
- });
- Mediator.installTo( DragAndDrop.prototype );
- return DragAndDrop;
- });
-
- define('widgets/widget',[
- 'base',
- 'uploader'
- ], function( Base, Uploader ) {
- var $ = Base.$,
- _init = Uploader.prototype._init,
- _destroy = Uploader.prototype.destroy,
- IGNORE = {},
- widgetClass = [];
- function isArrayLike( obj ) {
- if ( !obj ) {
- return false;
- }
- var length = obj.length,
- type = $.type( obj );
- if ( obj.nodeType === 1 && length ) {
- return true;
- }
- return type === 'array' || type !== 'function' && type !== 'string' &&
- (length === 0 || typeof length === 'number' && length > 0 &&
- (length - 1) in obj);
- }
- function Widget( uploader ) {
- this.owner = uploader;
- this.options = uploader.options;
- }
- $.extend( Widget.prototype, {
- init: Base.noop,
-
-
- invoke: function( apiName, args ) {
-
- var map = this.responseMap;
-
- if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
- !$.isFunction( this[ map[ apiName ] ] ) ) {
- return IGNORE;
- }
- return this[ map[ apiName ] ].apply( this, args );
- },
-
- request: function() {
- return this.owner.request.apply( this.owner, arguments );
- }
- });
-
- $.extend( Uploader.prototype, {
-
-
- _init: function() {
- var me = this,
- widgets = me._widgets = [],
- deactives = me.options.disableWidgets || '';
- $.each( widgetClass, function( _, klass ) {
- (!deactives || !~deactives.indexOf( klass._name )) &&
- widgets.push( new klass( me ) );
- });
- return _init.apply( me, arguments );
- },
- request: function( apiName, args, callback ) {
- var i = 0,
- widgets = this._widgets,
- len = widgets && widgets.length,
- rlts = [],
- dfds = [],
- widget, rlt, promise, key;
- args = isArrayLike( args ) ? args : [ args ];
- for ( ; i < len; i++ ) {
- widget = widgets[ i ];
- rlt = widget.invoke( apiName, args );
- if ( rlt !== IGNORE ) {
-
- if ( Base.isPromise( rlt ) ) {
- dfds.push( rlt );
- } else {
- rlts.push( rlt );
- }
- }
- }
-
- if ( callback || dfds.length ) {
- promise = Base.when.apply( Base, dfds );
- key = promise.pipe ? 'pipe' : 'then';
-
-
- return promise[ key ](function() {
- var deferred = Base.Deferred(),
- args = arguments;
- if ( args.length === 1 ) {
- args = args[ 0 ];
- }
- setTimeout(function() {
- deferred.resolve( args );
- }, 1 );
- return deferred.promise();
- })[ callback ? key : 'done' ]( callback || Base.noop );
- } else {
- return rlts[ 0 ];
- }
- },
- destroy: function() {
- _destroy.apply( this, arguments );
- this._widgets = null;
- }
- });
-
- Uploader.register = Widget.register = function( responseMap, widgetProto ) {
- var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
- klass;
- if ( arguments.length === 1 ) {
- widgetProto = responseMap;
-
- $.each(widgetProto, function(key) {
- if ( key[0] === '_' || key === 'name' ) {
- key === 'name' && (map.name = widgetProto.name);
- return;
- }
- map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
- });
- } else {
- map = $.extend( map, responseMap );
- }
- widgetProto.responseMap = map;
- klass = Base.inherits( Widget, widgetProto );
- klass._name = map.name;
- widgetClass.push( klass );
- return klass;
- };
-
- Uploader.unRegister = Widget.unRegister = function( name ) {
- if ( !name || name === 'anonymous' ) {
- return;
- }
-
- for ( var i = widgetClass.length; i--; ) {
- if ( widgetClass[i]._name === name ) {
- widgetClass.splice(i, 1)
- }
- }
- };
- return Widget;
- });
-
- define('widgets/filednd',[
- 'base',
- 'uploader',
- 'lib/dnd',
- 'widgets/widget'
- ], function( Base, Uploader, Dnd ) {
- var $ = Base.$;
- Uploader.options.dnd = '';
-
-
-
- return Uploader.register({
- name: 'dnd',
- init: function( opts ) {
- if ( !opts.dnd ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- disableGlobalDnd: opts.disableGlobalDnd,
- container: opts.dnd,
- accept: opts.accept
- }),
- dnd;
- this.dnd = dnd = new Dnd( options );
- dnd.once( 'ready', deferred.resolve );
- dnd.on( 'drop', function( files ) {
- me.request( 'add-file', [ files ]);
- });
-
- dnd.on( 'accept', function( items ) {
- return me.owner.trigger( 'dndAccept', items );
- });
- dnd.init();
- return deferred.promise();
- },
- destroy: function() {
- this.dnd && this.dnd.destroy();
- }
- });
- });
-
- define('lib/filepaste',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
- var $ = Base.$;
- function FilePaste( opts ) {
- opts = this.options = $.extend({}, opts );
- opts.container = $( opts.container || document.body );
- RuntimeClent.call( this, 'FilePaste' );
- }
- Base.inherits( RuntimeClent, {
- constructor: FilePaste,
- init: function() {
- var me = this;
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- }
- });
- Mediator.installTo( FilePaste.prototype );
- return FilePaste;
- });
-
- define('widgets/filepaste',[
- 'base',
- 'uploader',
- 'lib/filepaste',
- 'widgets/widget'
- ], function( Base, Uploader, FilePaste ) {
- var $ = Base.$;
-
- return Uploader.register({
- name: 'paste',
- init: function( opts ) {
- if ( !opts.paste ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- container: opts.paste,
- accept: opts.accept
- }),
- paste;
- this.paste = paste = new FilePaste( options );
- paste.once( 'ready', deferred.resolve );
- paste.on( 'paste', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- paste.init();
- return deferred.promise();
- },
- destroy: function() {
- this.paste && this.paste.destroy();
- }
- });
- });
-
- define('lib/blob',[
- 'base',
- 'runtime/client'
- ], function( Base, RuntimeClient ) {
- function Blob( ruid, source ) {
- var me = this;
- me.source = source;
- me.ruid = ruid;
- this.size = source.size || 0;
-
- if ( !source.type && this.ext &&
- ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
- this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
- } else {
- this.type = source.type || 'application/octet-stream';
- }
- RuntimeClient.call( me, 'Blob' );
- this.uid = source.uid || this.uid;
- if ( ruid ) {
- me.connectRuntime( ruid );
- }
- }
- Base.inherits( RuntimeClient, {
- constructor: Blob,
- slice: function( start, end ) {
- return this.exec( 'slice', start, end );
- },
- getSource: function() {
- return this.source;
- }
- });
- return Blob;
- });
-
- define('lib/file',[
- 'base',
- 'lib/blob'
- ], function( Base, Blob ) {
- var uid = 1,
- rExt = /\.([^.]+)$/;
- function File( ruid, file ) {
- var ext;
- this.name = file.name || ('untitled' + uid++);
- ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
-
-
- if ( !ext && file.type ) {
- ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
- RegExp.$1.toLowerCase() : '';
- this.name += '.' + ext;
- }
- this.ext = ext;
- this.lastModifiedDate = file.lastModifiedDate ||
- (new Date()).toLocaleString();
- Blob.apply( this, arguments );
- }
- return Base.inherits( Blob, File );
- });
-
- define('lib/filepicker',[
- 'base',
- 'runtime/client',
- 'lib/file'
- ], function( Base, RuntimeClent, File ) {
- var $ = Base.$;
- function FilePicker( opts ) {
- opts = this.options = $.extend({}, FilePicker.options, opts );
- opts.container = $( opts.id );
- if ( !opts.container.length ) {
- throw new Error('按钮指定错误');
- }
- opts.innerHTML = opts.innerHTML || opts.label ||
- opts.container.html() || '';
- opts.button = $( opts.button || document.createElement('div') );
- opts.button.html( opts.innerHTML );
- opts.container.html( opts.button );
- RuntimeClent.call( this, 'FilePicker', true );
- }
- FilePicker.options = {
- button: null,
- container: null,
- label: null,
- innerHTML: null,
- multiple: true,
- accept: null,
- name: 'file'
- };
- Base.inherits( RuntimeClent, {
- constructor: FilePicker,
- init: function() {
- var me = this,
- opts = me.options,
- button = opts.button;
- button.addClass('webuploader-pick');
- me.on( 'all', function( type ) {
- var files;
- switch ( type ) {
- case 'mouseenter':
- button.addClass('webuploader-pick-hover');
- break;
- case 'mouseleave':
- button.removeClass('webuploader-pick-hover');
- break;
- case 'change':
- files = me.exec('getFiles');
- me.trigger( 'select', $.map( files, function( file ) {
- file = new File( me.getRuid(), file );
-
- file._refer = opts.container;
- return file;
- }), opts.container );
- break;
- }
- });
- me.connectRuntime( opts, function() {
- me.refresh();
- me.exec( 'init', opts );
- me.trigger('ready');
- });
- this._resizeHandler = Base.bindFn( this.refresh, this );
- $( window ).on( 'resize', this._resizeHandler );
- },
- refresh: function() {
- var shimContainer = this.getRuntime().getContainer(),
- button = this.options.button,
- width = button.outerWidth ?
- button.outerWidth() : button.width(),
- height = button.outerHeight ?
- button.outerHeight() : button.height(),
- pos = button.offset();
- width && height && shimContainer.css({
- bottom: 'auto',
- right: 'auto',
- width: width + 'px',
- height: height + 'px'
- }).offset( pos );
- },
- enable: function() {
- var btn = this.options.button;
- btn.removeClass('webuploader-pick-disable');
- this.refresh();
- },
- disable: function() {
- var btn = this.options.button;
- this.getRuntime().getContainer().css({
- top: '-99999px'
- });
- btn.addClass('webuploader-pick-disable');
- },
- destroy: function() {
- var btn = this.options.button;
- $( window ).off( 'resize', this._resizeHandler );
- btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
- 'webuploader-pick');
- }
- });
- return FilePicker;
- });
-
- define('widgets/filepicker',[
- 'base',
- 'uploader',
- 'lib/filepicker',
- 'widgets/widget'
- ], function( Base, Uploader, FilePicker ) {
- var $ = Base.$;
- $.extend( Uploader.options, {
-
- pick: null,
-
- g );
- for ( i = 0, len = orders.length; i < len; i++ ) {
- if ( Runtime.hasRuntime( orders[ i ] ) ) {
- this.type = type = orders[ i ];
- break;
- }
- }
- }
- return type;
- }
- });
- });
-
- define('lib/transport',[
- 'base',
- 'runtime/client',
- 'mediator'
- ], function( Base, RuntimeClient, Mediator ) {
- var $ = Base.$;
- function Transport( opts ) {
- var me = this;
- opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
- RuntimeClient.call( this, 'Transport' );
- this._blob = null;
- this._formData = opts.formData || {};
- this._headers = opts.headers || {};
- this.on( 'progress', this._timeout );
- this.on( 'load error', function() {
- me.trigger( 'progress', 1 );
- clearTimeout( me._timer );
- });
- }
- Transport.options = {
- server: '',
- method: 'POST',
-
- withCredentials: false,
- fileVal: 'file',
- timeout: 2 * 60 * 1000,
- formData: {},
- headers: {},
- sendAsBinary: false
- };
- $.extend( Transport.prototype, {
-
- appendBlob: function( key, blob, filename ) {
- var me = this,
- opts = me.options;
- if ( me.getRuid() ) {
- me.disconnectRuntime();
- }
-
- me.connectRuntime( blob.ruid, function() {
- me.exec('init');
- });
- me._blob = blob;
- opts.fileVal = key || opts.fileVal;
- opts.filename = filename || opts.filename;
- },
-
- append: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._formData, key );
- } else {
- this._formData[ key ] = value;
- }
- },
- setRequestHeader: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._headers, key );
- } else {
- this._headers[ key ] = value;
- }
- },
- send: function( method ) {
- this.exec( 'send', method );
- this._timeout();
- },
- abort: function() {
- clearTimeout( this._timer );
- return this.exec('abort');
- },
- destroy: function() {
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- },
- getResponse: function() {
- return this.exec('getResponse');
- },
- getResponseAsJson: function() {
- return this.exec('getResponseAsJson');
- },
- getStatus: function() {
- return this.exec('getStatus');
- },
- _timeout: function() {
- var me = this,
- duration = me.options.timeout;
- if ( !duration ) {
- return;
- }
- clearTimeout( me._timer );
- me._timer = setTimeout(function() {
- me.abort();
- me.trigger( 'error', 'timeout' );
- }, duration );
- }
- });
-
- Mediator.installTo( Transport.prototype );
- return Transport;
- });
-
- define('widgets/upload',[
- 'base',
- 'uploader',
- 'file',
- 'lib/transport',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile, Transport ) {
- var $ = Base.$,
- isPromise = Base.isPromise,
- Status = WUFile.Status;
-
- $.extend( Uploader.options, {
-
- prepareNextFile: false,
-
- chunked: false,
-
- chunkSize: 5 * 1024 * 1024,
-
- chunkRetry: 2,
-
- threads: 3,
-
- formData: {}
-
-
-
- });
-
- function CuteFile( file, chunkSize ) {
- var pending = [],
- blob = file.source,
- total = blob.size,
- chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
- start = 0,
- index = 0,
- len, api;
- api = {
- file: file,
- has: function() {
- return !!pending.length;
- },
- shift: function() {
- return pending.shift();
- },
- unshift: function( block ) {
- pending.unshift( block );
- }
- };
- while ( index < chunks ) {
- len = Math.min( chunkSize, total - start );
- pending.push({
- file: file,
- start: start,
- end: chunkSize ? (start + len) : total,
- total: total,
- chunks: chunks,
- chunk: index++,
- cuted: api
- });
- start += len;
- }
- file.blocks = pending.concat();
- file.remaning = pending.length;
- return api;
- }
- Uploader.register({
- name: 'upload',
- init: function() {
- var owner = this.owner,
- me = this;
- this.runing = false;
- this.progress = false;
- owner
- .on( 'startUpload', function() {
- me.progress = true;
- })
- .on( 'uploadFinished', function() {
- me.progress = false;
- });
-
- this.pool = [];
-
- this.stack = [];
-
- this.pending = [];
-
- this.remaning = 0;
- this.__tick = Base.bindFn( this._tick, this );
- owner.on( 'uploadComplete', function( file ) {
-
- file.blocks && $.each( file.blocks, function( _, v ) {
- v.transport && (v.transport.abort(), v.transport.destroy());
- delete v.transport;
- });
- delete file.blocks;
- delete file.remaning;
- });
- },
- reset: function() {
- this.request( 'stop-upload', true );
- this.runing = false;
- this.pool = [];
- this.stack = [];
- this.pending = [];
- this.remaning = 0;
- this._trigged = false;
- this._promise = null;
- },
-
-
- startUpload: function(file) {
- var me = this;
-
- $.each( me.request( 'get-files', Status.INVALID ), function() {
- me.request( 'remove-file', this );
- });
-
- if ( file ) {
- file = file.id ? file : me.request( 'get-file', file );
- if (file.getStatus() === Status.INTERRUPT) {
- $.each( me.pool, function( _, v ) {
-
- if (v.file !== file) {
- return;
- }
- v.transport && v.transport.send();
- });
- file.setStatus( Status.QUEUED );
- } else if (file.getStatus() === Status.PROGRESS) {
- return;
- } else {
- file.setStatus( Status.QUEUED );
- }
- } else {
- $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
- this.setStatus( Status.QUEUED );
- });
- }
- if ( me.runing ) {
- return;
- }
- me.runing = true;
- var files = [];
-
- $.each( me.pool, function( _, v ) {
- var file = v.file;
- if ( file.getStatus() === Status.INTERRUPT ) {
- files.push(file);
- me._trigged = false;
- v.transport && v.transport.send();
- }
- });
- var file;
- while ( (file = files.shift()) ) {
- file.setStatus( Status.PROGRESS );
- }
- file || $.each( me.request( 'get-files',
- Status.INTERRUPT ), function() {
- this.setStatus( Status.PROGRESS );
- });
- me._trigged = false;
- Base.nextTick( me.__tick );
- me.owner.trigger('startUpload');
- },
-
-
- stopUpload: function( file, interrupt ) {
- var me = this;
- if (file === true) {
- interrupt = file;
- file = null;
- }
- if ( me.runing === false ) {
- return;
- }
-
- if ( file ) {
- file = file.id ? file : me.request( 'get-file', file );
- if ( file.getStatus() !== Status.PROGRESS &&
- file.getStatus() !== Status.QUEUED ) {
- return;
- }
- file.setStatus( Status.INTERRUPT );
- $.each( me.pool, function( _, v ) {
-
- if (v.file !== file) {
- return;
- }
- v.transport && v.transport.abort();
- me._putback(v);
- me._popBlock(v);
- });
- return Base.nextTick( me.__tick );
- }
- me.runing = false;
- if (this._promise && this._promise.file) {
- this._promise.file.setStatus( Status.INTERRUPT );
- }
- interrupt && $.each( me.pool, function( _, v ) {
- v.transport && v.transport.abort();
- v.file.setStatus( Status.INTERRUPT );
- });
- me.owner.trigger('stopUpload');
- },
-
- cancelFile: function( file ) {
- file = file.id ? file : this.request( 'get-file', file );
-
- file.blocks && $.each( file.blocks, function( _, v ) {
- var _tr = v.transport;
- if ( _tr ) {
- _tr.abort();
- _tr.destroy();
- delete v.transport;
- }
- });
- file.setStatus( Status.CANCELLED );
- this.owner.trigger( 'fileDequeued', file );
- },
-
- isInProgress: function() {
- return !!this.progress;
- },
- _getStats: function() {
- return this.request('get-stats');
- },
-
- skipFile: function( file, status ) {
- file = file.id ? file : this.request( 'get-file', file );
- file.setStatus( status || Status.COMPLETE );
- file.skipped = true;
-
- file.blocks && $.each( file.blocks, function( _, v ) {
- var _tr = v.transport;
- if ( _tr ) {
- _tr.abort();
- _tr.destroy();
- delete v.transport;
- }
- });
- this.owner.trigger( 'uploadSkip', file );
- },
-
- _tick: function() {
- var me = this,
- opts = me.options,
- fn, val;
-
- if ( me._promise ) {
- return me._promise.always( me.__tick );
- }
-
- if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
- me._trigged = false;
- fn = function( val ) {
- me._promise = null;
-
- val && val.file && me._startSend( val );
- Base.nextTick( me.__tick );
- };
- me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
-
- } else if ( !me.remaning && !me._getStats().numOfQueue &&
- !me._getStats().numofInterrupt ) {
- me.runing = false;
- me._trigged || Base.nextTick(function() {
- me.owner.trigger('uploadFinished');
- });
- me._trigged = true;
- }
- },
- _putback: function(block) {
- var idx;
- block.cuted.unshift(block);
- idx = this.stack.indexOf(block.cuted);
- if (!~idx) {
- this.stack.unshift(block.cuted);
- }
- },
- _getStack: function() {
- var i = 0,
- act;
- while ( (act = this.stack[ i++ ]) ) {
- if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
- return act;
- } else if (!act.has() ||
- act.file.getStatus() !== Status.PROGRESS &&
- act.file.getStatus() !== Status.INTERRUPT ) {
-
-
- this.stack.splice( --i, 1 );
- }
- }
- return null;
- },
- _nextBlock: function() {
- var me = this,
- opts = me.options,
- act, next, done, preparing;
-
- if ( (act = this._getStack()) ) {
-
- if ( opts.prepareNextFile && !me.pending.length ) {
- me._prepareNextFile();
- }
- return act.shift();
-
- } else if ( me.runing ) {
-
- if ( !me.pending.length && me._getStats().numOfQueue ) {
- me._prepareNextFile();
- }
- next = me.pending.shift();
- done = function( file ) {
- if ( !file ) {
- return null;
- }
- act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
- me.stack.push(act);
- return act.shift();
- };
-
- if ( isPromise( next) ) {
- preparing = next.file;
- next = next[ next.pipe ? 'pipe' : 'then' ]( done );
- next.file = preparing;
- return next;
- }
- return done( next );
- }
- },
-
- _prepareNextFile: function() {
- var me = this,
- file = me.request('fetch-file'),
- pending = me.pending,
- promise;
- if ( file ) {
- promise = me.request( 'before-send-file', file, function() {
-
- if ( file.getStatus() === Status.PROGRESS ||
- file.getStatus() === Status.INTERRUPT ) {
- return file;
- }
- return me._finishFile( file );
- });
- me.owner.trigger( 'uploadStart', file );
- file.setStatus( Status.PROGRESS );
- promise.file = file;
-
- promise.done(function() {
- var idx = $.inArray( promise, pending );
- ~idx && pending.splice( idx, 1, file );
- });
-
- promise.fail(function( reason ) {
- file.setStatus( Status.ERROR, reason );
- me.owner.trigger( 'uploadError', file, reason );
- me.owner.trigger( 'uploadComplete', file );
- });
- pending.push( promise );
- }
- },
-
- _popBlock: function( block ) {
- var idx = $.inArray( block, this.pool );
- this.pool.splice( idx, 1 );
- block.file.remaning--;
- this.remaning--;
- },
-
- _startSend: function( block ) {
- var me = this,
- file = block.file,
- promise;
-
-
-
- if ( file.getStatus() !== Status.PROGRESS ) {
-
- if (file.getStatus() === Status.INTERRUPT) {
- me._putback(block);
- }
- return;
- }
- me.pool.push( block );
- me.remaning++;
-
-
- block.blob = block.chunks === 1 ? file.source :
- file.source.slice( block.start, block.end );
-
- promise = me.request( 'before-send', block, function() {
-
- if ( file.getStatus() === Status.PROGRESS ) {
- me._doSend( block );
- } else {
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
-
- promise.fail(function() {
- if ( file.remaning === 1 ) {
- me._finishFile( file ).always(function() {
- block.percentage = 1;
- me._popBlock( block );
- me.owner.trigger( 'uploadComplete', file );
- Base.nextTick( me.__tick );
- });
- } else {
- block.percentage = 1;
- me.updateFileProgress( file );
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
- },
-
-
-
-
-
-
-
- _doSend: function( block ) {
- var me = this,
- owner = me.owner,
- opts = me.options,
- file = block.file,
- tr = new Transport( opts ),
- data = $.extend({}, opts.formData ),
- headers = $.extend({}, opts.headers ),
- requestAccept, ret;
- block.transport = tr;
- tr.on( 'destroy', function() {
- delete block.transport;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- });
-
- tr.on( 'progress', function( percentage ) {
- block.percentage = percentage;
- me.updateFileProgress( file );
- });
-
- requestAccept = function( reject ) {
- var fn;
- ret = tr.getResponseAsJson() || {};
- ret._raw = tr.getResponse();
- fn = function( value ) {
- reject = value;
- };
-
- if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
- reject = reject || 'server';
- }
- return reject;
- };
-
- tr.on( 'error', function( type, flag ) {
- block.retried = block.retried || 0;
-
- if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
- block.retried < opts.chunkRetry ) {
- block.retried++;
- tr.send();
- } else {
-
- if ( !flag && type === 'server' ) {
- type = requestAccept( type );
- }
- file.setStatus( Status.ERROR, type );
- owner.trigger( 'uploadError', file, type );
- owner.trigger( 'uploadComplete', file );
- }
- });
-
- tr.on( 'load', function() {
- var reason;
-
- if ( (reason = requestAccept()) ) {
- tr.trigger( 'error', reason, true );
- return;
- }
-
- if ( file.remaning === 1 ) {
- me._finishFile( file, ret );
- } else {
- tr.destroy();
- }
- });
-
- data = $.extend( data, {
- id: file.id,
- name: file.name,
- type: file.type,
- lastModifiedDate: file.lastModifiedDate,
- size: file.size
- });
- block.chunks > 1 && $.extend( data, {
- chunks: block.chunks,
- chunk: block.chunk
- });
-
-
- owner.trigger( 'uploadBeforeSend', block, data, headers );
-
- tr.appendBlob( opts.fileVal, block.blob, file.name );
- tr.append( data );
- tr.setRequestHeader( headers );
- tr.send();
- },
-
- _finishFile: function( file, ret, hds ) {
- var owner = this.owner;
- return owner
- .request( 'after-send-file', arguments, function() {
- file.setStatus( Status.COMPLETE );
- owner.trigger( 'uploadSuccess', file, ret, hds );
- })
- .fail(function( reason ) {
-
- if ( file.getStatus() === Status.PROGRESS ) {
- file.setStatus( Status.ERROR, reason );
- }
- owner.trigger( 'uploadError', file, reason );
- })
- .always(function() {
- owner.trigger( 'uploadComplete', file );
- });
- },
- updateFileProgress: function(file) {
- var totalPercent = 0,
- uploaded = 0;
- if (!file.blocks) {
- return;
- }
- $.each( file.blocks, function( _, v ) {
- uploaded += (v.percentage || 0) * (v.end - v.start);
- });
- totalPercent = uploaded / file.size;
- this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
- }
- });
- });
-
- define('widgets/validator',[
- 'base',
- 'uploader',
- 'file',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile ) {
- var $ = Base.$,
- validators = {},
- api;
-
-
- api = {
-
- addValidator: function( type, cb ) {
- validators[ type ] = cb;
- },
-
- removeValidator: function( type ) {
- delete validators[ type ];
- }
- };
-
- Uploader.register({
- name: 'validator',
- init: function() {
- var me = this;
- Base.nextTick(function() {
- $.each( validators, function() {
- this.call( me.owner );
- });
- });
- }
- });
-
- api.addValidator( 'fileNumLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = parseInt( opts.fileNumLimit, 10 ),
- flag = true;
- if ( !max ) {
- return;
- }
- uploader.on( 'beforeFileQueued', function( file ) {
- if ( count >= max && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
- return count >= max ? false : true;
- });
- uploader.on( 'fileQueued', function() {
- count++;
- });
- uploader.on( 'fileDequeued', function() {
- count--;
- });
- uploader.on( 'reset', function() {
- count = 0;
- });
- });
-
- api.addValidator( 'fileSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = parseInt( opts.fileSizeLimit, 10 ),
- flag = true;
- if ( !max ) {
- return;
- }
- uploader.on( 'beforeFileQueued', function( file ) {
- var invalid = count + file.size > max;
- if ( invalid && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
- return invalid ? false : true;
- });
- uploader.on( 'fileQueued', function( file ) {
- count += file.size;
- });
- uploader.on( 'fileDequeued', function( file ) {
- count -= file.size;
- });
- uploader.on( 'reset', function() {
- count = 0;
- });
- });
-
- api.addValidator( 'fileSingleSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- max = opts.fileSingleSizeLimit;
- if ( !max ) {
- return;
- }
- uploader.on( 'beforeFileQueued', function( file ) {
- if ( file.size > max ) {
- file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
- this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
- return false;
- }
- });
- });
-
- api.addValidator( 'duplicate', function() {
- var uploader = this,
- opts = uploader.options,
- mapping = {};
- if ( opts.duplicate ) {
- return;
- }
- function hashString( str ) {
- var hash = 0,
- i = 0,
- len = str.length,
- _char;
- for ( ; i < len; i++ ) {
- _char = str.charCodeAt( i );
- hash = _char + (hash << 6) + (hash << 16) - hash;
- }
- return hash;
- }
- uploader.on( 'beforeFileQueued', function( file ) {
- var hash = file.__hash || (file.__hash = hashString( file.name +
- file.size + file.lastModifiedDate ));
-
- if ( mapping[ hash ] ) {
- this.trigger( 'error', 'F_DUPLICATE', file );
- return false;
- }
- });
- uploader.on( 'fileQueued', function( file ) {
- var hash = file.__hash;
- hash && (mapping[ hash ] = true);
- });
- uploader.on( 'fileDequeued', function( file ) {
- var hash = file.__hash;
- hash && (delete mapping[ hash ]);
- });
- uploader.on( 'reset', function() {
- mapping = {};
- });
- });
- return api;
- });
-
- define('lib/md5',[
- 'runtime/client',
- 'mediator'
- ], function( RuntimeClient, Mediator ) {
- function Md5() {
- RuntimeClient.call( this, 'Md5' );
- }
-
- Mediator.installTo( Md5.prototype );
- Md5.prototype.loadFromBlob = function( blob ) {
- var me = this;
- if ( me.getRuid() ) {
- me.disconnectRuntime();
- }
-
- me.connectRuntime( blob.ruid, function() {
- me.exec('init');
- me.exec( 'loadFromBlob', blob );
- });
- };
- Md5.prototype.getResult = function() {
- return this.exec('getResult');
- };
- return Md5;
- });
-
- define('widgets/md5',[
- 'base',
- 'uploader',
- 'lib/md5',
- 'lib/blob',
- 'widgets/widget'
- ], function( Base, Uploader, Md5, Blob ) {
- return Uploader.register({
- name: 'md5',
-
- md5File: function( file, start, end ) {
- var md5 = new Md5(),
- deferred = Base.Deferred(),
- blob = (file instanceof Blob) ? file :
- this.request( 'get-file', file ).source;
- md5.on( 'progress load', function( e ) {
- e = e || {};
- deferred.notify( e.total ? e.loaded / e.total : 1 );
- });
- md5.on( 'complete', function() {
- deferred.resolve( md5.getResult() );
- });
- md5.on( 'error', function( reason ) {
- deferred.reject( reason );
- });
- if ( arguments.length > 1 ) {
- start = start || 0;
- end = end || 0;
- start < 0 && (start = blob.size + start);
- end < 0 && (end = blob.size + end);
- end = Math.min( end, blob.size );
- blob = blob.slice( start, end );
- }
- md5.loadFromBlob( blob );
- return deferred.promise();
- }
- });
- });
-
- define('runtime/compbase',[],function() {
- function CompBase( owner, runtime ) {
- this.owner = owner;
- this.options = owner.options;
- this.getRuntime = function() {
- return runtime;
- };
- this.getRuid = function() {
- return runtime.uid;
- };
- this.trigger = function() {
- return owner.trigger.apply( owner, arguments );
- };
- }
- return CompBase;
- });
-
- define('runtime/html5/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
- var type = 'html5',
- components = {};
- function Html5Runtime() {
- var pool = {},
- me = this,
- destroy = this.destroy;
- Runtime.apply( me, arguments );
- me.type = type;
-
- me.exec = function( comp, fn) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
- if ( components[ comp ] ) {
- instance = pool[ uid ] = pool[ uid ] ||
- new components[ comp ]( client, me );
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
- };
- me.destroy = function() {
-
- return destroy && destroy.apply( this, arguments );
- };
- }
- Base.inherits( Runtime, {
- constructor: Html5Runtime,
- // 不需要连接其他程序,直接执行callback
- init: function() {
- var me = this;
- setTimeout(function() {
- me.trigger('ready');
- }, 1 );
- }
- });
-
- Html5Runtime.register = function( name, component ) {
- var klass = components[ name ] = Base.inherits( CompBase, component );
- return klass;
- };
-
-
- if ( window.Blob && window.FileReader && window.DataView ) {
- Runtime.addRuntime( type, Html5Runtime );
- }
- return Html5Runtime;
- });
-
- define('runtime/html5/blob',[
- 'runtime/html5/runtime',
- 'lib/blob'
- ], function( Html5Runtime, Blob ) {
- return Html5Runtime.register( 'Blob', {
- slice: function( start, end ) {
- var blob = this.owner.source,
- slice = blob.slice || blob.webkitSlice || blob.mozSlice;
- blob = slice.call( blob, start, end );
- return new Blob( this.getRuid(), blob );
- }
- });
- });
-
- define('runtime/html5/dnd',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
- var $ = Base.$,
- prefix = 'webuploader-dnd-';
- return Html5Runtime.register( 'DragAndDrop', {
- init: function() {
- var elem = this.elem = this.options.container;
- this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
- this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
- this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
- this.dropHandler = Base.bindFn( this._dropHandler, this );
- this.dndOver = false;
- elem.on( 'dragenter', this.dragEnterHandler );
- elem.on( 'dragover', this.dragOverHandler );
- elem.on( 'dragleave', this.dragLeaveHandler );
- elem.on( 'drop', this.dropHandler );
- if ( this.options.disableGlobalDnd ) {
- $( document ).on( 'dragover', this.dragOverHandler );
- $( document ).on( 'drop', this.dropHandler );
- }
- },
- _dragEnterHandler: function( e ) {
- var me = this,
- denied = me._denied || false,
- items;
- e = e.originalEvent || e;
- if ( !me.dndOver ) {
- me.dndOver = true;
-
- items = e.dataTransfer.items;
- if ( items && items.length ) {
- me._denied = denied = !me.trigger( 'accept', items );
- }
- me.elem.addClass( prefix + 'over' );
- me.elem[ denied ? 'addClass' :
- 'removeClass' ]( prefix + 'denied' );
- }
- e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
- return false;
- },
- _dragOverHandler: function( e ) {
-
- var parentElem = this.elem.parent().get( 0 );
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
- clearTimeout( this._leaveTimer );
- this._dragEnterHandler.call( this, e );
- return false;
- },
- _dragLeaveHandler: function() {
- var me = this,
- handler;
- handler = function() {
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
- };
- clearTimeout( me._leaveTimer );
- me._leaveTimer = setTimeout( handler, 100 );
- return false;
- },
- _dropHandler: function( e ) {
- var me = this,
- ruid = me.getRuid(),
- parentElem = me.elem.parent().get( 0 ),
- dataTransfer, data;
-
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
- e = e.originalEvent || e;
- dataTransfer = e.dataTransfer;
-
-
- try {
- data = dataTransfer.getData('text/html');
- } catch( err ) {
- }
- if ( data ) {
- return;
- }
- me._getTansferFiles( dataTransfer, function( results ) {
- me.trigger( 'drop', $.map( results, function( file ) {
- return new File( ruid, file );
- }) );
- });
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over' );
- return false;
- },
-
- _getTansferFiles: function( dataTransfer, callback ) {
- var results = [],
- promises = [],
- items, files, file, item, i, len, canAccessFolder;
- items = dataTransfer.items;
- files = dataTransfer.files;
- canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
- for ( i = 0, len = files.length; i < len; i++ ) {
- file = files[ i ];
- item = items && items[ i ];
- if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
- promises.push( this._traverseDirectoryTree(
- item.webkitGetAsEntry(), results ) );
- } else {
- results.push( file );
- }
- }
- Base.when.apply( Base, promises ).done(function() {
- if ( !results.length ) {
- return;
- }
- callback( results );
- });
- },
- _traverseDirectoryTree: function( entry, results ) {
- var deferred = Base.Deferred(),
- me = this;
- if ( entry.isFile ) {
- entry.file(function( file ) {
- results.push( file );
- deferred.resolve();
- });
- } else if ( entry.isDirectory ) {
- entry.createReader().readEntries(function( entries ) {
- var len = entries.length,
- promises = [],
- arr = [],
- i;
- for ( i = 0; i < len; i++ ) {
- promises.push( me._traverseDirectoryTree(
- entries[ i ], arr ) );
- }
- Base.when.apply( Base, promises ).then(function() {
- results.push.apply( results, arr );
- deferred.resolve();
- }, deferred.reject );
- });
- }
- return deferred.promise();
- },
- destroy: function() {
- var elem = this.elem;
-
- if (!elem) {
- return;
- }
- elem.off( 'dragenter', this.dragEnterHandler );
- elem.off( 'dragover', this.dragOverHandler );
- elem.off( 'dragleave', this.dragLeaveHandler );
- elem.off( 'drop', this.dropHandler );
- if ( this.options.disableGlobalDnd ) {
- $( document ).off( 'dragover', this.dragOverHandler );
- $( document ).off( 'drop', this.dropHandler );
- }
- }
- });
- });
-
- define('runtime/html5/filepaste',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
- return Html5Runtime.register( 'FilePaste', {
- init: function() {
- var opts = this.options,
- elem = this.elem = opts.container,
- accept = '.*',
- arr, i, len, item;
-
- if ( opts.accept ) {
- arr = [];
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].mimeTypes;
- item && arr.push( item );
- }
- if ( arr.length ) {
- accept = arr.join(',');
- accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
- }
- }
- this.accept = accept = new RegExp( accept, 'i' );
- this.hander = Base.bindFn( this._pasteHander, this );
- elem.on( 'paste', this.hander );
- },
- _pasteHander: function( e ) {
- var allowed = [],
- ruid = this.getRuid(),
- items, item, blob, i, len;
- e = e.originalEvent || e;
- items = e.clipboardData.items;
- for ( i = 0, len = items.length; i < len; i++ ) {
- item = items[ i ];
- if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
- continue;
- }
- allowed.push( new File( ruid, blob ) );
- }
- if ( allowed.length ) {
-
- e.preventDefault();
- e.stopPropagation();
- this.trigger( 'paste', allowed );
- }
- },
- destroy: function() {
- this.elem.off( 'paste', this.hander );
- }
- });
- });
-
- define('runtime/html5/filepicker',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
- var $ = Base.$;
- return Html5Runtime.register( 'FilePicker', {
- init: function() {
- var container = this.getRuntime().getContainer(),
- me = this,
- owner = me.owner,
- opts = me.options,
- label = this.label = $( document.createElement('label') ),
- input = this.input = $( document.createElement('input') ),
- arr, i, len, mouseHandler;
- input.attr( 'type', 'file' );
- input.attr( 'name', opts.name );
- input.addClass('webuploader-element-invisible');
- label.on( 'click', function() {
- input.trigger('click');
- });
- label.css({
- opacity: 0,
- width: '100%',
- height: '100%',
- display: 'block',
- cursor: 'pointer',
- background: '#ffffff'
- });
- if ( opts.multiple ) {
- input.attr( 'multiple', 'multiple' );
- }
-
- if ( opts.accept && opts.accept.length > 0 ) {
- arr = [];
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- arr.push( opts.accept[ i ].mimeTypes );
- }
- input.attr( 'accept', arr.join(',') );
- }
- container.append( input );
- container.append( label );
- mouseHandler = function( e ) {
- owner.trigger( e.type );
- };
- input.on( 'change', function( e ) {
- var fn = arguments.callee,
- clone;
- me.files = e.target.files;
-
- clone = this.cloneNode( true );
- clone.value = null;
- this.parentNode.replaceChild( clone, this );
- input.off();
- input = $( clone ).on( 'change', fn )
- .on( 'mouseenter mouseleave', mouseHandler );
- owner.trigger('change');
- });
- label.on( 'mouseenter mouseleave', mouseHandler );
- },
- getFiles: function() {
- return this.files;
- },
- destroy: function() {
- this.input.off();
- this.label.off();
- }
- });
- });
-
- define('runtime/html5/util',[
- 'base'
- ], function( Base ) {
- var urlAPI = window.createObjectURL && window ||
- window.URL && URL.revokeObjectURL && URL ||
- window.webkitURL,
- createObjectURL = Base.noop,
- revokeObjectURL = createObjectURL;
- if ( urlAPI ) {
-
- createObjectURL = function() {
- return urlAPI.createObjectURL.apply( urlAPI, arguments );
- };
- revokeObjectURL = function() {
- return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
- };
- }
- return {
- createObjectURL: createObjectURL,
- revokeObjectURL: revokeObjectURL,
- dataURL2Blob: function( dataURI ) {
- var byteStr, intArray, ab, i, mimetype, parts;
- parts = dataURI.split(',');
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
- ab = new ArrayBuffer( byteStr.length );
- intArray = new Uint8Array( ab );
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
- mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
- return this.arrayBufferToBlob( ab, mimetype );
- },
- dataURL2ArrayBuffer: function( dataURI ) {
- var byteStr, intArray, i, parts;
- parts = dataURI.split(',');
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
- intArray = new Uint8Array( byteStr.length );
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
- return intArray.buffer;
- },
- arrayBufferToBlob: function( buffer, type ) {
- var builder = window.BlobBuilder || window.WebKitBlobBuilder,
- bb;
-
- if ( builder ) {
- bb = new builder();
- bb.append( buffer );
- return bb.getBlob( type );
- }
- return new Blob([ buffer ], type ? { type: type } : {} );
- },
-
-
- canvasToDataUrl: function( canvas, type, quality ) {
- return canvas.toDataURL( type, quality / 100 );
- },
-
- parseMeta: function( blob, callback ) {
- callback( false, {});
- },
-
- updateImageHead: function( data ) {
- return data;
- }
- };
- });
-
- define('runtime/html5/imagemeta',[
- 'runtime/html5/util'
- ], function( Util ) {
- var api;
- api = {
- parsers: {
- 0xffe1: []
- },
- maxMetaDataSize: 262144,
- parse: function( blob, cb ) {
- var me = this,
- fr = new FileReader();
- fr.onload = function() {
- cb( false, me._parse( this.result ) );
- fr = fr.onload = fr.onerror = null;
- };
- fr.onerror = function( e ) {
- cb( e.message );
- fr = fr.onload = fr.onerror = null;
- };
- blob = blob.slice( 0, me.maxMetaDataSize );
- fr.readAsArrayBuffer( blob.getSource() );
- },
- _parse: function( buffer, noParse ) {
- if ( buffer.byteLength < 6 ) {
- return;
- }
- var dataview = new DataView( buffer ),
- offset = 2,
- maxOffset = dataview.byteLength - 4,
- headLength = offset,
- ret = {},
- markerBytes, markerLength, parsers, i;
- if ( dataview.getUint16( 0 ) === 0xffd8 ) {
- while ( offset < maxOffset ) {
- markerBytes = dataview.getUint16( offset );
- if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
- markerBytes === 0xfffe ) {
- markerLength = dataview.getUint16( offset + 2 ) + 2;
- if ( offset + markerLength > dataview.byteLength ) {
- break;
- }
- parsers = api.parsers[ markerBytes ];
- if ( !noParse && parsers ) {
- for ( i = 0; i < parsers.length; i += 1 ) {
- parsers[ i ].call( api, dataview, offset,
- markerLength, ret );
- }
- }
- offset += markerLength;
- headLength = offset;
- } else {
- break;
- }
- }
- if ( headLength > 6 ) {
- if ( buffer.slice ) {
- ret.imageHead = buffer.slice( 2, headLength );
- } else {
-
-
- ret.imageHead = new Uint8Array( buffer )
- .subarray( 2, headLength );
- }
- }
- }
- return ret;
- },
- updateImageHead: function( buffer, head ) {
- var data = this._parse( buffer, true ),
- buf1, buf2, bodyoffset;
- bodyoffset = 2;
- if ( data.imageHead ) {
- bodyoffset = 2 + data.imageHead.byteLength;
- }
- if ( buffer.slice ) {
- buf2 = buffer.slice( bodyoffset );
- } else {
- buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
- }
- buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
- buf1[ 0 ] = 0xFF;
- buf1[ 1 ] = 0xD8;
- buf1.set( new Uint8Array( head ), 2 );
- buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
- return buf1.buffer;
- }
- };
- Util.parseMeta = function() {
- return api.parse.apply( api, arguments );
- };
- Util.updateImageHead = function() {
- return api.updateImageHead.apply( api, arguments );
- };
- return api;
- });
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- define('runtime/html5/imagemeta/exif',[
- 'base',
- 'runtime/html5/imagemeta'
- ], function( Base, ImageMeta ) {
- var EXIF = {};
- EXIF.ExifMap = function() {
- return this;
- };
- EXIF.ExifMap.prototype.map = {
- 'Orientation': 0x0112
- };
- EXIF.ExifMap.prototype.get = function( id ) {
- return this[ id ] || this[ this.map[ id ] ];
- };
- EXIF.exifTagTypes = {
-
- 1: {
- getValue: function( dataView, dataOffset ) {
- return dataView.getUint8( dataOffset );
- },
- size: 1
- },
-
- 2: {
- getValue: function( dataView, dataOffset ) {
- return String.fromCharCode( dataView.getUint8( dataOffset ) );
- },
- size: 1,
- ascii: true
- },
-
- 3: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint16( dataOffset, littleEndian );
- },
- size: 2
- },
-
- 4: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian );
- },
- size: 4
- },
-
-
- 5: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian ) /
- dataView.getUint32( dataOffset + 4, littleEndian );
- },
- size: 8
- },
-
- 9: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian );
- },
- size: 4
- },
-
- 10: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian ) /
- dataView.getInt32( dataOffset + 4, littleEndian );
- },
- size: 8
- }
- };
-
- EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
- EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
- littleEndian ) {
- var tagType = EXIF.exifTagTypes[ type ],
- tagSize, dataOffset, values, i, str, c;
- if ( !tagType ) {
- Base.log('Invalid Exif data: Invalid tag type.');
- return;
- }
- tagSize = tagType.size * length;
-
-
- dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
- littleEndian ) : (offset + 8);
- if ( dataOffset + tagSize > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid data offset.');
- return;
- }
- if ( length === 1 ) {
- return tagType.getValue( dataView, dataOffset, littleEndian );
- }
- values = [];
- for ( i = 0; i < length; i += 1 ) {
- values[ i ] = tagType.getValue( dataView,
- dataOffset + i * tagType.size, littleEndian );
- }
- if ( tagType.ascii ) {
- str = '';
-
- for ( i = 0; i < values.length; i += 1 ) {
- c = values[ i ];
-
- if ( c === '\u0000' ) {
- break;
- }
- str += c;
- }
- return str;
- }
- return values;
- };
- EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
- data ) {
- var tag = dataView.getUint16( offset, littleEndian );
- data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
- dataView.getUint16( offset + 2, littleEndian ),
- dataView.getUint32( offset + 4, littleEndian ),
- littleEndian );
- };
- EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
- littleEndian, data ) {
- var tagsNumber, dirEndOffset, i;
- if ( dirOffset + 6 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory offset.');
- return;
- }
- tagsNumber = dataView.getUint16( dirOffset, littleEndian );
- dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
- if ( dirEndOffset + 4 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory size.');
- return;
- }
- for ( i = 0; i < tagsNumber; i += 1 ) {
- this.parseExifTag( dataView, tiffOffset,
- dirOffset + 2 + 12 * i,
- littleEndian, data );
- }
-
- return dataView.getUint32( dirEndOffset, littleEndian );
- };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- EXIF.parseExifData = function( dataView, offset, length, data ) {
- var tiffOffset = offset + 10,
- littleEndian, dirOffset;
-
- if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
-
- return;
- }
- if ( tiffOffset + 8 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid segment size.');
- return;
- }
-
- if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
- Base.log('Invalid Exif data: Missing byte alignment offset.');
- return;
- }
-
- switch ( dataView.getUint16( tiffOffset ) ) {
- case 0x4949:
- littleEndian = true;
- break;
- case 0x4D4D:
- littleEndian = false;
- break;
- default:
- Base.log('Invalid Exif data: Invalid byte alignment marker.');
- return;
- }
-
- if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
- Base.log('Invalid Exif data: Missing TIFF marker.');
- return;
- }
-
- dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
-
- data.exif = new EXIF.ExifMap();
-
-
- dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
- tiffOffset + dirOffset, littleEndian, data );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- };
- ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
- return EXIF;
- });
-
- define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
-
-
- function JPEGEncoder(quality) {
- var self = this;
- var fround = Math.round;
- var ffloor = Math.floor;
- var YTable = new Array(64);
- var UVTable = new Array(64);
- var fdtbl_Y = new Array(64);
- var fdtbl_UV = new Array(64);
- var YDC_HT;
- var UVDC_HT;
- var YAC_HT;
- var UVAC_HT;
- var bitcode = new Array(65535);
- var category = new Array(65535);
- var outputfDCTQuant = new Array(64);
- var DU = new Array(64);
- var byteout = [];
- var bytenew = 0;
- var bytepos = 7;
- var YDU = new Array(64);
- var UDU = new Array(64);
- var VDU = new Array(64);
- var clt = new Array(256);
- var RGB_YUV_TABLE = new Array(2048);
- var currentQuality;
- var ZigZag = [
- 0, 1, 5, 6,14,15,27,28,
- 2, 4, 7,13,16,26,29,42,
- 3, 8,12,17,25,30,41,43,
- 9,11,18,24,31,40,44,53,
- 10,19,23,32,39,45,52,54,
- 20,22,33,38,46,51,55,60,
- 21,34,37,47,50,56,59,61,
- 35,36,48,49,57,58,62,63
- ];
- var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
- var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
- var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
- var std_ac_luminance_values = [
- 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
- 0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
- 0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
- 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
- 0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
- 0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
- 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
- 0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
- 0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
- 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
- 0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
- 0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
- 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
- 0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
- 0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
- 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
- 0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
- 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
- 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
- 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
- 0xf9,0xfa
- ];
- var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
- var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
- var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
- var std_ac_chrominance_values = [
- 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
- 0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
- 0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
- 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
- 0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
- 0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
- 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
- 0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
- 0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
- 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
- 0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
- 0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
- 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
- 0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
- 0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
- 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
- 0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
- 0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
- 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
- 0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
- 0xf9,0xfa
- ];
- function initQuantTables(sf){
- var YQT = [
- 16, 11, 10, 16, 24, 40, 51, 61,
- 12, 12, 14, 19, 26, 58, 60, 55,
- 14, 13, 16, 24, 40, 57, 69, 56,
- 14, 17, 22, 29, 51, 87, 80, 62,
- 18, 22, 37, 56, 68,109,103, 77,
- 24, 35, 55, 64, 81,104,113, 92,
- 49, 64, 78, 87,103,121,120,101,
- 72, 92, 95, 98,112,100,103, 99
- ];
- for (var i = 0; i < 64; i++) {
- var t = ffloor((YQT[i]*sf+50)/100);
- if (t < 1) {
- t = 1;
- } else if (t > 255) {
- t = 255;
- }
- YTable[ZigZag[i]] = t;
- }
- var UVQT = [
- 17, 18, 24, 47, 99, 99, 99, 99,
- 18, 21, 26, 66, 99, 99, 99, 99,
- 24, 26, 56, 99, 99, 99, 99, 99,
- 47, 66, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99
- ];
- for (var j = 0; j < 64; j++) {
- var u = ffloor((UVQT[j]*sf+50)/100);
- if (u < 1) {
- u = 1;
- } else if (u > 255) {
- u = 255;
- }
- UVTable[ZigZag[j]] = u;
- }
- var aasf = [
- 1.0, 1.387039845, 1.306562965, 1.175875602,
- 1.0, 0.785694958, 0.541196100, 0.275899379
- ];
- var k = 0;
- for (var row = 0; row < 8; row++)
- {
- for (var col = 0; col < 8; col++)
- {
- fdtbl_Y[k] = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
- fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
- k++;
- }
- }
- }
- function computeHuffmanTbl(nrcodes, std_table){
- var codevalue = 0;
- var pos_in_table = 0;
- var HT = new Array();
- for (var k = 1; k <= 16; k++) {
- for (var j = 1; j <= nrcodes[k]; j++) {
- HT[std_table[pos_in_table]] = [];
- HT[std_table[pos_in_table]][0] = codevalue;
- HT[std_table[pos_in_table]][1] = k;
- pos_in_table++;
- codevalue++;
- }
- codevalue*=2;
- }
- return HT;
- }
- function initHuffmanTbl()
- {
- YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
- UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
- YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
- UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
- }
- function initCategoryNumber()
- {
- var nrlower = 1;
- var nrupper = 2;
- for (var cat = 1; cat <= 15; cat++) {
-
- for (var nr = nrlower; nr<nrupper; nr++) {
- category[32767+nr] = cat;
- bitcode[32767+nr] = [];
- bitcode[32767+nr][1] = cat;
- bitcode[32767+nr][0] = nr;
- }
-
- for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
- category[32767+nrneg] = cat;
- bitcode[32767+nrneg] = [];
- bitcode[32767+nrneg][1] = cat;
- bitcode[32767+nrneg][0] = nrupper-1+nrneg;
- }
- nrlower <<= 1;
- nrupper <<= 1;
- }
- }
- function initRGBYUVTable() {
- for(var i = 0; i < 256;i++) {
- RGB_YUV_TABLE[i] = 19595 * i;
- RGB_YUV_TABLE[(i+ 256)>>0] = 38470 * i;
- RGB_YUV_TABLE[(i+ 512)>>0] = 7471 * i + 0x8000;
- RGB_YUV_TABLE[(i+ 768)>>0] = -11059 * i;
- RGB_YUV_TABLE[(i+1024)>>0] = -21709 * i;
- RGB_YUV_TABLE[(i+1280)>>0] = 32768 * i + 0x807FFF;
- RGB_YUV_TABLE[(i+1536)>>0] = -27439 * i;
- RGB_YUV_TABLE[(i+1792)>>0] = - 5329 * i;
- }
- }
-
- function writeBits(bs)
- {
- var value = bs[0];
- var posval = bs[1]-1;
- while ( posval >= 0 ) {
- if (value & (1 << posval) ) {
- bytenew |= (1 << bytepos);
- }
- posval--;
- bytepos--;
- if (bytepos < 0) {
- if (bytenew == 0xFF) {
- writeByte(0xFF);
- writeByte(0);
- }
- else {
- writeByte(bytenew);
- }
- bytepos=7;
- bytenew=0;
- }
- }
- }
- function writeByte(value)
- {
- byteout.push(clt[value]);
- }
- function writeWord(value)
- {
- writeByte((value>>8)&0xFF);
- writeByte((value )&0xFF);
- }
-
- function fDCTQuant(data, fdtbl)
- {
- var d0, d1, d2, d3, d4, d5, d6, d7;
-
- var dataOff=0;
- var i;
- var I8 = 8;
- var I64 = 64;
- for (i=0; i<I8; ++i)
- {
- d0 = data[dataOff];
- d1 = data[dataOff+1];
- d2 = data[dataOff+2];
- d3 = data[dataOff+3];
- d4 = data[dataOff+4];
- d5 = data[dataOff+5];
- d6 = data[dataOff+6];
- d7 = data[dataOff+7];
- var tmp0 = d0 + d7;
- var tmp7 = d0 - d7;
- var tmp1 = d1 + d6;
- var tmp6 = d1 - d6;
- var tmp2 = d2 + d5;
- var tmp5 = d2 - d5;
- var tmp3 = d3 + d4;
- var tmp4 = d3 - d4;
-
- var tmp10 = tmp0 + tmp3;
- var tmp13 = tmp0 - tmp3;
- var tmp11 = tmp1 + tmp2;
- var tmp12 = tmp1 - tmp2;
- data[dataOff] = tmp10 + tmp11;
- data[dataOff+4] = tmp10 - tmp11;
- var z1 = (tmp12 + tmp13) * 0.707106781;
- data[dataOff+2] = tmp13 + z1;
- data[dataOff+6] = tmp13 - z1;
-
- tmp10 = tmp4 + tmp5;
- tmp11 = tmp5 + tmp6;
- tmp12 = tmp6 + tmp7;
-
- var z5 = (tmp10 - tmp12) * 0.382683433;
- var z2 = 0.541196100 * tmp10 + z5;
- var z4 = 1.306562965 * tmp12 + z5;
- var z3 = tmp11 * 0.707106781;
- var z11 = tmp7 + z3;
- var z13 = tmp7 - z3;
- data[dataOff+5] = z13 + z2;
- data[dataOff+3] = z13 - z2;
- data[dataOff+1] = z11 + z4;
- data[dataOff+7] = z11 - z4;
- dataOff += 8;
- }
-
- dataOff = 0;
- for (i=0; i<I8; ++i)
- {
- d0 = data[dataOff];
- d1 = data[dataOff + 8];
- d2 = data[dataOff + 16];
- d3 = data[dataOff + 24];
- d4 = data[dataOff + 32];
- d5 = data[dataOff + 40];
- d6 = data[dataOff + 48];
- d7 = data[dataOff + 56];
- var tmp0p2 = d0 + d7;
- var tmp7p2 = d0 - d7;
- var tmp1p2 = d1 + d6;
- var tmp6p2 = d1 - d6;
- var tmp2p2 = d2 + d5;
- var tmp5p2 = d2 - d5;
- var tmp3p2 = d3 + d4;
- var tmp4p2 = d3 - d4;
-
- var tmp10p2 = tmp0p2 + tmp3p2;
- var tmp13p2 = tmp0p2 - tmp3p2;
- var tmp11p2 = tmp1p2 + tmp2p2;
- var tmp12p2 = tmp1p2 - tmp2p2;
- data[dataOff] = tmp10p2 + tmp11p2;
- data[dataOff+32] = tmp10p2 - tmp11p2;
- var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781;
- data[dataOff+16] = tmp13p2 + z1p2;
- data[dataOff+48] = tmp13p2 - z1p2;
-
- tmp10p2 = tmp4p2 + tmp5p2;
- tmp11p2 = tmp5p2 + tmp6p2;
- tmp12p2 = tmp6p2 + tmp7p2;
-
- var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433;
- var z2p2 = 0.541196100 * tmp10p2 + z5p2;
- var z4p2 = 1.306562965 * tmp12p2 + z5p2;
- var z3p2 = tmp11p2 * 0.707106781;
- var z11p2 = tmp7p2 + z3p2;
- var z13p2 = tmp7p2 - z3p2;
- data[dataOff+40] = z13p2 + z2p2;
- data[dataOff+24] = z13p2 - z2p2;
- data[dataOff+ 8] = z11p2 + z4p2;
- data[dataOff+56] = z11p2 - z4p2;
- dataOff++;
- }
-
- var fDCTQuant;
- for (i=0; i<I64; ++i)
- {
-
- fDCTQuant = data[i]*fdtbl[i];
- outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
-
- }
- return outputfDCTQuant;
- }
- function writeAPP0()
- {
- writeWord(0xFFE0);
- writeWord(16);
- writeByte(0x4A);
- writeByte(0x46);
- writeByte(0x49);
- writeByte(0x46);
- writeByte(0);
- writeByte(1);
- writeByte(1);
- writeByte(0);
- writeWord(1);
- writeWord(1);
- writeByte(0);
- writeByte(0);
- }
- function writeSOF0(width, height)
- {
- writeWord(0xFFC0);
- writeWord(17);
- writeByte(8);
- writeWord(height);
- writeWord(width);
- writeByte(3);
- writeByte(1);
- writeByte(0x11);
- writeByte(0);
- writeByte(2);
- writeByte(0x11);
- writeByte(1);
- writeByte(3);
- writeByte(0x11);
- writeByte(1);
- }
- function writeDQT()
- {
- writeWord(0xFFDB);
- writeWord(132);
- writeByte(0);
- for (var i=0; i<64; i++) {
- writeByte(YTable[i]);
- }
- writeByte(1);
- for (var j=0; j<64; j++) {
- writeByte(UVTable[j]);
- }
- }
- function writeDHT()
- {
- writeWord(0xFFC4);
- writeWord(0x01A2);
- writeByte(0);
- for (var i=0; i<16; i++) {
- writeByte(std_dc_luminance_nrcodes[i+1]);
- }
- for (var j=0; j<=11; j++) {
- writeByte(std_dc_luminance_values[j]);
- }
- writeByte(0x10);
- for (var k=0; k<16; k++) {
- writeByte(std_ac_luminance_nrcodes[k+1]);
- }
- for (var l=0; l<=161; l++) {
- writeByte(std_ac_luminance_values[l]);
- }
- writeByte(1);
- for (var m=0; m<16; m++) {
- writeByte(std_dc_chrominance_nrcodes[m+1]);
- }
- for (var n=0; n<=11; n++) {
- writeByte(std_dc_chrominance_values[n]);
- }
- writeByte(0x11);
- for (var o=0; o<16; o++) {
- writeByte(std_ac_chrominance_nrcodes[o+1]);
- }
- for (var p=0; p<=161; p++) {
- writeByte(std_ac_chrominance_values[p]);
- }
- }
- function writeSOS()
- {
- writeWord(0xFFDA);
- writeWord(12);
- writeByte(3);
- writeByte(1);
- writeByte(0);
- writeByte(2);
- writeByte(0x11);
- writeByte(3);
- writeByte(0x11);
- writeByte(0);
- writeByte(0x3f);
- writeByte(0);
- }
- function processDU(CDU, fdtbl, DC, HTDC, HTAC){
- var EOB = HTAC[0x00];
- var M16zeroes = HTAC[0xF0];
- var pos;
- var I16 = 16;
- var I63 = 63;
- var I64 = 64;
- var DU_DCT = fDCTQuant(CDU, fdtbl);
-
- for (var j=0;j<I64;++j) {
- DU[ZigZag[j]]=DU_DCT[j];
- }
- var Diff = DU[0] - DC; DC = DU[0];
-
- if (Diff==0) {
- writeBits(HTDC[0]);
- } else {
- pos = 32767+Diff;
- writeBits(HTDC[category[pos]]);
- writeBits(bitcode[pos]);
- }
-
- var end0pos = 63;
- for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
-
- if ( end0pos == 0) {
- writeBits(EOB);
- return DC;
- }
- var i = 1;
- var lng;
- while ( i <= end0pos ) {
- var startpos = i;
- for (; (DU[i]==0) && (i<=end0pos); ++i) {}
- var nrzeroes = i-startpos;
- if ( nrzeroes >= I16 ) {
- lng = nrzeroes>>4;
- for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
- writeBits(M16zeroes);
- nrzeroes = nrzeroes&0xF;
- }
- pos = 32767+DU[i];
- writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
- writeBits(bitcode[pos]);
- i++;
- }
- if ( end0pos != I63 ) {
- writeBits(EOB);
- }
- return DC;
- }
- function initCharLookupTable(){
- var sfcc = String.fromCharCode;
- for(var i=0; i < 256; i++){
- clt[i] = sfcc(i);
- }
- }
- this.encode = function(image,quality) // image data object
- {
-
- if(quality) setQuality(quality);
-
- byteout = new Array();
- bytenew=0;
- bytepos=7;
-
- writeWord(0xFFD8);
- writeAPP0();
- writeDQT();
- writeSOF0(image.width,image.height);
- writeDHT();
- writeSOS();
-
- var DCY=0;
- var DCU=0;
- var DCV=0;
- bytenew=0;
- bytepos=7;
- this.encode.displayName = "_encode_";
- var imageData = image.data;
- var width = image.width;
- var height = image.height;
- var quadWidth = width*4;
- var tripleWidth = width*3;
- var x, y = 0;
- var r, g, b;
- var start,p, col,row,pos;
- while(y < height){
- x = 0;
- while(x < quadWidth){
- start = quadWidth * y + x;
- p = start;
- col = -1;
- row = 0;
- for(pos=0; pos < 64; pos++){
- row = pos >> 3;
- col = ( pos & 7 ) * 4;
- p = start + ( row * quadWidth ) + col;
- if(y+row >= height){
- p-= (quadWidth*(y+1+row-height));
- }
- if(x+col >= quadWidth){
- p-= ((x+col) - quadWidth +4)
- }
- r = imageData[ p++ ];
- g = imageData[ p++ ];
- b = imageData[ p++ ];
-
-
- YDU[pos] = ((RGB_YUV_TABLE[r] + RGB_YUV_TABLE[(g + 256)>>0] + RGB_YUV_TABLE[(b + 512)>>0]) >> 16)-128;
- UDU[pos] = ((RGB_YUV_TABLE[(r + 768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
- VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
- }
- DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
- DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
- DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
- x+=32;
- }
- y+=8;
- }
-
-
- if ( bytepos >= 0 ) {
- var fillbits = [];
- fillbits[1] = bytepos+1;
- fillbits[0] = (1<<(bytepos+1))-1;
- writeBits(fillbits);
- }
- writeWord(0xFFD9);
- var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
- byteout = [];
-
-
-
-
- return jpegDataUri
- }
- function setQuality(quality){
- if (quality <= 0) {
- quality = 1;
- }
- if (quality > 100) {
- quality = 100;
- }
- if(currentQuality == quality) return
- var sf = 0;
- if (quality < 50) {
- sf = Math.floor(5000 / quality);
- } else {
- sf = Math.floor(200 - quality*2);
- }
- initQuantTables(sf);
- currentQuality = quality;
-
- }
- function init(){
-
- if(!quality) quality = 50;
-
- initCharLookupTable()
- initHuffmanTbl();
- initCategoryNumber();
- initRGBYUVTable();
- setQuality(quality);
-
-
- }
- init();
- };
- JPEGEncoder.encode = function( data, quality ) {
- var encoder = new JPEGEncoder( quality );
- return encoder.encode( data );
- }
- return JPEGEncoder;
- });
-
- define('runtime/html5/androidpatch',[
- 'runtime/html5/util',
- 'runtime/html5/jpegencoder',
- 'base'
- ], function( Util, encoder, Base ) {
- var origin = Util.canvasToDataUrl,
- supportJpeg;
- Util.canvasToDataUrl = function( canvas, type, quality ) {
- var ctx, w, h, fragement, parts;
-
- if ( !Base.os.android ) {
- return origin.apply( null, arguments );
- }
-
-
- if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
- fragement = origin.apply( null, arguments );
- parts = fragement.split(',');
- if ( ~parts[ 0 ].indexOf('base64') ) {
- fragement = atob( parts[ 1 ] );
- } else {
- fragement = decodeURIComponent( parts[ 1 ] );
- }
- fragement = fragement.substring( 0, 2 );
- supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
- fragement.charCodeAt( 1 ) === 216;
- }
-
- if ( type === 'image/jpeg' && !supportJpeg ) {
- w = canvas.width;
- h = canvas.height;
- ctx = canvas.getContext('2d');
- return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
- }
- return origin.apply( null, arguments );
- };
- });
-
- define('runtime/html5/image',[
- 'base',
- 'runtime/html5/runtime',
- 'runtime/html5/util'
- ], function( Base, Html5Runtime, Util ) {
- var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
- return Html5Runtime.register( 'Image', {
-
- modified: false,
- init: function() {
- var me = this,
- img = new Image();
- img.onload = function() {
- me._info = {
- type: me.type,
- width: this.width,
- height: this.height
- };
-
- if ( !me._metas && 'image/jpeg' === me.type ) {
- Util.parseMeta( me._blob, function( error, ret ) {
- me._metas = ret;
- me.owner.trigger('load');
- });
- } else {
- me.owner.trigger('load');
- }
- };
- img.onerror = function() {
- me.owner.trigger('error');
- };
- me._img = img;
- },
- loadFromBlob: function( blob ) {
- var me = this,
- img = me._img;
- me._blob = blob;
- me.type = blob.type;
- img.src = Util.createObjectURL( blob.getSource() );
- me.owner.once( 'load', function() {
- Util.revokeObjectURL( img.src );
- });
- },
- resize: function( width, height ) {
- var canvas = this._canvas ||
- (this._canvas = document.createElement('canvas'));
- this._resize( this._img, canvas, width, height );
- this._blob = null;
- this.modified = true;
- this.owner.trigger( 'complete', 'resize' );
- },
- crop: function( x, y, w, h, s ) {
- var cvs = this._canvas ||
- (this._canvas = document.createElement('canvas')),
- opts = this.options,
- img = this._img,
- iw = img.naturalWidth,
- ih = img.naturalHeight,
- orientation = this.getOrientation();
- s = s || 1;
-
-
-
-
-
-
-
-
-
-
-
-
-
- cvs.width = w;
- cvs.height = h;
- opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
- this._renderImageToCanvas( cvs, img, -x, -y, iw * s, ih * s );
- this._blob = null;
- this.modified = true;
- this.owner.trigger( 'complete', 'crop' );
- },
- getAsBlob: function( type ) {
- var blob = this._blob,
- opts = this.options,
- canvas;
- type = type || this.type;
-
- if ( this.modified || this.type !== type ) {
- canvas = this._canvas;
- if ( type === 'image/jpeg' ) {
- blob = Util.canvasToDataUrl( canvas, type, opts.quality );
- if ( opts.preserveHeaders && this._metas &&
- this._metas.imageHead ) {
- blob = Util.dataURL2ArrayBuffer( blob );
- blob = Util.updateImageHead( blob,
- this._metas.imageHead );
- blob = Util.arrayBufferToBlob( blob, type );
- return blob;
- }
- } else {
- blob = Util.canvasToDataUrl( canvas, type );
- }
- blob = Util.dataURL2Blob( blob );
- }
- return blob;
- },
- getAsDataUrl: function( type ) {
- var opts = this.options;
- type = type || this.type;
- if ( type === 'image/jpeg' ) {
- return Util.canvasToDataUrl( this._canvas, type, opts.quality );
- } else {
- return this._canvas.toDataURL( type );
- }
- },
- getOrientation: function() {
- return this._metas && this._metas.exif &&
- this._metas.exif.get('Orientation') || 1;
- },
- info: function( val ) {
-
- if ( val ) {
- this._info = val;
- return this;
- }
-
- return this._info;
- },
- meta: function( val ) {
-
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- return this._meta;
- },
- destroy: function() {
- var canvas = this._canvas;
- this._img.onload = null;
- if ( canvas ) {
- canvas.getContext('2d')
- .clearRect( 0, 0, canvas.width, canvas.height );
- canvas.width = canvas.height = 0;
- this._canvas = null;
- }
-
- this._img.src = BLANK;
- this._img = this._blob = null;
- },
- _resize: function( img, cvs, width, height ) {
- var opts = this.options,
- naturalWidth = img.width,
- naturalHeight = img.height,
- orientation = this.getOrientation(),
- scale, w, h, x, y;
-
- if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
-
- width ^= height;
- height ^= width;
- width ^= height;
- }
- scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
- height / naturalHeight );
-
- opts.allowMagnify || (scale = Math.min( 1, scale ));
- w = naturalWidth * scale;
- h = naturalHeight * scale;
- if ( opts.crop ) {
- cvs.width = width;
- cvs.height = height;
- } else {
- cvs.width = w;
- cvs.height = h;
- }
- x = (cvs.width - w) / 2;
- y = (cvs.height - h) / 2;
- opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
- this._renderImageToCanvas( cvs, img, x, y, w, h );
- },
- _rotate2Orientaion: function( canvas, orientation ) {
- var width = canvas.width,
- height = canvas.height,
- ctx = canvas.getContext('2d');
- switch ( orientation ) {
- case 5:
- case 6:
- case 7:
- case 8:
- canvas.width = height;
- canvas.height = width;
- break;
- }
- switch ( orientation ) {
- case 2:
- ctx.translate( width, 0 );
- ctx.scale( -1, 1 );
- break;
- case 3:
- ctx.translate( width, height );
- ctx.rotate( Math.PI );
- break;
- case 4:
- ctx.translate( 0, height );
- ctx.scale( 1, -1 );
- break;
- case 5:
- ctx.rotate( 0.5 * Math.PI );
- ctx.scale( 1, -1 );
- break;
- case 6:
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( 0, -height );
- break;
- case 7:
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( width, -height );
- ctx.scale( -1, 1 );
- break;
- case 8:
- ctx.rotate( -0.5 * Math.PI );
- ctx.translate( -width, 0 );
- break;
- }
- },
-
-
- _renderImageToCanvas: (function() {
-
- if ( !Base.os.ios ) {
- return function( canvas ) {
- var args = Base.slice( arguments, 1 ),
- ctx = canvas.getContext('2d');
- ctx.drawImage.apply( ctx, args );
- };
- }
-
- function detectVerticalSquash( img, iw, ih ) {
- var canvas = document.createElement('canvas'),
- ctx = canvas.getContext('2d'),
- sy = 0,
- ey = ih,
- py = ih,
- data, alpha, ratio;
- canvas.width = 1;
- canvas.height = ih;
- ctx.drawImage( img, 0, 0 );
- data = ctx.getImageData( 0, 0, 1, ih ).data;
-
-
- while ( py > sy ) {
- alpha = data[ (py - 1) * 4 + 3 ];
- if ( alpha === 0 ) {
- ey = py;
- } else {
- sy = py;
- }
- py = (ey + sy) >> 1;
- }
- ratio = (py / ih);
- return (ratio === 0) ? 1 : ratio;
- }
-
-
-
- if ( Base.os.ios >= 7 ) {
- return function( canvas, img, x, y, w, h ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- vertSquashRatio = detectVerticalSquash( img, iw, ih );
- return canvas.getContext('2d').drawImage( img, 0, 0,
- iw * vertSquashRatio, ih * vertSquashRatio,
- x, y, w, h );
- };
- }
-
- function detectSubsampling( img ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- canvas, ctx;
-
- if ( iw * ih > 1024 * 1024 ) {
- canvas = document.createElement('canvas');
- canvas.width = canvas.height = 1;
- ctx = canvas.getContext('2d');
- ctx.drawImage( img, -iw + 1, 0 );
-
-
-
-
- return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
- } else {
- return false;
- }
- }
- return function( canvas, img, x, y, width, height ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- ctx = canvas.getContext('2d'),
- subsampled = detectSubsampling( img ),
- doSquash = this.type === 'image/jpeg',
- d = 1024,
- sy = 0,
- dy = 0,
- tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
- if ( subsampled ) {
- iw /= 2;
- ih /= 2;
- }
- ctx.save();
- tmpCanvas = document.createElement('canvas');
- tmpCanvas.width = tmpCanvas.height = d;
- tmpCtx = tmpCanvas.getContext('2d');
- vertSquashRatio = doSquash ?
- detectVerticalSquash( img, iw, ih ) : 1;
- dw = Math.ceil( d * width / iw );
- dh = Math.ceil( d * height / ih / vertSquashRatio );
- while ( sy < ih ) {
- sx = 0;
- dx = 0;
- while ( sx < iw ) {
- tmpCtx.clearRect( 0, 0, d, d );
- tmpCtx.drawImage( img, -sx, -sy );
- ctx.drawImage( tmpCanvas, 0, 0, d, d,
- x + dx, y + dy, dw, dh );
- sx += d;
- dx += dw;
- }
- sy += d;
- dy += dh;
- }
- ctx.restore();
- tmpCanvas = tmpCtx = null;
- };
- })()
- });
- });
-
- define('runtime/html5/transport',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
- var noop = Base.noop,
- $ = Base.$;
- return Html5Runtime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- },
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- formData, binary, fr;
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
- binary = blob.getSource();
- } else {
- formData = new FormData();
- $.each( owner._formData, function( k, v ) {
- formData.append( k, v );
- });
- formData.append( opts.fileVal, blob.getSource(),
- opts.filename || owner._formData.name || '' );
- }
- if ( opts.withCredentials && 'withCredentials' in xhr ) {
- xhr.open( opts.method, server, true );
- xhr.withCredentials = true;
- } else {
- xhr.open( opts.method, server );
- }
- this._setRequestHeader( xhr, opts.headers );
- if ( binary ) {
-
- xhr.overrideMimeType &&
- xhr.overrideMimeType('application/octet-stream');
-
-
-
-
- if ( Base.os.android ) {
- fr = new FileReader();
- fr.onload = function() {
- xhr.send( this.result );
- fr = fr.onload = null;
- };
- fr.readAsArrayBuffer( binary );
- } else {
- xhr.send( binary );
- }
- } else {
- xhr.send( formData );
- }
- },
- getResponse: function() {
- return this._response;
- },
- getResponseAsJson: function() {
- return this._parseJson( this._response );
- },
- getStatus: function() {
- return this._status;
- },
- abort: function() {
- var xhr = this._xhr;
- if ( xhr ) {
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- xhr.abort();
- this._xhr = xhr = null;
- }
- },
- destroy: function() {
- this.abort();
- },
- _initAjax: function() {
- var me = this,
- xhr = new XMLHttpRequest(),
- opts = this.options;
- if ( opts.withCredentials && !('withCredentials' in xhr) &&
- typeof XDomainRequest !== 'undefined' ) {
- xhr = new XDomainRequest();
- }
- xhr.upload.onprogress = function( e ) {
- var percentage = 0;
- if ( e.lengthComputable ) {
- percentage = e.loaded / e.total;
- }
- return me.trigger( 'progress', percentage );
- };
- xhr.onreadystatechange = function() {
- if ( xhr.readyState !== 4 ) {
- return;
- }
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- me._xhr = null;
- me._status = xhr.status;
- if ( xhr.status >= 200 && xhr.status < 300 ) {
- me._response = xhr.responseText;
- return me.trigger('load');
- } else if ( xhr.status >= 500 && xhr.status < 600 ) {
- me._response = xhr.responseText;
- return me.trigger( 'error', 'server' );
- }
- return me.trigger( 'error', me._status ? 'http' : 'abort' );
- };
- me._xhr = xhr;
- return xhr;
- },
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.setRequestHeader( key, val );
- });
- },
- _parseJson: function( str ) {
- var json;
- try {
- json = JSON.parse( str );
- } catch ( ex ) {
- json = {};
- }
- return json;
- }
- });
- });
-
- define('runtime/html5/md5',[
- 'runtime/html5/runtime'
- ], function( FlashRuntime ) {
-
-
- var add32 = function (a, b) {
- return (a + b) & 0xFFFFFFFF;
- },
- cmn = function (q, a, b, x, s, t) {
- a = add32(add32(a, q), add32(x, t));
- return add32((a << s) | (a >>> (32 - s)), b);
- },
- ff = function (a, b, c, d, x, s, t) {
- return cmn((b & c) | ((~b) & d), a, b, x, s, t);
- },
- gg = function (a, b, c, d, x, s, t) {
- return cmn((b & d) | (c & (~d)), a, b, x, s, t);
- },
- hh = function (a, b, c, d, x, s, t) {
- return cmn(b ^ c ^ d, a, b, x, s, t);
- },
- ii = function (a, b, c, d, x, s, t) {
- return cmn(c ^ (b | (~d)), a, b, x, s, t);
- },
- md5cycle = function (x, k) {
- var a = x[0],
- b = x[1],
- c = x[2],
- d = x[3];
- a = ff(a, b, c, d, k[0], 7, -680876936);
- d = ff(d, a, b, c, k[1], 12, -389564586);
- c = ff(c, d, a, b, k[2], 17, 606105819);
- b = ff(b, c, d, a, k[3], 22, -1044525330);
- a = ff(a, b, c, d, k[4], 7, -176418897);
- d = ff(d, a, b, c, k[5], 12, 1200080426);
- c = ff(c, d, a, b, k[6], 17, -1473231341);
- b = ff(b, c, d, a, k[7], 22, -45705983);
- a = ff(a, b, c, d, k[8], 7, 1770035416);
- d = ff(d, a, b, c, k[9], 12, -1958414417);
- c = ff(c, d, a, b, k[10], 17, -42063);
- b = ff(b, c, d, a, k[11], 22, -1990404162);
- a = ff(a, b, c, d, k[12], 7, 1804603682);
- d = ff(d, a, b, c, k[13], 12, -40341101);
- c = ff(c, d, a, b, k[14], 17, -1502002290);
- b = ff(b, c, d, a, k[15], 22, 1236535329);
- a = gg(a, b, c, d, k[1], 5, -165796510);
- d = gg(d, a, b, c, k[6], 9, -1069501632);
- c = gg(c, d, a, b, k[11], 14, 643717713);
- b = gg(b, c, d, a, k[0], 20, -373897302);
- a = gg(a, b, c, d, k[5], 5, -701558691);
- d = gg(d, a, b, c, k[10], 9, 38016083);
- c = gg(c, d, a, b, k[15], 14, -660478335);
- b = gg(b, c, d, a, k[4], 20, -405537848);
- a = gg(a, b, c, d, k[9], 5, 568446438);
- d = gg(d, a, b, c, k[14], 9, -1019803690);
- c = gg(c, d, a, b, k[3], 14, -187363961);
- b = gg(b, c, d, a, k[8], 20, 1163531501);
- a = gg(a, b, c, d, k[13], 5, -1444681467);
- d = gg(d, a, b, c, k[2], 9, -51403784);
- c = gg(c, d, a, b, k[7], 14, 1735328473);
- b = gg(b, c, d, a, k[12], 20, -1926607734);
- a = hh(a, b, c, d, k[5], 4, -378558);
- d = hh(d, a, b, c, k[8], 11, -2022574463);
- c = hh(c, d, a, b, k[11], 16, 1839030562);
- b = hh(b, c, d, a, k[14], 23, -35309556);
- a = hh(a, b, c, d, k[1], 4, -1530992060);
- d = hh(d, a, b, c, k[4], 11, 1272893353);
- c = hh(c, d, a, b, k[7], 16, -155497632);
- b = hh(b, c, d, a, k[10], 23, -1094730640);
- a = hh(a, b, c, d, k[13], 4, 681279174);
- d = hh(d, a, b, c, k[0], 11, -358537222);
- c = hh(c, d, a, b, k[3], 16, -722521979);
- b = hh(b, c, d, a, k[6], 23, 76029189);
- a = hh(a, b, c, d, k[9], 4, -640364487);
- d = hh(d, a, b, c, k[12], 11, -421815835);
- c = hh(c, d, a, b, k[15], 16, 530742520);
- b = hh(b, c, d, a, k[2], 23, -995338651);
- a = ii(a, b, c, d, k[0], 6, -198630844);
- d = ii(d, a, b, c, k[7], 10, 1126891415);
- c = ii(c, d, a, b, k[14], 15, -1416354905);
- b = ii(b, c, d, a, k[5], 21, -57434055);
- a = ii(a, b, c, d, k[12], 6, 1700485571);
- d = ii(d, a, b, c, k[3], 10, -1894986606);
- c = ii(c, d, a, b, k[10], 15, -1051523);
- b = ii(b, c, d, a, k[1], 21, -2054922799);
- a = ii(a, b, c, d, k[8], 6, 1873313359);
- d = ii(d, a, b, c, k[15], 10, -30611744);
- c = ii(c, d, a, b, k[6], 15, -1560198380);
- b = ii(b, c, d, a, k[13], 21, 1309151649);
- a = ii(a, b, c, d, k[4], 6, -145523070);
- d = ii(d, a, b, c, k[11], 10, -1120210379);
- c = ii(c, d, a, b, k[2], 15, 718787259);
- b = ii(b, c, d, a, k[9], 21, -343485551);
- x[0] = add32(a, x[0]);
- x[1] = add32(b, x[1]);
- x[2] = add32(c, x[2]);
- x[3] = add32(d, x[3]);
- },
-
- md5blk = function (s) {
- var md5blks = [],
- i;
- for (i = 0; i < 64; i += 4) {
- md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
- }
- return md5blks;
- },
- md5blk_array = function (a) {
- var md5blks = [],
- i;
- for (i = 0; i < 64; i += 4) {
- md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
- }
- return md5blks;
- },
- md51 = function (s) {
- var n = s.length,
- state = [1732584193, -271733879, -1732584194, 271733878],
- i,
- length,
- tail,
- tmp,
- lo,
- hi;
- for (i = 64; i <= n; i += 64) {
- md5cycle(state, md5blk(s.substring(i - 64, i)));
- }
- s = s.substring(i - 64);
- length = s.length;
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
- }
- tail[i >> 2] |= 0x80 << ((i % 4) << 3);
- if (i > 55) {
- md5cycle(state, tail);
- for (i = 0; i < 16; i += 1) {
- tail[i] = 0;
- }
- }
-
- tmp = n * 8;
- tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
- lo = parseInt(tmp[2], 16);
- hi = parseInt(tmp[1], 16) || 0;
- tail[14] = lo;
- tail[15] = hi;
- md5cycle(state, tail);
- return state;
- },
- md51_array = function (a) {
- var n = a.length,
- state = [1732584193, -271733879, -1732584194, 271733878],
- i,
- length,
- tail,
- tmp,
- lo,
- hi;
- for (i = 64; i <= n; i += 64) {
- md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
- }
-
-
-
-
- a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
- length = a.length;
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= a[i] << ((i % 4) << 3);
- }
- tail[i >> 2] |= 0x80 << ((i % 4) << 3);
- if (i > 55) {
- md5cycle(state, tail);
- for (i = 0; i < 16; i += 1) {
- tail[i] = 0;
- }
- }
-
- tmp = n * 8;
- tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
- lo = parseInt(tmp[2], 16);
- hi = parseInt(tmp[1], 16) || 0;
- tail[14] = lo;
- tail[15] = hi;
- md5cycle(state, tail);
- return state;
- },
- hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'],
- rhex = function (n) {
- var s = '',
- j;
- for (j = 0; j < 4; j += 1) {
- s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
- }
- return s;
- },
- hex = function (x) {
- var i;
- for (i = 0; i < x.length; i += 1) {
- x[i] = rhex(x[i]);
- }
- return x.join('');
- },
- md5 = function (s) {
- return hex(md51(s));
- },
-
-
- SparkMD5 = function () {
-
- this.reset();
- };
-
- if (md5('hello') !== '5d41402abc4b2a76b9719d911017c592') {
- add32 = function (x, y) {
- var lsw = (x & 0xFFFF) + (y & 0xFFFF),
- msw = (x >> 16) + (y >> 16) + (lsw >> 16);
- return (msw << 16) | (lsw & 0xFFFF);
- };
- }
-
- SparkMD5.prototype.append = function (str) {
-
- if (/[\u0080-\uFFFF]/.test(str)) {
- str = unescape(encodeURIComponent(str));
- }
-
- this.appendBinary(str);
- return this;
- };
-
- SparkMD5.prototype.appendBinary = function (contents) {
- this._buff += contents;
- this._length += contents.length;
- var length = this._buff.length,
- i;
- for (i = 64; i <= length; i += 64) {
- md5cycle(this._state, md5blk(this._buff.substring(i - 64, i)));
- }
- this._buff = this._buff.substr(i - 64);
- return this;
- };
-
- SparkMD5.prototype.end = function (raw) {
- var buff = this._buff,
- length = buff.length,
- i,
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ret;
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
- }
- this._finish(tail, length);
- ret = !!raw ? this._state : hex(this._state);
- this.reset();
- return ret;
- };
-
- SparkMD5.prototype._finish = function (tail, length) {
- var i = length,
- tmp,
- lo,
- hi;
- tail[i >> 2] |= 0x80 << ((i % 4) << 3);
- if (i > 55) {
- md5cycle(this._state, tail);
- for (i = 0; i < 16; i += 1) {
- tail[i] = 0;
- }
- }
-
-
- tmp = this._length * 8;
- tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
- lo = parseInt(tmp[2], 16);
- hi = parseInt(tmp[1], 16) || 0;
- tail[14] = lo;
- tail[15] = hi;
- md5cycle(this._state, tail);
- };
-
- SparkMD5.prototype.reset = function () {
- this._buff = "";
- this._length = 0;
- this._state = [1732584193, -271733879, -1732584194, 271733878];
- return this;
- };
-
- SparkMD5.prototype.destroy = function () {
- delete this._state;
- delete this._buff;
- delete this._length;
- };
-
- SparkMD5.hash = function (str, raw) {
-
- if (/[\u0080-\uFFFF]/.test(str)) {
- str = unescape(encodeURIComponent(str));
- }
- var hash = md51(str);
- return !!raw ? hash : hex(hash);
- };
-
- SparkMD5.hashBinary = function (content, raw) {
- var hash = md51(content);
- return !!raw ? hash : hex(hash);
- };
-
- SparkMD5.ArrayBuffer = function () {
-
- this.reset();
- };
-
-
- SparkMD5.ArrayBuffer.prototype.append = function (arr) {
-
-
- var buff = this._concatArrayBuffer(this._buff, arr),
- length = buff.length,
- i;
- this._length += arr.byteLength;
- for (i = 64; i <= length; i += 64) {
- md5cycle(this._state, md5blk_array(buff.subarray(i - 64, i)));
- }
-
- this._buff = (i - 64) < length ? buff.subarray(i - 64) : new Uint8Array(0);
- return this;
- };
-
- SparkMD5.ArrayBuffer.prototype.end = function (raw) {
- var buff = this._buff,
- length = buff.length,
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- i,
- ret;
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= buff[i] << ((i % 4) << 3);
- }
- this._finish(tail, length);
- ret = !!raw ? this._state : hex(this._state);
- this.reset();
- return ret;
- };
- SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
-
- SparkMD5.ArrayBuffer.prototype.reset = function () {
- this._buff = new Uint8Array(0);
- this._length = 0;
- this._state = [1732584193, -271733879, -1732584194, 271733878];
- return this;
- };
-
- SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
-
- SparkMD5.ArrayBuffer.prototype._concatArrayBuffer = function (first, second) {
- var firstLength = first.length,
- result = new Uint8Array(firstLength + second.byteLength);
- result.set(first);
- result.set(new Uint8Array(second), firstLength);
- return result;
- };
-
- SparkMD5.ArrayBuffer.hash = function (arr, raw) {
- var hash = md51_array(new Uint8Array(arr));
- return !!raw ? hash : hex(hash);
- };
- return FlashRuntime.register( 'Md5', {
- init: function() {
-
- },
- loadFromBlob: function( file ) {
- var blob = file.getSource(),
- chunkSize = 2 * 1024 * 1024,
- chunks = Math.ceil( blob.size / chunkSize ),
- chunk = 0,
- owner = this.owner,
- spark = new SparkMD5.ArrayBuffer(),
- me = this,
- blobSlice = blob.mozSlice || blob.webkitSlice || blob.slice,
- loadNext, fr;
- fr = new FileReader();
- loadNext = function() {
- var start, end;
- start = chunk * chunkSize;
- end = Math.min( start + chunkSize, blob.size );
- fr.onload = function( e ) {
- spark.append( e.target.result );
- owner.trigger( 'progress', {
- total: file.size,
- loaded: end
- });
- };
- fr.onloadend = function() {
- fr.onloadend = fr.onload = null;
- if ( ++chunk < chunks ) {
- setTimeout( loadNext, 1 );
- } else {
- setTimeout(function(){
- owner.trigger('load');
- me.result = spark.end();
- loadNext = file = blob = spark = null;
- owner.trigger('complete');
- }, 50 );
- }
- };
- fr.readAsArrayBuffer( blobSlice.call( blob, start, end ) );
- };
- loadNext();
- },
- getResult: function() {
- return this.result;
- }
- });
- });
-
- define('runtime/flash/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
- var $ = Base.$,
- type = 'flash',
- components = {};
- function getFlashVersion() {
- var version;
- try {
- version = navigator.plugins[ 'Shockwave Flash' ];
- version = version.description;
- } catch ( ex ) {
- try {
- version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
- .GetVariable('$version');
- } catch ( ex2 ) {
- version = '0.0';
- }
- }
- version = version.match( /\d+/g );
- return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
- }
- function FlashRuntime() {
- var pool = {},
- clients = {},
- destroy = this.destroy,
- me = this,
- jsreciver = Base.guid('webuploader_');
- Runtime.apply( me, arguments );
- me.type = type;
-
- me.exec = function( comp, fn ) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
- clients[ uid ] = client;
- if ( components[ comp ] ) {
- if ( !pool[ uid ] ) {
- pool[ uid ] = new components[ comp ]( client, me );
- }
- instance = pool[ uid ];
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
- return me.flashExec.apply( client, arguments );
- };
- function handler( evt, obj ) {
- var type = evt.type || evt,
- parts, uid;
- parts = type.split('::');
- uid = parts[ 0 ];
- type = parts[ 1 ];
-
- if ( type === 'Ready' && uid === me.uid ) {
- me.trigger('ready');
- } else if ( clients[ uid ] ) {
- clients[ uid ].trigger( type.toLowerCase(), evt, obj );
- }
-
- }
-
- window[ jsreciver ] = function() {
- var args = arguments;
-
- setTimeout(function() {
- handler.apply( null, args );
- }, 1 );
- };
- this.jsreciver = jsreciver;
- this.destroy = function() {
-
- return destroy && destroy.apply( this, arguments );
- };
- this.flashExec = function( comp, fn ) {
- var flash = me.getFlash(),
- args = Base.slice( arguments, 2 );
- return flash.exec( this.uid, comp, fn, args );
- };
-
- }
- Base.inherits( Runtime, {
- constructor: FlashRuntime,
- init: function() {
- var container = this.getContainer(),
- opts = this.options,
- html;
-
-
- container.css({
- position: 'absolute',
- top: '-8px',
- left: '-8px',
- width: '9px',
- height: '9px',
- overflow: 'hidden'
- });
-
- html = '<object id="' + this.uid + '" type="application/' +
- 'x-shockwave-flash" data="' + opts.swf + '" ';
- if ( Base.browser.ie ) {
- html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
- }
- html += 'width="100%" height="100%" style="outline:0">' +
- '<param name="movie" value="' + opts.swf + '" />' +
- '<param name="flashvars" value="uid=' + this.uid +
- '&jsreciver=' + this.jsreciver + '" />' +
- '<param name="wmode" value="transparent" />' +
- '<param name="allowscriptaccess" value="always" />' +
- '</object>';
- container.html( html );
- },
- getFlash: function() {
- if ( this._flash ) {
- return this._flash;
- }
- this._flash = $( '#' + this.uid ).get( 0 );
- return this._flash;
- }
- });
- FlashRuntime.register = function( name, component ) {
- component = components[ name ] = Base.inherits( CompBase, $.extend({
-
- flashExec: function() {
- var owner = this.owner,
- runtime = this.getRuntime();
- return runtime.flashExec.apply( owner, arguments );
- }
- }, component ) );
- return component;
- };
- if ( getFlashVersion() >= 11.4 ) {
- Runtime.addRuntime( type, FlashRuntime );
- }
- return FlashRuntime;
- });
-
- define('runtime/flash/filepicker',[
- 'base',
- 'runtime/flash/runtime'
- ], function( Base, FlashRuntime ) {
- var $ = Base.$;
- return FlashRuntime.register( 'FilePicker', {
- init: function( opts ) {
- var copy = $.extend({}, opts ),
- len, i;
-
- len = copy.accept && copy.accept.length;
- for ( i = 0; i < len; i++ ) {
- if ( !copy.accept[ i ].title ) {
- copy.accept[ i ].title = 'Files';
- }
- }
- delete copy.button;
- delete copy.id;
- delete copy.container;
- this.flashExec( 'FilePicker', 'init', copy );
- },
- destroy: function() {
- this.flashExec( 'FilePicker', 'destroy' );
- }
- });
- });
-
- define('runtime/flash/image',[
- 'runtime/flash/runtime'
- ], function( FlashRuntime ) {
- return FlashRuntime.register( 'Image', {
-
-
-
-
-
-
-
- loadFromBlob: function( blob ) {
- var owner = this.owner;
- owner.info() && this.flashExec( 'Image', 'info', owner.info() );
- owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
- this.flashExec( 'Image', 'loadFromBlob', blob.uid );
- }
- });
- });
-
- define('runtime/flash/transport',[
- 'base',
- 'runtime/flash/runtime',
- 'runtime/client'
- ], function( Base, FlashRuntime, RuntimeClient ) {
- var $ = Base.$;
- return FlashRuntime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- this._responseJson = null;
- },
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- binary;
- xhr.connectRuntime( blob.ruid );
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
- binary = blob.uid;
- } else {
- $.each( owner._formData, function( k, v ) {
- xhr.exec( 'append', k, v );
- });
- xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
- opts.filename || owner._formData.name || '' );
- }
- this._setRequestHeader( xhr, opts.headers );
- xhr.exec( 'send', {
- method: opts.method,
- url: server,
- forceURLStream: opts.forceURLStream,
- mimeType: 'application/octet-stream'
- }, binary );
- },
- getStatus: function() {
- return this._status;
- },
- getResponse: function() {
- return this._response || '';
- },
- getResponseAsJson: function() {
- return this._responseJson;
- },
- abort: function() {
- var xhr = this._xhr;
- if ( xhr ) {
- xhr.exec('abort');
- xhr.destroy();
- this._xhr = xhr = null;
- }
- },
- destroy: function() {
- this.abort();
- },
- _initAjax: function() {
- var me = this,
- xhr = new RuntimeClient('XMLHttpRequest');
- xhr.on( 'uploadprogress progress', function( e ) {
- var percent = e.loaded / e.total;
- percent = Math.min( 1, Math.max( 0, percent ) );
- return me.trigger( 'progress', percent );
- });
- xhr.on( 'load', function() {
- var status = xhr.exec('getStatus'),
- readBody = false,
- err = '',
- p;
- xhr.off();
- me._xhr = null;
- if ( status >= 200 && status < 300 ) {
- readBody = true;
- } else if ( status >= 500 && status < 600 ) {
- readBody = true;
- err = 'server';
- } else {
- err = 'http';
- }
- if ( readBody ) {
- me._response = xhr.exec('getResponse');
- me._response = decodeURIComponent( me._response );
-
-
-
-
- p = window.JSON && window.JSON.parse || function( s ) {
- try {
- return new Function('return ' + s).call();
- } catch ( err ) {
- return {};
- }
- };
- me._responseJson = me._response ? p(me._response) : {};
-
- }
- xhr.destroy();
- xhr = null;
- return err ? me.trigger( 'error', err ) : me.trigger('load');
- });
- xhr.on( 'error', function() {
- xhr.off();
- me._xhr = null;
- me.trigger( 'error', 'http' );
- });
- me._xhr = xhr;
- return xhr;
- },
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.exec( 'setRequestHeader', key, val );
- });
- }
- });
- });
-
- define('runtime/flash/blob',[
- 'runtime/flash/runtime',
- 'lib/blob'
- ], function( FlashRuntime, Blob ) {
- return FlashRuntime.register( 'Blob', {
- slice: function( start, end ) {
- var blob = this.flashExec( 'Blob', 'slice', start, end );
- return new Blob( blob.uid, blob );
- }
- });
- });
-
- define('runtime/flash/md5',[
- 'runtime/flash/runtime'
- ], function( FlashRuntime ) {
- return FlashRuntime.register( 'Md5', {
- init: function() {
-
- },
- loadFromBlob: function( blob ) {
- return this.flashExec( 'Md5', 'loadFromBlob', blob.uid );
- }
- });
- });
-
- define('preset/all',[
- 'base',
-
- 'widgets/filednd',
- 'widgets/filepaste',
- 'widgets/filepicker',
- 'widgets/image',
- 'widgets/queue',
- 'widgets/runtime',
- 'widgets/upload',
- 'widgets/validator',
- 'widgets/md5',
-
-
- 'runtime/html5/blob',
- 'runtime/html5/dnd',
- 'runtime/html5/filepaste',
- 'runtime/html5/filepicker',
- 'runtime/html5/imagemeta/exif',
- 'runtime/html5/androidpatch',
- 'runtime/html5/image',
- 'runtime/html5/transport',
- 'runtime/html5/md5',
-
- 'runtime/flash/filepicker',
- 'runtime/flash/image',
- 'runtime/flash/transport',
- 'runtime/flash/blob',
- 'runtime/flash/md5'
- ], function( Base ) {
- return Base;
- });
- define('webuploader',[
- 'preset/all'
- ], function( preset ) {
- return preset;
- });
- return require('webuploader');
- });
|