var CoreWebApp = Class.create({
	initialize: function(page, ajax) {
		this.ajax = ajax;
		this.currentPage = page;
		// this.selectionOptions = null;

		this._parse = this.parseSelectors.bind(this);
	},

	parseSelectors: function(searchelement) {
		this.classOptions.each(function(myitem) {
			var elements = searchelement.select(myitem.cssClass); // $$(item.cssClass);
			for (var index = 0, len = elements.length; index < len; ++index) {
				var element = elements[index];

				if (!Object.isUndefined(myitem.onclick))    element.observe('click',    myitem.onclick);
				if (!Object.isUndefined(myitem.onchange))   element.observe('change',   myitem.onchange);
				if (!Object.isUndefined(myitem.onfocus))    element.observe('focus',    myitem.onfocus);
				if (!Object.isUndefined(myitem.onblur))     element.observe('blur',     myitem.onblur);
				if (!Object.isUndefined(myitem.onkeydown))  element.observe('keydown',  myitem.onkeydown);
				if (!Object.isUndefined(myitem.onkeyup))    element.observe('keyup',    myitem.onkeyup);
				if (!Object.isUndefined(myitem.onkeypress)) element.observe('keypress', myitem.onkeypress);
				if (!Object.isUndefined(myitem.onmousedown))element.observe('mousedown',myitem.onmousedown);
				if (!Object.isUndefined(myitem.onmouseup))  element.observe('mouseup',  myitem.onmouseup);
				if (!Object.isUndefined(myitem.onmousemove))element.observe('mousemove',myitem.onmousemove);

				if (!Object.isUndefined(myitem.action)) {
					var func = myitem.action;
					func(element);
				}

				if (!Object.isUndefined(myitem.attributes)) {
					var keys = Object.keys(myitem.attributes);
					for(var i=0,len1 = keys.length;i<len1;++i) {
						element.writeAttribute(keys[i], myitem.attributes[keys[i]]);
						// element[keys[i]] = item.attributes[keys[i]];
					}
				}
			}
		}.bind(this));
	},

	process: function() {
		return this.ajax.processQueue();
	},

	cancel: function(id) {
		this.ajax.cancel(id);
	},

	// Defer functions
	deferAction: function(call, func, parameters) {
		if (Object.isUndefined(parameters)) parameters = {};

		this.ajax.enqueue(call, parameters, { action: func });
	},

	// Load funcs
	loadContent: function(template, element, parameters, myoptions) {
		if (Object.isUndefined(parameters)) parameters = {};

		var options = $H({
			element: element,
			actionBefore: null,
			action: null,
			actionAfter: null
		}).update(myoptions || {});

		if (options.get('actionAfter') == null) {
			options.set('actionAfter', this._parse);
		}
		else {
			options.set('actionAfter', [this._parse, options.get('actionAfter')]);
		}

		parameters['template'] = template;

		this.ajax.enqueue('loadContent', parameters, options);
	}
});

CoreWebApp.getInstance = function() {
	return this.instance;
}

CoreWebApp.setInstance = function(instance) {
	if (instance instanceof CoreWebApp) {
		this.instance = instance;
	}
}

