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