//////////////////////////////////////////////////////////////////////////////// // // THIS CODE IS NOT APPROVED FOR USE IN/ON ANY OTHER UI ELEMENT OR PRODUCT COMPONENT. // Copyright (c) 2007 Microsoft Corporation. All rights reserved. // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // GLOBAL VARIABLES // //////////////////////////////////////////////////////////////////////////////// var g_MCESidebarCtrlProgID = "MediaCenterSidebarGadget.Controller"; var g_viewElements = null; var g_noFeeds = true; var g_downloadErrorFlag = false; var g_totalViewableItems = ""; var g_currentArrayIndex = 0; var g_loadingMilliSecs = 10000; // 10 sec is default value but will be changed by user' settting var g_lastCalledArrayIndex; var g_gadgetErrorFlag; var g_timer; var g_loadFirstTime; var g_feedClicked; var g_timerFlyoutFlag; var g_sourcelist = null; var g_maxItemsPerView = 3; var g_curViewStartIndex = 0; var g_curViewEndIndex = -1; var g_selectedIndex = 0; var g_totalItemCount = 0; var g_isContentItem = false; var g_curFlyoutItem = 0; var g_isBBContentAvailable = false; var g_LinksShowing = new Array(); var g_ContentItems = new Array(); var g_MCESidebarCtrl = null; var DEBUG = 0; onerror = handleErr; function handleErr(msg,url,l) { if (DEBUG) alertVB(msg + "\n" + l + "\n" + url); } //////////////////////////////////////////////////////////////////////////////// function LoadMain() { bg.src = "images/Gadget_Main_Background_Loading.png"; g_gadgetErrorFlag = 0; for (var i = 0; i < g_maxItemsPerView; i++) { g_LinksShowing[i] = false; } g_viewElements = new viewElementsObject(); g_currentArrayIndex = 0; System.Gadget.visibilityChanged = checkVisibility; System.Gadget.Flyout.file = "flyout.html"; System.Gadget.settingsUI = "settings.html"; setTimeout(loadData, 1000); document.body.focus(); } function UnloadMain() { g_MCESidebarCtrl.Unload(); } //////////////////////////////////////////////////////////////////////////////// function loadData() { navHolder.style.visibility = "visible"; SetDefaultSettingsValue(); LoadMCESidebarCtrl(); LoadLocalizedString(); BuildItemsOnMainPage(); checkFlyforTimer(); } //////////////////////////////////////////////////////////////////////////////// function BuildItemsOnMainPage() { WMC_Logo.style.visibility = "visible"; g_curViewStartIndex = 0; g_totalItemCount = 0; var showBroadbandContent = GetShowBroadbandContentSetting(); var showRecordedTVItem = GetShowRecodedTVItemSetting(); if ( showBroadbandContent == false && showRecordedTVItem == false) { // Quick Launch button Mode SwitchToQuickLaunchMode(); return; } GetAllContentItem(); if( g_totalItemCount > 0) { document.getElementById("SourceName").innerText = g_sourcelist.GetSourceAt(0).SourceName; if (g_totalItemCount > g_maxItemsPerView) { ShowNavButtons(true); } else { ShowNavButtons(false); } // Show Content Items SetNextViewItems(); } else { // Quick Launch button Mode SwitchToQuickLaunchMode(); } } function SwitchToQuickLaunchMode() { // Quick Launch button Mode document.getElementById("SourceFrame").style.visibility = "hidden"; document.getElementById("WMC_LogoType").style.visibility = "visible"; document.getElementById("BgDefault").style.visibility = "visible"; // show default background document.getElementById("Lense").style.visibility = "visible"; document.getElementById("BgThumbFrame").style.visibility = "hidden"; document.getElementById("BackThumbImage").style.visibility = "hidden"; clearViewElements(); ShowNavButtons(false); // Show Quick launch button ShowQuickLaunchButtons(); } /////////////////////////////////////////////////////////////////////////////////////// function ShowNavButtons(show) { if( show == true ) { document.getElementById("LeftNavButton").style.visibility = "visible"; document.getElementById("RightNavButton").style.visibility = "visible"; } else { document.getElementById("LeftNavButton").style.visibility = "hidden"; document.getElementById("RightNavButton").style.visibility = "hidden"; } } //////////////////////////////////////////////////////////////////////////////// function LoadMCESidebarCtrl() { // Make sure we have a handle to the feed manager if (g_MCESidebarCtrl == null) { try { g_MCESidebarCtrl = new ActiveXObject(g_MCESidebarCtrlProgID); if (g_MCESidebarCtrl == null) { return null; } } catch(e) { } } } /////////////////////////////////////////////////////////////////////////////////////// function RemoveMCESidebarCtrl() { g_MCESidebarCtrl = null; } //////////////////////////////////////////////////////////////////////////////// function GetAllContentItem() { g_isBBContentAvailable = false; var maxItemCount = 6; var broadbandSourceCount = 0; var maxBroadbandCount = GetBroadbandContentCountSetting(); var showBroadbandContent = GetShowBroadbandContentSetting(); var maxRecordedTVCount = GetRecordedTVItemCountSetting(); var showRecordedTVItem = GetShowRecodedTVItemSetting(); g_sourcelist = g_MCESidebarCtrl.GetContentSourceList(); if ( g_sourcelist != null) { for (i = 0, g_totalItemCount = 0; i < g_sourcelist.SourceCount; i++) { g_curSource = g_sourcelist.GetSourceAt(i); if (g_curSource == null) { continue; } if (g_curSource.ContentSourceType == "BroadbandContent") { g_isBBContentAvailable = true; var showSource = HandleShowingBBSource(broadbandSourceCount++, g_curSource.SourceName); if (showBroadbandContent == false || showSource == "Hide") { continue; } maxItemCount = maxBroadbandCount; } if (g_curSource.ContentSourceType == "RecordedTV") { if (showRecordedTVItem == false ) { continue; } maxItemCount = maxRecordedTVCount; } for (j = 0; j < g_curSource.ItemCount && j < maxItemCount; j++) { var item = g_curSource.GetItemAt(j); if ( item != null) { g_ContentItems[g_totalItemCount] = item; g_totalItemCount++; } } } } } //////////////////////////////////////////////////////////////////////////////// function HandleShowingBBSource(broadbandSourceIndex, sourceName) { var key = "BBSourceTitle" + broadbandSourceIndex; System.Gadget.Settings.write(key, sourceName); key = "BBSourceShow" + sourceName; var value = System.Gadget.Settings.read(key); return value; } //////////////////////////////////////////////////////////////////////////////// function ShowQuickLaunchButtons() { var quickLaunchButtons = new Array(); quickLaunchButtons[0] = g_MCESidebarCtrl.GetString(1); quickLaunchButtons[1] = g_MCESidebarCtrl.GetString(2); quickLaunchButtons[2] = g_MCESidebarCtrl.GetString(3); for (var i = 0; i < g_maxItemsPerView; i++) { g_viewElements.ContentItems[i].innerText = quickLaunchButtons[i]; g_viewElements.ContentItems[i].setAttribute("listindex", i); g_viewElements.ContentItems[i].setAttribute("isContentItem", false); } // hiding "Loading..." text document.getElementById("LoadingText").style.visibility = "hidden"; } //////////////////////////////////////////////////////////////////////////////// function viewElementsObject() { this.ContentItems = new Array(); for(var i = 0; i < g_maxItemsPerView; i++) { var newElement = document.getElementById("ContentItemLink" + i); newElement.onfocusin = newElement.onmouseover; newElement.onfocusout = newElement.onmouseout; newElement.hideFocus = true; this.ContentItems.push(newElement); } } //////////////////////////////////////////////////////////////////////////////// function clearViewElements() { for(i=0; i < g_maxItemsPerView; i++) { g_viewElements.ContentItems[i].innerText = ""; } } //////////////////////////////////////////////////////////////////////////////// function startTimer() { stopTimer(); var transitionTime = GetTransitionTimeSetting(); g_timer = setInterval(SetNextViewItems, transitionTime*1000); } //////////////////////////////////////////////////////////////////////////////// function stopTimer() { clearInterval(g_timer); } //////////////////////////////////////////////////////////////////////////////// function checkVisibility() { isVisible = System.Gadget.visible; if (!isVisible) { stopTimer(); } if(isVisible) { startTimer(); } } //////////////////////////////////////////////////////////////////////////////// function checkFlyforTimer() { if(!System.Gadget.Flyout.show) { startTimer(); } } //////////////////////////////////////////////////////////////////////////////// function safeGetFeed(Path) { if (Path == null || Path.Length == 0) { return g_MCESidebarCtrl.GetFeed(""); } else { return g_MCESidebarCtrl.GetFeed(Path); } } //////////////////////////////////////////////////////////////////////////////// function SetPreviousViewItems() { HideFlyout(); var bItemChanged = g_MCESidebarCtrl.CheckItemChanged(); if( bItemChanged ) { BuildItemsOnMainPage(); } else { var lastIndex = g_curViewStartIndex -1; if (lastIndex < 0 ) { GetAllContentItem(); lastIndex = g_totalItemCount - 1; } var lastItem = g_ContentItems[lastIndex]; var i; for(i = lastIndex; i >= 0 && lastIndex - i < g_maxItemsPerView; i--) { var contentItem = g_ContentItems[i]; if (lastItem.ContentTypeString != contentItem.ContentTypeString || lastItem.ParentSource.SourceName != contentItem.ParentSource.SourceName) { break; } } g_curViewStartIndex = i + 1; var countOnPage = lastIndex - i; SetCurViewItems(countOnPage); } } //////////////////////////////////////////////////////////////////////////////// function SetNextViewItems() { HideFlyout(); var bItemChanged = g_MCESidebarCtrl.CheckItemChanged(); if( bItemChanged ) { BuildItemsOnMainPage(); } else { g_curViewStartIndex = g_curViewEndIndex + 1; if (g_curViewStartIndex >= g_totalItemCount) { GetAllContentItem(); g_curViewStartIndex = 0; } var firstItem = g_ContentItems[g_curViewStartIndex]; var i; for(i = 0; i < g_maxItemsPerView && i + g_curViewStartIndex < g_totalItemCount; i++) { contentItem = g_ContentItems[i+g_curViewStartIndex]; if (firstItem.ContentTypeString != contentItem.ContentTypeString || firstItem.ParentSource.SourceName != contentItem.ParentSource.SourceName) { break; } } SetCurViewItems(i); } } //////////////////////////////////////////////////////////////////////////////// function SetCurViewItems(itemCountOnPage) { if ( g_totalItemCount > 0) { clearViewElements(); // Get the main background image from the first items's thumbnail image. var firstItem = g_ContentItems[g_curViewStartIndex]; var contentItem; var thumbnail = firstItem.ThumbnailUrl; if (thumbnail != null && thumbnail != "nothumb") { document.getElementById("BgThumbFrame").filters[0].Apply(); document.getElementById("BackThumbImage").src = thumbnail; // when the image is done loading, it will trigger AdjustThumbnail() } else { // no thumbnail available. hide it. document.getElementById("BackThumbImage").style.visibility = "hidden"; } var startIndex = g_maxItemsPerView - itemCountOnPage; for(var j = 0; j < itemCountOnPage; j++) { contentItem = g_ContentItems[j+g_curViewStartIndex]; var ContentItemName = contentItem.GetTitle(17); g_viewElements.ContentItems[startIndex+j].innerText = ContentItemName; g_viewElements.ContentItems[startIndex+j].setAttribute("listindex", j); g_viewElements.ContentItems[startIndex+j].setAttribute("isContentItem", true); g_curViewEndIndex = j+g_curViewStartIndex; } document.getElementById("Lense").style.visibility = "visible"; // hiding loading animation document.getElementById("LoadingText").style.visibility = "hidden"; // Set Source title at the bottom if ( firstItem != null && firstItem.ParentSource != null && firstItem.ParentSource.SourceName != null) { document.getElementById("SourceName").innerText = firstItem.ParentSource.SourceName; } else { document.getElementById("SourceName").innerText = g_MCESidebarCtrl.GetString(0); } document.getElementById("WMC_LogoType").style.visibility = "hidden"; document.getElementById("SourceFrame").style.visibility = "visible"; document.getElementById("BgDefault").style.visibility = "hidden"; } } //////////////////////////////////////////////////////////////////////////////// function AdjustThumbnail(objThumb) { var objThumbFrame = document.getElementById("BgThumbFrame"); var objLense = document.getElementById("LenseImage"); objThumb.width = objLense.width - 4; // stretch to sides. give 2 pixel buffer on each side var intLenseTop = objLense.style.top + 4; // +4 because we start a few pixels inside the lense var intLenseHeight = 124; // allowable space in the lense. the lense asset is slightly larger if (objThumb.height > intLenseHeight) { // vertically align the thumbnail so the middle half shows in the lense objThumbFrame.style.top = intLenseTop - ((objThumb.height - intLenseHeight) / 2); var intTop = (objThumb.height - intLenseHeight) / 2; var intRight = objThumb.width; // don't crop the sides. var intBottom = intTop + intLenseHeight; var intLeft = 0; // don't crop the sides objThumbFrame.style.clip = "rect(" + intTop + "," + intRight + "," + intBottom + "," + intLeft + ")"; } else { // thumbnail is not as tall as lense (probably rare). most thumbnails we get are 133px high. objThumb.height = intLenseHeight; } objThumbFrame.style.visibility = "visible"; objThumb.style.visibility = "visible"; document.getElementById("BgThumbFrame").filters[0].Play(); } //////////////////////////////////////////////////////////////////////////////// function clearBorder() { for (var i = 0; i < g_maxItemsPerView; i++) { if(eval("ContentItem"+i) != undefined) { eval("ContentItem"+i).style.border = ""; } } } //////////////////////////////////////////////////////////////////////////////// function ClickItemOnMain(elementItem) { g_selectedIndex = elementItem.listindex; g_isContentItem = elementItem.isContentItem; if ( g_isContentItem == true) { var isLinkShowing = g_LinksShowing[g_selectedIndex]; // if flyout is not showing up at all or the selected flyout is not showing up if (System.Gadget.Flyout.show == false || isLinkShowing == false) { ShowFlyout(elementItem); for (var i = 0; i < g_maxItemsPerView; i++) { g_LinksShowing[i] = false; if (i != g_selectedIndex) { document.getElementById("ContentItemLink" + i).className = "MainLinks"; // reset to original style } } g_LinksShowing[g_selectedIndex] = true; elementItem.className = "MainLinksOpen"; } else // if flyout is showing up, just hide it { HideFlyout(); } } else // Quick launch buttons. { HandleQuickLaunchButtons(elementItem); } } //////////////////////////////////////////////////////////////////////////////// function HandleQuickLaunchButtons(elementItem) { var index = elementItem.listindex; g_MCESidebarCtrl.LaunchMCE(index + 1); } //////////////////////////////////////////////////////////////////////////////// function ShowFlyout(elementItem) { g_timerFlyoutFlag = true; if(System.Gadget.Flyout.show) { addContentToFlyout(); } else { System.Gadget.Flyout.onShow = function() { stopTimer(); addContentToFlyout(); } System.Gadget.Flyout.onHide = function() { g_feedClicked = null; if(g_timerFlyoutFlag) { startTimer(); } g_timerFlyoutFlag = true; HideFlyout(); // the onHide event might be called if a user clicks outside the flyout. that won't automatically call HideFlyout so we should explicitely call it here } System.Gadget.Flyout.show = true; } } //////////////////////////////////////////////////////////////////////////////// function HideFlyout() { System.Gadget.Flyout.show = false; for (var i = 0; i < g_maxItemsPerView; i++) { g_LinksShowing[i] = false; document.getElementById("ContentItemLink" + i).className = "MainLinks"; // reset to original style } } //////////////////////////////////////////////////////////////////////////////// function addContentToFlyout() { g_curFlyoutItem = g_curViewStartIndex + g_selectedIndex; if (g_ContentItems[g_curFlyoutItem].ContentTypeString == "BroadbandContent") { applyTemplateToFlyoutOfBBContent(); } else { addContentToFlyoutOfRecordedTV(); } } //////////////////////////////////////////////////////////////////////////////// function addContentToFlyoutOfRecordedTV() { g_curFlyoutItem = g_curViewStartIndex + g_selectedIndex; var flyoutDoc = System.Gadget.Flyout.document; flyoutDoc.getElementById("Title").innerText = g_ContentItems[g_curFlyoutItem].GetTitle(30); flyoutDoc.getElementById("Description").innerText = g_ContentItems[g_curFlyoutItem].Description; flyoutDoc.getElementById("EpisodeTitle").innerText = g_ContentItems[g_curFlyoutItem].EpisodeTitle; if (g_ContentItems[g_curFlyoutItem].EpisodeTitle == "") { // hide element so it doesn't create a blank line flyoutDoc.getElementById("EpisodeTitle").style.display = "none"; } else { // show it if we do have a title flyoutDoc.getElementById("EpisodeTitle").style.display = ""; } flyoutDoc.getElementById("Channel").innerText = g_ContentItems[g_curFlyoutItem].Channel; flyoutDoc.getElementById("Genre").innerText = g_ContentItems[g_curFlyoutItem].Genre; flyoutDoc.getElementById("StartTime").innerText = g_ContentItems[g_curFlyoutItem].StartTime + " - " + g_ContentItems[g_curFlyoutItem].EndTime; var thumbPath = g_ContentItems[g_curFlyoutItem].ThumbnailUrl; if ( thumbPath == "nothumb" ) { thumbPath = "../images/default_thumb.jpg"; } flyoutDoc.getElementById("ThumbnailUrl").src = thumbPath; } //////////////////////////////////////////////////////////////////////////////// function PlacePlayButton() { // adjust play glyph to be in bottom corner var flyoutDoc = System.Gadget.Flyout.document; var objPlayButton = flyoutDoc.getElementById("FlyoutPlayButton"); var objThumb = flyoutDoc.getElementById("ThumbnailUrl"); objPlayButton.style.top = (objThumb.height - 24) + "px"; objPlayButton.style.visibility = "visible"; } //////////////////////////////////////////////////////////////////////////////// function loadXMLString(str) { var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.loadXML(str); return xmlDoc; } //////////////////////////////////////////////////////////////////////////////// function applyTemplateToFlyoutOfBBContent() { g_curFlyoutItem = g_curViewStartIndex + g_selectedIndex; var flyoutDoc = System.Gadget.Flyout.document; var strFlyoutSource = g_ContentItems[g_curFlyoutItem].FlyoutSourceXML; var xmlFromMCStore = loadXMLString(strFlyoutSource); var xslMetadataFormat = loadXMLString(g_ContentItems[g_curFlyoutItem].FlyoutFormatTemplate); var strIntermediate = xmlFromMCStore.transformNode(xslMetadataFormat); var xmlIntermediate = loadXMLString(strIntermediate); var xslContent = loadXMLString(g_ContentItems[g_curFlyoutItem].FlyoutTemplate); var htmlOutput = xmlIntermediate.transformNode(xslContent); flyoutDoc.getElementById("FlyoutArea").innerHTML = htmlOutput; } //////////////////////////////////////////////////////////////////////////////// function styleSwitch(divObject, backgroundColorVal, topVal, leftVal, heightVal, widthVal, fontWeightVal, fontSizeVal, fontColor, marginTopVal, marginBottomVal, marginRightVal, marginLeftVal, borderBottomVal, borderColorVal) { with(eval(divObject).style) { if(topVal) { top = topVal + "px"; } if(leftVal) { left = leftVal + "px"; } if(heightVal) { height = heightVal + "px"; } if(widthVal) { width = widthVal + "px"; } if(fontWeightVal) { fontWeight = fontWeightVal; } if(fontSizeVal) { fontSize = fontSizeVal + "px"; } if(fontColor) { color = fontColor; } if(marginTopVal) { paddingTop = marginTopVal + "px"; } if(marginBottomVal) { paddingBottom = marginBottomVal + "px"; } if(marginLeftVal) { paddingLeft = marginLeftVal+ "px"; } if(marginRightVal) { paddingRight = marginRightVal+ "px"; } if(borderBottomVal) { borderBottom = "dotted "+ borderBottomVal + "px"; } if(borderColorVal) { borderColor = borderColorVal; } if(backgroundColorVal) { backgroundColor = backgroundColorVal; } } } //////////////////////////////////////////////////////////////////////////////// function toggleBack(objToChange, showBack) { if(objToChange.innerText != g_feedClicked) { if(!System.Gadget.docked) { var backgroundToLoad = "url(images/item_hover_floating.png)"; } else if (System.Gadget.docked) { var backgroundToLoad = "url(images/item_hover_docked.png)"; } if(showBack) { eval("objToChange").style.backgroundImage = backgroundToLoad; } else { eval("objToChange").style.backgroundImage = ""; } } } //////////////////////////////////////////////////////////////////////////////// function toggleButton(objToChange, newSRC) { eval("objToChange").src = newSRC; } //////////////////////////////////////////////////////////////////////////////// function keyNavigate() { switch(event.keyCode) { case 38: case 104: SetPreviousViewItems(); break; case 40: case 98: SetNextViewItems(); break; case 32: case 13: if(event.srcElement.id == "LeftNavButton") { SetPreviousViewItems(); } else if(event.srcElement.id == "RightNavButton") { SetNextViewItems(); } break; case 27: HideFlyout(); break; } } //////////////////////////////////////////////////////////////////////////////// function keyNavigateClose() { switch(event.keyCode) { case 27: HideFlyout(); break; } } //////////////////////////////////////////////////////////////////////////////// function PlayItem(elementThumbLink) { var MainWin = System.Gadget.document.parentWindow; var ctrl = MainWin.g_MCESidebarCtrl; var index = MainWin.g_curViewStartIndex + MainWin.g_selectedIndex; if (MainWin.g_ContentItems[index].LaunchUrl != null) { //ctrl.PlayDvrmsFile(MainWin.g_ContentItems[index].LaunchUrl); ctrl.LaunchMCEWithParameter(MainWin.g_ContentItems[index].LaunchUrl); } } //////////////////////////////////////////////////////////////////////////////// function OnItemClick() { if(g_gadgetErrorFlag > 0) { if(g_gadgetErrorFlag == 1) { System.Gadget.Settings.write("rssFeedPath", ""); showSpinner('35%'); this.blur(); LoadMCESidebarCtrl(); downloadAllFeeds(g_MCESidebarCtrl.RootFolder); g_MCESidebarCtrl = null; g_loadFirstTime = "existingGadget"; System.Gadget.Settings.write("loadFirstTime", g_loadFirstTime); if(g_downloadErrorFlag) { setTimeout(LoadMain, g_loadingMilliSecs); } else { LoadMain(); } } } } //////////////////////////////////////////////////////////////////////////////// // // SETTINGS // //////////////////////////////////////////////////////////////////////////////// function LoadLocalizedString() { // load localized string for main page // Load localized string for settings page System.Gadget.Settings.write("mceSettingText1", g_MCESidebarCtrl.GetString(10)); System.Gadget.Settings.write("mceSettingText2", g_MCESidebarCtrl.GetString(11)); System.Gadget.Settings.write("mceSettingText3", g_MCESidebarCtrl.GetString(12)); System.Gadget.Settings.write("mceSettingText5", g_MCESidebarCtrl.GetString(14)); System.Gadget.Settings.write("mceSettingInternetTVTitle", g_MCESidebarCtrl.GetString(16)); System.Gadget.Settings.write("mceSettingInternetTVCount", g_MCESidebarCtrl.GetString(17)); } function OnLoadSettings() { System.Gadget.Settings.write("IsTVSetupDone", g_MCESidebarCtrl.IsTVSetupDone()); System.Gadget.Settings.write("IsBBContentAvailable", g_isBBContentAvailable); } function OnClickLogo() { g_MCESidebarCtrl.LaunchMCE(0); // Launch MCE without parameter } function OnClickSourceTitle() { var title = document.getElementById("SourceName").innerText; if (title == g_MCESidebarCtrl.GetString(0)) { g_MCESidebarCtrl.LaunchMCE(0); // Launch MCE without parameter } else { var curSource = GetSourceFromTitle(title); if (curSource != null) { g_MCESidebarCtrl.LaunchMCEWithParameter(curSource.LaunchUrl); } } } function GetSourceFromTitle(title) { var source; for (i = 0; i < g_sourcelist.SourceCount; i++) { var curSource = g_sourcelist.GetSourceAt(i); if (curSource != null && curSource.SourceName == title) { source = curSource; break; } } return source; }