DLNA plugin doesn't currently give a signal that it failed to connect. So a interval...
[profile/ivi/MediaPlayer.git] / js / main.js
1 /*
2  * Copyright (c) 2013, Intel Corporation.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9
10 var currentMenu = "main";
11 var mouseDownEvent;
12 var resizeCB = resizeMainMenu;
13 var screenWidth;
14 var screenHeight;
15 var screenOrientation;
16 var iconWidth;
17 var padding;
18 var contentType = "AUDIO";
19 var audioContent = new Array();
20 var videoContent = new Array();
21 var imageContent = new Array();
22 var currentContent;
23 var currentPlayer;
24 var currentPlayerType = "AUDIO";
25 var currentMediaList = $("#audioMediaList");
26 var currentMediaListItems = $("#audioMediaListItems");
27 var currentPlayerControls;
28 var audioMediaListLoaded = false;
29 var videoMediaListLoaded = false;
30 var imageMediaListLoaded = false;
31 var audioPlayer;
32 var videoPlayer;
33 var audioIndex = 0;
34 var videoIndex = 0;
35 var imageIndex = 0;
36 var vidIcon = new Image();
37 var imgIcon = new Image();
38 var musicIcon = new Image();
39 var imagesLoaded = false;
40 var mediaListItemW;
41 var mediaListItemH;
42 var imageControls;
43 var loadAndPlay = false;
44 var currentFileLoaded = false;
45 var mediaNameCanvas;
46 var mediaNameCTX;
47 var speechObj;
48 var nightMode = false;
49 var waitingToResumeVideo = false;               //Media has been paused by exterior forces.  If set to true, resume previous media when given the signal.
50 var stopServerSearch;
51
52 var mainMenuTitleTemplateLandscape = {"font" : "oblique bolder 30pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
53                 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
54
55 var mainMenuTitleTemplate = {"font" : "oblique bolder 40pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
56                 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
57
58 var mainTrackTemplateLandscape = {"font" : "bold 20pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
59                 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
60
61 var mainTrackTemplate = {"font" : "bold 30pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
62                 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
63
64 var mediaTextTemplate2 = {"font" : "bold 20pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
65                 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
66
67 var mediaTextTemplate3 = {"font" : "bold 20pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
68
69 var trackTextTemplate  = {"font" : "bold 16pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
70
71 var mediaTextTemplate2Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
72                 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
73
74 var mediaTextTemplate3Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
75
76 var trackTextTemplateLandscape  = {"font" : "bold 11pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
77
78
79 var mediaTextTemplate = {"font" : "bold 20pt Arial", "fillStyle" : "", "textAlign" : "left",
80                 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 12, "shadowColor" : "red"};
81
82 function onError()
83 {
84         console.log("Content discovery failed");
85 }
86
87 function setupSpeech()
88 {
89         console.log("MediaPlayer in setupSpeech");
90
91         speechObj = tizen.speech;
92         speechObj.vocalizeString(" ");
93
94         try
95         {
96                 var speechEventListener = {
97                         onaudiostart: function(){console.log("MediaPlayer: onaudiostart received");},
98                         onsoundstart: function(){console.log("MediaPlayer: onsoundstart received");},
99                         onspeechstart: function(){console.log("MediaPlayer: onspeechstart received");},
100                         onspeechend: function(){console.log("MediaPlayer: onspeechend received");},
101                         onsoundend: function(){console.log("MediaPlayer: onsoundend received");},
102                         onaudioend: function(){console.log("MediaPlayer: onaudioend received");},
103                         onresult: function(result){
104
105                                 console.log("MediaPlayer: onresult received");
106
107                                 for (var i = 0; i < result.length; i++)
108                                 {
109                                         console.log("MediaPlayer: forloop, command = " + result[i]);
110                                         var commandFound = false;
111
112                                         switch(result[i])
113                                         {
114                                                 case "play":
115                                                         playButtonClick();
116                                                         commandFound = true;
117                                                 break;
118                                                 case "next":
119                                                         nextButtonClick();
120                                                         commandFound = true;
121                                                 break;
122                                                 case "previous":
123                                                         backButtonClick();
124                                                         commandFound = true;
125                                                 break;
126                                                 case "stop":
127                                                 case "pause":
128                                                         pauseButtonClick();
129                                                         commandFound = true;
130                                                 break;
131                                                 default:
132                                                 break;
133                                         }
134
135                                         if (commandFound)
136                                                 break;
137                                 }
138                         },
139                         onnomatch: function(result){console.log("MediaPlayer: onnomatch received ");},
140                         onerror: function(error){console.log("MediaPlayer: onerror received");},
141                         onstart: function(){console.log("MediaPlayer: onstart received");},
142                         onend: function(){console.log("MediaPlayer: onend received");}
143                 }
144
145                 speechObj.setCBListener(speechEventListener);
146
147         }
148         catch(err)
149         {
150                 console.log("MediaPlayer setupSpeech FAILED + " + err.message);
151         }
152
153 }
154
155 function updateMediaName(newArtist, newTitle, newCover)
156 {
157         if (currentMenu === "audio")
158         {
159                 var playBarHeight = mediaNameCanvas.height;
160                 var boxWidth = playBarHeight * 0.75;
161                 mediaNameCTX.clearRect(0,0,mediaNameCanvas.width, mediaNameCanvas.height);
162
163                 if (currentPlayerType === "AUDIO")
164                 {
165                         var shadeJump = 10;
166                         var alphaJump = 0.01;
167                         var currColor = 255;
168                         var currAlpha = 1.0;
169
170                         mediaNameCTX.fillStyle="rgba(30,30,30,0.5)";
171                         mediaNameCTX.strokeStyle="rgba(130,130,130,1)";
172                         mediaNameCTX.lineWidth = 5;
173                         mediaNameCTX.fillRect(0,0,mediaNameCanvas.width, playBarHeight);
174                         mediaNameCTX.strokeRect(-20,0,mediaNameCanvas.width + 40, playBarHeight);
175
176                         if (newCover === undefined || newCover.naturalWidth === undefined || newCover.naturalWidth <= 0)
177                         {
178                                 newCover = musicIcon;
179                         }
180
181                         mediaNameCTX.drawImage(newCover, 20, (playBarHeight - boxWidth) / 2, boxWidth, boxWidth);
182
183                         if (screenOrientation === "portrait")
184                         {
185                                 var textStartX = boxWidth + 50;
186
187                                 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 70 , "zLoc" : 0,
188                                                                         "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 65, "wordWrap" : true});
189                                 trackText.applyTemplate(mainMenuTitleTemplate);
190
191                                 var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 70, "zLoc" : 0,
192                                                                                 "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
193                                 artistText.applyTemplate(mainTrackTemplate);
194                         }
195                         else
196                         {
197                                 var textStartX = boxWidth + 50;
198                                 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 50 , "zLoc" : 0,
199                                                                                 "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
200                                 trackText.applyTemplate(mainMenuTitleTemplateLandscape);
201                                 var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 50, "zLoc" : 0,
202                                                                                 "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
203                                 artistText.applyTemplate(mainTrackTemplateLandscape);
204                         }
205
206                         trackText.drawObj();
207                         trackText.drawLargeShadow();
208
209                         artistText.yLoc += trackText.height;
210                         artistText.drawObj();
211                 }
212         }
213 }
214
215 function onContentItemArraySuccess(content)
216 {
217         console.log("MediaPlayer in onContentItemArraySuccess");
218         var emptyContent = true;
219
220         if (!content || content === undefined || content.length <= 0)
221                 console.log("Invalid content for " + contentType);
222         else
223         {
224                 emptyContent = false;
225         }
226
227         switch (contentType)
228         {
229         case "AUDIO":
230
231                         if (!emptyContent)
232                         {
233                                 try
234                                 {
235                                         audioContent = audioContent.concat(content);
236
237                                         $("#audioSrc").attr("src", audioContent[0].contentURI);
238                                         audioPlayer.load();
239
240                                         var imgSources = [];
241                                         for (var i = 0; i < audioContent.length; i++)
242                                         {
243                                                 var iconURI = (audioContent[i].thumbnailURIs !== undefined && audioContent[i].thumbnailURIs !== null) ? audioContent[i].thumbnailURIs[0] : "images/musicIcon.png";
244                                                 audioContent[i].coverArtURI = iconURI;
245                                         }
246
247                                         loadImages();
248
249                                         audioMediaListLoaded = true;
250                                         currentMediaListItems = $("#audioMediaListItems");
251                                         fillMediaList(audioContent);
252                                 }
253
254                                 catch (err)
255                                 {
256                                         console.log("Error when parsing audioContent");
257                                 }
258                         }
259
260                 contentType = "VIDEO";
261                 break;
262
263         case "VIDEO":
264                 if (!emptyContent)
265                 {
266                         videoContent = videoContent.concat(content);
267                         $("#videoSrc").attr("src", videoContent[0].contentURI);
268                 }
269                 contentType = "IMAGE";
270                 break;
271
272         case "IMAGE":
273                 if (!emptyContent)
274                 {
275                         imageContent = imageContent.concat(content);
276                         $("#imagePlayer").css("background", "url(" + imageContent[0].contentURI + ") no-repeat center");
277                         $("#imagePlayer").css("background-size", "contain");
278                 }
279                 contentType = undefined;
280                 break;
281
282         default:
283                 console.log("Undefined content search type");
284         nextContentType = undefined;
285         break;
286         }
287
288         if (contentType !== undefined)
289                 getMedia(contentType);
290 }
291
292 function getMedia(mediaType)
293 {
294         console.log("MediaPlayer in getMedia");
295         var manager = tizen.content;
296
297         var filter = new tizen.AttributeFilter("type", "EXACTLY", mediaType);
298         manager.find(onContentItemArraySuccess, onError, null, filter);
299 }
300
301 function showMediaMenu()
302 {
303         console.log("MediaPlayer in showMediaMenu");
304         $(".navButton").fadeIn(800);
305
306         switch(currentPlayerType)
307         {
308                 case "AUDIO":
309                         //show audio player
310                         try
311                         {
312                                 if (audioContent.length > 0)
313                                         updateMediaName(audioContent[audioIndex].artists[0], audioContent[audioIndex].title, audioContent[audioIndex].coverArt);
314                         }
315                         catch(err)
316                         {
317                                 console.log("updateMediaName failed for showMediaMenu (audio) : " + err.message);
318                         }
319
320                         $("#mediaName").fadeIn(800);
321                         $(".sortButton").fadeIn(800);
322                         currentPlayer.fadeIn(800);
323
324                         if (screenOrientation === "landscape" )
325                                 $("#audioMediaList").addClass("landscape");
326                         else
327                                 $("#audioMediaList").removeClass("landscape");
328
329                         $("#audioMediaList").fadeIn(800);
330                         break;
331
332                 case "VIDEO":
333                         //show video
334                         setTimeout(function(){currentPlayer.show()}, 800);              //The video element can't be faded, so wait a moment before showing
335                         break;
336
337                 case "IMAGE":
338                         //show image
339                         currentPlayer.fadeIn(800);
340                         break;
341
342                 default:
343                         console.log("Invalid player type");
344                 break;
345         }
346 }
347
348 function showMediaList()
349 {
350         console.log("MediaPlayer in showMediaList");
351
352         if (currentMediaList.is(":visible"))
353                 currentMediaList.fadeOut(300);
354         else
355         {
356                 currentMediaList.fadeIn(300);
357         }
358 }
359
360 function changeMenu(menuButtonId)
361 {
362         console.log("MediaPlayer in changeMenu");
363         var clickedButton  = $("#" + menuButtonId);
364         var buttonWidth  = clickedButton.width();
365         var buttonHeight = clickedButton.height();
366         var buttonBottom = clickedButton.css("bottom");
367         var buttonRight  = clickedButton.css("right");
368
369         //Animate the clicked button slightly
370         clickedButton.animate({
371                 bottom: screenOrientation === "portrait" ? "+=0" : "+=50",
372                                 right: screenOrientation === "portrait" ? "+=50" : "+=0",
373                                                 opacity: "0"
374         }, 300 ,
375
376         //Reset the size once done
377         function() {
378                 clickedButton.width(buttonWidth);
379                 clickedButton.height(buttonHeight);
380
381                 if (screenOrientation === "portrait")
382                         clickedButton.css({"right": buttonRight});
383                 else
384                         clickedButton.css({"bottom": buttonBottom});
385         }
386         );
387
388         $(".mainButton").fadeOut(300);
389
390         switch(menuButtonId)
391         {
392                 case ("mainMusicButton"):
393                         speechObj.vocalizeString("Music player");
394                         currentMenu = "audio";
395                         currentPlayer = $("#audioPlayer");
396                         currentPlayerControls = document.getElementById("audioPlayer");
397                         currentPlayerType = "AUDIO";
398                         currentMediaList = $("#audioMediaList");
399                         currentMediaListItems = $("#audioMediaListItems");
400                         currentContent = audioContent;
401
402                         if (!audioMediaListLoaded)
403                                 fillMediaList(currentContent);
404
405                         showMediaMenu();
406                 break;
407
408                 case ("mainVideoButton"):
409                         speechObj.vocalizeString("Video player");
410                         currentMenu = "video";
411                         currentPlayer = $("#videoPlayer");
412                         currentPlayerControls = document.getElementById("videoPlayer");
413                         currentPlayerType = "VIDEO";
414                         currentMediaList = $("#videoMediaList");
415                         currentMediaListItems = $("#videoMediaListItems");
416                         currentContent = videoContent;
417
418                         if (!videoMediaListLoaded)
419                                 fillMediaList(currentContent);
420
421                         showMediaMenu();
422                 break;
423
424                 case ("mainImageButton"):
425                         speechObj.vocalizeString("Picture viewer");
426                         currentMenu = "image";
427                         currentPlayer = $("#imagePlayer");
428                         currentPlayerControls = imageControls;
429                         currentPlayerType = "IMAGE";
430                         currentMediaList = $("#imageMediaList");
431                         currentMediaListItems = $("#imageMediaListItems");
432                         currentContent = imageContent;
433
434                         if (!imageMediaListLoaded)
435                                 fillMediaList(currentContent);
436
437                         showMediaMenu();
438                 break;
439                 default:
440                         console.log("Error: No menu by that name");
441                 break;
442         }
443 }
444
445 function showMainMenu()
446 {
447         console.log("MediaPlayer in showMainMenu");
448         currentMenu = "main";
449         currentPlayerControls.pause();
450
451         $("#playButton").toggleClass('playing', false);
452
453         //If the media list is showing, hide it.  Remove the mediaListAudioList class if it exists so that it will resize properly
454         if (currentMediaList.is(":visible"))
455                 currentMediaList.fadeOut(300);
456
457         $(".navButton").fadeOut(300);
458         $(".sortButton").fadeOut(300);
459         $("#mediaName").fadeOut(300);
460
461         if (currentPlayerType !== "VIDEO")
462                 currentPlayer.fadeOut(300);
463         else
464                 currentPlayer.hide();
465
466
467         $(".mainButton").css({"opacity": "100"});
468         $(".mainButton").fadeIn(800);
469 }
470
471 function sortByAlpha(contentToSort)
472 {
473         console.log("MediaPlayer in sortByAlpha");
474
475         if (currentPlayerType === "AUDIO")
476                 emptyTimeouts();
477
478         //If contentToSort is undefined it's because the request came from the sortBy buttons
479         if (contentToSort === undefined)
480                 contentToSort = audioContent;
481
482         contentToSort.sort(function (a,b) {
483                 var first = a.title.toLowerCase();
484                 var second = b.title.toLowerCase();
485
486                 if (first < second)
487                         return -1;
488                 if (first > second)
489                         return 1;
490
491                 return 0;
492         });
493
494         fillMediaList(contentToSort);
495 }
496
497 function sortByArtist(contentToSort)
498 {
499         console.log("MediaPlayer in sortByArtist");
500
501         if (currentPlayerType === "AUDIO")
502                 emptyTimeouts();
503
504         if (contentToSort === undefined)
505                 contentToSort = audioContent;
506
507         contentToSort.sort(function (a,b) {
508                 var first = a.artists[0].toLowerCase();
509                 var second = b.artists[0].toLowerCase();
510
511                 if (first < second)
512                         return -1;
513                 if (first > second)
514                         return 1;
515
516                 return 0;
517         });
518
519         fillMediaList(contentToSort);
520 }
521
522 function sortByAlbum(contentToSort)
523 {
524         if (currentPlayerType === "AUDIO")
525                 emptyTimeouts();
526
527         console.log("MediaPlayer in sortByAlbum");
528         if (contentToSort === undefined)
529                 contentToSort = audioContent;
530
531         contentToSort.sort(function (a,b) {
532                 var first = a.album.toLowerCase();
533                 var second = b.album.toLowerCase();
534
535                 if (first < second)
536                         return -1;
537                 if (first > second)
538                         return 1;
539
540                 return 0;
541         });
542
543         fillMediaList(contentToSort);
544 }
545
546 /**************************************** NAVIGATION FUNCTIONS *******************************************/
547
548 // This function is called once a file being loaded is ready to play
549 function playLoadedMedia()
550 {
551         console.log("MediaPlayer in playLoadedMedia");
552         currentFileLoaded = true;
553
554         if (loadAndPlay)
555         {
556                 currentPlayerControls.play();
557
558                 $("#playButton").toggleClass('playing', true);
559                 loadAndPlay = false;
560         }
561 }
562
563 function playButtonClick()
564 {
565         console.log("MediaPlayer in playButtonClick");
566         if (currentPlayerType !== "AUDIO" || currentFileLoaded)
567         {
568                 if (currentPlayerControls.paused)
569                 {
570                         $("#playButton").toggleClass('playing', true);
571                         currentPlayerControls.play();
572                 }
573                 else
574                 {
575                         $("#playButton").toggleClass('playing', false);
576                         currentPlayerControls.pause();
577                 }
578         }
579         else
580                 console.log(audioContent[audioIndex].artists[0] + " : " + audioContent[audioIndex].title + " can't play yet, it hasn't loaded");
581 }
582
583 function pauseButtonClick()
584 {
585         console.log("MediaPlayer in pauseButtonClick");
586         if (!currentPlayerControls.paused)
587         {
588                 currentPlayerControls.pause();
589                 $("#playButton").toggleClass('playing', false);
590         }
591 }
592
593 function backButtonClick()
594 {
595         console.log("MediaPlayer in backButtonClick");
596         switch (currentPlayerType)
597         {
598         case "AUDIO":
599                 if (audioContent)
600                 {
601                         if (audioIndex > 0 )
602                                 audioIndex--;
603                         else
604                                 audioIndex = audioContent.length - 1;
605
606                         loadAndPlay = true;
607                         audioPlayer.pause();
608
609                         $("#playButton").toggleClass('playing', false);
610
611                         $("#audioSrc").attr("src", audioContent[audioIndex].contentURI);
612                         updateMediaName(audioContent[audioIndex].artists[0], audioContent[audioIndex].title, audioContent[audioIndex].coverArt);
613                         audioPlayer.load();
614                 }
615                 break;
616
617         case "VIDEO":
618                 if (videoContent)
619                 {
620                         if (videoIndex > 0 )
621                                 videoIndex--;
622                         else
623                                 videoIndex = videoContent.length - 1;
624
625                         videoPlayer.pause();
626                         $("#playButton").toggleClass('playing', false);
627                         $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
628                         videoPlayer.load();
629                 }
630                 break;
631
632         case "IMAGE":
633                 if (imageContent)
634                 {
635                         if (imageIndex > 0 )
636                                 imageIndex--;
637                         else
638                                 imageIndex = imageContent.length - 1;
639
640                         $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
641                         $("#imagePlayer").css("background-size", "contain");
642                 }
643                 break;
644
645         default:
646                 console.log("Content failure");
647         break;
648         }
649 }
650
651
652 function nextButtonClick()
653 {
654         console.log("MediaPlayer in nextButtonClick");
655         switch (currentPlayerType)
656         {
657         case "AUDIO":
658                 if (audioContent)
659                 {
660                         if (audioContent.length > (audioIndex + 1))
661                                 audioIndex++;
662                         else
663                                 audioIndex = 0;
664
665                         loadAndPlay = true;
666                         audioPlayer.pause();
667
668                         $("#playButton").toggleClass('playing', false);
669
670                         $("#audioSrc").attr("src", audioContent[audioIndex].contentURI);
671                         updateMediaName(audioContent[audioIndex].artists[0], audioContent[audioIndex].title, audioContent[audioIndex].coverArt);
672                         audioPlayer.load();
673                 }
674                 break;
675
676         case "VIDEO":
677                 if (videoContent)
678                 {
679                         if (videoContent.length > (videoIndex + 1))
680                                 videoIndex++;
681                         else
682                                 videoIndex = 0;
683
684                         videoPlayer.pause();
685                         $("#playButton").toggleClass('playing', false);
686                         $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
687                         videoPlayer.load();
688                 }
689                 break;
690
691         case "IMAGE":
692                 if (imageContent)
693                 {
694                         if (imageContent.length > (imageIndex + 1))
695                                 imageIndex++;
696                         else
697                                 imageIndex = 0;
698
699                         $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
700                         $("#imagePlayer").css("background-size", "contain");
701                 }
702                 break;
703
704         default:
705                 console.log("Content failure");
706         break;
707         }
708 }
709
710 /**************************************** END NAVIGATION FUNCTIONS *******************************************/
711
712 function resizeMainMenu()
713 {
714         console.log("MediaPlayer in resizeMainMenu");
715
716         currentMediaList.fadeOut(0);
717         screenWidth = window.innerWidth;
718         screenHeight = window.innerHeight;
719         screenOrientation = screenWidth < screenHeight ? "portrait" : "landscape";
720         iconWidth = screenOrientation === "portrait" ? screenHeight / 4 : screenWidth / 4;
721         var padding = 20;
722
723         $(".mainButton").width(iconWidth + "px");
724         $(".mainButton").height(iconWidth + "px");
725
726         var iconsTop  = screenOrientation === "portrait" ? ((screenHeight - (iconWidth * 3)) / 2) - (padding * 3) : (screenHeight - iconWidth) / 2;
727
728         if (screenOrientation === "portrait")
729                 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : (screenWidth / 2) - (iconWidth /2) - padding + "px", "width" : "50%"});
730         else
731         {
732                 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : ((iconWidth / 2) - (padding * 3)) + "px", "width" : "100%"});
733                 $("#sortButtons").addClass("landscape");
734         }
735 }
736
737 function resizePlayerPage()
738 {
739         console.log("MediaPlayer in resizePlayerPage");
740
741         audioPlayer = document.getElementById("audioPlayer");
742         videoPlayer = document.getElementById("videoPlayer");
743         screenWidth = window.innerWidth;
744         screenHeight = window.innerHeight;
745
746         var padding = 15;
747         var buttonWidth = screenOrientation === "portrait" ? screenHeight * 0.05 : screenWidth * 0.05;
748
749         $("#backButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) - (buttonWidth *3)) + "px"});
750         $("#nextButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) + (buttonWidth *2)) + "px"});
751         $("#returnButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": padding + "px"});
752         $("#listButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": (screenWidth - buttonWidth - padding * 2) + "px"});
753         $("#playButton").css({"width": buttonWidth * 1.15 + "px", "height": buttonWidth * 1.15 + "px", "top": padding * 0.3 + "px", "left": (screenWidth / 2) - (buttonWidth / 2) + "px"});
754
755         mediaNameCanvas.width = (screenWidth);
756         mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
757         mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
758         mediaNameCanvas.style.left = "0px";
759
760         var sortButtonTop = (buttonWidth + (2 * padding) ) + mediaNameCanvas.height - (buttonWidth * 1.3);
761         var sortButtonWidth = buttonWidth * 2.5;
762         var buttonSpacing = screenWidth / 5;
763
764         mediaListItemW = $("#videoMediaList").width() * 0.92;
765         mediaListItemH = $("#videoMediaList").height() / 10;
766 }
767
768 function resizeAll()
769 {
770         console.log("MediaPlayer in resizeAll");
771         resizeMainMenu();
772         resizePlayerPage();
773 }
774
775 /*
776  * swipe - Handles swipe events.  Currently it just acts as another way to hit the next / back buttons, but
777  * it could be expanded to other things in the future.
778  */
779
780 function swipe(direction, object)
781 {
782         console.log("MediaPlayer in swipe");
783         switch (object)
784         {
785         case "mediaName":
786                 if (direction === "right")
787                         nextButtonClick();
788                 else if (direction === "left")
789                         backButtonClick();
790                 break;
791
792         default:
793                 break;
794         }
795 }
796
797 function toggleNightMode(nightModeValue)
798 {
799         if (nightMode !== nightModeValue)
800         {
801                 Array.prototype.forEach.call (document.querySelectorAll ('*'), function (el) {el.classList.toggle('night');});
802                 nightMode = nightModeValue;
803         }
804 }
805
806 function init()
807 {
808         console.log("MediaPlayer in init");
809         var vehicle = tizen.vehicle;
810
811
812         /* Subscribe to AMB NightMode signal, and switch colors
813          * upon receipt of the signal
814          */
815
816         if (vehicle && vehicle !== undefined)
817         {
818                 var getVal = vehicle.get("NightMode");
819
820                 //Check that NightMode returned a value before trying to hook up to it
821                 if (getVal)
822                 {
823                         toggleNightMode(getVal.nightMode);
824                 }
825
826                 /* Subscribe to AMB NightMode signal, and switch colors
827                 * upon receipt of the signal
828                 */
829
830                 vehicle.subscribe("NightMode",function(value) {
831                                 console.log("MediaPlayer: Day / Night mode changed to " + value.nightMode);
832                                 toggleNightMode(value.nightMode);
833                 });
834
835
836                 /* Subscribe to AMB DrivingMode signal, and pause video
837                  * upon receipt of the signal
838                  */
839
840
841                 vehicle.subscribe("DrivingMode",function(value) {
842                         console.log("MediaPlayer: DrivingMode changed to " + value.drivingMode);
843
844                         if (value.drivingMode > 0 && currentPlayerType === "VIDEO" && !currentPlayerControls.paused)
845                         {
846                                 console.log("MediaPlayer: pausing video due to vehicle motion");
847                                 currentPlayerControls.pause();
848                                 waitingToResumeVideo = true;
849                         }
850                         else if (value.drivingMode === 0 && currentPlayerType === "VIDEO" && waitingToResumeVideo)
851                         {
852                                 console.log("MediaPlayer: vehicle has stopped, resuming video");
853                                 currentPlayerControls.play();
854                                 waitingToResumeVideo = false;
855                         }
856                 });
857         }
858
859         musicIcon.src = "images/musicIcon.png";
860         vidIcon.src = "images/videoIcon.png";
861         imgIcon.src = "images/imageIcon.png";
862         imageControls = new ImageControls();
863
864         mediaNameCanvas = document.getElementById("mediaName");
865         mediaNameCTX = mediaNameCanvas.getContext("2d");
866
867         //Resize all items and search for local media
868         resizeAll();
869
870         //Check if DLNA plugin is installed.  If so, scan for media.
871         if (tizen.mediaserver)
872         {
873                 //Currently no success signal, so continue trying until a server is found.  Once that
874                 //happens, clear the stopServerSearch interval
875
876                 stopServerSearch = setInterval(function(){console.log("MediaPlayer searching for remote media..."); tizen.mediaserver.scanNetwork(foundMediaServer);}, 5000);
877         }
878         else
879                 console.log("MediaPlayer: No DLNA server running, using local media only...");
880
881         //Setup voice control
882         if (tizen.speech)
883                 setupSpeech();
884         else
885                 console.log("MediaPlayer: Speech Recognition not running, voice control will be unavailable");
886
887         //Get local media
888         setTimeout(function(){getMedia(contentType);}, 500);
889
890         //Prevent highlighting
891         window.ondragstart = function() { return false; }
892
893         $(window).bind('resize', resizeAll);
894
895         //Simple swipe detection
896         $("#mediaName").mousedown(function(e){mouseDownEvent = e;});
897         $("#mediaName").mouseup(function(e){
898                 if (Math.abs(mouseDownEvent.clientY - e.clientY) < 100)
899                 {
900                         if (Math.abs(mouseDownEvent.clientX - e.clientX) > 100)
901                         {
902                                 if (mouseDownEvent.clientX > e.clientX)
903                                         swipe("left", "mediaName");
904                                 else
905                                         swipe("right", "mediaName");
906                         }
907                 }
908         });
909
910     document.getElementById('videoPlayer').addEventListener("playing", function() {
911         $("#navigationButtons").hide();
912     }, false);
913     document.getElementById('videoPlayer').addEventListener("pause", function() {
914         $("#navigationButtons").show();
915     }, false);
916 }
917
918 $(document).ready(function () {
919         init();
920 });