var form2query = function () {

	var object2query = function (obj, parentObj) {
		var qs = '';
		if (typeof obj === 'object') {
			for (var prop in obj) {
				if (obj.hasOwnProperty(prop)) {
					var n = prop;
					if (obj[prop] instanceof Array) {
						for (var i = 0,j = obj[prop].length; i < j; i += 1){
							qs += (typeof obj[prop][i] === 'object') ? '&' + arguments.callee(obj[prop][i], n) : '&' + encodeURIComponent(n) + '=' + encodeURIComponent(obj[prop][i]);
						}
					} else if (obj[prop] instanceof Date) {
						qs += '&' + n + '=' + obj[prop].getTime();
					} else if (obj[prop] instanceof Object) {
						qs += (obj.toString && obj.toString !== Object.prototype.toString) ? '&' + encodeURIComponent(n) + '=' + encodeURIComponent(obj[prop].toString()) : '&' + arguments.callee(obj[prop], n);
					} else {
						qs += '&' + encodeURIComponent(n) + '=' + encodeURIComponent(obj[prop]);
					}
				}
			}
		}
		return qs.replace(/^&/,'');
	};

	var form2object = function (e){
		e = (typeof e === 'string') ? document.getElementById(e) : e; 
		var v,f = {};
		if (e.nodeName.toUpperCase() === 'FORM') { 
			for (var i = 0, o, l = e.elements.length; i < l; i++) {
				o = e.elements[i];
				if (o.disabled !== true && o.name !== '') {
					v = undefined;
					switch (o.type){
						case 'file':
						case 'reset':
							break;
						case 'select-one':
							v = o.options[o.selectedIndex].value;
							break;
						case 'select-multiple':
							v = [];
							for (var j = 0, k = o.options.length; j < k; j++) {
								if (o.options[j].selected === true) {
									v.push(o.options[j].value);
								}
							}
							if (v.length === 0) {
								v = undefined;
							}
							break;
						case 'checkbox':
						case 'radio':
							if (o.checked === true) {
								v = o.value;
							}
							break;
						default:
							if(o.value.length > 0) {
								v = o.value;
							}
							break;
					}
					if (v !== undefined) { 
						f[o.name] = (!f.hasOwnProperty(o.name))  ? o.value : (f[o.name] instanceof Array) ? f[o.name].concat(v) : [].concat(f[o.name], v);
					}
				}
			}
		}
		return f;
	};

	return function (formId) {
		return object2query(form2object(formId), true);
	};
}();

