a1fd0eb863ec29cf6e4cad69b2576295a49224fb
[lhc/web/wiklou.git] / js2 / remoteMwEmbed.js
1 /*
2 * this file exposes some of the functionality of mwEmbed to wikis
3 * that do not yet have js2 enabled
4 */
5
6 var urlparts = getRemoteEmbedPath();
7 var mwEmbedHostPath = urlparts[0];
8 var mwRemoteVersion = '1.0';
9
10 reqArguments = urlparts[1];
11
12 //setup up request Params:
13 var reqParts = urlparts[1].split('&');
14 var reqParam={};
15 for(var i=0;i< reqParts.length; i++){
16 var p = reqParts[i].split('=');
17 if( p.length == 2 )
18 reqParam[ p[0] ]= p[1];
19 }
20
21 addOnloadHook( function(){
22 //only do rewrites if MV_EMBED / js2 is "off"
23 if( typeof MV_EMBED_VERSION == 'undefined' ) {
24 doPageSpecificRewrite();
25 }
26 });
27
28 function doPageSpecificRewrite() {
29 // Add media wizard
30 if( wgAction == 'edit' || wgAction == 'submit' ) {
31 load_mv_embed( function() {
32 loadExternalJs( mwEmbedHostPath + '/editPage.js' + reqArguments );
33 } );
34 }
35
36 //timed text display:
37 if(wgPageName.indexOf("TimedText") === 0){
38 load_mv_embed(function(){
39 loadExternalJs( mwEmbedHostPath + '/mwEmbed/libTimedText/mvTimeTextEdit.js' + reqArguments );
40 });
41 }
42
43 // Firefogg integration
44 if( wgPageName == "Special:Upload" ){
45 load_mv_embed( function() {
46 loadExternalJs( mwEmbedHostPath + '/uploadPage.js' + reqArguments );
47 } );
48 }
49
50 // Special api proxy page
51 if( wgPageName == 'MediaWiki:ApiProxy' ){
52 var wgEnableIframeApiProxy = true;
53 load_mv_embed( function() {
54 js_log("Wiki:ApiProxy::");
55 loadExternalJs( mwEmbedHostPath + '/apiProxyPage.js' + reqArguments );
56 });
57 }
58
59 // OggHandler rewrite for view pages:
60 var vidIdList = [];
61 var divs = document.getElementsByTagName( 'div' );
62 for( var i = 0; i < divs.length; i++ ) {
63 if( divs[i].id && divs[i].id.substring( 0, 11 ) == 'ogg_player_' ) {
64 vidIdList.push( divs[i].getAttribute( "id" ) );
65 }
66 }
67 if( vidIdList.length > 0 ) {
68 load_mv_embed( function() {
69 mvJsLoader.embedVideoCheck( function() {
70 // Do utility rewrite of OggHandler content:
71 rewrite_for_OggHandler( vidIdList );
72 } );
73 } );
74 }
75 }
76 // will be depreciated in favor of updates to OggHandler
77 function rewrite_for_OggHandler( vidIdList ){
78 function procVidId( vidId ){
79 //don't process empty vids
80 if(!vidId)
81 return ;
82 js_log('vidIdList on: ' + vidId +' length: ' + vidIdList.length + ' left in the set: ' + vidIdList );
83
84 // Grab the thumbnail and src of the video
85 var pimg = $j( '#' + vidId + ' img' );
86 var poster_attr = 'poster = "' + pimg.attr( 'src' ) + '" ';
87 var pwidth = $j( '#' + vidId).width();
88 var pheight = $j( '#' + vidId + ' img').height();
89 var tag_type = 'video';
90
91 // Check for audio
92 if( pheight == '22' || pheight == '52') {
93 //set width to parent width:
94 tag_type = 'audio';
95 poster_attr = '';
96 }
97
98 // Parsed values:
99 var src = '';
100 var duration_attr = '';
101 var wikiTitleKey = $j( '#'+vidId + ' img').filter(':first').attr('src').split('/');
102 wikiTitleKey = unescape( wikiTitleKey[ wikiTitleKey.length - 2 ] );
103 var re = new RegExp( /videoUrl(&quot;:?\s*)*([^&]*)/ );
104 src = re.exec( $j( '#'+vidId ).html() )[2];
105
106 var re = new RegExp( /length(&quot;:?\s*)*([^,]*)/ );
107 var dv = re.exec( $j( '#'+vidId ).html() )[2];
108 if( dv ){
109 duration_attr = 'durationHint="'+ dv +'" ';
110 }
111
112 var re = new RegExp( /offset(&quot;:?\s*)*([^&]*)/ );
113 offset = re.exec( $j( '#'+vidId ).html() )[2];
114 var offset_attr = offset ? 'startOffset="' + offset + '"' : '';
115
116 if( src ) {
117 var html_out = '';
118
119 var common_attr = ' id="mwe_' + vidId +'" '+
120 'wikiTitleKey="' + wikiTitleKey + '" ' +
121 'src="' + src + '" ' +
122 duration_attr +
123 offset_attr + ' ';
124
125 if( tag_type == 'audio' ){
126 html_out='<audio' + common_attr + ' style="width:' + pwidth + 'px;"></audio>';
127 }else{
128 html_out='<video' + common_attr +
129 poster_attr + ' ' +
130 'style="width:' + pwidth + 'px;height:' + pheight + 'px;">' +
131 '</video>';
132 }
133 //set the video tag inner html and update the height
134 $j( '#' + vidId ).html( html_out )
135 .css('height', pheight + 30);
136
137 }
138 rewrite_by_id( 'mwe_' + vidId, function(){
139 if( vidIdList.length != 0 ){
140 setTimeout( function(){
141 procVidId( vidIdList.pop() )
142 }, 10);
143 }
144 });
145 };
146 //process each item in the vidIdList (with setTimeout to avoid locking)
147 procVidId( vidIdList.pop() );
148 }
149 function getRemoteEmbedPath() {
150 for( var i = 0; i < document.getElementsByTagName( 'script' ).length; i++ ) {
151 var s = document.getElementsByTagName( 'script' )[i];
152 if( s.src.indexOf( '/remoteMwEmbed.js' ) != -1 ) {
153 var reqStr = '';
154 var scriptPath = '';
155 if( s.src.indexOf( '?' ) != -1) {
156 reqStr = s.src.substr( s.src.indexOf( '?' ) );
157 scriptPath = s.src.substr( 0, s.src.indexOf( '?' ) ).replace( '/remoteMwEmbed.js', '' );
158 } else {
159 scriptPath = s.src.replace( '/remoteMwEmbed.js', '' )
160 }
161 // Use the external_media_wizard path:
162 return [scriptPath, reqStr];
163 }
164 }
165 }
166
167 function load_mv_embed( callback ) {
168 // Inject mv_embed if needed
169 if( typeof $mw == 'undefined' ) {
170 if( reqParam['uselang'] || reqParam['useloader'] ){
171 var rurl = mwEmbedHostPath + '/mwEmbed/jsScriptLoader.php?class=mv_embed';
172 if(typeof window.jQuery == 'undefined'){
173 rurl+= ',window.jQuery';
174 }
175 if(reqParam['urid']){
176 rurl+='&urid=' + reqParam['urid'];
177 }else{
178 rurl+='&urid=' + mwRemoteVersion;
179 }
180 if(reqParam['uselang'] )
181 rurl+='&uselang=' + reqParam['uselang'];
182 //do import url:
183 importScriptURI(rurl);
184 }else{
185 importScriptURI( mwEmbedHostPath + '/mwEmbed/mv_embed.js' + reqArguments );
186 }
187 }
188 check_for_mv_embed( callback );
189 }
190
191 function check_for_mv_embed( callback ) {
192 if( typeof $mw == 'undefined' ) {
193 setTimeout( function(){
194 check_for_mv_embed( callback );
195 }, 25 );
196 } else {
197 callback();
198 }
199 }