function str_replace(search, replace, subject) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
    // +   improved by: Philip Peterson
    // +   improved by: Simon Willison (http://simonwillison.net)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   bugfixed by: Anton Ongson
    // +      input by: Onno Marsman
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
    // *     returns 1: 'Kevin.van.Zonneveld'
    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
    // *     returns 2: 'hemmo, mars'    
    
    var _is_array = function(mixed_var) {
        return (mixed_var instanceof Array);
    };
    
    var f = search, r = replace, s = subject;
    var ra = _is_array(r), sa = _is_array(s), f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;
 
    while (j = 0, i--) {
        if (s[i]) {
            while (s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
        }
    };
     
    return sa ? s : s[0];
}

function print_r( array, return_val ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Michael White (http://getsprink.com)
    // +   improved by: Ben Bryan
    // *     example 1: print_r(1, true);
    // *     returns 1: 1
    
    var output = "", pad_char = " ", pad_val = 4;
 
    var formatArray = function (obj, cur_depth, pad_val, pad_char) {
        if (cur_depth > 0) {
            cur_depth++;
        }
 
        var base_pad = repeat_char(pad_val*cur_depth, pad_char);
        var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char);
        var str = "";
 
        if (obj instanceof Array || obj instanceof Object) {
            str += "Array\n" + base_pad + "(\n";
            for (var key in obj) {
                if (obj[key] instanceof Array) {
                    str += thick_pad + "["+key+"] => "+formatArray(obj[key], cur_depth+1, pad_val, pad_char);
                } else {
                    str += thick_pad + "["+key+"] => " + obj[key] + "\n";
                }
            }
            str += base_pad + ")\n";
        } else if(obj == null || obj == undefined) {
            str = '';
        } else {
            str = obj.toString();
        }
 
        return str;
    };
 
    var repeat_char = function (len, pad_char) {
        var str = "";
        for(var i=0; i < len; i++) { 
            str += pad_char; 
        };
        return str;
    };
    output = formatArray(array, 0, pad_val, pad_char);
 
    if (return_val !== true) {
        document.write("<pre>" + output + "</pre>");
        return true;
    } else {
        return output;
    }
}

function time_ago_in_words(from_time)
{
  var to_time = Math.round(new Date().getTime()/1000);

  distance_in_minutes = Math.floor(Math.abs(to_time - from_time) / 60);
  distance_in_seconds = Math.floor(Math.abs(to_time - from_time));

  string = '';

  if (distance_in_minutes <= 1)
  {
    string = distance_in_minutes == 0 ? 'moins d\'une minute' : '1 minute';
  }
  else if (distance_in_minutes >= 2 && distance_in_minutes <= 44)
  {
    string = distance_in_minutes+' minutes';
  }
  else if (distance_in_minutes >= 45 && distance_in_minutes <= 89)
  {
    string = 'environ 1 heure';
  }
  else if (distance_in_minutes >= 90 && distance_in_minutes <= 1439)
  {
    string = 'environ '+Math.round(distance_in_minutes / 60)+' heures';
  }
  else if (distance_in_minutes >= 1440 && distance_in_minutes <= 2879)
  {
    string = '1 jour';
  }
  else if (distance_in_minutes >= 2880 && distance_in_minutes <= 43199)
  {
    string = Math.round(distance_in_minutes / 1440)+' jours';
  }
  else if (distance_in_minutes >= 43200 && distance_in_minutes <= 86399)
  {
    string = 'environ un mois';
  }
  else if (distance_in_minutes >= 86400 && distance_in_minutes <= 525959)
  {
    string = Math.round(distance_in_minutes / 43200)+' mois';
  }
  else if (distance_in_minutes >= 525960 && distance_in_minutes <= 1051919)
  {
    string = 'environ 1 an';
  }
  else
  {
    string = 'plus de '+Math.floor(distance_in_minutes / 525960)+' ans';
  }

  return string;
}
