function customHandler(desc,page,line,chr)  {
	if(false){
		alert('The error was handled by '
			+'a customized error handler.\n'
			+'\nError description: \t'+desc
			+'\nPage address:      \t'+page
			+'\nLine number:       \t'+line)
	}
	return true;
}
//window.onerror = customHandler;

var FJUserName = '';
var FJUserId = '';
var FJUserSid = '';
var FJON = true;

var FrameClosed = false;

var AutoCheckerID;

var FJConf = {
	display_logs:     false,
	display_trace: 	  false,
	display_warnings: true,
	display_errors:   false
}

if (typeof console == 'undefined' || typeof console.warn == 'undefined')
{
	FJConf = {
		display_logs:     false,
		display_trace: 	  false,
		display_warnings: false,
		display_errors:   false
	}
}
else {
	var conf = $.cookie('FJConf');
	
	if (conf) {
		conf = conf.split('|');
		FJConf = {
			display_logs:     conf[0],
			display_trace: 	  conf[1],
			display_warnings: conf[2],
			display_errors:   conf[3]
		}
	}
}

var FJ = {
	log: function(message) {
		if (FJConf.display_logs == true)
			console.log(message);
	},
	trace: function(message) {
		if (FJConf.display_trace == true)
			console.log('-> '+message);
	},
	warn: function(message) {
		if (FJConf.display_warnings == true)
			console.warn(message);
	},
	error: function(message) {
		if (FJConf.display_errors == true)
			console.error(message);
	},
	
	
	var_reg: Object(),
	//register
	reg: function(name, value)
	{
		//write var
		if (typeof(value) == "undefined")
		{
			if (typeof(this.var_reg[name]) != "undefined")
				return this.var_reg[name];
			else
				return false;
		}
		//read
		else
			this.var_reg[name] = value;
		return false;
	},
	/*
	 * very simple callback
	 */
	var_callback: Object(),
	var_callbackType: Object(),
	
	callbackExist: function(name)
	{
		if (this.var_callback[name])
			return true;
			
		return false;
	},
	
	addCallback: function(name, callback)
	{
		if (this.var_callback[name])
		{
			FJ.warn('Duplicate callback "'+name+'"');
			return false;
		}
			
		this.var_callback[name] = callback;
		
		this.var_callbackType[name] = 0;
		return true;
	},
	
	addOneCallback: function(name, callback)
	{
		if (!this.addCallback(name, callback))
			return false;
		
		this.var_callbackType[name] = 1;
		return true;
	},
	
	addMultiCallback: function(name, callback) {
		
		if (typeof this.var_callback[name] == "undefined")
			this.var_callback[name] = new Array();
			
		this.var_callback[name].push(callback);
		
		this.var_callbackType[name] = 2;
	},
	
	removeCallback: function(name) {
		if (typeof this.var_callback[name] != "undefined") {
			delete this.var_callback[name];
			delete this.var_callbackType[name];
		}
	},
	
	changeCallback: function(name, callback)
	{
		/*if (!this.var_callback[name])
		{
			FJ.warn('Callback "'+name+'" don\'t exist');
			return false;
		}*/
		
		if (callback == null) {
			delete this.var_callback[name];	
		}
		
		this.var_callback[name] = callback;
		return true;
	},
	
	callback: function(name, message) {
		if (!name || !this.var_callback[name])
			return false;
		
		if (message)
			FJ.trace('callback: '+name+' ('+message+')');
		else
			FJ.trace('callback: '+name);
		
		var callbacks = Object();
		
		if (this.var_callbackType[name] == 2)
			callbacks = this.var_callback[name];
		else
			callbacks[0] = this.var_callback[name];
		
		for (call in callbacks) {
			if (typeof callbacks[call] == 'function')
				callbacks[call].call();
			else
				eval(callbacks[call]);
		}

		if (this.var_callbackType[name] == 1)
			delete this.var_callback[name];

		return true;
	},
	
	IE7: (navigator.userAgent.toLowerCase().indexOf('msie 7') != -1),
	IE6 : (navigator.userAgent.toLowerCase().indexOf('msie 6') != -1) && (navigator.userAgent.toLowerCase().indexOf('msie 7') == -1),
	
	trim: function(str)
	{
		str = str.replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
		while(ws.test(str.charAt(--i)));

		return str.slice(0, i + 1);
	},
	
	urlSegment: function(segment, url)
	{
		if (typeof(url) == "undefined")
			url = document.location.href;
		
		return url.split('http://').join('').split('/')[parseInt(segment)+1];
	},
	
	isInUrl: function(str, segment)
	{
		if (typeof(segment) == "undefined")
		{
			if (document.location.href.indexOf(str) > -1)
				return true;
		}
		else
		{
			try {
				if (this.urlSegment(segment).indexOf(str) > -1)
					return true;
			}
			catch(e){
				return false;
			}
		}
		
		return false;
	},
	
	empty: function(mixed_var)
	{		
		var key;
    
    if (mixed_var === ""
        || mixed_var === 0
        || mixed_var === "0"
        || mixed_var === null
        || mixed_var === false
        || mixed_var === undefined
    ){
        return true;
    }

    if (typeof mixed_var == 'object') {
        for (key in mixed_var) {
            return false;
        }
        return true;
    }

    return false;

	},
	
	strip_tags: function(str, allowed_tags){
		var key = '', allowed = false;
		var matches = [];
		var allowed_array = [];
		var allowed_tag = '';
		var i = 0;
		var k = '';
		var html = '';

		var replacer = function(search, replace, str) {
			return str.split(search).join(replace);
		};

		// Build allowes tags associative array
		if (allowed_tags) {
			allowed_array = allowed_tags.match(/([a-zA-Z]+)/gi);
		}
		str += '';
		// Match tags
		matches = str.match(/(<\/?[^>]+>)/gi);

		// Go through all HTML tags
		for (key in matches) {
			if (isNaN(key)) {
				// IE7 Hack
				continue;
			}
			// Save HTML tag
			html = matches[key].toString();

			// Is tag not in allowed list? Remove from str!
			allowed = false;

			// Go through all allowed tags
			for (k in allowed_array) {
				// Init
				allowed_tag = allowed_array[k];
				i = -1;

				if (i != 0) {i = html.toLowerCase().indexOf('<'+allowed_tag+'>');}
				if (i != 0) {i = html.toLowerCase().indexOf('<'+allowed_tag+' ');}
				if (i != 0) {i = html.toLowerCase().indexOf('</'+allowed_tag)   ;}

				// Determine
				if (i == 0) {
					allowed = true;
					break;
				}
			}
			if (!allowed) {
				str = replacer(html, "", str); // Custom replace. No regexing
			}
		}
		return str;
	},
	
	random: function(len)
	{
		if (typeof(len) == "undefined")
			len = 1000002;
		
		return Math.floor(Math.random()*(len-1));

	},
		
	isNumeric: function(val)
	{
		var floatValue = parseFloat(val);
		
		if (isNaN(floatValue))
		   return false;
		else
		   return true;
	},
	
	clone: function(object)
	{
		return jQuery.extend({}, object);
	},
	/*
 	 * Display nice look, alert window
 	 */
	alert: function(text)
	{
		if (text != '' && typeof(text) != 'undefined')
		{
			$('#alertWindowText').html(text);
			$('#alertWindow').hide();
			$('#alertWindow').show();
		}
	},
	/*
	 * Confrmation, display nice look window with "OK" and "Cancel" buttons.
	 */
	var_confirmed: false,
	
	confirm: function(text, callback)
	{
		if (this.var_confirmed)
		{
			this.var_confirmed = false;
			return true;
		}
		
		if (typeof(callback) == "undefined" || callback == '')
		{
			this.error('FJ.confirm() need callback (text: '+text+')');
			return true;
		}
		
		if (text != '' && typeof(text) != 'undefined')
		{
			$('#confirmWindowText').html(text);
			
			if(this.callbackExist('fj_confirm'))
				this.changeCallback('fj_confirm', callback);
			else
				this.addOneCallback('fj_confirm', callback);
			
			var buttons = '' +
					'<button id="FJConfirmButton" onclick="FJ.confirmExec(); return false">OK</button>' +
					'<button onClick="$(\'#confirmWindow\').hide()">Cancel</button>';
					
			$('#FJConfirmButtons').html(buttons);
			$('#confirmWindow').hide();
			$('#confirmWindow').show();
			
			return false;
		}
		return false;
	},
	confirmExec: function()
	{
		$('#confirmWindow').hide();
		$('#FJConfirmButtons').html('');
		$('#confirmWindowText').html('');
		
		this.var_confirmed = true;
		
		this.callback('fj_confirm');
	}
}

String.prototype.nl2br = function(minLines)
{
	var breakTag = '<br/>';
	var string = (this + '').replace(/([^>]?)\n/g, '$1'+ breakTag +'\n');
	
	if (typeof(minLines) != "undefined")
	{
		var lines = string.split('<br');
		
		var needLines = minLines - lines.length;
		
		if (needLines > 0)
		{
			var brs = '';
			
			for(var i = 0; i < needLines; ++i)
			{
				brs += breakTag;
			}
			
			string += brs;
		}
	}
	
	return string;
}

String.prototype.textareaQuote = function()
{
	return ('  '+this).replace(/([^>]?)\n/g, '$1\n  ');
}

String.prototype.quote = function()
{
	return (''+this).replace(/  /g, '&nbsp;&nbsp;');
}

String.prototype.limitChars = function(count, dots)
{
	if (typeof(dots) == "undefined" || dots == true)
		dots = '...';
	else
		dots = '';

	var str = strip_html_tags(this);
	
	if (str.length > count)
		return str.substr(0, count)+dots;
	else
		return str;
}

Date.prototype.time12 = function()
{
	var hour = this.getHours();
	var meridiem = (hour < 12)? 'am' : 'pm';
	hour = (hour < 13)? hour : hour - 12;
	var minutes = (this.getMinutes() < 10)? '0' + this.getMinutes() : this.getMinutes();
	return time = hour + ':' + minutes + meridiem;	
}

Date.prototype.getDate2 = function()
{
	var date = this.getDate();
	if (date < 10)
		return '0'+date;
	return date;
}

Date.prototype.monthShortName = function()
{
	var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];	
	return months[this.getMonth()];
}

function strip_html_tags(str){
	str = str.replace(/&(lt|gt);/g, function (strMatch, p1){
		return (p1 == "lt")? "<" : ">";
	});
	str = str.replace(/<\/?[^>]+(>|$)/g, "");

	return str;
}
function Pagination(handler, onclick, count, itemName)
{
	this.handler = handler;
	
	if (typeof(onclick) != "undefined")
		this.onclick= onclick.replace('/\(\)/gi', '');
	
	if (typeof(itemName) == "undefined")
		this.itemName = false;
	else
		this.itemName = itemName;
	
	if (typeof(count) != "undefined" && FJ.isNumeric(count))
		this.count = count;
	else
		this.count = 5;
}

Pagination.prototype.display = function(curPage, pmCount, perPage)
{
	if(typeof(this.handler) == "undefined" || !$('#'+this.handler))
	{
		FJ.error('Pagination error: wrong handler!');
		return;
	}
	
	if(typeof(this.onclick) == "undefined")
	{
		FJ.error('Pagination error: wrong onclick function!');
		return;
	}
	
	if (typeof(curPage) == "undefined" || pmCount <= perPage)
	{
		$('#'+this.handler).html('');
		return;
	}
	
	if (typeof(pmCount) == "undefined" || !FJ.isNumeric(pmCount))
	{
		FJ.error('Pagination error: wrong count!');
		return;
	}
	
	if (typeof(perPage) == "undefined" || !FJ.isNumeric(perPage))
	{
		FJ.error('Pagination error: wrong per page count!');
		return;
	}
	
	count = this.count;
	
	var countHalf = Math.floor(this.count / 2);
	var totalPages = Math.ceil(pmCount / perPage);
	
	if (count > totalPages)
	{
		count = totalPages;
	}
	
	var from = curPage - countHalf;
	var to = from + perPage;
	
	if (from < 1)
	{
		from = 1;
		to = count;
	}
	else
	{
		to = from + 2*countHalf;
		if (to > totalPages)
		{
			to = totalPages;
			from = to - 2*countHalf;
			if (from < 1)
			{
				from = 1;
			}
		}
	}
	
	//FJ.warn('from:'+from +' to:'+to+' count:'+count+' countHalf:'+countHalf+' total'+totalPages);
	
	var html = '';
	
	if (from > 1)
	{
		html += '<a href="#" onclick="'+this.onclick+'(1)">First</a>';
	}

	if (curPage > 1)
	{        
		html += '<a href="#" onclick="'+this.onclick+'('+(curPage-1)+')">Previous</a>';
	}

	for (var i = from; i <= to; i++)
	{
		if (i == curPage)
    {
			html += '<strong>'+i+'</strong>';
    }
    else
    {
			html += '<a href="#" onclick="'+this.onclick+'('+i+')">'+i+'</a>';
    }
	}
	
	if (curPage < totalPages)
	{
		html += '<a href="#" onclick="'+this.onclick+'('+(curPage+1)+')">Next</a>';
	}

	if (to < totalPages)
	{
		html += '<a href="#" onclick="'+this.onclick+'('+totalPages+')">Last</a>';
	}

	if (this.itemName)
	{
		html += ' ['+pmCount+' '+this.itemName;
		if (totalPages > 1) html += 's';
		html += ']';
	}
	
	$('#'+this.handler).html(html);
}

function setCaretPosition(elem, position) {
	if (document.selection) {
		elem.focus ();
		var oSel = document.selection.createRange ();
		oSel.moveStart ('character', -elem.value.length);
		oSel.moveStart ('character', position);
		oSel.moveEnd ('character', 0);
		oSel.select ();
	}
	else if (elem.selectionStart || elem.selectionStart == '0') {
		elem.selectionStart = position;
		elem.selectionEnd = position;
		elem.focus ();
	}
}
//
//function setCaretPosition(inputEl, selStart, selEnd){
//	if (inputEl.setSelectionRange){
//		inputEl.focus();
//		inputEl.setSelectionRange(selStart, selEnd);
//	}
//	else if (inputEl.createTextRange){
//		var range = inputEl.createTextRange();
//		range.collapse(true);
//		range.moveEnd('character', selEnd);
//		range.moveStart('character', selStart);
//		range.select();
//	}
//}

