// Works with comments: posting, paging.


function comments_init()
{
	window.commentPoster = new commentPosterHandler(serverPath + '/Services/AjaxCommentPostingService.ajax', itemId);
	initializeCommentsHandler();
}

function initializeCommentsHandler()
{
	window.commentsHandler = new commentsPage(serverPath + '/Services/AjaxCommentsService.ajax', commentsTotalEntries, commentEntriesPerPage);
}

function htmlEncode(str)
{
   var div = document.createElement('div');
   var text = document.createTextNode(str);
   div.appendChild(text);
   return div.innerHTML.replace(/\n/g, "<br />\n");
}; 

function commentPosterHandler(url, id)
{
    var updationId = id;
    var targetURL = url;
    var updationTarget = 'commentsContent';
    
    this.postComment = function(name, email, subscribe,  commentBody, captchaCode, captchaValue)
    {
    
        this.poster = new Ajax.Request
        (
            targetURL,
            {
                method: 'post',
                postBody: "CaptchaCode="+captchaCode+"&CaptchaValue="+captchaValue+"&commentType="+commentType+"&name="+name+"&email="+email+"&subscribe="+subscribe+"&commentBody="+commentBody+"&id="+id,
                onSuccess: function(req, json)
                {
                    if (json == 'captcha')
                    {
                        $('postingSummary').style.color = 'red';
                        $('postingSummary').innerHTML = 'Invalid captcha value. We need it to be sure you are not a spam robot, so please type what is written in the picture.';    
                        return;
                    }
                
                    if (json == 'fields')
                    {
                        $('postingSummary').style.color = 'red';
                        $('postingSummary').innerHTML = 'Unable to post the comment. Please verify all the fields.';    
                        return;
                    }
                    
                    if (json != 'ok')
                    {
                        $('postingSummary').style.color = 'red';
                        $('postingSummary').innerHTML = 'Unable to post the comment due to an internal error.';    
                        return;
                    }
                
          
                    //initializeCommentsHandler();
                    var handler = window.commentsHandler;
                    handler.firstPageCount++;
                    handler.setCommentsTotal(handler.getCommentsTotal() + 1);
                    if (handler.getPageNum() == 1)
                    {
                        var commentsContent = $('commentsContent'); 
                                            
                        if (handler.getCommentsTotal() == 1)
                        {
                            commentsContent.innerHTML = '';
                        }
                        
                        commentsContent.innerHTML = '<div id="mediaCommentsPostedBlock"><p id="textPosted"><p>' +
                                                    htmlEncode(commentBody) +
                                                    '</p></p><p id="datePosted">Posted on ' +
                                                    getDayName() +
                                                    ' by ' +
                                                    htmlEncode(name != '' ? name : userName) +
                                                    ' : ' +
                                                    getFullFormattedDate() +
                                                    '</p></div>' +
                                                    commentsContent.innerHTML;
                        clearPostCommentForm();

                        if ($('showingInfo'))
                        {
                            $('showingInfo').innerHTML = 'Showing 1-' + handler.firstPageCount + ' of ' + handler.getCommentsTotal();
                        }
                    }
                    else
                    {
                        if ($('showingInfo'))
                        {
                            $('showingInfo').innerHTML = handler.calcShowing(handler.getPageNum(), handler.getPerPage());
                        }
                    }
                    
                    //$('commentsCountElement').innerHTML = commentsTotalEntries;
                    $('postingSummary').innerHTML = 'Your comment has been successfully posted.';
                    $('validationSummary').innerHTML = '';
                    $('postingSummary').style.color = 'green';
                    
                    //$('pageInfo').innerHTML = 'Page ' + json.pageNumber + ' of ' + json.pageCount;
                },
                onFailure: function(e)
                {
                    $('postingSummary').innerHTML = 'Failed to post a comment.';
                }
            }
        );
    }
}

function getDayName(dayId)
{
    var now = new Date();
    var days = new Array(
        'Sunday','Monday','Tuesday',
        'Wednesday','Thursday','Friday','Saturday');
    
    return days[now.getDay()];
}

