/**
 * responsible for handling gotoPage actions.
 * @param {Cobalt.Core.Sandbox} sandbox
 */
Cobalt.Website.Results.GoToPageModule = function(sandbox)
{

	var paginationPageInfoElementClass = "pageNavigation_display";
    var handleGotoPageBlur = function(e)
    {
		var component = e;
        var componentId = sandbox.dom(component.target).attr("class");
		
		var componentValue = sandbox.dom(component.target).attr("value");
		
		var pageNumberInfo = getPageNumberInformation();
		
		var targetPageNumber = getTargetPageNumber(componentValue, pageNumberInfo);
		
        var data = {
            componentId: componentId,
            targetPageNumber : targetPageNumber
        };
		// Raise the event only if PageNumber Available, Reset value if Invalid
		// TO DO: attr() behaviour needs to be changes to change attributes
		if(targetPageNumber) {
			sandbox.raise(null, Cobalt.Website.Common.Events.PaginationClicked, data);
		}
		else { 
			sandbox.dom(component.target).attr("value", componentValue);
		}
    };
	
	var handleGotoPageKeyPress = function(e)
	{
		if(e.keyCode && e.keyCode === 13){
			handleGotoPageBlur(e);
			return false;
		}
	}
	
    /**
     * get Target page number validated against Current page and Total page
     */
	var getTargetPageNumber = function(componentValue, pageNumberInfo)
	{
		var numberRegEx = /^[0-9]*$/;
		var validateNumber = numberRegEx.test(componentValue);
		if(validateNumber && (componentValue >= 1) && (componentValue!= pageNumberInfo.currentPage) && (componentValue <= pageNumberInfo.totalPage)){
			return componentValue;
		}
		return false;
	}

	 
    /**
     * 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");
        }
    };	
    return {
        init:function()
        {
            var jquerySelector = sandbox.getUIElementSelectorsForModule(Cobalt.Website.Results.ResultsApplication.Modules.GoToPageModule);
            for (var i=0; i<jquerySelector.length; ++i)
            {
                sandbox.dom(jquerySelector[i]).listenLive("change", handleGotoPageBlur);
				sandbox.dom(jquerySelector[i]).listenLive("keypress", handleGotoPageKeyPress);
            }
        },
        destroy:function()
        {
            //TODO: handle destroy
        }
    };
};
