(function($){
	$.extend({
		isDTD : function($doc){
			return ( 'CSS1Compat' == ( $doc.compatMode || 'CSS1Compat' ) );
		},
		Document : function(){
			var _doc = document;
			return $.isDTD(_doc) ? _doc.documentElement : _doc.body;
		},
		DOMproperty : function(){
			var _doc = $.Document();
			return {
				'width'  : Math.max(_doc.scrollWidth,_doc.clientWidth,0),
				'height' : Math.max(_doc.scrollHeight,_doc.clientHeight,0)
			}
		},
		screen : function(){
			var _doc = $.Document();
			return {
				'width'  : _doc.clientWidth||0,
				'height' : _doc.clientHeight||0
			}
		},
		isEmpty : function(parameter){
			return parameter==null||parameter=='undefined'||parameter=='';
		},
		isObject: function(parameter){return typeof parameter == 'object'?true:false;},
		isString: function(parameter){return typeof parameter == 'string'?true:false;},
		isArray : function(parameter){
			return parameter && typeof parameter.length == 'number' && typeof parameter.splice == 'function';
		},
		isDate  : function(parameter){return parameter && typeof parameter.getFullYear == 'function';},
		ToString : function($args){
			var _tmp = [];
			switch(typeof $args){
				case 'string':return '\"'+$args+'\"';break;
				case 'number':return $args;break;
				case 'function':return $args;break;
				case 'object':
					if($.isArray($args)){
						$.each($args,function(i,n){
							_tmp.push($.ToString(n));
						});
						return '['+_tmp.join(',')+']';
					}else{
						$.each($args,function(i,n){
							_tmp.push(i+':'+$.ToString(n));
						});
						return '{'+_tmp.join(',')+'}';
					}
			}
		}		
	});
$.fn.Ajax = function($options){
	var _this = this;
	var _options = $.extend({
		ajax   : 'ajax',
		url    : '../ajax/ajax.asp',
		to     : '../index.asp',
		scope  : null,
		submit : function(data){
			if(!data.success) alert(data.msg);else location.replace(_options.to);
		},
		click  : function(data){
			if(!data.success) alert(data.msg);else location.reload();
		},
		validate:function(data){
			var _form = this.find('[@remote="true"]');
			if(!data.success){
				$.each(data.errors,function(i,n){
					var _obj = _form[i];
					if(!_obj.msg) _obj.msg=$('<span></span>').insertAfter(_obj);
					_obj.msg.removeClass(n.success?'wrong':'right');
					_obj.msg.addClass(n.success?'right':'wrong').attr('title',n.msg).html('&nbsp;');
					_obj.msg.html(n.msg);
				});
			}else{location.replace(_options.to);}
		},
		remote : function(data){
			var _obj = this[0];
			if(!data.success){
				if(!_obj.error) _obj.error=$('<span></span>').insertAfter(_obj);
				_obj.error.removeClass(data.success?'wrong':'right');
				_obj.error.addClass(data.success?'right':'wrong').attr('title',data.msg).html('&nbsp;');
				_obj.error.html(data.msg);
			}
		}
	},$options);
	function doAjax($options){
		$.ajax($.extend({
			dataType : 'json',
			url      : _options.url,
			type     : 'post',
			data     : {action:'list'},
			success  : function(data){
				_options.click.apply(this,arguments);
			},
			error    : function(XMLHttpRequest,textStatus,errorThrown){//请求出错处理
				alert("Error");
			}
		},$options));
	};
	function doAjaxSubmit($options){
		doAjax($.extend({
			success : function(){
				_options.submit.apply(this,arguments);
			}
		},$options));
	};
	$.serializeArray = function(query){
		try{
		var data = query.replace(/.+\?|\?/ig,'').replace(/[,]/ig,'&').replace(/\{|\}|\'|\"/ig,'').replace(/[^&]+/ig,function($1){
			return $1.replace(/([^=|^:]+)[=|:](.+)/ig,'{name:"$1",value:"$2"}');
		}).replace(/[&]/ig,',');
		return new Function('return ['+data+']')();
		}catch(e){
			return [];
		}
	};
	$.toFunction = function(fun){
		try{
			return eval(fun);
		}catch(e){
			return null;
		}
	};
	this.filter('form[@'+_options.ajax+'][@bind!="true"]').attr('bind','true').submit(function(){
		var _obj = $(this);
		if(Validator.Validate(this,2)){
			var data = _obj.serializeArray();
			var _temp = _obj.attr("data");
			if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
			var _idx = $.ToString(data).replace(/\[|\]|,/ig,'').replace(/{name:"action".*?}/ig,'|').replace(/{.*?}/ig,'@').indexOf('|');
			if(_idx>-1)data.splice(_idx,1);
			data.push({name:"action",value:_obj.attr(_options.ajax)});
			var fun = $.toFunction(_obj.attr('callback'))
			if($.isFunction(fun))
				var fn = {success:function(){fun.apply(_options.scope||_obj,arguments)}};
			else if(_obj.attr('validate')=="true")
				var fn = {success:function(data){_options.validate.apply(_this.scope||_obj,arguments);}};
			else
				var fn = null
			var url = _obj.attr('action');
			var fc = $.isEmpty(url)?null:{url:url};
			doAjaxSubmit($.extend({data:data},fn,fc));
		}
		return false;
	});
	this.filter('form[@'+_options.ajax+'][@validate="true"]').find(':input,:file,:checkbox,:radio.select,')
	.filter('[@remote="true"][@bind!="true"]').attr('bind','true').bind('blur',function(){
		var _obj = $(this);
		var data = [];
		var _temp = _obj.attr("data");
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		data.push({name:"action",value:"remote"});
		data.push({name:_obj.attr('name'),value:_obj.attr('value')});
		var fun = $.toFunction(_obj.attr('callback'))
		if($.isFunction(fun))
			var fn = {success:function(data){fun.apply(_options.scope||_obj,arguments)}};
		else if(_obj.attr('remote')=="true")
			var fn = {success:function(data){_options.remote.apply(_options.scope||_obj,arguments);}};
		else
			var fn = null
		var url = $(this.form).attr('action');
		var fc = $.isEmpty(url)?null:{url:url};
		doAjax($.extend({data:data},fn,fc));
	});
	this.filter('input:text[@'+_options.ajax+'][@bind!="true"][@event]').attr('bind',true).each(function(){
		var _tmp = $(this);
		_tmp.bind(_tmp.attr('event'),function(){
			var _obj = $(this);
			var data = [];
			if(!$.isEmpty(this.form)) data = data.concat($(this.form).serializeArray());
			var _temp = _obj.attr("data");
			if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
			var _idx = $.ToString(data).replace(/\[|\]|,/ig,'').replace(/{name:"action".*?}/ig,'|').replace(/{.*?}/ig,'@').indexOf('|');
			if(_idx>-1)data.splice(_idx,1);
			data.push({name:"action",value:_obj.attr('ajax')});
			data.push({name:"value",value:_obj.val()});
			var fun = $.toFunction(_obj.attr('callback'))
			if($.isFunction(fun))
				var fn = {success:function(){fun.apply(_obj,arguments)}};
			else
				var fn = {success:function(){}};
			doAjax($.extend({data:data},fn));
			return false;
		});
	});
	this.filter(':text[@'+_options.ajax+'="remote"][@bind!="true"]').attr('bind','true').bind('blur',function(){
		var _obj = $(this);
		var data = [];
		var _temp = _obj.attr("data");
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		data.push({name:"action",value:"remote"});
		data.push({name:'value',value:_obj.attr('value')});
		var fun = $.toFunction(_obj.attr('callback'))
		if($.isFunction(fun))
			var fn = {success:function(data){fun.apply(_obj,arguments)}};
		else if(_obj.attr('remote')=="true")
			var fn = {success:function(data){_options.remote.apply(_obj,arguments);}};
		else
			var fn = null
		doAjax($.extend({data:data},fn));
	});
	this.filter('a[@'+_options.ajax+'][@bind!="true"]').attr('bind','true').click(function(){
		var _obj = $(this);
		var data = [];
		var _temp = _obj.attr('href');
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		var _temp = _obj.attr("data");
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		var _idx = $.ToString(data).replace(/\[|\]|,/ig,'').replace(/{name:"action".*?}/ig,'|').replace(/{.*?}/ig,'@').indexOf('|');
		if(_idx>-1)data.splice(_idx,1);
		data.push({name:"action",value:_obj.attr(_options.ajax)});
		var fun = $.toFunction(_obj.attr('callargs'))
		if($.isFunction(fun)) fun.call(data);
		var fun = $.toFunction(_obj.attr('callback'))
		if($.isFunction(fun))
			var fn = {success:function(){fun.apply(_this.scope||_obj,arguments)}};
		else
			var fn = null
		//alert($.ToString(data))
		doAjax($.extend({data:data},fn));
		return false;
	});
	this.filter('input:text[@'+_options.ajax+'][@bind!="true"]').attr('bind','true').bind('keyup',function(){
		var _obj = $(this);
		var data = [];
		if(!$.isEmpty(this.form)) data = data.concat($(this.form).serializeArray());
		var _temp = _obj.attr("data");
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		data.push({name:"action",value:_obj.attr(_options.ajax)});
		data.push({name:"value",value:_obj.val()});
		var fun = $.toFunction(_obj.attr('callback'))
		if($.isFunction(fun))
			var fn = {success:function(){fun.apply(_this.scope,arguments)}};
		else
			var fn = null
		doAjax($.extend({data:data},fn));
		return false;
	});
	this.filter('input[@'+_options.ajax+'][@bind!="true"]').attr('bind','true').click(function(){
		var _obj = $(this);
		var data = [];
		if(!$.isEmpty(this.form)) data = data.concat($(this.form).serializeArray());
		var _temp = _obj.attr("data");
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		var _idx = $.ToString(data).replace(/\[|\]|,/ig,'').replace(/{name:"action".*?}/ig,'|').replace(/{.*?}/ig,'@').indexOf('|');
		if(_idx>-1)data.splice(_idx,1);
		data.push({name:"action",value:_obj.attr(_options.ajax)});
		var fun = $.toFunction(_obj.attr('callback'))
		if($.isFunction(fun))
			var fn = {success:function(){fun.apply(_this.scope,arguments)}};
		else
			var fn = null
		doAjax($.extend({data:data},fn));
		return false;
	});
	this.filter('[@'+_options.ajax+'][@bind!="true"][@load="true"]').attr('bind','true').each(function(i,n){
		var _obj  = $(this);
		var _time = _obj.attr("time")=='true';
		if(_time) delay = _obj.attr("delay")||1;
		var data = [];
		var _temp = _obj.attr("data");
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		data.push({name:"action",value:_obj.attr(_options.ajax)});
		var fun = $.toFunction(_obj.attr('callback'))
		if($.isFunction(fun))
			var fn = {success:function(){fun.apply(_this.scope,arguments)}};
		else
			var fn = null
		this.stop = function(){_time=false};
		args = $.extend({data:data},fn);
		function code(){
			doAjax(args);
			if(_time) window.setTimeout(code,delay);
		}
		code();
		return false;
	});
	this.filter('[@'+_options.ajax+'][@bind!="true"]').attr('bind','true').click(function(){
		var _obj = $(this);
		var data = [];
		var _temp = _obj.attr("data");
		if(!$.isEmpty(_temp)) data = data.concat($.serializeArray(_temp));
		data.push({name:"action",value:_obj.attr(_options.ajax)});
		//alert($.ToString(data))
		var fun = $.toFunction(_obj.attr('callback'))
		if($.isFunction(fun))
			var fn = {success:function(){fun.apply(_this.scope,arguments)}};
		else
			var fn = null
		doAjax($.extend({data:data},fn));
		return false;
	});
}
})(jQuery);
jQuery(function(){
	jQuery('[@ajax]').Ajax();
});