home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 November / SAN CD 11-2007 CD-ROM 30.iso / pc / Software / StarryNightWidget / Starry Night.wdgt / Common / JS / WidgetsCommon.js < prev   
Encoding:
Text File  |  2007-08-01  |  38.3 KB  |  476 lines

  1. //------------------------------------------------------------------------------------------- 
  2. //
  3. // Copyright © 1990-2007 by Imaginova Corp, Inc., All rights reserved.
  4. //
  5. // Contains:    Starry Night Widget:
  6. //
  7. // Author:        Ivan Pinzon
  8. //
  9. // Date            Initials    Version        Comments
  10. // ----------    ---------    ----------    ---------------------------
  11. // 2007/07/31    IPA            1.2            New
  12. //
  13. //------------------------------------------------------------------------------------------- 
  14.  
  15. var kWidthValue="420";var kHeightValue="262";var kDefaultAlt=25;var kDefaultAboveAlt=-90;var kAboveElevation=3000000;var kSurfaceState=0;var kAboveState=1;var kMaxFOV=90.0;var kMinFOV=0.05;var kAm=0;var kPm=1;var kBackHeight=310;var kCubeTransition=0;var kCoreImageTransition=1;var kFadeInOut=6;var kNorthIndex=0;var kWestIndex=1;var kSouthIndex=2;var kEastIndex=3;var kFullSkyIndex=4;var kWidgetTitleFrontElemID="widgetTitleFront";var kLocationFrontElemID="locationFront";var kDateStatusElemID="dateStatusFront";var kLocationStatusElemID="locationStatusFront";var kGazeStatusElemID="gazeStatusFront";var kCubeCompositionDivID="cubeCompositionDiv";var kCubeCompositionElemID="cubeComposition";var kCoreImageCompositionDivID="coreImageCompositionDiv";var kCoreImageCompositionElemID="coreImageComposition";var kJSBackgroundElemID="loadingFront";var kJSSkyChart1ElemID="skyChartFront";var kJSSkyChart2ElemID="skyChartFront2";var kLogoCompositionElemID="logoComposition";var kAboutTabView=0;var kLocationTabView=1;var kOptionsTabView=2;var kHelpTabView=3;var kTabsCount=kHelpTabView;var kEpsilon=0.0001;var gFadeTitleIn=false;var kMonthNames=new Array(12);kMonthNames[0]="January";kMonthNames[1]="February";kMonthNames[2]="March";kMonthNames[3]="April";kMonthNames[4]="May";kMonthNames[5]="June";kMonthNames[6]="July";kMonthNames[7]="August";kMonthNames[8]="September";kMonthNames[9]="October";kMonthNames[10]="November";kMonthNames[11]="December";var kMonthLength=new Array(31,28,31,30,31,30,31,31,30,31,30,31);var _acct="DM5310155MZA92EN3";var gInfoButton;var gMiniChartButton;var gSNWebButton;var gZoomSlider=null;var glassDoneButton;var glassFindPostalCodeButton;var gRSSFeedURLHttpRequest=false;var gRSSFeedHttpRequest=false;var gMiniChartHttpRequest=null;var gGetNearestCityHttpRequest=false;var gFindPostalCodeHttpRequest=false;var gMiniChartRequestError=false;var gElevationState=kSurfaceState;var gPostalFound=true;var gPostalValidated=false;var gLatLongValidated=false;var gSituation=new SNSituation();var gCurrentLocation="";var gUserLocationPref="";var gAzimuthOptionsIndexPref=1;var gTransitionOptionsIndexPref=kFadeInOut;var gOldTransitionOptionsIndexPref=-1;var gTimeZonePref;var gCurrentTabPref=0;var gSetupWasCalled=false;var gIsCollapsed=true;var gUseChart2=true;var gCompositionElemID=kCubeCompositionElemID;var gOldImage1Count=0;var gOldImage2Count=0;var gRefreshTimer=null;var gRefreshPeriod=900;var gFadeOutEffect=null;var gTicker=null;var gTickerLastDate=new Date();var gTabImagesA=new Array();var gTabONImagesA=new Array();if(window.widget)
  16. {widget.onshow=onShow;widget.onhide=onHide;}
  17. function onShow()
  18. {var front=document.getElementById("front");if(front!=null&&front.style.display!="none")
  19. {preOnShow();restoreGaze();if(!gSetupWasCalled)
  20. {sendMiniChartRequest();}
  21. gSetupWasCalled=false;var showDate=new Date();var oneHour=1000*3600;var elapsedTime=(showDate-gTickerLastDate)/oneHour;if((document.getElementById("TICKER").innerHTML.length==0)||(elapsedTime>1))
  22. {gRSSFeedURLHttpRequest=getWidgetRSSFeedURL(getRSSFeedXMLCallback);gTickerLastDate=showDate;}
  23. else
  24. {startTickerTimer();}
  25. if(gRefreshTimer==null)
  26. {gRefreshTimer=setInterval("sendMiniChartRequest();",1000*gRefreshPeriod);}
  27. if(gTicker==null)
  28. {gTicker=setTimeout("Ticker_tick();",30);}
  29. if(gTransitionOptionsIndexPref!=kFadeInOut)
  30. {var compositionElem=document.getElementById(gCompositionElemID);if(compositionElem&&compositionElem.paused())
  31. {compositionElem.play();}}
  32. setInfoButtonStyle();postOnShow();}}
  33. function onHide()
  34. {var front=document.getElementById("front");if(front!=null&&front.style.display!="none")
  35. {if(gRefreshTimer!=null)
  36. {clearInterval(gRefreshTimer);gRefreshTimer=null;}
  37. if(gTicker!=null)
  38. {clearTimeout(gTicker);gTicker=null;}
  39. if(gComposition.timer!=null)
  40. {clearInterval(gComposition.timer);gComposition.timer=null;}
  41. if(gComposition.timeout!=null)
  42. {clearTimeout(gComposition.timeout);gComposition.timeout=null;}
  43. gComposition.canProcessRequests=true;gComposition.showLoading=true;var front=document.getElementById("front");if(gTransitionOptionsIndexPref!=kFadeInOut)
  44. {var compositionElem=document.getElementById(gCompositionElemID);if(compositionElem)
  45. {compositionElem.pause();}}}}
  46. function resetRefreshTimer()
  47. {if(gRefreshTimer!=null)
  48. {clearInterval(gRefreshTimer);}
  49. gRefreshTimer=setInterval("sendMiniChartRequest();",1000*gRefreshPeriod);}
  50. function getZoomStep()
  51. {var currentFOV=gSituation.gaze.FOV;var zoomStep=15;if(currentFOV<45)
  52. {zoomStep=10;if(currentFOV<30)
  53. {zoomStep=5;if(currentFOV<15)
  54. {zoomStep=3;if(currentFOV<5)
  55. {zoomStep=1;if(currentFOV<2)
  56. {zoomStep=0.5;if(currentFOV<1)
  57. {zoomStep=0.1;}}}}}}
  58. return zoomStep;}
  59. function processEvent(inKey)
  60. {var saveAzimuth=gSituation.gaze.az;var sendRequest=true;var zoomStep=15.0;var kMaxAltitude=89.9;var kMinAltitude=4.001;var kFractionToMove=1/4;var amountToMove=gSituation.gaze.FOV*kFractionToMove;switch(inKey)
  61. {case"N":case"n":if(gElevationState==kSurfaceState)
  62. {gSituation.gaze.az=0;setDefaultFOV();setDefaultAltitude();}
  63. else
  64. {sendRequest=false;}
  65. break;case"S":case"s":if(gElevationState==kSurfaceState)
  66. {gSituation.gaze.az=180;setDefaultFOV();setDefaultAltitude();}
  67. else
  68. {sendRequest=false;}
  69. break;case"E":case"e":if(gElevationState==kSurfaceState)
  70. {gSituation.gaze.az=90;setDefaultFOV();setDefaultAltitude();}
  71. else
  72. {sendRequest=false;}
  73. break;case"W":case"w":if(gElevationState==kSurfaceState)
  74. {gSituation.gaze.az=270;setDefaultFOV();setDefaultAltitude();}
  75. else
  76. {sendRequest=false;}
  77. break;case"elev":gElevationState=(gElevationState==kSurfaceState)?kAboveState:kSurfaceState;setDefaultElevation();setDefaultFOV();setDefaultAltitude();gSituation.gaze.az=0;var whichImage=(gElevationState==kSurfaceState)?"url(Images/liftOffButton.png)":"url(Images/liftOffButton2.png)";document.getElementById("elevationButton").setAttribute("style","background-image: "+whichImage);break;case"left":if(gElevationState==kSurfaceState)
  78. {gSituation.gaze.az=(gSituation.gaze.az-amountToMove)%360;if(gSituation.gaze.az<0)
  79. {gSituation.gaze.az=360+gSituation.gaze.az;}}
  80. else
  81. {gSituation.location.lng-=amountToMove;if(gSituation.location.lng<-180)
  82. {gSituation.location.lng=360+gSituation.location.lng;}
  83. findNearestCity();}
  84. break;case"right":if(gElevationState==kSurfaceState)
  85. {gSituation.gaze.az=(gSituation.gaze.az+amountToMove)%360;}
  86. else
  87. {gSituation.location.lng+=amountToMove;if(gSituation.location.lng>180)
  88. {gSituation.location.lng-=360;}
  89. findNearestCity();}
  90. break;case"up":if(gElevationState==kSurfaceState)
  91. {if(gSituation.gaze.alt<kMaxAltitude)
  92. {gSituation.gaze.alt+=amountToMove;if(gSituation.gaze.alt>kMaxAltitude)
  93. {gSituation.gaze.alt=kMaxAltitude;}}
  94. else
  95. {sendRequest=false;}}
  96. else
  97. {gSituation.location.lat=(gSituation.location.lat+amountToMove)%360;findNearestCity();}
  98. break;case"down":if(gElevationState==kSurfaceState)
  99. {if(gSituation.gaze.alt>kMinAltitude)
  100. {gSituation.gaze.alt-=amountToMove;if(gSituation.gaze.alt<kMinAltitude)
  101. {gSituation.gaze.alt=kMinAltitude;}}
  102. else
  103. {sendRequest=false;}}
  104. else
  105. {gSituation.location.lat=(gSituation.location.lat-amountToMove)%360;findNearestCity();}
  106. break;case"+":zoomStep=getZoomStep();gSituation.gaze.FOV-=zoomStep;if(gSituation.gaze.FOV<kMinFOV)
  107. {gSituation.gaze.FOV=kMinFOV;}
  108. break;case"-":zoomStep=getZoomStep();gSituation.gaze.FOV+=zoomStep;if(gSituation.gaze.FOV>kMaxFOV)
  109. {gSituation.gaze.FOV=kMaxFOV;}
  110. break;default:sendRequest=widgetProcessEvent(inKey);break;}
  111. if(sendRequest)
  112. {if(gTransitionOptionsIndexPref!=kFadeInOut)
  113. {var compositionElem=document.getElementById(gCompositionElemID);gComposition.duration=(event.shiftKey?3:1);compositionElem.setInputValue("duration",gComposition.duration);}
  114. sendMiniChartRequest();}
  115. return sendRequest;}
  116. function keyPressed(e)
  117. {var back=document.getElementById("back");if(back.style.display=="block")
  118. {return;}
  119. var key;if(e.which<63232)
  120. {key=String.fromCharCode(e.which);}
  121. else
  122. {switch(e.keyCode)
  123. {case 63232:key="up";break;case 63233:key="down";break;case 63234:key="left";break;case 63235:key="right";break;default:break;}}
  124. if(processEvent(key))
  125. {e.stopPropagation();e.preventDefault();}}
  126. function keyPressedBack(e)
  127. {var back=document.getElementById("back");if(back.style.display=="block"&&event.shiftKey)
  128. {var key=String.fromCharCode(e.which);switch(key)
  129. {case"t":case"T":document.getElementById("transitionsDiv").style.display=="block"?document.getElementById("transitionsDiv").style.display="none":document.getElementById("transitionsDiv").style.display="block";break;}}}
  130. function goToStarryNight(event)
  131. {if(window.widget)
  132. {widget.openURL("http://store.yahoo.com/cgi-bin/clink?yhst-49664100110157+58wNhQ+stniso.html");}}
  133. function goToDigitalDownload(event)
  134. {if(window.widget)
  135. {widget.openURL("http://store.yahoo.com/cgi-bin/clink?yhst-49664100110157+58wNhQ+digitaldownload.html");}}
  136. function goToImaginova(event)
  137. {if(window.widget)
  138. {widget.openURL("http://www.imaginova.com");}}
  139. function goToStarryNightServer(event)
  140. {if(window.widget)
  141. {var url=getRedirectURL(kWidgetID,kDashboardWidgetVersion,gSituation);widget.openURL(url);trackAction(kWidgetID,kDashboardWidgetVersion,kTrack_openWebAppClicked,false);}}
  142. function getRSSFeedXMLCallback()
  143. {if(gRSSFeedURLHttpRequest!=null&&gRSSFeedURLHttpRequest.readyState==4)
  144. {if(gRSSFeedURLHttpRequest.status==200)
  145. {var rssURL=parseRSSXML(gRSSFeedURLHttpRequest.responseXML,kWidgetID,kDashboardWidgetVersion);gRSSFeedHttpRequest=new XMLHttpRequest();gRSSFeedHttpRequest.onreadystatechange=RSSFeedXMLCallback;gRSSFeedHttpRequest.overrideMimeType("text/xml");gRSSFeedHttpRequest.open("GET",rssURL,true);gRSSFeedHttpRequest.setRequestHeader("Cache-Control","no-cache");gRSSFeedHttpRequest.send(null);}}}
  146. function RSSFeedXMLCallback()
  147. {if(gRSSFeedHttpRequest!=null&&gRSSFeedHttpRequest.responseXML)
  148. {if(gRSSFeedHttpRequest.readyState==4)
  149. {if(gRSSFeedHttpRequest.status==200)
  150. {try
  151. {var rss=findChild(gRSSFeedHttpRequest.responseXML,'rss');var channel=findChild(rss,'channel');if(channel!=null)
  152. {var i=0;var html="";for(var child=channel.firstChild;child!=null;child=child.nextSibling)
  153. {if(child.nodeName=='item')
  154. {var title=findChild(child,'title');var link=findChild(child,'link');i++;html+="...  "
  155. +"<a href='#' onclick=\"widget.openURL('"+link.firstChild.data+"'); trackAction("+kWidgetID+",'"+kDashboardWidgetVersion+"',"+kTrack_tickerLinkClicked+", false,'"+link.firstChild.data+"');\">"
  156. +title.firstChild.data
  157. +"</a> ";if(i>kNumberOfRSSFeedEntriesToUse)
  158. {break;}}}}}
  159. catch(ex)
  160. {alert("XML parsing exception");}
  161. document.getElementById("TICKER").innerHTML=html;ticker_start();}
  162. else if(gRSSFeedHttpRequest.status==404)
  163. {alert("URL doesn't exist");}
  164. else
  165. {alert("There was a problem with the RSS Feed request: "+gRSSFeedHttpRequest.status);alert(gRSSFeedHttpRequest.statusText);var html=" ... Can't connect to server ...";document.getElementById("TICKER").innerHTML=html;ticker_start();}}}}
  166. function findChild(inElement,inNodeName)
  167. {var aChild;for(aChild=inElement.firstChild;aChild!=null;aChild=aChild.nextSibling)
  168. {if(aChild.nodeName==inNodeName)
  169. return aChild;}
  170. return null;}
  171. var TICKER_CONTENT="";var TICKER_RIGHTTOLEFT=false;var TICKER_SPEED=1;var TICKER_STYLE="font-family:Lucida Grande; font-size:13px; color:white";var TICKER_PAUSED=false;var gTickerScrollPos=0;function ticker_start()
  172. {TICKER_CONTENT=document.getElementById("TICKER").innerHTML;TICKER_WIDTH=document.getElementById("TICKER").clientWidth;var img="<img src=ticker_space.gif width="+TICKER_WIDTH+" height=0>";document.getElementById("TICKER").innerHTML="<TABLE  cellspacing='0' cellpadding='0' width='100%'><TR><TD nowrap='nowrap'>"+img+"<SPAN style='"+TICKER_STYLE+"' ID='TICKER_BODY' width='100%'> </SPAN>"+img+"</TD></TR></TABLE>";document.getElementById("TICKER").scrollLeft=TICKER_RIGHTTOLEFT?document.getElementById("TICKER").scrollWidth-document.getElementById("TICKER").offsetWidth:0;document.getElementById("TICKER_BODY").innerHTML=TICKER_CONTENT;document.getElementById("TICKER").style.display="block";startTickerTimer();}
  173. function startTickerTimer()
  174. {if(gTicker!=null)
  175. {clearTimeout(gTicker);gTicker=null;}
  176. Ticker_tick();}
  177. function Ticker_tick()
  178. {if(!TICKER_PAUSED)document.getElementById("TICKER").scrollLeft+=TICKER_SPEED*(TICKER_RIGHTTOLEFT?-1:1);if(TICKER_RIGHTTOLEFT&&document.getElementById("TICKER").scrollLeft<=0)document.getElementById("TICKER").scrollLeft=document.getElementById("TICKER").scrollWidth-document.getElementById("TICKER").offsetWidth;if(!TICKER_RIGHTTOLEFT&&document.getElementById("TICKER").scrollLeft>=document.getElementById("TICKER").scrollWidth-document.getElementById("TICKER").offsetWidth)document.getElementById("TICKER").scrollLeft=0;gTicker=setTimeout("Ticker_tick()",30);}
  179. function saveTickerScroll()
  180. {gTickerScrollPos=document.getElementById("TICKER").scrollLeft;}
  181. function restoreTickerScroll()
  182. {document.getElementById("TICKER").scrollLeft=gTickerScrollPos;}
  183. function latLongTyping(event)
  184. {var latitude=document.getElementById("latitudeField").value;var longitude=document.getElementById("longitudeField").value;if(latitude=='-')
  185. {latitude='0';}
  186. if(longitude=='-')
  187. {longitude='0';}
  188. if(!isNaN(latitude)&&!isNaN(longitude))
  189. {gLatLongValidated=false;var s=latitude+" / "+longitude;setElementByIdInnerText("locationBack",s);setElementByIdValue("postalCodeField","");postLatLongTyping();}
  190. else
  191. {document.getElementById("latitudeField").value=gSituation.location.lat;document.getElementById("longitudeField").value=gSituation.location.lng;}}
  192. function latLongKeyPress(event)
  193. {switch(event.keyCode)
  194. {case 13:case 3:case 9:if(!gLatLongValidated)
  195. {gSituation.location.lat=document.getElementById("latitudeField").value;gSituation.location.lng=document.getElementById("longitudeField").value;findNearestCity();}
  196. break;}}
  197. function findNearestCity()
  198. {if(window.widget)
  199. {var saveElevation=gSituation.location.elevation;gSituation.location.elevation=kDefaultElevation;var url=getRequestURL(kWidgetID,kDashboardWidgetVersion,kGetNearestCityRequest,gSituation);gSituation.location.elevation=saveElevation;gGetNearestCityHttpRequest=new XMLHttpRequest();if(gGetNearestCityHttpRequest.overrideMimeType)
  200. {gGetNearestCityHttpRequest.overrideMimeType('text/xml');}
  201. document.getElementById("locationBack").innerText="Searching...";gGetNearestCityHttpRequest.onreadystatechange=nearestCityCallback;gGetNearestCityHttpRequest.open('GET',url,true);gGetNearestCityHttpRequest.setRequestHeader("Cache-Control","no-cache");gGetNearestCityHttpRequest.send(null);gLatLongValidated=false;preFindNearestCity();}}
  202. function nearestCityCallback()
  203. {if(gGetNearestCityHttpRequest.readyState==4)
  204. {if(gGetNearestCityHttpRequest.status==200)
  205. {var replyFields=new Array();replyFields=gGetNearestCityHttpRequest.responseText.split('|');document.getElementById("locationBack").innerText=replyFields[0];document.getElementById(kLocationFrontElemID).innerText=replyFields[0];gUserLocationPref=replyFields[0];gSituation.location.timezone=replyFields[1];gLatLongValidated=true;postFindNearestCity();trackAction(kWidgetID,kDashboardWidgetVersion,kTrack_NearestCityRequest,false);}
  206. else if(gGetNearestCityHttpRequest.status==404)
  207. {alert("URL doesn't exist");trackAction(kWidgetID,kDashboardWidgetVersion,kTrack_NearestCityRequest,true,"URL doesn't exist");}
  208. else
  209. {alert("There was a problem with the Nearest City request: "+gGetNearestCityHttpRequest.status);alert(gGetNearestCityHttpRequest.statusText);trackAction(kWidgetID,kDashboardWidgetVersion,kTrack_NearestCityRequest,true,"There was a problem with the Nearest City request: ");}}}
  210. var gComposition={showLoading:true,canProcessRequests:true,startTime:0,time:0,startValue:0,endValue:0,duration:1,timer:null,timeout:null,onFinished:null};function handleChartDrawer(event)
  211. {if(window.widget)
  212. {if(!gIsCollapsed)
  213. {document.getElementById(kLocationFrontElemID).innerText=kWidgetTitle;document.getElementById("SNFrontDiv").style.display="none";if(gTransitionOptionsIndexPref!=kFadeInOut)
  214. {document.getElementById(gCompositionElemID).pause();document.getElementById("middle-contents").style.display=="none";}}
  215. else
  216. {document.getElementById(kLocationFrontElemID).innerText=gCurrentLocation;}
  217. toggleView(event);setInfoButtonStyle();setTimeout(sendMiniChartRequest,1000);}}
  218. function abortPendingChartRequest()
  219. {var bResult=false;if(gMiniChartHttpRequest!=null&&gMiniChartHttpRequest.readyState!=4)
  220. {gMiniChartHttpRequest.abort();gMiniChartHttpRequest=null;bResult=true;}}
  221. function sendMiniChartRequest()
  222. {if(!gIsCollapsed&&canProcessRequests())
  223. {if(gTransitionOptionsIndexPref==kFadeInOut)
  224. {}
  225. document.getElementById("statusFront").innerText="";var url=generateRequest();var bReqAborted=abortPendingChartRequest();gMiniChartHttpRequest=new XMLHttpRequest();if(gMiniChartHttpRequest.overrideMimeType)
  226. {gMiniChartHttpRequest.overrideMimeType('text/xml');}
  227. if(!bReqAborted)
  228. {var transitionClass=getTransitionIndexClass(gTransitionOptionsIndexPref);switch(transitionClass)
  229. {case kCubeTransition:var compositionElem=document.getElementById(gCompositionElemID);if(gComposition.timer==null&&compositionElem!=null)
  230. {gComposition.time=0;if(gComposition.showLoading)
  231. {gComposition.startValue=0;gComposition.showLoading=false;}
  232. else
  233. {gComposition.startValue=gUseChart2?-90:90;}
  234. gComposition.endValue=0;compositionElem.setInputValue("time",gComposition.time);compositionElem.setInputValue("startValue",gComposition.startValue);compositionElem.setInputValue("endValue",gComposition.endValue);compositionElem.setInputValue("duration",gComposition.duration);gOldImage1Count=compositionElem.getOutputValue("image1Ready");gOldImage2Count=compositionElem.getOutputValue("image2Ready");gComposition.startTime=new Date();gComposition.onFinished=checkCubeTransitionImgLoaded;gComposition.timer=setInterval(animateComposition,13);}
  235. break;case kCoreImageTransition:var compositionElem=document.getElementById(gCompositionElemID);if(gComposition.timer==null&&compositionElem!=null)
  236. {gComposition.time=0;if(gComposition.showLoading)
  237. {gComposition.startValue=0;gComposition.showLoading=false;}
  238. else
  239. {gComposition.startValue=1;}
  240. gComposition.endValue=0;compositionElem.setInputValue("loadingImageIndex",1);compositionElem.setInputValue("restartLoading",false);compositionElem.setInputValue("restartLoading",true);compositionElem.setInputValue("transitionIndex",gTransitionOptionsIndexPref-1);compositionElem.setInputValue("time",gComposition.time);compositionElem.setInputValue("startValue",gComposition.startValue);compositionElem.setInputValue("endValue",gComposition.endValue);compositionElem.setInputValue("duration",gComposition.duration/2.0);gOldImage1Count=compositionElem.getOutputValue("imageReady");gComposition.startTime=new Date();gComposition.onFinished=checkCITransitionImgLoaded;gComposition.timer=setInterval(animateComposition,13);}
  241. break;case kFadeInOut:break;default:break;}}
  242. gMiniChartHttpRequest.onreadystatechange=miniChartCallback;gMiniChartHttpRequest.open('GET',url,true);gMiniChartHttpRequest.setRequestHeader("Cache-Control","no-cache");gMiniChartHttpRequest.send(null);refreshSituationStatus();refreshWidgetStuff();}
  243. else
  244. {document.getElementById("statusFront").innerText="";}}
  245. function miniChartCallback()
  246. {if(gMiniChartHttpRequest.readyState==4)
  247. {var imageURL=kServerImages;var imageName="";if(gMiniChartHttpRequest.status!=200)
  248. {imageURL=document.URL;var i=imageURL.lastIndexOf("/");imageURL=imageURL.substr(0,i);imageName="/Images/SNAlert.png";gMiniChartHttpRequest.status=200;gMiniChartRequestError=true;}
  249. else
  250. {gMiniChartRequestError=false;imageName=gMiniChartHttpRequest.responseText;}
  251. gMiniChartHttpRequest=null;gUseChart2=!gUseChart2;var transitionClass=getTransitionIndexClass(gTransitionOptionsIndexPref);switch(transitionClass)
  252. {case kCubeTransition:{var compositionElem=document.getElementById(gCompositionElemID);var whichFace=gUseChart2?"Image1URL":"Image2URL";compositionElem.setInputValue(whichFace,imageURL+imageName);}
  253. break;case kCoreImageTransition:{var compositionElem=document.getElementById(gCompositionElemID);compositionElem.setInputValue("imageURL",imageURL+imageName);}
  254. break;case kFadeInOut:{var fadeOutDiv=null;var fadeInDiv=null;if(gUseChart2)
  255. {fadeOutDiv="skyChartFront";fadeInDiv="skyChartFront2";}
  256. else
  257. {fadeOutDiv="skyChartFront2";fadeInDiv="skyChartFront";}
  258. if(gFadeOutEffect!=null)
  259. {gFadeOutEffect.cancel();}
  260. gFadeOutEffect=Effect.Fade(fadeOutDiv,{duration:0.8,to:0.0});document.getElementById(fadeInDiv).setAttribute("style","opacity:0.0;");document.getElementById(fadeInDiv).src=imageURL+imageName;Effect.Appear(fadeInDiv,{duration:0.8,to:1.0});}
  261. break;default:break;}
  262. resetRefreshTimer();trackAction(kWidgetID,kDashboardWidgetVersion,kTrack_ImageRequest,false);}}
  263. function canProcessRequests()
  264. {return gComposition.canProcessRequests;}
  265. function animateComposition()
  266. {var front=document.getElementById("front");if(front!=null&&front.style.display!="none")
  267. {var compositionElem=document.getElementById(gCompositionElemID);if(compositionElem!=null)
  268. {var currentTime=new Date();gComposition.time=(currentTime-gComposition.startTime)/1000;compositionElem.setInputValue("time",gComposition.time);var angle=compositionElem.getOutputValue("currentValue");if(Math.abs(angle-gComposition.endValue)<0.0001)
  269. {clearInterval(gComposition.timer);gComposition.timer=null;if(gComposition.onFinished)
  270. {gComposition.timeout=setTimeout(gComposition.onFinished,0);}}}}}
  271. function checkCubeTransitionImgLoaded()
  272. {var front=document.getElementById("front");if(front!=null&&front.style.display!="none")
  273. {var compositionElem=document.getElementById(gCompositionElemID);if(compositionElem!=null)
  274. {var whichFace=gUseChart2?"Image1URL":"Image2URL";if((whichFace=="Image1URL"&&compositionElem.getOutputValue("image1Ready")==gOldImage1Count||whichFace=="Image2URL"&&compositionElem.getOutputValue("image2Ready")==gOldImage2Count)&&!gMiniChartRequestError)
  275. {gComposition.timeout=setTimeout(checkCubeTransitionImgLoaded,200);}
  276. else
  277. {gComposition.timeout=null;gComposition.canProcessRequests=false;gComposition.time=0;gComposition.startValue=0;gComposition.endValue=gUseChart2?90:-90;compositionElem.setInputValue("time",gComposition.time);compositionElem.setInputValue("startValue",gComposition.startValue);compositionElem.setInputValue("endValue",gComposition.endValue);gComposition.startTime=new Date();gComposition.onFinished=compositionHasFinished;if(gComposition.timer!=null)
  278. {clearInterval(gComposition.timer);}
  279. gComposition.timer=setInterval(animateComposition,13);}}}}
  280. function checkCITransitionImgLoaded()
  281. {var front=document.getElementById("front");if(front!=null&&front.style.display!="none")
  282. {var compositionElem=document.getElementById(gCompositionElemID);if(compositionElem!=null)
  283. {if((compositionElem.getOutputValue("imageReady")==gOldImage1Count)&&!gMiniChartRequestError)
  284. {gComposition.timeout=setTimeout(checkCITransitionImgLoaded,100);}
  285. else
  286. {gComposition.timeout=null;gComposition.canProcessRequests=false;gComposition.time=0;gComposition.startValue=0;gComposition.endValue=1;compositionElem.setInputValue("time",gComposition.time);compositionElem.setInputValue("startValue",gComposition.startValue);compositionElem.setInputValue("endValue",gComposition.endValue);compositionElem.setInputValue("duration",gComposition.duration);gComposition.startTime=new Date();gComposition.onFinished=compositionHasFinished;if(gComposition.timer!=null)
  287. {clearInterval(gComposition.timer);}
  288. gComposition.timer=setInterval(animateComposition,13);}}}}
  289. function compositionHasFinished()
  290. {var front=document.getElementById("front");if(front!=null&&front.style.display!="none")
  291. {var compositionElem=document.getElementById(gCompositionElemID);if(compositionElem!=null)
  292. {var transitionClass=getTransitionIndexClass(gTransitionOptionsIndexPref);if(transitionClass==kCoreImageTransition)
  293. {compositionElem.setInputValue("loadingImageIndex",0);}}}
  294. gComposition.canProcessRequests=true;}
  295. function populateAzimuthOptions()
  296. {var select=document.getElementById('azimuthOptions');var element;if(select!=null)
  297. {element=document.createElement("option");element.innerText="North";select.appendChild(element);element=document.createElement("option");element.innerText="West";select.appendChild(element);element=document.createElement("option");element.innerText="South";select.appendChild(element);element=document.createElement("option");element.innerText="East";select.appendChild(element);}}
  298. function azimuthChanged(select)
  299. {gAzimuthOptionsIndexPref=select.selectedIndex;setAzimuth(gAzimuthOptionsIndexPref);}
  300. function populateTransitionOptions()
  301. {var select=document.getElementById('transitionOptions');var element;element=document.createElement("option");element.innerText="Cube";select.appendChild(element);element=document.createElement("option");element.innerText="Ripple";select.appendChild(element);element=document.createElement("option");element.innerText="Flash";select.appendChild(element);element=document.createElement("option");element.innerText="Page Curl";select.appendChild(element);element=document.createElement("option");element.innerText="Swipe";select.appendChild(element);element=document.createElement("option");element.innerText="Mod";select.appendChild(element);element=document.createElement("option");element.innerText="Fade In/Out";select.appendChild(element);}
  302. function transitionChanged(select)
  303. {gTransitionOptionsIndexPref=select.selectedIndex;}
  304. function getTransitionIndexClass(inIndex)
  305. {var transitionClass=inIndex;if(inIndex>=kCoreImageTransition&&inIndex<kFadeInOut)
  306. {transitionClass=kCoreImageTransition;}
  307. return transitionClass;}
  308. function prepareForNewTransition()
  309. {var oldTransitionClass=getTransitionIndexClass(gOldTransitionOptionsIndexPref);var newTransitionClass=getTransitionIndexClass(gTransitionOptionsIndexPref);if(oldTransitionClass==newTransitionClass)
  310. {return;}
  311. switch(oldTransitionClass)
  312. {case kCubeTransition:{var compositionElem=document.getElementById(gCompositionElemID);compositionElem.pause();var compositionDiv=document.getElementById(kCubeCompositionDivID);compositionDiv.style.display="none";}
  313. break;case kCoreImageTransition:{var compositionElem=document.getElementById(gCompositionElemID);compositionElem.pause();var compositionDiv=document.getElementById(kCoreImageCompositionDivID);compositionDiv.style.display="none";}
  314. break;case kFadeInOut:{var backgroundDiv=document.getElementById(kJSBackgroundElemID);backgroundDiv.style.display="none";var whichDiv=gUseChart2?"skyChartFront":"skyChartFront2";Effect.Fade(whichDiv,{duration:0.8,to:0.0});}
  315. break;default:break;}
  316. switch(newTransitionClass)
  317. {case kCubeTransition:{var compositionDiv=document.getElementById(kCubeCompositionDivID);compositionDiv.style.display="block";gCompositionElemID=kCubeCompositionElemID;}
  318. break;case kCoreImageTransition:{var compositionDiv=document.getElementById(kCoreImageCompositionDivID);compositionDiv.style.display="block";gCompositionElemID=kCoreImageCompositionElemID;}
  319. break;case kFadeInOut:{var backgroundDiv=document.getElementById(kJSBackgroundElemID);backgroundDiv.style.display="block";}
  320. break;default:break;}
  321. gOldTransitionOptionsIndexPref=gTransitionOptionsIndexPref;}
  322. function fadeUpUI(e)
  323. {var x=document.getElementById("middle-contents").clientWidth;var y=document.getElementById("middle-contents").clientHeight;if(document.getElementById("gazeControls").style.opacity<1.0)
  324. {setTimeout('Effect.Appear(gazeControls, { duration:0.4, to:1.0 })',50);}
  325. if(document.getElementById("zoomControls").style.opacity<1.0)
  326. {setTimeout('Effect.Appear(zoomControls, { duration:0.4, to:1.0 })',50);}
  327. if(document.getElementById("cardinalControls")!=null&&document.getElementById("cardinalControls").style.opacity<1.0)
  328. {setTimeout('Effect.Appear(cardinalControls, { duration:0.4, to:1.0 })',50);}
  329. if(document.getElementById("elevationControls")&&document.getElementById("elevationControls").style.opacity<1.0)
  330. {setTimeout('Effect.Appear(elevationControls, { duration:0.4, to:1.0 })',50);}}
  331. function findPos(obj){var curleft=curtop=0;if(obj.offsetParent){curleft=obj.offsetLeft
  332. curtop=obj.offsetTop
  333. while(obj=obj.offsetParent){curleft+=obj.offsetLeft
  334. curtop+=obj.offsetTop}}
  335. return[curleft,curtop];}
  336. function fadeDownUI(e)
  337. {var x=document.getElementById("front").clientWidth;var y=document.getElementById("front").clientHeight;if(e.x>x-1||e.y>y-1||e.x<0||e.y<0)
  338. {if(document.getElementById("gazeControls").style.opacity>0.0)
  339. {setTimeout('Effect.Appear(gazeControls, { duration:0.4, to:0.0 })',50);}
  340. if(document.getElementById("zoomControls").style.opacity>0.0)
  341. {setTimeout('Effect.Appear(zoomControls, { duration:0.4, to:0.0 })',50);}
  342. if(document.getElementById("cardinalControls")!=null&&document.getElementById("cardinalControls").style.opacity>0.0)
  343. {setTimeout('Effect.Appear(cardinalControls, { duration:0.4, to:0.0 })',50);}
  344. if(document.getElementById("elevationControls")&&document.getElementById("elevationControls").style.opacity>0.0)
  345. {setTimeout('Effect.Appear(elevationControls, { duration:0.4, to:0.0 })',50);}}}
  346. function zoomSliderSlid(value)
  347. {var whichDiv=gUseChart2?"skyChartFront2":"skyChartFront";var imageSrcToChange=document.getElementById(whichDiv);var prevValue=gSituation.gaze.FOV;var scaling=prevValue/value;var origHeight=document.getElementById("skyDiv").clientHeight;var origWidth=document.getElementById("skyDiv").clientWidth;imageSrcToChange.style.width=Math.round(origWidth*scaling)+'px';imageSrcToChange.style.height=Math.round(origHeight*scaling)+'px';imageSrcToChange.style.top=(origHeight-imageSrcToChange.clientHeight)/2.0+'px';imageSrcToChange.style.left=(origWidth-imageSrcToChange.clientWidth)/2.0+'px';var gazeStr="Alt: "+gSituation.gaze.alt.toFixed(1)+"  Az: "+gSituation.gaze.az.toFixed(1)+"  FOV: "+value.toFixed(1);document.getElementById(kGazeStatusElemID).innerText=gazeStr;}
  348. function zoomSliderChanged(value)
  349. {if(Math.abs(gSituation.gaze.FOV-value)>kEpsilon)
  350. {gSituation.gaze.FOV=value;refreshSituationStatus();sendMiniChartRequest();}}
  351. function zoomAction(inValue)
  352. {processEvent(inValue);gZoomSlider.setValue(gSituation.gaze.FOV);}
  353. function updateWidgetTitle()
  354. {var divToFadeIn=null;var divToFadeOut=null;if(gFadeTitleIn)
  355. {divToFadeIn=kLocationFrontElemID;divToFadeOut=kWidgetTitleFrontElemID;}
  356. else
  357. {divToFadeIn=kWidgetTitleFrontElemID;divToFadeOut=kLocationFrontElemID;}
  358. gFadeTitleIn=!gFadeTitleIn;Effect.Fade(divToFadeOut,{duration:0.8,to:0.0});Effect.Appear(divToFadeIn,{duration:0.8,to:1.0});}
  359. function refreshSituationStatus()
  360. {var lat=parseFloat(gSituation.location.lat);var lng=parseFloat(gSituation.location.lng);var locationStr="Lat: "+lat.toFixed(2)+"  Long: "+lng.toFixed(2);var gazeStr="Alt: "+gSituation.gaze.alt.toFixed(1)+"  Az: "+gSituation.gaze.az.toFixed(1)+"  FOV: "+gSituation.gaze.FOV.toFixed(1);if(kWidgetID==kMEW_Dashboard)
  361. {document.getElementById(kDateStatusElemID).innerText=gSituation.dateTime.toUTCString();}
  362. else
  363. {var timeString=gSituation.dateTime.toString();if(gSituation.location.useDST)
  364. {timeString+=" (DST)";}
  365. document.getElementById(kDateStatusElemID).innerText=timeString;}
  366. document.getElementById(kLocationStatusElemID).innerText=locationStr;document.getElementById(kGazeStatusElemID).innerText=gazeStr;}
  367. function showPrefs()
  368. {if(gComposition.timer!=null||!canProcessRequests())
  369. {return;}
  370. onHide();saveTickerScroll();var front=document.getElementById("front");var back=document.getElementById("back");if(window.widget)
  371. {if(gIsCollapsed)
  372. {window.resizeTo(kMaxWidgetWidth,kBackHeight);}
  373. widget.prepareForTransition("ToBack");}
  374. front.style.display="none";back.style.display="block";if(window.widget)
  375. {setTimeout('widget.performTransition();',0);window.resizeTo(kMaxWidgetWidth,kBackHeight);}
  376. loadPrefsUI();gOldTransitionOptionsIndexPref=gTransitionOptionsIndexPref;}
  377. function resizeWindowForPrefs()
  378. {if(window.widget)
  379. {var elemStyle=document.defaultView.getComputedStyle(divider,"");var topHeight=parseInt(elemStyle.getPropertyValue("top"));var currentTabViewHeight=document.getElementById("tabDiv"+gCurrentTabPref).clientHeight;var elemStyle=document.defaultView.getComputedStyle(divider2,"");var bottomHeight=parseInt(elemStyle.getPropertyValue("bottom"));var wH=topHeight+currentTabViewHeight+bottomHeight;window.resizeTo(kMaxWidgetWidth,wH);}}
  380. function selectTab(inWhichTab)
  381. {if(gCurrentTabPref!=inWhichTab)
  382. {savePrefsFromUI();var currentTabView=document.getElementById("tabDiv"+gCurrentTabPref);var newTabView=document.getElementById("tabDiv"+inWhichTab);Effect.Fade(currentTabView,{duration:0.8,to:0.0});Effect.Appear(newTabView,{duration:0.8,to:1.0});var oldTab=gCurrentTabPref;gCurrentTabPref=inWhichTab;setTabImage("tabImg"+gCurrentTabPref,gCurrentTabPref,true);setTabImage("tabImg"+oldTab,oldTab,false);currentTabView.style.zIndex=999;newTabView.style.zIndex=1000;}}
  383. function loadTabImages(inImage,inImageON,inIndex)
  384. {var img=new Image;img.src=inImage;gTabImagesA[inIndex]=img;img=new Image;img.src=inImageON;gTabONImagesA[inIndex]=img;}
  385. function setTabImage(inElem,inImageIndex,inTurnON)
  386. {if(inElem)
  387. {var elem=document.getElementById(inElem);if(elem)
  388. {if(inTurnON)
  389. {elem.src=gTabONImagesA[inImageIndex].src;}
  390. else
  391. {if(gCurrentTabPref!=inImageIndex)
  392. {elem.src=gTabImagesA[inImageIndex].src;}}}}}
  393. function restoreGaze()
  394. {if(window.widget)
  395. {setAzimuth(gAzimuthOptionsIndexPref);if(gElevationState==kSurfaceState)
  396. {gSituation.gaze.alt=kDefaultAlt;gSituation.gaze.FOV=kDefaultFOV;}
  397. else
  398. {gSituation.gaze.alt=kDefaultAboveAlt;gSituation.gaze.FOV=45.0;}}}
  399. function setPreference(inPref,inDefaultValue)
  400. {var result=inDefaultValue;if(inPref&&inPref.length>0)
  401. {result=inPref;}
  402. return result;}
  403. function createKey(key)
  404. {return widget.identifier+"-"+key;}
  405. function changePref(inField,inPref)
  406. {var state=document.getElementById(inField).checked?"Yes":"No";}
  407. function prefLabelClick(inField,inPref)
  408. {var element=document.getElementById(inField);element.checked=!element.checked;changePref(inField,inPref);}
  409. function setAzimuth(inAzimuthIndex)
  410. {switch(inAzimuthIndex)
  411. {case kNorthIndex:gSituation.gaze.az=0;break;case kWestIndex:gSituation.gaze.az=270;break;case kSouthIndex:gSituation.gaze.az=180;break;case kEastIndex:gSituation.gaze.az=90;break;}}
  412. function setDefaultFOV()
  413. {gSituation.gaze.FOV=(gElevationState==kSurfaceState)?kDefaultFOV:kDefaultAboveFOV;}
  414. function setDefaultAltitude()
  415. {gSituation.gaze.alt=(gElevationState==kSurfaceState)?kDefaultAlt:kDefaultAboveAlt;}
  416. function setDefaultElevation()
  417. {gSituation.location.elevation=(gElevationState==kSurfaceState)?kDefaultElevation:kAboveElevation;}
  418. function isLeapYear(inYear)
  419. {var year=parseInt(inYear);if(year%4==0)
  420. {if(year%100!=0)
  421. {return true;}
  422. else
  423. {if(year%400==0)
  424. return true;else
  425. return false;}}
  426. return false;}
  427. function populateMonthsAndTime()
  428. {var select=document.getElementById('monthOptions');var element;var i=0;for(i=0;i<kMonthNames.length;i++)
  429. {element=document.createElement("option");element.innerText=kMonthNames[i];select.appendChild(element);}
  430. select=document.getElementById('timeOptions');for(i=0;i<=11;i++)
  431. {element=document.createElement("option");element.innerText=String(i);select.appendChild(element);}
  432. select=document.getElementById('amPmOptions');element=document.createElement("option");element.innerText="am";select.appendChild(element);element=document.createElement("option");element.innerText="pm";select.appendChild(element);}
  433. function populateDays(inYear,inMonth)
  434. {var select=document.getElementById('dayOptions');var element;var i=0;var month=parseInt(inMonth);var monthLength=kMonthLength[parseInt(inMonth)];if(month==1&&isLeapYear(inYear))
  435. {monthLength=29;}
  436. if(select.length!=monthLength)
  437. {for(i=select.length;i>0;i--)
  438. {select.remove(i-1);}
  439. for(i=0;i<monthLength;i++)
  440. {element=document.createElement("option");element.innerText=String(i+1);select.appendChild(element);}}}
  441. function setElementByIdValue(inElement,inValue)
  442. {var element=document.getElementById(inElement);if(element!=null)
  443. {element.value=inValue;}}
  444. function setElementByIdInnerText(inElement,inText)
  445. {var element=document.getElementById(inElement);if(element!=null)
  446. {element.innerText=inText;}}
  447. var kTopHeight=38;var kSituationStatusHeight=32;var kBottomHeight=31;var kSidesWidth=12;var kMaxImageHeight=262;var kMinImageHeight=0;var kMaxImageWidth=420;var kMaxWidgetHeight=kTopHeight+kSituationStatusHeight+kMaxImageHeight+kBottomHeight;var kMaxWidgetWidth=kMaxImageWidth+2*kSidesWidth;var kMinWidgetHeight=kTopHeight+kBottomHeight;var kMinWidgetWidth=kMaxImageWidth+2*kSidesWidth;var gResizeAnimation={startTime:0,duration:kMaxImageHeight,positionFrom:0,positionTo:0,positionNow:0,frameFrom:0,frameTo:0,frameNow:0,timer:null,element:null,image:null,background:null,onfinished:null};function limit_3(a,b,c)
  448. {return a<b?b:(a>c?c:a);}
  449. function computeNextFloat(from,to,ease)
  450. {return from+(to-from)*ease;}
  451. function calculateBackgroundHeight()
  452. {var height;if(gIsCollapsed)
  453. height=kMinImageHeight;else
  454. height=kMaxImageHeight+kSituationStatusHeight;return height;}
  455. function animate()
  456. {var T;var ease;var time=(new Date).getTime();var yLoc;var frame;T=limit_3(time-gResizeAnimation.startTime,0,gResizeAnimation.duration);ease=0.5-(0.5*Math.cos(Math.PI*T/gResizeAnimation.duration));if(T>=gResizeAnimation.duration)
  457. {yLoc=gResizeAnimation.positionTo;clearInterval(gResizeAnimation.timer);gResizeAnimation.timer=null;if(gResizeAnimation.onfinished)
  458. setTimeout(gResizeAnimation.onfinished,0);}
  459. else
  460. yLoc=computeNextFloat(gResizeAnimation.positionFrom,gResizeAnimation.positionTo,ease);gResizeAnimation.positionNow=Math.round(yLoc);gResizeAnimation.element.style.height=gResizeAnimation.positionNow+"px";}
  461. function animFinished()
  462. {if(window.widget)
  463. {if(gIsCollapsed)
  464. {window.resizeTo(kMaxWidgetWidth,kMinWidgetHeight);}
  465. else
  466. {document.getElementById("SNFrontDiv").style.display="block";if(gTransitionOptionsIndexPref!=kFadeInOut)
  467. {document.getElementById("middle-contents").style.display=="block";var compositionElem=document.getElementById(gCompositionElemID);if(compositionElem&&compositionElem.paused())
  468. {compositionElem.play();}}}
  469. widget.setPreferenceForKey(gIsCollapsed?kYES:kNO,createKey(kCollapsedKey));}}
  470. function toggleView(event)
  471. {var midDiv=document.getElementById("middle");var timeNow=(new Date).getTime();var multiplier=(event.shiftKey?10:1);var startingSize=Math.round(midDiv.clientHeight,10);gResizeAnimation.element=midDiv;if(gResizeAnimation.timer!=null)
  472. {clearInterval(gResizeAnimation.timer);gResizeAnimation.timer=null;gResizeAnimation.duration-=(timeNow-gResizeAnimation.startTime);gResizeAnimation.positionFrom=gResizeAnimation.positionNow;}
  473. else
  474. {gResizeAnimation.duration=kMaxImageHeight*multiplier;gResizeAnimation.positionFrom=startingSize;}
  475. gIsCollapsed=!gIsCollapsed;var resizeTo=calculateBackgroundHeight();if(!gIsCollapsed&&window.widget)
  476. window.resizeTo(kMaxWidgetWidth,kMaxWidgetHeight);gResizeAnimation.positionTo=Math.round(resizeTo);gResizeAnimation.startTime=timeNow-13;gResizeAnimation.onfinished=animFinished;gResizeAnimation.element.style.height=startingSize+"px";gResizeAnimation.timer=setInterval("animate();",13);animate();}