(function(){
	
	var Dom = YAHOO.util.Dom;
	var Event = YAHOO.util.Event;
	var Lang = YAHOO.lang;
	var Util = LIGHTHOUSE.util;
	var Animation = LIGHTHOUSE.animation;

	Event.onDOMReadyConstructor('click', function (target, event){
		target = Dom.getAncestorIfAttribute('action', target, true);
		if(target && target.nodeName.toUpperCase() !== "FORM"){
			
			var rowId = Util.getRowId(target);
			var tableName = Util.getTableName(target);

			if(tableName){
				var action = target.getAttribute('action');
				var camelCaseAction =  action.substr(0, 1).toUpperCase() + action.substr(1);
			
				if(rowId && tableName){
					if(LIGHTHOUSE[tableName] && LIGHTHOUSE[tableName].eventSubscribers['on'+camelCaseAction]){
						if(!LIGHTHOUSE[tableName].eventSubscribers['on'+camelCaseAction](target, rowId)){
							YAHOO.util.Event.preventDefault(event); 
						}
					}else{
						throw new Error('Action : "' + action + '" has no event subscriber, please add member on' +
										camelCaseAction + ' to LIGHTHOUSE.'+tableName+'.eventSubscribers that takes the arguments rowId and target');
					}
				}else if(tableName){

					// add commands do not have rowId's
					if(LIGHTHOUSE[tableName] && LIGHTHOUSE[tableName].eventSubscribers['on'+camelCaseAction]){
						if(!LIGHTHOUSE[tableName].eventSubscribers['on'+camelCaseAction](target, tableName)){
							YAHOO.util.Event.preventDefault(event);
						}
					}else{
						throw new Error('Action : "' + action + '" has no event subscriber, please add member on' +
										camelCaseAction + ' to LIGHTHOUSE.'+tableName+'.eventSubscribers that takes the arguments tableName and target');
					}
				}
			}
		}
	});

	Event.onDOMReady(function(e){
		Dom.addClass(document.body, 'javascript-on');
	});

	Event.onDOMReadyConstructor('click', function(target, event){
		target = Dom.getAncestorIfAttribute('type', target, true);
		if(	target.nodeName.toUpperCase() === 'BUTTON' && 
			target.getAttribute('type') &&
			target.form &&
			target.form.getAttribute('type') &&
			target.getAttribute('type').toUpperCase() === 'SUBMIT' && 
			target.form.getAttribute('type').toUpperCase() === 'AJAX'){
				
				var form = target.form;

				Event.preventDefault(event);
				var requestLocation = form.getAttribute('action').split('/');
				var controller = requestLocation[requestLocation.length - 2];
				var method = requestLocation[requestLocation.length - 1];
				
				var Connect = Util.Connect(controller);
				Connect.request(method, null, form, event);
		}

	});

	Event.onDOMReadyConstructor('change', function(target, event){

		if(target && target.nodeName.toUpperCase() !== "FORM"){
			
			var rowId = Util.getRowId(target);
			var tableName = Util.getTableName(target);

			if(tableName){
				var action = target.getAttribute('action');
				var camelCaseAction =  action.substr(0, 1).toUpperCase() + action.substr(1);
			
				if(rowId && tableName){
					if(LIGHTHOUSE[tableName] && LIGHTHOUSE[tableName].eventSubscribers['afterSelect'+camelCaseAction]){
						if(!LIGHTHOUSE[tableName].eventSubscribers['afterSelect'+camelCaseAction](target, rowId)){
							YAHOO.util.Event.preventDefault(event); 
						}
					}else{
						throw new Error('Action : "' + action + '" has no event subscriber, please add member afterSelect' +
										camelCaseAction + ' to LIGHTHOUSE.'+tableName+'.eventSubscribers that takes the arguments rowId and target');
					}
				}else if(tableName){

					// add commands do not have rowId's
					if(LIGHTHOUSE[tableName] && LIGHTHOUSE[tableName].eventSubscribers['afterSelect'+camelCaseAction]){
						if(!LIGHTHOUSE[tableName].eventSubscribers['afterSelect'+camelCaseAction](target, tableName)){
							YAHOO.util.Event.preventDefault(event);
						}
					}else{
						throw new Error('Action : "' + action + '" has no event subscriber, please add member afterSelect' +
										camelCaseAction + ' to LIGHTHOUSE.'+tableName+'.eventSubscribers that takes the arguments tableName and target');
					}
				}
			}
		}

	});


	Event.onDOMReady(function(e){
		var controller = document.body.getAttribute('data-controller').toLowerCase();
		var action = document.body.getAttribute('data-action');
		if(LIGHTHOUSE[controller] && LIGHTHOUSE[controller].eventSubscribers[action + 'Load']){
			var template = Dom.getChildAttribute('data-template', null, document.body, true);
			if(!template){ 
				template = action;
			};
			LIGHTHOUSE[controller].eventSubscribers[action + 'Load'](template);
		}
	});

	Event.onDOMReadyConstructor('keyup', function(target, event){
		var maxlength = target.getAttribute('maxlength');
		if(target.nodeName.toUpperCase() === "TEXTAREA" && maxlength){
			var counter = document.getElementById(target.getAttribute('id')+'-maxlength-counter');
			Dom.removeClass(counter.parentNode, 'hide');
			if(target.value.length >= maxlength){
				Dom.addClass(counter, 'max');
				target.value = target.value.substr(0, maxlength);
			}else{
				Dom.removeClass(counter, 'max');
			}
			counter.innerHTML = target.value.length;
		}
	});

})(); 