function getColor(color)
{
	var parts = color.match(/^.*\((\d+),\s*(\d+),\s*(\d+)\)$/);
	if (!parts || typeof(parts) == "string")
		var resultColor = color.split('#').join('');
	else {
		delete (parts[0]);
		for (var i = 1; i <= 3; ++i) {
		    parts[i] = parseInt(parts[i]).toString(16);
		    if (parts[i].length == 1) parts[i] = '0' + parts[i];
		}
		resultColor = parts.join('');
	}
	return resultColor;
}


function loggedIn(){
	return !(FJUserId == '' || FJUserName == '' || FJUserId == 'nu11' || FJUserName == 'nu11')
}

function mustLogin(onSuccess){
	if (!loggedIn()){
		if (typeof onSuccess != 'undefined')
			FJ.changeCallback('onLoginSuccess', onSuccess);
		users.showLoginForm();
		return false;
	}
	return true;
}

function isSessionServer() {
	var ss = SESSION_SERVER;
	
	ss = ss.replace('http://www.', '').replace('http://', '');
	
	return ( document.location.href.indexOf(ss) > -1 );
}

function showElements(className)
{
	if (className.substr(0.1) != '.')
		className = '.'+className;
		
	$(className).each(function()
	{
		$(this).show();
	});
}

function hideElements(className, exception)
{
	if (className.substr(0.1) != '.')
		className = '.'+className;
	//alert(className);
	$(className).each(function()
	{
		if (typeof(exception) != "undefined" && this.id == exception){}
		else
		{
			$(this).hide();
		}
	});
}

// check if user data is Loaded
function getUserData(callback, login, reget)
{
	if (typeof(reget) == "undefined")
		reget = false;
		
	FJ.trace('getUserData()');
	if (reget || !loggedIn())
	{
		if (!reget) {
			FJ.trace('check cookies');
			FJUserId = cookies.getVal('userId');
			FJUserName = cookies.getVal('userName');
			FJUserSid = cookies.getVal('fjsession');
		}

		if ((reget || !loggedIn()) && FJON)
		{
			FJ.trace('cookies are empty, loading data from session server...');
			loadUserData(callback, login, true);
			return false;
		}
	}
	
	if (FJON && loggedIn())
		FJ.trace('data loaded! :D, username:'+ FJUserName);
	
	if (typeof(callback) != 'undefined')
	{
		FJ.callback(callback, 'getUserData');
	}
	
	return true;
}
var loop = 0;

var loadAgain;

var sfLoadCount = 0;

// load user data from "session server"
function loadUserData(callback, login, load)
{
	FJ.trace('loadUserData() callback:' + callback);
	
	if (loop > 200)
	{
		FJ.error('fucking session don\'t want load');
		return;
	}
	
	if(load == true || loop == 50)
	{
		sfLoadCount++;
		
		if (isSessionServer() && sfLoadCount == 1 && !loggedIn())
		{
			FJ.trace('exit; session don\'t exist');
			var dontLoad = true;
		}
		else
		{
			//clear user data
			FJUserName = '';
			FJUserId = '';
			FJUserSid = '';
			
			$('#synch_script').remove();
			$('body').prepend('<script id="synch_script" src="'+SESSION_SERVER+'sso/getUserData/"></script>');
		
//			FJ.trace('load session file');
		}
	}
	
	if (FJUserName == 'nu11' || FJUserId == 'nu11')
	{
		if (login && login == true)
		{
			clearTimeout(loadAgain);
			loadAgain = setTimeout('loadUserData("'+callback+'")', 300);
			loop++;
			return;
		}
		
		if (typeof(callback) != 'undefined')
		{
			FJ.callback(callback, 'load 1');
		}
		else
		{
			FJ.trace('You are not logged in');
		}
	}
	else if(FJUserName == '' || FJUserId == '')
	{
		if (typeof(dontLoad) != "undefined" && dontLoad == true)
		{
			FJ.callback(callback);
			return;
		}
		
		clearTimeout(loadAgain);
		loadAgain = setTimeout('loadUserData("'+callback+'")', 300);
		loop++;
		return;
	}
	else
	{
		if (isSessionServer() == false)
		{
			if(cookies.getVal('userId') != FJUserId)
			{
				try {
					FJ.trace('Data loaded, synchronize sesion/create cookies');
					
					$form = $('<form>').attr({
						id: 'synchForm',
						action: SESSION_SERVER+'sso/synch/'+SITE_URL,
						target: 'trafficFrame'});
					
					if ($('#synchForm').lenght > 0)
						$('#synchForm').remove();
						
					$('#trafficBox').append($form);
					$('#synchForm').submit();
				}
				catch(e) {
					FJ.warn('creting cookies error:' + e.message);
				}
			}
		}
		else
			FJ.trace('This is session server, cookies was create long time ago ;)');
			
		FJ.callback(callback, 'loadUserData');
	}
}

function loginn(form, refreshAfterLogin){
	url = $(form).attr('action');
	$(form).find('input[type=submit], button').attr('disabled', 'disabled');
	
	if (url.indexOf('ajaxlogin') > -1){
		var register = false;
		$('#loginForm_comm').addClass('loginForm_comm_loading').text('');
	}
	else{
		register = true;
		$(form).find('#signupForm_comm').addClass('singUp_form_loading').text('');
	}
	
	$.ajax({
		type: 'post',
		url: url,
		data: $(form).serialize(true),
		success: function(transport) {
			var response = transport || "Request Error";
			var data = response.split('|')

			if (data[0] == 'OK'){
				try{
					if (register){
						loginSuccess(data[1], data[2], true);
					}
					else{
						if (typeof data[3] != "undefined" && data[3] == 'first')
							firstLogin = true
						else
							firstLogin = false
						
						loginSuccess(data[1], data[2], firstLogin);
						
						users.hideLoginForm();

						if(refreshAfterLogin != undefined && refreshAfterLogin == true){
							document.location.href = document.location;
						}
					}
				}
				catch(e){
					FJ.error(e.message + ' ' + e.lineNumber)
				}
			}
			else{
				if (register){
					$(form).find('#signupForm_comm').removeClass('singUp_form_loading').html(response).show();
				}
				else{
					$(form).find('#loginForm_comm').removeClass('loginForm_comm_loading').html(response);
				}
			}
			$(form).find('input[type=submit], button').removeAttr('disabled', 'disabled');
		},
		error: function() {
			if (register)
				$(form).find('#signupForm_comm').text('Request Failed');
			else if ($('#login_boxx_info').lenght > 0)
				$(form).find('#loginForm_comm').text('Request Failed');
				
			$(form).find('#loginForm_comm').removeClass('loginForm_comm_loading').text('Request failed.');
			
			$(form).find('input[type=submit], button').removeAttr('disabled', 'disabled');
		}
	});

	return false;
}

function loginSuccess(userId, userName, firstLogin)
{
	FJUserId = userId;
	FJUserName = userName;

	FJUserSid = cookies.getVal('fjsession');

	if (typeof firstLogin != "undefined" && firstLogin == true)
	{
		document.location.href = '/member';
		return;
	}

	if (FJ.isInUrl('member', 0))
	{
		document.location.reload(true);
		return;
	}

	getNewData();

	$('#loginWindow').hide();

	makeLoggedIn();
	
	$('#loginWindow').hide();
	
	FJ.callback('onLoginSuccess');
}

function loginOpen(){
	try{
		if(loggedIn()){
			users.makeLoggedIn();
			return false;
		}
		else{
			users.showLoginForm();
			return false;
		}


		
/*		if (!$('#loginBox').length > 0)
			// do nothing, wait for load div loginBox :)
			return;
		
		$('#loginBox_addonText').text('');
		
		if (isSessionServer())
		{
			$('#loginBox_frame').hide();
			$('#loginBox_normal').show();
		}
		else
		{
			var bgColor = getColor($('#loginWindow .windowInner').css('backgroundColor'));
			var fontColor = getColor($('#loginWindow .windowInner').css('color'));
			var errorColor = getColor($('.errorMessage').css('color'));
			
			var url = SESSION_SERVER+"sso/login/"+SITE_URL+"/"+bgColor+"/"+fontColor+"/"+errorColor;
			
			$('#loginBox_normal').hide();
			$('#loginBox_frame').show();
			
			if ($('#frameLogin').get(0).src != url || FrameClosed == true)
			{
				$('#frameLogin').get(0).src = url;
				
				FrameClosed = false;
			}
		}
	
		$('#registerBox').hide();
	
		$('#loginWindow').show();
		$('#loginBox').show();
		$('#login_boxx_info').hide();
		$('#registerButtonBox').show();
	
		if (isSessionServer())
			setCaretPosition($('#loginForm').get(0)['username'], 0, 0);
	*/
	}
	catch(e){
		FJ.error(e);
	}
	if(typeof(event) != "undefined") event.returnValue = false;
	return false;
}

function loginOpen2(hreff)
{
	if (loggedIn())
	{ 
		makeLoggedIn();
		window.location.href = hreff;
		return false;
	}
	
	FJ.addOneCallback('onLoginSuccess', function(){window.location.href = hreff});	
	loginOpen();
	
	if(typeof(event) != "undefined") event.returnValue = false;
	
	return false;
}

function loginOpen3(hreff)
{
	if (loggedIn())
	{ 
		makeLoggedIn();
		window.location.href = hreff;
		return false;
	}

	FJ.addOneCallback('onLoginSuccess', function(){window.location.href = hreff});	
	loginOpen();

	if ($('#loginBox_addonText').length > 0)
		$('#loginBox_addonText').html('<p style="padding-left: 5px; padding-right: 5px;">You must login first to upload. Don\'t have an account? Register now (It\'s free and takes seconds).</p>');

	if(typeof(event) != "undefined") event.returnValue = false;
	
	return false;
}

function loginClose()
{
	$('#loginWindow').hide();
}

function frameClose()
{
	FrameClosed = true;
	loginClose();
}

function registerOpen()
{
	$('#loginBox').hide();
	$('#registerSuccess').hide();
	$('#registerButtonBox').hide();	
	$('#register_boxx_info').hide();
	$('#reg_form').show();
	$('#registerBox').show();
	
	if (!$('#reg_form').length > 0)
	{
		$('#registerBoxContent').html('<img src="' + SCRIPT_URL + 'site/' + SITE_NAME + '/images/userbar/aload2.gif">');
		
		$.ajax(
		{
			type: 'get',
			url: '/userbar/getsignup',

			success: function(response) {
				$('#registerBoxContent').html(response);
				
				if (FJ.IE6)
					$('body').prepend('<link rel="stylesheet" type="text/css" href="'+STATIC_URL+'site/style/userbar-ie6.css" />');
			},
			error: function() {
				$('#registerBoxContent').text('Request error');
			}
		});
	}
	
	loadCaptcha('rregForm');
}

function passwordRecoveryOpen()
{
	$('#passwordRec_info').hide();
	
	$('#passwordRecoveryWindow').show();
	loadCaptcha('passwordRec');
	
	loginClose();
	
	return true;
}


function setNewPassword()
{

	var user = $('#recUsername').get(0);
	var pass1 = $('#recPass1').get(0);
	var pass2 = $('#recPass2').get(0);
	

	
	
	if(pass1.value != pass2.value)
	{
	    $('#recerror').show();
	    $('#recerror').html('<p style="color: red;">Please type your password twice</p>');
		return false;
	}
	
	if(pass1.value.length < 4 || pass1.value.length > 30)
	{
	    $('#recerror').show();
	    $('#recerror').html('<p style="color: red;">Your password must be between 4 and 30 characters</p>');
		return false;	
	}
	

	
	var url = '/member/setNewPass/' + user.value + '/' + pass1.value + '/' + pass2.value;
	
		$.ajax(
	{
		type: 'get',
		url: url,
		
		success: function(response) {
			$('#recerror').show();
			$('#setNewPass').hide();
	        $('#recerror').html('<p style="color: green; text-align: center;">Password changed</p>');
			
		},
		error: function() {
			$('#recerror').html('<p style="color: red;">Request Faild</p>');
		}
	});
	
	return false;

}

function passwordRecover(form)
{
	$('#passwordRec_info').html('<img src="' + SCRIPT_URL + 'site/' + SITE_NAME + '/images/userbar/aload2.gif">');
	$('#passwordRec_info').show();
	
	$.ajax(
	{
		type: 'post',
		url: '/userbar/password',
		data: $(form).serialize(true),
		success: function(response) {
			var data = response.split('|')
			if (data[0] == 'OK')
			{
				$('#passwordRec_info').hide();
				$('#passwordRecoveryWindow').hide();
				FJ.alert(data[1]);
			}
			else
			{
				$('#passwordRec_info').html(response);
			}
		},
		error: function() {
			$('#passwordRec_info').text('Request Failed');
		}
	});
	
	return false;
}



function makeLoggedIn(userName){
	users.makeLoggedIn();
}

function makeLoggedOut(){
	users.makeLoggedOut();
//
//	FJ.trace('makeLoggedOut()');
//  
//	closeTabs();
//
//	hideElements('fj_loggedIn');
//
//	showElements('anonInfo');
//	showElements('fj_loggetOut');
//
//	$('#userbarLoginInf').html('<a href="/member/" onClick="loginOpen(); return false;" style="text-decoration: none">Login or Register</a>');
//
//	if ($('#logInf').length > 0)
//	{
//		$('#logInf').html('<a href="/member/" style="text-decoration: none">You are not logged in. Click here to sign in</a>');
//	}
//
//		if ($('#commForm').length > 0)
//	{
//		$('#commForm').get(0).username.value = 'anonymous';
//	}
//
//	$('#userbar-wrap').hide();
//	$('#se1').hide();
//	$('#topp').show();

}

