var userInfo = {
	prevData: '',
	edit: function(which) {
		deactivateEditors();
		var container = $(which).up('dd');
		tinyMCEid = container.readAttribute('code');
		container.addClassName('editmode');
		container.insert({top: '<img src="/i/new/profile/i-editModeOut.gif" class="btn" width="7" height="6" alt="Закрыть" />'});
		
		container.down('.btn').observe('click', userInfo.outEditMode.bindAsEventListener(userInfo, 'close'));
		var editLink = container.down('span.edit').innerHTML;
		container.down('span.edit').remove();
		
		var textBlock = container.down('.text');
		userInfo.prevData = textBlock.innerHTML;
		textBlock.update('<form><textarea name="body" id="' + tinyMCEid + '" cols="50" rows="20">' + userInfo.prevData.escapeHTML() + '</textarea><div class="button"><span><input type="button" value="Сохранить" /></span></div></form>');
		textBlock.down('input').observe('click', userInfo.outEditMode.bindAsEventListener(userInfo, 'save'));
		activateEditor(tinyMCEid);
	},
	outEditMode: function(e, type) {
		var element = $(Event.element(e));
	
		var container = $(element).up('dd');
		
		container.removeClassName('editmode');
		container.down('.btn').remove();
	
		var ed = tinyMCE.get(tinyMCEid);
		var text = ed.getContent();
		tinyMCE.execCommand('mceRemoveControl', false, tinyMCEid);
		var textBlock = container.down('.text');
		textBlock.down('textarea').remove();
		textBlock.down('.button').remove();
		if(type == 'close') {
			if (userInfo.prevData.blank()) {
				textBlock.update('<span class="edit">[&nbsp;<a href="#" class="do" onclick="userInfo.edit(this); return false;">Редактировать</a>&nbsp;]</span>');
			} else {
				textBlock.update(userInfo.prevData.replace(/<\/(\w+)>\s*$/i, '<span class="edit">[&nbsp;<a href="#" class="do" onclick="userInfo.edit(this); return false;">Редактировать</a>&nbsp;]</span></$1>'));
			}	
			userInfo.prevData = '';
		} else {
			var post  = {code: container.readAttribute('code'), body: text};
			new Ajax.Request('/webservices/saveaboutcontent/', {
				method: 'post',
				postBody: $H(post).toQueryString(),
				onComplete: function(response) {
					var data = response.responseText.evalJSON();
					if(data.status != 'error') {
						if (data.text.match(/<\/li>(?:\s|[&nbsp;])*<\/(\w+)>(?:\s|[&nbsp;])*$/i)) {
							data.text = data.text.replace(/<\/li>(?:\s|[&nbsp;])*<\/(\w+)>(?:\s|[&nbsp;])*$/i, '&nbsp;<span class="edit">[&nbsp;<a href="#" class="do" onclick="userInfo.edit(this); return false;">Редактировать</a>&nbsp;]</span></li></$2>');
						} else if( data.text != '' ) {		
							data.text = data.text.replace(/<\/p>$/i, '&nbsp;<span class="edit">[&nbsp;<a href="#" class="do" onclick="userInfo.edit(this); return false;">Редактировать</a>&nbsp;]</span></p>');
						} else {
							data.text = '<span class="edit">[&nbsp;<a href="#" class="do" onclick="userInfo.edit(this); return false;">Редактировать</a>&nbsp;]</span>';
						}	
						textBlock.update(data.text);
					} else {
						textBlock.update(userInfo.prevData);
						userInfo.prevData = '';
					}
				}
			});
		}
	}
};
var activeEditors = new Array();

function activateEditor(id) {
    activeEditors[activeEditors.length] = id;
    toggleEditor(id);
}

