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 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 substr_replace (str, replace, start, length) {
    if (start < 0){ }
    length = length !== undefined ? length : str.length;
    if (length < 0) {
        length = length + str.length - start;
	}
    return str.slice(0, start) + replace.substr(0, length) + replace.slice(length) + str.slice(start+length);
}

function array_search (needle, haystack, argStrict) {
    var strict = !!argStrict;
    var key = '';
 
    for (key in haystack) {
		if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            return key;
        }
    }
	return false;
}

function array_intersect(){
	var arr1 = arguments[0], retArr = {};
    var k1 = '', arr = {}, i = 0, k = '';    
    arr1keys:
    for (k1 in arr1) {
        arrs:
        for (i=1; i < arguments.length; i++) {            
			arr = arguments[i];
			for (k in arr) {
                if (arr[k] === arr1[k1]) {
                    if (i === arguments.length-1) {
                        retArr[k1] = arr1[k1];
					}
                    continue arrs;
                }
            }
            continue arr1keys;
        }
    }
    return retArr;
}

function htmlspecialchars (string, quote_style, charset, double_encode) {
    var optTemp = 0, i = 0, noquotes = false;
    if (typeof quote_style === 'undefined' || quote_style === null) {
        quote_style = 2;
    }
    string = string.toString();    
	if (double_encode !== false) {
        string = string.replace(/&/g, '&amp;');
    }
    string = string.replace(/</g, '&lt;').replace(/>/g, '&gt;');
     var OPTS = {
        'ENT_NOQUOTES': 0,
        'ENT_HTML_QUOTE_SINGLE': 1,
        'ENT_HTML_QUOTE_DOUBLE': 2,
        'ENT_COMPAT': 2,        'ENT_QUOTES': 3,
        'ENT_IGNORE': 4
    };
    if (quote_style === 0) {
        noquotes = true;
	}
    if (typeof quote_style !== 'number') {
        quote_style = [].concat(quote_style);
        for (i = 0; i < quote_style.length; i++) {
            if (OPTS[quote_style[i]] === 0) {
                noquotes = true;
            } else if (OPTS[quote_style[i]]) {
                optTemp = optTemp | OPTS[quote_style[i]];
            }
		}
        quote_style = optTemp;
    }
    if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
        string = string.replace(/'/g, '&#039;');
	}
    if (!noquotes) {
        string = string.replace(/"/g, '&quot;');
    }
	return string;
}

function stripslashes (str) {
    return (str + '').replace(/\\(.?)/g, function (s, n1) {
		switch (n1) {
        	case '\\':
            	return '\\';
        	case '0':
				return '\u0000';
        	case '':
            	return '';
        	default:
            	return n1;
		}
    });
}

function ucwords (str) {   
	return (str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) {
        return $1.toUpperCase();
    });
}
