(function($) {
	function getConfig(vid) {
		var t = $.cookie("vc");
		var cfg = (t && t.substr(0,2) == "vc" ? $.evalJSON(t.substr(2)) : {});
		var opts = vid ? (cfg[vid] || {"power":1,"quality":0}) : cfg;

		return opts;

	}

	function setConfig(tid,options) {
		var t = getConfig();
		var topts = t[tid] || {"power":1,"quality":0};

		t[tid] = $.extend(topts, options);

		$.cookie("vc","vc"+$.toJSON(t),{expires: 365});
	};

	function setQuality(obj, q) {
		var options = obj.data("options");

		//alert("MID: "+mid+" QUALITY: "+q);
		setConfig(options.target,{'quality':q});

		$("embed,object",obj).each(function(itx,itm){
			try {
				itm.SetVariable("_quality","low,medium,high,best".split(",")[q]);
			} catch (err) {
				debug(err);
			}
		});
	};

	function setPower(obj,p) {
		var options = obj.data("options");

		options.prefs.power = p;
		obj.data('options',options);
		setConfig(options.target,{"power":p});

		if (p == 0) { obj.find('.power').removeClass("selected"); clearMedia(obj); }
		else if (p == 1) { obj.find(".power").addClass("selected"); setMedia(obj); }
	};

	function setData(obj,data) {
		var options = obj.data("options");

		if (options.data && options.data.id == data.id) { return; }

		options.data = data;

		if (data.title) {
			obj.find(".title").text(data.title).attr("title",data.title);
			window.title = data.title;
		}

		obj.data("options",options);

		setMedia(obj);
	};

	function clearMedia(obj) {
		obj.find(".media").empty();

		var img = '';

		if (obj.hasClass("media_previewer")) {
			img = "http://bbliveuk.com/images/selectfeed.png";
		} else {
			img = "http://bbliveuk.com/images/feedoff.png";
		}

		obj.find(".media").append($("<img/>").attr("src",img)); // FIXME: dirty!
		obj.viewerResize();
	};

	function setMedia(obj) {
		var options = obj.data("options");

		if (!options || !options.data || !options.data.id || options.prefs.power == 0) { clearMedia(obj); return; }

		if (options.data.source != "custom") {
			var url = '';
			var flashvars = {};
			var params = {};
			var attributes = {};
			var mid = options.target+"_media_"+options.data.id;

			attributes.bgcolor =  "#000000";

			params.menu = true;
			params.wmode = 'opaque';
			params.allowscriptaccess = 'always';
			params.allownetworking = 'all';
			params.allowfullscreen = true;
			params.quality = 'low,medium,high,best'.split(',')[options.prefs.quality];

			if (options.data.source == "ustream") {
				flashvars.brand = 'embed';
				flashvars.autoplay = 'true';

				if (options && options.data.type == "channel") {
					flashvars.cid = options.data.id;
					flashvars.channelid = options.data.id;
					url = "http://www.ustream.tv/flash/live/"+options.data.id;
				} else if (options && options.data.type == "video") {
					url = "http://www.ustream.tv/flash/video/"+options.data.id;
				}

				//flashvars.volume = flashvars.vol = (options.data.feed > 1 ? 0 : 0.5);

				flashvars.share = false;
				flashvars.autoResize = true;
				flashvars.infoBar = false;

				//url = "http://www.ustream.tv/flash/live/"+options.data.id;
			} else if (options.data.source == "justintv") {
				//flashvars.start_volume = flashvars.volume = (options.data.feed > 1 ? 0 : 50);
                options.data.url = "http://www.justin.tv/widgets/live_embed_player.swf?channel="+options.data.id+"&consumer_key=4kEvRHpBUjnbRkFDGqPjg&auto_play=true";				
				url = options.data.url;
			} else if (options.data.source == "youtube") {
				// http://www.youtube.com/v/u1zgFlCw8Aw?fs=1
				url = "http://www.youtube.com/v/"+options.data.id+"?fs=1&autoplay=1";
			} else {
				return;
			}
		}

		obj.find(".media").empty();

		if (options.data.source != "custom") {
			if (options.url != url || obj.find(".media").children().size() == 0) {
				options.url = url;
				obj.data('options',options);
				obj.find(".media").empty().append($("<div />").attr('id',mid));
				swfobject.embedSWF(url,mid,options.width,options.height,"9.0.0",null,flashvars,params,attributes);
			}
		} else {
			obj.find(".media").html(options.data.raw);

			obj.viewerResize();

			// force given custom embed to fit set size.
/*			obj.find(".media,.media *").each(function(itx,itm) {
				$(itm)
					.attr("width",options.width)
					.attr("height",options.height)
					.css({"width":options.width, "height":options.height});
			});*/
		}

		if (options.popup == 1 ) {  setTimeout("$.fn.viewerResize();",1*1000); }
	};

	function debug(obj) {
		if (window.console && window.console.log) {

			window.console.log("viewer debug: "+obj);

		}
	};

	function popup(obj) {
		var obj = $(obj);
		var s = {"ts":Math.round(new Date().getTime() / 1000)};
		var options = null;
		var data = null;

		if (obj.hasClass("viewer")) {
			data = (options = obj.data("options")).data;

			if (options.prefs.power == 1) {
				s.popback = 1;
				s.popback_target = options.target;
			}

			options.poppedOut = 1;
			obj.data("options",options);

			clearMedia(obj);
		} else {
			data = obj[0];
		}

		s.title = (data  && data.title ? data.title : '');

		if (data && data.feed > 0) { s.feed = data.feed; }
		else {
			s.id = data.id;
			s.source = data.source;
			s.type = data.type;
		}

		var ss = $.param(s);

		window.open("/feed/popup.php?"+ss,"_blank","resizable=yes,scrollbars=no,status=no,status=0,status=false,menubar=no,toolbar=no,location=no,directories=no,personalbar=no,titlebar=no,width="+400+",height="+320);
	};

	$.fn.viewer = function(options)	{
		debug(this);

		var options = $.extend({},$.fn.viewer.defaults,options);

		return this.each(function() {
			var obj = $(this);
			var tpl = $(options.template);

			options.height = (options.height ? options.height : options.width * options.aspect);
			options.target = obj.attr('id');

			if (options.target) {
				options.prefs = getConfig(options.target);

			}

			if (options.prefs.quality > 2) { options.prefs.quality = 2; setConfig(options.target,{"quality":2}); }

			// hide/show features
			tpl.find(".title").css({'display': ((!options.showTitle || options.popup == 1) ? 'none' : 'inline-block')});
			tpl.find(".controls").css({'display': ((!options.showControls) ? 'none' : 'inline-block')});
			tpl.find(".quality").css({'display': ((!options.showQualities) ? 'none' : 'inline-block')});
			tpl.find(".popup").css({'display': ((!options.showPopup  || options.popup == 1) ? 'none' : 'inline-block')});
			tpl.find(".power").css({'display': ((!options.showPower) ? 'none' : 'inline-block')});

			if (options.prefs.power == 1) {
				tpl.find(".power").addClass("selected");
			} else {
				tpl.find(".power").removeClass("selected");
			}

			tpl.find(".quality").removeClass("selected").eq(options.prefs.quality).addClass("selected");

			obj.empty().append(tpl).addClass("viewer"+(options.popup?" popup":""));

			// adjust sizes
			obj.find(".media").height(options.popup == 1 ? $(document).height() : options.height);
			obj.css({'display':'inline-block','width':options.width+4});
			obj.data('options',options);

			clearMedia(obj);

			if (options.popup == 1)	{
				obj.find(".controls").css({
					position:'absolute',
					bottom: 2,
					right: 2
				});

				$(document.body).css({'background-color':"#000","font-weight":800});
				$(window).bind("resize",$.fn.viewerResize);
				setTimeout("$.fn.viewerResize();",1*1000);
			}

			// events
			$(".controls",obj).bind("click", function(ev) {
				var target = $(ev.target);
				var obj = target.parents(".viewer");
								var options = obj.data("options");

				if (target.hasClass("quality")) {
					var q = 'lmhb'.split('').indexOf(target.text().charAt(0).toLowerCase());
					obj.find('.quality.selected').removeClass('selected');
					target.addClass("selected");

					setQuality(obj,q);
				} else if (target.hasClass("popup")) {
					popup(obj);
				} else if (target.hasClass("power")) {
				   setPower(obj,target.hasClass("selected") ? 0 : 1);
				} else if (target.hasClass("reload")) {
					clearMedia(obj);
					setMedia(obj);
				}
			});

		});
	};

	$.fn.viewer.defaults = {
			showControls:true,
			showPopup:true,
			showTitle:true,
			showQualities:true,
			showPower:true,
			aspect:0.75,
			width:320,height:240,
			template:'<div class="title"></div><div class="media"></div><div class="controls"><span class="quality">low</span><span class="quality">medium</span><span class="quality">high</span><!--<span class="quality">best</span>--><span class="popup">popup</span><span class="power selected">power</span><span class="reload">reload</span></div>',
			prefs:{"power":1, "quality":0}
	};

	$.fn.viewerResize = function(ev,ev1) {
		var obj = (t=$("#viewer")).size() > 0 ? t : this;
		var options = obj.data("options");
		var h = (options.popup == 1 ? obj.find('.controls').position().top-5 : options.height);
		var w = (options.popup == 1 ? $(window).width() : options.width);


		//debugger;
		// force given custom embed to fit set size.
		obj.find(".media,.media *").each(function(itx,itm) {
			$(itm)
				.attr("width",w).attr("height",h)
				.css({
					"width":w, "height":h,
					"min-width":w, "min-height":h,
					"max-width":w, "max-height":h
				});
		});

/*		obj.find("object,embed,.media").each(function(itx,itm) {
			$(itm)
				.attr("width",w)
				.attr("height",h)
				.css({"width":w, "height":h});
		});
  */

	};

	$.fn.viewerPopup = function(obj) { popup(obj); };
	$.fn.viewerPopBack = function() { popback(this); };
	$.fn.viewerSetData = function(data) { setData(this,data); };
	$.fn.viewerSetPower = function(power) { setPower(this,power); };
	$.fn.viewerSetQuality = function(quality) { setQuality(this,quality); };
	$.fn.viewerSetMedia = function(obj) { setMedia(obj); };
})(jQuery);

