var CCommonRenderer = function(base_element) {
   	/*private*/
   	var root = $(base_element);

	var check_action = function(data, action) {
		return ('actions' in data && action in data['actions'] && data['actions'][action] == 1);
	}
   	
   	var create_moderation_panel = function(data) {
   		var root_element = new Element('div');
   		if (check_action(data, 'delete')) {
			var deleteLink = new Element('img', {src: '/img/ui/buttons/delete.png', width: 16, height: 16});
			deleteLink.observe('click', function(evt) { if (confirm('Вы действительно хотите удалить этот комментарий?')) view_instance.remove({id: data['id']}); else evt.stop();});
   			root_element.insert(deleteLink);
   		}

   		return root_element;
   	}
   	
   	var comment_template = function(data) {
   		var root_element = new Element('div', {className: 'forum-comment', id: '_forum_comment-' + data['id']}),
   			reply_link = new Element('a'),
   			moderation_panel = create_moderation_panel(data);
   		if (check_action(data, 'reply') && view_instance.authorizedUser())
   			reply_link.addClassName('key-color-dashed forum-comment-reply').update('ответить').writeAttribute('href', '#');
        root_element.insert(
            new Element('div', {className:'forum-comment-avatar'}).insert(
                new Element('img', {width: 28, height: 28, src: '/img/avatars/' + (data['avatar'] ? data['avatar'] : '/anonymous_big.png') })
            ).insert(moderation_panel)
        ).insert(
            new Element('div', {className:'forum-comment-author'}).insert(
                new Element('a', {href:'#', className:'author'}).update(data['username'])
            ).insert(
                new Element('span', {className:'italic'}).update(data['created'])
            )
        ).insert(
            new Element('div', {className:'forum-comment-text'}).update(data['text'])
        ).insert(
            new Element('div', {className:'forum-comment-replyblock'}).insert(reply_link)
        ).insert(
            new Element('div', {className:'clearfix'})
        );
   		return root_element;
   	}
   	
	var common_template = function(data) {
		var rootElement = new Element('div');
		rootElement.insert(
			new Element('div').insert(
				new Element('h2').update('Обсуждение').insert(
				    new Element('span', {className: 'forum-comment-count'}).update(data['comments_count'])
			    )
			)
		).insert(
			new Element('div', {className: 'bottom'}).insert(
				new Element('ul', {className: 'no-list'})
			)
		);
		return rootElement;
	}
    	
    var reply_form_template = new Template('\
    <div class="clearfix"></div>\
   	<form action="/dynamic.php" method="POST">\
   		<div>\
			<input type="hidden" name="parent_id" value="#{parent_id}" />\
 			<textarea name="text"></textarea>\
 		</div>\
 		<div><input type="submit" value="Отправить" /></div>\
   	</form>');
    	
   	var reply_form = null;
   	var view_instance = null;
   	var root_id = 0;
   	    	
   	var move_reply_form_to = function(element) {
   		element = $(element);
   		if (reply_form) reply_form.remove();
   		var comment_info = {};
   		if (element.readAttribute('id')) comment_info['parent_id'] = element.readAttribute('id').split('-').last()
   		else comment_info['parent_id'] = root_id;
   		reply_form = new Element('div', {className: 'forum-form'});
   		reply_form.innerHTML = reply_form_template.evaluate(comment_info);
   		element.appendChild(reply_form);
   	}
   	
   	var click_handler = function(evt) {
   		var target = $(evt.target);
   		if (target) switch (true) {
   			case target.hasClassName('outerlink'):
   				return true;
   				break;
   			case target.hasClassName('forum-report-spam'):
   				// Ni!Ni!Ni!
   				break;
   			case target.hasClassName('forum-comment-reply'):
   				if (view_instance.authorizedUser()) move_reply_form_to(target.up('div.forum-comment'));
   				break;
   			case target.nodeName == 'INPUT' && target.readAttribute('type') == 'submit':
   				if (reply_form.down('textarea').value.strip().length > 0) {
   					var ajaxLoader = new Element('div').update('Подождите, пожалуйста. Ваш комментарий добавляется...');
   					reply_form.appendChild(ajaxLoader);
   					reply_form.select('input')[1].writeAttribute('disabled',true);
   					view_instance.put(reply_form.down('form').serialize(true), function(data){
   						if (data && data.responseJSON)
   							if (data.responseJSON['approved'] == 1) {
   								ajaxLoader.remove();
   								return true;
   							} else {
	   							ajaxLoader.addClassName('moderatorial').update('Ваш комментарий оставлен на рассмотрение нашему модератору.').fade({duration: 5.0, from: 1, to: 0});
	   							reply_form.down('form').getInputs().invoke('hide');
	   							reply_form.down('textarea').hide();
	   							return false;
   							}
   					});
   				}
   				break;
   		}
		
   		evt.stop();
   		return false;
   	}
    
    var get_comment_wrapper = function(elt) {
    	var elt = $(elt);
    	if (elt.hasClassName('forum-comment')) return elt;
    	else return $(elt.up('div.forum-comment'));
    }
    
    var transform_response = function(data, curParent) {
		var nodes = data.findAll(function(s){ return s['parent_id'] == curParent; }),
			nL = nodes.length,
			result = [];
		for (var i = 0; i < nL; i++) {
			var nextNodes = transform_response(data, nodes[i]['id']);
			result.push(nodes[i]);
			for (var j = 0; j < nextNodes.length; j++) result.push(nextNodes[j]);
		}
		return result;
    }
    
   	/*public*/
   	this.render_comment = function(view, data){
   		view_instance = view;
   		if (data && data.responseJSON && data.responseJSON.length) {
   			var comments = transform_response(data.responseJSON, 0);
   			var cL = comments.length;
   			root_id = comments[0]['id'];
   			root.innerHTML = '';
   			root.appendChild(common_template({comments_count: (cL-1) + ' ' + (cL-1).plural(['комментарий', 'комментария', 'комментариев'])}));
   			var commentsList = root.down('ul.no-list');
   			for (var i = 1; i < cL; i++) {
   				var li = new Element('li', { className: 'forum-comment-level-' + [comments[i]['level'],3].min() });
				//if ('actions' in comments[i] && 'reply' in comments[i]['actions'] && comments[i]['actions']['reply'] == 1) comments[i]['reply_link'] = '<a href="#" class="key-color-dashed forum-comment-reply">ответить</a>';
   				li.appendChild( comment_template(comments[i]) );
   				commentsList.appendChild(li);
   			}
   			if (!view_instance.authorizedUser()) {
   				reply_form_template =  new Template('Войдите или <a class="outerlink" href="/rus/profile.phtml">зарегистрируйтесь</a>, чтобы иметь возможность комментировать.');
   			}
   			move_reply_form_to(root.down('div.bottom'));
			var fixBlock = $('iefix');
    		if (fixBlock) fixBlock.setStyle({display: 'block'});
   		}
   	}
    	
   	root.observe('click', click_handler);
}
