var App = (function() {
	var onReadyTasks = [];
	var onLoadTasks = [];
	
	var formUtils = {
		/*
		指定のセレクタで表される要素にエラークラスを追加し、
		エラーメッセージを挿入する
		*/
		insertErrorMessage: function(selector, msg, position, errorClassName) {
			if (!errorClassName) errorClassName = 'error'
			
			var insertObj;
			var msgElm = App.form.errorMessage(msg);
			
			if (position) {
				insertObj = {};
				insertObj[position] = msgElm;
			} else {
				insertObj = msgElm;
			}
			
			$$(selector).each(function(elm) {
				elm.addClassName(errorClassName);
				elm.insert(insertObj);
			});
		},
		
		errorMessage: function(msg, tagName, className) {
			if (!tagName) tagName = 'p';
			if (!className) className = 'errorMessage';
			return new Element(tagName).update(msg).addClassName(className);
		}
	};
	
	var app = {
		init: function() {
		},
		
		cart: function(callback) {
			this.connect('cart', null, callback);
		},
		
		connect: function(message, args, callback) {
			new Ajax.Request('/app.php?message=' + message, {
				parameters: args,
				onSuccess: function(tx) {
					callback(tx.responseJSON);
				}.bind(this),
				
				onFailure: function(tx) {
					alert('fail', tx);
				}
			});
		},
		
		onReady: function(task) {
			if (onReadyTasks) {
				onReadyTasks.push(task);
			} else {
				task();
			}
		},
		
		onLoad: function(task) {
			if (onLoadTasks) {
				onLoadTasks.push(task);
			} else {
				task();
			}
		},
		
		form: formUtils
	};
	
	document.observe('dom:loaded', function(ev) {
		app.init();
		
		var tasks = onReadyTasks;
		onReadyTasks = null;
		tasks.each(function(task) { task(); });
	});
	
	Event.observe(window, 'load', function(ev) {
		var tasks = onLoadTasks;
		onLoadTasks = null;
		tasks.each(function(task) { task(); });
	});
	
	return app;
})();

	
