/* PAGER
***************************************************************************************************/
var Pager = Class.create(
{
//{ Constructor
	initialize: function(owner, containerId, requestUrl, requestParams, urlVarName, pagerCssIdent)
	{
		this.owner = owner;
		this.htmlIdent = owner.htmlIdent;
		this.container = $(containerId);
		this.containerId = containerId;
		this.requestUrl = requestUrl;
		this.params = requestParams;
		this.urlVarName = urlVarName;
		this.pagerCssIdent = pagerCssIdent;
		this.controlManager = owner.controlManager;
		this.content = null;

		this._activeButton = null;
		this._controls = new Array();
		this._onFailureHandler = owner._onFailureHandler;
		this._transactions = new RequestTransactionsManager(this.container);

		this.registerControls();
		Event.observe(this.container, 'RequestTransactionsManager:transactionsComplete', function(){
			this.container.fire("Pager:transactionsComplete");
		}.bind(this));
	},
//}
//{ Public methods
	createControls: function()
	{
		this.controlManager.destroyControls(this._controls);
		this.controlManager.registerElements(new PageControlType(this.pagerCssIdent + ' a.button', "AJsButton"))
		this.container = $(this.containerId);
		this._transactions.changeContainer(this.container);
		this.registerControls();
	},

	registerControls: function()
	{
		this._activeButton = null;
		var buttonClickDelegate = function(event){
			this._onButtonClick(event.memo.control);
		}.bind(this);

		this._controls = this.controlManager.getControls($$(this.pagerCssIdent + ' a.button'));
		for(var i=0; i<this._controls.length; i++){
			this._controls[i].setEventParams({control: this._controls[i]});
			Event.observe(this._controls[i].element, 'Control:click', buttonClickDelegate);
		}
		this.controlManager.setStatus(this._controls, PageControlStatuses.clear);
	},

	block: function()
	{
		for(var i=0; i<count(this._controls.length); i++){
			this._controls[i].setStatus(this._controls[i].statuses.disabled);
		}
	},

	unblock: function()
	{
		for(var i=0; i<count(this._controls.length); i++){
			this._controls[i].setStatus(this._controls[i].statuses.clear);
		}
	},

	sendRequest: function()
	{
		this._activeButton.setStatus(this._activeButton.statuses.active);
		var onSuccessHandler = function(transport, json){
			if (json == null){
				showFatalError(transport.responseText);
				return;
			}
			this.content = transport.responseText;
			this._transactions.remove();
			this.container.fire("Pager:receiveResponse");
		}.bind(this);
		var value = this._activeButton.element.href.substr(this._activeButton.element.href.indexOf("#")+1);
		this.params.set(this.urlVarName, value);
		this.container.fire("Pager:sendRequest");
		this._transactions.add();
		new Ajax.Request(this.requestUrl, {
			parameters: this.params.toQueryString(),
			onSuccess: onSuccessHandler,
			onFailure: function(){
				this._transactions.remove();
				this._onFailureHandler();
			}.bindAsEventListener(this)
		});
	},


	sendStaticRequest: function(value)
	{
		var onSuccessHandler = function(transport){
			if (transport.headerJSON == null){
				showFatalError(transport.responseText);
				return;
			}
			this.content = transport.responseText;
			this._transactions.remove();
			this.container.fire("Pager:receiveResponse");
		};

		this.params.set(this.urlVarName, value);
		this.container.fire("Pager:sendRequest");
		this._transactions.add();

		new Ajax.Request(this.requestUrl, 
		{   
			parameters: this.params.toQueryString(),
			onSuccess: onSuccessHandler.bindAsEventListener(this),
			onFailure: function(){
				this._transactions.remove();
				this._onFailureHandler();
			}.bindAsEventListener(this)
		}); 

	},
//}

//{ Private methods
	_onButtonClick: function(control)
	{
		if(this._activeButton != null){
			this._activeButton.setStatus(this._activeButton.statuses.clear);
		}
		this._activeButton = control;
		this.container.fire("Pager:buttonClick");
	}
//}
});
ScriptsManager.registerScript("Pager");
