
	USP =
	{
		elUS: null,
		els: {popup: null},
		_x: 0, _y: 0,
		elTrigger: null,
		U_id: null,
		DB: {},
		active: false,

		sTimeout: 400,
		hTimeout: 600,

		sTimer: null,
		hTimer: null,

		oJsr: null,


		_Init: function ()
		{
			if (USP.els.popup) return;

			USP.els.popup = document.getElementById("UsrSnapshot");
			var els = USP.els.popup.getElementsByTagName("*");
			for (var i=0; i<els.length; i++) {
				var node = els[i];
				if (!node.className) continue;
				USP.els[node.className] = node;
			}

			USP.oJsr = new Jsr();
			USP.oJsr.onresults = function (oJsr)
			{
				USP.DB[USP.U_id] = oJsr.results.usrSnapshot;
				USP.Populate();
			}

			// evt handlers
			USP.els.popup.onmouseover = USP._Over;
			USP.els.popup.onmouseout = USP._Out;

			// position fix
			USP.els.popup.style.top = 0;
			USP.els.popup.style.left = 0;
			var pos = USP.getPos(USP.els.popup);
			USP._x = pos.x;
			USP._y = pos.y;
		},

		Show: function (U_id, triggerId, delay)
		{
			USP._Init();

			//if (U_id == USP.U_id) return;
			if (delay) {
				if (USP.hTimer) {
					window.clearTimeout(USP.hTimer);
					USP.hTimer = null;
				}
				USP.U_id = U_id;
				USP.sTimer = window.setTimeout("USP.Show(" + U_id + ", '" + triggerId + "')", delay);
				return;
			}

			if (USP.active) {
				USP.Hide();
			}

			USP.U_id = U_id;
			USP.elTrigger = document.getElementById(triggerId);

			var pos = USP.getPos(USP.elTrigger);
			var scrollY = window.pageYOffset? window.pageYOffset : (document.documentElement? document.documentElement.scrollTop : document.body.scrollTop);
			if (USP.els.popup.offsetHeight > pos.y + 10 - scrollY) {
				USP.els.popup.style.top = pos.y + USP.elTrigger.offsetHeight * 0.9 + "px";
				USP.els.popup.className = "down";
			} else {
				USP.els.popup.style.top = pos.y - USP.els.popup.offsetHeight + USP.elTrigger.offsetHeight * 0.2  + "px";
				USP.els.popup.className = "";
			}
			USP.els.popup.style.left = pos.x + "px";

			USP.els.popup.style.visibility = "visible";
			//USP.els.popup.style.display = "";

			if (USP.DB[U_id]) {
				USP.Populate();
			} else {
				USP.oJsr.call('misc', 'usrSnapshot', {'bU_id': U_id});
			}
		},

		Populate: function ()
		{
			var data = USP.DB[USP.U_id];

			// title/username & fix width
			USP.els.title.innerHTML = data.username;
			if (USP.els.title.offsetWidth > 140) {
				USP.els.title.innerHTML = "<span style='font-size: " + (140/USP.els.title.offsetWidth) + "em; font-weight: bold;'>" + USP.els.title.innerHTML + "</span>"
			}

			// profile
			var rows = [];
			for (k in data.profile) {
				if (data.profile[k]) {
					rows.push(data.profile[k]);
				}
			}
			USP.els.profile.innerHTML = rows.join("<br />");

			// photo
			if (data.hasPhoto) {
				USP.els.photo.innerHTML = '<img width="92" height="92" src="' + BDP.assets + '/profile/return_photo.php?photo=small&user=' + USP.U_id + '" />';
			} else {
				USP.els.photo.innerHTML = "";
			}

			// edit
			if (USP.U_id == BDP.U_id) {
				USP.els.edit.style.display = "";
				//USP.els.edit.href = BDP.go("profile", {back_url: document.location.href}, true);
				USP.els.edit.href = BDP.go("profile", {}, true);
			} else {
				USP.els.edit.style.display = "none";
				USP.els.edit.href = "#";
			}

			// stats
			USP.els.since.innerHTML = data.stats.since;
			USP.els.votes.innerHTML = data.stats.votes;
			USP.els.comments.innerHTML = data.stats.comments;
			USP.els.up.innerHTML = data.stats.up;
			USP.els.down.innerHTML = data.stats.down;
			USP.els.score.innerHTML = data.buzzmatch? data.buzzmatch : "n/a";

			// Fans
			USP._setFansData(data);
			
			// Links
			if (data.hasComments) {
				USP.els.usrcomments.style.display = "";
				if (USP.U_id == BDP.U_id) {
					//USP.els.usrcomments.href = BDP.go("mybuzz", {mybuzz_type: 'comment', back_url: document.location.href}, true);
					USP.els.usrcomments.href = BDP.go("mybuzz", {mybuzz_type: 'comment'}, true);
				} else {
					//USP.els.usrcomments.href = BDP.go("comment_usr", {U_id: USP.U_id, back_url: document.location.href}, true);
					USP.els.usrcomments.href = BDP.go("comment_usr", {U_id: USP.U_id}, true);
				}
			} else {
				USP.els.usrcomments.style.display = "none";
			}

			if (data.hasPublicBuzzbite) {
				USP.els.usrbuzzbites.style.display = "";
				//USP.els.usrbuzzbites.href = BDP.go("buzzbite_usr", {U_id: USP.U_id, back_url: document.location.href}, true);
				USP.els.usrbuzzbites.href = BDP.go("buzzbite_usr", {U_id: USP.U_id}, true);
			} else {
				USP.els.usrbuzzbites.style.display = "none";
			}

			// reveal
			USP.els.loading.style.display = "none";
			USP.active = true;
		},

		Hide: function ()
		{
			USP.U_id = null;
			USP.triggerId = null;
			USP.active = false;
			if (USP.hTimer) {
				window.clearTimeout(USP.hTimer);
				USP.hTimer = null;
			}

			//USP.els.popup.style.display = "none";
			USP.els.popup.style.visibility = "hidden";
			USP.els.loading.style.display = "";
		},

		Add: function (U_id, triggerId, show)
		{
			USP._Init();

			var el = document.getElementById(triggerId);
			if (el.attachEvent) {
				el.attachEvent("onmouseover", function(){USP.Show(U_id , triggerId, USP.sTimeout);});
				el.attachEvent("onmouseout", function(evt){ USP._Out(evt, U_id); });
			} else if (el.addEventListener) {
				el.addEventListener("mouseover", function(){USP.Show(U_id , triggerId, USP.sTimeout);}, true);
				el.addEventListener("mouseout", function(evt){ USP._Out(evt, U_id); }, true);
			}
		},

		_Over: function (evt)
		{
			evt = evt? evt : window.event;
			var elFrom = evt.fromElement? evt.fromElement  : evt.relatedTarget;
			while (elFrom && elFrom.parentNode && elFrom != USP.els.popup && elFrom != USP.elTrigger) {
				elFrom = elFrom.parentNode;
			}
			if (elFrom == USP.els.popup || elFrom == USP.elTrigger) return;
			if (USP.hTimer) {
				window.clearTimeout(USP.hTimer);
				USP.hTimer = null;
			}
		},
		_Out: function (evt, U_id)
		{
			if (U_id && U_id != USP.U_id) return; // other, irelevent trigger
			evt = evt? evt : window.event;
			var elTo = evt.toElement? evt.toElement  : evt.relatedTarget;
			while (elTo && elTo.parentNode && elTo != USP.els.popup && elTo != USP.elTrigger) {
				elTo = elTo.parentNode;
			}
			if (elTo == USP.els.popup || elTo == USP.elTrigger) return;
			//alert("out");
			if (USP.sTimer) {
				window.clearTimeout(USP.sTimer);
				USP.sTimer = null;
			}
			if (USP.active) {
				USP.hTimer = window.setTimeout(USP.Hide, USP.hTimeout);
			}
		}

		,
		getPos: function (oEl)
		{
			var posX = 0;
			var posY = 0;
			if (typeof(oEl.offsetParent) != 'undefined') {
				while (oEl && oEl.offsetParent) {
					posX += oEl.offsetLeft;
					posY += oEl.offsetTop;
					oEl = oEl.offsetParent;
				}
			} else {
				posX = oEl.x;
				posY = oEl.y;
			}
			return {x: (posX - USP._x), y: (posY - USP._y)};
		}
			
		,
		AddFan: function ()
		{
			if (!BDP.U_id) return;
			
			var oJsr = new Jsr();
			oJsr.call('misc', 'addFan', {bU_id: USP.U_id});
			oJsr.onresults = function (oJsr)
			{
				// check status
				if (oJsr.results.addFan == false) return;
				
				// update data
				var data = USP.DB[oJsr.params.bU_id];
				data.stats.fans = fixNum(data.stats.fans, +1);
				data.hasMeAsFan = true;
				
				// update html
				USP._setFansData(data);
			}
		}
		
		,
		RemoveFan: function ()
		{
			if (! BDP.U_id) return;
			if (! confirm( BDP.getMessage("fan_remove", [USP.DB[USP.U_id].username]) )) return;
			
			var oJsr = new Jsr();
			oJsr.call('misc', 'removeFan', {bU_id: USP.U_id});
			oJsr.onresults = function (oJsr)
			{
				// check status
				if (oJsr.results.removeFan == false) return;
				
				// update data
				var data = USP.DB[oJsr.params.bU_id];
				data.stats.fans = fixNum(data.stats.fans, -1);
				data.hasMeAsFan = false;
				
				// update html
				USP._setFansData(data);
			}		
		}
		
		,
		_setFansData: function (data)
		{
			// check if old/not for current popup
			if (data.U_id != USP.U_id) return;
			
			// stats
			USP.els.fans.innerHTML = data.stats.fans;
			if (data.stats.fans == 0) {
				// USP.els.seeFans.href = "#";
				USP.els.seeFans.style.display = "none";
			} else {
				USP.els.seeFans.style.display = "";
			}
			//USP.els.seeFans.href = BDP.go("fan", {U_id: USP.U_id, back_url: document.location.href}, true);
			USP.els.seeFans.href = BDP.go("fan", {U_id: USP.U_id}, true);
			// anon
			if (! BDP.U_id) {
				USP.els.addFan.style.display = "";
				USP.els.removeFan.style.display = "none";
				//USP.els.addFan.href = BDP.go("login", {back_url: document.location.href}, true);
				USP.els.addFan.href = BDP.go("login", {}, true);
			} else {
				USP.els.addFan.href = "javascript: USP.AddFan()";
			}
			// own
			if (USP.U_id == BDP.U_id) {
				USP.els.hasMe.style.display = "none";
				USP.els.addFan.style.display = "none";
				USP.els.removeFan.style.display = "none";
			} 
			// has me
			else if (data.hasMeAsFan) {
				USP.els.hasMe.style.display = "";
				USP.els.addFan.style.display = "none";
				USP.els.removeFan.style.display = "";
			} 
			// not
			else {
				USP.els.hasMe.style.display = "none";
				USP.els.addFan.style.display = "";
				USP.els.removeFan.style.display = "none";
			}
		}
	}


    function fixNum(num, sum)
    {
        num = (num + "").replace(/\D/, "");
        num = Number(num) + (sum? sum : 0) + "";
        var re = /(-?[0-9]+)([0-9]{3})/;
        while (re.test(num)) num = num.replace(re, '$1,$2');
        return num;
    }