function joinFields(someForm, fieldsArray, keyDelim, pairDelim, prependStr, postpendStr) {
	if (!prependStr) var prependStr = "";
	if (!postpendStr) var postpendStr = "";
	var wipString = joinedString = "";
	for (var i=0; i<fieldsArray.length; i++) {
		if (((fieldsArray[i].type == "radio") || (fieldsArray[i].type == "checkbox")) && !fieldsArray[i].checked) continue;
		if (!fieldsArray[i].value) continue;
		var fieldLabel = (someForm[fieldsArray[i].name + "_displaylabel"]) ? someForm[fieldsArray[i].name + "_displaylabel"].value : fieldsArray[i].name;
		if (keyDelim) wipString += fieldLabel + keyDelim + fieldsArray[i].value + pairDelim;
		else  wipString += fieldsArray[i].value + pairDelim;
	}
	if (wipString) joinedString = (wipString.lastIndexOf(pairDelim) == (wipString.length - pairDelim.length)) ? prependStr + wipString.substring(0, wipString.lastIndexOf(pairDelim)) + postpendStr : prependStr + wipString + postpendStr;
	return joinedString;
}

function getFieldCollection(someForm, idPrefix) {
	var fieldsArr=[];
	var fields=[];
	
	var _filter = function(func, ctx) { //until filter method is available for array objcts natively for all browsers 
		ctx = (!ctx)?this:ctx;
		var res = [];
	    for (var i = 0, len=this.length; i < len; i++)
	    {
	      if (i in this)
	      {
	        var item = this[i]; // in case func mutates this
	        if (func.apply(ctx, [item, i, this]))
	          res.push(item);
	      }
	    }
	    return res;
	}
	
	var _nodelistToArray = function(list) {
		return _filter.apply(list, [function(){return true;}]);
	};
	
	var inputFields = someForm.getElementsByTagName('input');
	inputFields = _filter.apply(inputFields, [function(item, idx, arr){ 
		var isOK=false;
		if(typeof item.type!='undefined' && /^checkbox|radio$/.test(item.type)) { //we want only input type = radios and checkboxes
			isOK=true;
		}
		return isOK;
	}]);
	
	var selectFields = someForm.getElementsByTagName('select') || [];
	selectFields = _nodelistToArray(selectFields);                //convert nodelist to array
	
	var textareaFields = someForm.getElementsByTagName('textarea') || [];
	textareaFields = _nodelistToArray(textareaFields);           //convert nodelist to array
	
	var arr = [].concat(inputFields).concat(selectFields).concat(textareaFields);
	
	_filter.apply(arr, [function(item, idx, arr){ //not just filtering though, we also create a nested array
		var itemid = null;
		var regex = new RegExp('^'+idPrefix+'(\\d+)$');
		if(item.id) {
			var pos = regex.exec(item.id);
			if(!pos) return false;
			pos = parseInt(pos[1]);
			if(!fieldsArr[pos]) {
				fieldsArr[pos]=[];
			}
			
			//next get all sibling items for this item (applicable for checkbox|radio)
			if(item!=someForm[item.name]) {
				var itemname = item.name
				for (var j=0, len=someForm[itemname].length; j<len; j++) fieldsArr[pos].push(someForm[itemname][j]);
			} else {
				fieldsArr[pos].push(item);
			}
			
		} else {
			return false;
		}
	}]);
	
	//trim the empty slots
	arr = _filter.apply(fieldsArr, [function(item, idx, arr){
		return (item && typeof item.splice=='function')?true:false;
	}]);
	
	for(i in arr) {
		for (j in arr[i]) {
			fields.push(arr[i][j]);
		}
	}
	return fields;
}

