/**

 * responsible for handling Pagination actions.

 * @param {Cobalt.Core.Sandbox} sandbox

 */
Cobalt.Website.Results.PaginationModule = function(sandbox)
{

    var nextPageElementClassName = "pageNavigation_control_right";
	var paginationPageInfoElementClass = "pageNavigation_display";

    var handlePaginationClicked = function(e)
    {
        var componentId = getCompId(e);
        var pagaNumberInfo = getPageNumberInformation();
        var isNextClick = getIsNextClick(componentId);
        var targetPageNumber = getTargetPageNumber(pagaNumberInfo.currentPage, pagaNumberInfo.totalPage, isNextClick);
        var data = {
            componentId: componentId,
            currentPage: pagaNumberInfo.currentPage,
            totalPage: pagaNumberInfo.totalPage,
            targetPageNumber : targetPageNumber
        };
		
		// Raise the event only if PageNumber Available
		if(targetPageNumber)	sandbox.raise(null, Cobalt.Website.Common.Events.GoToPageBlur, data);
		
        e.stopPropagation();
        e.preventDefault();
    };

    /**
     * get CurrentPageNumber and totalPageNumber from markup
     */
    var getPageNumberInformation = function()
    {
        try
        {
            var paginationElement = "[class~="+paginationPageInfoElementClass+"]";
            var paginationText = sandbox.dom(paginationElement).text();
            var patt=/(\d+)/g;  //capture page number groups in text
            var matches=paginationText.match(patt);
            return {currentPage:parseInt(matches[0],10), totalPage:parseInt(matches[1],10)};
        }
        catch(e)
        {
            throw new Error("PaginationModule =>pagenumber info error");
        }
    };

    /**
     *
     * @param {Number} currentPage
     * @param {Number} totalPage
     * @param {Boolean} isNextClick
     * @return {Number} targetPageNumber
     */
    var getTargetPageNumber = function(currentPage, totalPage, isNextClick)
    {
        if (isNextClick)
        {
            if (currentPage === totalPage) {return false;}
            return currentPage + 1;
        }

        else
        {
            if (currentPage === 1) {return false;}
            return currentPage - 1;
        }
    };

    var getIsNextClick = function(componentId)
    {
        return componentId === nextPageElementClassName;
    };
	
	var getCompId = function(component)
	{
		if	(component.target.nodeName === "A")	var componentId = sandbox.dom(component.target.parentNode).attr("class");
		else	var componentId = sandbox.dom(component.target).attr("class");
		return componentId;
	};
	

    return {
        init:function()
        {
            var jquerySelector = sandbox.getUIElementSelectorsForModule(Cobalt.Website.Results.ResultsApplication.Modules.PaginationModule);
            
            for (var i=0; i<jquerySelector.length; ++i)
            {
                sandbox.dom(jquerySelector[i]).listenLive("click", handlePaginationClicked);
            }
			
        },

        destroy:function()
        {
            //TODO: handle destroy
        }
    };
};

