function duplicate(o, callback, length){
	var list = [];
	var p = findAncestor(o, "tr"), r = p;
	for(var j = (length = length || 1) || 1; j--;){
		list.unshift(r.cloneNode(true));
		r = findNext(r, "tr");
	}
	for(var j = length; j--;){
		var r = list[j];

		for(var l = r.getElementsByTagName("input"), i = l.length; i--;){
			var f = l[i];
			if(f.type){
				if(!f.type.match(/hidden|button|checkbox/i))
					f.value = "";
				if(f.type == "checkbox")
					f.checked = ""
			}
		}
		for(var l = r.getElementsByTagName("select"), i = l.length; i--;)
		    l[i].selectedIndex = "";

		p.parentNode.appendChild(r);
		//formatFields(p.parentNode.appendChild(r));
	}

	o.src = o.src.replace("more", "less");
	o.onclick = function(){
		remove(this, null, length);
	};
	callback && callback(r);
	return r;
}
function remove(o, callback, length){
	var r = true, o = findAncestor(o, "tr");
	callback && (r = callback(o));
	if(r){
		for(var j = length || 1, r; j--;){
			o = findNext(r = o, "tr");
			r.parentNode.removeChild(r);
		}
	}
}


function duplicateIncrement(o){
	o = duplicate(o);
	for(var l = o.getElementsByTagName("input"), i = l.length; i--;){
		l[i].name = l[i].name.replace(/(_)(\d+)$/, function(_, s, n){
			return s + ++n;
		});
		if(l[i].name == "row_index[]")
			l[i].value = ++l[i].value;
	}
}