function getFullFormattedDate()
{
    var now = new Date();
    var hours = now.getHours();
    var timeType = hours > 11 ? 'PM' : 'AM';
    if (hours > 11)
    {
        hours -= 12;
    }
    return  (now.getMonth() + 1) + '/' +
            (now.getDate() + 1) + '/' +
            (now.getYear() + 1) + ' ' +
            (hours) + ':' +
            (now.getMinutes() + 1) + ':' +
            (now.getSeconds() + 1) + ' ' + timeType;
}

function commentsPage(url, totalComments, perPage) {
	var targetURL = url;
	
	var commentsTarget = 'commentsContent';
	var commentsPerPage = perPage;
	var commentsTotal = totalComments;
	
	var commentsTotalPages = Math.floor(totalComments / commentsPerPage);	
	if(totalComments % commentsPerPage)
	{
		commentsTotalPages += 1;
	}
	
	var commentsCurrentPage = 1;
    
    this.getPageNum = function()
    {
        return commentsCurrentPage;
    }
    
    this.setPageNum = function(num)
    {
        commentsCurrentPage = num;
    }
    
    this.getPerPage = function()
    {
        return commentsPerPage;
    }
    
    this.getTotalPages = function()
    {
        return commentsTotalPages;
    }
    
    this.setCommentsTotal = function(value)
    {
        if (value)
        {
            commentsTotal = value;
        }
    }

    this.getCommentsTotal = function()
    {
        return commentsTotal;
    }

	this.commentsNext = function(id)
	{
		if(commentsCurrentPage < commentsTotalPages)
		{
			commentsCurrentPage++;
			var showingText = this.calcShowing(commentsCurrentPage, commentsPerPage);			
			this.commentsPages = new Ajax.Updater(
				commentsTarget,
				targetURL,
				{
					method: 'get',
					parameters: "commentType="+commentType+"&page_num="+commentsCurrentPage+"&per_page="+commentsPerPage+"&id="+id+"&cacheable=true",
					onComplete: function() {
						$('showingInfo').innerHTML = showingText;
						$('pageInfo').innerHTML = 'Page '+commentsCurrentPage+' of '+commentsTotalPages;						
					}
				}
			);
		}
	}
	
	this.commentsFirstPage = function(id)
	{
	    commentsCurrentPage = 1;
		var showingText = this.calcShowing(commentsCurrentPage, commentsPerPage);			
		this.commentsPages = new Ajax.Updater(
			commentsTarget,
			targetURL,
			{
				method: 'get',
				parameters: "commentType="+commentType+"&page_num="+commentsCurrentPage+"&per_page="+commentsPerPage+"&id="+id+"&cacheable=true",
				onComplete: function() {
					$('showingInfo').innerHTML = showingText;
					$('pageInfo').innerHTML = 'Page '+commentsCurrentPage+' of '+commentsTotalPages;						
				}
			}
		);
	}
	
	this.commentsPrev = function(id)
	{
		if(commentsCurrentPage > 1)
		{
			commentsCurrentPage--;
			var showingText = this.calcShowing(commentsCurrentPage, commentsPerPage);
			this.commentsPages = new Ajax.Updater(
				commentsTarget,
				targetURL,
				{
					method: 'get',
					parameters: "commentType="+commentType+"&page_num="+commentsCurrentPage+"&per_page="+commentsPerPage+"&id="+id+"&cacheable=true",
					onComplete: function() {
						$('showingInfo').innerHTML = showingText;
						$('pageInfo').innerHTML = 'Page '+commentsCurrentPage+' of '+commentsTotalPages;
					}
				}
			);
		}
	}		

	this.calcShowing = function(pageNum, perPage)
	{
		var showingText = 'Showing ' + ((pageNum - 1) * perPage + 1) + '-';
		
		if(perPage * pageNum > commentsTotal)
		{
			showingText += commentsTotal;
		}
		else
		{
			showingText += perPage * pageNum;
		}
		
		showingText += ' of ' + commentsTotal;
		return showingText;
	}
}

