var xmlBuilder = (function(){
	var APOS = "'"; QUOTE = '"';
	var ESCAPED_QUOTE = {  };
	ESCAPED_QUOTE[QUOTE] = '&quot;';
	ESCAPED_QUOTE[APOS] = '&apos;';
	function _formatAttributes(attributes) {
    	var att_value;
	    var apos_pos, quot_pos;
	    var use_quote, escape, quote_to_escape;
	    var att_str;
	    var re;
	    var result = '';

	    for (var att in attributes) {
	        att_value = attributes[att];
	        apos_pos = att_value.indexOf(APOS);
	        quot_pos = att_value.indexOf(QUOTE);
	        if (apos_pos == -1 && quot_pos == -1) {
	            att_str = ' ' + att + "='" + att_value +  "'";
	            result += att_str;
	            continue;
	        }
	        if (quot_pos != -1 && quot_pos < apos_pos) {
	            use_quote = APOS;
	        } else {
	            use_quote = QUOTE;
	        }
	        escape = ESCAPED_QUOTE[use_quote];
	        re = new RegExp(use_quote,'g');
	        att_str = ' ' + att + '=' + use_quote + 
	            att_value.replace(re, escape) + use_quote;
	        result += att_str;
	    }
    	return result;
	};
	return {
		xmlElement: function (name,content,attributes){
	    	var att_str = '';
		    if (attributes) { // tests false if this arg is missing!
		        att_str = _formatAttributes(attributes);
		    }
		    var xml;
		    if (!content){
		        xml='<' + name + att_str + '/>';
		    }
		    else {
		        xml='<' + name + att_str + '>' + content + '</'+name+'>';
		    }
		    return xml;
		}
	};
})();
