//Extend the String object so that we can use the trim() function like; sVar.trim();
String.prototype.trim = function() {
  a = this.replace(/^\s+/, '');
  return a.replace(/\s+$/, '');
};

// http://kevin.vanzonneveld.net
// +   original by: Philip Peterson
// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// *     example 1: var test="Kevin+van+Zonneveld%21"; test.urldecode();
// *     returns 1: 'Kevin van Zonneveld!'
String.prototype.urldecode = function() {
  ret = this.replace(/\+/g, '%20');
  ret = decodeURIComponent(ret);
  ret = ret.toString();
  return ret;
}

// http://kevin.vanzonneveld.net
// +   original by: Philip Peterson
// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +      input by: AJ
// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +   improved by: Brett Zamir
// %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
// *     example 1: urlencode('Kevin van Zonneveld!');
// *     returns 1: 'Kevin+van+Zonneveld%21'
// *     example 2: urlencode('http://kevin.vanzonneveld.net/');
// *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
// *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
// *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
String.prototype.urlencode = function() {
  var histogram = {}, tmp_arr = [];
  var ret = this.toString();

  var replacer = function(search, replace, str) {
    var tmp_arr = [];
    tmp_arr = str.split(search);
    return tmp_arr.join(replace);
  };

  // The histogram is identical to the one in urldecode.
  histogram["'"]   = '%27';
  histogram['(']   = '%28';
  histogram[')']   = '%29';
  histogram['*']   = '%2A';
  histogram['~']   = '%7E';
  histogram['!']   = '%21';
  histogram['%20'] = '+';

  // Begin with encodeURIComponent, which most resembles PHP's encoding functions
  ret = encodeURIComponent(ret);

  for (search in histogram) {
    replace = histogram[search];
    ret = replacer(search, replace, ret) // Custom replace. No regexing
  }

  // Uppercase for full PHP compatibility
  return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
    return "%"+m2.toUpperCase();
  });

  return ret;
}

// http://kevin.vanzonneveld.net
// +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// +   improved by: Waldo Malqui Silva
// +   bugfixed by: Onno Marsman
// *     example 1: ucwords('kevin van zonneveld');
// *     returns 1: 'Kevin Van Zonneveld'
// *     example 2: ucwords('HELLO WORLD');
// *     returns 2: 'HELLO WORLD'
String.prototype.ucwords = function() {
  return (this+'').replace(/^(.)|\s(.)/g, function ( $1 ) { return $1.toUpperCase ( ); } );
}

// http://kevin.vanzonneveld.net
// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +   improved by: Onno Marsman
// *     example 1: strpos('Kevin van Zonneveld', 'e', 5);
// *     returns 1: 14
String.prototype.strpos = function(needle, offset){
  var i = (this+'').indexOf( needle, offset );
  return i===-1 ? false : i;
}

// Simple Debug, written by Chris Klimas
// licensed under the GNU LGPL.
// http://www.gnu.org/licenses/lgpl.txt
//
// There are three functions defined here:
//
// log (message)
// Logs a message. Every second, all logged messages are displayed
// in an alert box. This saves you from having to hit Return a ton
// of times as your script executes.
//
// inspect (object)
// Logs the interesting properties an object possesses. Skips functions
// and anything in CAPS_AND_UNDERSCORES.
//
// inspectValues (object)
// Like inspect(), but displays values for the properties. The output
// for this can get very large -- for example, if you are inspecting
// a DOM element.
function log (message) { if (! _log_timeout) _log_timeout = window.setTimeout(dump_log, 1000); _log_messages.push(message);
function dump_log() { var message = ''; for (var i = 0; i < _log_messages.length; i++) message += _log_messages[i] + '\n'; alert(message); _log_timeout = null; delete _log_messages; _log_messages = new Array(); } }
function inspect (obj) { var message = 'Object possesses these properties:\n'; if (obj) { for (var i in obj) { if ((obj[i] instanceof Function) || (obj[i] == null) || (i.toUpperCase() == i)) continue; message += i + ', '; } message = message.substr(0, message.length - 2); } else message = 'Object is null'; log(message); }
function inspectValues (obj) { var message = ''; if (obj) for (var i in obj) { if ((obj[i] instanceof Function) || (obj[i] == null) || (i.toUpperCase() == i)) continue; message += i + ': ' + obj[i] + '\n'; } else message = 'Object is null'; log(message); } var _log_timeout; var _log_messages = new Array();
