JAVASCRIPT 26
YouTube.js Guest on 27th April 2021 07:50:12 PM
  1. //
  2. //  iWeb - YouTube.js
  3. //  Copyright (c) 2008 Apple Inc. All rights reserved.
  4. //
  5. var YouTubeWidget = Class.create(Widget, {
  6.     widgetIdentifier: "com-apple-iweb-widget-YouTube",
  7.     thumbnailURL: null,
  8.     initialize: function($super, instanceID, widgetPath, sharedPath, sitePath, preferences, runningInApp) {
  9.         if (instanceID) {
  10.             $super(instanceID, widgetPath, sharedPath, sitePath, preferences, runningInApp);
  11.             if (this.runningInApp) {
  12.                 window.onresize = this.resize.bind(this);
  13.             }
  14.             var parentDiv = this.div("youTube");
  15.             this.m_views = {};
  16.             this.m_views["movie"] = new YouTubeMovieView(this, parentDiv);
  17.             if (runningInApp) {
  18.                 this.m_views["no-movie-status"] = new YouTubeNoMovieStatus(this, parentDiv);
  19.                 this.m_views["invalid-url-status"] = new YouTubeInvalidURLStatus(this, parentDiv);
  20.                 this.m_views["user-offline-status"] = new YouTubeUserOfflineStatus(this, parentDiv);
  21.             } else {
  22.                 this.m_views["no-movie-status"] = new YouTubePublishedErrorStatus(this, parentDiv);
  23.                 this.m_views["invalid-url-status"] = this.m_views["no-movie-status"];
  24.                 this.m_views["user-offline-status"] = this.m_views["no-movie-status"];
  25.             }
  26.             this.showView("no-movie-status");
  27.             this.setPreferenceForKey(false, "x-snapshotAvailable", false);
  28.             this.updateFromPreferences();
  29.         }
  30.     },
  31.     changedPreferenceForKey: function(key) {
  32.         var widgetDiv = this.div();
  33.         if (this.preferenceForKey("x-online") === false) {
  34.             this.showView("user-offline-status");
  35.         } else if ((key == 'showRelatedVideos') || (key == 'address')) {
  36.             this.updateFromPreferences();
  37.         } else if (key == 'x-thumbnailMode') {
  38.             if (this.thumbnailURL != null) {
  39.                 if (this.preferenceForKey(key)) {
  40.                     this.m_views["movie"].showThumbnail(true);
  41.                 } else {
  42.                     this.m_views["movie"].showThumbnail(false);
  43.                 }
  44.             } else {}
  45.         }
  46.     },
  47.     updateFromPreferences: function() {
  48.         if (!this.normalizingAddress) {
  49.             this.normalizingAddress = true;
  50.             var specifiedAddress = this.preferenceForKey("address");
  51.             var viewToShow = "no-movie-status";
  52.             if (specifiedAddress && (specifiedAddress.length > 0)) {
  53.                 var movieURL = this.preferenceForKey("movieURL");
  54.                 if (specifiedAddress != this.preferenceForKey('lastNormalizedAddress')) {
  55.                     movieURL = null;
  56.                     this.setPreferenceForKey(0, "x-mediaDuration", false);
  57.                     var youTubeURL = this.p_scrapeYouTubeURLFromString(specifiedAddress);
  58.                     var videoGUID = this.p_scrapeVideoGUIDFromString(youTubeURL);
  59.                     var params = youTubeURL.toQueryParams();
  60.                     if (videoGUID && videoGUID.length > 0) {
  61.                         var newQueryParams = {};
  62.                         ['color1', 'color2', 'border'].each(function(property) {
  63.                             var value = params[property];
  64.                             if (value) {
  65.                                 newQueryParams[property] = value;
  66.                             }
  67.                         });
  68.                         movieURL = "http://www.youtube.com/v/" + videoGUID;
  69.                         var queryParamString = $H(newQueryParams).toQueryString();
  70.                         movieURL += ((queryParamString.length == 0) ? "" : ("&" + queryParamString));
  71.                         if (movieURL != this.preferenceForKey("movieURL")) {
  72.                             this.redoThumbnail(videoGUID);
  73.                         }
  74.                         var normalizedAddress = "http://www.youtube.com/watch?v=" + videoGUID;
  75.                         this.setPreferenceForKey(normalizedAddress, "lastNormalizedAddress", false);
  76.                         this.setPreferenceForKey(normalizedAddress, "address", false);
  77.                         var rel = params['rel'];
  78.                         if (rel !== undefined) {
  79.                             this.setPreferenceForKey((rel !== "0"), "showRelatedVideos", false);
  80.                         }
  81.                         this.setPreferenceForKey(true, "x-snapshotAvailable", false);
  82.                     }
  83.                 }
  84.                 var showRelatedVideos = this.preferenceForKey("showRelatedVideos");
  85.                 if (movieURL && (showRelatedVideos !== undefined)) {
  86.                     var tempQueryParams = $H(movieURL.httpURLQueryString().toQueryParams());
  87.                     if (showRelatedVideos) {
  88.                         tempQueryParams.unset("rel");
  89.                     } else {
  90.                         tempQueryParams.set("rel", "0");
  91.                     }
  92.                     movieURL = movieURL.split("&")[0];
  93.                     var queryParamString = tempQueryParams.toQueryString();
  94.                     movieURL += ((queryParamString.length == 0) ? "" : ("&" + queryParamString));
  95.                 }
  96.                 if (movieURL != this.preferenceForKey("movieURL")) {
  97.                     this.setPreferenceForKey(movieURL, "movieURL", false);
  98.                 }
  99.                 var viewToShow = (movieURL && movieURL.isHTTPURL && movieURL.isHTTPURL() ? "movie" : "invalid-url-status");
  100.                 this.m_views[viewToShow].render();
  101.             }
  102.             this.m_currentViewName = viewToShow;
  103.             this.showView(viewToShow);
  104.             this.normalizingAddress = undefined;
  105.         }
  106.     },
  107.     redoThumbnail: function(videoGUID) {
  108.         this.thumbnailURL = null;
  109.         var thumbnailURL = null;
  110.         new Ajax.Request("http://gdata.youtube.com/feeds/api/videos/" + videoGUID, {
  111.             method: 'get',
  112.             onFailure: function(request) {
  113.                 this.setPreferenceForKey(false, "x-snapshotAvailable", false);
  114.                 this.render();
  115.             }.bind(this),
  116.             onSuccess: function(request) {
  117.                 var entryNode = ajaxGetDocumentElement(request);
  118.                 var mediaNS = "http://search.yahoo.com/mrss/";
  119.                 var youTubeNS = "http://gdata.youtube.com/schemas/2007";
  120.                 var mediaGroup = entryNode.getElementsByTagNameNS(mediaNS, "group");
  121.                 if (mediaGroup && mediaGroup[0]) {
  122.                     var maxHeight = 0;
  123.                     var mediaThumbnails = mediaGroup[0].getElementsByTagNameNS(mediaNS, "thumbnail");
  124.                     $A(mediaThumbnails).each(function(element) {
  125.                         var height = parseInt(element.getAttribute("height"));
  126.                         if (height > maxHeight) {
  127.                             maxHeight = height;
  128.                             thumbnailURL = element.getAttribute("url");
  129.                         }
  130.                     }.bind(this));
  131.                     this.m_views["movie"].setThumbnailURL(thumbnailURL);
  132.                     this.thumbnailImage = IWCreateImage(thumbnailURL);
  133.                     this.thumbnailImage.load(function() {
  134.                         this.thumbnailURL = thumbnailURL;
  135.                         this.setPreferenceForKey(true, "x-snapshotAvailable", false);
  136.                         this.setPreferenceForKey(true, "x-snapshotReady", false);
  137.                     }.bind(this));
  138.                     var duration = mediaGroup[0].getElementsByTagNameNS(youTubeNS, "duration");
  139.                     if (duration && duration[0]) {
  140.                         var seconds = parseFloat(duration[0].getAttribute("seconds"));
  141.                         if (seconds > 0) {
  142.                             this.setPreferenceForKey(seconds, "x-mediaDuration", false);
  143.                         }
  144.                     }
  145.                 }
  146.             }.bind(this)
  147.         });
  148.     },
  149.     resize: function() {
  150.         $H(this.m_views).each(function(pair) {
  151.             pair.value.resize();
  152.         });
  153.     },
  154.     onload: function() {
  155.         if (!this.runningInApp) {}
  156.     },
  157.     onunload: function() {},
  158.     p_scrapeYouTubeURLFromString: function(specifiedAddress) {
  159.         var address = specifiedAddress;
  160.         var match = specifiedAddress.match(/(value|src)\s*\=\s*([']([^']+)[']|["]([^"]+)["])/);
  161.         if (match && match.length == 5) {
  162.             address = match[3] || match[4];
  163.         }
  164.         return address.strip();
  165.     },
  166.     p_scrapeVideoGUIDFromString: function(specifiedAddress) {
  167.         var videoGUID = null;
  168.         var match = specifiedAddress.match(/^([a-zA-Z0-9_\-]*\d[a-zA-Z0-9_\-]*)$/);
  169.         if (match) {
  170.             videoGUID = match[1];
  171.         } else {
  172.             match = specifiedAddress.match(/^(http[s]?:\/\/)?(\w+\.)?youtube\.com(\/.+)$/);
  173.             if (match && match.length == 4) {
  174.                 var pathAndParams = match[3];
  175.                 var params = specifiedAddress.toQueryParams();
  176.                 var videoGUID = params["v"];
  177.                 if (videoGUID == null) {
  178.                     match = pathAndParams.match(/^\/v\/([^\/&\?]+)/);
  179.                     if (match) {
  180.                         videoGUID = match[1];
  181.                     }
  182.                 }
  183.             }
  184.         }
  185.         return videoGUID;
  186.     }
  187. });
  188. var YouTubeMovieView = Class.create(View, {
  189.     m_divId: "movie",
  190.     m_divClass: "YouTubeMovie",
  191.     m_thumbnailURL: "",
  192.     setThumbnailURL: function(url) {
  193.         if (this.m_thumbnailURL != url) {
  194.             this.m_thumbnailURL = url;
  195.             this.render();
  196.         }
  197.     },
  198.     render: function() {
  199.         if (this.preferences && this.preferences.postNotification) {
  200.             this.m_widget.preferences.postNotification("BLWidgetIsSafeToDrawNotification", 0);
  201.         }
  202.         var markup = '<img style="visibility: hidden; position: absolute; width:100%; height:100%;" src="' + this.m_thumbnailURL + '" />' + '<object style="visibility: visible; position:absolute; width:100%; height:100%">' + '<param name="movie" value="' + this.m_widget.preferenceForKey('movieURL') + '"></param>' + '<param name="wmode" value="transparent">' + '<embed src="' + this.m_widget.preferenceForKey('movieURL') + '" type="application/x-shockwave-flash" wmode="transparent" width="100%" height="100%"></embed>' + '</object>';
  203.         this.ensureDiv().update(markup);
  204.         if (this.runningInApp) {
  205.             setTimeout(function() {
  206.                 if (this.preferences && this.preferences.postNotification) {
  207.                     this.m_widget.preferences.postNotification("BLWidgetIsSafeToDrawNotification", 1);
  208.                 }
  209.                 if (this.m_widget.preferenceForKey("x-snapshotAvailable") === false) {
  210.                     this.m_widget.setPreferenceForKey(true, "x-timeElapsedAfterMovieLoad", false);
  211.                 }
  212.             }.bind(this), 1000);
  213.         }
  214.     },
  215.     showThumbnail: function(flag) {
  216.         var theImg = this.ensureDiv().select('img')[0];
  217.         var theObj = this.ensureDiv().select('object')[0];
  218.         if (theImg && theObj) {
  219.             if (flag) {
  220.                 theObj.setStyle({
  221.                     visibility: "hidden"
  222.                 });
  223.                 theImg.setStyle({
  224.                     visibility: "visible"
  225.                 });
  226.             } else {
  227.                 theImg.setStyle({
  228.                     visibility: "hidden"
  229.                 });
  230.                 theObj.setStyle({
  231.                     visibility: "visible"
  232.                 });
  233.             }
  234.         }
  235.     }
  236. });
  237. var YouTubeNoMovieStatus = Class.create(StatusView, {
  238.     m_divId: "no-movie-status",
  239.     m_divClass: "YouTubeStatusView",
  240.     badgeImage: "youtube-placeholder.png",
  241.     badgeImageWidth: 128,
  242.     badgeImageHeight: 69
  243. });
  244. var YouTubeInvalidURLStatus = Class.create(StatusView, {
  245.     m_divId: "invalid-url-status",
  246.     m_divClass: "YouTubeStatusView",
  247.     badgeImage: "youtube-placeholder_disabled.png",
  248.     badgeImageWidth: 128,
  249.     badgeImageHeight: 69,
  250.     statusMessageKey: "<b>The YouTube URL you entered is invalid.</b><br />Double-check the URL on YouTube, and then try again.",
  251.     upperRightBadge: "error-glyph.png",
  252.     upperRightBadgeWidth: 24,
  253.     upperRightBadgeHeight: 19
  254. });
  255. var YouTubeUserOfflineStatus = Class.create(StatusView, {
  256.     m_divId: "user-offline-status",
  257.     m_divClass: "YouTubeStatusView",
  258.     badgeImage: "youtube-placeholder_disabled.png",
  259.     badgeImageWidth: 128,
  260.     badgeImageHeight: 69,
  261.     statusMessageKey: "<b>You must be connected to the Internet to view the YouTube movie.</b>",
  262.     upperRightBadge: "error-glyph.png",
  263.     upperRightBadgeWidth: 24,
  264.     upperRightBadgeHeight: 19
  265. });
  266. var YouTubePublishedErrorStatus = Class.create(StatusView, {
  267.     m_divId: "published-error-status",
  268.     m_divClass: "YouTubeStatusView",
  269.     badgeImage: "youtube-placeholder.png",
  270.     badgeImageWidth: 128,
  271.     badgeImageHeight: 69
  272. });

Paste-bin is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste

Login or Register to edit or fork this paste. It's free.