jQuery.extend({
	createDelegate : function(instance, method)
	{
		return function() {
			return method.apply(instance);
		}
	},
	pageCallback : function(callbackFunction, args)
	{
		var callback;
		if(typeof(callbackFunction) != "string") callback = callbackFunction;
		if(!callback)
		{
			try { callback = eval(callbackFunction); } catch(e) {}
		}
		if(!callback)
		{
			try { callback = eval("window.top." + callbackFunction); } catch(e) {}
		}
		if(!callback)
		{
			try { callback = eval("window.top.opener." + callbackFunction); } catch(e) {}
		}
		if(!callback)
		{
			try { callback = eval("window.parent." + callbackFunction); } catch(e) {}
		}
		if(!callback) return;
		callback(args);
	}
});

jQuery.fn.popupElement = function(options) {
	this.settings = {
		popupElement: null,
		popupEvent : "click"
	};
	
	if(options) {
		jQuery.extend(this.settings, options);
	}
	
	this.bind(this.settings.popupEvent, null, jQuery.createDelegate(this, function(){
		var box = $(this.settings.popupElement);
		if ($.fn.bgiframe)
			box.bgiframe();
		
		if(box.css("display") == "block") return;
		box.css("visibility", "hidden").css("display", "block").css("position", "absolute");
		
		var p = this.offset();
		p.top += this[0].offsetHeight;
		
		var boxWidth = box[0].offsetWidth;
		var boxHeight = box[0].offsetHeight;
		
		var limitBottom = (document.documentElement.scrollTop || document.body.scrollTop) + (document.documentElement.clientHeight || document.body.clientHeight);
		var limitRight = (document.documentElement.scrollLeft || document.body.scrollLeft) + (document.documentElement.clientWidth || document.body.clientWidth);
		
		if(p.top + boxHeight > limitBottom)
		{
			p.left += this[0].offsetWidth;
			p.top -= (p.top + boxHeight) - limitBottom;
		}
		if(p.top < 0) p.top = 0;
		
		box.css("top", p.top + "px").css("left", p.left + "px").css("display", "none").css("visibility", "visible").show("normal");
		
		this._eventCancelPopupElement = function(event) {
			var trigger = event.data.trigger;
			var box = $(trigger.settings.popupElement);
			
			var srcEvent = event.target || event.srcElement;
			if(!srcEvent) return;
			
			var toClose = !(srcEvent == trigger[0] || srcEvent == box[0]);
			if(!toClose) return;
			
			var pes = $(srcEvent).parents();
			for(var i = 0; i < pes.length; i++)
			{
				if(pes[i] == trigger[0] || pes[i] == box[0])
				{
					toClose = false;
					break;
				}
			}
			
			if(!toClose) return;
			box.hide("normal");
			$(document).unbind("click", trigger._eventCancelPopupElement);
		};
		
		$(document).bind("click", { trigger : this }, this._eventCancelPopupElement);
	}))
};



jQuery.extend(
{
	/**
	* @see  将json字符串转换为对象
	* @param   json字符串
	* @return 返回object,array,string等对象
	*/
	evalJSON: function(strJson) {
		return eval("(" + strJson + ")");
	}
});
jQuery.extend(
{
	/**
	* @see  将javascript数据类型转换为json字符串
	* @param 待转换对象,支持object,array,string,function,number,boolean,regexp
	* @return 返回json字符串
	*/
	toJSON: function(object) {
		var type = typeof (object);
		if ('object' == type) {
			if (object == null)
				return 'null';
			else if (Array == object.constructor)
				type = 'array';
			else if (RegExp == object.constructor)
				type = 'regexp';
			else
				type = 'object';
		}
		switch (type) {
			case 'undefined':
			case 'unknown':
				return;
				break;
			case 'function':
			case 'boolean':
			case 'regexp':
				return object.toString();
				break;
			case 'number':
				return isFinite(object) ? object.toString() : 'null';
				break;
			case 'string':
				return '"' + object.replace(/(\\|\")/g, "\\$1").replace(/\n|\r|\t/g,
					function() {
						var a = arguments[0];
						return (a == '\n') ? '\\n' :
						(a == '\r') ? '\\r' :
						(a == '\t') ? '\\t' : ""
					}) + '"';
				break;
			case 'object':
				if (object === null) return 'null';
				var results = [];
				for (var property in object) {
					var value = jQuery.toJSON(object[property]);
					if (value !== undefined)
						results.push(jQuery.toJSON(property) + ':' + value);
				}
				return '{' + results.join(',') + '}';
				break;
			case 'array':
				var results = [];
				for (var i = 0; i < object.length; i++) {
					var value = jQuery.toJSON(object[i]);
					if (value !== undefined) results.push(value);
				}
				return '[' + results.join(',') + ']';
				break;
		}
	}
});