jQuery.fn.serializeObject = function () {
	var i,name,obj = this.serializeArray();
	var ret={};
	for (i=0; i<obj.length; i++) {
		name=obj[i].name;
		if (!!ret[name]) {
			if (!!ret[name].push)
				ret[name].push(obj[i].value);
			else
				ret[name]=[ret[name],obj[i].value];
		} else
			ret[name]=obj[i].value;
	}
	return ret;
}
jQuery.fn.popup = function (url) {
	if (url == undefined) return this;
	var 
		onClose = function () {
			popup.remove();
		},
		onSubmit = function () {
			var nvp=popup.find('input,select,textarea').serializeObject();
			if (!!nvp.required) {
				var i,rv=nvp.required.split(',');
				for (i=0; i<rv.length; i++)
					if (!nvp[rv[i]]) {
						alert('Please answer all questions before continuing');
						return false;
					}
			}
			popup.load(popup.find('form').attr('action'), nvp, onLoad);
			return false;
		},
		onLoad = function() {
			popup.find('form').submit(onSubmit);
			popup.find('.close').click(onClose);
		},
		popup = jQuery('<div></div>')
			.addClass('popup')
			.load(url,null,onLoad)
			.appendTo(this);
	return this;
}
