if(jQuery) {

/**
 * String Utility object
 */
var string_utility = {};
jQuery.StringUtility = string_utility;

/**
 * @class jQuery.StringUtility.StringBuilder
 * @param init_value The init value of stringbuilder
 */
string_utility.StringBuilder = function(init_value){
    var m_value = [init_value];
        
    return {
        /**
         * Append the arguments behind the string.
         * @method append
         */
        append : function() {
            var len = arguments.length;
            for(var i=0; i<len; i++) {
                m_value[m_value.length] = arguments[i];
            }
        },
        
        /**
         * Get the result string of the stringbuilder.
         * @method toString
         * @return {String} The result string.
         */
        toString : function() {
            return m_value.join("");
        }
    };
};

/**
 * @class jQuery.StringUtility.StringBuilder
 * Supplant string. Get string's control id, control name ,root name
 */
$.extend(string_utility, {
	supplant : function (vString, vObj) {
		var lang = jQuery.Lang;
	    return vString.replace(/\{([^{}]*)\}/g, function (a, b) {
	        var r = vObj[b];
	        return (lang.isString(r) || lang.isNumber(r) || lang.isBoolean(r)) ? r : a;
		});
	},
	startsWith: function(vString, vEnd){
		if(!vString || !vEnd) return false;
		return vString.length >= vEnd.length && vString.substr(0, vEnd.length) == vEnd;
	},
	endsWith: function(vString, vEnd){
		if(!vString || !vEnd) return false;
		return vString.length >= vEnd.length && vString.substr(vString.length - vEnd.length) == vEnd;
	},
	controlId : function (vString) {
		return parseInt(vString.substr(vString.lastIndexOf("_") + 1));
	},
	controlIdStr : function (vString) {
	    return vString.substr(vString.lastIndexOf("_") + 1);
	},
	controlName : function(vString) {
	    return vString.substr(0, vString.lastIndexOf("_"));
	},
	rootName : function(vString, vIndex) {
	    if(vIndex==null) {
	        return vString.split("_")[0];
	    }
	    try {
	        return vString.split("_")[vIndex];
	    } catch(ex) {
	        return vString.split("_")[0];
	    }
	}
});

/**
 * path utility
 */
var m_imagePre = "/Public/image/",
	m_jsPre = "/Public/javascript/",
	m_flashPre = "/Public/flash/",
	m_urlPre = "/Page/";
jQuery.PathUtility = {
	imagePath: function(vSubPath) {
		return m_imagePre + vSubPath;
	},
	jsPath: function(vSubPath) {
        return m_jsPre + vSubPath;
    },
	flashPath: function(vSubPath) {
		return m_flashPre + vSubPath;
	},
	urlPath: function(vSubPath) {
		return m_urlPre + vSubPath;
	},
	pageName: function(){
		var p = location.href;
		var retval = p.substr(p.lastIndexOf("/")+1);
		retval = retval.substr(0, retval.indexOf("."));
		return retval;
	},
	getParam: function(vKey){
		if(vKey == null) return null;
		var searchstr = location.search;
		if(searchstr==null || jQuery.trim(searchstr)=="") return null;
		var params = searchstr.substr(1, searchstr.length-1).split("&");
		for(var i=0; i<params.length; i++) {
			var keyandvalue = params[i].split("=");
			if(keyandvalue[0]==vKey) 
				return unescape(keyandvalue[1]);
		}
		return null;
	},
	setParam: function(vKey, vValue) {
		if(arguments == null) return;
		var ht = {};
		// old params
		var searchstr = location.search;
		if(searchstr != null) {
			var params = searchstr.substr(1, searchstr.length-1).split("&");
			for(var i=0; i<params.length; i++) {
				if(params[i] == null || jQuery.trim(params[i]) == "")
					continue;
				var keyandvalue = params[i].split("=");
				if(jQuery.trim(keyandvalue[0]) != "")
					ht[keyandvalue[0]] = unescape(keyandvalue[1]);
			}
		}
		// new params
		for (var i=0; i+1<arguments.length; i+=2) {
			var key = jQuery.trim(arguments[i]), value = arguments[i+1];
			if(key==null || key=="")
				continue;
			ht[key] = value;
		}
		location.search = (function() {
			var retval = "";
			$.each(ht, function(vName, vValue) {
				if(vValue == null) return;
				retval += "&" + vName + "=" + escape(vValue);
			});
			if(retval!="")
				retval = retval.substr(1, retval.length-1);
			return retval;
		})();
	},
	getAnchor : function(vKey){
		if(vKey == null) return null;
		var anchorstr = jQuery.trim(location.hash);
		if(anchorstr==null || anchorstr=="") return null;
		var params = anchorstr.substr(1, anchorstr.length-1).split("&");
		for(var i=0; i<params.length; i++) {
			var keyandvalue = params[i].split("="),
				key = jQuery.trim(keyandvalue[0]),
				value = unescape(keyandvalue[1]);
			if(key==vKey) return value;
		}
		return null;
	},
	setAnchor : function(vKey, vValue) {
		if(arguments == null) return;
		var ht = {};
		// old params
		var searchstr = location.hash;
		if(searchstr != null && searchstr.length > 0) {
			var params = searchstr.substr(1, searchstr.length-1).split("&");
			for(var i=0; i<params.length; i++) {
				var p = jQuery.trim(params[i]);
				if(p == null || p == "") continue;
				var keyandvalue = p.split("="),
					key = jQuery.trim(keyandvalue[0]),
					value = unescape(keyandvalue[1]);
				if(key != "") ht[key] = value;
			}
		}
		// new params
		for (var i=0; i+1<arguments.length; i+=2) {
			var key = jQuery.trim(arguments[i]), value = arguments[i+1];
			if(key==null || key=="") continue;
			ht[key] = value;
		}
		location.hash = (function() {
			var retval = "";
			$.each(ht, function(vName, vValue) {
				if(vValue == null) return;
				retval += "&" + vName + "=" + escape(vValue);
			});
			if(retval.length > 0) retval = retval.substr(1, retval.length-1);
			return retval;
		})();
    }
};

/**
 * jQuery.Lang
 */
jQuery.Lang = {
	isNumber: function(vValue){
		return typeof(vValue) === "number";
	},
	isBoolean: function(vValue){
		return typeof(vValue) === "boolean";
	},
	isFunction: function(vValue){
		return typeof(vValue) === "function";
	},
	isString: function(vValue){
		return typeof(vValue) === "string";
	},
	isUndefined: function(vValue){
		return typeof(vValue) === 'undefined';
	},
	isNull: function(vValue){
		return vValue === null;
	},
	isObject: function(vValue){//null is not object! array and function are objects!
		return (vValue && 
			(typeof(vValue) === 'object' || jQuery.Lang.isFunction(vValue))) || 
			false;
	},
	isArray: function(vValue){
		if (vValue) {
			return jQuery.Lang.isNumber(vValue.length) && jQuery.Lang.isFunction(vValue.splice);
		}
		return false;
	}
};

/**
 * jQuery.Array
 */
jQuery.ArrayUtility = { 
    remove: function(ar, o) {
        var len = ar.length;
        for (var i = 0; i < len; i++)
            if (ar[i] == o) {
                ar.splice(i, 1);
                i--;
                len--;
            }
    },
    contains: function(ar, o) {
        for (var i = 0; i < ar.length; i++)
            if (ar[i] == o)
                return true;
        return false;
    }
};

/**
 * jQuery.Clipboard
 */
jQuery.Clipboard = {
    copy: function(text) {
        if (window.clipboardData) {
            window.clipboardData.setData("Text", text);
        } else if (window.netscape) { 
            netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
            var clip = Components.classes['@mozilla.org/widget/clipboard;1']
                     .createInstance(Components.interfaces.nsIClipboard);
            if (!clip) return;
            var trans = Components.classes['@mozilla.org/widget/transferable;1']
                      .createInstance(Components.interfaces.nsITransferable);
            if (!trans) return;
            trans.addDataFlavor('text/unicode');
            var str = new Object();
            var len = new Object();
            var str = Components.classes["@mozilla.org/supports-string;1"]
                    .createInstance(Components.interfaces.nsISupportsString);
            var copytext = text;
            str.data = copytext;
            trans.setTransferData("text/unicode",str,copytext.length*2);
            var clipid = Components.interfaces.nsIClipboard;
            if (!clip) return false;
            clip.setData(trans,null,clipid.kGlobalClipboard);
        }
    }
};

jQuery.loadCss = function(url) {
    url = "/Public/stylesheet/" + url + ".css";
    $("head").append("<link>");
    css = $("head").children(":last");
    css.attr({
      rel:  "stylesheet",
      type: "text/css",
      href: url
    });
};

}

