/**
 * Forms Framework Javascript Handling Object
 *	ffPageNavigator' namespace
 */

ff.ffPageNavigator = (function () {
	
// privates
var navigators = [];

function calcPage(id) {
	navigators[id].totpage = Math.ceil(navigators[id].totrec / navigators[id].rec_per_page);
	navigators[id].totframe = Math.ceil(navigators[id].totpage / navigators[id].page_per_frame);

	if (navigators[id].page > navigators[id].totpage)
		navigators[id].page = navigators[id].totpage;
	else if (navigators[id].page < 1)
		navigators[id].page = 1;

	if (navigators[id].totpage > navigators[id].page_per_frame) {
		navigators[id].start_page = navigators[id].page - navigators[id].half_frame;
		if (navigators[id].start_page < 1)
			navigators[id].start_page = 1;

		navigators[id].end_page = navigators[id].start_page + navigators[id].page_per_frame - 1;
		if (navigators[id].end_page > navigators[id].totpage)
			navigators[id].end_page = navigators[id].totpage;

		navigators[id].start_page = navigators[id].end_page - navigators[id].page_per_frame + 1;
	} else {
		navigators[id].start_page = 1;
		navigators[id].end_page = navigators[id].totpage;
	}

	jQuery("." + id + "_pageNavigator").find(".totpage").html(navigators[id].totpage);
}

function drawButtons(id) {
	jQuery("." + id + "_pageNavigator").each(function () {
		jQuery(".page", this).remove();
		var container = jQuery("." + id + "_pagetemplate", this);
		for (var i = 1; i <= navigators[id].totpage; i++)
		{
			var tmp = navigators[id].code_template.replace(/\[page\]/g, i);
			container.append(tmp);
		}
	});
}

var that = { // publics

"addNavigator" : function (params) {
	if (navigators[params.id] !== undefined)
		return;

	navigators[params.id] = {
		  "page_parname"				: params.page_parname
		, "page"						: params.page
		, "rec_per_page_parname"		: params.rec_per_page_parname
		, "rec_per_page"				: params.rec_per_page
		, "page_per_frame"				: params.page_per_frame
		, "totrec"						: params.totrec
		, "doAjax"						: params.doAjax
	}

	// adjust values
	navigators[params.id].half_frame		= Math.floor(navigators[params.id].page_per_frame / 2);
	navigators[params.id].page_per_frame	= (navigators[params.id].half_frame * 2) + 1;

	if (navigators[params.id].code_template === undefined) {
		jQuery("." + params.id + "_pageNavigator").each(function () {
			var template = jQuery("." + params.id + "_pagetemplate", this);
			navigators[params.id].code_template = template.html();
			template.html("");
		});
	}

	calcPage(params.id);
	drawButtons(params.id);
	that.updateButtons(params.id);

	jQuery("." + params.id + "_pageNavigator").css("visibility", "visible"); 
},

"deleteNavigator" : function (id) {
	if (navigators[id] !== undefined)
		delete navigators[id];
},

"updateButtons" : function(id, newTotPage) {
    if(navigators[id] !== undefined) {
	    if (newTotPage !== undefined && navigators[id].totrec !== newTotPage) {
		    navigators[id].totrec = newTotPage;
		    calcPage(id);
		    drawButtons(id);
	    }
	    
	    jQuery("." + id + "_pageNavigator").find(".currentpage").val(navigators[id].page);
	    
	    jQuery("." + id + "_pageNavigator").each(function () {
		    jQuery(".page", this).removeClass("current");
		    jQuery(".selectors", this).removeClass("current");

		    jQuery(".page:eq(" + (navigators[id].page - 1) + ")", this).addClass("current");
		    jQuery(".selector_" + navigators[id].rec_per_page, this).addClass("current");

		    jQuery(".page", this).hide();
		    for (var i = navigators[id].start_page - 1; i < navigators[id].end_page; i++) {
			    jQuery(".page:eq(" + i + ")", this).show();
		    }

		    jQuery("*", this).unbind(".ff.ffPageNavigator");

		    if (navigators[id].totpage > 1) {
			    jQuery(".prev", this).removeClass("disabled");
			    jQuery(".next", this).removeClass("disabled");
			    jQuery(".prev", this).bind("click.ff.ffPageNavigator", {"id" : id}, that.prevPage);
			    jQuery(".next", this).bind("click.ff.ffPageNavigator", {"id" : id}, that.nextPage);
		    } else {
			    jQuery(".prev", this).addClass("disabled");
			    jQuery(".next", this).addClass("disabled");
			    jQuery(".prev", this).unbind(".ff.ffPageNavigator");
			    jQuery(".next", this).unbind(".ff.ffPageNavigator");
		    }

		    if (navigators[id].start_page > 1) {
			    jQuery(".first", this).bind("click.ff.ffPageNavigator", {"id" : id}, that.firstPage);
			    jQuery(".first", this).removeClass("disabled");
			    jQuery(".prev-frame", this).bind("click.ff.ffPageNavigator", {"id" : id}, that.prevFrame);
			    jQuery(".prev-frame", this).removeClass("disabled");
		    } else {
			    jQuery(".first", this).addClass("disabled");
			    jQuery(".prev-frame", this).addClass("disabled");
		    }

		    if (navigators[id].end_page < navigators[id].totpage) {
			    jQuery(".last", this).bind("click.ff.ffPageNavigator", {"id" : id}, that.lastPage);
			    jQuery(".last", this).removeClass("disabled");
			    jQuery(".next-frame", this).bind("click.ff.ffPageNavigator", {"id" : id}, that.nextFrame);
			    jQuery(".next-frame", this).removeClass("disabled");
		    } else {
			    jQuery(".last", this).addClass("disabled");
			    jQuery(".next-frame", this).addClass("disabled");
		    }
	    });
    }
},

"goToPage" : function (id, page, records_per_page, doAjax) {
	if (page !== null) {
		navigators[id].page = page;
		jQuery("#" + id + "_" + navigators[id].page_parname).val(page);
	}
    
    if(doAjax !== false) {
        doAjax = navigators[id].doAjax;
    }
	if (records_per_page !== undefined) {
		navigators[id].rec_per_page = records_per_page;
		jQuery("#" + id + "_" + navigators[id].rec_per_page_parname).val(records_per_page);
		calcPage(id);
		drawButtons(id);
		that.updateButtons(id);
	} else {
		calcPage(id);
		that.updateButtons(id);
	}
	
	jQuery("#frmAction").val(id + "_nav");
	if (doAjax)
	{
		var dialog = false;
		if(ff.struct.get(id) != undefined)
			dialog = ff.struct.get(id).dialog;

		if (dialog)
		{
			ff.ffPage.dialog.doRequest(dialog, {
				"component" : id,
				"section"	: "GridData",
				"callback"	: function () {
					jQuery("a", ff.ffPage.dialog.get(dialog).instance).each(function () {
						var ret_url = ff.history.gup("ret_url", this.href);
						if (ret_url.length)
							this.href = this.href.replace(/ret_url=[^&#]*/, "ret_url=" + ff.ffPageNavigator.fixUrl(ret_url, id, records_per_page));
					});
				}
			});
		}
		else
		{
	    	ff.pluginLoad("ff.ajax", ff.site_path + "/themes/library/ff/ajax.js", function() {
				ff.ajax.doRequest({
					"component" : id,
					"section"	: "GridData",
					"callback"	: function () {
						jQuery("a").each(function () {
							var ret_url = ff.history.gup("ret_url", this.href);
							if (ret_url.length)
								this.href = this.href.replace(/ret_url=[^&#]*/, "ret_url=" + ff.ffPageNavigator.fixUrl(ret_url, id, records_per_page));
						});
					}
				});
			});
		}
	} else {
		jQuery("#frmMain").submit();
	}
},

"prevPage" : function (ev) {
	navigators[ev.data.id].page--;
	if (navigators[ev.data.id].page < 1)
		navigators[ev.data.id].page = navigators[ev.data.id].totpage;
	that.goToPage(ev.data.id, navigators[ev.data.id].page);
},

"nextPage" : function (ev) {
	navigators[ev.data.id].page++;
	if (navigators[ev.data.id].page > navigators[ev.data.id].totpage)
		navigators[ev.data.id].page = 1;
	that.goToPage(ev.data.id, navigators[ev.data.id].page);
},

"prevFrame" : function (ev) {
	navigators[ev.data.id].start_page -= navigators[ev.data.id].page_per_frame;
	if (navigators[ev.data.id].start_page < 1)
		navigators[ev.data.id].start_page = 1;
	navigators[ev.data.id].end_page = navigators[ev.data.id].start_page + navigators[ev.data.id].page_per_frame - 1;
	if (navigators[ev.data.id].end_page > navigators[ev.data.id].totpage)
		navigators[ev.data.id].end_page = navigators[ev.data.id].totpage;

	that.updateButtons(ev.data.id);
},

"nextFrame" : function (ev) {
	navigators[ev.data.id].end_page += navigators[ev.data.id].page_per_frame;
	if (navigators[ev.data.id].end_page > navigators[ev.data.id].totpage)
		navigators[ev.data.id].end_page = navigators[ev.data.id].totpage;
	navigators[ev.data.id].start_page = navigators[ev.data.id].end_page - navigators[ev.data.id].page_per_frame + 1;
	if (navigators[ev.data.id].start_page < 1)
		navigators[ev.data.id].start_page = 1;
	
	that.updateButtons(ev.data.id);
},

"firstPage" : function (ev) {
	navigators[ev.data.id].start_page = 1;
	navigators[ev.data.id].end_page = navigators[ev.data.id].start_page + navigators[ev.data.id].page_per_frame - 1;
	if (navigators[ev.data.id].end_page > navigators[ev.data.id].totpage)
		navigators[ev.data.id].end_page = navigators[ev.data.id].totpage;
	that.updateButtons(ev.data.id);
    that.goToPage(ev.data.id, 1); 
},

"lastPage" : function (ev) {
	navigators[ev.data.id].end_page = navigators[ev.data.id].totpage;
	navigators[ev.data.id].start_page = navigators[ev.data.id].end_page - navigators[ev.data.id].page_per_frame + 1;
	if (navigators[ev.data.id].start_page < 1)
		navigators[ev.data.id].start_page = 1;

	that.updateButtons(ev.data.id);
    that.goToPage(ev.data.id, navigators[ev.data.id].totpage);
},

"fixUrl" : function (ret_url, id, records_per_page) {
	ret_url = unescape(ret_url);

	var params = [];
	var hash_params = ff.hash();

	var new_ret_url	= "";

	if (ret_url.indexOf("?") >= 0)
	{
		new_ret_url	= ret_url.substring(0, ret_url.indexOf("?") + 1);

		ret_url = ret_url.substring(ret_url.indexOf("?") + 1);
		if (ret_url.length) {
			params	= ret_url.split("&");

			for (var i = 0; i < params.length; i++) {
				if (params[i].indexOf("=") >= 0) {
					var parts = params[i].split("=");
					hash_params.set(parts[0], parts[1]);
				}
			}
		}
	}
	else
	{
		new_ret_url	= ret_url + "?";
	}

	hash_params.set(id + "_" + navigators[id].page_parname, navigators[id].page);
	if (records_per_page !== undefined)
		hash_params.set(id + "_" + navigators[id].rec_per_page_parname, navigators[id].rec_per_page);

	hash_params.each(function (key, value) {
		new_ret_url += key + "=" + value + "&";
	});

	return escaped_newurl = escape(new_ret_url).replace(/\//g, "%2F");
}

}; // publics' end

return that;

// code's end.
})();