function deactivateEditors() {
    for(x=0;x<activeEditors.length;x++) {
        toggleEditor(activeEditors[x]);
    }
    activeEditors.length = 0;
}
function toggleEditor(id) {
    var elm = document.getElementById(id);

    if (tinyMCE.getInstanceById(id) == null)
        tinyMCE.execCommand('mceAddControl', false, id);
    else if (Object.isElement(elm)) {
    	var container = $(elm).up('dd');
		container.removeClassName('editmode');
		container.down('.btn').remove();
		
		var ed = tinyMCE.get(tinyMCEid);
		var text = ed.getContent();
		var textBlock = container.down('.text');
		tinyMCE.execCommand('mceRemoveControl', false, id);
		textBlock.down('textarea').remove();
		textBlock.down('.button').remove();
		if (userInfo.prevData.blank()) {
				textBlock.update('<span class="edit">[&nbsp;<a href="#" class="do" onclick="userInfo.edit(this); return false;">Редактировать</a>&nbsp;]</span>');
			} else {
				textBlock.update(userInfo.prevData.replace(/<\/(\w+)>\s*$/i, '<span class="edit">[&nbsp;<a href="#" class="do" onclick="userInfo.edit(this); return false;">Редактировать</a>&nbsp;]</span></$1>'));
			}	
		userInfo.prevData = '';
    }    
}
var previewBlogEntry = {
	show: function(element, post, body) {
		element = $(element);
		if(element) {
			//var h = element.getHeight();
			post = post.toQueryParams();

			body = body.replace(/<!--(.|\s)*?-->/img, '');
			body = body.replace(/&lt;!--(.|\s)*?--&gt;/img, '');

			post.body = body;

			new Ajax.Request("/webservices/preview/", {
				method: "post",
				postBody: $H(post).toQueryString(),
				onComplete: function(response) {
					var data = response.responseText.evalJSON();
					var container = element.up('.addBlogEntry');
					var ctrlBlock = element.next('.entryControls');
					if(data.status != "error") {
						container.addClassName('preview');
						element.insert({before: '<div class="previewContent">' + data.html + '</div>'});
						ctrlBlock.down('.buttonsBlock').insert({bottom: '<a class="button cancelButton" href="javascript:;" onclick="previewBlogEntry.hide(\'' + element.id + '\'); return false;"><span>Отменить</span></a>'});
					}
				}
			});
		}
	},
	hide: function(element) {
		element = $(element);
		if(element) {
			var preview = element.previous();
			var container = element.up('.addBlogEntry');
			var ctrlBlock = element.next('.entryControls');
			container.removeClassName('preview');
			preview.remove();
			$('blogEntryForm').select('.row').invoke('show');
			ctrlBlock.down('.buttonsBlock').down('.cancelButton').remove();
		}
	}
};

