(function($) {

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

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

		}
	}

	 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 setPower(power) {
		var options = this.data("options");

		if (!options || options.prefs.power == power) { return; };

		//options.prefs.power = power;

		this.data().options.prefs.power = power;

		setConfig(options.target,{'power':power});


		if (power == 0) {
			this.find(".power").removeClass("ui-state-active selected").addClass("ui-state-default");
		} else {
			this.find(".power").removeClass("ui-state-default").addClass("ui-state-active selected");
		}

		setMedia.call(this);
	}

	function setQuality(quality) {
		var options = this.data("options");

		if (!options || options.prefs.quality == quality || options.qualitylock === true) { return; }

		options.prefs.quality = quality;

		this.data("options",options);

		setConfig(options.target,{'quality':quality});

		this.find(".quality.ui-state-active").removeClass("ui-state-active selected").addClass("ui-state-default");
		this.find(".quality").eq(quality).removeClass("ui-state-default").addClass("ui-state-active selected");

		if (options.prefs.power == 1 && (t = $(this.find(".media object,.media embed")))) {
			$(t).each(function() { $(this)[0].SetVariable("_quality","low medium high best".split(" ")[quality]);  });
		}

	}

	function setMedia() {
		var _viewer = this;
		var options = _viewer.data("options");
		var data = null;

		if (!options || !options.data) {  return; }
		if (!options.data.type || !options.data.source) { return; }

		debug("viewer.setMedia()");

		_viewer.data().options.poppedOut = 0;

		data = options.data;

		if ("ustream justintv youtube livestream stickam vimeo bliptv".split(" ").indexOf(data.source) >= 0) {
			if (options.prefs.power == 0) {
				var img = null;

				setImage.call(this);
				return;
			}

			var flashvars = {};
			var params = {};
			var attributes = {};
			var mid = options.target+"_media_"+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.qualitylock ? options.quality : options.prefs.quality];

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

				if (data.type == "channel") {
					flashvars.cid = flashvars.channelid = data.id;
					url = "http://cdn1.ustream.tv/swf/4/viewerlite.26.swf";
				} else {
					url = "http://www.ustream.tv/flash/video/"+data.id;
				}

				flashvars.share = false;
				flashvars.autoResize = true;
				flashvars.infoBar = false;
				flashvars.vol = options.volume;
				flashvars.volume =options.volume;
				
				
			} else if (data.source == "justintv") {
				url = "http://www.justin.tv/widgets/live_embed_player.swf?channel="+data.id+"&consumer_key=WlYNyzS8Jsw4LN74xiuglg&auto_play=true";
				flashvars.start_volume = options.volume;
				flashvars.change_volume = options.volume;
			} else if (data.source == "youtube") {
				url = "http://www.youtube.com/v/"+data.id+"?fs=1&autoplay=1";
			} else {
				return;
			}

			_viewer.find(".media").empty().append($("<div />").attr("id",mid));
			swfobject.embedSWF(url,mid,options.width,options.height,"9.0.0",null,flashvars,params,attributes);
		} else {
			var tmp = null;

			if (options.prefs.power == 1) {
				debug("Setting custom media");
				_viewer.find(".media").empty().append(data.raw);
			} else {
				debug("Custom media is off, show overlay");
				setImage.call(this);
			}

			//if ((tmp = _viewer.find("param[wmode]")).size() >0) {
				//debug("Found wmode param: "+tmp.attr("value"));
			//}
		}

		setTimeout(function() { resize.call(_viewer); }, 1.5*1000);
	}

	function resize() {
		var _win = $(window);
		var _viewer = this;
		var _sizer = $(".sizer");
		var _parent = _viewer.parent();

		var options = this.data("options");

		//debug(_viewer.attr("id")+" resizing..");

		if (!_sizer.size()){  $(window.document.body).append($("<div />").addClass("sizer")); }

		// set sizes
		if (options.popup == 1) {
			options.width = _win.width();
		} else if (options.percent_width > 0) {
			options.width = _parent.width()*options.percent_width;

			//debug("MID: "+options.target+" MW: "+options.width+" PID: "+_parent.attr("id")+" PW: "+_parent.width());
		} else if (options.width == 0){
			options.width = 320;
		}

		if (options.popup == 1) {
			options.height = _win.height();
		} else if (options.aspect > 0) {
			options.height = options.width*options.aspect;
		} else if (options.percent_height > 0) {
			options.height = _viewer.parent().height() * options.percent_height;
		} else if (options.height == 0){
			options.height = 240;
		}

		_viewer.data("options",options);

		_viewer.css({width:options.width,height:options.height+(_sizer.height()*(options.popup ? 0 : (options.show.title ? 1 : 0)))});

		_viewer.find(".media,.media *")
			.height(options.height)
			.width(options.popup == 1 ? _win.width() : options.width);

		_overlay = _viewer.find(".overlay");
		_overlay.css({"padding-top":(_viewer.height()/2-$(".sizer").height())});

	}

	function setImage() {
		var _viewer = this;
		var _options = this.data().options;
		var _data = _options.data;
		var img = null;


		if (_data.source == "ustream") {
			img = "http://static-cdn2.ustream.tv/livethumb/1_"+_data.id+"_160x120_b.jpg";
		} else if (_data.source == "justintv") {
			img = "http://static-cdn.justin.tv/previews/live_user_"+_data.id+"-320x240.jpg";
		} else if (_data.source == "youtube") {
			img = "http://i.ytimg.com/vi/"+_data.id+"/default.jpg";
		}

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

		debug("viewer.setImage()");
		// images and overlay info
		if (img) { _viewer.find(".media").append($("<img />").attr("src",img)); }

		//_options.media_off_image = "/feed/css/images/feedpop.png";
		var div = null;

		if (_options.poppedOut) {
			div = $("<div />",{"class":"overlay"}).append("This stream has been popped out.<br/>Close new window to return it, or press the reload button to the upper right corner of this stream.");

			/* var  = $("<img />",{
				src:_options.media_off_image,
				"class":"overlay",
				width: _options.width, height: _options.height
			}); */

		} else if (_options.prefs.power == 0) {
			div = $("<div/>",{"class":"overlay"}).append("This stream is currently turned off.<br/>Press the power button located at the upper right corner of this stream to turn me on!");
		}

		if (div) { _viewer.find(".media").append(div); }

		var _overlay = _viewer.find(".overlay");
		_overlay.css({"padding-top":(_viewer.height()/2)-(_overlay.height()/2)});

		resize.call(_viewer);

	}

	function popup(item) {
		var _viewer  = this;
		var options = this.size() > 0 ? this.data().options : item;
		var data = options ? options.data : null;

		var s = {"ts":Math.round(new Date().getTime() / 1000)};

		if (_viewer.size() > 0) {
			_viewer.data().options.poppedOut = 1;

			setImage.call(this);

			s.popback = 1;
			s.popback_target = options.target;
		}

		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 location = "/feed/popup/" + data.id

		window.open(location,"_blank","resizable=yes,scrollbars=no,status=no,status=0,status=false,menubar=no,toolbar=no,location=no,directories=no,personalbar=no,titlebar=no,width="+320+",height="+240);
	};


	function setData(options) {
		debugger;
	}

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

		return this.each(function(itx,itm) {
			//debug("ITX: "+itx);

			var _viewer = $(this);
			var _tpl = $($.fn.viewer.defaults.template);

			options.target = _viewer.attr("id");

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

			if (options.qualitylock === true) {
				options.prefs.quality = options.quality;
			}

			_viewer.empty().append(_tpl).addClass("viewer"+(_tpl.hasClass("popup") ? " popup" : ""));

			if (options.show.title === false)            { _viewer.find(".title").hide();   debug(options.target+": hiding title");  }
			if (options.show.controls === false)         { _viewer.find(".controls").hide(); debug(options.target+": hiding controls");   }
			else {
				if (options.show.power === false)        { _viewer.find(".controls .power").hide();  debug(options.target+": hiding power");   }
				if (options.show.qualities === false)    { _viewer.find(".controls .quality").hide(); debug(options.target+": hiding qualities"); }
				if (options.show.popup === false)        { _viewer.find(".controls .popup").hide(); debug(options.target+": hiding popup");    }
				if (options.show.reload === false)       { _viewer.find(".controls .reload").hide(); debug(options.target+": hiding reload"); }
			}

			// set initial ui states
			if (options.prefs.power == 1) { _viewer.find(".power").removeClass("ui-state-default").addClass("ui-state-active selected"); }

			_viewer.find(".quality").eq(options.prefs.quality).removeClass("ui-state-default").addClass("ui-state-active selected");
			_viewer.find(".title").text(options.data && options.data.title ? options.data.title : "no title");
			_viewer.data("options",options);

			if (!$(".sizer")) { $(document.body).append($("<div>Z</div>").addClass("sizer")); }

			resize.call(_viewer);
			setMedia.call(_viewer);

			if (options.popup == 1) {
				var _win = $(window);
				var _opener = _win.opener;

				//if (data.popback == 1) {
				//	debug("Enabled the unload event, for popback()");

				//	$(window).unload(function() { if (window.opener) { window.opener.viewerPopBack(data.popback_target,data.id); }});
				//}

				_win.resize(function() {
					resize.call(_viewer);
				});
			}

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

				if (target.hasClass("quality")) { setQuality.call(_viewer, "lmhb".indexOf(target.text().charAt(0).toLowerCase())); }
				else if (target.hasClass("ui-icon-power")) { setPower.call(_viewer, target.hasClass("ui-state-active") ? 0 :1); }
				else if (target.hasClass("ui-icon-refresh")) { setMedia.call(_viewer); }
				else if (target.hasClass("ui-icon-newwin")) { popup.call(_viewer); }
			});
		});
	};

	$.fn.viewer.defaults = {
		width:0,height:0,
		aspect:0,percent_width:0,percent_height:0,
		show:{controls:true, title:true,qualities:true,power:true,popup:true,reload:true},
		template:'<div class="title"></div><div class="media"></div><div class="controls"><span class="quality ui-icon ui-state-default ui-icon-battery-0" title="low quality">low</span><span class="quality ui-icon ui-state-default ui-icon-battery-1" title="medium quality">medium</span><span class="quality ui-icon ui-state-default ui-icon-battery-2" title="high quality">high</span><span class="quality ui-icon ui-state-default ui-icon-battery-3" title="best quality">best</span><span class="refresh ui-icon ui-state-default ui-icon-refresh" title="reload">reload</span><span class="popup ui-icon ui-state-default ui-icon-newwin" title="popup">popup</span><span class="power ui-icon ui-state-default ui-icon-power" title="power">power</span></div>',
		prefs:{power:1,quality:1},
		data:null
	};

	$.fn.viewerPopBack = function(id) {
		var _viewer = this;
		var options = _viewer.data("options");

		if (options.poppedOut == 1 && options.data.id == id) {
			_viewer.data().options.poppedOut = 0;

			setMedia.call(this);
		}
	};

	$.fn.viewerResize = resize;
	$.fn.viewerPopup = popup;           // .call(this,options);  };
	$.fn.viewerSetMedia =  setMedia; //function() { setMedia.call(this);	};

	$.fn.viewerSetData = function(data) {
		var _viewer = this;
		var options = _viewer.data("options");

		if (options && options.data && options.data.id == data.id) {
			debug("viewer.setData(): current ID == given ID. Ignoring.");
			return;
		}

		_viewer.data().options.data = data;
		_viewer.find(".title").text(data.title);

		setMedia.call(_viewer);
	}
})(jQuery);