function synchronizeSession(loaded)
{
	FJ.trace('synchronizeSession()');
	if (!loaded){
		FJ.addCallback('sSession', 'synchronizeSession(true)');
		if (isSessionServer() && loggedIn()){
			getNewData('sSession');
		}
		else{
			getUserData('sSession');
			if(loggedIn())
				getNewData();
		}
		return;
	}
	
	// check if user is logged in on others places
	if (FJON)
		AutoCheckerID = setInterval(autoChecker, 60000);
	
	if (loggedIn())
		users.makeLoggedIn();
	else
		makeLoggedOut();
}

function autoChecker(loaded)
{
	FJ.trace('autoChecker() -- checking session');
	
	if (FJUserId != '' || FJUserId != 'nu11')
	{
		if (!loaded)
		{
			if (!FJ.callbackExist('aCheck'))
				FJ.addCallback('aCheck', 'autoChecker(true)');
			
			if (isSessionServer() && loggedIn())
				getNewData('aCheck');
			else
			{
				loop = 0;
				getUserData('aCheck', false, true)
				
				if (loggedIn())
				{
					getNewData();
				}
			}
			
			return;
		}
		
		if (loggedIn())
		{
			if (!isSessionServer())
				getNewData();
				
			makeLoggedIn();
		}
		else
			makeLoggedOut();
	}
}

function closeTabs(exception)
{
	hideElements('userbarTab', exception);
	
	$('.userbarButton').each(function()
	{
		if (typeof(exception) != "undefined" && this.id == exception){}
		else
			$(this).removeClass('userbarButtonCurrent');
	});
} 

function hideTab(tabId, buttonId)
{
	closeTabs(tabId);
	$('#'+tabId).hide();
	$('#'+buttonId).removeClass('userbarButtonCurrent');
}

function showTab(tabId, buttonId)
{
	closeTabs(tabId);
	$('#'+tabId).show();
	$('#'+buttonId).addClass('userbarButtonCurrent');
}

function toggleTab(tabId, buttonId)
{
	closeTabs(tabId);
	
	$('#'+tabId).toggle();
	
	if ($('#'+tabId).is(':hidden'))
	{
		$('#'+buttonId).removeClass('userbarButtonCurrent');
	}
	else
	{
		$('#'+buttonId).addClass('userbarButtonCurrent');
	}
}
/*
function friendsTab(){
	if (!loggedIn()){
		FJ.changeCallback('onLoginSuccess', function(){friendsTab()})
		loginOpen();
		return;
	}

	$('#friendsListContainer').remove();
	var div1 = $('<div>');
	var tabs = '<a href="#" class="fTab activeTab" id="fTabFriends">Friends</a><a href="#" class="fTab" id="fTabBlocked">Blocked users</a>';
	var div = $('<div>').attr({ 'id' : 'friendsListContainer' }).css('clear', 'both');
	div1.html(tabs).append(div);

	div1.dialog({
		modal		: true,
		bgiframe	: true,
		width		: 400,
		maxWidth	: 401,
		minWidth	: 401,
		height		: 350,
		minHeight	: 300,
		maxHeight	: 800,
		title		: 'Friends',
		position	: ['', html.calcDialogTopPos()],
		resizable	: true,
		close		: html.showFlash,
		open		: html.hideFlash,

		buttons: {
			Close : function() {
				$(this).dialog('close');
			}
		}
	});

	FJFriends.openn(div1);
	
	$('a.fTab').click( function(){
		$('a.fTab').removeClass('activeTab');
		$(this).addClass('activeTab');
		var type = $(this).attr('id') == 'fTabFriends' ? 'friends' : 'blocked';

		FJFriends.tab(type);
	});
}
*/
function favoritesTab(){
	if (!loggedIn()){
		FJ.changeCallback('onLoginSuccess', favoritesTab)
		loginOpen();
		return;
	}

	var div = $('<div>').css('padding', '10px');
	var d = $('<div>').addClass('dialogBlackW8');
	div.append(d);
	
	div.dialog({
		modal		: true,
		bgiframe	: true,
		width		: 400,
		minWidth	: 250,
		maxWidth	: 700,
		height		: 450,
		minHeight	: 300,
		maxHeight	: 600,
		title		: 'Favorites',
		position	: ['', html.calcDialogTopPos()],
		resizable	: true,
		close		: html.showFlash,
		open		: html.hideFlash,

		buttons: {
			Close : function() {
				$(this).dialog('close');
			}
		}
	});
	
	FJFav.openn(d);

}

function pmTab(){
	if (!loggedIn()){
		FJ.changeCallback('onLoginSuccess', function(){pmTab()})
		loginOpen();
		return;
	}

	$('#privMsgContainer').remove();

	var div = $('<div>').attr('id', 'privMsgContainer');
	var mLeft = $('<div>').attr('id', 'inboxLeft').html('<a href="#" class="active" id="showFolder_inbox" onclick="FJMsg.showFolder(\'inbox\'); return false;">Inbox ( <span id="pmTabUnread_inbox">'+FJMsg.folderSum['pmTabUnread_inbox']+'</span> / <span id="pmTabAll_inbox">'+FJMsg.folderSum['pmTabAll_inbox']+'</span> )</a><a href="#" id="showFolder_sent" onclick="FJMsg.showFolder(\'sent\'); return false;">Sent ( <span id="pmTabUnread_sent">'+FJMsg.folderSum['pmTabUnread_sent']+'</span> / <span id="pmTabAll_sent">'+FJMsg.folderSum['pmTabAll_sent']+'</span> )</a>');
	var cont = $('<div>').attr('id', 'inboxContainer').addClass('w8');
	var pmPag = $('<div>').attr('id', 'pmPag');
	div.append(mLeft).append(cont).append(pmPag);

	div.dialog({
		modal		: true,
		bgiframe	: true,
		width		: 600,
		height		: 450,
		title		: 'Inbox',
		position	: ['', html.calcDialogTopPos()],
		resizable	: false,
		close		: html.showFlash,
		open		: html.hideFlash,

		buttons: {
			Close : function() {
				$(this).dialog('close');
			}
		}
	});
	var span = $('<span>').addClass('red mt10 pl10').html('Messages are deleted after 30 days.').css({'position' : 'relative', 'top' : '12px'});
	$('.ui-dialog-buttonpane button').before(span);

	FJMsg.openn();
}

function myProfile() {
	
	if (!loggedIn()) {
		FJ.changeCallback('onLoginSuccess', function(){myProfile()})
		loginOpen();
		return;
	}
	
	document.location.href = '/members/';
}

function showProfile()
{
	if (!loggedIn())
	{
		FJ.changeCallback('onLoginSuccess', function(){showProfile()})
		loginOpen();
		return false;
	}
	
	if (!$('#profileWindowContent').length > 0)
	{
		// do nothing, loading this div is not completed yet
		return false;
	}
	
	$('#profileWindow').show();
	
	if (!$('#profileEditForm').length > 0)
	{
		$('#profileWindow_info').html('<img src="' + SCRIPT_URL + 'site/' + SITE_NAME + '/images/userbar/aload2.gif">');
		
		$.ajax(
		{
			type: 'get',
			url: '/userbar/getprofile',

			success: function(response) {
				$('#profileWindow_info').text('');
				
				$('#profileWindowContent').html(response);
				
				$('body').append($('#extraProfileWindows').html());
				
				$('#extraProfileWindows').remove();
				
				if (FJ.IE6)
					$('body').prepend('<link rel="stylesheet" type="text/css" href="'+STATIC_URL+'site/style/userbar-ie6.css" />');
			},
			error: function() {
				$('#profileWindow_info').text('Request error');
			}
		});
	}
	
	return false;
}

function accountDeleteOpen()
{
	if (FJ.IE7 || FJ.IE6)
		$('#profileWindow').hide();
	
	$('#accountDeleteWindow').toggle();
	$('#adw_message').text('');
}

function accountDeleteClose()
{
	if (FJ.IE7 || FJ.IE6)
		$('#profileWindow').show();
	
	$('#accountDeleteWindow').hide();
}

function accountDelete(form)
{
	$.ajax({
		type: 'post',
		url: '/userbar/accountdelete',
		
		data: $(form).serialize(),
		success: function(response)
		{
			data = response.split('|');
			if (data[0] == "OK")
			{
				document.location.href = "/";
			}
			else
			{
				$('#adw_message').html(response);
				$('#adw_message').show();
				FJ.error(response);
			}
		},
		error: function()
		{
			
		}
	})
}

function resendActivationOpen()
{
	if (FJ.IE7 || FJ.IE6)
		$('#profileWindow').hide();
		
	$('#resendActivationWindow').toggle();
	$('#raw_message').text('');
}

function resendActivationClose()
{
	if (FJ.IE7 || FJ.IE6)
		$('#profileWindow').show();

	$('#resendActivationWindow').hide();
}

function resendActivation(form)
{
	$.ajax({
		type: 'post',
		url: '/userbar/resendactivation',
		
		data: $(form).serialize(),
		success: function(response)
		{
			data = response.split('|');
			if (data[0] == "OK")
			{
				$('#raw_message').html(data[1]);
			}
			else
			{
				$('#raw_message').html(response);
				FJ.error(response);
			}
		},
		error: function()
		{
			
		}
	})
}

function editProfile(form){
	$('#profileWindow_info').empty()
							.addClass('w8')
							.show('fast');
	$.ajax({
		type: 'post',
		url : '/userbar/setprofiledata',
		
		data: $(form).serialize(true),
		success: function(transport) {
			var response = transport || "Request Error";
			var data = response.split('|')
			if (data[0] == 'OK'){
				try{
					if((FJ.isInUrl('members', 0) || (FJ.isInUrl('user', 0) && FJ.isInUrl(FJUserName.toLowerCase(), 1))) && $('#profileAvatar').length > 0){
						data = $(form).get(0).elements;
						if (parseInt(data.avatar_remove.value) == 1)
							$('#profileAvatar').html('&nbsp;');
						else
							$('#profileAvatar').html('<img src="/media/avatars/'+data.big_avatar_name.value+'">');
						$('#profileDescription').html(FJ.strip_tags(data.description.value).nl2br());
					}
				}
				catch(e){}
				
				$(form).dialog('close');
			}
			else{
				$('#profileWindow_info').removeClass('w8');
				$('#profileWindow_info').html(response);
			}
		},
		failure: function() {
			$('#profileWindow_info').removeClass('w8');
			$('#profileWindow_info').html(response);
		}
	});
	return false;
}

function showAvatar(fileName, bigFileName)
{
	if (typeof(fileName) != "undefined")
	{
		//FJ.warn(fileName +' '+ bigFileName);
		
		$('#avatar_name').attr('value', fileName);
		$('#big_avatar_name').attr('value', bigFileName);
		$('#avatar_remove').attr('value', 0);
		
		$('#profileEditAvatar').html('<img id="av_img" src="/media/avatars/'+fileName+'">');
		$('#profileEditAvatar_action').show();
		
		imgTooltip();
	}
	else
	{
		$('#profileEditAvatar').text('NO AVATAR');
		$('#profileEditAvatar_action').hide();
	}
}

function removeAvatar()
{
	showAvatar();
	$('#avatar_remove').attr('value', 1);
}

function imgTooltip()
{
	/* CONFIG */		
	var xOffset = -150;
	var yOffset = 120;		
	
	var elem = $('#av_img');
	
	if (!elem.length > 0)
		return;

	var src = $('#big_avatar_name').val();
	
	if (src == '')
		return;
	
	$("#imgTooltip").remove();
	$("body").append('<p id="imgTooltip"><img src="/media/avatars/'+src+'"></p>');
	
	elem.hover(
		function(e)
		{
			onTooltip();
    },
		function()
		{
			$("#imgTooltip").hide();
    }
   );	
	elem.mousemove(function(e)
	{
		$("#imgTooltip")
			.css("top",(e.pageY - yOffset) + "px")
			.css("left",(e.pageX + xOffset) + "px");
	});
	
	onTooltip = function()
	{
		obj = $("#imgTooltip");
		obj.fadeIn("fast");
	}
}

function setMaxlength(handler, maxlength, remainingHandler)
{
	maxlength = parseInt(maxlength);
	
	var elem = $("#"+handler+" textarea");
	
	if (remainingHandler)
		$('#'+remainingHandler).text((maxlength - elem.val().length));
	else
		$('#'+handler).find('.charsRemaining').text((maxlength - elem.val().length));
	
	elem.keypress(function(event){
		var key = event.which;
		
		//all keys including return.
		if(key >= 33 || key == 13) {
			var length = this.value.length;
			if(length >= maxlength)
				event.preventDefault();
		}

		if (remainingHandler)
			$('#'+remainingHandler).text((maxlength - $(this).val().length));
		else
			$('#'+handler).find('.charsRemaining').text((maxlength - $(this).val().length));
		
	});
}

function getNewData(callback){
	if (!FJON)
		return;
		
	var data = {};

	if (typeof(callback) != "undefined" && isSessionServer() && loggedIn())
		data.ss = 1;

	if (!FJMsg.opened)	
		data.st = 1;
	
	if (typeof(pmData.inbox.data) != "undefined" && typeof(pmData.inbox.data.last) != "undefined")
			data.lm = pmData.inbox.data.last;
	
	$.ajax({
		type: 'get',
		url: '/userbar/getnewdata/',
		data: data,
		dataType: 'json',
		success: function(data)
		{	
			FJFriends.addOnlineUsers(data.users);
			FJMsg.addNewData(data.pm);
			
			if (typeof(data.fav) != "undefined")
				FJFav.addNewData(data.fav);
				
			if (typeof(data.ss) != "undefined")
				setUserData(callback, data.ss);
			if (typeof(data.isB) != "undefined" && data.isB==true)
				users.logout();
				
		},
		error: function()
		{
			FJ.warn('getNewData() request failed');
		}
	});
}

function setUserData(callback, ss)
{
	if (ss.hasOwnProperty('userId')) {
		FJUserId = ss.userId;
		FJUserName = ss.userName;
	}
	
	FJUserSid = ss.userSid;
	
	if (callback)
		FJ.callback(callback);
} 