var profile = {
	form: '<div class="add" id="addNew_#{code}_#{id}"><div class="btn"></div><form method="post" style="display: none;">'
		+ '<input type="hidden" name="code" value="#{code}" /><input type="hidden" name="id" value="#{id}" /><div class="message">'
		+ '<span class="close"></span><div class="border">'
		+ '	<strong>'
		+ '		<input type="text" value="" size="20" id="name_#{code}_#{id}" name="name"/>'
		+ '	</strong></div>'
		+ '	<div class="border line">'
		+ '		<p>'
		+ '			<textarea rows="10" id="descr_#{code}_#{id}" name="descr"></textarea>'
		+ '		</p>'
		+ '		<div class="message-buttons with-clear">'
		+ '			<div class="button update" onmouseover="profile.over(this);" onmouseout="profile.out(this);"'
		+ '				onclick="profile.add(this);"	'
		+ '			>'
		+ '				<span>Добавить</span>'
		+ '			</div>'
		+ '		</div>'
		+ '	</div>'
		+ '</div></form></div>',
	formDD: '<form method="post" class="add" style="display: none;" id="form_#{code}_#{id}">'
		+ '<input type="hidden" name="copy" value="#{description}" /><input type="hidden" name="code" value="#{code}" /><input type="hidden" name="id" value="#{id}" /><div class="message">'
		+ '<span class="close"></span>'
		+ '	<div class="border">'
		+ '		<p>'
		+ '			<textarea rows="10" id="descr_#{code}_#{id}" name="descr">#{description}</textarea>'
		+ '		</p>#{source}'
		+ '		<div class="message-buttons with-clear">'
		+ '			<div class="button update#{correctClass}" onmouseover="profile.over(this);" onmouseout="profile.out(this);"'
		+ '				onclick="profile.save(this);"	'
		+ '			>'
		+ '				<span>Сохранить</span>'
		+ '			</div>#{deleteButton}'
		+ '		</div>'
		+ '	</div>'
		+ '</div></form>',
	formDT: '<form method="post" class="add" style="display: none;">'
		+ '<input type="hidden" name="copy" value="#{description}" /><input type="hidden" name="code" value="#{code}" /><input type="hidden" name="id" value="#{id}" /><div class="message">'
		+ '<span class="close"></span><div class="border">'
		+ '	<strong>'
		+ '		<input type="text" value="#{description}" size="20" id="name_#{code}_#{id}" name="name"/>'
		+ '	</strong></div>'
		+ '	<div class="border line">'
		+ '		<p>'
		+ '			<textarea rows="10" id="descr_#{code}_#{id}" name="descr"></textarea>'
		+ '		</p>'
		+ '		<div class="message-buttons with-clear">'
		+ '			<div class="button update#{correctClass}" onmouseover="profile.over(this);" onmouseout="profile.out(this);"'
		+ '				onclick="profile.save(this);"	'
		+ '			>'
		+ '				<span>Сохранить</span>'
		+ '			</div>#{deleteButton}'
		+ '		</div>'
		+ '	</div>'
		+ '</div></form>',
	btnRemove: '<div class="message-buttons delete-buttons with-clear">'
		+'	<div parent_id="#{parentId}" class="button">'
		+'		<span>удалить</span>'
		+'	</div>'
		+'</div>',
	btnAdd: '<div class="message-buttons add-buttons with-clear">'
		+'	<div parent_id="#{parentId}" class="button">'
		+'		<span>добавить</span>'
		+'	</div>'
		+'</div>',
	deleteButton: '<div class="button delete" onmouseover="profile.over(this);" onmouseout="profile.out(this);">'
		+ '		<span>Удалить</span>'
		+ '	</div>',	
	over: function(el) {
		if($(el).hasClassName('button'))
			$(el).addClassName('button-active');
	},
	out: function(el) {
		$(el).removeClassName('button-active');
	},
	sourceTimeout: null,
	sourceTimeoutHide: null,
	sourceOver: function(which, id) {
		var el = $("sourcePopup_" + id);
		var container = $(which).cumulativeOffset();
		if(el) {
			//if(profile.sourceTimeoutHide) clearTimeout(profile.sourceTimeoutHide);
			profile.sourceTimeout = setTimeout(function() {profile.showSourcePopup(container, el);}, 1000);
		}
	},
	sourceOut: function(id) {
		var el = $("sourcePopup_" + id);
		if(el) {
			if(profile.sourceTimeout) clearTimeout(profile.sourceTimeout);
			profile.sourceTimeoutHide = setTimeout(function() {profile.hideSourcePopup(el);}, 1000);
		}
	},
	showSourcePopup: function(container, element) {
		element.setStyle({left: (container.left + 107) + "px", top: (container.top - element.getHeight() + 21) + "px"});
		element.show();
		element.observe("mouseover", function() {if(profile.sourceTimeoutHide) clearTimeout(profile.sourceTimeoutHide);});
		element.observe("mouseout", function() {profile.sourceTimeoutHide = setTimeout(function() {profile.hideSourcePopup(element);}, 1000);});
	},
	hideSourcePopup: function(element) {
		if(profile.sourceTimeoutHide) clearTimeout(profile.sourceTimeoutHide);
		element.hide();
	},
	toggle: function(el) {
		$(el).up('.subjItem').toggleClassName('short');
	},
	onMouseOver: function(e) {
		var element = $(Event.element(e));
		element = element.hasClassName("bc") ? element : element.up(".bc");
		element.addClassName("selected");
	},
	onMouseOut: function(e) {
		var element = $(Event.element(e));
		element = element.hasClassName("bc") ? element : element.up(".bc");
		element.removeClassName("selected");
	},
	startBlockObserve: function(el) {
		el.observe("mouseover", profile.onMouseOver);
		el.observe("mouseout", profile.onMouseOut);
		el.observe("click", profile.onEditData);
	},
	stopBlockObserve: function(el) {
		el.stopObserving("mouseover", profile.onMouseOver);
		el.stopObserving("mouseout", profile.onMouseOut);
		el.stopObserving("click", profile.onEditData);
	},
	editblock: function(el) {
		var container = $(el).up(".subjItem");
		var header = container.down("h1");
		
		if(header.hasClassName("active")) {
			header.removeClassName("active");
			header.down("a").update("Редактировать");
			
			container.select("dt").each( function(n) {
				var parentId = n.readAttribute("parent_id");
				var code = n.readAttribute("code");
				
				if(n.down(".close")) {
					n.down(".close").fire("form:close");
				}
				
				var el = $("addNew_" + code + "_" + parentId);
				if(el) {
					el.remove();
				}
				
				if(parentId > 0) {
					n.removeClassName("bc");
					profile.stopBlockObserve(n);
				} else {
					n.hide();
				}
			});
			
			container.select("dd").each( function(n) {
				if(n.down(".close")) {
					n.down(".close").fire("form:close");
				}
				n.removeClassName("bc");
				profile.stopBlockObserve(n);
			});
		} else {
			container.removeClassName("short");
			header.addClassName("active");
			header.down("a").update("Выйти из режима редактирования");
			
			container.select("dt").each( function(n) {
				profile.setupElementDT(n); 
				n.show();   
			});
			
			container.select("dd").each( function(n) {
				profile.setupElementDD(n);	
			});
		}
	},
	setupElementDT: function(n) {
		var parentId = n.readAttribute("parent_id");
		var code = n.readAttribute("code");
		
		if(!["birthdate", "birthplace"].include(code.toLowerCase())) {
			Element.insert(n, {before: profile.form.interpolate({id: parentId, code: code, description: ""})});
			var el = $("addNew_" + code + "_" + parentId);
			el.down(".btn").observe("click", profile.displayNewForm);
		}
		 
		if(parentId > 0) {
			n.addClassName("bc");
			profile.startBlockObserve(n);
		}
	},
	setupElementDD: function(n) {
		n.addClassName("bc");
		profile.startBlockObserve(n);
	},
	onEditData: function(e) {
		var element = $(Event.element(e));
		element = element.hasClassName("bc") ? element : element.up(".bc");
		
		var parentId = element.readAttribute("parent_id");
		var code = element.readAttribute("code");
		var isPersonal = element.readAttribute("personal") ? element.readAttribute("personal") == 1 : false;
		
		var formTemplate = (element.tagName.toLowerCase() == "dt" && (!element.next() || (element.next() && element.next().tagName.toLowerCase() != "dd"))) ? profile.formDT : profile.formDD;
		var source = "";
		
		if(element.down(".source")) {
			source = element.down(".source").innerHTML.strip().substring(2);
			element.down(".source").remove();
		}
		var description = element.innerHTML.strip().escapeHTML();
		element.update(formTemplate.interpolate({
			id: parentId, 
			code: code, 
			description: description, 
			source: !source.empty() ? '<div class="source">Источник: ' + source + '&nbsp;&nbsp;&nbsp;<img src="/i/profile_close_btn.gif" width="13" height="12" alt="" border="0" /></div>' : "",
			deleteButton: isPersonal ? profile.deleteButton : "",
			correctClass: isPersonal ? " thin" : ""
		}));
		
		element.removeClassName("selected");
		profile.stopBlockObserve(element);
		
		element.down(".close").observe("click", profile.onFormClose);
		element.down(".close").observe("form:close", profile.onFormClose);
		
		var deleteBtn = element.down(".delete");
		if(deleteBtn) {
			deleteBtn.observe("click", confirmation.confirm.bindAsEventListener(confirmation, profile.remove.bind(profile, deleteBtn, (code == "quotation" ? false : true)), (code == "quotation" ? "deleteQuotationMessage" : "deleteAllMessage")));
		}
		
		var closeBtn = element.down(".source img");
		if(closeBtn) {
			closeBtn.observe("click", confirmation.confirm.bindAsEventListener(confirmation, profile.removeProfileQuotation.bind(profile, closeBtn, parentId), "deleteSourceMessage"));
		}
		
		element.down("form").show();
	},
	onFormClose: function(e) {
		Event.stop(e);
		var element = Event.element(e);
		var form = $(element).up("form");
		var description = "";
		var source = "";
		
		if(form.down("input[name = 'name']")) {
			description = form.down("input[name = 'copy']") ? form.down("input[name = 'copy']").value : form.down("input[name = 'name']").value;
		} else {
			description = form.down("input[name = 'copy']") ? form.down("input[name = 'copy']").value : form.down("textarea").value;
			source = form.down(".source") ? '<i class="source">' + form.down(".source").innerHTML.stripTags().replace("Источник:", "/") + '</i>' : "";
		}
		var container = form.up(".bc");
		
		container.update((description + source).stripScripts());
		profile.startBlockObserve(container);
	},
	removeProfileQuotation: function(btn, id) {
		var post = $(btn).up("form").serialize();
		 
		new Ajax.Request("/webservices/removeprofilequotationsource/", {
			method: "post",
			postBody: post,
			onComplete: function(response) {
				var data = response.responseText.evalJSON();
				
				if(data.status != "error") {
					var container = $("form_quotation_" + id).down(".source");
					if(container) {
						$(container).remove();
					}
				}	  
			}
		}); 
	},
	save: function(el) {
		var form = $(el).up("form");
		var post = form.serialize();
		var d = post.toQueryParams();
		var cond = d.name ? !d.name.blank() : !d.descr.blank();	  
		
		if(cond) {		
			new Ajax.Request("/webservices/saveprofiledata/", {
				method: "post",
				postBody: post,
				onComplete: function(response) {
					var data = response.responseText.evalJSON();
					if(data.status != "error") {
						if(data.quotation > 0) {
							var container = form.up(".bc");
							
							Element.insert($(container), {after: '<dd parent_id="' + data.quotation + '" code="quotation">' + d.descr.stripScripts() + "</dd>"});
							profile.setupElementDD($(container).next("dd"));	
						}
						form.down("input[name = 'copy']").remove();
						form.down(".close").fire("form:close");
					}	  
				}
			});
		}
	},
	displayNewForm: function(e) {
		var element = Event.element(e);
		var form = element.next("form");
		
		element.up(".add").addClassName("newForm");
		form.down(".close").observe("click", profile.hideNewForm);
		form.down(".close").observe("form:close", profile.hideNewForm);
		
		form.down("textarea").value = "";
		form.down("input[type = 'text']").value = "";
		
		element.toggle();
		form.toggle();
	},
	hideNewForm: function(e) {
		var element = $(Event.element(e)).up(".add").down(".btn");
		var form = element.next("form");
		
		element.up(".add").removeClassName("newForm");
		form.down(".close").stopObserving("click", profile.hideNewForm);
		form.down(".close").stopObserving("form:close", profile.hideNewForm);
		form.toggle();
		element.toggle();
	},
	add: function(el) {
		var form = $(el).up("form");
		var post = form.serialize();
		var d = post.toQueryParams();
		var cond = d.name ? !d.name.blank() : !d.descr.blank();
		 
		if(cond) {
			//form.getInputs().invoke("disable");
			
			new Ajax.Request("/webservices/addprofiledata/", {
				method: "post",
				postBody: post,
				onComplete: function(response) {
					var data = response.responseText.evalJSON();
					if(data.status != "error") {
						var container = $(el).up(".add");
						//$(container).hide();
						form.down(".close").fire("form:close");

						Element.insert($(container), {before: '<dt parent_id="' + data.id + '" code="' + data.code + '" personal="1">' + d.name.stripScripts() + "</dt>" + (!d.descr.empty() ? '<dd parent_id="' + data.quotation + '" code="quotation" personal="1">' + d.descr.stripScripts() +  "</dd>" : "")});
						
						profile.setupElementDT($(container).previous("dt"));
						if($(container).previous("dd")) {
							profile.setupElementDD($(container).previous("dd"));
						}
						
						/* When we are insert data */
						var dtElement = $(container).next("dt");
						if(dtElement) {
							var parent_id = dtElement.readAttribute("parent_id");
							if(parent_id == 0) {
								dtElement.remove();
								container.remove();	
							}
						}
						
						//form.getInputs().invoke("enable");
					}   
				}
			});
		}
	},
	remove: function(el, all) {		
		var form = $(el).up("form");
		var post = form.serialize();
			   
		new Ajax.Request("/webservices/removeprofiledata/", {
			method: "post",
			postBody: post,
			onComplete: function(response) {
				var data = response.responseText.evalJSON();
				if(data.status != "error") {
					var toRemove = $(form).up(".bc");
					var container = $(toRemove).up("dl");
					if(all) {
						var toRemove2 = $(toRemove).next();
						if(toRemove2 && toRemove2.tagName.toLowerCase() == "dd") {
							toRemove2.remove();	
						}
						var id = toRemove.readAttribute("parent_id");
						var code = toRemove.readAttribute("code");
						var addFormName = $("addNew_" + code + "_" + id);
						
						if(addFormName) {
							addFormName.remove();	
						}
					}
					toRemove.remove();
					if(container.select("dt").size() == 0) {
						Element.insert(container, {top: '<dt parent_id="0" code="' + code + '"></dt>'});
						container.select("dt").each( function(n) {
							profile.setupElementDT(n);	
						});
					}
				}
			}
		});
	},
	fieldsHide: function(suffix) {
		$('descr' + suffix).disable();
		if($('source' + suffix)) {
			$('source' + suffix).disable();
		}
	},
	fieldsShow: function(suffix) {
		$('descr' + suffix).enable(); 
		if($('source' + suffix)) {
			$('source' + suffix).enable();
		} 
	},
	observeDeleteFriendBtn: function(type) {
		$("friendList").select('.controll[parent_id]').each(function(element) {
			element.observe('click', profile.manageFriend);
			element.observe('confirmed:true', profile.manageFriend.bindAsEventListener(element, true));
		});
	},
	markAsConfirmed: function(element, type) {
		element = $(element);
		element.fire('confirmed:true');
	},
	updateInFoldersCount: function (data) {
		if($("folderLentaCount")) {
			$("folderLentaCount").update(data.lenta);
		}
		if($("folderHasCount")) {
			$("folderHasCount").update(data.has);
		}
		if($("folderInCount")) {
			$("folderInCount").update(data.inf);
		}
		if($("folderAllCount")) {
			$("folderAllCount").update(data.all);
		}
	}
}


