var Videobox = new Class({
  Implements:Options,
  
  options: {
    resizeDuration: 400,	// Duration of height and width resizing (ms)
    initialWidth: 250,		// Initial width of the box (px)
    initialHeight: 250,		// Initial height of the box (px)
    defaultWidth: 425,		// Default width of the box (px)
    defaultHeight: 350,	// Default height of the box (px)
    animateCaption: true,	// Enable/Disable caption animation
    flvplayer: '/_scripts/videobox/flvplayer.swf'    
  },
  
	initialize:function (options) {
		// init default options
		this.setOptions(options);

		this.anchors = [];
		$A($$('a')).each(function(el){
			if(el.rel && el.href && el.rel.test('^vidbox', 'i')) {
				el.addEvent('click', function(e) {
          e = new Event(e);
          e.stop();
          this.click(el);
				}.bind(this));
				this.anchors.push(el);
			}
    }, this);

		this.overlay = new Element('div',{
      'id': 'lbOverlay'
    }).inject(document.body);
		this.center = new Element('div',{
      'id': 'lbCenter',
      'styles': {
        'width': this.options.initialWidth+'px',
        'height': this.options.initialHeight+'px',
        'margin-left': '-'+(this.options.initialWidth/2)+'px',
        'display': 'none'
      }
    }).inject(document.body);

		this.bottomContainer = new Element('div',{
      'id': 'lbBottomContainer',
      'styles': {
        'display': 'none'
      }
    }).injectInside(document.body);
		this.bottom = new Element('div',{
      'id': 'lbBottom'
    }).inject(this.bottomContainer);
		new Element('a',{
      'id': 'lbCloseLink',
      'href': '#'
    }).inject(this.bottom).onclick = this.overlay.onclick = this.close.bind(this);
		this.caption = new Element('div',{
      'id': 'lbCaption'
    }).inject(this.bottom);
		this.number = new Element('div',{
      'id': 'lbNumber'
    }).inject(this.bottom);
		new Element('div').setStyle('clear', 'both').inject(this.bottom);

		var nextEffect = this.nextEffect.bind(this);
		this.fx = {
			overlay: new Fx.Tween(this.overlay, {property:'opacity',duration:500}).set(0),
			center: new Fx.Morph(this.center, {duration: 500, transition: Fx.Transitions.sineInOut, onComplete: nextEffect}),
			bottom: new Fx.Tween(this.bottom, {property:'margin-top',duration:400})
		};
    
	},

	click:function(link) {	
    return this.open (link.href, link.title, link.rel);
	},
  
	open:function(sLinkHref, sLinkTitle, sLinkRel) {
		this.href = sLinkHref;
		this.title = sLinkTitle;
		this.rel = sLinkRel;
		this.position();
		this.setup();
		this.video(this.href);
		this.top = Window.getScrollTop() + (Window.getHeight() / 15);
		this.center.setStyles({'top': this.top+'px', 'display': ''});
		this.fx.overlay.start(0.8);
		this.step = 1;
		this.center.setStyle('background','#fff url(/_scripts/videobox/loading.gif) no-repeat center');
		this.caption.set('html',this.title);
		this.fx.center.start('height', this.options.contentsHeight);
	},

	setup:function() {
		var aDim = this.rel.match(/[0-9]+/g);
		this.options.contentsWidth = (aDim && (aDim[0] > 0)) ? aDim[0] : this.options.defaultWidth;
		this.options.contentsHeight = (aDim && (aDim[1] > 0)) ? aDim[1] : this.options.defaultHeight;
	},

	position:function() {
    this.overlay.setStyles({'top': window.getScrollTop()+'px', 'height': window.getHeight()+'px'});
	},

	video:function(sLinkHref) {
		if(sLinkHref.match(/youtube\.com\/watch/i)) {
      this.flash = true;
			var hRef = sLinkHref;
			var videoId = hRef.split('=');
			this.videoID = videoId[1];
			this.so = new Swiff('http://www.youtube.com/v/'+this.videoID,{id:'flvvideo', width:this.options.contentsWidth, height:this.options.contentsHeight, params:{wmode:'transparent'}});
		}
		else if(sLinkHref.match(/metacafe\.com\/watch/i)) {
      this.flash = true;
			var hRef = sLinkHref;
			var videoId = hRef.split('/');
			this.videoID = videoId[4];
			this.so = new Swiff("http://www.metacafe.com/fplayer/"+this.videoID+"/.swf", {id:'flvvideo', width:this.options.contentsWidth, height:this.options.contentsHeight, params:{wmode:'transparent'}});
		}
		else if(sLinkHref.match(/google\.com\/videoplay/i)) {
      this.flash = true;
			var hRef = sLinkHref;
			var videoId = hRef.split('=');
			this.videoID = videoId[1];
			this.so = new Swiff("http://video.google.com/googleplayer.swf?docId="+this.videoID+"&hl=en", {id:'flvvideo', width:this.options.contentsWidth, height:this.options.contentsHeight, params:{wmode:'transparent'}});
		}
		else if(sLinkHref.match(/ifilm\.com\/video/i)) {
		  this.flash = true;
			var hRef = sLinkHref;
			var videoId = hRef.split('video/');
			this.videoID = videoId[1];
			this.so = new Swiff("http://www.ifilm.com/efp", {id:'flvvideo', width:this.options.contentsWidth, height:this.options.contentsHeight, params:{wmode:'transparent', bgcolor:'#000'}, vars:{flvbaseclip:this.videoID + '&'}});
		}
		else if(sLinkHref.match(/\.mov/i)) {
		  this.flash = false;
			if (navigator.plugins && navigator.plugins.length) {
          this.other ='<object id="qtboxMovie" type="video/quicktime" codebase="http://www.apple.com/qtactivex/qtplugin.cab" data="'+sLinkHref+'" width="'+this.options.contentsWidth+'" height="'+this.options.contentsHeight+'"><param name="src" value="'+sLinkHref+'" /><param name="scale" value="aspect" /><param name="controller" value="true" /><param name="autoplay" value="true" /><param name="bgcolor" value="#000000" /><param name="enablejavascript" value="true" /></object>';
      } else {
        this.other = '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" width="'+this.options.contentsWidth+'" height="'+this.options.contentsHeight+'" id="qtboxMovie"><param name="src" value="'+sLinkHref+'" /><param name="scale" value="aspect" /><param name="controller" value="true" /><param name="autoplay" value="true" /><param name="bgcolor" value="#000000" /><param name="enablejavascript" value="true" /></object>';
      }
		}
		else if(sLinkHref.match(/\.wmv/i) || sLinkHref.match(/\.asx/i)) {
		this.flash = false;
		 this.other = '<object NAME="Player" WIDTH="'+this.options.contentsWidth+'" HEIGHT="'+this.options.contentsHeight+'" align="left" hspace="0" type="application/x-oleobject" CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"><param NAME="URL" VALUE="'+sLinkHref+'"><param><param NAME="AUTOSTART" VALUE="false"></param><param name="showControls" value="true"></param><embed WIDTH="'+this.options.contentsWidth+'" HEIGHT="'+this.options.contentsHeight+'" align="left" hspace="0" SRC="'+sLinkHref+'" TYPE="application/x-oleobject" AUTOSTART="false"></embed></object>'
		}
		else if(sLinkHref.match(/\.flv/i)) {
		 this.flash = true;
		 this.so = new Swiff(this.options.flvplayer+"?file="+sLinkHref, {id:'flvvideo', width:this.options.contentsWidth, height:this.options.contentsHeight, params:{bgcolor:'#000'}});
		}
		else {
		  this.flash = true;
			this.videoID = sLinkHref;
			this.so = new Swiff(this.videoID, {id:'flvvideo', width:this.options.contentsWidth, height:this.options.contentsHeight});
		}
	},

	nextEffect:function() {
    
		switch (this.step++){
		case 1:
			this.fx.center.start({'width': this.options.contentsWidth, 'height': this.options.contentsHeight, 'margin-left': this.options.contentsWidth/-2});
			break;
			this.step++;
		case 2:
			this.center.setStyle('background','#fff');
			this.flash ? this.so.inject(this.center) : this.center.set('html',this.other) ;
			this.bottomContainer.setStyles({'top': (this.top + this.center.clientHeight)+'px', 'height': '0px', 'margin-left': this.center.getStyle('margin-left'), 'width': this.options.contentsWidth+'px','display': ''});
			if (this.options.animateCaption){
				this.fx.bottom.set(-this.bottom.offsetHeight);
				this.bottomContainer.style.height = '';
				this.fx.bottom.start(0);
				break;
			}
			this.bottomContainer.style.height = '';
			this.step++;
		}
	},

	close:function() {
		this.fx.overlay.start(0);
		this.center.style.display = this.bottomContainer.style.display = 'none';
		this.center.set('html','');
		return false;
	}

});

window.addEvent('domready', function(){ 
	videobox = new Videobox();
});
