var strMacro;
var total,currOffset,currLimit;
var currPage,prevPage,nextPage;
var strPrev, strNext;

$(document).ready(function() {

		var pattern = new RegExp('paginationCode(.+?)paginationCode','gim');
		var parts;
		while ((parts = pattern.exec($('body').html()))!=null) {
			eval('var pagData = ' + parts[1] + ';');
			showPagination(pagData.hElement,pagData.macro,pagData.totalPage,pagData.flpages,pagData.pagesSymbol,pagData.separator,pagData.paginationTag,pagData.prevSymbol,pagData.prevClass,pagData.nextSymbol,pagData.nextClass,pagData.callback);
		}

});

function showPagination(hElement, macro, totalPage, flpages, pagesSymbol,separator, paginationTag, prevSymbol,prevClass, nextSymbol,nextClass,callback){
	//console.log('showPagination ' + 'totalPage: ' + totalPage + 'flpages: ' + flpages );
	var linksnumber = 3;										//how many links to show
	strMacro = Base64.decode(macro);
	
	currOffset = parseInt(currentParam(strMacro, 'offset'));
	currLimit = parseInt(currentParam(strMacro, 'limit'));
	currPage = parseInt((currOffset / currLimit) + 1);
	prevPage = currPage - 1;
	nextPage = currPage + 1;
	
	if (paginationTag == null){paginationTag = 'p';}

	if (callback == null){callbackStr = '';}else{callbackStr = ','+ callback;}
	if (prevSymbol == null){prevSymbol = '&lt;';}
	if (prevClass == null){prevClass = 'prev';}
	if (nextSymbol == null){nextSymbol = '&gt;';}
	if (nextClass == null){nextClass = 'next';}
	
	if (prevPage > 0) 
		strPrev = '<' + paginationTag + ' style="cursor:pointer;" class="' + prevClass+ '" onClick="getModulePage(\'' + macro + '\',' + prevPage + ',' + currLimit + ',\'' + hElement + '\''+ callbackStr + ');return(false);">' + prevSymbol + '</' + paginationTag + '>';
	else 
		strPrev = '';
		
	if (nextPage <= totalPage) 
		strNext = '<' + paginationTag + ' style="cursor:pointer;" class="' + nextClass + '" onClick="getModulePage(\'' + macro + '\',' + nextPage + ',' + currLimit + ',\'' + hElement + '\''+ callbackStr + ');return(false);">' + nextSymbol + '</' + paginationTag + '>';
	else 
		strNext = '';
	
	var strPages = '';
	if (flpages && totalPage>1 ) {
		var semiLinksNumber = (linksnumber-1)/2;
		var startingPage = currPage-parseInt(semiLinksNumber); 
		if(startingPage<=1){ startingPage = 1; }
		else if(currPage == totalPage && totalPage > 1){ startingPage -= 1; }
		
		var endingPage = semiLinksNumber + currPage;
		if(currPage <= semiLinksNumber){ endingPage += semiLinksNumber - currPage + 1;}

		if(endingPage>totalPage){ endingPage = totalPage; }
		
		if(currPage > linksnumber){
			//link to firstpage
			if (pagesSymbol == null || pagesSymbol == ''){ pagesSymbolStr = 1; }
			strPages += '<a href="#" onClick="getModulePage(\'' + macro + '\', 1 ,' + currLimit + ',\'' + hElement + '\''+ callbackStr + ');return(false);">' + pagesSymbolStr + '</a><span class="eve_pagination_dots">...</span>';
		}

		for (i = startingPage; i <= endingPage; i++) {
			if (pagesSymbol == null || pagesSymbol == ''){pagesSymbolStr = i;}
			if (currPage == i){strSelected = ' class=\'selected\'';}else{strSelected='';}
			strPages += '<a href="#"' + strSelected + ' onClick="getModulePage(\'' + macro + '\',' + i + ',' + currLimit + ',\'' + hElement + '\''+ callbackStr + ');return(false);">' + pagesSymbolStr + '</a>';
			strPages += separator;

		}
		if (strPages != ''){
			strPages = strPages.substr(0,strPages.length - (separator.length));
		}
		
		if(endingPage <= totalPage -1){
			//link to lastpage
			if (pagesSymbol == null || pagesSymbol == ''){ pagesSymbolStr = totalPage; }
			strPages += '<span class="eve_pagination_dots">...</span> <a href="#" onClick="getModulePage(\'' + macro + '\', ' + totalPage + ' ,' + currLimit + ',\'' + hElement + '\''+ callbackStr + ');return(false);">' + pagesSymbolStr + '</a>';
		}

	}
	//console.log(strPages);
	$('#eve_pagination_numbers_' + hElement).html(strPages);		
	$('#eve_pagination_prev_' + hElement).html(strPrev);
	$('#eve_pagination_next_' + hElement).html(strNext);		
}
function getModulePage(macro,pageNumber,currLimit,hElement, callback) {
	
	strMacro = Base64.decode(macro);
	var theMacro = getMacro(strMacro,pageNumber,currLimit);
	$.get("/service/utility/customrenderer.php", { param: theMacro }, function(data) {
	/**/
		if(typeof pagData == 'undefined'){
			var pattern = new RegExp('paginationCode(.+)paginationCode','gim');
			var parts = pattern.exec(data);
			if(parts){
				eval('var pagData = ' + parts[1] + ';');
			}	
		}
	/**/
	
	  	var parentElement = $("#"+hElement).parent();
		parentElement.html(data);
		$("#"+hElement).remove();
		/**/
		if(typeof pagData != 'undefined'){
			showPagination(pagData.hElement,pagData.macro,pagData.totalPage,pagData.flpages,pagData.pagesSymbol,pagData.separator,pagData.paginationTag,pagData.prevSymbol,pagData.prevClass,pagData.nextSymbol,pagData.nextClass,pagData.callback);
		}
		/**/
		if (callback != null){callback.call();}
	});
}

function getMacro(strMacro,pageNumber,currLimit){
	var newMacro;
	var newOffset = (pageNumber * currLimit) - currLimit;
	var newOffsetStr = 'offset: "' + newOffset + '"';
	if (strMacro.match(/offset[\s\t]*?\:[\s\t]*?\"(.*?)\"/g) == null) {
		var idx = strMacro.indexOf('}}');
		newMacro = strMacro.substring(0, idx) + ', ' + newOffsetStr + strMacro.substring(idx, strMacro.length);
	}else{
		newMacro = strMacro.replace(/offset[\s\t]*?\:[\s\t]*?\"(.*?)\"/g,newOffsetStr);
	}
	//alert('newMacro' + newMacro);
	return Base64.encode(newMacro);
}
function currentParam(strMacro,paramName){
	var reg = new RegExp(paramName + '[\\s\\' + 't]*?\\:[\\s\\' + 't]*?\\"(.*?)\\"');
	var params = strMacro.match(reg);
	if (params != null){
		return params[0].replace(/\D*/g,'');
	} else return 0;
}

var Base64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = Base64._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = Base64._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
}