/* Add friend online */
iFriend = Class.create({
	initialize: function(element, id, name) {
		this.element = element = $(element);
		this.id = id;
		this.name = name;
		
		var link = element.down('.addToFriends a');
		if(link) {
			link.observe('click', this._onLinkClick.bindAsEventListener(this));
		}
	},
	_onLinkClick: function(e) {
		Event.stop(e);
		
		var el = Event.element(e);
		var url = '';
		var d, t;
		
		if(el.name == 'add') {
			url = 'addfriend/id/' + this.id;
			d = {name: 'del', text: (el.hasClassName('hasCase') ? 'Удалите ' : 'Удалить ') + this.name + ' из друзей'};
			
			this._send(el, url, d);
		} else {
			url = 'removefriend/id/' + this.id;
			d = {name: 'add', text: el.hasClassName('hasCase') ? 'Добавьте ' + this.name + ' к друзьям' : 'Добавить в друзья'};
			
			if(el.hasClassName('isSubscriber')) {
				confirmation.confirm(e, this._send.bind(this, el, url, d), 'deleteFriendMessageSubscriber');
			} else {
				confirmation.confirm(e, this._send.bind(this, el, url, d), 'deleteFriendMessage');
			}
		}
	},
	_send: function(el, url, d) {
		new Ajax.Request("/webservices/" + url, {
			onComplete: function(response) {
				var data = response.responseText.evalJSON();
				if(data.status != "error") {
					el.name = d.name;
					el.update(d.text);
					profile.updateInFoldersCount(data);
				} 
			}
		});
	}
});
var MessageThread = Class.create({
	initialize: function(reply, destroy, id, folder) {
		this.id = id;
		this.replyElements = reply;
		this.destroyElements = destroy;
		this.folder = folder;
		
		destroy.invoke('observe', 'click', this.destroy.bindAsEventListener(this));
		
		this.form = $('mtForm' + id);
		if (Object.isElement(this.form)) {
			reply.invoke('observe', 'click', this.reply.bindAsEventListener(this));
		}
	},
	destroy: function(e) {
		Event.stop(e);
		
		var element = Event.element(e);
		
		if (!element.hasClassName('button')) {
			element = element.up('.button');
		}
		
		if (element.hasClassName('disabled')) {
			return;
		}
		
		element.addClassName('disabled');
		
		var ident = /mtDestroy(\d+)_(\d+)_(\d+)/.exec(element.id);
		
		new Ajax.Request('/webservices/mt-destroy', {
			element: element,
			parameters: {id: ident[2], folder: this.folder},
			onComplete: this.destroyComplete.bindAsEventListener(this)
		});
	},
	destroyComplete: function(response) {
		var json = response.responseJSON;
		if (Object.isUndefined(json.error)) {
			window.location.reload();
		} else {
			response.options.element.removeClassName('disabled');
		}
	},
	reply: function(e) {
		Event.stop(e);
		
		var element = Event.element(e);
		
		if (!element.hasClassName('button')) {
			element = element.up('.button');
		}
		var ident = /mtReply(\d+)_(\d+)_(\d+)/.exec(element.id);
		
		this.form.show().down('input[name=message_id]').value = ident[2];
		this.form.down('input[name=person_id]').value = ident[3];
		this.replyElements.each(function(element) {
			element.down('span').update('Ответить');
		});
		element.down('span').update('Отправить').up('.control').insert({before: this.form});
		
		if (element.hasClassName('disabled') || this.form.down('textarea').getValue().blank()) {
			return;
		}
		
		element.addClassName('disabled');
		
		new Ajax.Request('/webservices/mt-reply', {
			element: element,
			parameters: this.form.serialize(true),
			onComplete: this.replyComplete.bindAsEventListener(this)
		});
		
	},
	replyComplete: function(response) {
		var json = response.responseJSON;
		if (Object.isUndefined(json.error)) {
			window.location.reload();
		} else {
			response.options.element.removeClassName('disabled');
		}
	}
});
var MessageThreads = Class.create({
	initialize: function(destroy) {
		destroy.invoke('observe', 'click', this.destroy.bindAsEventListener(this));
	},
	destroy: function(e) {
		Event.stop(e);
		var element = Event.element(e);
		var ident = /mtDestroyThread(\d+)/.exec(element.id);
		new Ajax.Request('/webservices/mt-destroy-thread', {
			parameters: {id: ident[1]},
			onComplete: this.destroyComplete.bindAsEventListener(this)
		});
	},
	destroyComplete: function(response) {
		var json = response.responseJSON;
		if (Object.isUndefined(json.error)) {
			window.location.reload();
		}
	}
});

