var Comment = {
	commentData : null,
	commentCount: 0,
	emailRegex : /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/,

	index : function(article){
		this.article = article;
		var url = '/comment/index?article_id=' + article.id + '&sort_order=' + article.comment_order;
		if(article.comment_page != null){
			url += '&page=' + article.comment_page
		}
		$.ajax({url: url, context: document.body, success: function(data){ 
				var commentData = eval('(' + data + ')');
				Comment.commentData = commentData;
				Comment.displayComments();
			}
		});
	},

	displayComments : function(){
		var comments = this.commentData.comments;
		this.commentCount = comments.length;
		var pagination = this.commentData.pagination;

		// comment-header
		var commentHeader = $('#comment-header');
		html = "";
		html += '<h3 id="comment-count">' + pagination.count + ' Comments</h3>';
		html += '<ul class="sortOptions inlineList">';
		html += '<li>SORT BY: </li>';
		
		var newestClass = (this.article.comment_order == 'newest') ? 'selectedSortMode' : '';
		html += '<li><a href="' + this.article.uri + '?comment_order=newest#article-comments" class="' + newestClass  +'">NEWEST</a></li>';

		var oldestClass = (this.article.comment_order == 'oldest') ? 'selectedSortMode' : '';
		html += '<li><a href="' + this.article.uri + '?comment_order=oldest#article-comments" class="' + oldestClass  +'">OLDEST</a></li>';
		html += '</ul>';
		$('#comment-header').append(html);
		
		// articleComments
		for(var i=0, l=comments.length; i<l; ++i){
			var comment = comments[i];
			var html = '';
			var containerClass = (i % 2 == 0) ? 'evenComment' : 'oddComment';
			html += '<div class="comment ' + containerClass  +'">';
			html += '<p>' + comment.comment + '</p>';
			html += '<p class="postDate">Posted by '+ comment.name +', ' + comment.display_date + '</p>';
			html += '</div>';
			$('#articleComments').append(html);
		}

		// pagination
		if(pagination.pageCount > 1){
			var commentPagination = $('#comment-pagination');
			commentPagination.append(this.getPaginationLink(pagination.prevPage, 'previous'));
//'<a href="' + this.article.uri  + '?page='+pagination.prevPage+'&comment_order='+this.article.comment_order+'"></a>');
			var numbersContainer = '<span class="numbers">';
			for(var i=1, l=pagination.pageCount; i<=l; ++i){
				var cname = (i == pagination.page ) ? 'selectedSortMode' : '';
        numbersContainer += this.getPaginationLink(i, cname, i);
			}
			numbersContainer += '</span>';
			commentPagination.append(numbersContainer);
			commentPagination.append(this.getPaginationLink(pagination.prevPage, 'next'));
		}
	},

  getPaginationLink: function(page, html_class, innerHTML){
    var html = typeof(innerHTML) == 'undefined' ? '' : innerHTML;
    return '<a href="' + this.article.uri + '?comment_page=' + page + '&comment_order=' + this.article.comment_order + '#article-comments" class="' + html_class + '">' + html + '</a>';
  },

	submit : function(form){
		if(this.validate()){
			$.ajax({ url: "/comment/create", 
				type: "GET",
				data: $(form).serialize(),
				success: function(data){
					document.getElementById('comment-comment').value = '';
					Comment.addComment(data);
				}
			});
		} else{
			return false;
		}
	},

	validate : function(){
		this.hideErrors();
		return this.validateName() && this.validateEmail() && this.validateComment();
	},

	validateName : function(){
		var name = $.trim($('#comment-name').val());
		if(name == ''){
			this.displayError('name', 'cannot be blank');
			return false;
		}
		return true;
	},

	validateEmail : function(){
		var email = $.trim($('#comment-email').val());
		if(email == ''){
			this.displayError('email', 'cannot be blank');
			return false;
		}
		if(!this.emailRegex.test(email)){
			this.displayError('email', 'does not appear to be valid');
			return false;
		}
		return true;
	},

	validateComment : function(){
		var comment = $.trim($('#comment-comment').val());
		if(comment == ''){
			this.displayError('comment', 'cannot be blank');
			return false;
		}
		return true;
	},

	hideErrors : function(){
		var els = $('.comment-error');
		for(var i=0, l=els.length; i < l; ++i){
			els[i].style.display = 'none';
		}
	},

	displayError : function(field, message){
		var el = document.getElementById('comment-' + field + '-error');
		el.innerHTML = field + ' ' + message;
		el.style.display = '';
	},

	addComment : function(data){
		this.commentCount += 1;
		document.getElementById('comment-count').innerHTML = this.commentCount + ' Comments';
		data = eval('(' + data + ')');
		if(data.error != undefined){
			var el = document.getElementById('comment-comment-error');
			el.innerHTML = data.error;
			el.style.display = '';
			return false;
		}

		var comments  = $('.comment');
		if(comments.length > 0){
			var nclass = comments[comments.length - 1].className.split(' ');
			nclass = nclass[nclass.length - 1];
			if(nclass == 'evenComment'){
				className = 'oddComment';
			} else{
				className = 'evenComment';
			}
		} else{
			className = 'evenComment';
		}

		var comment = '<div class="comment ' + className + '">';
		comment += '<p>' + data.comment + '</p>';
		comment += '<p class="postDate">Posted by ' + data.name + ', ' + data.date + '</p>';
		comment += '</div>';
		$('#articleComments').prepend(comment);
	}
};

