// #PLib::PLoad('PLib.Dom.Client.prototype');
// #PLib::PLoad('PLib.Dom.Client.Scripts.lowpro');
// #PLib::PLoad('PLib.Dom.Client.Scripts.PLibEventHandler');
// #PLib::PLoad('PLib.Dom.Client.Scripts.AjaxWaitScreen');

var SubmitLink = Class.create();

SubmitLink.prototype = {
	initialize: function() {
		this.confirmLinks = new Hash();
		this.clickActions = new Hash();
		this.tooSoonHandler = this.linkClickedTooSoon.bindAsEventListener(this);
		this.linkClickedHandler = this.linkClicked.bindAsEventListener(this);
		Event.observe(window, 'click', this.tooSoonHandler);
	//	Event.observe(window, 'load', this.bindToDocument.bindAsEventListener(this));
		Event.onReady(this.bindToDocument.bindAsEventListener(this));
		plibEventHandler.register('beforeRedraw', this.beforeRedraw.bind(this));
		plibEventHandler.register('afterRedraw', this.afterRedraw.bind(this));
	},
	
	bindToDocument: function(event) {

		if(this.tooSoonEl)
		{
			var wait = new AjaxWaitScreen();
			wait.fade();

			var tsl = $(this.tooSoonEl);
			
			var form = tsl.up('form');
			Event.stopObserving(window, 'click', this.tooSoonHandler); 
			if(!this.doSubmit(tsl, form))
			{
				if(event.preventDefault)
				{
					event.preventDefault();
				}
				else
				{
					return false;
				}
			}
		}
		else
		{
			var ctrls = $$('.submit_link');
			var myThis = this;
			ctrls.each(function(ctrl)
			{
				Event.observe(ctrl, 'click', myThis.linkClickedHandler);
				var tmp = ctrl.getAttribute('data-submit-href');
				if(tmp)
				{
					ctrl.href = '#' + tmp;
				}
			});
			Event.stopObserving(window, 'click', this.tooSoonHandler); 
		}
	},
	
	beforeRedraw: function(params) {
		var els = $(params.element).select('.submit_link');
		var myThis = this;
		els.each(function(el) {
			Event.stopObserving(el, 'click', myThis.linkClickedHandler);
		});
	},
	
	afterRedraw: function(params) {
		var els = $(params.element).select('.submit_link');
		var myThis = this;
		els.each(function(el) {
			Event.observe(el, 'click', myThis.linkClickedHandler);
		});
	},
	
	linkClickedTooSoon: function(event)
	{
		var el = Event.element(event);
		if(el.tagName.toLowerCase() != 'a')
		{
			el = el.up('a');
		}
		if(el && el.hasClassName('submit_link'))
		{
			var form = el.up('form');
			if(form)
			{
				if(!el.id)
				{
					if(this.tooSoonEl && ($(this.tooSoonEl).id == 'too_soon_submit_link'))
					{
						$(this.tooSoonEl).id = null;
					}
					el.id = 'too_soon_submit_link';
				}
				this.tooSoonEl = el.id;

				wait = new AjaxWaitScreen();
				wait.appear();
				
				if(event.preventDefault)
				{
					event.preventDefault();
				}
				else
				{
					return false;
				}				
			}
		}
	},
		
	linkClicked: function(event)
	{
		var el = Event.element(event);
		if(el.tagName.toLowerCase() != 'a')
		{
			el = el.up('a');
		}
		var form = el.up('form');
		if(form)
		{
			if(!this.doSubmit(el, form))
			{
				if(event.preventDefault)
				{
					event.preventDefault();
				}
				else
				{
					return false;
				}	
			}
		}
		return;
	},
	
	doSubmit: function (el, form)
	{
		var stop = false;
		this.clickActions.each(function(pair) {
			if(el.hasClassName(pair.key))
			{
				if(pair.value(form))
				{
					stop = true;
				}
			}
		});
		if(!stop)
		{
			if(typeof(el.id) !== 'undefined')
			{
				var conf = this.confirmLinks.get(el.id);
				if(typeof(conf) !== 'undefined')
				{
					if(confirm(conf) == false)
					{
						return false;
					}
				}
			} 
			var action = el.getAttribute('data-submit-href');
			if(!action)
			{
				action = el.href;
			}
			if((typeof(ajaxPLibCall) != "undefined") && (ajaxPLibCall.ajaxWorks()) && el.hasClassName('ajax_call'))
			{
				if(typeof(autoState) != "undefined")
				{
					autoState.fillAutoState(form);
				}
				ajaxPLibCall.doPostCall(action, form);
			}
			else
			{
				form.action = action;
				if(typeof(autoState) != "undefined")
				{
					autoState.fillAutoState(form);
				}
				form.submit();
			}
		}	
	},
	
	addConfirmLink: function(element, text)
	{
		this.confirmLinks.set(element, text);
	},
	
	addClickAction: function(cls, lst)
	{
		this.clickActions.set(cls, lst);
	}
}

var submitLink = new SubmitLink();

