ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var media = wp.media, baseSettings = window._wpmejsSettings || {}, l10n = window._wpMediaViewsL10n || {}; /** * * @summary Defines the wp.media.mixin object. * * @mixin * * @since 4.2.0 */ wp.media.mixin = { mejsSettings: baseSettings, /** * @summary Pauses and removes all players. * * @since 4.2.0 * * @return {void} */ removeAllPlayers: function() { var p; if ( window.mejs && window.mejs.players ) { for ( p in window.mejs.players ) { window.mejs.players[p].pause(); this.removePlayer( window.mejs.players[p] ); } } }, /** * @summary Removes the player. * * Override the MediaElement method for removing a player. * MediaElement tries to pull the audio/video tag out of * its container and re-add it to the DOM. * * @since 4.2.0 * * @return {void} */ removePlayer: function(t) { var featureIndex, feature; if ( ! t.options ) { return; } // invoke features cleanup for ( featureIndex in t.options.features ) { feature = t.options.features[featureIndex]; if ( t['clean' + feature] ) { try { t['clean' + feature](t); } catch (e) {} } } if ( ! t.isDynamic ) { t.node.remove(); } if ( 'html5' !== t.media.rendererName ) { t.media.remove(); } delete window.mejs.players[t.id]; t.container.remove(); t.globalUnbind('resize', t.globalResizeCallback); t.globalUnbind('keydown', t.globalKeydownCallback); t.globalUnbind('click', t.globalClickCallback); delete t.media.player; }, /** * * @summary Removes and resets all players. * * Allows any class that has set 'player' to a MediaElementPlayer * instance to remove the player when listening to events. * * Examples: modal closes, shortcode properties are removed, etc. * * @since 4.2.0 */ unsetPlayers : function() { if ( this.players && this.players.length ) { _.each( this.players, function (player) { player.pause(); wp.media.mixin.removePlayer( player ); } ); this.players = []; } } }; /** * @summary Shortcode modeling for playlists. * * @since 4.2.0 */ wp.media.playlist = new wp.media.collection({ tag: 'playlist', editTitle : l10n.editPlaylistTitle, defaults : { id: wp.media.view.settings.post.id, style: 'light', tracklist: true, tracknumbers: true, images: true, artists: true, type: 'audio' } }); /** * @summary Shortcode modeling for audio. * * `edit()` prepares the shortcode for the media modal. * `shortcode()` builds the new shortcode after an update. * * @namespace * * @since 4.2.0 */ wp.media.audio = { coerce : wp.media.coerce, defaults : { id : wp.media.view.settings.post.id, src : '', loop : false, autoplay : false, preload : 'none', width : 400 }, /** * @summary Instantiates a new media object with the next matching shortcode. * * @since 4.2.0 * * @param {string} data The text to apply the shortcode on. * @returns {wp.media} The media object. */ edit : function( data ) { var frame, shortcode = wp.shortcode.next( 'audio', data ).shortcode; frame = wp.media({ frame: 'audio', state: 'audio-details', metadata: _.defaults( shortcode.attrs.named, this.defaults ) }); return frame; }, /** * @summary Generates an audio shortcode. * * @since 4.2.0 * * @param {Array} model Array with attributes for the shortcode. * @returns {wp.shortcode} The audio shortcode object. */ shortcode : function( model ) { var content; _.each( this.defaults, function( value, key ) { model[ key ] = this.coerce( model, key ); if ( value === model[ key ] ) { delete model[ key ]; } }, this ); content = model.content; delete model.content; return new wp.shortcode({ tag: 'audio', attrs: model, content: content }); } }; /** * @summary Shortcode modeling for video. * * `edit()` prepares the shortcode for the media modal. * `shortcode()` builds the new shortcode after update. * * @since 4.2.0 * * @namespace */ wp.media.video = { coerce : wp.media.coerce, defaults : { id : wp.media.view.settings.post.id, src : '', poster : '', loop : false, autoplay : false, preload : 'metadata', content : '', width : 640, height : 360 }, /** * @summary Instantiates a new media object with the next matching shortcode. * * @since 4.2.0 * * @param {string} data The text to apply the shortcode on. * @returns {wp.media} The media object. */ edit : function( data ) { var frame, shortcode = wp.shortcode.next( 'video', data ).shortcode, attrs; attrs = shortcode.attrs.named; attrs.content = shortcode.content; frame = wp.media({ frame: 'video', state: 'video-details', metadata: _.defaults( attrs, this.defaults ) }); return frame; }, /** * @summary Generates an video shortcode. * * @since 4.2.0 * * @param {Array} model Array with attributes for the shortcode. * @returns {wp.shortcode} The video shortcode object. */ shortcode : function( model ) { var content; _.each( this.defaults, function( value, key ) { model[ key ] = this.coerce( model, key ); if ( value === model[ key ] ) { delete model[ key ]; } }, this ); content = model.content; delete model.content; return new wp.shortcode({ tag: 'video', attrs: model, content: content }); } }; media.model.PostMedia = __webpack_require__( 1 ); media.controller.AudioDetails = __webpack_require__( 2 ); media.controller.VideoDetails = __webpack_require__( 3 ); media.view.MediaFrame.MediaDetails = __webpack_require__( 4 ); media.view.MediaFrame.AudioDetails = __webpack_require__( 5 ); media.view.MediaFrame.VideoDetails = __webpack_require__( 6 ); media.view.MediaDetails = __webpack_require__( 7 ); media.view.AudioDetails = __webpack_require__( 8 ); media.view.VideoDetails = __webpack_require__( 9 ); /***/ }), /* 1 */ /***/ (function(module, exports) { /** * wp.media.model.PostMedia * * Shared model class for audio and video. Updates the model after * "Add Audio|Video Source" and "Replace Audio|Video" states return * * @memberOf wp.media.model * * @class * @augments Backbone.Model */ var PostMedia = Backbone.Model.extend(/** @lends wp.media.model.PostMedia.prototype */{ initialize: function() { this.attachment = false; }, setSource: function( attachment ) { this.attachment = attachment; this.extension = attachment.get( 'filename' ).split('.').pop(); if ( this.get( 'src' ) && this.extension === this.get( 'src' ).split('.').pop() ) { this.unset( 'src' ); } if ( _.contains( wp.media.view.settings.embedExts, this.extension ) ) { this.set( this.extension, this.attachment.get( 'url' ) ); } else { this.unset( this.extension ); } }, changeAttachment: function( attachment ) { this.setSource( attachment ); this.unset( 'src' ); _.each( _.without( wp.media.view.settings.embedExts, this.extension ), function( ext ) { this.unset( ext ); }, this ); } }); module.exports = PostMedia; /***/ }), /* 2 */ /***/ (function(module, exports) { var State = wp.media.controller.State, l10n = wp.media.view.l10n, AudioDetails; /** * wp.media.controller.AudioDetails * * The controller for the Audio Details state * * @memberOf wp.media.controller * * @class * @augments wp.media.controller.State * @augments Backbone.Model */ AudioDetails = State.extend(/** @lends wp.media.controller.AudioDetails.prototype */{ defaults: { id: 'audio-details', toolbar: 'audio-details', title: l10n.audioDetailsTitle, content: 'audio-details', menu: 'audio-details', router: false, priority: 60 }, initialize: function( options ) { this.media = options.media; State.prototype.initialize.apply( this, arguments ); } }); module.exports = AudioDetails; /***/ }), /* 3 */ /***/ (function(module, exports) { /** * wp.media.controller.VideoDetails * * The controller for the Video Details state * * @memberOf wp.media.controller * * @class * @augments wp.media.controller.State * @augments Backbone.Model */ var State = wp.media.controller.State, l10n = wp.media.view.l10n, VideoDetails; VideoDetails = State.extend(/** @lends wp.media.controller.VideoDetails.prototype */{ defaults: { id: 'video-details', toolbar: 'video-details', title: l10n.videoDetailsTitle, content: 'video-details', menu: 'video-details', router: false, priority: 60 }, initialize: function( options ) { this.media = options.media; State.prototype.initialize.apply( this, arguments ); } }); module.exports = VideoDetails; /***/ }), /* 4 */ /***/ (function(module, exports) { var Select = wp.media.view.MediaFrame.Select, l10n = wp.media.view.l10n, MediaDetails; /** * wp.media.view.MediaFrame.MediaDetails * * @memberOf wp.media.view.MediaFrame * * @class * @augments wp.media.view.MediaFrame.Select * @augments wp.media.view.MediaFrame * @augments wp.media.view.Frame * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View * @mixes wp.media.controller.StateMachine */ MediaDetails = Select.extend(/** @lends wp.media.view.MediaFrame.MediaDetails.prototype */{ defaults: { id: 'media', url: '', menu: 'media-details', content: 'media-details', toolbar: 'media-details', type: 'link', priority: 120 }, initialize: function( options ) { this.DetailsView = options.DetailsView; this.cancelText = options.cancelText; this.addText = options.addText; this.media = new wp.media.model.PostMedia( options.metadata ); this.options.selection = new wp.media.model.Selection( this.media.attachment, { multiple: false } ); Select.prototype.initialize.apply( this, arguments ); }, bindHandlers: function() { var menu = this.defaults.menu; Select.prototype.bindHandlers.apply( this, arguments ); this.on( 'menu:create:' + menu, this.createMenu, this ); this.on( 'content:render:' + menu, this.renderDetailsContent, this ); this.on( 'menu:render:' + menu, this.renderMenu, this ); this.on( 'toolbar:render:' + menu, this.renderDetailsToolbar, this ); }, renderDetailsContent: function() { var view = new this.DetailsView({ controller: this, model: this.state().media, attachment: this.state().media.attachment }).render(); this.content.set( view ); }, renderMenu: function( view ) { var lastState = this.lastState(), previous = lastState && lastState.id, frame = this; view.set({ cancel: { text: this.cancelText, priority: 20, click: function() { if ( previous ) { frame.setState( previous ); } else { frame.close(); } } }, separateCancel: new wp.media.View({ className: 'separator', priority: 40 }) }); }, setPrimaryButton: function(text, handler) { this.toolbar.set( new wp.media.view.Toolbar({ controller: this, items: { button: { style: 'primary', text: text, priority: 80, click: function() { var controller = this.controller; handler.call( this, controller, controller.state() ); // Restore and reset the default state. controller.setState( controller.options.state ); controller.reset(); } } } }) ); }, renderDetailsToolbar: function() { this.setPrimaryButton( l10n.update, function( controller, state ) { controller.close(); state.trigger( 'update', controller.media.toJSON() ); } ); }, renderReplaceToolbar: function() { this.setPrimaryButton( l10n.replace, function( controller, state ) { var attachment = state.get( 'selection' ).single(); controller.media.changeAttachment( attachment ); state.trigger( 'replace', controller.media.toJSON() ); } ); }, renderAddSourceToolbar: function() { this.setPrimaryButton( this.addText, function( controller, state ) { var attachment = state.get( 'selection' ).single(); controller.media.setSource( attachment ); state.trigger( 'add-source', controller.media.toJSON() ); } ); } }); module.exports = MediaDetails; /***/ }), /* 5 */ /***/ (function(module, exports) { var MediaDetails = wp.media.view.MediaFrame.MediaDetails, MediaLibrary = wp.media.controller.MediaLibrary, l10n = wp.media.view.l10n, AudioDetails; /** * wp.media.view.MediaFrame.AudioDetails * * @memberOf wp.media.view.MediaFrame * * @class * @augments wp.media.view.MediaFrame.MediaDetails * @augments wp.media.view.MediaFrame.Select * @augments wp.media.view.MediaFrame * @augments wp.media.view.Frame * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View * @mixes wp.media.controller.StateMachine */ AudioDetails = MediaDetails.extend(/** @lends wp.media.view.MediaFrame.AudioDetails.prototype */{ defaults: { id: 'audio', url: '', menu: 'audio-details', content: 'audio-details', toolbar: 'audio-details', type: 'link', title: l10n.audioDetailsTitle, priority: 120 }, initialize: function( options ) { options.DetailsView = wp.media.view.AudioDetails; options.cancelText = l10n.audioDetailsCancel; options.addText = l10n.audioAddSourceTitle; MediaDetails.prototype.initialize.call( this, options ); }, bindHandlers: function() { MediaDetails.prototype.bindHandlers.apply( this, arguments ); this.on( 'toolbar:render:replace-audio', this.renderReplaceToolbar, this ); this.on( 'toolbar:render:add-audio-source', this.renderAddSourceToolbar, this ); }, createStates: function() { this.states.add([ new wp.media.controller.AudioDetails( { media: this.media } ), new MediaLibrary( { type: 'audio', id: 'replace-audio', title: l10n.audioReplaceTitle, toolbar: 'replace-audio', media: this.media, menu: 'audio-details' } ), new MediaLibrary( { type: 'audio', id: 'add-audio-source', title: l10n.audioAddSourceTitle, toolbar: 'add-audio-source', media: this.media, menu: false } ) ]); } }); module.exports = AudioDetails; /***/ }), /* 6 */ /***/ (function(module, exports) { var MediaDetails = wp.media.view.MediaFrame.MediaDetails, MediaLibrary = wp.media.controller.MediaLibrary, l10n = wp.media.view.l10n, VideoDetails; /** * wp.media.view.MediaFrame.VideoDetails * * @memberOf wp.media.view.MediaFrame * * @class * @augments wp.media.view.MediaFrame.MediaDetails * @augments wp.media.view.MediaFrame.Select * @augments wp.media.view.MediaFrame * @augments wp.media.view.Frame * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View * @mixes wp.media.controller.StateMachine */ VideoDetails = MediaDetails.extend(/** @lends wp.media.view.MediaFrame.VideoDetails.prototype */{ defaults: { id: 'video', url: '', menu: 'video-details', content: 'video-details', toolbar: 'video-details', type: 'link', title: l10n.videoDetailsTitle, priority: 120 }, initialize: function( options ) { options.DetailsView = wp.media.view.VideoDetails; options.cancelText = l10n.videoDetailsCancel; options.addText = l10n.videoAddSourceTitle; MediaDetails.prototype.initialize.call( this, options ); }, bindHandlers: function() { MediaDetails.prototype.bindHandlers.apply( this, arguments ); this.on( 'toolbar:render:replace-video', this.renderReplaceToolbar, this ); this.on( 'toolbar:render:add-video-source', this.renderAddSourceToolbar, this ); this.on( 'toolbar:render:select-poster-image', this.renderSelectPosterImageToolbar, this ); this.on( 'toolbar:render:add-track', this.renderAddTrackToolbar, this ); }, createStates: function() { this.states.add([ new wp.media.controller.VideoDetails({ media: this.media }), new MediaLibrary( { type: 'video', id: 'replace-video', title: l10n.videoReplaceTitle, toolbar: 'replace-video', media: this.media, menu: 'video-details' } ), new MediaLibrary( { type: 'video', id: 'add-video-source', title: l10n.videoAddSourceTitle, toolbar: 'add-video-source', media: this.media, menu: false } ), new MediaLibrary( { type: 'image', id: 'select-poster-image', title: l10n.videoSelectPosterImageTitle, toolbar: 'select-poster-image', media: this.media, menu: 'video-details' } ), new MediaLibrary( { type: 'text', id: 'add-track', title: l10n.videoAddTrackTitle, toolbar: 'add-track', media: this.media, menu: 'video-details' } ) ]); }, renderSelectPosterImageToolbar: function() { this.setPrimaryButton( l10n.videoSelectPosterImageTitle, function( controller, state ) { var urls = [], attachment = state.get( 'selection' ).single(); controller.media.set( 'poster', attachment.get( 'url' ) ); state.trigger( 'set-poster-image', controller.media.toJSON() ); _.each( wp.media.view.settings.embedExts, function (ext) { if ( controller.media.get( ext ) ) { urls.push( controller.media.get( ext ) ); } } ); wp.ajax.send( 'set-attachment-thumbnail', { data : { urls: urls, thumbnail_id: attachment.get( 'id' ) } } ); } ); }, renderAddTrackToolbar: function() { this.setPrimaryButton( l10n.videoAddTrackTitle, function( controller, state ) { var attachment = state.get( 'selection' ).single(), content = controller.media.get( 'content' ); if ( -1 === content.indexOf( attachment.get( 'url' ) ) ) { content += [ '' ].join(''); controller.media.set( 'content', content ); } state.trigger( 'add-track', controller.media.toJSON() ); } ); } }); module.exports = VideoDetails; /***/ }), /* 7 */ /***/ (function(module, exports) { /* global MediaElementPlayer */ var AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay, $ = jQuery, MediaDetails; /** * wp.media.view.MediaDetails * * @memberOf wp.media.view * * @class * @augments wp.media.view.Settings.AttachmentDisplay * @augments wp.media.view.Settings * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View */ MediaDetails = AttachmentDisplay.extend(/** @lends wp.media.view.MediaDetails.prototype */{ initialize: function() { _.bindAll(this, 'success'); this.players = []; this.listenTo( this.controller, 'close', wp.media.mixin.unsetPlayers ); this.on( 'ready', this.setPlayer ); this.on( 'media:setting:remove', wp.media.mixin.unsetPlayers, this ); this.on( 'media:setting:remove', this.render ); this.on( 'media:setting:remove', this.setPlayer ); AttachmentDisplay.prototype.initialize.apply( this, arguments ); }, events: function(){ return _.extend( { 'click .remove-setting' : 'removeSetting', 'change .content-track' : 'setTracks', 'click .remove-track' : 'setTracks', 'click .add-media-source' : 'addSource' }, AttachmentDisplay.prototype.events ); }, prepare: function() { return _.defaults({ model: this.model.toJSON() }, this.options ); }, /** * Remove a setting's UI when the model unsets it * * @fires wp.media.view.MediaDetails#media:setting:remove * * @param {Event} e */ removeSetting : function(e) { var wrap = $( e.currentTarget ).parent(), setting; setting = wrap.find( 'input' ).data( 'setting' ); if ( setting ) { this.model.unset( setting ); this.trigger( 'media:setting:remove', this ); } wrap.remove(); }, /** * * @fires wp.media.view.MediaDetails#media:setting:remove */ setTracks : function() { var tracks = ''; _.each( this.$('.content-track'), function(track) { tracks += $( track ).val(); } ); this.model.set( 'content', tracks ); this.trigger( 'media:setting:remove', this ); }, addSource : function( e ) { this.controller.lastMime = $( e.currentTarget ).data( 'mime' ); this.controller.setState( 'add-' + this.controller.defaults.id + '-source' ); }, loadPlayer: function () { this.players.push( new MediaElementPlayer( this.media, this.settings ) ); this.scriptXhr = false; }, setPlayer : function() { var src; if ( this.players.length || ! this.media || this.scriptXhr ) { return; } src = this.model.get( 'src' ); if ( src && src.indexOf( 'vimeo' ) > -1 && ! ( 'Vimeo' in window ) ) { this.scriptXhr = $.getScript( 'https://player.vimeo.com/api/player.js', _.bind( this.loadPlayer, this ) ); } else { this.loadPlayer(); } }, /** * @abstract */ setMedia : function() { return this; }, success : function(mejs) { var autoplay = mejs.attributes.autoplay && 'false' !== mejs.attributes.autoplay; if ( 'flash' === mejs.pluginType && autoplay ) { mejs.addEventListener( 'canplay', function() { mejs.play(); }, false ); } this.mejs = mejs; }, /** * @returns {media.view.MediaDetails} Returns itself to allow chaining */ render: function() { AttachmentDisplay.prototype.render.apply( this, arguments ); setTimeout( _.bind( function() { this.resetFocus(); }, this ), 10 ); this.settings = _.defaults( { success : this.success }, wp.media.mixin.mejsSettings ); return this.setMedia(); }, resetFocus: function() { this.$( '.embed-media-settings' ).scrollTop( 0 ); } },/** @lends wp.media.view.MediaDetails */{ instances : 0, /** * When multiple players in the DOM contain the same src, things get weird. * * @param {HTMLElement} elem * @returns {HTMLElement} */ prepareSrc : function( elem ) { var i = MediaDetails.instances++; _.each( $( elem ).find( 'source' ), function( source ) { source.src = [ source.src, source.src.indexOf('?') > -1 ? '&' : '?', '_=', i ].join(''); } ); return elem; } }); module.exports = MediaDetails; /***/ }), /* 8 */ /***/ (function(module, exports) { var MediaDetails = wp.media.view.MediaDetails, AudioDetails; /** * wp.media.view.AudioDetails * * @memberOf wp.media.view * * @class * @augments wp.media.view.MediaDetails * @augments wp.media.view.Settings.AttachmentDisplay * @augments wp.media.view.Settings * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View */ AudioDetails = MediaDetails.extend(/** @lends wp.media.view.AudioDetails.prototype */{ className: 'audio-details', template: wp.template('audio-details'), setMedia: function() { var audio = this.$('.wp-audio-shortcode'); if ( audio.find( 'source' ).length ) { if ( audio.is(':hidden') ) { audio.show(); } this.media = MediaDetails.prepareSrc( audio.get(0) ); } else { audio.hide(); this.media = false; } return this; } }); module.exports = AudioDetails; /***/ }), /* 9 */ /***/ (function(module, exports) { var MediaDetails = wp.media.view.MediaDetails, VideoDetails; /** * wp.media.view.VideoDetails * * @memberOf wp.media.view * * @class * @augments wp.media.view.MediaDetails * @augments wp.media.view.Settings.AttachmentDisplay * @augments wp.media.view.Settings * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View */ VideoDetails = MediaDetails.extend(/** @lends wp.media.view.VideoDetails.prototype */{ className: 'video-details', template: wp.template('video-details'), setMedia: function() { var video = this.$('.wp-video-shortcode'); if ( video.find( 'source' ).length ) { if ( video.is(':hidden') ) { video.show(); } if ( ! video.hasClass( 'youtube-video' ) && ! video.hasClass( 'vimeo-video' ) ) { this.media = MediaDetails.prepareSrc( video.get(0) ); } else { this.media = video.get(0); } } else { video.hide(); this.media = false; } return this; } }); module.exports = VideoDetails; /***/ }) /******/ ]);