var Lazzo = {};

Lazzo.Catching = Class.create({
	initialize: function() {
		
	},
	error: function(module, error) {
		try {
			console.log(module+' throws error:');
			console.log(error);
		} catch (e) {};
	}
});
Lazzo.catching = new Lazzo.Catching();

Lazzo.BroadCast = Class.create({
	initialize: function() {
		this.handlers = $H();
	},
	addHandler: function(eventname, func) {
		if (this.handlers.get(eventname)) {
			var handlers = this.handlers.get(eventname);
		} else {
			var handlers = $A();
		}
		handlers.push(func);
		this.handlers.set(eventname, handlers);
	},
	broadCast: function(eventname, memo) {
		var handlers = this.handlers.get(eventname);
		if (handlers) {
			handlers.each(function(func) {
				var f = function(){try{func(memo);} catch(e){ Lazzo.catching.error('Listener for ' + eventname, e); }};
				f.defer();
			});
		}
	},
	hasHandlersFor: function( eventname ) {
		return this.handlers.get(eventname);
	},
	removeHandlersFor: function( eventname ) {
		this.handlers.unset( eventname );
	}

});
Lazzo.broadCast = new Lazzo.BroadCast();

Lazzo.Mixin = Class.create({
	log: function(message) {
		try { console.log(message); } catch (e) {};
	},
	broadcast: function(eventname, memo) {
		Lazzo.broadCast.broadCast(eventname, memo);
	},
	listen: function(eventname, func) {
		Lazzo.broadCast.addHandler(eventname, func);
	},
	resetAndListen: function(eventname, func) {
		Lazzo.broadCast.removeHandlersFor(eventname);
		Lazzo.broadCast.addHandler(eventname, func);
	},
	hasListenersFor: function(eventname) {
		return typeof Lazzo.broadCast.hasHandlersFor(eventname) != 'undefined';
	},
	setGlobal: function(key, value) {
		Lazzo.Mixin.global.set(key, value);
	},
	getGlobal: function(key) {
		return Lazzo.Mixin.global.get(key);
	},
	handle: function(element, array) {
		var handlers = [];
		array.each(function(event) {
			handlers.push (element.on(event, this['handle'+event.capitalize()].bind(this)) );
		}.bind(this));
		return handlers;
	},
	readConfig: function(element, key) {
		var config = element.readAttribute('data-widget-config');
		if (!config) { return {}; }
		config = config.gsub("'", '"');
		if (!config.isJSON()) {
			throw 'No valid json config';
			return;
		}
		var configObj = config.evalJSON();
		if (!configObj[key]) {
			throw 'No valid config key';
			return;
		}
		return configObj[key];
	},
	onchangedo: function(element, func) {
		return element.on('change', func.bind(this));
	},
	getScrollContainer: function(element) {
		// cache this.
		if (this.scrollcontainer) { return this.scrollcontainer;}
		var element = element;
		var scrollcontainer = null;
		while ((element = element.parentNode) && element !== document.body) {
			if (element.getStyle('overflow') != 'visible' && element.getStyle('overflow') != 'hidden') {
				scrollcontainer = element;
			}
		}
		if (!scrollcontainer) {
			scrollcontainer = $(document.body);
		}
		this.scrollcontainer = scrollcontainer;
		return this.scrollcontainer;
	}
	
});
Lazzo.Mixin.global = new Hash();













