(function($){
	$.fn.buttonSubmit = function(){
		this.filter('input.delete:button[submit][bind!="true"]').attr('bind','true').click(function(){
			if(window.confirm("Are you sure you delete?")){
				if($('input:checked',this.form).size()>0){
					var obj = $(this)
					this.form.action = obj.attr('action');
					this.form.method = obj.attr('submit');
					this.form.submit();
				}else{
					alert("Please select you want to delete data");
				}
			}
			return false;
		});
		this.filter('input:button[submit][bind!="true"]').attr('bind','true').click(function(){
			var obj = $(this);
			this.form.action = obj.attr('action');
			this.form.method = obj.attr('submit');
			this.form.submit();
			return false;
		});
	}
	$.extend({
		isString    : function(value){
			return !$.isNull(value) && value.constructor == String;
		},
		isArray     : function(value){
			return !$.isNull(value) && value.constructor == Array;
		},
		isBoolean   : function(value){
			return !$.isNull(value) && value.constructor == Boolean;
		},
		isNumber   : function(value){
			return !$.isNull(value) && value.constructor == Number;
		},
//		isFunction  : function(value){
//			return !$.isNull(value) && value.constructor == Function;
//		},
		toFunction  : function(fun){
			try{
				return eval(fun);
			}catch(e){
				return null;
			}
		},
		isJSON      : function(value){
			return $.isObject(value) && typeof value.valueOf == 'function';
		},
		isObject    : function(value){
			return !$.isNull(value) && value.constructor == Object;
		},
		isNull      : function(value){
			return value == null
		},
		isEmpty     : function(value){
			var _value = String(value);
			return _value == 'null' || _value == 'undefined' || _value == '' || _value == 'NaN' || _value == 'unknown';
		},
		serialize : function(query){
			var data = query.match(/[^&?]+=[^&]+/g);
			data = data?data.toString().replace(/([^,]+)=([^,]+)/g,'"$1":"$2"'):"";
			return $.JSON.decode('{'+data+'}');
		},
		serializeArray : function(query){
			try{
				var data = query.match(/[^&?]+=[^&]+/g).toString().replace(/([^,]+)=([^,]+)/g,'{name:"$1",value:"$2"}');
				return eval('['+data+']');
			}catch(e){
				return [];
			}
		},
		serializeString : function(query){
			var ret = [];
			$.each(query,function(i,n){
				var name = n['name']||i;
				var value= n['value']||n;
				ret.push(name+'='+value);
			});
			return ret.join('&');
		}
	});
	$.JSON = {
		specialChar : {
			'\b': '\\b',
			'\t': '\\t',
			'\n': '\\n',
			'\f': '\\f',
			'\r': '\\r',
			'\\': '\\\\'
		},
		encodeString : function(s){
			if (/["\\\x00-\x1f]/.test(s)) {
				return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
					var c = $.JSON.specialChar[b];
					if(c){
						return c;
					}
					c = b.charCodeAt();
					return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
				}) + '"';
			}
			return '"' + s + '"';
		},
		encode : function(value){
			var _ret = [];
			switch(typeof value){
				case 'date'     :return '\"'+(value)+'\"';break;
				case 'number'   :return value;break;
				case 'string'   :return $.JSON.encodeString(value);break;
				case 'boolean'  :return value;break;
				case 'function' :return value;break;
				case 'object'   :
					if($.isArray(value)){
						$.each(value,function(i,n){
							_ret.push($.JSON.encode(n));
						});
						return '['+_ret.join(',')+']';
					}else{
						$.each(value,function(i,n){
							_ret.push('\"'+i+'\":'+$.JSON.encode(n));
						});
						return '{'+_ret.join(',')+'}';
					}
				break;
				default : return '\"'+value+'\"';
			}
		},
		decode : function(value){
			return eval("(" + value + ')');
		},
		remove : function(value,name){
			var _re1 = new RegExp('{(?:.*?)(?:"name"\:([^,}]+))(?:.*?)\}',"ig");
			var _re2 = new RegExp(","+name+",","ig");
			do{
				var _ret = $.JSON.decode($.JSON.encode(value).replace(_re1,"$1"));
				var idx  = (","+_ret.toString()+",").replace(_re2,"|").replace(/[^,|]/g,"").indexOf("|");
				if(idx>-1) value.splice(idx,1);
			}while(idx>-1)
			return (value);
		}
	}
	$.fn.Ajax = function(options){
		var setting = $.extend({
			ajax   : 'ajax',
			url    : 'index.asp',
			cache  : false,
			callback  : 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);}
			}
		},options);
		var parameter1 = function(){
			var _obj = this;
			var data = [];
			if(!$.isEmpty(this[0].form)) data = data.concat($(this[0].form).serializeArray());
			$.JSON.remove(data,'action');
			var _temp = parameter2.call(_obj);
			if(!$.isEmpty(_temp)) data = data.concat(_temp);
			return data;
		}
		var parameter3 = function(){
			var _obj = this;
			var data = _obj.serializeArray();
			$.JSON.remove(data,'action');
			var _temp = parameter2.call(_obj);
			if(!$.isEmpty(_temp)) data = data.concat(_temp);
			return data;
		}
		var parameter2 = 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));
			$.JSON.remove(data,'action');
			data.push({name:"action",value:_obj.attr(setting.ajax)});
			return data;
		}
		var config = function($fn){
			var _obj = this;
			var fn   = $.extend({},$fn); 
			var dataType = _obj.attr('dataType');
			if(!$.isEmpty(dataType)) $.extend(fn,{dataType:dataType});
			
			var before   = $.toFunction(_obj.attr('before'));
			if($.isFunction(before)) $.extend(fn,{beforeSend:function(){before.apply(_obj,arguments)}});
			var success  = $.toFunction(_obj.attr('callback')||_obj.attr('success'));
			if($.isFunction(success)) $.extend(fn,{success:function(){success.apply(_obj,arguments)}});
			var complete = $.toFunction(_obj.attr('complete'));
			if($.isFunction(complete)) $.extend(fn,{complete:function(){complete.apply(_obj,arguments)}});
			return fn;
		}
		function doAjax(options){
			return $.ajax($.extend({
				dataType : 'json',
				url      : setting.url,
				type     : 'post',
				data     : {action:'list'},
				cache    : false,
				beforeSend : function(){
				},
				success  : function(data){
					setting.callback.apply(this,arguments);
				},
				complete : function(){},
				error    : function(XMLHttpRequest,textStatus,errorThrown){//请求出错处理
					alert("Error"+errorThrown);
				}
			},options));
		};
		function doAjaxSubmit(options){
			doAjax($.extend({
				success : function(){
					setting.callback.apply(this,arguments);
				}
			},options));
		};
		this.filter('form['+setting.ajax+'][bind!="true"]').attr('bind','true').submit(function(){
			var _obj = $(this);
			try{
			if(!$.isNull(Validator) && !Validator.Validate(this,2))return false;
			}catch(e){}
			var data = parameter3.call(_obj);
			var fn   = $.toFunction(_obj.attr('fn'));
			if($.isFunction(fn)&&!fn.call(this,data))return false;
			var fn   = config.call(_obj);
			
			//alert($.JSON.encode(data))
			doAjaxSubmit($.extend({data:data},fn));
			return false;
		});
		this.filter('input:text['+setting.ajax+'][bind!="true"][event]').attr('bind','true').each(function(){
			var _tmp = $(this);
			_tmp.bind("keypress",function(e){
				var key = String.fromCharCode(e.which);
				var re = /^\d+$/;
				return re.test(key);
			});
			_tmp.bind("contextmenu",function(){return false;})
				//.bind("selectstart",function(){return false;})
				.bind("paste",function(){return false;})
				.bind("click",function(){this.select();});
			_tmp.bind(_tmp.attr('event'),function(){
				var _obj = $(this);
				var data = parameter2.call(_obj);
				data.push({name:"value",value:_obj.val()});
				var fn   = $.toFunction(_obj.attr('fn'));
				if($.isFunction(fn)&&!fn.call(this,data))return false;
				var fn   = config.call(_obj,{
					success : function(data){if(!data.success) alert(data.msg);}
				});
				
//				alert($.JSON.encode(data))
				doAjax($.extend({data:data},fn,{type:'get'}));
				return false;
			});
		});
		this.filter('input:submit['+setting.ajax+'][bind!="true"]').attr('bind','true').click(function(){
			var _obj = $(this);
			var ret  = false;
			var data = parameter1.call(_obj);
			var fn   = $.toFunction(_obj.attr('fn'));
			if($.isFunction(fn)&&!fn.call(this,data))return false;
			
			var success  = $.toFunction(_obj.attr('callback')||_obj.attr('success'));
			var fn   = $.extend(config.call(_obj),{
				async   : false,
				success : function(data){
					ret = $.isFunction(success)?success.apply(_obj,arguments):data.success;
				}
			});
			
			//alert($.JSON.encode(data))
			doAjax($.extend({data:data},fn));
			return ret;
		});
		this.filter('input:not(:text)['+setting.ajax+'][bind!="true"]').attr('bind','true').click(function(){
			var _obj = $(this);
			
			var data = parameter1.call(_obj);
			var fn   = $.toFunction(_obj.attr('fn'));
			if($.isFunction(fn)&&!fn.call(this,data))return false;
			var fn   = config.call(_obj);
			
			//alert($.JSON.encode(data))
			doAjax($.extend({data:data},fn));
			return false;
		});
		this.filter('a['+setting.ajax+'][bind!="true"]').attr('bind','true').click(function(){
			var _obj = $(this);
			var data = parameter2.call(_obj);
			var fn   = $.toFunction(_obj.attr('fn'));
			if($.isFunction(fn)&&!fn.call(this,data))return false;
			var fn   = config.call(_obj);
			
			//alert($.JSON.encode(data))
			doAjax($.extend({data:data},fn));
			return false;
		});
		this.filter('['+setting.ajax+'][bind!="true"][load="true"]').attr('bind','true').each(function(i,n){
			var _obj  = $(this);
			var data = parameter2.call(_obj);
			var fn = config.call(_obj,{
				success : function(data){
					_obj.html(data);
				}
			});
			//alert($.JSON.encode(data))
			args = $.extend({data:data},fn);
			doAjax(args);
		});
		this.filter('['+setting.ajax+'][bind!="true"][delay]').attr('bind','true').each(function(i,n){
			var _obj  = $(this);
			var _time = _obj.attr("time")=='true';
			//if(_time)
			var delay = _obj.attr("delay")||1;
			var data  = parameter2.call(_obj);
			var fn    = config.call(_obj,{
				success : function(data){
					_obj.html(data);
				}
			});
			//alert(_time+' '+$.JSON.encode(data))
			this.stop = function(){_time=false};
			args = $.extend({data:data},fn,{type:'get',dataType:'text'});
			
//			function code(){
//				doAjax(args);
//				//if(_time){window.setTimeout(code,delay);}
//			}
			var IntervalID = window.setInterval(function(){
				doAjax(args);
				if(!_time) window.clearInterval(IntervalID);
			},delay);
			//code();
		});
		this.filter('select['+setting.ajax+'][bind!="true"]').attr('bind','true').change(function(){
			var _obj = $(this);
			var data = parameter1.call(_obj);
			var fn   = $.toFunction(_obj.attr('fn'));
			if($.isFunction(fn)&&!fn.call(this,data))return false;
			var fn   = config.call(_obj);
			
			//alert($.JSON.encode(data))
			doAjax($.extend({data:data},fn));
			return false;
		});
		this.filter('['+setting.ajax+'][bind!="true"]').attr('bind','true').click(function(){
			var _obj = $(this);
			var data = parameter1.call(_obj);
			var fn   = $.toFunction(_obj.attr('fn'));
			if($.isFunction(fn)&&!fn.call(this,data))return false;
			var fn   = config.call(_obj);
			
			//alert($.JSON.encode(data))
			//doAjax($.extend({data:data},fn));
			return false;
		});
	}
	$(function(){
		$('[ajax]').Ajax();
		$('[submit]').buttonSubmit();
		$('.grid tbody tr td a.remove').click(function(){
			return window.confirm("Are you sure you delete?");
		});
		$('#ALLID').bind('click',function(){
			var _obj = $(this);
			if(!_obj.data('flag')){
				$('input[name="id"]:checkbox').attr('checked',true);
				_obj.val('Cancel');
				_obj.data('flag',true);
			}else{
				$('input[name="id"]:checkbox').attr('checked',false);
				_obj.val('Check all');
				_obj.data('flag',false);
			}
			return false;
		});
	});
})(jQuery);