var FJBlock = {
	 
	block: function(userId, userName, elem){
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJBlock.block(userId, userName, elem)})
			loginOpen();
			return false;
		}
		
		var confirmation = 'Block this user from commenting on your content, sending you mail, viewing your profile, or inviting you to be a friend?';

		if(!dialog.confirm('Block user?', confirmation, function(){FJBlock.block(userId, userName, elem)}))
			return false;
		
		// dla blokowania w komentarzach
		if(elem){
			$(elem).click( function(){
				FJBlock.unBlock(userId, userName, $(this));
				return false;
			})
			.text('Unblock')
			.attr('title', 'Unblock')
			.removeAttr('onclick');
		}
		// end of dla blokowania w komentarzach
		$.ajax({
			type: 'get',
			url: '/userbar/block/'+userId,
			success: function(data) {
				if (data == "User has been blocked") {
					if (FJFriends.cache.friends!=null) {
						var newData = {
							0: {
								id: userId,
								username: userName,
								accept: 0,
								online: 0,
								blocked: 1
							}
						}
						mergeJSONData(FJFriends.cache.friends, newData);
						FJFriends.update_status()
						FJFriends.opennIf();
					}
					$('.userBlockF').addClass('hidden');
					$('.userUnblockF').removeClass('hidden');
					dialog.alert("User has been blocked");
				}
			},
			error: function(){}
		});
		return false;
	},
	
	unBlock: function(userId, userName, elem) {
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJBlock.unBlock(userId, userName, elem)})
			loginOpen();
			return false;
		} 
		if (!dialog.confirm('Confirmation', 'Are you sure, you want to <strong>unblock user '+userName+'</strong>?', function(){FJBlock.unBlock(userId, userName, elem)}))
			return false;
		
		// dla blokowania w komentarzach
		if(elem != undefined) {
			$(elem).click( function(){
				FJBlock.block(userId, userName, $(this));
				return false;
			})
			.text('Block')
			.attr('title', 'Block')
			.removeAttr('onclick');
		}
		// end of dla blokowania w komentarzach
		$('#friendsListContainer').addClass('dialogBlackW8');
		$.ajax({
			type: 'get',
			url: '/userbar/unblock/'+ userId,
			success: function(data) {
				var response = data || "Request Error";
				if (response == "User has been unblocked" && FJFriends.cache.friends!=null ) {
					deleteJSONItem(FJFriends.cache.friends, 'id', userId);
					if (FJFriends.current!=undefined)
						FJFriends.tab(FJFriends.current);
					FJMsg.changeBlockade(userId, 0);
					//FJFriends.status.blocked--;
					FJFriends.update_status();
					dialog.alert(response);
					$('.userBlockF').removeClass('hidden');
					$('.userUnblockF').addClass('hidden');
				}else{
					dialog.alert(response);
				}
				$('#friendsListContainer').removeClass('dialogBlackW8');
			},
			error: function(){
				$('#friendsListContainer').removeClass('dialogBlackW8');
				dialog.alert('Request Failed :(');
			}
		});
		//this.opennIf();
		return false;
	}, 


	blockIP : function(ip, elem){
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJBlock.blockIP(ip, elem)})
			loginOpen();
			return false;
		}

		var text = '<div id="blockUserText"><p>' +
				'Block this IP address from commenting on your content or profile?' +
				'</p>' +
				'</div>';

		if(!dialog.confirm('Confirmation', text, function(){FJBlock.blockIP(ip, elem)}))
			return false;

		$.ajax({
			type: 'get',
			url: '/userbar/blockip/' + ip,

			success : function(response){
				$(elem).removeAttr('onclick')
						.click( function(){
							FJBlock.unblockIP(ip, elem);
							return false;
						})
						.text('Unblock IP');
				return false;
			},

			error: function(){
				alert('Request Failed');
			}
		});
		return false;
	},

	unblockIP : function(ip, elem){
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJBlock.unblockIP(ip, elem)})
			loginOpen();
			return false;
		}

		var text = 'Are you sure you want to <strong>unblock this IP address?</strong>';

		if(!dialog.confirm('Confirmation', text, function(){FJBlock.unblockIP(ip, elem)}))
			return false;

		$.ajax({
			type: 'get',
			url: '/userbar/unblockip/' + ip,
			
			success : function(response){
				$(elem).removeAttr('onclick')
						.click( function(){
							FJBlock.blockIP(ip, elem);
							return false;
						})
						.text('Block IP');
				return false;
			},


			error: function()
			{
				alert('Request Failed');
			}
		});

		return false;
	}
}


var favData = {
	data: {
		actual: 0,
		all: 0,
		last: 0,
		first: 0
	}
}

var FJFav = {
	data: {
		page: 1,
		actual: 0
	},
	cache : '',
	
	opened: false,
	pagination: false,
	
	openn: function(div) {
		this.opened = true;
		this.showFav(0, div);
	},
	
	reset: function()
	{
		this.data = {
			page: 1,
			actual: 0
		}
		
		favData = {
			data: {
				actual: 0,
				all: 0,
				last: 0,
				first: 0
			}
		}
	},
	
	showFav: function(page, div){
		if (FJ.reg('fav')){
			return;
		}
		
		var count = 10;
		if (typeof(favData.data) == "undefined"){
			var generate = 2;
			page = 1;
	  	
			var favStart = (page - 1) * count ;
			var favStop = favStart + count;
		}
		else{
			last = favData.data.last;
			var lastPage = this.data.page;

			if (typeof(page) == "undefined" || page == ''){
				if (lastPage > 1){
					page = lastPage;
				}
				else{
					page = 1;
					this.data.page = 1;
				}
			}
			else{
				this.data.page = page;
			}

			favStart = (page - 1) * count ;

			if (page > 1 && favData.data.all - favStart < count)
			{
				count = favData.data.all - favStart;
			}

			favStop = favStart + count;

			generate = 0;

			if(page != lastPage){
				if (favData.data.count < favStop){
					generate = 2;
				}
				else{
					generate = 1;
				}
			}
		}
		
		favStop = favData.data.count;

		if(this.data.actual == 1 || generate == 1){
			var data = this.generateFavList(favStart, favStop);
			
			if (FJ.empty(data))
				data = '<div class="pt10 aCenter">Favorites are Empty</div>';

			this.data.actual = 2;

			if(div)
				div.removeClass('dialogBlackW8');
		}
		else if (this.data.actual == 0 || generate == 2){
			var url = '/userbar/favorites/0/0/0/';
			FJ.reg('fav', true);
			
			$.ajax({
				type: 'get',
				url: url,
				
				dataType: 'json',
				complete: function(){
					FJ.reg('fav', false);
				},
				success: function(newData){
					try{
						var data = '';
						if (newData != ''){
							mergeJSONData(favData, newData);
						}
					
						if (typeof(favData[0]) == "undefined"){
							data = '<div class="pt10 aCenter">Favorites are Empty</div>';
						}
						else{
							data = FJFav.generateFavList(favStart, favData.data.count);
						}

						div.html(data).removeClass('dialogBlackW8');
						FJFav.cache = data;
						FJFav.changeGlobalCount();
					
						FJFav.data.actual = 2;

						$('#favoritesList li').hover( function(){$(this).addClass('hover');}
													, function(){$(this).removeClass('hover');});
					
						//FJFav.pagination.display(page, favData.data.all, count);
					}
					catch(e)
					{
						FJ.error(e.message);
					}
				},
				error: function()
				{
					FJ.error('failed');
				}
			});
		}
		else{
			div.html(FJFav.cache).removeClass('dialogBlackW8');
			$('#favoritesList li').hover( function(){$(this).addClass('hover');}
							, function(){$(this).removeClass('hover');});

		}
		
	//		if (!downloading)
	//		{
	//			this.pagination.display(FJFav.data.page, favData.data.all, count);
	//		}
	},
	
	generateFavList: function(favStart, favStop){
		var data = '';
		
		for(var i = favStart; i < favStop; ++i){
			if (!favData[i]) break;
			data += '<li><img src="' + STATIC_URL + 'images/close.gif" onclick="FJFav.removeFavorite('+i+', this, \''+favData[i].title.replace('\'', '\\\'')+'\'); return false" title="Remove from favorites" /><a href="'+favData[i].url+'">'+favData[i].title+'</a></li>';
		}
		
		return data != '' ? '<ul id="favoritesList">'+data+'</ul>' : '';
	},
	
	addFavorite: function(id, elem){
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJFav.addFavorite(id, elem)});
			users.showLoginForm();
			return;
		}

		if($(elem).text() == 'Added to favorites') return;

	
		$.ajax({
			type: 'get',
			url: '/userbar/addfavorite/'+id,
			
			success: function(transport){
				var response = transport || "Request Error";
				var data = response.split('|')
				if (data[0] == 'OK'){
					$('#removeCntFromFav').show();
					$('#addCntToFav').hide();
					
					if(FJFav.opened){
						var newData = {
							0: {
								id: data[1],
								cid: data[2],
								title: data[3],								
								url: elem.href
							}
						}
						
						mergeJSONData(favData, newData);
						
						if (FJFav.data.actual != 0)
							FJFav.data.actual = 1;
						
						FJFav.showFav();
					}
					
					favData.data.all = parseInt(favData.data.all) + 1;
					favData.data.count = parseInt(favData.data.count) + 1;
					
					if (FJFav.data.actual != 0)
						FJFav.data.actual = 1;
					
					FJFav.changeGlobalCount();
				}
			}
		});
	},
	
	removeFavorite: function(id, elem, title){
		if(!dialog.confirm('Confirmation', 'Do you really want to delete<br /><strong class="greenLight">'+title+'</strong><br />from your favorites?', function(){FJFav.removeFavorite(id, elem, title);}))
			return false;


		favId = favData[id].id;

		$.ajax(	{
			type: 'get',
			url: '/userbar/removefavorite/'+favId,

			success: function(transport)
			{
				var response = transport || "Request Error";
				var data = response.split('|')
				if (data[0] == 'OK')
				{
					try{
						if (FJ.isInUrl(FJ.urlSegment(1,favData[id].url), 1))
							$('#addToFavLink').html('<a onclick="FJFav.addFavorite('+favData[id].cid+', this); return false;">+ Add to Favorites</a>');

						deleteJSONItem(favData, 'id', favId);
						sortJSONData(favData);

						$('#removeCntFromFav').hide();
						$('#addCntToFav').show();
					}
					catch(e)
					{
						FJ.error(e.message);
					}

					favData.data.all = parseInt(favData.data.all) - 1;
					favData.data.count = parseInt(favData.data.count) - 1;

					if(FJFav.data.actual != 0)
						FJFav.data.actual = 2;

					FJFav.changeGlobalCount();

					var parent = $(elem).parents('ul');
					$(elem).parents('li').remove();
					FJFav.cache = '<ul id="favoritesList">' + parent.html() + '</ul>';
				}
				else{
					dialog.alert('Error: Can\'t delete this link :(');
				}
			},
			error: function(){
				dialog.alert('Error: Can\'t delete this link :(');
			}
		});

		return false;
	},

	removeFavorite_contentPage: function(id, elem, title){
		if(!dialog.confirm('Confirmation', 'Do you really want to delete<br /><strong class="greenLight">'+title+'</strong><br />from your favorites?', function(){FJFav.removeFavorite_contentPage(id, elem, title);}))
			return false;

		$.ajax(	{
			type: 'get',
			url: '/userbar/removefavbycid/'+id,

			success: function(transport){
				var response = transport || "Request Error";
				var data = response.split('|')

				if (data[0] == 'OK'){
					try{
						$('#removeCntFromFav').hide();
						$('#addCntToFav').show();
					}
					catch(e){
						FJ.error(e.message);
					}
					FJFav.reset();
				}
				else{
					dialog.alert('Error: Can\'t delete this link :(');
				}
			},
			error: function(){
				dialog.alert('Error: Can\'t delete this link :(');
			}
		});

		return false;
	},
	
	addNewData: function(data){
		favData.data.all = parseInt(data);
		this.changeGlobalCount();
	},
	
	changeGlobalCount: function(){
		$('#userbarFavoritesCount').text(favData.data.all);
	}
}

var pmData = {
	inbox: {},
	sent: {},
	drafts: {}
};

var FJMsg = {
	data: {
		inbox: {
			main: 1,
			page: 1,
			actual: 0,
			unread: 0
		},
		sent: {
			page: 1,
			actual: 0,
			unread: 0
		},
		drafts: {
			page: 1,
			actual: 0,
			unread: 0
		},
		global: {
			active: 0,
			folder: "inbox",
			pmId: 0
		}
	},

	folderSum : {'pmTabUnread_inbox' : 0,
					'pmTabAll_inbox'	: 0,
					'pmTabUnread_sent'	: 0,
					'pmTabAll_sent'		: 0},
	
	pagination: false,
	started: false,
	opened: false,

	loadedSound: null,
	msgSound: 'http://x.funnyjunk.com/site/funnyjunk/sounds/message.mp3?rand=' + Math.random(),

	reset : function(){
		this.data = {
			inbox: {
				main: 1,
				page: 1,
				actual: 0,
				unread: 0
			},
			sent: {
				page: 1,
				actual: 0,
				unread: 0
			},
			drafts: {
				page: 1,
				actual: 0,
				unread: 0
			},
			global: {
				active: 0,
				folder: "inbox",
				pmId: 0
			}
		}
		
		pmData = {
			inbox: {},
			sent: {},
			drafts: {}
		};
		
		this.opened = false;
	},
	
	start: function(){
		try{
			if (!this.started){
				this.started = true;
				this.pagination = new Pagination('pmPag', 'FJMsg.showPage', '', 'message');
			}
		}
		catch(e){
			alert(e.message);
		}
	},
	
	openn: function(){
		this.opened = true;
		if (false && this.data.global.pmId > 0)
			return;
		else if (this.data.global.folder != 0)
			this.showFolder(this.data.global.folder);
		else
			this.showFolder('inbox');
	},
	
	write: function(userId, userName, subject, text, reply, noCaptcha){
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJMsg.write(userId, userName)});
			loginOpen();
			return;
		}
		var haveAccess = canHaveAccess('message_write', userId);

		if(!haveAccess[0]) {
			dialog.alert(haveAccess[1]);
			return;			 
		}

		$('#fjmsg_writeForm').remove();
		
		var form = $('<form>').attr({'method' : 'post',
										'action' : '#',
										'id' : 'fjmsg_writeForm'})
								.css({'margin' : '0', 'padding' : '10px'})
								.submit( function(){FJMsg.send();return false;});
		// 'Enter' listener
