CreatoorSN.namespace('pagination');
CreatoorSN.pagination = {
	
	pageLinks: 8,
	scrollToTop: true,
    currentState : 1,   
    paginatorArray : [],
	
	setScrollToTop: function (scrollToTop) {
		CreatoorSN.pagination.scrollToTop = scrollToTop ? true : false;
	},	
	/**
	 * 
	 * @param {String} url - pagination url sholud return json string {success: true/false, html: code that should be rendered} - required
	 * @param {int} total - total of all records- required
	 * @param {int} rowsPerPage - rows per one page - required
	 * @param {array} containers - array of ids of html elements in which pagination control will be rendered - required
	 * @param {mixed} recordsContainer - id of or html element in which records are rendered - required
	 * @param {string} template - pagination template (see line 26) - optional
	 * @param {unt} pageLinks - number of page links shown at once - optional (default 8) 
	 * @param {int} page - current page - optional (default 1)
	 * @param {function} callback - callback after rendering desired page - optional
	 * @param {string} method - post/get - optional (default get)
	 * @param {string} postData - data to post along with default ones - optional 
	 * @param {bool} scrollToTop - wheter or not page should scroll to the top of the screen - optional (default true)
     * @param {bool} showHistory -  wheter to initialize History or not, default false
     * @param {string} historyName - history navigation tag, default p
	 */
	initialize : function (url, total, rowsPerPage, containers, recordsContainer, template, pageLinks, page, callback, method, postData, scrollToTop, showHistory,historyName) {
      
	template = template ? template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {CurrentPageReport} {LastPageLink} {NextPageLink}";
        showHistory = showHistory ? showHistory : false;
        historyName = historyName ? historyName : 'p';
        var paginatorId = typeof(recordsContainer) == 'string' ? recordsContainer : recordsContainer.id;
      
        if (typeof(recordsContainer) == 'string') {
                recordsContainer = document.getElementById(recordsContainer);
        }

        if (recordsContainer && typeof(recordsContainer.getElement) == 'function') {
                recordsContainer = recordsContainer.domElement;
        }
       
        if (!recordsContainer) {
                return false;
        }

        if(showHistory){
            var bookmarkedPage = YAHOO.util.History.getBookmarkedState(historyName);
            var queryPage = YAHOO.util.History.getQueryStringParameter(historyName);
            var initialPage = bookmarkedPage || queryPage || "1";
            if(initialPage > 1) page = initialPage;            
        }
       
        pageLinks = parseInt(pageLinks) ? parseInt(pageLinks) : CreatoorSN.pagination.pageLinks;
        if (recordsContainer.tagName) {
                if(rowsPerPage!=0)
                        var pages=Math.ceil(total/rowsPerPage);
                else
                        var pages=total;
                    CreatoorSN.pagination.paginatorArray[paginatorId] = new YAHOO.widget.Paginator({
                        rowsPerPage: rowsPerPage,
                        totalRecords: total,
                        containers: containers,
                        template: template,
                        pageLinks: pageLinks,
                        firstPageLinkLabel: '',
                        lastPageLinkLabel: '',
                        previousPageLinkLabel : '',
                        pageReportTemplate    : '({currentPage} / {totalPages})',
                        nextPageLinkLabel : ''
                });
                CreatoorSN.pagination.paginatorArray[paginatorId].subscribe('changeRequest',function(state)
                {
                        CreatoorSN.pagination.show(state, callback, method, postData, scrollToTop, showHistory,paginatorId,historyName);
                });

        }
        CreatoorSN.pagination.paginatorArray[paginatorId].url = url;
        CreatoorSN.pagination.paginatorArray[paginatorId].cache = [];
        CreatoorSN.pagination.paginatorArray[paginatorId].recordsContainer = recordsContainer;
    
        if(showHistory){
            var obj = {paginatorId: paginatorId }
          
            HISTORY.register(historyName, initialPage,CreatoorSN.pagination.showForHistory,obj);
            try {
                 HISTORY.initialize("yui-history-field", "yui-history-iframe");
            } catch (e) {}
        }

        if (page) {
            if(CreatoorSN.pagination.currentState != page){
                CreatoorSN.pagination.paginatorArray[paginatorId].setPage(Number(page), false);
                if(showHistory)
                    CreatoorSN.pagination.currentState = Number(page);
            }
        } else {
            CreatoorSN.pagination.paginatorArray[paginatorId].cache[1] = recordsContainer.innerHTML;
            CreatoorSN.pagination.currentState = Number(1);
        }
       
		CreatoorSN.pagination.paginatorArray[paginatorId].render();
				
	},
	showForHistory : function(page, params){
      
     if(CreatoorSN.pagination.currentState == page) return;
      CreatoorSN.pagination.paginatorArray[params.paginatorId].setPage(Number(page));
     
    },
	show : function (state, callback, method, postData, scrollToTop, showHistory,paginatorId,historyName) {

		var recordsHTML = CreatoorSN.pagination.paginatorArray[paginatorId].recordsContainer.innerHTML;
       
		if (CreatoorSN.pagination.paginatorArray[paginatorId].cache[state.page]) {
			CreatoorSN.pagination.paginatorArray[paginatorId].recordsContainer.innerHTML = CreatoorSN.pagination.paginatorArray[paginatorId].cache[state.page];
            
            if(showHistory){
              CreatoorSN.pagination.currentState = state.page;
              window.location.hash = historyName+'='+state.page;
            }
            CreatoorSN.pagination.paginatorArray[paginatorId].setState(state);
            
			if (typeof(scrollToTop) == 'undefined' || scrollToTop) {
                scrollTo(0, 0);
            }
            return; 
        }
		var overlay = disableElement(CreatoorSN.pagination.paginatorArray[paginatorId].recordsContainer.parentNode);
		var oCallback = {                
            success : function (o) {
				removeElement(overlay);
				if (YAHOO.lang.JSON.isSafe(o.responseText)) {
					var response = YAHOO.lang.JSON.parse(o.responseText);
					if (response.success) {                                               
						CreatoorSN.pagination.paginatorArray[paginatorId].cache[state.page] = response.html;
						CreatoorSN.pagination.paginatorArray[paginatorId].recordsContainer.innerHTML = response.html;
						CreatoorSN.pagination.paginatorArray[paginatorId].setState(state);
                       
                        if(showHistory){
                            CreatoorSN.pagination.currentState = state.page;
                             window.location.hash = historyName+'='+state.page;
                        }
						if (typeof(callback) == 'function') {
							callback(state, response);
						}
						
						//CreatoorSN.pagination.setLinks(paginator, paginationUrl, containers);
					} else {
                       
						CreatoorSN.pagination.paginatorArray[paginatorId].recordsContainer.innerHTML = recordsHTML;
						if (response.noAuth) {
							var login = new noAuth(function(noAuthObj)
							{
								CreatoorSN.pagination.show(state);
							}, response.message);
							return;
						}
						CreatoorSN.common.showErrorAlert(response.message);
					}
				} else {
					CreatoorSN.common.showErrorAlert(CreatoorSN.common.translate('Oops an error occured while executing a script. Please try again later') + '.');
				}
            },
            
            failure : function (o) {
				removeElement(overlay);
                CreatoorSN.common.showErrorAlert(o.statusText);
            }
            
        };
        var url = window.location.href;
        var urlparts = url.split('/');
        var tmp = null;
        for(var i = 0; i < urlparts.length ; i++){
                if(urlparts[i] == 'order' && urlparts[i+1]){
                    tmp = urlparts[i+1].split("#");
                    var order = tmp[0];
                    break;
                }
                if(urlparts[i] == 'category' && urlparts[i+1]){        
                    tmp = urlparts[i+1].split("#");
                    var category = tmp[0];
                }
                //only for recipes
                if(urlparts[i] == 'ingredients' && urlparts[i+1]){
                    tmp = urlparts[i+1].split("#");
                    var ingredients = tmp[0];
                }
                if(urlparts[i] == 'types' && urlparts[i+1]){
                    tmp = urlparts[i+1].split("#");
                    var types = tmp[0];
                }
                if(urlparts[i] == 'method' && urlparts[i+1]){
                    tmp = urlparts[i+1].split("#");
                    var recipeMethod = tmp[0];
                }
                if(urlparts[i] == 'cuisines' && urlparts[i+1]){
                    tmp = urlparts[i+1].split("#");
                    var cuisines = tmp[0];
                }

        }
       
		method = method ? method.toUpperCase() : 'GET';
        
		if (method == 'POST') {
			postData = postData ? postData : '';
			postData += "&page=" + state.page + "&total=" + state.totalRecords + '&rowsPerPage=' + state.rowsPerPage;
            if(order)
                postData += '&order='+order;
            if(category)
                postData += '&category='+category;
            if(ingredients)
                 postData += '&ingredients='+ingredients;
            if(types)
                postData += '&types='+types;
            if(recipeMethod)
                 postData += '&recipeMethod='+recipeMethod;
            if(cuisines)
                 postData += '&cuisines='+cuisines;
			YAHOO.util.Connect.asyncRequest("POST", CreatoorSN.pagination.paginatorArray[paginatorId].url, oCallback, postData);
			
		} else {
            var getData =CreatoorSN.pagination.paginatorArray[paginatorId].url;
            getData += (getData.indexOf('?') == -1) ? '?' : '&';
            getData += "page=" + state.page + "&total=" + state.totalRecords + '&rowsPerPage=' + state.rowsPerPage;
            if(order)
                getData += '&order='+order;
            if(category)
                getData += '&category='+category;
            if(ingredients)
                 getData += '&ingredients='+ingredients;
            if(types)
                getData += '&types='+types;
            if(recipeMethod)
                 getData += '&recipeMethod='+recipeMethod;
            if(cuisines)
                 getData += '&cuisines='+cuisines;
			YAHOO.util.Connect.asyncRequest("GET", getData, oCallback);
		}
	},
	
	setLinks : function (paginator, paginationUrl, containers)
	{
		var state = paginator.getState();
		var last = paginator.getTotalPages;
		var first = 1;
		var prev = state.page  - 1;
		var next = state.page + 1;
		var host = 'http://' + location.hostname;
		if (paginationUrl) {
			for (var i = 0; i < containers.length; i++) {
				var container = _$(containers[i]);
				var links = container.getElementsByTagName('a');
				
				for (var j = 0; j < links.length; j++) {
				
					if (links[j].href != host + '#') {
						continue;
					}
					var page = links[j].getAttribute('page');
				
					if (!page) {
					   if (links[j].className == 'yui-pg-first') page = first;
					   if (links[j].className == 'yui-pg-previous') page = prev;
					   if (links[j].className == 'yui-pg-last') page = last;
					   if (links[j].className == 'yui-pg-next') page = next;	
					} 
					links[j].href = paginationUrl + '/page/' + page; 
				}
				
			} 
		}
	}
	
	
};