var FriendsManagement = Class.create({
	initialize: function(friendList, folderList, type) {
		if (!Object.isArray(friendList) || $A(friendList).size() == 0)
			return;
		this.friendList = $A(friendList);
		
		if (Object.isArray(folderList) && $A(folderList).size() > 0)
			this.folderList = $A(folderList).findAll(function(n) {return !Object.isUndefined(n.down('b'))});
		
		this.type = type;
		
		var self = this;
		this.friendList.each(function(element) {
			var controll = element.down('.status');
			if (Object.isUndefined(controll))
				return;
			
			controll.observe('click', self.manageFriend.bindAsEventListener(self));
			controll.observe('confirmed:true', self.manageFriend.bindAsEventListener(self, true));
		});
	},
	markAsConfirmed: function(element) {
		element = $(element);
		element.fire('confirmed:true');
	},
	manageFriend: function(e, confirmed) {
		Event.stop(e);
		var element = Event.element(e);
		var container = element.up('li');
		
		var personId = parseInt(element.up('li').readAttribute('id').replace('friend', '') || 0, 10);
		if (personId < 1)
			return;
		
		var action = container.hasClassName('isFriend') ? 'delete' : 'add';
		var isSubscriber = container.hasClassName('isSubscriber');
		
		var confirmed = confirmed || false;
		
		if (action == 'delete' && !confirmed) {
			if (isSubscriber) {
				confirmation.confirm(e, this.markAsConfirmed.bind(this, element), 'deleteFriendMessageSubscriber');
			} else {
				confirmation.confirm(e, this.markAsConfirmed.bind(this, element), 'deleteFriendMessage');
			}
			return;
		}
		
		new Ajax.Request('/webservices/managefriend/act/' + action + '/id/' + personId, {
			method: 'get',
			onComplete: this.onManageFriendComplete.bindAsEventListener(this, action, element, container)
		});
	},
	onManageFriendComplete: function(request, action, element, container) {
		var data = request.responseText.evalJSON();
		
		if (!data.error) {
			if (action == 'delete') {
				if (this.type != 'has') {
					container.removeClassName('isFriend');
					element.writeAttribute('title', 'Добавить в друзья');
				}
			} else {
				container.addClassName('isFriend');
				element.writeAttribute('title', 'Удалить из друзей');
			}
			
			if (this.type == 'has')
				window.location.reload();
			
			this.updateFolderCount(data.folderCount);
		}
	},
	updateFolderCount: function(data) {
		data = $H(data);
		this.folderList.each(function(element) {
			var type = element.readAttribute('rel');
			
			if (!type || Object.isUndefined(element.down('b')))
				return;
			
			element.down('b').update(data.get(type));
		});
	}
});