//		form.keydown( function(event){
//			if(event.keyCode == 13){
//				form.trigger('submit');
//			}
//		});


		if(subject == undefined) subject = '';
		if(text == undefined) text = '';
		var hidden = '<input id="fjmsg_userId" type="hidden" value="'+userId+'" name="userId"/><input id="fjmsg_userName" type="hidden" value="'+userName+'" name="userName"/>';
		var title = 'Subject:<input maxlength="45" name="subject" type="text" class="txt" id="privMsgSubject" value="'+subject+'" />';
		var message = 'Message:<textarea id="privMsgMessage" name="text">'+text+'</textarea>';
		var info = '<div class="red" id="fjmsg_writeWindowInfo"></div>';

		if(noCaptcha == undefined || !noCaptcha){
			var captchaId = html.genCaptchaId(13);
			var captcha = '<div id="privMsgCaptcha"><img src="/captcha/display/'+captchaId+'" onclick="html.refreshImage(this); return false;" />click for a new captcha<input type="hidden" name="captchaId" value="'+captchaId+'" /></div>';
			captcha += '<div id="privMsgEnterCaptcha">Enter Captcha Code: <input class="txt captcha" maxlength="5"name="cap_code" value="" /></div>';

			var height = 450;
		}
		else{
			captcha = '';
			height = 380;
		}

		form.html(hidden + title + message + captcha + info);

		form.dialog({
			modal		: true,
			bgiframe	: true,
			width		: 501,
			height		: height,
			title		: 'Send message to <span class="greenLight">' + userName + '</span>',
			position	: ['', html.calcDialogTopPos()],
			resizable	: false,
			close		: html.showFlash,
			open		: html.hideFlash,

			buttons: {
				Send : function() {
					FJMsg.send();
					//$(this).dialog('close');
				},
				Cancel : function() {
					$(this).dialog('close');
				}
			}
		});

		if(!$.browser.msie){
			if(reply)
				setCaretPosition(document.getElementById('privMsgMessage'), 0);
			else
				setCaretPosition(document.getElementById('privMsgSubject'), 0);
		}
	},
	
	reply: function(folder, pmId){
		for (i in pmData[folder]){
			if (pmData[folder][i].id == pmId){
				var pm = pmData[folder][i];
				break;
			}
		}
		
		var date = new Date();
		date.setTime(pm.date * 1000);
		
		var subject = pm.subject;
		
		if (pm.subject.length <= 41 && pm.subject.indexOf('Re:') != 0)
			subject = 'Re: '+pm.subject;
		var month = date.getMonth()+1;
		var text = "\n\n  "+date.getFullYear()+'/'+ month +'/'+date.getDate()+' '+pm.username+ "\n"+
			strip_html_tags(pm.text.textareaQuote());
			
		
		this.write(pm.author_id, pm.username, subject, text, true, true);
		// jesli odpowiedź na PM - ukrywamy captchę
	},
	
	send: function(){
		$('#fjmsg_writeWindowInfo').empty().addClass('w8');
		$('#privMsgMessage').removeClass('invalid');

		var params = $('#fjmsg_writeForm');
		
		var message = FJ.strip_tags(FJ.trim( $('#privMsgMessage').val() ));
		if(message == ''){
			$('#privMsgMessage').addClass('invalid');
			$('#fjmsg_writeWindowInfo').html('Message field is obligatory');
			$('#fjmsg_writeWindowInfo').removeClass('w8');
			return false;
		}
		if(message.length < 5){
			$('#privMsgMessage').addClass('invalid');
			$('#fjmsg_writeWindowInfo').html('Message is to short!');
			$('#fjmsg_writeWindowInfo').removeClass('w8');
			return false;
		}
		if(message.length > 5000){
			$('#privMsgMessage').addClass('invalid');
			$('#fjmsg_writeWindowInfo').html('Message is to long!(Max 5000 Chars)');
			$('#fjmsg_writeWindowInfo').removeClass('w8');
			return false;
		}
		
		if(FJ.trim($('#privMsgSubject').val()) == '')
			$('#privMsgSubject').val('(no subject)');
		
		$.ajax({
			type: 'post',
			url: '/pm/send/',
			
			data: $('#fjmsg_writeForm').serialize(true),
			success: function(transport) {
				var response = transport || "Request Error";
				var data = response.split('|');
				
				if (data[0] == 'OK'){
					$('#fjmsg_writeForm').dialog('close');
	    			if (!FJ.empty(pmData.sent[0])){
	    				if (FJMsg.data.sent.actual != 0)
	    					FJMsg.data.sent.actual = 1;
	    					
	    				pmData.sent.data.all = parseInt(pmData.sent.data.all) + 1;
	    				pmData.sent.data.count = parseInt(pmData.sent.data.count) + 1;
	    				
	    				FJMsg.folderCount('sent');
	    				
	    				date = new Date();
							
							var sent = {
								0: {
									id: data[1],
									subject: params.subject.value,
									text: FJ.strip_tags(params.text.value),
									receiver_id: params.userId.value,
									username: params.userName.value,
									date: parseInt(date.getTime() / 1000),
									unread: 0
								}
							}
							mergeJSONData(pmData.sent, sent);
	    			}
				}
				else{
					$('#fjmsg_writeWindowInfo').html(response);
					$('#fjmsg_writeWindowInfo').removeClass('w8');
				}
			},
			error: function(){
				$('#fjmsg_writeWindowInfo').html('Request Failed');
				$('#fjmsg_writeWindowInfo').removeClass('w8');
			}
		});
		
		return false;
	},
	
	showPage: function(page){
		this.showFolder('', page);
	},
	
	reloadFolder: function(folder){
		this.showFolder(folder, '', true);
	},
	
	showFolder: function(folder, page, reload){
		if(FJ.reg('msg')) return;

		if(!this.pagination)
			this.pagination = new Pagination('pmPag', 'FJMsg.showPage', '', 'message');

		$('#inboxContainer').addClass('w8');

		if (typeof(folder) == "undefined" || folder == '')
			folder = this.data.global.folder;

		$('#showFolder_inbox, #showFolder_sent').removeClass('active');
		$('#showFolder_'+folder).addClass('active');
		
		//this.showSubTab('pmTabContent_'+folder, 'pmButton_'+folder);

		var lastFolder = this.data.global.folder;
		var lastPmId = this.data.global.pmId;

		this.data.global.folder = folder;
		this.data.global.pmId = 0;

		var last = 0;
		var first = 0;

		if (typeof(pmData[folder].data) == "undefined"){
			var generate = 2;
			page = 1;

			var count = 12;
			var newCount = count;
			var newStart = 0;
			var pmStart = (page - 1) * count;
			var pmStop = pmStart + count;
		}
		else{
			last = pmData[folder].data.last;
			first = pmData[folder].data.first;

			var lastPage = this.data[folder].page;

			if (typeof(page) == "undefined" || page == ''){
				if (lastFolder == folder && (lastPmId > 0 || typeof(reload) != "undefined")){
					page = lastPage;
				}
				else{
					page = 1;
					this.data[folder].page = 1;
				}
			}
			else{
				this.data[folder].page = page;
			}

			count = 12;
			newCount = 12;
			newStart = 0;

			pmStart = (page - 1) * count;

			if (pmStart > pmData[folder].data.all -1){
				if (page > 1) -- page;
				pmStart = (page - 1) * count;
			}

			if (page > 1 && pmData[folder].data.all - pmStart < 12){
				count = pmData[folder].data.all - pmStart;
			}

			pmStop = pmStart + count;

			generate = 0;

			if (pmData[folder].data.count < count){
				if (page != lastPage)
					newCount += count - pmData[folder].data.count;
				else
					newCount = count - pmData[folder].data.count;
			}

			if(page != lastPage){
				if (typeof(pmData[folder][pmStart]) == "undefined" || typeof(pmData[folder][pmStop]) == "undefined")
					generate = 2;
				else
					generate = 1;
			}
		}

		if (typeof(pmData[folder].data) != "undefined" && pmData[folder].data.count > 0 && pmData[folder].data.count == pmData[folder].data.all){
			this.data[folder].actual = 1
			generate = 1
		}

		var downloading = false;

		if (!reload && (this.data[folder].actual == 1 || generate == 1)){
			FJMsg.generateMessageList('pmCache_' + folder, folder, pmStart, pmStop);
			$('#inboxContainer').html( $('#pmCache_' + folder).html() );
			$('#inboxContainer').removeClass('w8');
			this.data[folder].actual = 2;
		}
		else if (reload || this.data[folder].actual == 0 || generate == 2){
			//$('#pmTabLoading').show();
			//this.closeSubTabs('', true);

			//this function without parameters will hide pagination
			this.pagination.display();
			if (page > 1)
				var url = '/pm/folder/'+folder+'/0/0/'+pmStart+'/'+newCount;
			else
				url = '/pm/folder/'+folder+'/'+first+'/'+last+'/'+newStart+'/'+newCount;

			downloading = true;
			FJ.reg('msg', true);

			$.ajax({
				type: 'get',
				url: url,
				dataType: 'json',
				complete: function(){
					FJ.reg('msg', false);
				},

				success: function(transport){
					try {
						var newData = transport;

						if (newData != ''){
							mergeJSONData(pmData[folder], newData, pmStart);
						}
						
						FJMsg.data[folder].actual = 2;

						FJMsg.pagination.display(page, pmData[folder].data.all, 12);

						FJMsg.generateMessageList('pmCache_' + folder, folder, pmStart, pmStop);
						$('#inboxContainer').html( $('#pmCache_' + folder).html() );
						$('#inboxContainer').removeClass('w8');
					}
					catch(e){
						FJ.error('showFolder(): line:'+e.lineNumber+' '+e.message);
					}
				}
			});
		}
		else{
			$('#inboxContainer').html( $('#pmCache_' + folder).html() );
			$('#inboxContainer').removeClass('w8');
		}

		if (!downloading){
			this.pagination.display(page, pmData[folder].data.all, 12);
		}
	},
	
	addNewData: function(data)
	{
		if (typeof(pmData.inbox.data) == 'undefined')
		{
			mergeJSON(pmData.inbox, '');
			mergeJSON(pmData.sent, '');
		}

		if (typeof(data.counts) != 'undefined')
		{
			pmData.inbox.data.all = data.counts.inbox;
			pmData.sent.data.all = data.counts.sent;
		}
		
		if (typeof(data.unread) != "undefined")
			this.data.inbox.unread = data.unread;
		
		if (typeof data.unread_id != "undefined")
		{
			this.data.inbox.unread = data.unread_id.length;
			
			var unread;
			
			for (pm in pmData.inbox)
			{
				unread = false;
				
				for (id in data.unread_id)
				{
					if (pmData.inbox[pm].id == data.unread_id[id])
						unread = true;
				}
				
				if (unread)
					pmData.inbox[pm].unread = 1;
				else
					pmData.inbox[pm].unread = 0;
			}
		}
		
		if (typeof(data.pm) != "undefined" && typeof(data.pm.data) != "undefined")
		{
			mergeJSONData(pmData.inbox, data.pm);

			//if (typeof(data.unread) == "undefined")
			//	this.data.inbox.unread = parseInt(this.data.inbox.unread) +  parseInt(data.pm.data.count);	
		}

		this.folderCount();
		
		if (FJFriends.data.actual != 0)
			FJFriends.data.actual = 1;
			
		if (this.data.inbox.actual != 0)
			this.data.inbox.actual = 1;
			
		if ($('#pmTab').is(':visible'))
			this.reloadFolder();
	},
	
	generateMessageList: function(handler, folder, pmStart, pmStop){
		FJ.trace('generateMessageList()');
		
		var pm = pmData[folder];
		var count = 0;
		var click;
		
		var data = '';
		for(var i=pmStart; i < pmStop; ++i){
			if (!pm[i]) continue;

			if(pm[i].adminColor != undefined){
				pm[i].username = '<span class="'+pm[i].adminColor+'">'+pm[i].username+'</span>';
			}
			
			++ count;
			
			var addon = '';
			
			if (pm[i].unread == 1){
				addon = ' unread';
			}
			
			click = ' onclick="FJMsg.showMessage(\''+folder+'\',\''+pm[i].id+'\')"';
			
			var admin = '';
			if (typeof pm[i].admin != 'undefiend' && pm[i].admin == 1)
				admin = ' mass';

			data += '<tr class="'+addon+admin+'" title="'+pm[i].subject+'" id="msg-'+i+'">' +
						'<td class="sel"><input type="checkbox" /></td>' +
						'<td'+click+' class="auth">'+pm[i].username+'</td>' +
						'<td'+click+' class="subj">'+pm[i].subject.limitChars(20)+'</td>' +
						'<td'+click+' class="cont">'+pm[i].text.limitChars(25)+'</td>' +
					'</tr>';
		}

		if (data == ''){
			$('#'+handler).html('<div class="aCenter pt10">No messages</div>');
			$('#'+handler).removeClass('w8');
			return;
		}
		var select = $('<div>').attr('id', 'pmSelect');
		var select_html = '<strong>Select:</strong> <a href="#" onclick="FJMsg.selectAll(); return false;">All</a> | <a href="#" onclick="FJMsg.selectNone(); return false;">None</a> ';
		select_html += '<a href="#" class="pl20" onclick="FJMsg.removeSelected(); return false;">delete selected</a> <a href="#" onclick="FJMsg.markReadSelected(); return false;" class="pl20">mark as read selected</a>';
		select.html(select_html);

		$('#'+handler).html('<table summary="" id="inboxList">' + data + '</table>');
		$('#'+handler).append(select);
		$('#'+handler).removeClass('w8');
		
//		$('#'+handler).html('<table class="msgsList">'+data+'</table>' +
//				'<div class="selectElement">Select: <span id="msgSAll'+folder+'">All</span>, <span id="msgSNone'+folder+'">None</span>' +
//				'<span style="padding-left:40px;" onclick="FJMsg.removeSelected(\''+folder+'\')">delete selected</span>'+
//				'<span style="padding-left:20px; padding-right:20px;" onclick="FJMsg.markReadSelected(\''+folder+'\')">mark as read selected</span></div>');
	
	},
	
	showMessage: function(folder, pmId){
		if(this.pagination)
			this.pagination.display();
		
		this.data.global.pmId = pmId;
		
		for (i in pmData[folder]){
			if (pmData[folder][i].id == pmId){
				var pm = pmData[folder][i];
				break;
			}
		}
		if(typeof(pm) == "undefined"){
			$('#inboxContainer').html('<div class="aCenter pt10 red">Sorry, this message does not exist</div>');
		}
		else{
			if (pm.unread == 1)
				this.markAsRead(folder, pmId);
			
			time = '<span class="right pt10 mr10">'+this.formatDate(pm.date)+'</span>';
			
			var buttons = '';
			
			var admin = '';
			if (typeof pm.admin != 'undefiend' && pm.admin == 1)
				admin = ' mass';
			
			var user_del = (typeof pm.udel != 'undefiend' && pm.udel == 1) ? true : false;
			
			if(pm.adminColor != undefined){
				var user = '<span class="'+pm.adminColor+'">'+pm.username+'</span>';
			}
			else if(pm.username.toLowerCase() == 'funnyjunk' || pm.type == 'system')
				user = '<span class="greenLight">FunnyJunk</span>';
			else if(user_del)
				user = '<span class="greenLight">'+pm.username+'</span>';
			else
				user = '<a href="/user/'+pm.username+'" class="greenLight bold">'+pm.username+'</a>';
			
			if(folder == 'inbox')
				user += ' to me';
			else
				user = 'me to '+user;
			
			user = '<div class="pt10 pl10'+admin+'">'+user+'</div>';

			var text = pm.text;
			
			buttons = '<button class="hand ui-state-default ui-corner-all" type="button" onclick="FJMsg.remove(\''+folder+'\', '+pmId+')">delete</button> ';
			
			if (pm.type == 'inv_new' && !user_del)
				text += '<div class="aCenter pt20"><button class="hand ui-state-default ui-corner-all" type="button" onclick="FJFriends.acceptInvite('+pm.author_id+'); return false;">Accept invitation</button> ' +
						'<button class="hand ui-state-default ui-corner-all" type="button" onclick="FJFriends.declineInvitation('+pm.author_id+'); return false;">Decline invitation</button></div>';
			else if (pm.type == 'inv_accepted')
				text += '<div class="pt20 greenLight aCenter">You have answered <strong>yes</strong> to '+pm.username+'\'s request.</div>';
			else if (pm.type == 'inv_canceled')
				text += '<div class="pt20 greenLight aCenter">You have decided to answer <strong>no</strong> to '+pm.username+'\'s request.</div>';
			else if (pm.type == "msg" && folder == 'inbox' && pm.block != 1 && pm.imblock != 1 && !user_del)
				buttons += '<button class="hand ui-state-default ui-corner-all" type="button" onclick="FJMsg.reply(\''+folder+'\', '+pmId+')">reply</button> ';

			
			if (folder == 'inbox' && pm.type != 'system' && pm.type != 'funnyjunk' && !user_del && pm.adminColor == undefined){
				if (pm.block == 1)
					buttons += '<span class="pr10 pl10 greenLight bold">'+pm.username+' is blocking you</span> ';
				
				if (pm.imblock == 1)
					buttons += '<button class="hand ui-state-default ui-corner-all" type="button" onclick="FJBlock.unBlock('+pm.author_id+', \''+pm.username+'\')">Unblock '+pm.username+'</button> ';
				else
					buttons += '<button class="hand ui-state-default ui-corner-all" type="button" onclick="FJBlock.block('+pm.author_id+', \''+pm.username+'\')">Block '+pm.username+'</button> ';
			}
			
			subject = '<div class="bold pt10 pl10 underline'+admin+'">'+pm.subject+'</div>';

			text = '<div class="pl10 pt10">'+text.nl2br().quote()+'</div>'
			buttons = '<div class="pt10 pl10 aCenter">'+buttons+'</div>';

			$('#inboxContainer').empty()
								.append(subject)
								.append(time)
								.append(user)
								.append(text)
								.append(buttons);
		}
	},
	
	changeType: function(authorId, type)
	{
		var folder = 'inbox';
		for (var item in pmData[folder])
		{
			if (item == 'data')
				continue;
				
			if (pmData[folder][item].author_id == authorId && pmData[folder][item].type == 'inv_new')
			{
				pmData[folder][item].type = type;
				
				if ($('#pmTab').is(':visible') && this.data.global.pmId > 0)
					this.showMessage('inbox', this.data.global.pmId);
				
				break;
			}
		}
	},
	
	changeBlockade: function(authorId, value){
		var folder = 'inbox';
		for (var item in pmData[folder]){
			if (item == 'data') continue;
				
			if (pmData[folder][item].author_id == authorId)	{
				pmData[folder][item].imblock = value;
			}
		}

		this.showMessage(this.data.global.folder, this.data.global.pmId);
	},
	
	closeSubTabs: function(exception, leaveButtons)
	{
		hideElements('pmTab', exception);
		
		if ((typeof(leaveButtons) == "undefined") || leaveButtons != true)
		{
			$('.pmButton').each(function()
			{
				if (typeof(exception) != "undefined" && this.id == exception){}
				else
					$(this).removeClass('pmButtonCurrent');
			});
		}
	},
	
	showSubTab: function(tabId, buttonId)
	{
		this.closeSubTabs('#'+tabId);
		if ($('#'+tabId))
		{
			$('#'+tabId).show();
		}
		
		this.markSubTab(tabId, buttonId);
	},
	
	markSubTab: function(tabId, buttonId)
	{
		if ($('#'+tabId))
		{
			if (!$('#'+tabId).is(':hidden'))
				$('#'+buttonId).addClass('pmButtonCurrent');
			else
				$('#'+buttonId).addClass('pmButtonCurrent');
		}
		else
		{
			$('#'+buttonId).addClass('pmButtonCurrent');
		}
	},
	
	markAsRead: function(folder, pmId){
		var admin = '';
		
		for (var i in pmData[folder])
			if (pmData[folder][i].id == pmId) {
				var msg = i;
				if (typeof pmData[folder][i].admin != 'undefined' && pmData[folder][i].admin == 1)
					admin = '/1';
				break;
			}
		
		$.ajax({
			type: 'get',
			url: '/pm/markasread/'+pmId+admin,
			success: function(response){
				var data = response.split('|');
				
				if(data[0] == 'OK'){
					pmData[folder][msg].unread = 0;
					FJMsg.data[folder].unread = FJMsg.data[folder].unread - 1;
					FJMsg.data[folder].actual = 1;
					FJMsg.folderCount(folder);
					return true;
				}
				return false;
			}
		});
	},

	selectNone : function(){
		$('#inboxContainer input').each( function(){
			$(this).removeAttr('checked');
			$(this).parents('tr').removeClass('selected')
		});
	},

	selectAll : function(){
		$('#inboxContainer input').each( function(){
			$(this).attr('checked', 'checked');
			$(this).parents('tr').addClass('selected')
		});
	},

	markReadSelected: function(folder, confirmed) {
		var readMsgs = {};
		var count = 0;
		
		var user;

		if(folder == undefined)
			folder = FJMsg.data.global.folder;

		$('#inboxList tr.selected').each(function(){
			user = pmData[folder][this.id.split('-')[1]];
			if (user.unread != 0){
				if (typeof user.admin != 'undefined' && user.admin == 1)
					readMsgs[count] = user.id+',1';
				else
					readMsgs[count] = user.id;
				count++;
			}
		})
			
		if (count == 0) {
			return false;
		}
		
		if (!dialog.confirm('Confirmation', 'Do you really want to mark as read this messages?', function(){FJMsg.markReadSelected(folder)}))
			return false;
		
		$.ajax({
			type: 'post',
			url: '/pm/markreadselected',
			
			data: readMsgs,
			success: function(response) {
				
				if (response == 'OK') {
					for(var i in pmData[folder]) {
						for(var j in readMsgs) {
							if(pmData[folder][i].id == readMsgs[j].split(',')[0]) {
								pmData[folder][i].unread = 0;
							}
						}
					}
					
					FJMsg.data[folder].unread = parseInt(FJMsg.data[folder].unread) - count;
					FJMsg.data[folder].actual = 1;
					FJMsg.folderCount(folder);
					FJMsg.reloadFolder();
				}
				else {
					dialog.alert('Request error');
				}
			},
			
			error: function () {
				dialog.alert('Request failed');
			}
		})
		return false;
	},
	
	removeSelected: function(folder, confirmed){
		var elems = {};
		var count = 0;
		
		var unread = 0;
		var user;

		if(folder == undefined)
			folder = this.data.global.folder;

		if (!dialog.confirm('Confirmation', 'Do you really want to delete selected messages?', function(){FJMsg.removeSelected(folder)}))
			return false;

		
		$('#inboxList tr').each(function(){
			if ($(this).hasClass('selected')){
				user = pmData[folder][this.id.split('-')[1]]
				
				if (typeof user.admin != 'undefined' && user.admin == 1)
					elems[user.id] = user.id+',1';
				else
					elems[user.id] = user.id;
				
				++count;
				
				if (user.unread == 1)
					++unread;
			}
		})

		if (count == 0)
			return false;
		
		$.ajax({
			type: 'post',
			url: '/pm/removeselected',
			
			data: elems,
			success: function(response){
				if (response == 'OK'){
					for(var item in elems){
						deleteJSONItem(pmData[folder], 'id', item.split(',')[0]);
					}
					
					pmData[folder].data.all = parseInt(pmData[folder].data.all) - count;
					pmData[folder].data.count = parseInt(pmData[folder].data.count) - count;
					
					FJMsg.data[folder].unread = parseInt(FJMsg.data[folder].unread) - unread;
					FJMsg.folderCount(folder);
					FJMsg.data[folder].actual = 0;
					FJMsg.reloadFolder();
				}
				else{
					dialog.alert('Request error');
				}
			},
			
			error: function (){
				dialog.alert('Request failed');
			}
		})
		return false;
	},
	
	remove: function(folder, pmId){
		if(!dialog.confirm('Delete?', 'Do you really want to delete this message?', function(){FJMsg.remove(folder, pmId);}))
			return false;
		
		admin = '';
		
		for(var i in pmData[folder])
			if (pmData[folder][i].id == pmId) {
				if (typeof pmData[folder][i].admin != 'undefined' && pmData[folder][i].admin == 1)
					admin = '/1';
				break;
			}
		
		$.ajax({
			type: 'get',
			url: '/pm/remove/'+pmId+admin,
			success: function(response)
			{
				var data = response.split('|');
				
				if(data[0] == 'OK')
				{
					try {
						pmData[folder].data.all = parseInt(pmData[folder].data.all) - 1;
						pmData[folder].data.count = parseInt(pmData[folder].data.count) - 1;
						
						FJMsg.folderCount(folder);
						
						deleteJSONItem(pmData[folder], 'id', pmId);
						
						FJMsg.data[folder].actual = 1;
						
						FJMsg.showFolder();
					}
					catch(e)
					{
						alert(e.message);
					}

					return true;
				}
					
				return false;
			}
		});
		return false;
	},
	
	checkAccept: function(friendId, value)
	{
		var pm = pmData.inbox;
		
		for (var i in pm)
		{
			if (i == 'data')
				continue;
				
			if (pm[i].author_id == friendId)
				pm[i].accept = value;
		}
	},
	
	checkUnread: function(folder)
	{
		var unread = 0;
		if (typeof(folder) != "undefined" && $('#pmButton_'+folder).length > 0)
		{
			for (var i in pmData[folder])
			{
				if (pmData[folder][i].unread == 1)
					++unread;
			}

			if (this.data[folder].actual != 0)
				this.data[folder].actual = 1;
				
			this.data[folder].unread = unread;			
			this.folderCount(folder);
		}
		else
		{
			for (folder in pmData)
			{
				for (i in pmData[folder])
				{
					if (pmData[folder][i].unread == 1)
						++unread;
				}
				
				if (this.data[folder].actual != 0)
					this.data[folder].actual = 1;
					
				this.data[folder].unread = unread;
				this.folderCount(folder);
			}
		}
	},
	
	folderCount: function(folder)
	{
		var upc = $('#userbarPmCount');
		
		if (typeof(folder) != "undefined"){
			if (pmData[folder].data){
				FJMsg.folderSum['pmTabAll_'+folder] = pmData[folder].data.all;
				$('#pmTabAll_'+folder).text(pmData[folder].data.all);
			}
			else{
				FJMsg.folderSum['pmTabAll_'+folder] = 0;
				$('#pmTabAll_'+folder).text('0');
			}
			
			if (this.data[folder].unread > 0)
			{
				if (typeof(this.data[folder].main) != "undefined")
				{
					$('#userbarPmInf').addClass('pmButtonUnread');
					upc.text(this.data[folder].unread+' new').parent().addClass('bold');
				}
				//$('#pmButton_'+folder).addClass('pmButtonUnread');
				$('#pmTabUnread_'+folder).html(this.data[folder].unread);
				FJMsg.folderSum['pmTabUnread_'+folder] = this.data[folder].unread;
			}
			else
			{
				if (typeof(this.data[folder].main) != "undefined"){
					upc.text('0 new').parent().removeClass('bold');
				}
				//$('#pmButton_'+folder).removeClass('pmButtonUnread');
				$('#pmTabUnread_'+folder).html(0);
				FJMsg.folderSum['pmTabUnread_'+folder] = 0;
			}
		}
		else
		{
			for (folder in pmData)
			{
				if (pmData[folder].data){
					FJMsg.folderSum['pmTabAll_'+folder] = pmData[folder].data.all;
					$('#pmTabAll_'+folder).text(pmData[folder].data.all);
				}
				else{
					FJMsg.folderSum['pmTabAll_'+folder] = 0;
					$('#pmTabAll_'+folder).text('0');
				}

				if (this.data[folder].unread > 0){
					if (typeof(this.data[folder].main) != "undefined"){
						if(parseInt(upc.text()) < parseInt(this.data[folder].unread)){
							if(cookies.getVal('unreadMess') != this.data[folder].unread){
								FJMsg.playMessageSound(FJMsg.msgSound);
							}
						}
						document.cookie = "unreadMess=;expires=Thu, 01-Jan-70 00:00:01 GMT;";
						document.cookie = "unreadMess="+parseInt(this.data[folder].unread)+"; path=/";

						//$('#userbarPmInf').addClass('pmButtonUnread');
						//upc.addClass('pmButtonUnreadCount');
						upc.html(this.data[folder].unread+' new').parent().addClass('bold');
					}
					//$('#pmButton_'+folder).addClass('pmButtonUnread');
					FJMsg.folderSum['pmTabUnread_'+folder] = this.data[folder].unread;
					$('#pmTabUnread_'+folder).text(this.data[folder].unread);
				}
				else
				{
					document.cookie = "unreadMess=;expires=Thu, 01-Jan-70 00:00:01 GMT;";
					if (typeof(this.data[folder].main) != "undefined")
					{
						//$('#userbarPmInf').removeClass('pmButtonUnread');
						//upc.removeClass('pmButtonUnreadCount');
						upc.text('0 new').parent().removeClass('bold');
					}
					//$('#pmButton_'+folder).removeClass('pmButtonUnread');
					FJMsg.folderSum['pmTabUnread_'+folder] = 0;
					$('#pmTabUnread_'+folder).text('0');
				}
			}
		}
	},

	playMessageSound: function(sound){
		if(sound == undefined) sound = FJMsg.msgSound;
		if(document.soundPlayer != undefined && document.soundPlayer.loadSound){
			if(this.loadedSound != sound){
				document.soundPlayer.loadSound(sound);
				this.loadedSound = sound;
			}
			document.soundPlayer.playSound();
		}
		// na wypadek, jeśli flash się jeszcze nie załadował: 
		else{
			setTimeout(function(){
				FJMsg.playMessageSound(sound);
			}, 1000)
		}

	},
	
	formatDate: function (timestamp)
	{
		var date = new Date();
		date.setTime(timestamp * 1000);
		
		var today = new Date();
		var diff = today.getTime() - date.getTime();
		
		if (today.getDate() == date.getDate() && diff < 864000000)
			return date.time12();
		else if (today.getDate()-1 == date.getDate() && diff < 1728000000)
			return 'yesterday ' + date.time12();
		else if (today.getYear() == date.getYear())
   		return date.monthShortName()+' '+date.getDate2()+' '+date.time12();
		else
			return date.getFullYear()+'/'+date.getMonth()+'/'+date.getDate();
	}
}

