var FlashGallery = new JS.Class({
include: JS.Observable,
on: function(eventName, callback, scope) {
this.addObserver(function() {
var args = Array.from(arguments), message = args.shift();
if (message != eventName) return;
callback.apply(scope || null, [this].concat(args));
}, this);
},
initialize: function(element, flashSource, config, options) {
this._element = element;
this._flashSource = flashSource;
this._config = config || {};
this._options = options || {};
},
setup: function() {
var flashVersion = deconcept.SWFObjectUtil.getPlayerVersion();
if (flashVersion.major < 8) return this.handleNoFlash();
this._elements = {};
this._entries = this.klass.Entry.fromConfig(this, this._config);
this._element.parentNode.insertBefore(this.getHTML(), this._element.nextSibling);
var video = this.findEntryByURL(null);
if (video) this.displayEntry(video);
this.setupSlider();
},
handleNoFlash: function() {
this._element.innerHTML = '
You need Adobe Flash player installed ' +
'to view this content. You can
' +
'download Flash from the Adobe website.
';
},
getHTML: function() {
var elements = this._elements;
if (elements._container) return elements._container;
var container = elements._container = document.createElement('div');
container.className = this.klass.CONTAINER_CLASS;
var slider = elements._slider = document.createElement('div');
slider.className = this.klass.SLIDER_CLASS;
container.appendChild(slider);
return container;
},
getContainer: function() {
return this.getHTML();
},
getSlider: function() {
this.getHTML();
return this._elements._slider;
},
setupSlider: function() {
var pager = new Ojay.Paginator(this._elements._slider, {
rows: 5,
columns: 1,
direction: 'vertical'
}).setup();
pager.addControls('after');
},
findEntryByURL: function(url) {
for (var i = 0, n = this._entries.length; i < n; i++) {
if (this._entries[i].getVideoSource() == url)
return this._entries[i];
}
return this._entries[0] || null;
},
displayEntry: function(entry) {
if (!entry.getType) return;
var oldEntry = this.getCurrentEntry();
this._currentEntry = entry;
switch (entry.getType()) {
case 'media':
this.swapSWF(this.swfDataFromEntry(entry));
break;
}
this.notifyObservers('itemchange', oldEntry, this.getCurrentEntry());
},
swapSWF: function(data) {
var so, region = YAHOO.util.Dom.getRegion(this._element);
var width = region.right - region.left, height = region.bottom - region.top;
so = new SWFObject(this._flashSource, 'small-videoplayer', width, height, 9, this.getBackgroundColor());
so.addParam("allowfullscreen", "true");
so.addParam("allowScriptAccess", "always");
so.addParam("wmode", "transparent");
so.addVariable("trackingJS", this.klass.TRACKING_FUNCTION);
for (var param in data) so.addVariable(param, data[param]);
so.write(this._element);
},
swfDataFromEntry: function(entry) {
return {};
},
getBackgroundColor: function() {
return '#ffffff';
},
getCurrentEntry: function() {
return this._currentEntry;
},
extend: {
CONTAINER_CLASS: 'flash-thumbs',
SLIDER_CLASS: 'slider',
PREV_BUTTON_CLASS: 'button previous',
NEXT_BUTTON_CLASS: 'button next',
PAGING_CLASS: 'flash-thumbs-paging',
TRACKING_FUNCTION: 'trackVideoView',
Entry: new JS.Class({
extend: {
ITEM_CLASS: 'item',
fromConfig: function(gallery, config) {
var entries = [], block;
for (var thumbpath in config) {
if (!config.hasOwnProperty(thumbpath)) continue;
block = config[thumbpath];
block.thumbPath = thumbpath;
entries.push(new this(gallery, block));
}
return entries;
}
},
initialize: function(gallery, config) {
this.gallery = gallery;
this._config = config;
this._elements = {};
this.gallery.getSlider().appendChild(this.getHTML());
var self = this;
YAHOO.util.Event.on(this.getContainer(), 'click', function() {
gallery.displayEntry(self);
});
if (!this.getCaption()) return;
this._tooltip = new FlashGallery.Tooltip();
this._tooltip.setText(this.getCaption());
YAHOO.util.Event.on(this.getContainer(), 'mouseover', this._tooltip.method('show'));
YAHOO.util.Event.on(this.getContainer(), 'mouseout', this._tooltip.method('hide'));
},
getHTML: function() {
var elements = this._elements;
if (elements._container) return elements._container;
var container = elements._container = document.createElement('div');
container.className = this.klass.ITEM_CLASS;
var image = elements._image = document.createElement('img');
image.src = this.getThumbnailSource();
var dims = this.getThumbnailSize();
image.width = dims.width;
image.height = dims.height;
container.appendChild(image);
var playicon = elements._playicon = document.createElement('span');
playicon.className = 'playicon';
container.appendChild(playicon);
return container;
},
getContainer: function() {
return this.getHTML();
},
getRegion: function() {
return YAHOO.util.Dom.getRegion(this.getContainer());
},
getImage: function() {
this.getHTML();
return this._elements._image;
},
getThumbnailSource: function() {
return this._config.thumbPath || null;
},
getThumbnailSize: function() {
return {
width: this._config.thumbWidth,
height: this._config.thumbHeight
};
},
getType: function() {
return this._config.type || null;
},
getCaption: function() {
return this._config.caption || null;
}
}),
Tooltip: new JS.Class({
initialize: function() {
this._element = document.createElement('div');
this._element.className = 'tooltip';
this._element.style.zIndex = 40000;
document.body.appendChild(this._element);
this.hide();
YAHOO.util.Event.on(document.body, 'mousemove', this.method('updatePosition'));
},
updatePosition: function(evnt) {
if (!this._visible) return;
var position = YAHOO.util.Event.getXY(evnt);
FlashGallery.setStyle(this._element, {
position: 'absolute',
left: (position[0] - 18) + 'px',
top: (position[1] + 16) + 'px'
});
},
setText: function(text) {
this._element.innerHTML = text;
},
show: function() {
this._visible = true;
this._element.style.display = '';
},
hide: function() {
this._visible = false;
this._element.style.display = 'none';
}
}),
setStyle: function(element, styles) {
for (var style in styles)
YAHOO.util.Dom.setStyle(element, style, styles[style]);
}
}
});
var WebcastGallery = new JS.Class(FlashGallery, {
initialize: function() {
this.callSuper();
this.klass._instance = this;
},
swfDataFromEntry: function(entry) {
return {
videoPath: entry.getVideoSource() || '',
picPath: entry.getHoldingImageSource() || '',
captionText: entry.getCaption() || '',
shareBtn: 'WebcastGallery.share',
rssBtn: 'WebcastGallery.showRSS'
};
},
getBackgroundColor: function() {
return '#000000';
},
extend: {
CAPTION_CLASS: 'flash-gallery-caption',
OVERLAY_CLASS: 'share-overlay',
OVERLAY_ID: 'overlayContent',
SHARE_URL: '/share.html?url=',
getInstance: function() {
return this._instance || null;
},
share: function() {
var instance = this.getInstance();
if (!instance) return;
var url = instance.getCurrentEntry().getPermalink();
if (!url) return alert('Sorry, this video cannot be shared at the moment');
_$('#' + this.OVERLAY_ID).setStyle('top', (YAHOO.util.Dom.getDocumentScrollTop(document) + 50) + 'px');
url = encodeURIComponent(decodeURIComponent( url ));
showOverlay(this.SHARE_URL + url, this.OVERLAY_CLASS, 0.95, 'Cancel', this.hijackShareForm.bind(this));
},
hijackShareForm: function() {
var form = _$('.share-form form').el[0], Y = YAHOO.util;
if (!form) return;
Y.Event.on(form, 'submit', function(e) {
Y.Event.preventDefault(e);
Y.Connect.setForm(form);
Y.Connect.asyncRequest('POST', form.action, {
success: function(response) {
var overlay = _$('#' + this.OVERLAY_ID);
overlay.setContent(response.responseText);
// showOverlay should be refactored to clean this up
overlay.create('div', {id: 'overlayCloseButton'}, function(el) {
this.append(el);
_$(el).setContent('Close').on('click', function(el) {
hideOverlay(this.OVERLAY_CLASS, 0.95);
});
});
this.hijackShareForm();
}.bind(this)
});
Y.Connect.resetFormState();
}.bind(this));
// Hijack privacy link
var privs = _$('a[href=/privacy.html]').el;
var link = privs.pop();
if (!link) return;
var container = _$('#privacyStatement'), height, visible = false;
Y.Event.on(link, 'click', function(e) {
Y.Event.preventDefault(e);
visible
? container.animate({opacity: {to: 0}, height: {to: 0}}, 0.5, Y.Easing.easeOut, {
after: function() { visible = false; }
})
: container.animate({opacity: {to: 1}, height: {to: height}}, 0.5, Y.Easing.easeOut, {
after: function() { visible = true; }
});
});
Y.Connect.asyncRequest('GET', '/privacy-no-layout.html', {
success: function(response) {
container.setContent(response.responseText);
var region = Y.Dom.getRegion(container.el[0]);
height = region.bottom - region.top;
container.setStyle('height', 0).setStyle('opacity', 0);
}
});
},
showRSS: function() {
var instance = this.getInstance();
if (!instance) return;
window.location.href = instance.getCurrentEntry().getRSSLink();
},
Entry: new JS.Class(FlashGallery.Entry, {
getVideoSource: function() {
return this._config.src || null;
},
getHoldingImageSource: function() {
return this._config.holdingImage || null;
},
getPermalink: function() {
return this._config.permalink || null;
},
getRSSLink: function() {
return this._config.playlist || null;
}
})
}
});
var SlideshowGallery = new JS.Class(FlashGallery, {
swfDataFromEntry: function(entry) {
return {
xmlPath: entry.getXMLPath() || '',
galleryID: entry.getGalleryID() || '',
category: entry.getCategory() || ''
};
},
getBackgroundColor: function() {
return '#ffffff';
},
extend: {
Entry: new JS.Class(FlashGallery.Entry, {
getTitle: function() {
return this._config.title || null;
},
getXMLPath: function() {
return this._config.xmlPath || null;
},
getGalleryID: function() {
return this._config.galleryId || null;
},
getCategory: function() {
return this._config.category || null;
},
getVideoSource: function() {
return this.getGalleryID();
}
})
}
});