function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function str_replace(haystack, needle, replacement) {
    var temp = haystack.split(needle);
    return temp.join(replacement);
}

function str_replace_reg(haystack, needle, replacement) {
    var r = new RegExp(needle, 'g');
    return haystack.replace(r, replacement);
}

sprintfWrapper = {
	init : function () { 
		
		if (typeof arguments == "undefined") { return null; } 
		if (arguments.length < 1) { return null; } 
		if (typeof arguments[0] != "string") { return null; } 
		if (typeof RegExp == "undefined") { return null; } 
		
		var string = arguments[0]; 
		var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g); 
		var matches = new Array(); 
		var strings = new Array(); 
		var convCount = 0; 
		var stringPosStart = 0; 
		var stringPosEnd = 0; 
		var matchPosEnd = 0; 
		var newString = ''; 
		var match = null; 
		
		while (match = exp.exec(string)) { 
			if (match[9]) { convCount += 1; } 
			stringPosStart = matchPosEnd; 
			stringPosEnd = exp.lastIndex - match[0].length; 
			strings[strings.length] = string.substring(stringPosStart, stringPosEnd); 
			matchPosEnd = exp.lastIndex; 
			matches[matches.length] = { 
				match: match[0], left: match[3] ? true : false, sign: match[4] || '', pad: match[5] || ' ', min: match[6] || 0, precision: match[8], code: match[9] || '%', negative: parseInt(arguments[convCount]) < 0 ? true : false, argument: String(arguments[convCount]) 
			}; 
		} 
		strings[strings.length] = string.substring(matchPosEnd); 
		if (matches.length == 0) { return string; } 
		if ((arguments.length - 1) < convCount) { return null; } 
		
		var code = null; 
		var match = null; 
		var i = null; 
		for (i=0; i<matches.length; i++) { 
			if (matches[i].code == '%') { substitution = '%' } 
			else if (matches[i].code == 'b') { 
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2)); 
				substitution = sprintfWrapper.convert(matches[i], true); 
			}else if (matches[i].code == 'c') { 
				matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument))))); 
				substitution = sprintfWrapper.convert(matches[i], true); 
			}else if (matches[i].code == 'd') { 
				matches[i].argument = String(Math.abs(Math.floor(parseFloat(matches[i].argument)))); 
				substitution = sprintfWrapper.convert(matches[i]);
			}else if (matches[i].code == 'f') { 
				matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6)); 
				substitution = sprintfWrapper.convert(matches[i]); 
			} else if (matches[i].code == 'o') { 
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8)); 
				substitution = sprintfWrapper.convert(matches[i]); 
			} else if (matches[i].code == 's') { 
				matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length); 
				substitution = sprintfWrapper.convert(matches[i], true); 
			} else if (matches[i].code == 'x') { 
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16)); 
				substitution = sprintfWrapper.convert(matches[i]); 
			} else if (matches[i].code == 'X') { 
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16)); 
				substitution = sprintfWrapper.convert(matches[i]).toUpperCase(); 
			} else { substitution = matches[i].match; } 
			
			newString += strings[i]; 
			newString += substitution;
		} 
		
		newString += strings[i]; 
		return newString; 
	}, 
	
	convert : function(match, nosign){ 
	
		if (nosign) { match.sign = ''; } 
		else { match.sign = match.negative ? '-' : match.sign; } 
		
		var l = match.min - match.argument.length + 1 - match.sign.length; 
		var pad = new Array(l < 0 ? 0 : l).join(match.pad); 
		if (!match.left) { 
			if (match.pad == "0" || nosign) { return match.sign + pad + match.argument; } 
			else { return pad + match.sign + match.argument; } 
		} 
		else { 
			if (match.pad == "0" || nosign) { 
				return match.sign + match.argument + pad.replace(/0/g, ' '); 
			}else{
				return match.sign + match.argument + pad; 
			} 
		} 
	} 
}
sprintf = sprintfWrapper.init;

function pad(str, len, pad, dir) {

	var STR_PAD_LEFT = 1;
	var STR_PAD_RIGHT = 2;
	var STR_PAD_BOTH = 3;

    if (typeof(len) == "undefined") { var len = 0; }
    if (typeof(pad) == "undefined") { var pad = ' '; }
    if (typeof(dir) == "undefined") { var dir = STR_PAD_RIGHT; }

    if (len + 1 >= str.length) {

        switch (dir){

            case STR_PAD_LEFT:
                str = Array(len + 1 - str.length).join(pad) + str;
            break;

            case STR_PAD_BOTH:
                var right = Math.ceil((padlen = len - str.length) / 2);
                var left = padlen - right;
                str = Array(left+1).join(pad) + str + Array(right+1).join(pad);
            break;

            default:
                str = str + Array(len + 1 - str.length).join(pad);
            break;

        }

    }

    return str;

}

function traiteRetourChariot(chaine, remplacement){
	return str_replace(new String(chaine), "\n", remplacement); 
}

function enleveDomaineCurr(chaine){
	var loc=new String(document.location);
	var tabPart=loc.split("/");
	var httpHost=tabPart[2];
	
	var domaine="http://"+httpHost;
	
	return str_replace(chaine,domaine,"");	
}