/*
 * JSON object manipulation
 */
function sortJSONData(json)
{
	sortJSON(json, 'id', 'DESC');
}

function mergeJSONData(json1, json2, startFrom){
	mergeJSON(json1, json2, startFrom, 'id', 'DESC');
}

function groupJSON(json, groupBy, sortType)
{
  var tmp;

	var count = 0;
	var lastElem = -1;
	for(_obj in json)
	{
		if (_obj == 'data')
			continue;
			
		if (parseInt(_obj) > lastElem)
			lastElem = _obj;
		
		++count;
	}

	//FJ.warn(lastElem);
	if (typeof(sortBy) == "undefined" || sortBy == '')
		var sortBy = 'id';
	
//	if (typeof(json[0][sortBy]) == "undefined")
//		FJ.warn('sortJSON(): "'+sortBy+'" not fount in object');
	
	//alert(json.toSource());
	
	// sorting (only by numeric values)
	if (typeof(sortType) != "undefined" && sortType.toUpperCase() == 'DESC')
	{
		for (var i=1; i <= lastElem; ++i)
		{
			//alert(i);
			if (typeof(json[i]) == "undefined")
				continue;
			
			for (var j=i; j > 0; --j)
			{
				if (typeof(json[j]) == "undefined" || typeof(json[j-1]) == "undefined")
					continue;
				//FJ.log(j);
				if (parseInt(json[j][sortBy]) > parseInt(json[j-1][sortBy]))
				{
					//FJ.warn(json[j][sortBy]+ ' > '+ json[j-1][sortBy])
					tmp = FJ.clone(json[j-1]);
					//alert(tmp.toSource())
					json[j-1] = FJ.clone(json[j]);
					json[j] = FJ.clone(tmp);
				}
				//else
					//FJ.warn(json[j][sortBy]+ ' < '+ json[j-1][sortBy] + ' do nothing')
			}
		}
	}
	else
	{
		for (i=1; i < lastElem; ++i)
		{
			for (j=i; j >= 0; --i)
			{
				if (parseInt(json[j][sortBy]) < parseInt(json[j-1][sortBy]))
				{
					tmp = FJ.clone(json[j-1]);
					json[j-1] = FJ.clone(json[j]);
					json[j] = FJ.clone(tmp);
				}
			}
		}
	}
}

