function urlencode(str) {
	return escape(str).replace('+', '%2B').replace('%20', '+').replace('*', '%2A').replace('/', '%2F').replace('@', '%40').replace('&', '%26');
}

function trim(str, charlist) {

	var whitespace, l = 0, i = 0;
	str += '';
    
	if (!charlist) {
		// default list
		whitespace = " \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";
	} else {
		// preg_quote custom list
		charlist += '';
		whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
	}
    
	l = str.length;
	for (i = 0; i < l; i++) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {
			str = str.substring(i);
			break;
		}
	}
    
	l = str.length;
	for (i = l - 1; i >= 0; i--) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {
			str = str.substring(0, i + 1);
			break;
		}
	}
    
	return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}

function permittedCharacters(str, charlist) {

	if (! charlist ) charlist = 'abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ1234567890/.-_';
	
	var returnString = '';
	var stringLength = str.length;
	
	for (var i =0; i <= stringLength; i++) {
		if (charlist.indexOf(str[i]) >= 0) returnString += str[i];
	}
	
	return returnString;

}

function toCurrency(value) {
	if (is_numeric(value)) {
		newValue = new Number(value);
	} else {
		newValue = 0;
	}
	return newValue.toFixed(2);
}

function is_numeric( mixed_var ) {
	return !isNaN(mixed_var * 1);
}

function is_colour( hexcolor ) {
	var strPattern = /^#([0-9a-f]{1,2}){3}$/i;
	return strPattern.test(hexcolor);
}

var strings = {
	
	validateEmail: function( sEmail )
	{	
		var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
		var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
		var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
		var sQuotedPair = '\\x5c[\\x00-\\x7f]';
		var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
		var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
		var sDomain_ref = sAtom;
		var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
		var sWord = '(' + sAtom + '|' + sQuotedString + ')';
		var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
		var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
		var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
		var sValidEmail = '^' + sAddrSpec + '$'; // as whole string
  
		var reValidEmail = new RegExp(sValidEmail);
  
		if (reValidEmail.test(sEmail)) {
			return true;
		}
  
		return false;
	},

	in_array: function(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;
	},
	
	// Return array with key <-> value flipped  
	array_flip: function (trans) {
		
		var key, tmp_ar = {};
		for (key in trans) {
			tmp_ar[trans[key]] = key;
		}
 
		return tmp_ar;
	},
	
	assoc_array_sort: function( arr, values ) {
		
		if ( ! values ) values = true;
		else values = false;
		
		// if required, flip the array to sort on the values
		if ( values ) arr = strings.array_flip( arr );
		
		// Setup Arrays
		var sortedKeys = new Array();
		var sortedObj = {};

		// Separate keys and sort them
		for (var i in arr){
			sortedKeys.push(i);
		}
		sortedKeys.sort();

		// Reconstruct sorted obj based on keys
		for (var i in sortedKeys){
			sortedObj[sortedKeys[i]] = arr[sortedKeys[i]];
		}
		
		// if required, flip the arrayback
		if ( values ) arr = strings.array_flip( arr );
		
		return sortedObj;


	},
	
	trim: function() {
		
		var whitespace, l = 0, i = 0;
		str += '';

		if (!charlist) {
			// default list
			whitespace = " \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";
		} else {
			// preg_quote custom list
			charlist += '';
			whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
		}

		l = str.length;
		for (i = 0; i < l; i++) {
			if (whitespace.indexOf(str.charAt(i)) === -1) {
				str = str.substring(i);
				break;
			}
		}

		l = str.length;
		for (i = l - 1; i >= 0; i--) {
			if (whitespace.indexOf(str.charAt(i)) === -1) {
				str = str.substring(0, i + 1);
				break;
			}
		}

		return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';		
	
}
}