var Invitation = Class.create({
	initialize: function(inviteList) {
		this.inviteList = $(inviteList);
		
		if (!this.inviteList) return;
		
		this.inviteList = this.inviteList.select('.item');
		
		if (this.inviteList.size() < 1) return;
		
		this.sendForm = this.inviteList.find(function(n) {return n.hasClassName('sendInvite')});
		
		this.form = this.sendForm.down('form');
		this.form.observe('submit', this.sendInvite.bindAsEventListener(this));
		this.form.down('input[type=button]').observe('click', function(e) {
			Event.stop(e);
			var form = Event.element(e).up('form');
			form.reset();
			form.up('.item').hide().previous('.item').show();
		});
		
		this.inviteList.findAll(function(n) {
			n.select('.options a.toUpdate', '.options a.toOther').invoke('observe', 'click', this.showSendForm.bindAsEventListener(this));
			return !Object.isUndefined(n.down('h3:not([class~=inactive])'));
		}, this).invoke('observe', 'click', this.showSendForm.bindAsEventListener(this));
	},
	showSendForm: function(e) {
		Event.stop(e);
		var element = Event.element(e);
		this.inviteList./*findAll(function(n) { return !Object.isUndefined(n.down('h3:not([class~=inactive])')) }).*/invoke('show');
		element.up('.item').hide().insert({after: this.sendForm});
		this.sendForm.down('form').reset();
		
		if (element.tagName == 'A') {
			var matches = /^#pid:(\d+);(other|update)?$/i.exec(element.readAttribute('href'));
			if (matches != null) {
				var pid = this.form.down('input[name=pid]');
				if (Object.isUndefined(pid)) {
					pid = this.form.insert({top: new Element('input', {type: 'hidden', name: 'pid'})}).down('input[name=pid]');
				}
				pid.writeAttribute('value', matches[1]);
				
				var act = this.form.down('input[name=act]');
				if (Object.isUndefined(act)) {
					act = this.form.insert({top: new Element('input', {type: 'hidden', name: 'act'})}).down('input[name=act]');
				}
				act.writeAttribute('value', matches[2]);
				
				if (matches[2] == 'update') {
					var name = /^(.*)<br>(.*)$/i.exec(element.up('.item').down('h2.inactive strong').innerHTML);
					name[3] = element.up('.item').down('h2.inactive i').innerHTML;
                    name[4] = element.up('.item').down('h2.inactive em').innerHTML;
					name[5] = element.up('.item').down('h2.inactive b').innerHTML;
					this.form.down('input[name=first_name]').value = name[1].strip();
					this.form.down('input[name=last_name]').value = name[2].strip();
					this.form.down('input[name=email]').value = name[3];
					this.form.down('input[name=reemail]').value = name[3];
					this.form.down("input[name=sex][value="+name[5]+"]").checked = true;
					this.form.down('textarea[name=message]').value = name[4];
				}
			} else {
				this.form.select('input[name=pid]', 'input[name=act]').invoke('remove');
			}
		} else {
			this.form.select('input[name=pid]', 'input[name=act]').invoke('remove');
		}
		this.sendForm.show();
	},
	sendInvite: function(e) {
		Event.stop(e);
		var element = Event.element(e);
		element.down('input[type=submit]').writeAttribute('disabled', 'disabled').addClassName('disabled');
		element.writeAttribute('action', '/webservices/sendinvitation').request({
			onComplete: this.onSendInviteComplete.bindAsEventListener(this)
		})
	},
	onSendInviteComplete: function(request) {
		var data = request.responseText.evalJSON();
		if (!data.error) {
			window.location = '/profile/invite';
		} else {
			var formError = $H(data.form_error);
			this.form.select('.field').each(function(element) {
				var inputName = element.down('input').readAttribute('name');
				var error = formError.get(inputName);
				if (!Object.isUndefined(error)) {
					var errorText = 'Не заполнено поле';
					if (error == 2) {
						errorText = 'Неправильный e-mail адрес';
					} else if (error == 3) {
						errorText = 'Повторите e-mail';
					}
					element.down('.error').update(errorText).show();
				} else {
					element.down('.error').hide();
				}
			});
			this.form.down('input[type=submit]').writeAttribute('disabled', null).removeClassName('disabled');
		}
	}
});

var BlogTargetOption = Class.create({
	blogsList: '',
	_blogTypeS: '',
	_blogIdS: '',
	initialize: function() {
		this._blogTypeS = $('blogType');
		this._blogIdS = $('blogId');

		this._blogTypeS.observe('change', this.change.bindAsEventListener(this));
	},
	change: function(defBlogId){

		defBlogId = defBlogId || 0;

		var blogType = this._blogTypeS.getValue();

		this._blogIdS.childElements().invoke('remove');

		if(blogType != 14){
			this._blogIdS.insert({bottom: new Element('option', {value: ''})});
			for (var blog in this.blogsList[blogType]) {
				this._blogIdS.insert({bottom: new Element('option', {value: blog, selected: (blog == defBlogId)}).update(this.blogsList[blogType][blog].name)});
			}
			this._blogIdS.enable();
		}
		else{
			this._blogIdS.disable();
		}
	}
});