function sortJSON(json, sortBy, sortType)
{
	var tmp;

	var count = 0;
	var lastElem = -1;
	for(_obj in json)
	{
		if (_obj == 'data')
			continue;
			
		if (parseInt(_obj) > lastElem)
			lastElem = _obj;
		
		++count;
	}

	lastElem = parseInt(lastElem);

	//FJ.warn(lastElem);
	if (typeof(sortBy) == "undefined" || sortBy == '')
		sortBy = 'id';
	
//	if (typeof(json[0][sortBy]) == "undefined")
//		FJ.warn('sortJSON(): "'+sortBy+'" not fount in object');
	
	//alert(json.toSource());
	
	// sorting (only by numeric values)
	if (typeof(sortType) != "undefined" && sortType.toUpperCase() == 'DESC')
	{
		
		for (var i=0; i <= lastElem; ++i)
		{
			//alert(i);
			if (typeof(json[i]) == "undefined")
				continue;
			
			for (var j=i+1; j >= 0; --j)
			{
				if (typeof(json[j]) == "undefined" || typeof(json[j-1]) == "undefined")
					continue;
				//FJ.log(j);
				
				var change = false;
				
				if (!FJ.isNumeric(json[j][sortBy]))
				{
				  var arr = [json[j][sortBy].toLowerCase(), json[j-1][sortBy]].toLowerCase();
				  arr.sort();
				  if (arr[0] != json[j][sortBy].toLowerCase())
				  	change = true;
				}
				else if(parseInt(json[j][sortBy]) > parseInt(json[j-1][sortBy]))
				  change = true;
				
				if (change)
				{
					//FJ.warn(json[j][sortBy]+ ' > '+ json[j-1][sortBy])
					tmp = FJ.clone(json[j-1]);
					//alert(tmp.toSource())
					json[j-1] = FJ.clone(json[j]);
					json[j] = FJ.clone(tmp);
				}
				//else
					//FJ.warn(json[j][sortBy]+ ' < '+ json[j-1][sortBy] + ' do nothing')
			}
		}
	}
	else
	{
		for (i=0; i < lastElem; ++i)
		{
		 	if (typeof(json[i]) == "undefined")
				continue; 
		  
			for (j=i+1; j >= 0; --j)
			{
			  if (typeof(json[j]) == "undefined" || typeof(json[j-1]) == "undefined")
					continue;
				//FJ.log(j);
			  
				change = false;
				
				if (!FJ.isNumeric(json[j][sortBy]))
				{
				  //FJ.warn(json[j][sortBy]+ ' = string');
				  
				  arr = [json[j][sortBy].toLowerCase(), json[j-1][sortBy].toLowerCase()];
				  arr.sort();
				  if (arr[0] != json[j-1][sortBy].toLowerCase())
				  	change = true;
				}
				else if(parseInt(json[j][sortBy]) < parseInt(json[j-1][sortBy]))
				  change = true;
			  
				if (change)
				{
					tmp = FJ.clone(json[j-1]);
					json[j-1] = FJ.clone(json[j]);
					json[j] = FJ.clone(tmp);
				}
			}
		}
	}
	
	//alert(json.toSource());
	
}

function mergeJSON(json1, json2, startFrom, sortBy, sortType){
	var count1 = 0;
	for(_obj in json1) ++count1;
	
	if (typeof(json1.data) == "undefined")
	{
		json1.data = {
			all: 0,
			count: count1,
			last: 0,
			first: 0
		};
	}
	else
	{
		--count1;
	}
	
	if (FJ.empty(json2))
	{
		return;
	}
	
	var count2 = 0;
	for(_obj in json2) ++count2;
	
	if (typeof(json2.data) == "undefined")
	{
		json2.data = {
			all: 0,
			count: count2,
			last: 0,
			first: 0
		};
	}
	else
	{
		--count2;
	}
	
	if (typeof(startFrom) == "undefined" || startFrom == '')
		startFrom = count1;
	
	if (parseInt(json2.data.all) > 0)
	{
		json1.data.all = json2.data.all;
	}
	
	if (typeof json1.data.first != 'undefined')
	{
		if (parseInt(json1.data.first) > parseInt(json2.data.first) || parseInt(json1.data.first) == 0)
		{
			json1.data.first = json2.data.first;
		}
	}
	
	if (typeof json1.data.last != 'undefined')
	{
		if (parseInt(json1.data.last) < parseInt(json2.data.last))
		{
			json1.data.last = json2.data.last;
		}
	}
	
	json1.data.count = count1 + parseInt(json2.data.count);
	
	//FJ.log(json1.toSource());
	
	for (var i=0; i < count2; ++i)
	{
		newItem = i + startFrom;
		json1[newItem] = json2[i];
	}
	
	var count = count1 + count2;
	
	//FJ.log(json1.toSource());
	
	if (typeof(sortBy) != "undefined")
	{
		sortJSON(json1, sortBy, sortType);
	}
	
	//alert(json1.toSource());
}

function deleteJSONItem(json, by, value)
{ 	
	try {
		for (var item in json)
		{
			if(item == 'data')
				continue;
				
			if (json[item][by] == value)
			{
				//FJ.warn(json[item][by] + ' = '+ value)	
				delete json[item];
				var deleted = parseInt(item);
				for (item2 in json)			{
					if(item2 == 'data')
						continue;
					
					newItem = parseInt(item2);
					//FJ.trace(item2 + ' - ' +deleted);
				
					if (newItem > deleted)
					{
						//FJ.trace(newItem + ' > ' + deleted + '  ' +(newItem-1)+'='+newItem);
						
						json[newItem-1] = FJ.clone(json[newItem]);
						delete json[newItem];
					}
	//				else if (newItem > 0)
	//				{
	//					FJ.trace(newItem + ' > 0  ' +(newItem-1)+'='+newItem);
	//					
	//					json[newItem+1] = FJ.clone(json[newItem]);
	//					delete json[newItem];
	//				}
				}
			}
		}
		
		if (typeof(deleted) == "undefined")
		{
			FJ.warn('deleteJSONItem(): item not found');
		}
	}
	catch(e)
	{
		alert('error ' + e.message + ' '+ e.lineNumber);
	}
}

function deleteUserContent(contentId, elem) {
	if (!loggedIn()){
		FJ.changeCallback('onLoginSuccess', function(){deleteUserContent(contentId, elem)})
		loginOpen();
		return false;
	}

	var confirmation = 'Are you sure you want to delete this content?';
	if(!dialog.confirm('Delete content?', confirmation, function(){deleteUserContent(contentId, elem)}))
		return false;

	$.ajax({
		type: 'GET',
		url: '/delete/' + contentId + '/undefined',

		success: function(response) {
			if (response == ''){
				$(elem).parents('li').fadeOut('fast');
			}
			else{
				dialog.alert(response);
			}
		},
		error: function() {
			dialog.alert('Could not delete the content');
		}
	});
	return false;
}

