vxgplayer-2.8.41.js 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520
  1. window.vxgplayer = function(id, options){
  2. window.vxgplayer.version="2.8.41"; //version is updated by 'npm run build'
  3. window.vxgplayer.players = window.vxgplayer.players || {};
  4. if(!document.getElementById(id)){
  5. console.error(" Player with " + id + " did not found");
  6. return undefined;
  7. }
  8. if(!window.vxgplayer.players[id]){
  9. if(typeof chrome == "undefined"){
  10. vxgplayer.showAvailableInChrome(id);
  11. return undefined;
  12. }
  13. if(navigator.userAgent.match(/Android/i)
  14. || navigator.userAgent.match(/webOS/i)
  15. || navigator.userAgent.match(/iPhone/i)
  16. || navigator.userAgent.match(/iPad/i)
  17. || navigator.userAgent.match(/iPod/i)
  18. || navigator.userAgent.match(/BlackBerry/i)
  19. || navigator.userAgent.match(/Windows Phone/i)
  20. ){
  21. vxgplayer.showAvailableInChrome(id);
  22. return undefined;
  23. };
  24. if(!vxgplayer.browserSupportsPluginPnacl()){
  25. console.log("Not installed tvsc_player");
  26. vxgplayer.showNotInstalled(id);
  27. var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
  28. if (fs) {
  29. fs(window.TEMPORARY,100,function(){},function(){ vxgplayer.showNotInstalledInIncognitoMode(id); });
  30. }
  31. return undefined;
  32. }
  33. // magic run app
  34. var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
  35. if (!fs) {
  36. //console.log("RequestFileSystem failed");
  37. window.location.href = "http://www.truen.co.kr/tvsc_player/";
  38. } else {
  39. fs(window.TEMPORARY, 1, function(){
  40. //console.log("not in incognito mode");
  41. if(!vxgplayer.isFrame()){
  42. //console.log("Start Chrome App");
  43. window.location.href = "http://www.truen.co.kr/tvsc_player/";
  44. }
  45. },
  46. function(){
  47. console.log("Not installed tvsc_player");
  48. });
  49. }
  50. // check web socket server
  51. if(window.location.protocol != "https:" && !vxgplayer.isFrame()){
  52. vxgplayer.checkWebSocket().done(function(result){
  53. //console.log('websocket: success');
  54. }).fail(function(err){
  55. // check incognito mode
  56. fs(window.TEMPORARY,1,function(){ vxgplayer.showWebSocketFailed(id); },function(){ vxgplayer.showNotStartedInIncognitoMode(id); });
  57. });
  58. }
  59. if(window.location.protocol != "https:" && vxgplayer.isFrame()){
  60. vxgplayer.checkWebSocket().done(function(result){
  61. //console.log('websocket: success');
  62. }).fail(function(err){
  63. vxgplayer.showNotStartedInIFrame(id);
  64. });
  65. }
  66. //window.location.href = "http://www.truen.co.kr/tvsc_player/";
  67. window.vxgplayer.players[id] = new function(id, options){
  68. var self = this;
  69. self.id = id;
  70. self.player = document.getElementById(id);
  71. self.m = {};
  72. options = options || {};
  73. //check storage
  74. var storage_size = ( self.player.hasAttribute('storage') && (parseInt(self.player.getAttribute('storage', 10)) > 0) )? parseInt(self.player.getAttribute('storage', 10)):0;
  75. storage_size = storage_size * 1024 * 1024;
  76. if( storage_size < 10 * 1024 * 1024 ){
  77. storage_size = 100 * 1024 * 1024;
  78. }
  79. // Request storage usage and capacity left
  80. navigator.webkitPersistentStorage.queryUsageAndQuota(
  81. function(usedBytes, grantedBytes) {
  82. console.log("Used quota: " + usedBytes + ", Allocated quota: " + grantedBytes);
  83. if(grantedBytes <= 0){
  84. navigator.webkitPersistentStorage.requestQuota(storage_size,
  85. function(bytes)
  86. {
  87. console.log('Allocated ' + bytes + ' bytes of persistent storage.');
  88. },
  89. function(e)
  90. { alert('Failed to allocate space storage_size='+storage_size)
  91. }
  92. );
  93. }
  94. }, function(e) {
  95. navigator.webkitPersistentStorage.requestQuota(storage_size,
  96. function(bytes)
  97. {
  98. console.log('Allocated ' + bytes + ' bytes of persistent storage.');
  99. },
  100. function(e)
  101. { alert('Failed to allocate space storage_size='+storage_size)
  102. }
  103. );
  104. } );
  105. //console.log(options);
  106. var nmf_path = "media_player.nmf";
  107. var nmf_src = "pnacl/Release/media_player.nmf";
  108. var url = "";
  109. self.playerWidth=options.width || 640;
  110. self.playerHeight=options.height || 480;
  111. nmf_path = self.player.getAttribute('nmf-path') || options.nmf_path || nmf_path;
  112. nmf_src = self.player.getAttribute('nmf-src') || options.nmf_src || nmf_src;
  113. url = self.player.getAttribute('url') || options.url || "";
  114. self.playerWidth = parseInt(self.player.getAttribute('width'),10) || self.playerWidth;
  115. self.playerHeight = parseInt(self.player.getAttribute('height'),10) || self.playerHeight;
  116. self.player.style.width = self.playerWidth + 'px';
  117. self.player.style.height = self.playerHeight + 'px';
  118. var autostart_parameter = self.player.hasAttribute('autostart') ? '1' : '0';
  119. var audio_parameter = (self.player.hasAttribute('audio') && parseInt(self.player.getAttribute('audio', 10)) == 0) ? '0' : '1';
  120. var mute_parameter = (self.player.hasAttribute('mute') && parseInt(self.player.getAttribute('mute', 10)) == 1) ? '1' : '0';
  121. var html = ''
  122. + '<div class="vxgplayer-loader" style="display: inline-block"></div>'
  123. + '<div class="vxgplayer-screenshot-loading" style="display: none">'
  124. + ' <div class="vxgplayer-screenshot-loading">'
  125. + ' </div>'
  126. + '</div>'
  127. + '<div class="vxgplayer-error" style="display: none">'
  128. + ' <div class="vxgplayer-error-text" style="display: none"></div>'
  129. + '</div>'
  130. + '<div class="vxgplayer-controls-zoom-position">'
  131. + ' <div class="vxgplayer-zoom-position-cursor"></div>'
  132. + '</div>'
  133. + '<div class="vxgplayer-controls-record" style="display: none;">'
  134. + '</div>'
  135. + '<div class="vxgplayer-controls-zoom">'
  136. + ' <div class="vxgplayer-zoom-up"></div>'
  137. + ' <div class="vxgplayer-zoom-progress zoom10x"></div>'
  138. + ' <div class="vxgplayer-zoom-down"></div>'
  139. + '</div>'
  140. + '<div class="vxgplayer-controls">'
  141. + ' <div class="vxgplayer-volume-mute"></div>'
  142. + ' <div class="vxgplayer-volume-down"></div>'
  143. + ' <div class="vxgplayer-volume-progress vol7"></div>'
  144. + ' <div class="vxgplayer-volume-up"></div>'
  145. + ' <div class="vxgplayer-play"></div>'
  146. + ' <div class="vxgplayer-stop" style="display: none"></div>'
  147. +' <div class="vxgplayer-fullscreen"></div>'
  148. +' <div class="vxgplayer-takescreenshot"></div>'
  149. +' <div class="vxgplayer-scale"></div>'
  150. + '</div>'
  151. + '<embed class="vxgplayer-module" style="transform: scale(1); z-index: -1;" autostart_parameter="' + autostart_parameter + '"mute_parameter="' + mute_parameter + '"audio_parameter="' + audio_parameter + '" name="nacl_module" id="' + id + '_nacl_module" path="' + nmf_path + '" src="' + nmf_src + '" url="' + url + '" type="application/x-pnacl">';
  152. self.player.innerHTML = html;
  153. var el_controls = self.player.getElementsByClassName('vxgplayer-controls')[0];
  154. var el_controls_zoom = self.player.getElementsByClassName('vxgplayer-controls-zoom')[0];
  155. var el_controls_zoom_position = self.player.getElementsByClassName('vxgplayer-controls-zoom-position')[0];
  156. var el_play = self.player.getElementsByClassName('vxgplayer-play')[0];
  157. var el_stop = self.player.getElementsByClassName('vxgplayer-stop')[0];
  158. var el_volumeMute = self.player.getElementsByClassName('vxgplayer-volume-mute')[0];
  159. var el_volumeDown = self.player.getElementsByClassName('vxgplayer-volume-down')[0];
  160. var el_volumeProgress = self.player.getElementsByClassName('vxgplayer-volume-progress')[0];
  161. var el_volumeUp = self.player.getElementsByClassName('vxgplayer-volume-up')[0];
  162. var el_fullscreen = self.player.getElementsByClassName('vxgplayer-fullscreen')[0];
  163. var el_takescreenshot = self.player.getElementsByClassName('vxgplayer-takescreenshot')[0];
  164. var el_screenshot_loading = self.player.getElementsByClassName('vxgplayer-screenshot-loading')[0];
  165. var el_scale = self.player.getElementsByClassName('vxgplayer-scale')[0];
  166. var el_zoomUp = self.player.getElementsByClassName('vxgplayer-zoom-up')[0];
  167. var el_zoomDown = self.player.getElementsByClassName('vxgplayer-zoom-down')[0];
  168. var el_zoomProgress = self.player.getElementsByClassName('vxgplayer-zoom-progress')[0];
  169. var el_zoomPositionCursor = self.player.getElementsByClassName('vxgplayer-zoom-position-cursor')[0];
  170. var el_loader = self.player.getElementsByClassName('vxgplayer-loader')[0];
  171. var el_error = self.player.getElementsByClassName('vxgplayer-error')[0];
  172. var el_error_text = self.player.getElementsByClassName('vxgplayer-error-text')[0];
  173. var el_btnstart = document.getElementById(id + '_btnstart');
  174. var el_record = self.player.getElementsByClassName('vxgplayer-controls-record')[0];
  175. self.module = document.getElementById(id + '_nacl_module');
  176. self.module.command = function(){
  177. var cmd = [];
  178. for(var i = 0; i < arguments.length; i++){
  179. cmd.push(arguments[i]);
  180. }
  181. if(id != self.id || self.id + '_nacl_module' != self.module.id){
  182. console.error("Mixed player id");
  183. }
  184. if(self.m.debug){
  185. console.log('Player: ' + self.id + ' cmd=[' + cmd.join('] '));
  186. }
  187. self.module.postMessage(cmd);
  188. // self.module.postMessage(arguments);
  189. }
  190. // Request the offsetTop property to force a relayout. As of Apr 10, 2014
  191. // this is needed if the module is being loaded on a Chrome App's
  192. // background page (see crbug.com/350445).
  193. self.module.offsetTop;
  194. self.m.versionapp = "unknown";
  195. self.m.url = url || "";
  196. self.m.debug = options.debug || self.player.hasAttribute('debug') || false;
  197. self.m.autostart = self.player.hasAttribute('autostart');
  198. self.m.is_opened = false;
  199. self.m.latency = 10000;
  200. self.m.controls = true;
  201. self.m.avsync = options.avsync || false;
  202. self.m.volume = options.volume || 0.7;
  203. self.m.vxgReadyState = 0;
  204. self.m.autohide = options.autohide || 2000;
  205. self.m.lastErrorCode = -1;
  206. self.m.lastErrorDecoder = 0;
  207. self.m.autoreconnect = options.autoreconnect || 0;
  208. self.m.connection_timeout = options.connection_timeout || 0;
  209. self.m.connection_udp = options.connection_udp || 0;
  210. self.m.isCustomDigitalZoom = options.custom_digital_zoom || false;
  211. self.options = options;
  212. self.currentZoom = 10;
  213. self.m.lastRecordFileStarted = "";
  214. self.m.lastRecordFileStopped = "";
  215. self.m.snapshotFile = "";
  216. if(self.m.debug){
  217. console.log("Player " + self.id + " - init new player");
  218. }
  219. self.set_controls_opacity = function(val){
  220. el_controls.style.opacity = val;
  221. el_controls_zoom.style.opacity = val;
  222. el_controls_zoom_position.style.opacity = val;
  223. }
  224. self.set_controls_display = function(val){
  225. el_controls.style.display = val;
  226. if(self.m.isCustomDigitalZoom == true){
  227. el_controls_zoom.style.display = "none";
  228. el_controls_zoom_position.style.display = "none";
  229. }else{
  230. el_controls_zoom.style.display = val;
  231. el_controls_zoom_position.style.display = self.currentZoom == 10 ? "none" : "";
  232. }
  233. }
  234. self.showRecordState = function(){
  235. el_record.style.display = "inline-block";
  236. }
  237. self.hideRecordState = function(){
  238. el_record.style.display = "none";
  239. }
  240. if(self.m.isCustomDigitalZoom == false){
  241. el_controls_zoom_position.style.display = self.currentZoom == 10 ? "none" : "";
  242. }
  243. if(self.player.hasAttribute('custom-digital-zoom')){
  244. self.m.isCustomDigitalZoom = true;
  245. el_controls_zoom.style.display = "none";
  246. el_controls_zoom_position.style.display = "none";
  247. }
  248. if(!self.player.hasAttribute('controls')){
  249. self.m.controls = false;
  250. self.set_controls_display("none");
  251. }
  252. if(options.controls && options.controls == true){
  253. self.m.controls = true;
  254. self.set_controls_display("");
  255. }
  256. self.m.avsync = self.player.hasAttribute('avsync');
  257. self.m.aspectRatio = (self.player.hasAttribute('aspect-ratio') || self.player.hasAttribute('aspect-ratio-mode'))?1:0;
  258. if(self.player.hasAttribute('volume')){
  259. self.m.volume = parseFloat(self.player.getAttribute('volume'));
  260. self.m.volume = Math.ceil(self.m.volume*10)/10;
  261. //self.module.command('setvolume', self.m.volume.toFixed(1));
  262. }else if(options.volume){
  263. console.warn("TODO volume");
  264. }
  265. self.m.mute = options.mute || self.m.volume == 0 || mute_parameter == '1';
  266. if(self.m.mute){
  267. el_volumeDown.style.display='none';
  268. el_volumeProgress.style.display='none';
  269. el_volumeUp.style.display='none';
  270. }
  271. if(self.player.hasAttribute('autohide')){
  272. self.m.autohide = parseInt(self.player.getAttribute('autohide'),10)*1000;
  273. }else if(options.autohide){
  274. self.m.autohide = options.autohide*1000;
  275. }
  276. self.timeout = undefined;
  277. el_volumeProgress.className = el_volumeProgress.className.replace(/vol\d+/g,'vol' + Math.ceil(self.m.volume*10));
  278. self.loadSettings = function(){
  279. if(self.m.debug){
  280. console.log('Player ' + self.id + ' - loadSettings');
  281. }
  282. if(self.player.hasAttribute('useragent-prefix')){
  283. self.module.command('setuseragent', self.player.getAttribute('useragent-prefix') + ' ' + navigator.userAgent)
  284. }else if(options.useragent_prefix){
  285. self.module.command('setuseragent', self.options.useragent_prefix + ' ' + navigator.userAgent)
  286. }
  287. self.module.command('setversion', window.vxgplayer.version);
  288. //self.m.autoreconnect = 0;
  289. if(self.player.hasAttribute('auto-reconnect') || self.options.autoreconnect){
  290. self.m.autoreconnect = 1;
  291. self.module.command('setautoreconnect', '1');
  292. }
  293. if(self.player.hasAttribute('connection-timeout')){
  294. self.m.connection_timeout = parseInt(self.player.getAttribute('connection-timeout'), 10);
  295. }
  296. if(self.options.connection_timeout != 0){
  297. self.module.command('setconnection_timeout', self.m.connection_timeout.toString());
  298. }
  299. if(self.player.hasAttribute('connection-udp') || self.m.connection_udp){
  300. self.m.connection_udp = 1;
  301. self.module.command('setconnection_udp', '1');
  302. }
  303. self.m.avsync = self.player.hasAttribute('avsync');
  304. self.m.aspectRatio = (self.player.hasAttribute('aspect-ratio') || self.player.hasAttribute('aspect-ratio-mode'))?1:0;
  305. if(self.player.hasAttribute('aspect-ratio-mode')){
  306. self.m.aspectRatio = parseInt(self.player.getAttribute('aspect-ratio-mode'), 10);
  307. }else if(self.options.aspect_ratio_mode){
  308. self.m.aspectRatio = self.options.aspect_ratio_mode;
  309. }
  310. self.m.aspectRatioMode = (self.m.aspectRatio !=0) ? self.m.aspectRatio:1;
  311. self.module.command('setaspectratio', self.m.aspectRatio.toString());
  312. self.module.command('setavsync', self.m.avsync ? '1' : '0');
  313. if(self.player.hasAttribute('latency')){
  314. self.m.latency = parseInt(self.player.getAttribute('latency'), 10);
  315. self.module.command('setlatency', self.m.latency.toString());
  316. }else if(self.options.latency){
  317. self.m.latency = self.options.latency;
  318. self.module.command('setlatency', self.m.latency.toString());
  319. }
  320. if(self.player.hasAttribute('volume')){
  321. self.m.volume = parseFloat(self.player.getAttribute('volume'));
  322. self.m.volume = Math.ceil(self.m.volume*10)/10;
  323. self.module.command('setvolume', self.m.volume.toFixed(1));
  324. }else if(self.options.volume){
  325. console.warn("TODO volume");
  326. }
  327. self.m.mute = self.options.mute || self.m.volume == 0;
  328. if(self.m.mute){
  329. el_volumeDown.style.display='none';
  330. el_volumeProgress.style.display='none';
  331. el_volumeUp.style.display='none';
  332. }
  333. if(self.player.hasAttribute('autohide')){
  334. self.m.autohide = parseInt(self.player.getAttribute('autohide'),10)*1000;
  335. }else if(self.options.autohide){
  336. self.m.autohide = self.options.autohide*1000;
  337. }
  338. }
  339. self.moduleDidLoad = function(){
  340. if(self.m.debug){
  341. console.log('Player ' + self.id + ' - moduleDidLoad');
  342. }
  343. self.loadSettings();
  344. if(window.location.protocol == "https:"){
  345. //use Native protocol
  346. self.connectToApp();
  347. }else{
  348. //use Websocket protocol
  349. self.module.command('startwebsclient', vxgplayer.webserverport)
  350. }
  351. }
  352. self.playerDidLoad = function(){
  353. if(self.m.debug){
  354. console.log('Player ' + self.id + " - playerDidLoad");
  355. }
  356. el_loader.style.display = "none";
  357. if(self.onReadyStateCallback){
  358. self.m.is_opened = false;
  359. self.onReadyStateCallback();
  360. }else{
  361. self.src(self.m.url);
  362. }
  363. }
  364. self.connectToApp = function(){
  365. if(self.m.debug){
  366. console.log('Player ' + self.id + ' connectToApp');
  367. }
  368. self.m.port = chrome.runtime.connect("gdbhiablbpcfmmiocddaoaekfommkfhp");
  369. //self.m.port = chrome.runtime.connect("invalid");
  370. if(self.m.debug){
  371. console.log('Player ' + self.id + ' connected port='+self.m.port);
  372. }
  373. self.m.port.name = ""+ new Date().getTime();
  374. self.m.port.onDisconnect.addListener(function(){
  375. if(self.m.debug)
  376. console.log('disconnected port.name='+self.m.port.name);
  377. self.module.command( 'stopnativeclient', '@'+self.m.port.name);
  378. self.m.port = undefined;
  379. });
  380. if(self.m.debug)
  381. console.log('connected port.name='+self.m.port.name);
  382. self.m.port.onMessage.addListener(function(msg) {
  383. if( msg != undefined && msg.id == undefined && msg[0] != undefined && msg[0].charAt(0) == '@'){
  384. self.module.postMessage(msg);
  385. }else
  386. if( msg != undefined && msg.cmd == 'getversionapp'){
  387. if(0 == msg.data.indexOf("VERSION_APP")){
  388. self.m.versionapp = msg.data.split(' ')[1];
  389. if(self.m.debug){
  390. console.log('Player ' + self.id + ' =VERSION_APP '+self.m.versionapp);
  391. }
  392. self.module.command( 'setappversion', self.m.versionapp);
  393. self.module.command( 'startnativeclient', '@'+self.m.port.name);
  394. self.playerDidLoad();
  395. }else{
  396. console.log('Player ' + self.id + ' Invalid VERSION_APP msg.data='+msg.data);
  397. }
  398. }else{
  399. console.log('Player ' + self.id + 'getversionapp unknown msg=', msg);
  400. }
  401. });
  402. self.m.port.postMessage({id: ""+self.m.port.name, cmd: "getversionapp", data: ""} );
  403. }
  404. self.showerror = function(text){
  405. el_loader.style.display = "none";
  406. el_error.style.display = "inline-block";
  407. el_error_text.style.display = "inline-block";
  408. el_error_text.innerHTML = text;
  409. }
  410. self.hideerror = function(text){
  411. el_error.style.display = "none";
  412. el_error_text.style.display = "none";
  413. }
  414. self.readyState = function(){
  415. return self.m.vxgReadyState;
  416. }
  417. self.onReadyStateChange = function(cb){
  418. self.onReadyStateCallback = cb;
  419. }
  420. self.ready = self.onReadyStateChange;
  421. self.onStateChange = function(cb){
  422. self.onStateChangeCallback = cb;
  423. }
  424. self.onBandwidthError = function(cb){
  425. self.m.handlerBandwidthError = cb;
  426. }
  427. self.onError = function(cb){
  428. self.m.handlerError = cb;
  429. }
  430. self.onRecord = function(cb){
  431. self.m.handleRecord = cb;
  432. }
  433. self.handleMessage = function(msgEvent){
  434. if(self.m.debug){
  435. console.log('Player ' + self.id + ' handleMessage: ' + msgEvent.data);
  436. }
  437. if(msgEvent == undefined || msgEvent.data == undefined)
  438. return;
  439. if(msgEvent.data[0] != undefined && msgEvent.data[0].charAt(0) == '@'){
  440. //proto native send to app
  441. if(self.m.port != undefined)
  442. self.m.port.postMessage(msgEvent.data);
  443. }else if(0 == msgEvent.data.indexOf("PLAYER_INITED")){
  444. self.moduleDidLoad();
  445. }else if(0 == msgEvent.data.indexOf("PLAYER_INIT_ERR")){
  446. str = "PLAYER_INIT_ERR ";
  447. err = parseInt(msgEvent.data.split(' ')[1], 10);
  448. err_type = (err >> 16)&0xffff;
  449. console.log('err_type='+err_type);
  450. switch(err_type){
  451. case 4:
  452. str += "Init audio output error ";
  453. break;
  454. case 2:
  455. str += "Init video decoder error ";
  456. break;
  457. default:
  458. str += "Init D3D error ";
  459. break;
  460. }
  461. str += ""+err.toString();
  462. vxgplayer.showInitFailed(id, str);
  463. }else
  464. // Player source error=60935 WSS status=6
  465. // Player listener2: Skip picture: 170, frame_duration: 41, latencyms: 0<=frames_buf:0, b: 0, p: 0
  466. if(0 == msgEvent.data.indexOf("VERSION_APP")){
  467. self.m.versionapp = msgEvent.data.split(' ')[1];
  468. if(self.m.debug)
  469. console.log('=VERSION_APP '+self.m.versionapp);
  470. self.playerDidLoad();
  471. }else if(0 == msgEvent.data.indexOf("RECORD_STARTED")){
  472. self.showRecordState();
  473. self.m.lastRecordFileStarted = msgEvent.data.split(' ')[1];
  474. if(self.m.handleRecord){
  475. self.m.handleRecord(self, "RECORD_STARTED", self.m.lastRecordFileStarted);
  476. }
  477. }else if(0 == msgEvent.data.indexOf("RECORD_STOPPED")){
  478. self.hideRecordState();
  479. self.m.lastRecordFileStopped = msgEvent.data.split(' ')[1];
  480. if(self.m.handleRecord){
  481. self.m.handleRecord(self, "RECORD_STOPPED", self.m.lastRecordFileStopped);
  482. }
  483. }else if(0 == msgEvent.data.indexOf("RECORD_WRITE")){
  484. if(self.m.handleRecord){
  485. self.m.handleRecord(self, msgEvent.data, self.m.lastRecordFileStarted);
  486. }
  487. navigator.webkitPersistentStorage.queryUsageAndQuota(
  488. function(usedBytes, grantedBytes) {
  489. if( (grantedBytes - usedBytes) < 8 * 1024 * 1024){
  490. console.log("Storage. No free space. Used quota: " + usedBytes + ", Allocated quota: " + grantedBytes);
  491. if(self.m.handleRecord){
  492. self.m.handleRecord(self, "RECORD_FULL", self.m.lastRecordFileStarted);
  493. }
  494. self.record_stop();
  495. }
  496. }, function(e) {
  497. } );
  498. }else if(0 == msgEvent.data.indexOf("RECORD_ERROR")){
  499. if(self.m.handleRecord){
  500. self.m.handleRecord(self, msgEvent.data, self.m.lastRecordFileStarted);
  501. self.record_stop();
  502. }
  503. }else if(0 == msgEvent.data.indexOf("TAKE_SNAPSHOT")){
  504. snap_status = msgEvent.data.split(' ')[1];
  505. if(0 != snap_status.indexOf("ERROR")){
  506. self.m.snapshotFile = snap_status;
  507. window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
  508. window.requestFileSystem(window.TEMPORARY, 1, function(fs) {
  509. fs.root.getFile(self.m.snapshotFile, {create: false}, function(fileEntry) { // /test is filename
  510. var pom = document.createElement('a');
  511. pom.setAttribute('href', fileEntry.toURL());
  512. pom.setAttribute('download', "snapshot.jpg");
  513. pom.style.display = 'none';
  514. document.body.appendChild(pom);
  515. pom.click();
  516. document.body.removeChild(pom);
  517. }, function(e) {
  518. console.error("[VXGPLAYER] TAKE_SNAPSHOT fs.root.getFile FAILED")
  519. });
  520. }, function(e) {
  521. console.error("[VXGPLAYER] TAKE_SNAPSHOT requestFileSystem window.TEMPORARY FAILED")
  522. });
  523. }
  524. }else if(msgEvent.data == "MEDIA_ERR_URL"){
  525. self.showerror('Problem with URL');
  526. self.m.lastErrorCode = 0;
  527. if(self.m.handlerError)
  528. self.m.handlerError(self);
  529. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_NETWORK")){
  530. self.showerror('Problem with network');
  531. self.m.lastErrorCode = 1;
  532. if(self.m.handlerError)
  533. self.m.handlerError(self);
  534. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_SOURCE")){
  535. //self.showerror('Problem with source');
  536. el_loader.style.display = "none";
  537. self.m.lastErrorCode = 2;
  538. if(self.m.handlerError)
  539. self.m.handlerError(self);
  540. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_CARRIER")){
  541. self.showerror('Problem with carrier');
  542. self.m.lastErrorCode = 3;
  543. if(self.m.handlerError)
  544. self.m.handlerError(self);
  545. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_AUDIO")){
  546. self.showerror('Problem with audio');
  547. self.m.lastErrorCode = 4;
  548. if(self.m.handlerError)
  549. self.m.handlerError(self);
  550. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_VIDEO")){
  551. self.showerror('Problem with video');
  552. self.m.lastErrorCode = 5;
  553. if(self.m.handlerError)
  554. self.m.handlerError(self);
  555. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_AUTHENTICATION")){
  556. self.showerror('Problem with authentification');
  557. self.m.lastErrorCode = 6;
  558. if(self.m.handlerError)
  559. self.m.handlerError(self);
  560. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_BANDWIDTH")){
  561. //self.stop();
  562. self.m.lastErrorCode = 7;
  563. if(self.m.handlerError)
  564. self.m.handlerError(self);
  565. if(self.m.handlerBandwidthError){
  566. self.m.handlerBandwidthError(self);
  567. }else{
  568. //self.showerror('Problem with bandwidth');
  569. }
  570. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_EOF")){
  571. self.showerror('End of File');
  572. self.m.lastErrorCode = 8;
  573. if(self.m.handlerError)
  574. self.m.handlerError(self);
  575. }else if(0 == msgEvent.data.indexOf("MEDIA_ERR_DECODER")){
  576. var arr = msgEvent.data.split(' ');
  577. self.m.lastErrorDecoder = (arr.length > 1) ? parseInt(arr[1],10) : 0;
  578. if(self.m.debug)
  579. console.log('=MEDIA_ERR_DECODER '+self.m.lastErrorDecoder + ' ' + (self.m.lastErrorDecoder == 0)?'Decoder resumed':'');
  580. if(self.m.lastErrorDecoder == 0){
  581. self.m.lastErrorCode = -1;
  582. //self.hideerror();
  583. }else{
  584. self.m.lastErrorCode = 9;
  585. //self.showerror('Decoder error '+self.m.lastErrorDecoder);
  586. }
  587. if(self.m.handlerError)
  588. self.m.handlerError(self);
  589. }else if(0 == msgEvent.data.indexOf("PLAYER_CONNECTING")){
  590. self.m.vxgReadyState = 1;
  591. //el_play.style.display = "none";
  592. // el_stop.style.display = "none";
  593. // self.hideerror();
  594. el_loader.style.display = "inline-block";
  595. el_takescreenshot.style.display = "none";
  596. if(self.onStateChangeCallback)
  597. self.onStateChangeCallback(self.m.vxgReadyState);
  598. }else if(0 == msgEvent.data.indexOf("PLAYER_PLAYING")){
  599. self.m.vxgReadyState = 2;
  600. el_play.style.display = "none";
  601. el_stop.style.display = "inline-block";
  602. el_takescreenshot.style.display = "inline-block";
  603. self.hideerror();
  604. el_loader.style.display = "none";
  605. if(self.onStateChangeCallback)
  606. self.onStateChangeCallback(self.m.vxgReadyState);
  607. }else if(0 == msgEvent.data.indexOf("PLAYER_STOPPING")){
  608. self.m.vxgReadyState = 3;
  609. // el_error.style.display = "none";
  610. // el_loader.style.display = "inline-block";
  611. el_play.style.display = "none";
  612. el_stop.style.display = "none";
  613. el_takescreenshot.style.display = "none";
  614. }else if(0 == msgEvent.data.indexOf("PLAYER_STOPPED")){
  615. self.m.vxgReadyState = 0;
  616. el_play.style.display = "inline-block";
  617. el_stop.style.display = "none";
  618. el_takescreenshot.style.display = "none";
  619. if(self.onStateChangeCallback)
  620. self.onStateChangeCallback(self.m.vxgReadyState);
  621. }
  622. }
  623. self.handleError = function(){
  624. el_loader.style.display = "none";
  625. el_error.style.display = "block";
  626. console.error("ERROR");
  627. self.showerror('Unknown error');
  628. }
  629. self.handleCrash = function(){
  630. el_loader.style.display = "none";
  631. el_error.style.display = "block";
  632. self.showerror('Crashed');
  633. }
  634. self.restartTimeout = function(){
  635. if(self.m.autohide <= 0){
  636. self.set_controls_opacity("0");
  637. return;
  638. }
  639. self.set_controls_opacity("0.7");
  640. clearTimeout(self.timeout);
  641. self.timeout = setTimeout(function(){
  642. self.set_controls_opacity("0");
  643. },self.m.autohide);
  644. };
  645. self.player.addEventListener('mousemove', function(){
  646. self.restartTimeout();
  647. }, true);
  648. self.restartTimeout();
  649. //self.module.addEventListener('load', self.moduleDidLoad, true);
  650. self.module.addEventListener('message', self.handleMessage, true);
  651. self.module.addEventListener('error', self.handleError, true);
  652. self.module.addEventListener('crash', self.handleCrash, true);
  653. if (typeof window.attachListeners !== 'undefined') {
  654. window.attachListeners();
  655. }
  656. self.error = function(){
  657. return self.m.lastErrorCode;
  658. }
  659. self.errorDecoder = function(){
  660. return self.m.lastErrorDecoder;
  661. }
  662. self.controls = function(val){
  663. if(val == undefined){
  664. return self.m.controls;
  665. }else{
  666. if(val == true){
  667. self.set_controls_display("");
  668. self.m.controls = true;
  669. }else if(val == false){
  670. self.set_controls_display("none");
  671. self.m.controls = false;
  672. }
  673. }
  674. }
  675. self.debug = function(val){
  676. if(val == undefined){
  677. return self.m.debug;
  678. }else{
  679. self.m.debug = val;
  680. }
  681. }
  682. self.play = function(){
  683. self.hideerror();
  684. if(self.m.debug)
  685. console.log( 'self.play self.m.url='+self.m.url + ' self.m.is_opened='+self.m.is_opened);
  686. if(self.m.url.length < 1){
  687. console.log("invalid url");
  688. return;
  689. }
  690. if(!self.m.is_opened){
  691. self.m.is_opened = true;
  692. self.module.command('open', self.m.url);
  693. }
  694. el_play.style.display = "none";
  695. el_loader.style.display = "inline-block";
  696. self.module.command('play', '0');
  697. self.module.command('setvolume', self.m.volume.toFixed(1));
  698. };
  699. self.stop = function(){
  700. self.module.command('stop', '0');
  701. el_loader.style.display = "none";
  702. };
  703. self.pause = function(){
  704. self.module.command('pause', '0');
  705. el_loader.style.display = "none";
  706. };
  707. self.autohide = function(val){
  708. if(val){
  709. self.m.autohide = val*1000;
  710. }else{
  711. return self.m.autohide/1000;
  712. }
  713. }
  714. self.autoreconnect = function(val){
  715. if(val == undefined){
  716. return self.m.autoreconnect;
  717. }else{
  718. self.m.autoreconnect = parseInt(val,10);
  719. self.module.command('setautoreconnect', self.m.autoreconnect.toString());
  720. }
  721. };
  722. self.latency = function(val){
  723. if(val){
  724. self.m.latency = parseInt(val,10);
  725. self.module.command('setlatency', val.toString());
  726. }else{
  727. return self.m.latency;
  728. }
  729. };
  730. self.connection_timeout = function(val){
  731. if(val){
  732. self.m.connection_timeout = parseInt(val,10);
  733. self.module.command('setconnection_timeout', val.toString());
  734. }else{
  735. return self.m.connection_timeout;
  736. }
  737. };
  738. self.connection_udp = function(val){
  739. if(val){
  740. self.m.connection_udp = parseInt(val,10);
  741. self.module.command('setconnection_udp', val.toString());
  742. }else{
  743. return self.m.connection_udp;
  744. }
  745. };
  746. self.aspectRatio = function(val){
  747. if(val == undefined){
  748. return self.m.aspectRatio?true:false;
  749. }else{
  750. self.m.aspectRatio = (val)?self.m.aspectRatioMode:0;
  751. self.module.command('setaspectratio', self.m.aspectRatio.toString());
  752. }
  753. }
  754. self.aspectRatioMode = function(val){
  755. if(val == undefined){
  756. return self.m.aspectRatioMode;
  757. }else{
  758. self.m.aspectRatioMode = (val > 0)?val:self.m.aspectRatioMode;
  759. self.m.aspectRatio = val;
  760. self.module.command('setaspectratio', self.m.aspectRatio.toString());
  761. }
  762. }
  763. self.avsync = function(val){
  764. if(val == undefined){
  765. return self.m.avsync;
  766. }else{
  767. self.m.avsync = val;
  768. self.module.command('setavsync', self.m.avsync ? '1':'0');
  769. }
  770. }
  771. self.isMute = function(){
  772. return self.m.mute;
  773. }
  774. self.isPlaying = function(){
  775. return (self.m.vxgReadyState == 2);
  776. }
  777. self.versionPLG = function(){
  778. return window.vxgplayer.version;
  779. }
  780. self.versionAPP = function(){
  781. return self.m.versionapp;
  782. }
  783. self.mute = function(){
  784. self.restartTimeout();
  785. self.m.mute = !self.m.mute;
  786. if(self.m.mute){
  787. el_volumeDown.style.display='none';
  788. el_volumeProgress.style.display='none';
  789. el_volumeUp.style.display='none';
  790. el_volumeProgress.className = el_volumeProgress.className.replace(/vol\d+/g,'vol0')
  791. }else{
  792. el_volumeDown.style.display='inline-block';
  793. el_volumeProgress.style.display='inline-block';
  794. el_volumeUp.style.display='inline-block';
  795. el_volumeProgress.className = el_volumeProgress.className.replace(/vol\d+/g,'vol' + Math.floor(self.m.volume*10));
  796. }
  797. self.module.command('setvolume', self.m.mute? '0': '' + self.m.volume);
  798. }
  799. self.volume = function(val){
  800. if(val != undefined){
  801. val = val > 1 ? 1 : val;
  802. val = val < 0 ? 0 : val;
  803. self.m.volume = Math.ceil(val*10)/10;
  804. self.module.command('setvolume', self.m.volume.toFixed(1));
  805. el_volumeProgress.className = el_volumeProgress.className.replace(/vol\d+/g,'vol' + Math.ceil(self.m.volume*10));
  806. }else{
  807. return self.m.volume;
  808. }
  809. }
  810. self.volup = function(){
  811. self.restartTimeout();
  812. if(Math.round(self.m.volume*10) < 10){
  813. self.m.volume = self.m.volume + 0.1;
  814. self.module.command('setvolume', self.m.volume.toFixed(1));
  815. el_volumeProgress.className = el_volumeProgress.className.replace(/vol\d+/g,'vol' + Math.ceil(self.m.volume*10));
  816. }
  817. };
  818. self.voldown = function(){
  819. self.restartTimeout();
  820. if(Math.round(self.m.volume*10) > 0){
  821. self.m.volume = self.m.volume - 0.1;
  822. self.module.command('setvolume', self.m.volume.toFixed(1));
  823. el_volumeProgress.className = el_volumeProgress.className.replace(/vol\d+/g,'vol' + Math.floor(self.m.volume*10));
  824. }
  825. };
  826. self.size = function(width, height){
  827. if(width && height){
  828. if(Number.isInteger(width) && Number.isInteger(height)){
  829. var w = parseInt(width,10);
  830. var h = parseInt(height,10);
  831. self.playerWidth = self.playerWidth != w ? w : self.playerWidth;
  832. self.playerHeight = self.playerHeight != h ? h : self.playerHeight;
  833. self.player.style.width = width + 'px';
  834. self.player.style.height = height + 'px';
  835. }else{
  836. self.player.style.width = width;
  837. self.player.style.height = height;
  838. }
  839. }else{
  840. return { width: self.playerWidth, height: self.playerHeight };
  841. }
  842. };
  843. self.changedFullscreen = function(){
  844. console.log('changedFullscreen');
  845. if (document.webkitIsFullScreen){
  846. self.size('100%', '100%');
  847. console.log('changedFullscreen -> fullscreen');
  848. }else{
  849. self.size(self.playerWidth + 'px', self.playerHeight + 'px');
  850. console.log('changedFullscreen -> NOT fullscreen');
  851. }
  852. };
  853. if (document.addEventListener){
  854. document.addEventListener('webkitfullscreenchange', self.changedFullscreen, false);
  855. document.addEventListener('mozfullscreenchange', self.changedFullscreen, false);
  856. document.addEventListener('fullscreenchange', self.changedFullscreen, false);
  857. document.addEventListener('MSFullscreenChange', self.changedFullscreen, false);
  858. }
  859. self.fullscreen = function(){
  860. console.log("fullscreen: clicked");
  861. if(document.webkitIsFullScreen == true){
  862. document.webkitCancelFullScreen();
  863. }else{
  864. if(self.player.requestFullscreen) {
  865. self.player.requestFullscreen();
  866. } else if(self.player.webkitRequestFullscreen) {
  867. self.player.webkitRequestFullscreen();
  868. } else if(self.player.mozRequestFullscreen) {
  869. self.player.mozRequestFullScreen();
  870. }
  871. }
  872. };
  873. self.takescreenshot = function(){
  874. self.module.command('take_snapshot', '1');
  875. el_screenshot_loading.style.display = "block";
  876. setTimeout(function(){
  877. el_screenshot_loading.style.display = "";
  878. },5000);
  879. };
  880. self.src = function(url){
  881. if(url != undefined){
  882. self.m.url = url;
  883. console.log('Player ' + self.id+' src='+self.m.url+' autostart='+self.m.autostart+' is_opened='+self.m.is_opened);
  884. if(self.m.url.length > 0 && self.m.autostart){
  885. self.m.is_opened = true;
  886. self.module.command('open', url);
  887. }else{
  888. self.m.is_opened = false;
  889. //el_play.style.display = "inline-block";
  890. //el_stop.style.display = "none";
  891. //el_loader.style.display = 'none';
  892. self.stop();
  893. }
  894. }else{
  895. return self.m.url;
  896. }
  897. }
  898. self.dispose = function(){
  899. self.player.innerHTML = "";
  900. delete window.vxgplayer.players[self.id];
  901. }
  902. self.custom_digital_zoom = function(newval){
  903. if(newval != undefined){
  904. if(self.m.isCustomDigitalZoom == false && newval == true){
  905. self.m.isCustomDigitalZoom = true;
  906. self.setCustomDigitalZoom(100,0,0); // reset
  907. self.set_controls_display("");
  908. }else if(self.m.isCustomDigitalZoom == true && newval == false){
  909. self.m.isCustomDigitalZoom = false;
  910. self.set_controls_display("");
  911. self.setNewZoom(10);
  912. }
  913. }else{
  914. return self.m.isCustomDigitalZoom;
  915. }
  916. }
  917. self.setCustomDigitalZoom = function(ratio, x, y){
  918. if (ratio !== parseInt(ratio, 10) || x !== parseInt(x, 10) || y !== parseInt(y, 10)){
  919. throw "[VXGPLAYER] setDigitalZoom / Some values is not integer";
  920. }
  921. if(ratio < 100 || ratio > 1000){
  922. throw "[VXGPLAYER] setDigitalZoom / Parameter Ratio must be 100..1000";
  923. }
  924. if(self.m.isCustomDigitalZoom != true){
  925. throw "[VXGPLAYER] setDigitalZoom / Please enable custom digital zoom";
  926. }
  927. self.module.style.transform = "scale(" + (ratio/100) + ")";
  928. el_controls_zoom_position.style.display = "none";
  929. var s = self.size();
  930. var newx = x - s.width/2;
  931. var newy = y - s.height/2;
  932. var neww = s.width*(100/ratio);
  933. var newh = s.height*(100/ratio);
  934. var left = Math.floor(-100*(newx + neww/2)/neww);
  935. var top = Math.floor(-100*(newy + newh/2)/newh);
  936. self.module.style.left = left + '%';
  937. self.module.style.top = top + '%';
  938. }
  939. self.setNewZoom = function(v){
  940. if(v >= 30){ v = 30; }
  941. if(v <= 10){ v = 10; }
  942. if(self.currentZoom != v){
  943. self.currentZoom = v;
  944. self.module.style.transform = "scale(" + (self.currentZoom/10) + ")";
  945. el_zoomPositionCursor.style.transform = "scale(" + (10/self.currentZoom) + ")";
  946. el_zoomProgress.className = el_zoomProgress.className.replace(/zoom\d+x/g,'zoom' + Math.ceil(self.currentZoom) + 'x');
  947. el_controls_zoom_position.style.display = self.currentZoom == 10 ? "none" : "";
  948. self.module.style.left = '';
  949. self.module.style.top = '';
  950. el_zoomPositionCursor.style.left = '';
  951. el_zoomPositionCursor.style.top = '';
  952. }
  953. }
  954. self.zoomUp = function(){
  955. self.setNewZoom(self.currentZoom + 5)
  956. }
  957. self.zoomDown = function(){
  958. self.setNewZoom(self.currentZoom - 5);
  959. }
  960. self.zoomProgressDownBool = false;
  961. self.zoomProgressDown = function(e){
  962. self.zoomProgressDownBool = true;
  963. }
  964. self.zoomProgressMove = function(e){
  965. if(self.zoomProgressDownBool == true){
  966. var y = e.pageY - vxgplayer.getAbsolutePosition(e.currentTarget).y;
  967. var height = el_zoomProgress.offsetHeight;
  968. var steps = height/5;
  969. y = 10*(Math.floor((height-y)/steps)/2 + 1);
  970. self.setNewZoom(y);
  971. }
  972. }
  973. self.zoomProgressLeave = function(e){
  974. self.zoomProgressDownBool = false;
  975. }
  976. self.zoomProgressUp = function(e){
  977. if(self.zoomProgressDownBool == true){
  978. var y = e.pageY - vxgplayer.getAbsolutePosition(e.currentTarget).y;
  979. var height = el_zoomProgress.offsetHeight;
  980. var steps = height/5;
  981. y = 10*(Math.floor((height-y)/steps)/2 + 1);
  982. self.setNewZoom(y);
  983. }
  984. self.zoomProgressDownBool = false;
  985. }
  986. self.zoomCursorDownBool = false;
  987. self.zoomCursorX = 0;
  988. self.zoomCursorY = 0;
  989. self.zoomCursorWidth = 160;
  990. self.zoomCursorHeight = 120;
  991. self.zoomControlsWidth = 0;
  992. self.zoomControlsHeight = 0;
  993. self.zoomCursorDown = function(e){
  994. self.zoomCursorX = e.pageX;
  995. self.zoomCursorY = e.pageY;
  996. self.zoomCursorWidth = el_zoomPositionCursor.offsetWidth;
  997. self.zoomCursorHeight = el_zoomPositionCursor.offsetHeight;
  998. self.zoomControlsWidth = el_controls_zoom_position.offsetWidth;
  999. self.zoomControlsHeight = el_controls_zoom_position.offsetHeight;
  1000. self.zoomCursorDownBool = true;
  1001. }
  1002. self.zoomCursorUp = function(e){
  1003. console.log("zoomCursorUp");
  1004. self.zoomCursorDownBool = false;
  1005. }
  1006. self.zoomCursorMove = function(e){
  1007. if(self.zoomCursorDownBool == true){
  1008. var diffX = self.zoomCursorX - e.pageX;
  1009. var diffY = self.zoomCursorY - e.pageY;
  1010. self.zoomCursorX = e.pageX;
  1011. self.zoomCursorY = e.pageY;
  1012. var newx = el_zoomPositionCursor.offsetLeft - diffX;
  1013. var newy = el_zoomPositionCursor.offsetTop - diffY;
  1014. var d2x = (self.zoomControlsWidth - self.zoomCursorWidth*(10/self.currentZoom));
  1015. var d2y = (self.zoomControlsHeight - self.zoomCursorHeight*(10/self.currentZoom));
  1016. var minX = -1*d2x/2;
  1017. var maxX = d2x/2;
  1018. var minY = -1*d2y/2;
  1019. var maxY = d2y/2;
  1020. if(newx < minX) newx = minX;
  1021. if(newy < minY) newy = minY;
  1022. if(newx >= maxX) newx = maxX;
  1023. if(newy >= maxY) newy = maxY;
  1024. el_zoomPositionCursor.style.left = newx + "px";
  1025. el_zoomPositionCursor.style.top = newy + "px";
  1026. var zoom = self.currentZoom/10 - 1;
  1027. var left = Math.floor(-100*((newx/d2x)*zoom));
  1028. var top = Math.floor(-100*((newy/d2y)*zoom));
  1029. self.module.style.left = left + '%';
  1030. self.module.style.top = top + '%';
  1031. }
  1032. }
  1033. self.record_start = function(){
  1034. // Request storage usage and capacity left
  1035. navigator.webkitPersistentStorage.queryUsageAndQuota(
  1036. function(usedBytes, grantedBytes) {
  1037. if(grantedBytes - usedBytes < (8 * 1024 * 1024)){
  1038. console.log("Storage. No free space. Used quota: " + usedBytes + ", Allocated quota: " + grantedBytes);
  1039. if(self.m.handleRecord){
  1040. self.m.handleRecord(self, "RECORD_FULL", self.m.lastRecordFileStarted);
  1041. }
  1042. }else{
  1043. self.module.command('record_start', grantedBytes.toString());
  1044. }
  1045. }, function(e) {
  1046. } );
  1047. //self.module.command('record_start', '0');
  1048. };
  1049. self.record_stop = function(){
  1050. self.module.command('record_stop', '0');
  1051. };
  1052. self.backward_start = function(){
  1053. var stream;
  1054. function ba_success(s) {
  1055. stream = s;
  1056. console.log("backward_start OK " + s);
  1057. self.module.postMessage({track: stream.getAudioTracks()[0]});
  1058. }
  1059. function ba_failure(e) {
  1060. console.log("backward_start Error: " + e);
  1061. }
  1062. navigator.webkitGetUserMedia({'audio': true}, ba_success, ba_failure);
  1063. self.module.command('backward_start', '0');
  1064. };
  1065. self.backward_stop = function(){
  1066. self.module.command('backward_stop', '0');
  1067. function ba_success(s) {
  1068. //s.stop();
  1069. s.getTracks().forEach(function(track) {
  1070. track.stop();
  1071. console.log("backward_stop track stop " + track);
  1072. });
  1073. console.log("backward_stop OK " + s);
  1074. }
  1075. function ba_failure(e) {
  1076. console.log("backward_stop Error: " + e);
  1077. }
  1078. navigator.webkitGetUserMedia({'audio': true}, ba_success, ba_failure);
  1079. };
  1080. self.record_file_started = function(){
  1081. return self.m.lastRecordFileStarted;
  1082. }
  1083. self.record_file_stopped = function(){
  1084. return self.m.lastRecordFileStopped;
  1085. }
  1086. self.setNewZoom = function(v){
  1087. if(v >= 30){ v = 30; }
  1088. if(v <= 10){ v = 10; }
  1089. if(self.currentZoom != v){
  1090. self.currentZoom = v;
  1091. self.module.style.transform = "scale(" + (self.currentZoom/10) + ")";
  1092. el_zoomPositionCursor.style.transform = "scale(" + (10/self.currentZoom) + ")";
  1093. el_zoomProgress.className = el_zoomProgress.className.replace(/zoom\d+x/g,'zoom' + Math.ceil(self.currentZoom) + 'x');
  1094. el_controls_zoom_position.style.display = self.currentZoom == 10 ? "none" : "";
  1095. self.module.style.left = '';
  1096. self.module.style.top = '';
  1097. el_zoomPositionCursor.style.left = '';
  1098. el_zoomPositionCursor.style.top = '';
  1099. }
  1100. }
  1101. self.zoomUp = function(){
  1102. self.setNewZoom(self.currentZoom + 5)
  1103. }
  1104. self.zoomDown = function(){
  1105. self.setNewZoom(self.currentZoom - 5);
  1106. }
  1107. self.zoomProgressDownBool = false;
  1108. self.zoomProgressDown = function(e){
  1109. self.zoomProgressDownBool = true;
  1110. }
  1111. self.zoomProgressMove = function(e){
  1112. if(self.zoomProgressDownBool == true){
  1113. var y = e.pageY - vxgplayer.getAbsolutePosition(e.currentTarget).y;
  1114. var height = el_zoomProgress.offsetHeight;
  1115. var steps = height/5;
  1116. y = 10*(Math.floor((height-y)/steps)/2 + 1);
  1117. self.setNewZoom(y);
  1118. }
  1119. }
  1120. self.zoomProgressLeave = function(e){
  1121. self.zoomProgressDownBool = false;
  1122. }
  1123. self.zoomProgressUp = function(e){
  1124. if(self.zoomProgressDownBool == true){
  1125. var y = e.pageY - vxgplayer.getAbsolutePosition(e.currentTarget).y;
  1126. var height = el_zoomProgress.offsetHeight;
  1127. var steps = height/5;
  1128. y = 10*(Math.floor((height-y)/steps)/2 + 1);
  1129. self.setNewZoom(y);
  1130. }
  1131. self.zoomProgressDownBool = false;
  1132. }
  1133. self.zoomCursorDownBool = false;
  1134. self.zoomCursorX = 0;
  1135. self.zoomCursorY = 0;
  1136. self.zoomCursorWidth = 160;
  1137. self.zoomCursorHeight = 120;
  1138. self.zoomControlsWidth = 0;
  1139. self.zoomControlsHeight = 0;
  1140. self.zoomCursorDown = function(e){
  1141. self.zoomCursorX = e.pageX;
  1142. self.zoomCursorY = e.pageY;
  1143. self.zoomCursorWidth = el_zoomPositionCursor.offsetWidth;
  1144. self.zoomCursorHeight = el_zoomPositionCursor.offsetHeight;
  1145. self.zoomControlsWidth = el_controls_zoom_position.offsetWidth;
  1146. self.zoomControlsHeight = el_controls_zoom_position.offsetHeight;
  1147. self.zoomCursorDownBool = true;
  1148. }
  1149. self.zoomCursorUp = function(e){
  1150. console.log("zoomCursorUp");
  1151. self.zoomCursorDownBool = false;
  1152. }
  1153. self.zoomCursorMove = function(e){
  1154. if(self.zoomCursorDownBool == true){
  1155. var diffX = self.zoomCursorX - e.pageX;
  1156. var diffY = self.zoomCursorY - e.pageY;
  1157. self.zoomCursorX = e.pageX;
  1158. self.zoomCursorY = e.pageY;
  1159. var newx = el_zoomPositionCursor.offsetLeft - diffX;
  1160. var newy = el_zoomPositionCursor.offsetTop - diffY;
  1161. var d2x = (self.zoomControlsWidth - self.zoomCursorWidth*(10/self.currentZoom));
  1162. var d2y = (self.zoomControlsHeight - self.zoomCursorHeight*(10/self.currentZoom));
  1163. var minX = -1*d2x/2;
  1164. var maxX = d2x/2;
  1165. var minY = -1*d2y/2;
  1166. var maxY = d2y/2;
  1167. if(newx < minX) newx = minX;
  1168. if(newy < minY) newy = minY;
  1169. if(newx >= maxX) newx = maxX;
  1170. if(newy >= maxY) newy = maxY;
  1171. el_zoomPositionCursor.style.left = newx + "px";
  1172. el_zoomPositionCursor.style.top = newy + "px";
  1173. var zoom = self.currentZoom/10 - 1;
  1174. var left = Math.floor(-100*((newx/d2x)*zoom));
  1175. var top = Math.floor(-100*((newy/d2y)*zoom));
  1176. self.module.style.left = left + '%';
  1177. self.module.style.top = top + '%';
  1178. }
  1179. }
  1180. el_play.onclick = self.play;
  1181. el_stop.onclick = self.stop;
  1182. el_fullscreen.onclick = self.fullscreen;
  1183. el_volumeMute.onclick = self.mute;
  1184. el_volumeDown.onclick = self.voldown;
  1185. el_volumeUp.onclick = self.volup;
  1186. el_takescreenshot.onclick = self.takescreenshot;
  1187. el_zoomUp.onclick = self.zoomUp;
  1188. el_zoomDown.onclick = self.zoomDown;
  1189. el_zoomPositionCursor.addEventListener('mousedown',self.zoomCursorDown,false);
  1190. el_zoomPositionCursor.addEventListener('mousemove',self.zoomCursorMove,false);
  1191. el_zoomPositionCursor.addEventListener('mouseleave',self.zoomCursorUp,false);
  1192. el_zoomPositionCursor.addEventListener('mouseup',self.zoomCursorUp,false);
  1193. el_zoomProgress.addEventListener('mousedown',self.zoomProgressDown,false);
  1194. el_zoomProgress.addEventListener('mousemove',self.zoomProgressMove,false);
  1195. el_zoomProgress.addEventListener('mouseleave',self.zoomProgressLeave,false);
  1196. el_zoomProgress.addEventListener('mouseup',self.zoomProgressUp,false);
  1197. }(id, options);
  1198. }else{
  1199. // console.warn(id + " - already exists player");
  1200. }
  1201. return window.vxgplayer.players[id];
  1202. };
  1203. window.vxgplayer.webserverport = '8780';
  1204. window.vxgplayer.isFrame = function() {
  1205. try { return window.self !== window.top; } catch (e) { return true; }
  1206. }
  1207. window.vxgplayer.browserSupportsPluginPnacl = function() {
  1208. return navigator.mimeTypes['application/x-pnacl'] !== undefined &&
  1209. navigator.mimeTypes['application/tvsc_player'] !== undefined;
  1210. }
  1211. window.vxgplayer.showGlobalErrorMessage = function(id, html){
  1212. var player = document.getElementById(id);
  1213. var width=640;
  1214. var height=480;
  1215. width = parseInt(player.width,10) || width;
  1216. height = parseInt(player.height,10) || height;
  1217. player.style.width = width + 'px';
  1218. player.style.height = height + 'px';
  1219. player.innerHTML = html;
  1220. return undefined;
  1221. }
  1222. window.vxgplayer.showNotInstalled = function(id){
  1223. vxgplayer.showGlobalErrorMessage(id, ''
  1224. + '<div class="vxgplayer-install">'
  1225. + ' <div class="vxgplayer-install-content">'
  1226. + ' <a href="http://www.truen.co.kr/tvsc_player/" ' + (vxgplayer.isFrame() ? 'target="_blank"' : '')+ '>Click here for install plugin</a>'
  1227. + ' </div>'
  1228. + '</div>');
  1229. }
  1230. window.vxgplayer.showAvailableInChrome = function(id){
  1231. vxgplayer.showGlobalErrorMessage(id, ''
  1232. + '<div class="vxgplayer-unsupport">'
  1233. + ' <div class="vxgplayer-unsupport-content">'
  1234. + ' Available in <a href="https://www.google.com/chrome/" target="_blank">Chrome for Desktop PC only</a>'
  1235. + ' </div>'
  1236. + '</div>');
  1237. }
  1238. window.vxgplayer.showWebSocketFailed = function(id){
  1239. vxgplayer.showGlobalErrorMessage(id, ''
  1240. + '<div class="vxgplayer-unsupport">'
  1241. + ' <div class="vxgplayer-unsupport-content">'
  1242. + ' Could not connect to plugin (WebSocket Error). Please try restart your browser.'
  1243. + ' </div> '
  1244. + '</div>');
  1245. }
  1246. window.vxgplayer.showNotInstalledInIncognitoMode = function(id){
  1247. vxgplayer.showGlobalErrorMessage(id, ''
  1248. + '<div class="vxgplayer-unsupport">'
  1249. + ' <div class="vxgplayer-unsupport-content"> You have opened this page in incognito mode. Please open it in a regular tab, install the plugin and then come back.'
  1250. + ' </div>'
  1251. + '</div>');
  1252. }
  1253. window.vxgplayer.showNotStartedInIncognitoMode = function(id){
  1254. vxgplayer.showGlobalErrorMessage(id, ''
  1255. + '<div class="vxgplayer-unsupport">'
  1256. + ' <div class="vxgplayer-unsupport-content"> You have opened this page in incognito mode. Please open it in a regular tab and then come back.'
  1257. + ' </div>'
  1258. + '</div>');
  1259. }
  1260. window.vxgplayer.startPlayerInNewTab = function(){
  1261. console.log('start player');
  1262. var params = "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes"
  1263. var win = window.open('http://www.truen.co.kr/tvsc_player/', "_blank", params)
  1264. setTimeout(function(){
  1265. win.close();
  1266. location.reload();
  1267. /*for(var id in window.vxgplayer.players){
  1268. console.log("Restart player: " + id);
  1269. }*/
  1270. },1000);
  1271. }
  1272. window.vxgplayer.showNotStartedInIFrame = function(id){
  1273. vxgplayer.showGlobalErrorMessage(id, ''
  1274. + '<div class="vxgplayer-unsupport">'
  1275. + ' <div class="vxgplayer-unsupport-content"> You have opened this page in frame.<br>'
  1276. + ' Please click on <a href="javascript:void(0);" onclick="window.vxgplayer.startPlayerInNewTab();">this link</a> for start Chrome App (VXG Media Player).'
  1277. + ' </div>'
  1278. + '</div>');
  1279. }
  1280. window.vxgplayer.showInitFailed = function(id, str){
  1281. vxgplayer.showGlobalErrorMessage(id, ''
  1282. + '<div class="vxgplayer-unsupport">'
  1283. + ' <div class="vxgplayer-unsupport-content">'
  1284. + ' Chrome plugin init error. Try to update Video/Audio drivers. '
  1285. + str
  1286. + ' </div> '
  1287. + '</div>');
  1288. }
  1289. window.vxgplayer.Promise = function(){
  1290. var completed = false;
  1291. this.done = function(callback){
  1292. this.done_callback = callback;
  1293. if(this.completed){
  1294. this.done_callback(this.err);
  1295. }
  1296. return this;
  1297. }
  1298. this.fail = function(callback){
  1299. this.fail_callback = callback;
  1300. if(this.completed){
  1301. this.fail_callback(this.err);
  1302. }
  1303. return this;
  1304. }
  1305. this.resolve = function(result) {
  1306. if(!this.completed){
  1307. this.result = result;
  1308. this.done_callback(result);
  1309. }
  1310. this.completed = true;
  1311. }
  1312. this.reject = function(err) {
  1313. if(!this.completed){
  1314. this.err = err;
  1315. this.fail_callback(err);
  1316. }
  1317. this.completed = true;
  1318. }
  1319. };
  1320. window.vxgplayer.checkWebSocket = function(){
  1321. var p = new vxgplayer.Promise();
  1322. setTimeout(function(){
  1323. var testWebSocket = new WebSocket('ws://127.0.0.1:' + vxgplayer.webserverport + '/');
  1324. testWebSocket.onerror=function(event){
  1325. p.reject();
  1326. }
  1327. testWebSocket.onmessage = function(evt){
  1328. console.log(evt);
  1329. }
  1330. testWebSocket.onopen=function(){
  1331. testWebSocket.close();
  1332. p.resolve();
  1333. }
  1334. },10000);
  1335. return p;
  1336. }
  1337. // helper funxtion
  1338. window.vxgplayer.getAbsolutePosition = function(element){
  1339. var r = { x: element.offsetLeft, y: element.offsetTop };
  1340. if (element.offsetParent) {
  1341. var tmp = vxgplayer.getAbsolutePosition(element.offsetParent);
  1342. r.x += tmp.x;
  1343. r.y += tmp.y;
  1344. }
  1345. return r;
  1346. };
  1347. document.addEventListener('DOMContentLoaded', function() {
  1348. console.log("vxgplayer isFrame: " + window.vxgplayer.isFrame());
  1349. console.log("vxgplayer browserSupportsPluginPnacl: " + window.vxgplayer.browserSupportsPluginPnacl());
  1350. // search all vxgplayers
  1351. var els = document.getElementsByClassName("vxgplayer");
  1352. for (var i = 0; i < els.length; i++) {
  1353. if(els[i].id){
  1354. vxgplayer(els[i].id);
  1355. }else{
  1356. console.error("Player has not id", els[i]);
  1357. }
  1358. }
  1359. // TODO check ws
  1360. // TODO start Chrome App
  1361. });