function URLEncode(input)
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";
	
	var plaintext = input;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else
		{
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255)
			{
				//console.log('charCode > 255: charCode = '+charCode);
				encoded += ch;
				/*
			    alert( "Unicode Character '" 
                        + ch 
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
				*/
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for
	return encoded;
};

function URLDecode(input)
{
   var HEXCHARS = "0123456789ABCDEFabcdef"; 
   var encoded = input;
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while	
   return plaintext;
};

jQuery.fn.extend({gatherFormData: function()
{
	var formdata = {};
	
	this.find('input').not('.button').not('[type=checkbox]').map(function() {
		formdata[this.name] = URLEncode(this.value);
	});
		
	this.find('input').not('.button').filter('[type=checkbox]').map(function() {
		if (jQuery(this).attr('checked')) formdata[this.name] = URLEncode(jQuery(this).attr('value'));
	});
	
	this.find('input').not('.button').filter('[type=radio]').map(function(){
		if (jQuery(this).attr('checked')) formdata[this.name] = URLEncode(jQuery(this).attr('value'));
	});
			
	this.find('select').map(function() {
		formdata[this.name] = URLEncode(this.value);
	});
		
	this.find('textarea').map(function() {
		formdata[this.name] = URLEncode(jQuery(this).val());
	});
	
	return formdata;
}});

// Php like function that checks if the given value exists in the array
function in_array (needle, haystack, argStrict)
{
	var key = '', strict = !!argStrict; 
	if(strict)
	{
		for(key in haystack)
		{
			if(haystack[key] === needle)
			{
				return true;
			}
		}
	}
	else
	{
		for(key in haystack)
		{
			if(haystack[key] == needle)return true;
		}
	}
	return false;
}

// Function that checks if the given variable is defined
function isdefined(variable)
{
	return (typeof variable != 'undefined');
}

// Php like function that strips the slashes from a given string
function stripslashes(str)
{
	return (str+'').replace(/\\(.?)/g, function(s, n1)
	{
        switch(n1)
		{
            case '\\':
                return '\\';
            case '0':
				return '\u0000';
            case '':
                return '';
            default:
                return n1;
		}
    });
}

// Php like function that replaces all occurrences of search in haystack
function str_replace (search, replace, subject, count)
{
    f = [].concat(search),
    r = [].concat(replace),
    s = subject,
    ra = r instanceof Array, sa = s instanceof Array;    s = [].concat(s);
    if (count) {
        this.window[count] = 0;
    }
     for (i=0, sl=s.length; i < sl; i++) {
        if (s[i] === '') {
            continue;
        }
        for (j=0, fl=f.length; j < fl; j++) {            temp = s[i]+'';
            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
            s[i] = (temp).split(f[j]).join(repl);
            if (count && s[i] !== temp) {
                this.window[count] += (temp.length-s[i].length)/f[j].length;}
		}
    }
    return sa ? s : s[0];
}