// new friends 
var FJFriends = {
	status: { 
		actual: 0, // Date().getTime()
		online: 0, // users online 
		blocked: 0, // users blocked
		request: 0, // users pending
		friends: 0  // accepted friends
	},
	cache: {
		actual: 0, // Date().getTime()
		friends: null // dane z ajaxa
	}, 
	data : {
		usersOnline: 0
	},
	started: false,
	opened: false,
	current: '', // otwarta zakladka
	
	start: function() {},
		
	open: function(div){
		if (div != undefined)
			this._div = div;
		
		this.opened = true;
		this.tab();	
	},
	
	close: function() {
		this._div.dialog('close');
	},
	
	reset: function()
	{
		FJFriends.status.online  = 0;
		FJFriends.status.blocked = 0;
		FJFriends.status.request = 0;
		FJFriends.status.friends = 0;
		FJFriends.cache.actual =  0;
		FJFriends.cache.friends = null; 
	},
	
	opennIf: function()
	{
		if (this.opened && this._div && this._div.dialog('isOpen'))
		{
			this.open();
			return true;
		}
		return false;
	},
	 
	tab: function(tab) {
		$('#friendsListContainer').addClass('dialogBlackW8');
		if (tab==undefined || tab=='') 
			tab = 'friends';
		FJFriends.current = tab;
			
		if ( new Date().getTime() - FJFriends.cache.actual < 60*3000) { //one minute 60 * 1000
	    	//alert(new Date().getTime() + " "+FJFriends.cache.actual + " " + (new Date().getTime() - FJFriends.cache.actual) );
		} else {
			FJFriends.getData(tab);	
		}
		$('#friendsListContainer').html(eval('FJFriends.action_'+tab+'()'));		
	},
	
	update_status: function() {
		if (FJFriends.cache.friends == null) 
			return;	

		FJFriends.status.online  = 0;
		FJFriends.status.blocked = 0;
		FJFriends.status.request = 0;
		FJFriends.status.friends = 0;  
 	 
 	 	sortJSON(FJFriends.cache.friends, 'username', 'ASC');
		sortJSON(FJFriends.cache.friends, 'online', 'DESC');
		sortJSON(FJFriends.cache.friends, 'accept', 'DESC');
 	 
		var i = 0;
		while (FJFriends.cache.friends[i]) {
			if (FJFriends.cache.friends[i].blocked == 1) {
				FJFriends.status.blocked++;
			}else{
				if (FJFriends.cache.friends[i].accept == 0) {
					FJFriends.status.request++;
				}
				if (FJFriends.cache.friends[i].accept == 1) {
					FJFriends.status.friends++;
				}
				if (FJFriends.cache.friends[i].online == 1) {
					FJFriends.status.online++;
				}
			}
			i++;		
		} 
		
		$('#fFriendsOverall').html(FJFriends.status.friends);
		$('#fBlockedUsers').html(FJFriends.status.blocked);
		$('#fRequestsFriends').html(FJFriends.status.request);
		$('#friendsListContainer').removeClass('dialogBlackW8');
		FJFriends.changeGlobalOnline(FJFriends.status.online);
	},
	
	action_friends: function() {
		var data = '';
		var listStart = 0; 
		var listStop = 100; 
		if (FJFriends.cache.friends == null)return;	
		FJFriends.update_status();
		for(var i = listStart; i < listStop; ++i) {
			if(!FJFriends.cache.friends[i])
				break;
			if (FJFriends.cache.friends[i].accept == 1)
				data += this.printList(FJFriends.cache.friends[i]);	
		}
		if (data != '')
		{
			return '<table id="friendsList">'+data + ' </table>';	// + FJFriends.Debug()
		}
		return '<div class="aCenter pt10">Friends list is empty</div>';	
	},
	
	action_blocked: function() {
		var data = '';
		var listStart = 0; 
		var listStop = 100; 
		if (FJFriends.cache.friends == null) return;
		FJFriends.update_status();
		for(var i = listStart; i < listStop; ++i){
			if(!FJFriends.cache.friends[i])
				break;
			if (FJFriends.cache.friends[i].blocked == 1)
				data += this.printList(FJFriends.cache.friends[i]);	
		}
		this.update_status();
		if (data != '')
		{
			return '<table id="friendsList">'+data+'</table>';
		}
		return '<div class="aCenter pt10">Blocked users list empty</div>';	
	},
	
	action_requests: function() {
		var data = '';
		var listStart = 0; 
		var listStop = 100; 
		if (FJFriends.cache.friends == null) return;  
		FJFriends.update_status();
		for(var i = listStart; i < listStop; ++i) {  
			if(!FJFriends.cache.friends[i])
				break;
			if (FJFriends.cache.friends[i].accept == 0 && FJFriends.cache.friends[i].blocked != 1 )
				data += this.printList(FJFriends.cache.friends[i]);	
		}
		if (data != '')
		{
			return '<table id="friendsList">'+data+'</table>';
		}
		return '<div class="aCenter pt10">Request list is empty</div>';	
	},
			
	getData: function(type) {
		var data = '';
		if (FJ.reg('fr'))
			return;
		var url = '/userbar/friends/';
			FJ.reg('fr', true);
			$.ajax({
				type: 'get',
				url: url, 
				dataType: 'json',
				complete: function(){
					FJ.reg('fr', false);
				},
				success: function(transport) {
					try{
						var newData = transport;
						var friendsData = {data: {actual: 0, all: 0, last: 0,	first: 0, request: 0, blocked: 0, request: 0}};
						if (newData != ''){
							mergeJSONData(friendsData, newData);
							sortJSON(friendsData, 'username', 'ASC');
							sortJSON(friendsData, 'online', 'DESC');
							sortJSON(friendsData, 'accept', 'DESC');
						}
						FJFriends.cache.actual = new Date().getTime();
						FJFriends.cache.friends = friendsData;  
					    $('#friendsListContainer').html(eval('FJFriends.action_'+type+'()'));
						$('#friendsListContainer').removeClass('dialogBlackW8');
						return true;
					}
					catch(e){
						FJ.error(e.message);
						alert(e.message);
						$('#friendsListContainer').removeClass('dialogBlackW8');
					}
				},
				error: function(){
					alert('error failed');
					FJ.error('failed');
					$('#friendsListContainer').removeClass('dialogBlackW8');
				}
			});
			return false;  
	},

	remove: function(friendId, decline, noConfirm, noRequest) {
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJFriends.remove(friendId, decline, noConfirm, noRequest)})
			loginOpen();
			return false;
		}
		if (!friendId){
			dialog.alert('FJFriends.remove() no id given');
			return false;
		}
		if(typeof(noConfirm) == "undefined" && !dialog.confirm('Confirmation', 'Do you want to remove this user from friends?', function(){FJFriends.remove(friendId, decline, noConfirm, noRequest)} ))
			return false;
		$('#friendsListContainer').addClass('dialogBlackW8');
		if (!decline || decline == '')
			var url = '/userbar/removefriend/'+friendId;
		else
			url = '/userbar/declineinvitation/'+friendId;
			
		if (!noRequest) {
			$.ajax({
				type: 'get',
				url: url,		
				success: function(transport) {
					var response = transport || "Request Error";
					var data = response.split('|');
					if (data[0] == 'OK') {
						deleteJSONItem(FJFriends.cache.friends, 'id', friendId);
						FJFriends.tab(FJFriends.current);
						$('#friendsListContainer').removeClass('dialogBlackW8');
						dialog.alert(data[1]);
						FJFriends.update_status(); 
						$('.userRemoveF').addClass('hidden');
						$('.userInviteF').removeClass('hidden'); 
					}
					else{
						$('#friendsListContainer').removeClass('dialogBlackW8');
						dialog.alert(response);
					}
				},
				error: function() {
					$('#friendsListContainer').removeClass('dialogBlackW8');
					dialog.alert('Request Failed :(');
				}
			});
		}
		this.opennIf();
		return false;
	},
	
	 
	
	acceptInvite: function(friendId) {
		if (!dialog.confirm('Confirmation', 'Are you sure, you want to accept invite?', function(){FJFriends.acceptInvite(friendId)}))
			return false;
		$('#friendsListContainer').addClass('dialogBlackW8');
		$.ajax({
			type: 'get',
			url: '/userbar/acceptinvitation/'+friendId,
			success: function(transport) {
				try{
					if (transport) {
						for(var item in FJFriends.cache.friends) { 
							if(FJFriends.cache.friends[item].id == friendId) {
								if (typeof(FJFriends.cache.friends[item].accept) != "undefined") {
									FJFriends.cache.friends[item].accept = 1;
									FJFriends.cache.friends[item].sender = 1;
									FJFriends.cache.friends[item].blocked = 0;
								}
							}
						}
						FJFriends.update_status();
						dialog.alert(transport);
						FJFriends.tab(FJFriends.current);
					}else{
						dialog.alert("Request Error");
					}
					$('#friendsListContainer').removeClass('dialogBlackW8');
				}
				catch(e){
					dialog.alert(e.message);
					$('#friendsListContainer').removeClass('dialogBlackW8');
				}
			},
			error: function() {
				dialog.alert('Request Failed :(');
				$('#friendsListContainer').removeClass('dialogBlackW8');
			}
		});
		this.opennIf();
		return false;
	},
	
	invite: function(friendId, userName){
		if (!loggedIn()){
			FJ.changeCallback('onLoginSuccess', function(){FJFriends.invite(friendId, userName)})
			loginOpen();
			return false;
		}
		
		if (!dialog.confirm('Confirmation', 'Do you want to ask <span class="greenLight">'+ userName +'</span> to be your friend? ', function(){FJFriends.invite(friendId, userName);}))
			return false;
		
		$.ajax({
			type: 'get',
			url: '/userbar/addfriend/'+friendId,
			success: function(response) {
				var data = response.split('|');
				if (data[0] == 'OK'){
					hideElements('fj_notfriend');
					showElements('fj_friend');
					var online = 0;
						var newData = {
							0: {
								id: friendId,
								username: data[1],
								accept: 0,
								online: online
							}
						}
						mergeJSONData(FJFriends.cache.friends, newData);
						FJFriends.update_status()
						FJFriends.opennIf();
					$('.userInviteF').addClass('hidden');
					$('.userRemoveF').removeClass('hidden');
					dialog.alert(userName + ' has been invited to your friends list');
				}
				else
				{
					dialog.alert(response);
				}
			},
			error: function() {
				dialog.alert('Request Failed :(');
			}
		});
		return false; 
	},
	
	unBlock: function(userId, userName, elem) {
		FJBlock.unBlock(userId, userName, elem);
	},
	
	setUserStatus: function(user_id, status) 
	{
		if (user_id==undefined || status == undefined) return;
		for(var user in FJFriends.cache.friends) {
			if (user == 'data')
				continue;
			FJFriends.cache.friends[user].online = status;
		}
		FJFriends.update_status();
		FJFriends.tab(FJFriends.current);
		FJFriends.cache.actual = new Date().getTime(); 
	},
	
	addOnlineUsers: function(data)
	{
		var online = 0;
		for (var _i in data)
			online++;
		FJFriends.changeGlobalOnline(online);
		
		if (data != undefined) {
			for(var user in FJFriends.cache.friends) { 
				FJFriends.cache.friends[user].online = 0; // offline dla wszystkich
			}	
			if (FJFriends.cache.friends != null) {
				for (var i in data) {
					for(var user in FJFriends.cache.friends) {
						if (user == 'data')
						continue;
						if (FJFriends.cache.friends[user].id == data[i].user_id && FJFriends.cache.friends[user].accept == 1 ) {
							FJFriends.cache.friends[user].online = 1;
						}
					}
				}
				FJFriends.update_status();
				FJFriends.tab(FJFriends.current);
				FJFriends.cache.actual = new Date().getTime(); 
			}
		} 
	},
	
	changeGlobalOnline: function(online)
	{
		if (online==undefined) 
			$('#userbarFriendsCount').html(FJFriends.status.online);
		else
			$('#userbarFriendsCount').html(online);
	},
	
	Debug: function() {
		data = '';
		data += "<a onclick='getNewData();'> click </a>";	
		return data;
	},
 
	printList: function(row) {
		data = '';
		data += '<tr>';
			data += '<td class="fListUsr">';
				if (row.online != 0 && row.accept == 1 && row.avatar != '')
					data += '<img class="friendsAvatar" src="'+MEDIA_URL+'/avatars/'+row.avatar+'" style="margin-right: 7px;" />';
				if (row.online != 0 && row.accept == 1)
					data += '<a class="bold" href="/user/'+row.username+'">'+row.username+'</a>';
				else
					data += '<a href="/user/'+row.username+'">'+row.username+'</a>';
			data += '</td>';

			if (FJCHAT_UI)
				var chat = '<td><a onclick="chat.talk('+row.id+', \''+row.username+'\', '+row.online+'); return false;" href="#">IM</a></td>';
			else
				var chat = '';

			if (row.accept == 1 && parseInt(row.online) > 0 ) {
				data += '<td class="uOnline" title="(online)">&nbsp;</td>'+chat;
			}else if(row.blocked != 1 && row.accept == 1) {
				data += '<td class="uOffline" title="(offline)">&nbsp;</td>'+chat;
			}
			data += '<td class="fListPm">';
				if (row.accept == 1)  {
					data += '<a href="#" title="Send message to '+row.username+'" onclick="FJMsg.write('+row.id+', \''+row.username+'\', \'\', \'\', \'\', true); return false;">Send PM</a>';
				}else if (row.sender == 0)
					data += '<a href="#" onclick="FJFriends.acceptInvite('+row.id+'); return false;">Accept invitation</a>';
				else if (row.blocked != 1)
					data += '<span>friend request sent</span>';
			data += '</td>';
			data += '<td class="fListClose">';
				if (row.blocked != 1) 
					data += '<a href="#" onclick="FJFriends.remove('+row.id+'); return false" title="Remove"><img style="border: 0;" src="/site/funnyjunk/images/close.gif" alt="Remove" /></a>';
				else{
					data += '<a href="#" onclick="FJFriends.unBlock('+row.id+', \''+row.username+'\'); return false"><img style="border: 0;" src="/site/funnyjunk/images/close.gif" alt="Remove" /></a>';
				}
			data += '</td>';
			data += '</tr>';
		return data;
	}
}

function friendsTab() {
	if (!loggedIn()){
		FJ.changeCallback('onLoginSuccess', function(){friendsTab()})
		loginOpen();
		return;
	}

	$('#friendsListContainer').remove();
	
	var div1 = $('<div>');
	var tabs = '<a href="#" class="fTab activeTab" id="fTabFriends">Friends (<span id="fFriendsOverall">'+FJFriends.status.friends+'</span>)</a>';
		tabs+= '<a href="#" class="fTab" id="fTabBlocked">Blocked users (<span id="fBlockedUsers">'+FJFriends.status.blocked+'</span>)</a>';
		tabs+= '<a href="#" class="fTab" id="fTabRequests">Friend requests (<span id="fRequestsFriends">'+FJFriends.status.request+'</span>)</a>';
		
	var div = $('<div>').attr({'id' : 'friendsListContainer'}).css('clear', 'both');
	div1.html(tabs).append(div);

	div1.dialog({
		modal		: true,
		bgiframe	: true,
		width		: 510,
		maxWidth	: 510,
		minWidth	: 510,
		height		: 350,
		minHeight	: 300,
		maxHeight	: 800,
		title		: 'Friends',
		position	: ['', html.calcDialogTopPos()],
		resizable	: true,
		close		: html.showFlash,
		open		: html.hideFlash,

		buttons: {
			Close : function() {
				$(this).dialog('close');
			}
		}
	});

	FJFriends.open(div1);
	
	$('a.fTab').click( function(){
		$('a.fTab').removeClass('activeTab');
		$(this).addClass('activeTab');
		var type = $(this).attr('id');
		switch ($(this).attr('id')) {
			case 'fTabFriends': {
				type = 'friends';break;
			}
			case 'fTabBlocked': {
				type = 'blocked';break;
			}
			case 'fTabRequests': {
				type ='requests';break;
			}
		}
		FJFriends.tab(type);
	});
}