// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
// @output_file_name classActivityList.min.js
// ==/ClosureCompiler==
function classUserView(optionObj) {
	
	this.container = $('body');
	this.userID = 0;
	
	this.option = {
		jsonRoot: ''
	};
	$.extend(this.option, optionObj);
	
	this.urls = {
		user:"json/user.php",
		buddy:"json/buddy.php",
		editself:"index.php?tab=user&stab=edit"
	};
	
	/*=================================================================
		Initialise
	=================================================================*/
	this.init = function () {
		this.newFloatPanel();
		$('a[href*=#user]').live('click.userView', {uv:this}, function(e) {
			e.data.uv.show($(e.target).attr('href').substr(5), e);
		});
	};
	
	/*=================================================================
		Get data
	=================================================================*/
	this.show = function(userID, e) {
		var $targetOffset = $(e.target).offset();
		this.userID = userID;
		$('span.title', this.userViewFloat).text('Loading...');
		$('div.uvProfile', this.userViewFloat).html('');
		$('div.uvContainerScroll', this.userViewFloat).html('<div class="ajaxloader"></div>');
		this.userViewFloat.css({top:$targetOffset.top-10, left:$targetOffset.left-10 }).hide().slideDown('fast');
		$.ajax( {
			url:this.option.jsonRoot + this.urls.user,
			data:'action=detail&uid='+userID,
			type:'POST',
			dataType:'json',
			callingObject: this,
			success:function(data, textStatus) {
				this.callingObject.renderDetail(data);
			},
			error:function (XMLHttpRequest, textStatus, errorThrown) {
				alert("Error:\n" + XMLHttpRequest + "\n" + textStatus + "\n" + errorThrown);
			}
		} );
	}
	
	/*=================================================================
		Render data
	=================================================================*/
	this.renderDetail = function(data) {
		var i,ilen,j,jlen,k,klen, timeArray, htmlArray = [];
		
		htmlArray.push('<p>');
		if (data.user.s == 'inactive') { htmlArray.push('<b>This user is inactive</b><br>'); }
		if (data.user.ls !== '') {
			timeArray = data.user.ls.split(':');
			if (parseInt(timeArray[0]) > 0) {
				htmlArray.push('Last login: '+parseInt(timeArray[0])+' hours ago');
			} else if (parseInt(timeArray[1]) > 0) {
				htmlArray.push('Last login: '+parseInt(timeArray[1])+' minutes ago');
			} else {
				htmlArray.push('Last login: Less than a minute ago');
			}
		}
		if (data.user.ls !== '' && data.user.la !== '') { htmlArray.push('<br>'); }
		if (data.user.la !== '') {
			timeArray = data.user.la.split(':');
			if (parseInt(timeArray[0]) > 0) {
				htmlArray.push('Last activity: '+parseInt(timeArray[0])+' hours ago');
			} else if (parseInt(timeArray[1]) > 0) {
				htmlArray.push('Last activity: '+parseInt(timeArray[1])+' minutes ago');
			} else {
				htmlArray.push('Last activity: Less than a minute ago');
			}
		}
		htmlArray.push('</p>');
		
		if (data.user.self) { htmlArray.push('<p><a href="'+this.urls.editself+'">Edit your user profile</a></p>'); }

		if (data.user.by !== undefined) {
			htmlArray.push('<p>');
			if (data.user.by !== 0) { 
				htmlArray.push(data.user.n+' is your friend '); 
				htmlArray.push('<img class="icon uvFriendAction uvFriendActionRemove" src="'+this.option.jsonRoot+'media/images/icon/user_delete.gif" title="Remove from friend list" alt="Remove from friend list" border="0">');
			} else {
				htmlArray.push('Make '+data.user.n+' your friend ');
				htmlArray.push('<img class="icon uvFriendAction uvFriendActionAdd" src="'+this.option.jsonRoot+'media/images/icon/user_add.gif" title="Add to friend list" alt="Add to friend list" border="0">');
			}
			if (data.user.bt !== 0) { htmlArray.push('<br>You are a friend of '+data.user.n); }
			htmlArray.push('</p>');
		}
		
		$('span.title', this.userViewFloat).text(data.user.n);
		$('div.uvProfile', this.userViewFloat)
			.html('<img class="uvGravatar" src="http://www.gravatar.com/avatar/'+data.user.md5+'?s=80&d=mm&r=g" width="80" height="80" >' +
				'<div class="uvTab uvTabHG selected">Profile</div>' +
				'<div class="uvTab uvTabBM">Blue Max</div>' +
				//'<div class="uvTab uvTabDD">Deduce or Die!</div>' +
				//'<div class="uvTab uvTabJG">Juggernauts</div>' +
				//'<div class="uvTab uvTabMM">Momentum</div>'
				'<p class="small" style="color:#999;padding-left:5px;">More to come</p>'
			)
			.bind('click', {uv:this}, function(e){
				if ($(e.target).hasClass('uvTab')) { $('div.uvProfile div.uvTab').removeClass('selected'); $('div.uvContainerScroll div.uvContent', this.userViewFloat).hide(); }
				if ($(e.target).hasClass('uvTabHG')) { $('div.uvProfile div.uvTabHG').addClass('selected'); $('div.uvContainerScroll div#uvProfile', this.userViewFloat).show(); }
				if ($(e.target).hasClass('uvTabBM')) { $('div.uvProfile div.uvTabBM').addClass('selected'); $('div.uvContainerScroll div#uvBluemax', this.userViewFloat).show(); }
			});
		$('div.uvContainerScroll', this.userViewFloat).html('<div id="uvProfile" class="uvContent">'+htmlArray.join('')+'</div>');
		this.renderDetailBlueMax(data);
		
		$('img.uvFriendAction', this.userViewFloat).bind('click.userViewFriend', {uv:this}, function(e){
			var $target = $(e.target);
			if ($target.hasClass('uvFriendActionRemove')) { e.data.uv.unfriendUser();  }
			if ($target.hasClass('uvFriendActionAdd')) { e.data.uv.friendUser(); }
		});
		
	};
	
	/*=================================================================
		Render Blue Max
	=================================================================*/
	this.renderDetailBlueMax = function(data) {
		var i,ilen,date,htmlArray = [],maxActions = 0,maxValue,factor;
		$('div.uvContainerScroll', this.userViewFloat).append($('<div id="uvBluemax" class="uvContent"><div>'));
		
		var date;
		htmlArray.push('<b>Blue Max turns in the last 30 days</b>');
		htmlArray.push('<table cellspacing="0" class="uvActivityTable"><tr>');
		htmlArray.push('<td style="width:40px;vertical-align:top;"></td>');
		for (i=0, ilen=30; i<ilen; i++) {
			date = new Date(new Date() - (86400000 * i));
			htmlArray.push('<td class="d-' + date.getFullYear() + '-' + (date.getMonth()+1) + '-' + date.getDate() + '"></td>' );
		};
		htmlArray.push('</tr></table>');
		
		htmlArray.push('<b>Blue Max games</b>');
		htmlArray.push('<table cellspacing="0">');
		htmlArray.push('<tr><td class="small" style="width:40px;"></td><td class="small">Games</td><td class="small">Planes</td></tr>');
		for (i=0, ilen=data.bms.length; i<ilen; i++) {
			htmlArray.push('<tr><td>' + data.bms[i].s + '</td><td align="center">' + data.bms[i].g + '</td><td align="center">' + data.bms[i].p + '</td></tr>');
		};
		htmlArray.push('</table>');		
		
		$('#uvBluemax').html(htmlArray.join('')).hide();
		
		for (i=0, ilen=data.user.acts.length; i<ilen; i++) {
			maxActions = Math.max(maxActions, data.user.acts[i].a);
		}
		maxValue = Math.max(Math.ceil(maxActions/10)*10, 10);
		$('#uvBluemax td:first').text(maxValue);
		factor = 60 / maxValue;
		
		for (i=0, ilen=data.user.acts.length; i<ilen; i++) {
			$('#uvBluemax td.d-'+data.user.acts[i].d).prepend($('<div class="bm" style="height:' + (data.user.acts[i].a * factor) + 'px;" title="'+data.user.acts[i].a+'"></div>'));
		};
		
	};
	
	/*=================================================================
		Float panel creator
	=================================================================*/
	this.newFloatPanel = function(){
		this.userViewFloat = $('<div id="userViewFloat" class="userView rounded8"></div>')
			.appendTo(this.container)
			.html(	'<div class="uvTitle roundtop6">' +
				  	'<div class="uvControl uvClose rounded4"></div>' +
					//'<div class="uvControl uvMinimise rounded4"></div>' +
					'<span class="title"></span></div>' +
					'<div class="uvProfile"></div>' +
					'<div class="uvContainer"><div class="uvContainerScroll">' +
					'</div></div>')
			.css({left:(this.container.width()-252)/2})
			.hide()
			.draggable({ handle: 'div.uvTitle', containment: '#pageWrapper', snap: true, snapMode: 'outer' })
			.disableSelection()
			.bind('floatClose', function(){ $(this).hide(); })
			.bind('floatOpen', function(){ $(this).show(); var parent = $(this).parent();$(this).detach().appendTo(parent); });
		
		$('div.fnTitle', this.userViewFloat).bind('dblclick', function(e){ $(this).parent().trigger('floatClose'); });
		
		$('div.uvMinimise, div.uvClose', this.userViewFloat)
			.hover( 
				function(){ $(this).addClass('hover'); }, 
				function(){ $(this).removeClass('hover'); }
			)
			.bind('click', {fm:this.userViewFloat}, function(e){
				if ($(e.target).hasClass('uvMinimise')) {
					if ($('div.uvContainer', e.data.fm).is(':hidden')) {
						$(e.target).removeClass('max');
						$('div.fnTitle', e.data.fm).addClass('roundtop6').removeClass('rounded6');
					} else {
						$(e.target).addClass('max');
						$('div.uvTitle', e.data.fm).removeClass('roundtop6').addClass('rounded6');
					}
					$('div.uvContainer', e.data.fm).slideToggle();
				} else if ($(e.target).hasClass('uvClose')) {
					e.data.fm.trigger('floatClose');
				}
			});
		
	};
	
	/*=================================================================
		User Manipulation
	=================================================================*/
	
	this.friendUser = function () {
		$.ajax( {
			url:this.option.jsonRoot + this.urls.buddy,
			data:'action=add&uid='+this.userID,
			type:'POST',
			dataType:'json',
			callingObject: this,
			success:function(data, textStatus) {
					//this.callingObject.getBuddyList();
				},
			error:function (XMLHttpRequest, textStatus, errorThrown) {
					if($.trace) { $.trace("Error:\n" + XMLHttpRequest + "\n" + textStatus + "\n" + errorThrown); }
				}
		});
	}
	
	this.unfriendUser = function () {
		$.ajax( {
			url:this.option.jsonRoot + this.urls.buddy,
			data:'action=delete&uid='+this.userID,
			type:'POST',
			dataType:'json',
			callingObject: this,
			success:function(data, textStatus) {
					//this.callingObject.getBuddyList();
				},
			error:function (XMLHttpRequest, textStatus, errorThrown) {
					if($.trace) { $.trace("Error:\n" + XMLHttpRequest + "\n" + textStatus + "\n" + errorThrown); }
				}
		});
	}
	
	/*=================================================================
	Call Initalize function
	=================================================================*/
	this.init();
	return this;
}
