function trim(myStr, myMask){
	myMask = (myMask == undefined)?' ':myMask;
	return ltrim(rtrim(myStr,myMask),myMask);
}
function ltrim(myStr, myMask){
	myMask = (myMask == undefined)?' ':myMask;
	var newStr	= new String(myStr);
	var strlen	= newStr.length;
	var j		= 0;
	while(newStr.charAt(j) == myMask){
	  j++;
	} 
	if(j > 0){
	  newStr = newStr.substring(j, strlen);
	}
	return newStr;
}
function rtrim(myStr, myMask){
	myMask = (myMask == undefined)?' ':myMask;
	var newStr	= new String(myStr);
	var k		= newStr.length - 1;
	while(newStr.charAt(k) == myMask){
		k--;
	}
	newStr = newStr.substring(0,k+1);
	return newStr;
}
function stringFromObject(myObj, myPrefix){
	if(myPrefix == undefined) myPrefix = new String();
	var myParts				= new Array();
	var myType				= new String();
	var myDelimiter			= '.';
	var myValueSeparator	= ': ';
	var myValue				= new String();
	var myPrepend			= new String();
	for(var i in myObj){
		myType		= typeof(myObj[i]);
		myValue		= '';
		myPrepend	= ((myPrefix.length > 0)?myPrefix+myDelimiter:'')+i;
		switch(myType.toLowerCase()){
			case 'array':
			case 'object':
				myValue	= stringFromObject(myObj[i], myPrepend);
				break;
			default:
				myValue = myPrepend+myValueSeparator+myObj[i];
				break;
		}
		myParts.push(myValue);
	}
	return myParts.join('\n');
}
/*
var myObj = {test:{
	one:{
		one_one:'test',
		one_two:{
			one_two_one:'yeah',
			one_two_two:'yup'
		}
	},
	two:true,
	fun:function(){},
	three:'3'
}}
alert(stringFromObject(myObj));
*/