function postComment()
{
    if (!validateCommentFields())
    {
        $('validationSummary').style.color = 'red';
        return;
    }
    
    $('validationSummary').style.color = 'black';

    var nameInput = $('nameInput');
    var name = nameInput ? nameInput.value : '';
    
    var emailInput = $('emailInput');
    var email = emailInput ? emailInput.value : '';
    
    var signUpInput = $('signUp');
    var signUp = signUpInput ? signUpInput.checked : false;

    var commentBody = $('commentInput').value;
    
    var captchaCode = $('captchaCode').value;
    var captchaValue = $('captchaValue').value;
        
    window.commentPoster.postComment(name, email, signUp, commentBody, captchaCode, captchaValue);
}

function validateCommentFields()
{
    var validationSummary = $('validationSummary');
    validationSummary.innerHTML = '';

    var validationSucceeded = true;

    var nameInput = $('nameInput');
    if (nameInput)
    {
        if (!validateNameInput(nameInput, validationSummary))
        {
            validationSucceeded = false;
        }
    }
    
    var emailInput = $('emailInput');
    if (emailInput)
    {
        if (!validateEmailInput(emailInput, validationSummary))
        {
            validationSucceeded = false;
        }
    }
    
    var commentInput = $('commentInput');
    if (!validateCommentInput(commentInput, validationSummary))
    {
        validationSucceeded = false;
    }
    
    var captchaValue = $('captchaValue');
    if (!validateCaptchaInput(captchaValue, validationSummary))
    {
        validationSucceeded = false;
    }
    
    return validationSucceeded;
}

function validateCaptchaInput(captchaInput, validationSummary)
{
    if (captchaInput.value.length == 0)
    {
        validationSummary.innerHTML += 'Confirmation code is mandatory.<br />';
        
        return false;
    } 
    
    return true;
}

function validateNameInput(nameInput, validationSummary)
{
    if (nameInput.value.length == 0)
    {
        validationSummary.innerHTML += 'User name is mandatory.<br/>';
        
        return false;
    }
    
    var nameRegex = new RegExp("^[a-zA-Z0-9\\._]*$");
    if (!nameRegex.exec(nameInput.value))
    {
        validationSummary.innerHTML += "Incorrect symbols in User Name.<br/>";
    
        return false;
    }
    
    return true;
}

function validateEmailInput(emailInput, validationSummary)
{
    var validationSucceeded = true;
    if (emailInput.value.length == 0)
    {
        validationSummary.innerHTML += 'Email is mandatory.<br/>';
        
        return false;
    }
    
    var emailRegex = new RegExp("^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-\\.]+\\.[a-zA-Z]{2,5}$");
    if (!emailRegex.exec(emailInput.value))
    {
        validationSummary.innerHTML += "Incorrect symbols in Email.<br/>";
    
        return false;
    }
    
    return true;
}

function validateCommentInput(commentInput, validationSummary)
{
    if (commentInput.value.length == 0)
    {
        validationSummary.innerHTML += 'Comment body is mandatory.<br/>';
        
        return false;
    }
    
    var maxLength = parseInt(commentInput.getAttribute('maxLength'));
    if (commentInput.value.length >= maxLength)
    {
        validationSummary.innerHTML += 'Comment body should be no longer than ' + maxLength + ' characters.<br/>';
        
        return false;
    }
    
    var commentRegex = new RegExp("^(?:[^\\x00]+)$");
    if (!commentRegex.exec(commentInput.value))
    {
        validationSummary.innerHTML += 'Comment body should contain only valid characters.<br/>';
    
        return false;
    }
    
    return true;
}

function clearPostCommentForm()
{
    $('validationSummary').innerHTML = '';
    $('commentInput').value = '';

    var signUpInput = $('signUp');
    if (signUpInput)
    {
        signUpInput.checked = false;
    }

    var nameInput = $('nameInput');
    if (nameInput)
    {
        nameInput.value = '';
    }
    
    var emailInput = $('emailInput');
    if (emailInput)
    {
        emailInput.value = '';
    }
    
    var captchaValue = $('captchaValue');
    if (captchaValue)
    {
        captchaValue.value = '';
    }
}

if (typeof comments_init == 'function')
{ 
          comments_init();
}
