// JavaScript Document


(function($) {
	//Ajax Form
$.fn.ajaxSubmit = function(options) {
    if (!this.length) {
        log('ajaxSubmit: skipping submit process - no element selected');
        return this;
    };

    if (typeof options == 'function')
        options = { success: options };
	
    var url = $.trim(this.attr('action'));
    if (url) {
	    url = (url.match(/^([^#]+)/)||[])[1];
   	};
   	url = url || window.location.href || '';

    options = $.extend({
        url:  url,
        type: this.attr('method') || 'POST'
    }, options || {});

    var veto = {};
    this.trigger('form-pre-serialize', [this, options, veto]);
    if (veto.veto) {
        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
        return this;
    };

    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
        log('ajaxSubmit: submit aborted via beforeSerialize callback');
        return this;
    };

    var a = this.formToArray(options.semantic);
    if (options.data) {
        options.extraData = options.data;
        for (var n in options.data) {
          if(options.data[n] instanceof Array) {
            for (var k in options.data[n])
              a.push( { name: n, value: options.data[n][k] } );
          }
          else
             a.push( { name: n, value: options.data[n] } );
        };
    };

    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
        log('ajaxSubmit: submit aborted via beforeSubmit callback');
        return this;
    };

    this.trigger('form-submit-validate', [a, this, options, veto]);
    if (veto.veto) {
        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
        return this;
    };

    var q = $.param(a);

    if (options.type.toUpperCase() == 'GET') {
        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
        options.data = null; 
    }
    else
        options.data = q;

    var $form = this, callbacks = [];
    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });

    if (!options.dataType && options.target) {
        var oldSuccess = options.success || function(){};
        callbacks.push(function(data) {
            $(options.target).html(data).each(oldSuccess, arguments);
        });
    }
    else if (options.success)
        callbacks.push(options.success);

    options.success = function(data, status) {
        for (var i=0, max=callbacks.length; i < max; i++)
            callbacks[i].apply(options, [data, status, $form]);
    };

    var files = $('input:file', this).fieldValue();
    var found = false;
    for (var j=0; j < files.length; j++)
        if (files[j])
            found = true;
    //if($('input:file', this)!=null)
    	//found = true; 
	var multipart = false;
   if (options.iframe || found || multipart) {
       if (options.closeKeepAlive)
           $.get(options.closeKeepAlive, fileUpload);
       else{
           fileUpload();
       }
     }
   else{
       $.ajax(options);
   }

    this.trigger('form-submit-notify', [this, options]);
    return this;


    function fileUpload() {
        var form = $form[0];

        if ($(':input[name=submit]', form).length) {
            alert('Error: Form elements must not be named "submit".');
            return;
        };

        var opts = $.extend({}, $.ajaxSettings, options);
		var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);

        var id = 'jqFormIO' + (new Date().getTime());
        var $io = $('<iframe id="' + id + '" name="' + id + '" src="about:blank" />');
        var io = $io[0];

        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });

        var xhr = { 
            aborted: 0,
            responseText: null,
            responseXML: null,
            status: 0,
            statusText: 'n/a',
            getAllResponseHeaders: function() {},
            getResponseHeader: function() {},
            setRequestHeader: function() {},
            abort: function() {
                this.aborted = 1;
                $io.attr('src','about:blank'); 
            }
        };

        var g = opts.global;
        
        if (g && ! $.active++) $.event.trigger("ajaxStart");
        if (g) $.event.trigger("ajaxSend", [xhr, opts]);

		if (s.beforeSend && s.beforeSend(xhr, s) === false) {
			s.global && $.active--;
			return;
        };
        if (xhr.aborted)
            return;

        var cbInvoked = 0;
        var timedOut = 0;

        var sub = form.clk;
        if (sub) {
            var n = sub.name;
            if (n && !sub.disabled) {
                options.extraData = options.extraData || {};
                options.extraData[n] = sub.value;
                if (sub.type == "image") {
                    options.extraData[name+'.x'] = form.clk_x;
                    options.extraData[name+'.y'] = form.clk_y;
                };
            };
        };

        setTimeout(function() {
            var t = $form.attr('target'), a = $form.attr('action');

			form.setAttribute('target',id);
			if (form.getAttribute('method') != 'POST')
				form.setAttribute('method', 'POST');
			if (form.getAttribute('action') != opts.url)
				form.setAttribute('action', opts.url);

            if (! options.skipEncodingOverride) {
                $form.attr({
                    encoding: 'multipart/form-data',
                    enctype:  'multipart/form-data'
                });
            };

            if (opts.timeout)
                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);

            var extraInputs = [];
            try {
                if (options.extraData)
                    for (var n in options.extraData)
                        extraInputs.push(
                            $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
                                .appendTo(form)[0]);

                $io.appendTo('body');
                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
                form.submit();
            }
            finally {
                
				form.setAttribute('action',a);
                t ? form.setAttribute('target', t) : $form.removeAttr('target');
                $(extraInputs).remove();
            };
        }, 10);

        var nullCheckFlag = 0;

        function cb() {
            if (cbInvoked++) return;

            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);

            var ok = true;
            try {
                if (timedOut) throw 'timeout';
               
                var data, doc;

                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;

                if ((doc.body == null || doc.body.innerHTML == '') && !nullCheckFlag) {
                   
                    nullCheckFlag = 1;
                    cbInvoked--;
                    setTimeout(cb, 100);
                    return;
                };

                xhr.responseText = doc.body ? doc.body.innerHTML : null;
                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
                xhr.getResponseHeader = function(header){
                    var headers = {'content-type': opts.dataType};
                    return headers[header];
                };

                if (opts.dataType == 'json' || opts.dataType == 'script') {
                    var ta = doc.getElementsByTagName('textarea')[0];
                    xhr.responseText = ta ? ta.value : xhr.responseText;
                }
                else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
                    xhr.responseXML = toXml(xhr.responseText);
                };
                data = $.httpData(xhr, opts.dataType);
            }
            catch(e){
                ok = false;

                $.handleError(opts, xhr, 'error', e);
            };

            if (ok) {
                opts.success(data, 'success');
                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
            };
            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
            if (g && ! --$.active) $.event.trigger("ajaxStop");
            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');

            // clean up
            setTimeout(function() {
                $io.remove();
                xhr.responseXML = null;
            }, 100);
        };

        function toXml(s, doc) {
            if (window.ActiveXObject) {
                doc = new ActiveXObject('Microsoft.XMLDOM');
                doc.async = 'false';
                doc.loadXML(s);
            }
            else
                doc = (new DOMParser()).parseFromString(s, 'text/xml');
            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
        };
    };
};


$.fn.ajaxForm = function(options) {
    return this.ajaxFormUnbind().bind('submit.form-plugin',function() {
        $(this).ajaxSubmit(options);
        return false;
    }).each(function() {
        $(":submit,input:image", this).bind('click.form-plugin',function(e) {
            var form = this.form;
            form.clk = this;
            if (this.type == 'image') {
                if (e.offsetX != undefined) {
                    form.clk_x = e.offsetX;
                    form.clk_y = e.offsetY;
                } else if (typeof $.fn.offset == 'function') { 
                    var offset = $(this).offset();
                    form.clk_x = e.pageX - offset.left;
                    form.clk_y = e.pageY - offset.top;
                } else {
                    form.clk_x = e.pageX - this.offsetLeft;
                    form.clk_y = e.pageY - this.offsetTop;
                };
            };
            
            setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10);
        });
    });
};

$.fn.ajaxFormUnbind = function() {
    this.unbind('submit.form-plugin');
    return this.each(function() {
        $(":submit,input:image", this).unbind('click.form-plugin');
    });

};


$.fn.formToArray = function(semantic) {
    var a = [];
    if (this.length == 0) return a;

    var form = this[0];
    var els = semantic ? form.getElementsByTagName('*') : form.elements;
    if (!els) return a;
    for(var i=0, max=els.length; i < max; i++) {
        var el = els[i];
        var n = el.name;
        if (!n) continue;

        if (semantic && form.clk && el.type == "image") {
            // handle image inputs on the fly when semantic == true
            if(!el.disabled && form.clk == el) {
            	a.push({name: n, value: $(el).val()});
                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
            };
            continue;
        };

        var v = $.fieldValue(el, true);
        if (v && v.constructor == Array) {
            for(var j=0, jmax=v.length; j < jmax; j++)
                a.push({name: n, value: v[j]});
        }
        else if (v !== null && typeof v != 'undefined')
            a.push({name: n, value: escape(v)});
    };

    if (!semantic && form.clk) {
        // input type=='image' are not found in elements array! handle it here
        var $input = $(form.clk), input = $input[0], n = input.name;
        if (n && !input.disabled && input.type == 'image') {
        	a.push({name: n, value: $input.val()});
            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
        };
    };
    return a;
};


$.fn.formSerialize = function(semantic) {
   
    return $.param(this.formToArray(semantic));
};


$.fn.fieldSerialize = function(successful) {
    var a = [];
    this.each(function() {
        var n = this.name;
        if (!n) return;
        var v = $.fieldValue(this, successful);
        if (v && v.constructor == Array) {
            for (var i=0,max=v.length; i < max; i++)
                a.push({name: n, value: v[i]});
        }
        else if (v !== null && typeof v != 'undefined')
            a.push({name: this.name, value: v});
    });
   
    return this.param(a);
};


$.fn.fieldValue = function(successful) {
    for (var val=[], i=0, max=this.length; i < max; i++) {
        var el = this[i];
        var v = $.fieldValue(el, successful);
        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
            continue;
        v.constructor == Array ? $.merge(val, v) : val.push(v);
    };
    return val;
};


$.fieldValue = function(el, successful) {
    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
    if (typeof successful == 'undefined') successful = true;

    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
        (t == 'checkbox' || t == 'radio') && !el.checked ||
        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
        tag == 'select' && el.selectedIndex == -1))
            return null;

    if (tag == 'select') {
        var index = el.selectedIndex;
        if (index < 0) return null;
        var a = [], ops = el.options;
        var one = (t == 'select-one');
        var max = (one ? index+1 : ops.length);
        for(var i=(one ? index : 0); i < max; i++) {
            var op = ops[i];
            if (op.selected) {
				var v = op.value;
				if (!v) // extra pain for IE...
                	v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
                if (one) return v;
                a.push(v);
            };
        };
        return a;
    };
    return el.value;
};
$.fn.clearForm = function() {
    return this.each(function() {
        $('input,select,textarea', this).clearFields();
    });
};


$.fn.clearFields = $.fn.clearInputs = function() {
    return this.each(function() {
        var t = this.type, tag = this.tagName.toLowerCase();
        if (t == 'text' || t == 'password' || tag == 'textarea')
            this.value = '';
        else if (t == 'checkbox' || t == 'radio')
            this.checked = false;
        else if (tag == 'select')
            this.selectedIndex = -1;
    });
};


$.fn.resetForm = function() {
    return this.each(function() {
        
        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
            this.reset();
    });
};


$.fn.enable = function(b) {
    if (b == undefined) b = true;
    return this.each(function() {
        this.disabled = !b;
    });
};


$.fn.selected = function(select) {
    if (select == undefined) select = true;
    return this.each(function() {
        var t = this.type;
        if (t == 'checkbox' || t == 'radio')
            this.checked = select;
        else if (this.tagName.toLowerCase() == 'option') {
            var $sel = $(this).parent('select');
            if (select && $sel[0] && $sel[0].type == 'select-one') {
                
                $sel.find('option').selected(false);
            };
            this.selected = select;
        };
    });
};

//$.fn.param=function( a ) {
//   var encode=function(v){//如果包含中文就escape,避免重复escape)
//     	//return /[^\x00-\xff]/g.test(v)?escape(v):v;
//   		return v;
//    };
//   var s = [];
//   
//   if ( a.constructor == Array || a.sundun )
//    
//    sundun.each( a, function(){
//     s.push( encode(this.name) + "=" + encode( this.value ) );
//    });
//
//   
//   else
//    
//    for ( var j in a )
//     
//     if ( a[j] && a[j].constructor == Array )
//      sundun.each( a[j], function(){
//       s.push( encode(j) + "=" + encode( this ) );
//      });
//     else
//      s.push( encode(j) + "=" + encode( a[j] ) );
//
//   
//   return s.join("&").replace(/%20/g, "+");
//};



function log() {
    if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
        window.console.log('[sundun.form] ' + Array.prototype.join.call(arguments,''));
};

})(sundun);


$.fn.form = function(){
	//控制浏览器窗口的大小
	/*
	if($("#u_page").attr("minLimit") != undefined && ($("body").width() < $("#u_page").outerWidth() + 20))
	{
		var width = screen.availWidth;
		var height = screen.availHeight;
		window.resizeTo(width,height);
		window.moveTo(0,0);
	};
	*/
	
	
	$("input,textarea").attr("autocomplete","off");
	
	//if(window.parent.frames.winmsg)
	//	$("#u_page").css("width",$(window.parent.frames.winmsg).width()+"px");
	
	var scroll = false;
	//固定头脚，表单区域y轴自动滚动条
	if(parent.window.frames.sundun.ui.dialog)
	{
		$("#u_page").css({"margin":0,"padding":0,"border":0});
		$("#u_content").css({"margin":0,"padding":0,"border":0});
		$("#u_content .ui-form").css("border",0);
		
		/*
		$("#u_page").css({"margin":0,"padding":0,"border":0});
		$("#u_content").css({"margin":0,"padding":0,"border":0});
		$(document).css("overflow","hidden");
		$(document.body).css({"overflow":"hidden","background":"#fff"});
		$("#u_content .ui-form").css("border",0);
		$(window.parent.frames.winmsg).parent().css("overflow","hidden");
		
		var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;
		var height = rootEl.clientHeight;
		
		var thead = $("#u_page .ui-form>thead").outerHeight(true);
		var tfoot = $("#u_page .ui-form>tfoot").outerHeight(true);
		
		var supply = 0;
		if($.browser.msie && $.browser.version == "7.0") supply = -15;
		
		$("#u_page .form-content").height(height - thead - tfoot - supply).css({"overflow-y":"auto","overflow-x":"hidden"});
		
		if($("#u_page table.form").height() > $("#u_page .form-content").height()) scroll = true;
		
		$(".form-btn-cancel").click(function(){ top.sundun.win.doHandler("close"); });
		*/
	};
	
	if($(".form-btn-cancel")[0])
	{
		$(".form-btn-cancel").click(function(){
			
			if(parent.window.frames.sundun.ui.dialog == undefined)
				window.close();
			else
				top.sundun.dialog('close','cancel');
		});
	}
	;
	
	//设置表单控件的鼠标悬停效果，检测如果有错误提示存在则取消鼠标悬停效果。
	//普通效果输入框
	$('.form-textbox,.form-dic,.form-textarea,.form-calendar').hover(
	function(){
		if(!$(this).hasClass('error'))
		$(this).addClass('form-over');
	},
	function(){
		if(!$(this).hasClass('error'))
		$(this).removeClass('form-over');
	});
	
	$('input,textarea',this)
	.focus(function(){	 $(this).parent().addClass("active").prev().addClass("active");	})
	.blur(function(){	 $(this).parent().removeClass("active").prev().removeClass("active"); });
	//必填效果输入框
	$('.form-textbox-must,.form-textarea-must').hover(
	function(){
		if(!$(this).hasClass('error'))
		$(this).addClass('form-over-red');
	},
	function(){
		if(!$(this).hasClass('error'))
		$(this).removeClass('form-over-red');
	});
	
			
	//获取标题列的最大宽度
	function tdwidth (){
		var maxl = 0;
		$(".ui-form table.form>tbody>tr>td>label.title").each(function(){ 		
			if ($(this).text().length>maxl)	maxl = $(this).text().length;
		});
		return maxl*12 + 30;
	};
	//获取标题列的数量
	function maxtdnum (){
		var maxtdnum =0;
		$(".ui-form table.form>tbody>tr").each( function(){ 			
			if ($(this).children().size()>maxtdnum)
			maxtdnum = $(this).children().size();
		});
		return maxtdnum/2;
	};
	
	var tdwidth = tdwidth();
	var maxtdnum = maxtdnum();
	
	//设置标题列和控件列的宽度
	setTimeout(function(){
		//alert(tdwidth);
		var form_width = $(".ui-form").width();
		//if(scroll) form_width = form_width - 16;
		//$(".ui-form table.form").width(form_width);
		var td_title = (tdwidth/form_width)*100;
		var td_widget = (100 - td_title*2)/2;
		//title
		$(".ui-form table.form>tbody>tr>td.form-title").each(function(){		
			$(this).width(td_title+'%'); 
		});
		
		//widget
		$(".ui-form table.form>tbody>tr>td.form-widget").each(function(){ 
			$(this).width(td_widget+'%');
			
			if(this.colSpan > 1)
			{
				if(this.colSpan == 3 && maxtdnum == 2) $(this).width((td_title + td_widget*2) +'%');
			};
			//$('input:text,textarea,input:file',this).width(pxtonum($(this).css("width")) - 6 + "px");
		});
		
		//去除加载提示效果
		if($("#loading")[0]) $("#loading").fadeOut("slow");
		if($("#loading-mask")[0]) $("#loading-mask").fadeOut("slow");
	
	},0);
	
};
function pxtonum(prop){
	var tempcalc = prop;
	if( typeof(tempcalc) == "number" )
		return tempcalc;
	else
	{
		tempcalc = Number(tempcalc.replace(/px/,""));
		return tempcalc;
	};
};


/*
 * sundun javascript framework 验证插件
 * 维护：林春彪
 */

(function($) {

$.extend($.fn, {
	
	validate: function( options ) {
		
		// 如果没有被选中，返回空
		if (!this.length) {
			options && options.debug && window.console && console.warn( "没有任何项被选择, 不能验证, 返回空" );
			return;
		}
		
		// 如果form已经创建好，则开始检查。
		var validator = $.data(this[0], 'validator');
		if ( validator ) {
			return validator;
		}
		
		validator = new $.validator( options, this[0] );
		
		$.data(this[0], 'validator', validator); 
		
		if ( validator.settings.onsubmit ) {
		
			// 如果提交按钮有.cancel样式，则允许停住验证
			this.find("input, button").filter(".cancel").click(function() {
				validator.cancelSubmit = true;
			});
		
			// 在提交时验证form
			this.submit( function( event ) {
				if ( validator.settings.debug )
					// 防止form提交可以在控制台输出看到
					event.preventDefault();
					
				function handle() {
					if ( validator.settings.submitHandler ) {
						validator.settings.submitHandler.call( validator, validator.currentForm );
						return false;
					}
					return true;
				}
					
				// 防止无效的forms提交或者自定义的提交处理
				if ( validator.cancelSubmit ) {
					validator.cancelSubmit = false;
					return handle();
				}
				if ( validator.form() ) {
					if ( validator.pendingRequest ) {
						validator.formSubmitted = true;
						return false;
					}
					return handle();
				} else {
					validator.focusInvalid();
					return false;
				}
			});
		}
		
		return validator;
	},
	
	valid: function() {
        if ( $(this[0]).is('form')) {
            return this.validate().form();
        } else {
            var valid = false;
            var validator = $(this[0].form).validate();
            this.each(function() {
				valid |= validator.element(this);
            });
            return valid;
        }
    },
	
	removeAttrs: function(attributes) {
		var result = {},
			$element = this;
		$.each(attributes.split(/\s/), function(index, value) {
			result[value] = $element.attr(value);
			$element.removeAttr(value);
		});
		return result;
	},
	
	rules: function(command, argument) {
		var element = this[0];
		
		if (command) {
			var settings = $.data(element.form, 'validator').settings;
			var staticRules = settings.rules;
			var existingRules = $.validator.staticRules(element);
			switch(command) {
			case "add":
				$.extend(existingRules, $.validator.normalizeRule(argument));
				staticRules[element.name] = existingRules;
				if (argument.messages)
					settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
				break;
			case "remove":
				if (!argument) {
					delete staticRules[element.name];
					return existingRules;
				}
				var filtered = {};
				$.each(argument.split(/\s/), function(index, method) {
					filtered[method] = existingRules[method];
					delete existingRules[method];
				});
				return filtered;
			}
		}
		
		var data = $.validator.normalizeRules(
		$.extend(
			{},
			$.validator.metadataRules(element),
			$.validator.classRules(element),
			$.validator.attributeRules(element),
			$.validator.staticRules(element)
		), element);
		
		// 确认必须的是在前面
		if (data.required) {
			var param = data.required;
			delete data.required;
			data = $.extend({required: param}, data);
		}
		
		return data;
	}
});

// Custom selectors
$.extend($.expr[":"], {
	blank: function(a) {return !$.trim(a.value);},
	filled: function(a) {return !!$.trim(a.value);},
	unchecked: function(a) {return !a.checked;}
});


$.valFormat = function(source, params) {
	if ( arguments.length == 1 ) 
		return function() {
			var args = $.makeArray(arguments);
			args.unshift(source);
			return $.valFormat.apply( this, args );
		};
	if ( arguments.length > 2 && params.constructor != Array  ) {
		params = $.makeArray(arguments).slice(1);
	}
	if ( params.constructor != Array ) {
		params = [ params ];
	}
	$.each(params, function(i, n) {
		source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
	});
	return source;
};

// 构造校验
$.validator = function( options, form ) {
	this.settings = $.extend( {}, $.validator.defaults, options );
	this.currentForm = form;
	this.init();
};

$.extend($.validator, {

	defaults: {
		messages: {},
		groups: {},
		rules: {},
		errorClass: "error",
		errorElement: "label",
		focusInvalid: true,
		errorContainer: $( [] ),
		errorLabelContainer: $( [] ),
		onsubmit: true,
		ignore: [],
		ignoreTitle: false,
		onfocusin: function(element) {
			this.lastActive = element;
				
			// 如果focus是enabled，则隐藏错误的标签和删除错误的class
			if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
				this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass );
				this.errorsFor(element).hide();
			}
		},
		onfocusout: function(element) {
			if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
				this.element(element);
			}
		},
		onkeyup: function(element) {
			if ( element.name in this.submitted || element == this.lastElement ) {
				this.element(element);
			}
		},
		onclick: function(element) {
			if ( element.name in this.submitted )
				this.element(element);
		},
		highlight: function( element, errorClass ) {
			$( element ).addClass( errorClass );
		},
		unhighlight: function( element, errorClass ) {
			$( element ).removeClass( errorClass );
			if($("#error_"+$(element).attr("name"))[0]) 
			{
				$("#error_"+$(element).attr("name")).remove();
				if(!$('span',this.settings.errorlist)[0]) this.settings.errorlist.hide();
				
				if($("#u_page .form-content")[0] && $("#u_page").attr("autoBody") != undefined && window.parent.frames.winmsg) 
				{
					var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;
					var height = rootEl.clientHeight;
		
					var thead = $("#u_page .ui-form>thead").outerHeight(true);
					var tfoot = $("#u_page .ui-form>tfoot").outerHeight(true);
										
					$("#u_page .form-content").height(height - thead - tfoot);
				};
			};
			$( element ).attr("error","");
		}
	},

	setDefaults: function(settings) {
		$.extend( $.validator.defaults, settings );
	},

	messages: {
		required: "必填项",
		remote: $.valFormat("{0} 已经存在"),		
		chinese: "请输入中文字符",
		english: "请输入英文",
		phone: "请输入正确格式的电话号码",
		mobile: "请输入正确格式的手机号码",
		phoneormobile:"请输入正确格式的电话/手机号码",
		zip: "请输入正确格式的邮政编码",
		idcard: "请输入正确格式的身份证号码",
		safestring: "请输入符合安全规则的密码",
		ipv4: "请输入正确格式的IP地址",
		email: "请输入正确格式的电子邮件",
		url: "请输入合法的网址",
		date: "请输入合法的日期",
		number: "请输入合法的数字",
		digits: "只能输入整数",
		equalTo: "请再次输入相同的值",
		accept: "请输入拥有合法后缀名的字符串",
		maxlength: $.valFormat("请输入一个长度最多是 {0} 的字符串"),
		minlength: $.valFormat("请输入一个长度最少是 {0} 的字符串"),
		rangelength: $.valFormat("请输入一个长度介于 {0} 和 {1} 之间的字符串"),
		range: $.valFormat("请输入一个介于 {0} 和 {1} 之间的值"),
		max: $.valFormat("请输入一个最大为 {0} 的值"),
		min: $.valFormat("请输入一个最小为 {0} 的值"),
		numberAndEnglish: "只能是由数字、26个英文字母或者下划线组成",
		isNumeric: "只能是合法的正数字",
		tableName: "只能是由英文字母开头,由a-z或A-Z,数字和_号组成"
	},
	
	autoCreateRanges: false,
	
	prototype: {
		
		init: function() {
			this.labelContainer = $(this.settings.errorLabelContainer);
			this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
			this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
			this.submitted = {};
			this.valueCache = {};
			this.pendingRequest = 0;
			this.pending = {};
			this.invalid = {};
			this.reset();
			
			var groups = (this.groups = {});
			$.each(this.settings.groups, function(key, value) {
				$.each(value.split(/\s/), function(index, name) {
					groups[name] = key;
				});
			});
			var rules = this.settings.rules;
			$.each(rules, function(key, value) {
				rules[key] = $.validator.normalizeRule(value);
			});
			
			function delegate(event) {
				var validator = $.data(this[0].form, "validator");
				validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] );
			}
			$(this.currentForm)
				.delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate)
				.delegate("click", ":radio, :checkbox", delegate);
			if (this.settings.invalidHandler)
				$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
		},

		form: function() {
			this.checkForm();
			$.extend(this.submitted, this.errorMap);
			this.invalid = $.extend({}, this.errorMap);
			if (!this.valid())
				$(this.currentForm).triggerHandler("invalid-form.validate", [this]);
			this.showErrors();
			return this.valid();
		},
		
		checkForm: function() {
			this.prepareForm();
			for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
				this.check( elements[i] );
			}
			return this.valid(); 
		},
		
		element: function( element ) {
			element = this.clean( element );
			this.lastElement = element;
			this.prepareElement( element );
			this.currentElements = $(element);
			var result = this.check( element );
			if ( result ) {
				delete this.invalid[element.name];
			} else {
				this.invalid[element.name] = true;
			}
			if ( !this.numberOfInvalids() ) {
				// Hide error containers on last error
				this.toHide = this.toHide.add( this.containers );
			}
			this.showErrors();
			return result;
		},

		showErrors: function(errors) {
			if(errors) {
				// 新增项到错误列表和地图
				$.extend( this.errorMap, errors );
				this.errorList = [];
				for ( var name in errors ) {
					this.errorList.push({
						message: errors[name],
						element: this.findByName(name)[0]
					});
				}
				// 从成功列表删除项
				this.successList = $.grep( this.successList, function(element) {
					return !(element.name in errors);
				});
			}
			this.settings.showErrors
				? this.settings.showErrors.call( this, this.errorMap, this.errorList )
				: this.defaultShowErrors();
		},
		
		resetForm: function() {
			if ( $.fn.resetForm )
				$( this.currentForm ).resetForm();
			this.submitted = {};
			this.prepareForm();
			this.hideErrors();
			this.elements().removeClass( this.settings.errorClass );
		},
		
		numberOfInvalids: function() {
			return this.objectLength(this.invalid);
		},
		
		objectLength: function( obj ) {
			var count = 0;
			for ( var i in obj )
				count++;
			return count;
		},
		
		hideErrors: function() {
			this.addWrapper( this.toHide ).hide();
		},
		
		valid: function() {
			return this.size() == 0;
		},
		
		size: function() {
			return this.errorList.length;
		},
		
		focusInvalid: function() {
			if( this.settings.focusInvalid ) {
				try {
					$(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus();
				} catch(e) { /* 在聚焦隐藏元素时忽略IE浏览器的错误抛出 */ }
			}
		},
		
		findLastActive: function() {
			var lastActive = this.lastActive;
			return lastActive && $.grep(this.errorList, function(n) {
				return n.element.name == lastActive.name;
			}).length == 1 && lastActive;
		},
		
		elements: function() {
			var validator = this,
				rulesCache = {};
			
			// select all valid inputs inside the form (no submit or reset buttons)
			return $([]).add(this.currentForm.elements)
			.filter(":input")
			.not(":submit, :reset, :image, [disabled]")
			.not( this.settings.ignore )
			.filter(function() {
				!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
			
				// select only the first element for each name, and only those with rules specified
				if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
					return false;
				
				rulesCache[this.name] = true;
				return true;
			});
		},
		
		clean: function( selector ) {
			return $( selector )[0];
		},
		
		errors: function() {
			return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
		},
		
		reset: function() {
			this.successList = [];
			this.errorList = [];
			this.errorMap = {};
			this.toShow = $([]);
			this.toHide = $([]);
			this.formSubmitted = false;
			this.currentElements = $([]);
		},
		
		prepareForm: function() {
			this.reset();
			this.toHide = this.errors().add( this.containers );
		},
		
		prepareElement: function( element ) {
			this.reset();
			this.toHide = this.errorsFor(element);
		},
	
		check: function( element ) {
			element = this.clean( element );
			
			// if radio/checkbox, validate first element in group instead
			if (this.checkable(element)) {
				element = this.findByName( element.name )[0];
			}
			
			var rules = $(element).rules();
			var dependencyMismatch = false;
			for( method in rules ) {
				var rule = { method: method, parameters: rules[method] };
				try {
					var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
					
					// if a method indicates that the field is optional and therefore valid,
					// don't mark it as valid when there are no other rules
					if ( result == "dependency-mismatch" ) {
						dependencyMismatch = true;
						continue;
					}
					dependencyMismatch = false;
					
					if ( result == "pending" ) {
						this.toHide = this.toHide.not( this.errorsFor(element) );
						return;
					}
					
					if( !result ) {
						this.formatAndAdd( element, rule );
						return false;
					}
				} catch(e) {
					this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
						 + ", check the '" + rule.method + "' method");
					throw e;
				}
			}
			if (dependencyMismatch)
				return;
			if ( this.objectLength(rules) )
				this.successList.push(element);
			return true;
		},
		
		// return the custom message for the given element and validation method
		// specified in the element's "messages" metadata
		customMetaMessage: function(element, method) {
			if (!$.metadata)
				return;
			
			var meta = this.settings.meta
				? $(element).metadata()[this.settings.meta]
				: $(element).metadata();
			
			return meta && meta.messages && meta.messages[method];
		},
		
		// return the custom message for the given element name and validation method
		customMessage: function( name, method ) {
			var m = this.settings.messages[name];
			return m && (m.constructor == String
				? m
				: m[method]);
		},
		
		// return the first defined argument, allowing empty strings
		findDefined: function() {
			for(var i = 0; i < arguments.length; i++) {
				if (arguments[i] !== undefined)
					return arguments[i];
			}
			return undefined;
		},
		
		defaultMessage: function( element, method) {
			return this.findDefined(
				this.customMessage( element.name, method ),
				this.customMetaMessage( element, method ),
				// title is never undefined, so handle empty string as undefined
				!this.settings.ignoreTitle && element.error || undefined,
				$.validator.messages[method],
				"<strong>Warning: No message defined for " + element.name + "</strong>"
			);
		},
		
		formatAndAdd: function( element, rule ) {
			var message = this.defaultMessage( element, rule.method );
			if ( typeof message == "function" ) 
				message = message.call(this, rule.parameters, element);
			this.errorList.push({
				message: message,
				element: element
			});
			this.errorMap[element.name] = message;
			this.submitted[element.name] = message;
		},
		
		addWrapper: function(toToggle) {
			if ( this.settings.wrapper )
				toToggle = toToggle.add( toToggle.parents( this.settings.wrapper ) );
			return toToggle;
		},
		
		defaultShowErrors: function() {
			for ( var i = 0; this.errorList[i]; i++ ) {
				var error = this.errorList[i];
				this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass );
				this.showLabel( error.element, error.message );
			}
			if( this.errorList.length ) {
				this.toShow = this.toShow.add( this.containers );
			}
			if (this.settings.success) {
				for ( var i = 0; this.successList[i]; i++ ) {
					this.showLabel( this.successList[i] );
				}
			}
			if (this.settings.unhighlight) {
				for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
					this.settings.unhighlight.call( this, elements[i], this.settings.errorClass );
				}
			}
			this.toHide = this.toHide.not( this.toShow );
			this.hideErrors();
			this.addWrapper( this.toShow ).show();
		},
		
		validElements: function() {
			return this.currentElements.not(this.invalidElements());
		},
		
		invalidElements: function() {
			return $(this.errorList).map(function() {
				return this.element;
			});
		},
		
		showLabel: function(element, message) {
			if(this.settings.tip == true)
			{
				$(element).attr('error',message);
				return false;
			};
			if(this.settings.errorlist)
			{
				if(!$("#error_"+$(element).attr("name"))[0])
					this.settings.errorlist.append("<span id='error_"+$(element).attr("name")+"'>"+$(element).parent().prev().text()+message+"</span>").show();
				
				if($("#u_page .form-content")[0] && $("#u_page").attr("autoBody") != undefined && window.parent.frames.winmsg) 
				{
					var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;
					var height = rootEl.clientHeight;
		
					var thead = $("#u_page .ui-form>thead").outerHeight(true);
					var tfoot = $("#u_page .ui-form>tfoot").outerHeight(true);
										
					$("#u_page .form-content").height(height - thead - tfoot);
				};
				return false;
			}
			else
			{
				var label = this.errorsFor( element );
				if ( label.length ) {
					// refresh error/success class
					label.removeClass().addClass( this.settings.errorClass );
				
					// check if we have a generated label, replace the message then
					label.attr("generated") && label.html(message);
				} else {
					// create label
					label = $("<" + this.settings.errorElement + "/>")
						.attr({"for":  this.idOrName(element), generated: true})
						.addClass(this.settings.errorClass)
						.html(message || "");
					if ( this.settings.wrapper ) {
						// make sure the element is visible, even in IE
						// actually showing the wrapped element is handled elsewhere
						label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
					}
					if ( !this.labelContainer.append(label).length )
						this.settings.errorPlacement
							? this.settings.errorPlacement(label, $(element) )
							: label.insertAfter(element);
				}
				if ( !message && this.settings.success ) {
					label.text("");
					typeof this.settings.success == "string"
						? label.addClass( this.settings.success )
						: this.settings.success( label );
				}
				this.toShow = this.toShow.add(label);
			};
		},
		
		errorsFor: function(element) {
			return this.errors().filter("[for='" + this.idOrName(element) + "']");
		},
		
		idOrName: function(element) {
			return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
		},

		checkable: function( element ) {
			return /radio|checkbox/i.test(element.type);
		},
		
		findByName: function( name ) {
			// select by name and filter by form for performance over form.find("[name=...]")
			var form = this.currentForm;
			return $(document.getElementsByName(name)).map(function(index, element) {
				return element.form == form && element.name == name && element  || null;
			});
		},
		
		getLength: function(value, element) {
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				return $("option:selected", element).length;
			case 'input':
				if( this.checkable( element) )
					return this.findByName(element.name).filter(':checked').length;
			}
			return value.length;
		},
	
		depend: function(param, element) {
			return this.dependTypes[typeof param]
				? this.dependTypes[typeof param](param, element)
				: true;
		},
	
		dependTypes: {
			"boolean": function(param, element) {
				return param;
			},
			"string": function(param, element) {
				return !!$(param, element.form).length;
			},
			"function": function(param, element) {
				return param(element);
			}
		},
		
		optional: function(element) {
			return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
		},
		
		startRequest: function(element) {
			if (!this.pending[element.name]) {
				this.pendingRequest++;
				this.pending[element.name] = true;
			}
		},
		
		stopRequest: function(element, valid) {
			this.pendingRequest--;
			// sometimes synchronization fails, make pendingRequest is never < 0
			if (this.pendingRequest < 0)
				this.pendingRequest = 0;
			delete this.pending[element.name];
			if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
				$(this.currentForm).submit();
			} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
				$(this.currentForm).triggerHandler("invalid-form", [this]);
			}
		},
		
		previousValue: function(element) {
			return $.data(element, "previousValue") || $.data(element, "previousValue", previous = {
				old: null,
				valid: true,
				message: this.defaultMessage( element, "remote" )
			});
		}
		
	},
	
	classRuleSettings: {
		required: {required: true},
		chinese: {chinese: true},
		english: {english: true},
		phone: {phone: true},
		mobile: {mobile: true},
		phoneormobile:{phoneormobile:true},
		zip: {zip: true},
		idcard: {idcard: true},
		safestring: {safestring: true},
		ipv4: {ipv4: true},
		email: {email: true},
		url: {url: true},
		date: {date: true},
		number: {number: true},
		digits: {digits: true},
		accept: {accept: true},
		equalTo: {equalTo: true},
		numberAndEnglish:{numberAndEnglish: true},
		isNumeric:{isNumeric: true},
		tableName:{tableName: true}
	},
	
	addClassRules: function(className, rules) {
		className.constructor == String ?
			this.classRuleSettings[className] = rules :
			$.extend(this.classRuleSettings, className);
	},
	
	classRules: function(element) {
		var rules = {};
		var classes = $(element).attr('class');
		classes && $.each(classes.split(' '), function() {
			if (this in $.validator.classRuleSettings) {
				$.extend(rules, $.validator.classRuleSettings[this]);
			}
		});
		return rules;
	},
	
	attributeRules: function(element) {
		var rules = {};
		var $element = $(element);
		
		for (method in $.validator.methods) {
			var value = $element.attr(method);
			if (value) {
				rules[method] = value;
			}
		}
		
		// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
		if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
			delete rules.maxlength;
		}
		
		return rules;
	},
	
	metadataRules: function(element) {
		if (!$.metadata) return {};
		
		var meta = $.data(element.form, 'validator').settings.meta;
		return meta ?
			$(element).metadata()[meta] :
			$(element).metadata();
	},
	
	staticRules: function(element) {
		var rules = {};
		var validator = $.data(element.form, 'validator');
		if (validator.settings.rules) {
			rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
		}
		return rules;
	},
	
	normalizeRules: function(rules, element) {
		// handle dependency check
		$.each(rules, function(prop, val) {
			// ignore rule when param is explicitly false, eg. required:false
			if (val === false) {
				delete rules[prop];
				return;
			}
			if (val.param || val.depends) {
				var keepRule = true;
				switch (typeof val.depends) {
					case "string":
						keepRule = !!$(val.depends, element.form).length;
						break;
					case "function":
						keepRule = val.depends.call(element, element);
						break;
				}
				if (keepRule) {
					rules[prop] = val.param !== undefined ? val.param : true;
				} else {
					delete rules[prop];
				}
			}
		});
		
		// evaluate parameters
		$.each(rules, function(rule, parameter) {
			rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
		});
		
		// clean number parameters
		$.each(['minlength', 'maxlength', 'min', 'max'], function() {
			if (rules[this]) {
				rules[this] = Number(rules[this]);
			}
		});
		$.each(['rangelength', 'range'], function() {
			if (rules[this]) {
				rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
			}
		});
		
		if ($.validator.autoCreateRanges) {
			// auto-create ranges
			if (rules.min && rules.max) {
				rules.range = [rules.min, rules.max];
				delete rules.min;
				delete rules.max;
			}
			if (rules.minlength && rules.maxlength) {
				rules.rangelength = [rules.minlength, rules.maxlength];
				delete rules.minlength;
				delete rules.maxlength;
			}
		}
		
		// To support custom messages in metadata ignore rule methods titled "messages"
		if (rules.messages) {
			delete rules.messages
		}
		
		return rules;
	},
	
	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
	normalizeRule: function(data) {
		if( typeof data == "string" ) {
			var transformed = {};
			$.each(data.split(/\s/), function() {
				transformed[this] = true;
			});
			data = transformed;
		}
		return data;
	},	
	
	addMethod: function(name, method, message) {
		$.validator.methods[name] = method;
		$.validator.messages[name] = message;
		if (method.length < 3) {
			$.validator.addClassRules(name, $.validator.normalizeRule(name));
		}
	},

	methods: {

		//必选字段
		required: function(value, element, param) {
			// check if dependency is met
			if ( !this.depend(param, element) )
				return "dependency-mismatch";
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				var options = $("option:selected", element);
				return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
			case 'input':
				if ( this.checkable(element) )
					return this.getLength(value, element) > 0;
			default:
				return value.length > 0;
			}
		},
		
		// 认证字段，服务器返回true或false
		remote: function(value, element, param) {
//			if ( this.optional(element) )
//				return "dependency-mismatch";
//			
			var previous = this.previousValue(element);
			
			if (!this.settings.messages[element.name] )
				this.settings.messages[element.name] = {};
			this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
			
//			if ( previous.old !== value ) {
//				previous.old = value;
//				var validator = this;
//				this.startRequest(element);
//				var data = {};
//				data[element.name] = value;
					
				//获取url，根据isparam来判断是否自动获取this的值附加到url后面
				//alert(param.isparam);
				var params;
				if(param.isparam == "true")
				params = param.url+value;
				else
				params = param.url;
				
				var relateValue = "";
				if(param.relative != "" && $(param.relative).length) relateValue = $(param.relative).val();
				
				if(relateValue == value)
				{
				   previous.valid = true;
				}
				else
				{				
				   $.ajax({
								url: params,
								//mode: "abort",
								//port: "validate" + element.name,
								type:"GET",
								dataType: "script",
								async:false,
								cache:false,
								//data: data,
								success: function(response) {						
//									if ( !response ) {
//										var errors = {};
//										errors[element.name] =  response || validator.defaultMessage( element, "remote" );
//										validator.showErrors(errors);
//									} else {
//										var submitted = validator.formSubmitted;
//										validator.prepareElement(element);
//										validator.formSubmitted = submitted;
//										validator.successList.push(element);
//										validator.showErrors();
//									}
//									if(!(response.constructor == Boolean))
//									Boolean(response);
									if($.trim(response) == "true" || $.trim(response) == true)									
									previous.valid = false;
									else if($.trim(response) == "false" || $.trim(response) == false)
									previous.valid = true;
//									validator.stopRequest(element, response);
									
								}
						});
						//return "pending";
					//ajaxback = !ajaxback);
					//ajaxback = response;
					//alert(previous.valid);
					
				};
//			} else if( this.pending[element.name] ) {
//					return "pending";
//			}
			//alert( Boolean(ajaxback) + ':' + typeof ajaxback);
			
			return  this.optional(element) || previous.valid;
		},

        // 中文字符 
		chinese: function(value, element) {
			//return this.optional(element) || /^[\u0391-\uFFE5]+$/.test(value);
			return this.optional(element) || /^[\u4e00-\u9fa5]+$/.test(value);
		},
		
		// 英文字符 
		english: function(value, element) {
			return this.optional(element) || /^[A-Za-z]+$/.test(value);
		},
		
		// 电话号码 
		phone: function(value, element) {
			return this.optional(element) || /^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/.test(value);
		},
		
		// 手机号码 
		mobile: function(value, element) {
			//return this.optional(element) || /^((\(\d{3}\))|(\d{3}\-))?1(3|5)\d{9}$/.test(value);
			return this.optional(element) || /^((\(\d{3}\))|(\d{3}\-))?1(?:3\d|5[012356789]|8[6789])\d{8}$/.test(value);
		},
		//手机或者电话号码
		phoneormobile: function(value, element) {
			//alert();
			//return this.phone(value, element) || this.mobile(value, element);
			return this.optional(element) || /^((\(\d{3}\))|(\d{3}\-))?1(?:3\d|5[012356789]|8[6789])\d{8}$/.test(value) || /^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/.test(value);
		},
		
		// 邮政编码 
		zip: function(value, element) {
			return this.optional(element) || /^[1-9]\d{5}$/.test(value);
		},
		
		// 身份证号码 
		idcard: function(value, element) {
			var d = new Date();
			var str = "" + value;
			var s = str.substring(6,10)+"/"+str.substring(10,12)+"/"+str.substring(12,14);
			
			var id_d = new Date(s);
			
			if(id_d > d && str.length == 18) 
				return false
			else
			return this.optional(element) || /^\d{15}(\d{2}[A-Za-z0-9])?$/.test(value);
		},
		
		// 符合安全规则的密码 
		safestring: function(value, element) {
			return this.optional(element) || !(/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/.test(value));
		},
		
		// IP地址 
		ipv4: function(value, element) {
			return this.optional(element) || /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/.test(value);
		},
		
		// 一个长度最少是 {0} 的字符串
		minlength: function(value, element, param) {
			return this.optional(element) || this.getLength(value, element) >= param;
		},
		
		// 一个长度最多是 {0} 的字符串
		maxlength: function(value, element, param) {
			return this.optional(element) || this.getLength(value, element) <= param;
		},
		
		// 一个长度介于 {0} 和 {1} 之间的字符串
		rangelength: function(value, element, param) {
			var length = this.getLength(value, element);
			return this.optional(element) || ( length >= param[0] && length <= param[1] );
		},
		
		// 一个最小为 {0} 的值
		min: function( value, element, param ) {
			return this.optional(element) || value >= param;
		},
		
		// 一个最大为 {0} 的值
		max: function( value, element, param ) {
			return this.optional(element) || value <= param;
		},
		
		// 一个介于 {0} 和 {1} 之间的值
		range: function( value, element, param ) {
			return this.optional(element) || ( value >= param[0] && value <= param[1] );
		},
		
		// 正确格式的电子邮件
		email: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
			return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(element.value);
		},
	
		// 合法的网址
		url: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
			return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(element.value);
		},
        
		// 合法的日期
		date: function(value, element) {
			return this.optional(element) || /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/.test(value);
		},
	
		// 合法的数字
		number: function(value, element) {
			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
		},
		
		// 整数
		digits: function(value, element) {
			return this.optional(element) || /^\d+$/.test(value);
		},
		
		// 拥有合法后缀名的字符串
		accept: function(value, element, param) {
			param = typeof param == "string" ? param : "png|jpe?g|gif";
			return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); 
		},
		
		// 再次输入相同的值
		equalTo: function(value, element, param) {
			return value == $(param).val();
		},
		
		//只能是由数字、26个英文字母或者下划线组成
		numberAndEnglish: function(value, element){
			return this.optional(element) || /^\w+$/.test(value);
		},
		
		//合法的正数字带小数点
		isNumeric: function(value, element){
			return this.optional(element) ||  /^[+|-]{0,1}(\d*)\.{0,1}\d{0,}$/.test(value);
		},		
		
		//只能是由英文字母开头,由a-z或A-Z,数字和_号组成
		tableName: function(value, element){
			return this.optional(element) ||  /^[A-Za-z]\w*$/.test(value);
		}		
	}
	
});

})(sundun);

;(function($) {
	$.each({
		focus: 'focusin',
		blur: 'focusout'	
	}, function( original, fix ){
		$.event.special[fix] = {
			setup:function() {
				if ( $.browser.msie ) return false;
				this.addEventListener( original, $.event.special[fix].handler, true );
			},
			teardown:function() {
				if ( $.browser.msie ) return false;
				this.removeEventListener( original,
				$.event.special[fix].handler, true );
			},
			handler: function(e) {
				arguments[0] = $.event.fix(e);
				arguments[0].type = fix;
				return $.event.handle.apply(this, arguments);
			}
		};
	});
	$.extend($.fn, {
		delegate: function(type, delegate, handler) {
			return this.bind(type, function(event) {
				var target = $(event.target);
				if (target.is(delegate)) {
					return handler.apply(target, arguments);
				}
			});
		},
		triggerEvent: function(type, target) {
			return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]);
		}
	})
})(sundun);


(function($) {

$.extend({
	metadata : {
		defaults : {
			type: 'class',
			name: 'metadata',
			cre: /({.*})/,
			single: 'metadata'
		},
		setType: function( type, name ){
			this.defaults.type = type;
			this.defaults.name = name;
		},
		get: function( elem, opts ){
			var settings = $.extend({},this.defaults,opts);
			// check for empty string in single property
			if ( !settings.single.length ) settings.single = 'metadata';
			
			var data = $.data(elem, settings.single);
			// returned cached data if it already exists
			if ( data ) return data;
			
			data = "{}";
			
			if ( settings.type == "class" ) {
				var m = settings.cre.exec( elem.className );
				if ( m )
					data = m[1];
			} else if ( settings.type == "elem" ) {
				if( !elem.getElementsByTagName )
					return undefined;
				var e = elem.getElementsByTagName(settings.name);
				if ( e.length )
					data = $.trim(e[0].innerHTML);
			} else if ( elem.getAttribute != undefined ) {
				var attr = elem.getAttribute( settings.name );
				if ( attr )
					data = attr;
			}
			
			if ( data.indexOf( '{' ) <0 )
			data = "{" + data + "}";
			
			data = eval("(" + data + ")");
			
			$.data( elem, settings.single, data );
			return data;
		}
	}
});

$.fn.metadata = function( opts ){
	return $.metadata.get( this[0], opts );
};

})(sundun);




(function($) {
$.widget("ui.dic", {
	_init: function() {
		var op = this.options; 
		var el = this.element;
		var self = this;
		
		//setTimeout(function(){//延迟初始化
							  
		//初始化时清空输入框的值
		el.val("");
		
		//设置字典输入框的id
		if(el.attr('id') == "" && el.attr('name') != "")
			el[0].id = el.attr('name');
		else if(el.attr('id') == "" && el.attr('name') == "")
		{
			el[0].id = el[0].name = 'mc_dic'+$('input:text').index(el);
		};
		//设置字典输入框的class
		if(!el.hasClass(op.inputClass)) el.addClass(op.inputClass);
		
		//字典名称
		this.dicName = el.attr('dic');
		//提前加载js到页面
		if(el.attr('dicjs') != undefined && $.trim(el.attr('dicjs')) != "" && el.attr('dicjs').indexOf('.js')>-1)
		{
			$.include(el.attr('dicjs'));
			
			var urlp = el.attr('dicjs').split('/');
			var urlf = urlp[urlp.length-1];
			var urlf = urlf.replace('.js','');
			
			this.dicName = urlf;
		};
		
		
		//宽度处理
		//var width = op.width;
		//if(el.css("width") != "auto") width = el.width();
		//el.css("width",(width - 18) + "px");
		
		//禁止输入框的自动完成功能
		el.attr("autocomplete","off");
		
		//取消加载后字典输入焦点
		el
		.blur()
		.focus(function(){
			self.getData();
		});
		
		if($.trim($('#'+el.attr('id').substring(3)).val()) != "" && $('#'+el.attr('id').substring(3)).val() != undefined ) self.getData();
		
		//},0);//延迟初始化
		
	},
	getData: function(){
		var op = this.options; 
		var el = this.element;
		var self = this;
			
		//如果数据是通过对象传进来		
		if(typeof(op.data)=='string' && !self.getdata)
		{
			if($('body').data(self.dicName) == undefined) $('body').data(self.dicName,eval(op.data + "()"));
				self.render();			
		}
		//如果数据是通过对象传进来		
		else if(typeof(op.data)=='object' && !self.getdata)
		{
			if($('body').data(self.dicName) == undefined) $('body').data(self.dicName,op.data);
				self.render();		
		}
		//如果数据是通过对象传进来		
		else if(el.attr("dicjs") != undefined && !self.getdata)
		{
			if($('body').data(self.dicName) == undefined) $('body').data(self.dicName,eval(self.dicName + '()'));
				self.render();		
		}
		//如果数据是通过ajax获取
		else if(op.url != false && $.trim(op.url) != ""  && !self.getdata)
		{
			$.ajax({ 
				url: op.url,
				dataType: "json", 
				async: false,
				success:function(json){
					if($('body').data(self.dicName) == undefined) $('body').data(self.dicName,json);
					self.render();
				}
			});
		}
		//从输入框属性取字典函数名
		else if(el.attr('dic') != undefined && !self.getdata)
		{
			if($('body').data(self.dicName) == undefined) $('body').data(self.dicName,eval(el.attr('dic') + "()"));
			self.render();
		}
		//从输入框属性取字典函数名
		else if(el.attr("linkaged") && el.attr('dic') != undefined && self.getdata)
		{
			$('body').data(self.dicName,eval(el.attr('dic') + "()"));
			self.render();
		}
		//从输入框属性取字典js路径
		else if(el.attr('dicjs') != undefined && $.trim(el.attr('dicjs')) != "" && !self.getdata)
		{
			var dicjs = el.attr('dicjs');
			if(dicjs.indexOf('.js')>-1)
			{
				//$.include(dicjs);
				
				setTimeout(function(){
					if($('body').data(self.dicName) == undefined) $('body').data(self.dicName,eval(self.dicName + '()'));
					self.render();
				},200);
				
			};
		}
		//从输入框属性取url,通过ajax获取
		else if(el.attr('dicurl') != undefined && $.trim(el.attr('dicurl')) != "" && !self.getdata)
		{
			this.dicName = el.attr("dicname");
			$('body').data('loaddic'+el.attr('id'),'async');			
			self.render();
		}
		;
		
		//过滤字典
		//if(el.attr("linkaged") && self.getdata) self.filter();
		
	},
	asyncLoadDic: function(){
		var el = this.element,self = this;
		var dicurl = el.attr('dicurl');
		$.ajax({ 
			url: dicurl,
			dataType: "json", 
			async: false,
			success:function(json){
				$('body').data(self.dicName,json);
				//self.render();
			}
		});
	},
	filter:function(){
		var op = this.options; 
		var el = this.element;
		var self = this;
		var elFilter = el.attr('filter')||op.filter||false;
		
		if(elFilter != false)
		{
			var data = $('body').data(self.dicName),datalist = [];
			//if(el.attr("linkaged")) data = self.dicdata;
			
			var filter_type = elFilter.split("|");
			if(elFilter.substring(0,1) == "^")
			{
				$.each(data,function(i,n){
					var ft = n[filter_type[1]];
					var r = new RegExp("^"+filter_type[0].substring(1));

					var is_filter = r.test(ft);
					if(is_filter == true)
						datalist.push(n);
				});
			}
			else if(filter_type[0] && filter_type[0].substring(filter_type[0].length - 1) == "$")
			{
				$.each(data,function(i,n){
					var ft = n[filter_type[1]];
					var r = new RegExp(filter_type[0].substring(0,filter_type[0].length - 1)+"$");

					var is_filter = r.test(ft);
					if(is_filter == true)
						datalist.push(n);
				});
			}
			if(elFilter.substring(0,2) == "[^")
			{
				$.each(data,function(i,n){
					var ft = n[filter_type[1]];
					var r = new RegExp("^((?!"+filter_type[0].substring(2,filter_type[0].length - 1)+").)*$");

					var is_filter = r.test(ft);
					if(is_filter == true)
						datalist.push(n);
				});
			}
			else
			{			
				$.each(data,function(i,n){
					var ft = n.dm + n.mc + n.pym;
					if(ft.indexOf(elFilter) > -1)
						datalist.push(n);
				});
			};
			$('body').data(self.dicName,datalist);
			//alert(datalist);
			if(el.attr("linkaged") && datalist == "") 
			{
				self.beginEmpty = true;
				$('body').data(self.dicName,data);
			};
			
		};
	},
	render: function(){
		var op = this.options; 
		var el = this.element;
		var self = this;
		
		self.getdata = true;
		
		//过滤字典
		self.filter();
		
		if($('body').data(self.dicName) == undefined)
			$('body').data(self.dicName,[]);
		
		//如果字典数据库的隐藏代码不存在，则创建
		if(!$('#'+el.attr('id').substring(3))[0])
		{
			el.after('<input type="hidden" name="'+ el.attr('id').substring(3) +'" id="'+ el.attr('id').substring(3) +'">');
		};
		//如果字典选择域未生成，则生成
		//if(!$('#warp_'+el.attr('id'))[0] && !el.attr("linkaged"))
		//{
		//	self.dataToDom();	
		//};
		if(op.translate == true)
		{
			var dmInputVal = $('#' + el.attr('id').substring(3)).val();
			$.each($('body').data(self.dicName),function(i,n){
				if(n.dm == dmInputVal) el.val($.trim(n.mc)).attr("pym",n.pym);
			});	
						
		};
		
		//联动			
		if(el.attr("linkage"))
		{
			var linkage_attr = el.attr("linkage").split("|");
			var linkage_item = linkage_attr[0];
			var linkage_el = $(linkage_attr[1]);
			var linkage_val = el.val();
			if(linkage_item == "pym") linkage_val = el.attr("pym");
			if(linkage_item == "dm") linkage_val = $("#"+el.attr("id").substring(3)).val();
			
			linkage_el.attr("filter","^"+linkage_val+"|"+linkage_item);
		};
			
		var timeout = null;
		
		el
		.bind('keydown',function(event){	
			if (timeout) clearTimeout(timeout);
			timeout = setTimeout(function(){
				if(op.async == true)
					self.searchItemAsync($.trim(el.val()));
				else
					self.searchItem($.trim(el.val()));
				
				//显示字典列表
				self.showDir();
				
				
				//如果字典显示输入框为空，清空字典值输入框
				if($.trim(el.val()) == '')
					$('#' + el.attr('id').substring(3)).val('');
				
			}, 100);
			
		})
		.bind('focus',function(event){//alert(JSON.stringify($('body').data('dicdata'+el.attr('id'))));
			//当前焦点所在字典
			//$("body").data("data-focus",$('#warp_'+el.attr('id')));
			
			if(el.attr("linkaged"))
			{
				//$('ui-dic-warp').remove();
				//过滤字典
				self.filter();
			};
		
			if($('body').data('loaddic'+el.attr('id')) == 'async' && $('body').data(self.dicName) == "")
			{
				self.asyncLoadDic();
				//$('body').data('loaddic'+el.attr('id'),null);
				//$('#warp_'+el.attr('id')).remove();
			};
			
			//if(!$('.ui-dic-warp')[0])
			//{
				self.dataToDom();
				//显示字典列表
				self.showDir();
			//}
			//else
			//	if(op.focusShow == true)
					//显示字典列表
			//		self.showDir();
			
			
			
		})
		.bind('blur',function(event){
			
			
			//if(el.attr("linkaged")) el.attr("render",false);
			//键盘操作：Delete和Backspace，检验字典规则
			if(op.checkRule == true)
			{
				self.checkRule($.trim(el.val()),$('#' + el.attr('id').substring(3)).val(),el.attr('id'));
				/*
				if($("#warp_"+ el.attr('id')).is(":hidden"))
				{
					if(op.async == true)
						self.searchItemAsync($.trim(el.val()));
					else
						self.searchItem($.trim(el.val()));
				};
				*/
			};
			
			setTimeout(function(){
				if(el.attr("callback") != undefined)
				{
					eval(el.attr("callback") + "('"+ $('#' + el.attr('id').substring(3)).val() + "','" + el.val() + "')");
				};
			},200);
		});
		
		
		$(document).mousedown(function(event){
			if(!!!$(event.target).parent().parent().hasClass(op.resultsClass) && !!!$(event.target).parent().parent().parent().parent().hasClass(op.resultsClass) && !!!$(event.target).parent().parent().parent().hasClass(op.resultsClass) && $(event.target).attr('id') != el.attr('id'))
			{
				$("div.ui-dic-results").each(function(){ $("li.hover",this).removeClass("hover"); });
				$('.ui-dic-warp').hide(); 
				
				
			};
		});
	},
	showDir: function(){
		var op = this.options; 
		var el = this.element;
		var self = this;
		var warp = $('.ui-dic-warp');
		
		var bodyHeight = this.body.clientHeight;
		var elTop = el.offset().top;
		var warpHeight = warp.outerHeight(true);
		
		if(bodyHeight - elTop - warpHeight - el.outerHeight(true) < 0)
		{
			warp.css({
				top: (elTop - warpHeight -1) + "px",
				left: el.offset().left + "px"
			});
		}
		else
		{
			warp.css({
				top: (el.offset().top + el[0].offsetHeight -1) + "px",
				left: el.offset().left + "px"
			});
		};
		warp.show();
		//if(warp.height() == 0) warp.hide();
	},
	checkRule: function(text,val,id){
		var self = this;
		var _text = text.split(',');
		var _val = val.split(',');
		var data = $('body').data(self.dicName)||[];
		var unaccordMC = [],accordDM = "",accordMC = "";
				
		for(i=0;i<_text.length;i++)
		{
			$.each(data,function(j,n){
				if(n.mc == _text[i] && n.dm == _val[i]) 
				{
					accordDM += ',' + n.dm;
					accordMC += ',' + n.mc;
				}
			});
		};
		//if($.msgbox && unaccordMC.length>0) $.msgbox.alert('字典有不完整的项'); else alert('字典有不完整的项');
		$('#' + this.element.attr('id').substring(3)).val(accordDM.substring(1));
		this.element.val(accordMC.substring(1));
		
		data = null;
	},
	disable: function(){
		this.element.removeClass(this.options.inputClass);
		$('.ui-dic-warp').remove();
		$('#'+this.element.attr('id').substring(3)).remove();
	},
	searchItem : function(val){
		var el = this.element;
		var div = $('.ui-dic-warp');
		var list = $('li',div);
		list.each(function(i){
			var data = this.title;
			if(data.indexOf(val) == -1 ) 
				$(this).hide(); 
			else
				$(this).show();			
		});
		if(this.options.rp > 0) this.paging();
	},
	searchItemAsync: function(val){
		var self = this;
		var el = this.element;
		var op = this.options;
		var data = $('body').data(self.dicName),data_results = [];
		var results = "";
		/*$.each(data,function(i,n){
			var v = n.dm + n.mc + n.pym;
			if(v.indexOf(val) > -1 )
				data_results.push(n);
		});*/
		var _val = val.split(',');
		for(k=0;k<_val.length;k++)
		{
			$.each(data,function(j,n){
				var v = n.dm + n.mc + n.pym;
				if(v.indexOf(_val[k]) > -1 )
					data_results.push(n);
						
			});
		};
		
		$('body').data('dicdata_search'+el.attr('id'),data_results);
		$.each(data_results,function(i,n){
			if(i >= op.rp)
				return false;
			var dm = (op.showDM == true)?("<span class='dic-dm'>"+ n.dm +"</span>"):"";
			var mc = (op.showMC == true)?("<span class='dic-mc'>"+ n.mc +"</span>"):"";
			var pym = (op.showPY == true)?("<span class='dic-py'>"+ n.pym +"</span>"):"";
			var cl = (i%2 == 0 ? "dic-even" : "dic-odd");
			results += "<li class='"+ cl +"' title='["+ $.trim(n.dm) +"]&#10;["+ $.trim(n.mc) +"]&#10;["+ $.trim(n.pym) +"]'>"+ dm + mc + pym +"</li>";
		});
		$(".ui-dic-warp" + " ul").html(results);
		$(".ui-dic-warp" + " li")
		.click(function(){	
			self.resultValue(this);
			$('.ui-dic-warp').hide();
		})
		.hover(
			function(){ $(this).addClass('hover'); },
			function(){ $(this).removeClass('hover'); }
		);
		this.paging(data_results.length);
	},
	resultValue : function(obj){
		var el = this.element;
		//结果列表中，当前点击行的title数组
		var dmv = obj.title.split(']');
		//结果列表中，当前点击行的显示名称
		var dicMcVal = $('.dic-mc',obj).text();
		//字典输入框的值
		var elVal = el.val();
		//字典代码输入框
		var dicDmVal = $('#'+el.attr('id').substring(3));
		//如果字典输入框已存在项则退出
		if(dicDmVal.val().indexOf(dmv[0].substring(1)) > -1) return  false;
		//如果可以多选
		var multiple =  el.attr('multiple')||this.options.multiple||false;
		if(multiple)
		{
			var mulVal = el.val(),dicMulVal = dicDmVal.val();
			if($.trim(mulVal) == "")
				mulVal = dicMcVal;
			else
				mulVal = mulVal + ',' + dicMcVal;
			//字典输入框的值
			el.val(mulVal);
			
			if($.trim(dicMulVal) == "")
				dicMulVal = dmv[0].substring(1);
			else
				dicMulVal = dicMulVal + ',' + dmv[0].substring(1);
			//字典输入框代码值
			dicDmVal.val(dicMulVal);
		}
		//单选
		else
		{
			//搜索结果的第一次点击处理
			if($(".ui-dic-warp" + " ul").attr('ss') == true) $(".ui-dic-warp" + " ul").attr('ss',false);
			//字典输入框的值
			el.val(dicMcVal);
			//字典输入框代码值
			$('#'+el.attr('id').substring(3)).val(dmv[0].substring(1));
			
			//联动			
			if(el.attr("linkage"))
			{
				var linkage_attr = el.attr("linkage").split("|");
				var linkage_item = linkage_attr[0];
				var linkage_el = $(linkage_attr[1]);
				var linkage_val = el.val();
				if(linkage_item == "pym") linkage_val = dmv[2].substring(2);
				if(linkage_item == "dm") linkage_val = $("#"+el.attr("id").substring(3)).val();
				
				linkage_el.attr("filter","^"+linkage_val+"|"+linkage_item);
				
				linkage_el.val("");
				$("#"+linkage_el.attr("id").substring(3)).val("");
			};
		}
	},
	paging : function(num){
		var op = this.options;
		var div = $('.ui-dic-warp');
		var allItem = $('li:visible',div).length;
		if(num != undefined)
			allItem = num;
		
		var pageNum = Math.ceil(allItem/op.rp);
			
		$('.num-all',div).text(pageNum);
		$('.num-now',div).text(1);
	},
	dataToDom : function(){
		var el = this.element;
		var op = this.options;
		var self = this;
		var data = $('body').data(self.dicName);
		
		if(data == undefined) return false;
		
		var warp = $(".ui-dic-warp")[0]?$(".ui-dic-warp"):$("<div class='ui-dic-warp' style='display:none' />").appendTo(document.body);
		
		warp.html("")
		.hide()
		.addClass(op.resultsClass)
		.css("position", "absolute")
		;
	
		list = $("<ul/>").appendTo(warp);
		//list.empty();
		
		//$.data(li, "dic_data", data[i]);
		
		//var begintime=new Date().getTime();
		var results = "";
		$.each(data,function(i,n){			
			if(op.async == true && i >= op.rp)
					return false;
				
			var dm = (op.showDM == true)?("<span class='dic-dm'>"+ n.dm +"</span>"):"";
			var mc = (op.showMC == true)?("<span class='dic-mc'>"+ n.mc +"</span>"):"";
			var pym = (op.showPY == true)?("<span class='dic-py'>"+ n.pym +"</span>"):"";
			var cl = (i%2 == 0 ? "dic-even" : "dic-odd");
			results += "<li class='"+ cl +"' title='["+ $.trim(n.dm) +"]&#10;["+ $.trim(n.mc) +"]&#10;["+ $.trim(n.pym) +"]'>"+ dm + mc + pym +"</li>";
			
		});
		list.html(results);
		
		$('li',list)
		.click(function(){
			self.resultValue(this,true);
			$("li.hover",warp).removeClass("hover");
			warp.hide();
			
			//键盘操作：Delete和Backspace，检验字典规则
				if(op.checkRule == true)
				{
					self.checkRule($.trim(el.val()),$('#' + el.attr('id').substring(3)).val(),el.attr('id'));
					/*
					if($("#warp_"+ el.attr('id')).is(":hidden"))
					{
						if(op.async == true)
							self.searchItemAsync($.trim(el.val()));
						else
							self.searchItem($.trim(el.val()));
					};
					*/
				};
		})
		.hover(
			function(){ $(this).addClass('hover'); },
			function(){ $(this).removeClass('hover'); }
		)
		;
				
		//var alltime=new Date().getTime() - begintime;
		//alert('加载时间为：'+ alltime +'ms');	
		//alert(results);		
		if ( $.fn.bgiframe )
			list.bgiframe();
		
		var dWidth = el.outerWidth() < 162 ? 162 :el.outerWidth()-2;
		warp.css({
			width: parseInt(dWidth) + "px",
			top: (el.offset().top + el[0].offsetHeight -1) + "px",
			left: el.offset().left + "px"
		});
		
		if(op.rp > 0)
		{
			warp.append('<div class="page"><span class="text">第</span><span class="num-now">1</span><span class="text">/</span><span class="num-all"></span><span class="text">页</span><span class="clear" title="清空输入内容"></span><span class="last"  title="最后一页"></span><span class="next" title="下一页"></span><span class="prev-disabled" title="上一页"></span><span class="first-disabled" title="第一页"></span></div>');
			$('ul',warp)
			.css({"position":"absolute","top":0,"left":0})
			.wrap('<div class="rp-warp"/>');
			$('.rp-warp',warp).css({'height':op.liHeight*op.rp,'overflow':'hidden',"position":"relative"});
			
			self.paging(data.length);
			
			$('.first-disabled',warp).click(function(){
				
				if(Number($('.num-now',warp).text()) == 1) return false;				
				$('.num-now',warp).text(1);
				
				if(op.async == true)
				{					
					var minnum = (Number($('.num-now',warp).text())-1)*op.rp;
					var maxnum = (Number($('.num-now',warp).text()))*op.rp;
					self.dataToDomAsync(Number($('.num-now',warp).text()),minnum,maxnum);
				}
				else
				{					
					var ul = $('ul',warp);
					var rollHeight = self.pxtonum(ul.css("top")) + self.pxtonum($('.rp-warp',warp).css('height'));
					ul.css("top",rollHeight);
				};
				
				if($('.next-disabled',warp)[0]) $('.next-disabled',warp).addClass("next").removeClass("next-disabled");
				if($('.last-disabled',warp)[0]) $('.last-disabled',warp).addClass("last").removeClass("last-disabled");
				
				$('.prev',warp).addClass("prev-disabled").removeClass("prev");
				$('.first',warp).addClass("first-disabled").removeClass("first");
			});
			$('.prev-disabled',warp).click(function(){
				
				if(Number($('.num-now',warp).text()) == 1) return false;				
				$('.num-now',warp).text(Number($('.num-now',warp).text()) - 1);
				
				if(op.async == true)
				{					
					var minnum = (Number($('.num-now',warp).text())-1)*op.rp;
					var maxnum = (Number($('.num-now',warp).text()))*op.rp;
					self.dataToDomAsync(Number($('.num-now',warp).text()),minnum,maxnum);
				}
				else
				{					
					var ul = $('ul',warp);
					var rollHeight = self.pxtonum(ul.css("top")) + self.pxtonum($('.rp-warp',warp).css('height'));
					ul.css("top",rollHeight);
				};
				
				if($('.next-disabled',warp)[0]) $('.next-disabled',warp).addClass("next").removeClass("next-disabled");
				if($('.last-disabled',warp)[0]) $('.last-disabled',warp).addClass("last").removeClass("last-disabled");
				
				if(Number($('.num-now',warp).text()) == 1)
				{
					$('.prev',warp).addClass("prev-disabled").removeClass("prev");
					$('.first',warp).addClass("first-disabled").removeClass("first");
				};
			});
			$('.next',warp).click(function(){
				if(Number($('.num-now',warp).text()) == Number($('.num-all',warp).text())) return false;		
				$('.num-now',warp).text(Number($('.num-now',warp).text()) + 1);
				
				if(op.async == true)
				{
					var minnum = (Number($('.num-now',warp).text())-1)*op.rp;
					var maxnum = Number($('.num-now',warp).text())*op.rp;	
					self.dataToDomAsync(Number($('.num-now',warp).text()),minnum,maxnum);
				}
				else
				{
					var ul = $('ul',warp);
					var rollHeight = self.pxtonum(ul.css("top")) - self.pxtonum($('.rp-warp',warp).css('height'));
					ul.css("top",rollHeight);
				};
				
				if($('.prev-disabled',warp)[0]) $('.prev-disabled',warp).addClass("prev").removeClass("prev-disabled");
				if($('.first-disabled',warp)[0]) $('.first-disabled',warp).addClass("first").removeClass("first-disabled");
				
				if(Number($('.num-now',warp).text()) == Number($('.num-all',warp).text()))
				{
					$('.next',warp).addClass("next-disabled").removeClass("next");
					$('.last',warp).addClass("last-disabled").removeClass("last");
				};
			});
			$('.last',warp).click(function(){
				if(Number($('.num-now',warp).text()) == Number($('.num-all',warp).text())) return false;		
				$('.num-now',warp).text($('.num-all',warp).text());
				
				if(op.async == true)
				{
					var minnum = (Number($('.num-now',warp).text())-1)*op.rp;
					var maxnum = Number($('.num-now',warp).text())*op.rp;	
					self.dataToDomAsync(Number($('.num-now',warp).text()),minnum,maxnum);
				}
				else
				{
					var ul = $('ul',warp);
					var rollHeight = self.pxtonum(ul.css("top")) - self.pxtonum($('.rp-warp',warp).css('height'));
					ul.css("top",rollHeight);
				};
				
				if($('.prev-disabled',warp)[0]) $('.prev-disabled',warp).addClass("prev").removeClass("prev-disabled");
				if($('.first-disabled',warp)[0]) $('.first-disabled',warp).addClass("first").removeClass("first-disabled");
				
				$('.next',warp).addClass("next-disabled").removeClass("next");
				$('.last',warp).addClass("last-disabled").removeClass("last");
			});
			
			$('.clear',warp).click(function(){
				el.val("");	
				$('#'+el.attr('id').substring(3)).val("");
			});
			
			//键盘操作
			if(op.keyboard == true)
			{
				$(document).keydown(function(event){
					switch(event.keyCode) {
						//UP
						case (38) :if(warp.is(":visible"))
									{
										warp.focus();
										if(!$('li.hover',warp)[0]) $('li:first',warp).addClass("hover");
										else $('li.hover',warp).prev("li").addClass("hover").siblings().removeClass("hover");
									}
									break
						//DOWN
						case (40) :if(warp.is(":visible"))
									{
										warp.focus();
										if(!$('li.hover',warp)[0]) $('li:first',warp).addClass("hover");
										else $('li.hover',warp).next("li").addClass("hover").siblings().removeClass("hover");
									}
									break
						//ENTER
						case (13) :if($('li.hover',warp)[0] && warp.is(":visible")) $('li.hover',warp).click();$('li.hover',warp).removeClass("hover");
									if(el.attr("callback") != undefined)
									{
										eval(el.attr("callback") + "('"+ $('#' + el.attr('id').substring(3)).val() + "','" + el.val() + "')");
									};
									break
						//LEFT
						case (37) :warp.focus();
									$('.prev',warp).click();
									break
						//RIGHT
						case (39) :warp.focus();
									$('.next',warp).click();
									break
						//PAGE_UP
						case (33) :warp.focus();
									$('.prev',warp).click();
									break
						//PAGE_DOWN
						case (34) :warp.focus();
									$('.next',warp).click();
									break
						//BACKSPACE
						//case (8) :$("#"+$("div.ui-dic-results:visible").attr("id").substring(5)).focus();
						//			break
						default   :event.returnValue = true
									break
				
						}
				
				});
			};
		};
		
		results = null;
	},
	dataToDomAsync : function(page,minnum,maxnum){
		var el = this.element;
		var op = this.options;
		var self = this;
		var results = "";
		var dicdata = $('body').data(self.dicName);
		var dicdata_search = $('body').data('dicdata_search'+el.attr('id'));
		
		
		if(dicdata_search != undefined) dicdata = dicdata_search;
		
		//self.paging(data.length);
		
		$.each(dicdata,function(i,n){
			if(i >= minnum)
			{
				var dm = (op.showDM == true)?("<span class='dic-dm'>"+ n.dm +"</span>"):"";
				var mc = (op.showMC == true)?("<span class='dic-mc'>"+ n.mc +"</span>"):"";
				var pym = (op.showPY == true)?("<span class='dic-py'>"+ n.pym +"</span>"):"";
				var cl = (i%2 == 0 ? "dic-even" : "dic-odd");
				results += "<li class='"+ cl +"' title='["+ $.trim(n.dm) +"]&#10;["+ $.trim(n.mc) +"]&#10;["+ $.trim(n.pym) +"]'>"+ dm + mc + pym +"</li>";
			};
			if(i >= maxnum) return false;
		});
		$("ul",".ui-dic-warp").html(results);
		$("li",".ui-dic-warp")
		.click(function(){			
			self.resultValue(this,true);
			$('.ui-dic-warp').hide();
		})
		.hover(
			function(){ $(this).addClass('hover'); },
			function(){ $(this).removeClass('hover'); }
		)
		;
		if( $.fn.bgiframe )
			$(".ui-dic-warp" + " ul").bgiframe();
	}
});
$.extend($.ui.dic, {
	version: "2.0",
	defaults: {
		data:false,
		url:false,
		inputClass: "form-dic",//字典输入框样式
		resultsClass: "ui-dic-results",//字典列表样式
		showDM:false,//不显示代码
		showMC:true,//显示名称
		showPY:false,//不显示拼音
		rp:8,//默认一页显示数据
		liHeight:20,//默认每条数据高度
		async:true,//默认异步加载数据
		translate:true,//默认不根据默认值来显示字典名称
		multiple:false,//默认不准多选
		filter:false,//根据条件来过滤
		focusShow:true,//是否焦点时显示字典列表
		checkRule:true,
		keyboard:true,
		width:180
	}
});

})(sundun);


(function($) {
$.widget("ui.datetime", {
	_init: function() {
		var op = this.options;
		var el = this.element;
		var self = this;
		
		setTimeout(function(){//延迟初始化
							
		//宽度处理
		var width = op.width;
		if(el.css("width") != "auto") width = el.width();		
		el.css("width",(width - 18) + "px");
		
		//禁止输入框的自动完成功能
		el.attr("autocomplete","off");
		
		//设置id
		if(el.attr('id') == "")
			el[0].id = 'datetime_'+$('input:text').index(el);
		
		//默认为日期事件输入框
		if(op.calendar == false)
		{
			if(!el.hasClass('form-datetime')) el.addClass('form-datetime');
			//验证合法性
			if(op.validate && $.trim(el.val()) != "")
			{
				var vali = self.validate(el.val());
				if(vali != true)
				{
					if($.msgbox) $.msgbox.alert("输入的日期时间不合法。合法格式为："+vali); else alert("输入的日期时间不合法。合法格式为："+vali);
					el.val("");
					return false;
				};
			};
			
			self.input = self.element;
			self.bindMethodsToObj("show", "hide", "hideIfClickOutside", "keydownHandler", "selectDate");
			  
			self.build();
			self.selectDate();
			self.selectTime();
			self.footButton();
			self.hide();
			
			if(op.showToday == true) el.val( self.datetimeToString(new Date()) );
		}
		//日历模式
		else
		{
			$.ajax({ 
				url: op.url,
				dataType: "json", 
				async: false,
				success:function(json){
					op.calendarData = json;
				}
			});
			self.build(true);
			self.selectDate();
			$('.ui-datetime',el).css({'display':'block','position':'static'});
		};
		
		//var warp_width = op.width - 6;
		
		$('#warp_'+el[0].id).css("width","162px");
		if(op.background != false) $('#warp_'+el[0].id).css({'background':op.background});
		if(op.border != false) $('#warp_'+el[0].id).css({'border':op.border});
		
		el.bind('blur',function(event){
			//验证合法性
			if(op.validate && $.trim(el.val()) != "")
			{
				var vali = self.validate(el.val());
				if(vali != true)
				{
					if($.msgbox) $.msgbox.alert("输入的日期时间不合法。合法格式为："+vali); else alert("输入的日期时间不合法。合法格式为："+vali);
					el.val("");
					return false;
				};
			};
		});
		
		},0);//延迟初始化
	},
	validate:function(val){
		var format =  this.options.format;
		var msg = false;
		
		var p1 = /^\d{4}[\-]{1}\d{2}[\-]{1}\d{2}$/; //yyyy-MM-dd
		var p2 = /^\d{4}[\-]{1}\d{2}[\-]{1}\d{2}\s{1}\d{2}[\:]{1}\d{2}[\:]{1}\d{2}$/; //yyyy-MM-dd hh:mm:ss
		var p3 = /^\d{4}[\-]{1}\d{2}[\-]{1}\d{2}\s{1}\d{2}[\:]{1}\d{2}$/; //yyyy-MM-dd hh:mm
		var p4 = /^\d{4}[\-]{1}\d{2}[\-]{1}\d{2}\s{1}\d{2}$/; //yyyy-MM-dd hh
		var p5 = /^\d{4}[\/]{1}\d{2}[\/]{1}\d{2}$/; //yyyy/MM/dd
		var p6 = /^\d{4}[\/]{1}\d{2}[\/]{1}\d{2}\s{1}\d{2}[\:]{1}\d{2}[\:]{1}\d{2}$/; //yyyy/MM/dd hh:mm:ss
		var p7 = /^\d{4}[\/]{1}\d{2}[\/]{1}\d{2}\s{1}\d{2}[\:]{1}\d{2}$/; //yyyy/MM/dd hh:mm
		var p8 = /^\d{4}[\/]{1}\d{2}[\/]{1}\d{2}\s{1}\d{2}$/; //yyyy/MM/dd hh
		var p9 = /^\d{4}[年]{1}\d{2}[\月]{1}\d{2}[\日]{1}$/; //yyyy年MM月dd日
		var p10 = /^\d{4}[年]{1}\d{2}[\月]{1}\d{2}[\日]{1}\s{1}\d{2}[时]{1}\d{2}[分]{1}\d{2}[秒]{1}$/; //yyyy年MM月dd日 hh时mm分ss秒
		var p11 = /^\d{4}[年]{1}\d{2}[\月]{1}\d{2}[\日]{1}\s{1}\d{2}[时]{1}\d{2}[分]{1}$/; //yyyy年MM月dd日 hh时mm分
		var p12 = /^\d{4}[年]{1}\d{2}[\月]{1}\d{2}[\日]{1}\s{1}\d{2}[时]{1}$/; //yyyy年MM月dd日 hh时
		
		switch(format) {
			case ("yyyy-MM-dd") :
						if(p1.test(val)) msg = true; else msg = "yyyy-MM-dd";
					    break
			case ("yyyy-MM-dd hh:mm:ss") :
						if(p2.test(val)) msg = true; else msg = "yyyy-MM-dd hh:mm:ss";
					    break
			case ("yyyy-MM-dd hh:mm") :
						if(p3.test(val)) msg = true; else msg = "yyyy-MM-dd hh:mm";
					    break
			case ("yyyy-MM-dd hh") :
						if(p4.test(val)) msg = true; else msg = "yyyy-MM-dd hh";
					    break
			case ("yyyy/MM/dd") :
						if(p5.test(val)) msg = true; else msg = "yyyy/MM/dd";
					    break
			case ("yyyy/MM/dd hh:mm:ss") :
						if(p6.test(val)) msg = true; else msg = "yyyy/MM/dd hh:mm:ss";
					    break
			case ("yyyy/MM/dd hh:mm") :
						if(p7.test(val)) msg = true; else msg = "yyyy/MM/dd hh:mm";
					    break
			case ("yyyy/MM/dd hh") :
						if(p8.test(val)) msg = true; else msg = "yyyy/MM/dd hh";
					    break
			case ("yyyy年MM月dd日") :
						if(p9.test(val)) msg = true; else msg = "yyyy年MM月dd日";
					    break
			case ("yyyy年MM月dd日 hh时mm分ss秒") :
						if(p10.test(val)) msg = true; else msg = "yyyy年MM月dd日 hh时mm分ss秒";
					    break
			case ("yyyy年MM月dd日 hh时mm分") :
						if(p11.test(val)) msg = true; else msg = "yyyy年MM月dd日 hh时mm分";
					    break
			case ("yyyy年MM月dd日 hh时") :
						if(p12.test(val)) msg = true; else msg = "yyyy年MM月dd日 hh时";
					    break
			default   :msg = true;
						break
				
		};
		
		return msg;
	},
	disable: function(){
		this.element.removeClass('form-datetime');
		$('div.ui-datetime').remove();
	},
	build: function(bool) {
		var el = this.element;
		var op = this.options;
		var self = this;
		//月份列表
		var monthList = '<span class="monthList"><select><option value="1">一月</option><option value="2">二月</option><option value="3">三月</option><option value="4">四月</option><option value="5">五月</option><option value="6">六月</option><option value="7">七月</option><option value="8">八月</option><option value="9">九月</option><option value="10">十月</option><option value="11">十一月</option><option value="12">十二月</option></select></span>';
		var nowMonth = new Date().getMonth() + 1;
		//月份显示
		var monthNav = $('<p class="month-nav">' +
		  '<span class="button prev" title="[Page-Up]"></span>' +
		  ' <span class="month-name" val="'+nowMonth+'"></span> ' +
		  '<span class="button next" title="[Page-Down]"></span>' +
		  '</p>');
		
		this.monthNameSpan = $(".month-name", monthNav);
		//将月份列表附加到月份显示区域，默认隐藏
		this.monthNameSpan.after(monthList);
		//定义月份上一月和下一月的事件
		$(".prev", monthNav).click(function(){
			if($.trim($(".month-name", monthNav).text()) == '一月') 
			{
				$(".prev", yearNav).click();
				self.bindToObj(self.moveMonthBy(11));
			}
			else
			self.bindToObj(self.moveMonthBy(-1));
			
			$('.monthList', monthNav).hide();
			$(".month-name", monthNav).show();
		});
		$(".next", monthNav).click(function(){
			if($.trim($(".month-name", monthNav).text()) == '十二月') 
			{
				$(".next", yearNav).click();
				self.bindToObj(self.moveMonthBy(-Number($(".month-name", monthNav).attr('val')) + 1));
			}
			else
				self.bindToObj(self.moveMonthBy(1));
			
			
			$('.monthList', monthNav).hide();
			$(".month-name", monthNav).show();
		});
		//月份显示块的点击事件，显示和隐藏月份列表
		this.monthNameSpan.click(function(){ $('.monthList', monthNav).toggle();$(".month-name", monthNav).toggle(); });
		//月份列表的点击事件，将选中的月份替换到月份显示块中，并更新日历
		$(".monthList select", monthNav).change(function(){
			var thisIndex = Number(this.value);
			var nowIndex = Number($(".month-name", monthNav).attr('val'));
			
			self.bindToObj(self.moveMonthBy(thisIndex - nowIndex));
			
			$(".month-name", monthNav).text( $('option:selected',this).text() ).attr('val',thisIndex).show();
			$('.monthList', monthNav).hide();
		});
		//年份的列表
		var yearListLi = "",nowYear = new Date().getFullYear();
		for(i=1900;i<2101;i++)
		{
			if(i == nowYear)
				yearListLi += "<option selected='selected' value='"+ i +"'>" + i + "</option>";
			else
				yearListLi += "<option value='"+ i +"'>" + i + "</option>";
		}
		var yearList = '<span class="yearList"><select>'+ yearListLi +'<li class="add">+</select></span>';
		//年份显示块
		var yearNav = $('<p class="year-nav">' +
		  '<span class="button prev" title="[Ctrl+Page-Up]"></span>' +
		  ' <span class="year-name"></span> ' +
		  '<span class="button next" title="[Ctrl+Page-Down]"></span>' +
		  '</p>');
		//给年份显示附加上今年年份值
		this.yearNameSpan = $(".year-name", yearNav).text(nowYear);
		//将年份列表附加到年份显示块中
		this.yearNameSpan.after(yearList);
		//年份的上一年和下一年点击事件
		$(".prev", yearNav).click(function(){
			self.bindToObj(self.moveMonthBy(-12));
			self.yearNameSpan.text( Number(self.yearNameSpan.text()) - 1 );
			$('.yearList', yearNav).hide();$(".year-name", yearNav).show();
		});
		$(".next", yearNav).click(function(){
			self.bindToObj(self.moveMonthBy(12));
			self.yearNameSpan.text( Number(self.yearNameSpan.text()) + 1 );
			$('.yearList', yearNav).hide();$(".year-name", yearNav).show();
		});
		//年份块点击事件，显示和隐藏年份列表，将年份显示块可以直接输入修改年份
		var yearInputVal = Number(this.yearNameSpan.val());
		this.yearNameSpan
		.click(function(){ $('.yearList', yearNav).toggle();$(".year-name", yearNav).toggle(); });
		
		//年份列表的点击事件，附加选中年份到年份显示块，并且更新日历
		$('.yearList select', yearNav).change(function(){
			var thisYear = Number( this.value );
			var nowYear = Number($(".year-name", yearNav).text());
			
			self.bindToObj(self.moveMonthBy((thisYear - nowYear)*12));
			
			$(".year-name", yearNav).text(thisYear).show();
			$('.yearList', yearNav).hide();
		});
		
		//将月份显示块和年份显示块附加到面板
		var nav = $('<div class="nav"></div>').append(monthNav, yearNav);
		
		var tableShell = "<table><thead><tr>";
		$(this.adjustDays(op.short_day_names)).each(function() {
		  tableShell += "<th>" + this + "</th>";
		});
		tableShell += "</tr></thead><tfoot></tfoot><tbody></tbody></table>";
		
		
			this.dateSelector = this.rootLayers = $('<div class="ui-datetime"></div>').append(nav, tableShell).attr("id","warp_"+el[0].id);
			
			//.insertAfter(this.input);
			if(bool == true)
				this.element.append(this.rootLayers);
			else
				$('body').append(this.rootLayers);
			//面板背景处理
			if ($.browser.msie && $.browser.version < 7) {
			  
			  this.ieframe = $('<iframe class="ui-datetime-ieframe" frameborder="0" src="#"></iframe>').insertBefore(this.dateSelector);
			  this.rootLayers = this.rootLayers.add(this.ieframe);
			  
			  $(".button", nav).mouseover(function() { $(this).addClass("hover") });
			  $(".button", nav).mouseout(function() { $(this).removeClass("hover") });
			};
			
			this.tbody = $("tbody", this.dateSelector);
			
			this.tfoot = $("tfoot", this.dateSelector);
			
			//if(bool != true) this.input.change(this.bindToObj(function() { this.selectDate(); }));
			this.selectDate();
	},
	
	selectMonth: function(date) {
		var self = this;
		var op = this.options;
		var newMonth = new Date(date.getFullYear(), date.getMonth(), 1);
		
		if (!this.currentMonth || !(this.currentMonth.getFullYear() == newMonth.getFullYear() &&
									this.currentMonth.getMonth() == newMonth.getMonth())) {
		  
		  this.currentMonth = newMonth;
		  
		  var rangeStart = this.rangeStart(date), rangeEnd = this.rangeEnd(date);
		  var numDays = this.daysBetween(rangeStart, rangeEnd);
		  var dayCells = "";
		  
		  for (var i = 0; i <= numDays; i++) {
			var currentDay = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate() + i, 12, 00);
			
			if (this.isFirstDayOfWeek(currentDay)) dayCells += "<tr>";
			
			var today = new Date(),todayClass = '';
			if(today.getDate() == currentDay.getDate()) todayClass = 'today';
			
			if (currentDay.getMonth() == date.getMonth()) {
			  dayCells += '<td class="selectable-day '+todayClass+'" title="' + this.dateToString(currentDay) + '" date="' + this.dateToString(currentDay) + '">' + currentDay.getDate() + '</td>';
			} else {
			  dayCells += '<td class="selectable-day unselected-month" date="' + this.dateToString(currentDay) + '">' + currentDay.getDate() + '</td>';
			};
			
			if (this.isLastDayOfWeek(currentDay)) dayCells += "</tr>";
		  };
		  this.tbody.empty().append(dayCells);
		  
		  this.monthNameSpan.empty().append(this.monthName(date));
		  
		  //日历内容
		  if(op.calendar == true && op.calendarData != null)
		  {
		  		$.each(op.calendarData,function(i,n){
					$("td[date="+n.datetime+"]",self.tbody).attr("title",n.text).addClass("msg").click(function(){ window.open(n.url); });
				});
		  };
		  
		  //this.yearNameSpan.val('').val(this.currentMonth.getFullYear());
		  
		  $(".selectable-day", this.tbody).click(this.bindToObj(function(event) {				
				if(self.options.format.indexOf('hh') > -1)
				{
					var time = self.options.format.split(" ")[1];
					time=time.replace(/hh|HH/,$('.select-hour .text').val()); 
					time=time.replace(/h|H/g,$('.select-hour .text').val()); 
					time=time.replace(/mm/,$('.select-minute .text').val()); 
					time=time.replace(/m/g,$('.select-minute .text').val()); 
					time=time.replace(/ss|SS/,$('.select-second .text').val()); 
					time=time.replace(/s|S/g,$('.select-second .text').val()); 
					
					if(self.options.calendar != true) 
						this.changeInput($(event.target).attr("date") +" "+ time);
					else
						if(typeof self.options.callback == 'function') self.options.callback($(event.target).attr("date") + time,$(event.target));
				}
				else
		  			if(self.options.calendar != true) 
						this.changeInput($(event.target).attr("date"));
					else
						if(typeof self.options.callback == 'function') self.options.callback($(event.target).attr("date"),$(event.target));
				
		  }));
		  
		  $("td[date=" + this.dateToString(new Date()) + "]", this.tbody).addClass("today");
		  
		  $("td.selectable-day", this.tbody).mouseover(function() { $(this).addClass("hover") });
		  $("td.selectable-day", this.tbody).mouseout(function() { $(this).removeClass("hover") });
		};
		
		$('.selected', this.tbody).removeClass("selected");
		$('td[date=' + this.selectedDateString + ']', this.tbody).addClass("selected");
		
		$('.ui-datetime td',this.element).css({'width':(this.options.width - 4)/7,'height':(this.options.width - 4)/7});
	},	
	selectDate: function(date) {	
		if (!date) date = new Date();
		
		this.selectedDate = date;
		this.selectedDateString = this.dateToString(this.selectedDate);
		this.selectMonth(this.selectedDate);
	},	
	selectTime: function(date) {
		var self = this;
		if (typeof(date) == "undefined") {
		  date = this.stringToDate(this.input.val());
		};
		if (!date) date = new Date();
		var time = "";
		var info = '<tr><th colspan="7">' + date.getFullYear() + '年' + (date.getMonth()+1) + '月' + date.getDate() + '日' + time +  '</th></tr>';
		
		if(this.options.format.indexOf('hh') > -1)
		{
			info = '<tr><th colspan="7">' 
			+ date.getFullYear() + '年' 
			+ (date.getMonth()+1) + '月' 
			+ date.getDate() + '日'
			+  '&nbsp;&nbsp;'
			+ '<span class="select-hour"><input class="text" type="text" value="'+ (date.getHours()>9?date.getHours().toString():"0" + date.getHours()) +'"></span>时'
			+ '<span class="select-minute"><input class="text" type="text" value="'+ (date.getMinutes()>9?date.getMinutes().toString():"0" + date.getMinutes()) +'"></span>分<span class="select-second" style="display:none;"><input class="text" type="text" value="'+ (date.getSeconds()>9?date.getSeconds().toString():"0" + date.getSeconds()) +'">'
			+ '</th></tr>';
		};
		var tfoot = this.tfoot;
		tfoot.append(info);
		
		var dateListLi = "",nowHour = date.getHours() > 4 ?date.getHours():4;
		for(i=-4;i<4;i++)
		{
			dateListLi += "<li>" + ((nowHour + i)>9?(nowHour + i):"0"+(nowHour + i)) + "</li>";
		}
		var dateList = '<div class="dateList"><ul><li class="sub">-</li>'+ dateListLi +'<li class="add">+</li></ul></div>';
		$('.select-hour',tfoot).prepend(dateList);
		$('.select-hour .text',tfoot)
		.click(function(){ $('.dateList').toggle(); })
		.blur(function(){ 
			if( Number($(this).val()) < 0 || Number($(this).val()) > 23 ) 
			{
				$(this).val(date.getHours()>9?date.getHours():"0"+date.getHours());
				if($.msgbox) $.msgbox.alert('小时数值超过合法范围！'); else alert('小时数值超过合法范围!');
			}
		});
		
		$(".dateList li:not(.sub):not(.add)", tfoot).live('click',function(){			
			$(".select-hour .text", tfoot).val($(this).text());
			$('.dateList').hide();
		});
		
		$(".dateList li.sub", tfoot).click(function(){
			//var timerSubYear = window.setTimeout(function(){ subYear(_this) },500);
			if($(".dateList li:visible", tfoot).eq(1).text() <= 1) return false;
			self.subItem(this,$(".dateList li:visible", tfoot));
		});
		$(".dateList li.add", tfoot).click(function(){
			//var timerAddYear = window.setTimeout(function(){ addYear(_this) },500);
			if($(".dateList li:visible", tfoot).eq($(".dateList li:visible", tfoot).length - 2).text() >= 23) return false;		
			self.addItem(this,$(".dateList li:visible", tfoot));
		});
		
		var minuteListLi = "",nowMinute = date.getMinutes() > 4 ?date.getMinutes():4;
		for(i=-4;i<4;i++)
		{
			minuteListLi += "<li>" + ((nowMinute + i)>9?(nowMinute + i):"0"+(nowMinute + i)) + "</li>";
		}
		var minuteList = '<div class="minuteList"><ul><li class="sub">-</li>'+ minuteListLi +'<li class="add">+</li></ul></div>';
		$('.select-minute',tfoot).prepend(minuteList);
		$('.select-minute .text',tfoot)
		.click(function(){ $('.minuteList').toggle(); })
		.blur(function(){ 
			if( Number($(this).val()) < 0 || Number($(this).val()) > 59 ) 
			{
				$(this).val(date.getMinutes()>9?date.getMinutes():"0"+date.getMinutes());
				if($.msgbox) $.msgbox.alert('分钟数值超过合法范围！'); else alert('分钟数值超过合法范围!');
			}
		});
		
		$(".minuteList li:not(.sub):not(.add)", tfoot).live('click',function(){			
			$(".select-minute .text", tfoot).val($(this).text());
			$('.minuteList').hide();
		});
		
		$(".minuteList li.sub", tfoot).click(function(){
			//var timerSubYear = window.setTimeout(function(){ subYear(_this) },500);
			if($(".minuteList li:visible", tfoot).eq(1).text() <= 1) return false;
			self.subItem(this,$(".minuteList li:visible", tfoot));
		});
		$(".minuteList li.add", tfoot).click(function(){
			//var timerAddYear = window.setTimeout(function(){ addYear(_this) },500);	
			if($(".minuteList li:visible", tfoot).eq($(".minuteList li:visible", tfoot).length - 2).text() >= 59) return false;	
			self.addItem(this,$(".minuteList li:visible", tfoot));
		});
	},
	subItem: function(obj,el){
		var showFirst = el.eq(1);
		var showFirstText = showFirst.text();
		if(showFirstText.substring(0,1) == "0") showFirstText = Number(showFirstText.substring(1)); else showFirstText = Number(showFirstText)
		var firstPrevText = showFirst.prev().text();
		if(firstPrevText.substring(0,1) == "0") firstPrevText = Number(firstPrevText.substring(1)); else firstPrevText = Number(firstPrevText);
		var d = showFirstText - 1 > 9?(showFirstText - 1):"0" + (showFirstText - 1);
		if( firstPrevText - 1 > 1)
		{
			showFirst.prev().show();
		}
		else
		{
			$(obj).after("<li>"+d+"</li>");
		};
		el.eq(el.length - 2).hide();
	},
	addItem: function(obj,el){
		var showLast = el.eq(el.length - 2);
		var showLastText = showLast.text();
		if(showLastText.substring(0,1) == "0") showLastText = Number(showLastText.substring(1)); else showLastText = Number(showLastText);
		var lastNextText = showLast.next().text();
		if(lastNextText.substring(0,1) == "0") lastNextText = Number(lastNextText.substring(1)); else lastNextText = Number(lastNextText)
		var m = showLastText + 1 > 9?(showLastText + 1):"0" + (showLastText + 1);
		if(lastNextText + 1 > 1)
		{
			showLast.next().show();
		}
		else
		{
			$(obj).before("<li>"+m+"</li>");				
		};
		el.eq(1).hide();
	},
	footButton: function(){
		var el = this.element;
		var botton = '<tr><th colspan="7"><input type="button" value="清空" class="clearInput"></th></tr>';
		this.tfoot.append(botton);
		$('.clearInput',this.tfoot).click(function(){ el.val(""); });
	},
	changeInput: function(dateString) {		
		//比较
		if(this.options.between != false)
		{
			var before = $(this.options.between).val();
			var pass = this.between(before,dateString);
			
			if(pass)
			{
				this.input.val(dateString).change();
				this.hide();
			}
			else
				if($.msgbox) $.msgbox.alert(this.options.betweenMsg); else alert(this.options.betweenMsg);
		}
		else
		{
			this.input.val(dateString).change();
			this.hide();
		};
	},
	between:function(before,after){
		var op = this.options;
		var el = this.element;
		var self = this;
		var before = self.strToDate(before);
		var after = self.strToDate(after);
		if(after.getTime() - before.getTime() > 0) 
			return true;
		else
			return false;
	},
	strToDate:function(date){
		var ayear = 0,amonth = 0,aday = 0,ahour = 0,aminute = 0,asecond = 0,assign; 
		if(date.indexOf("/")>-1)
		{
			return new Date(date);
		}
		else if(date.indexOf("-")>-1)
		{
			date = date.replace(/-/g,"").replace(/:/g,"").replace(/ /g,"");
		}
		else if(date.indexOf("年")>-1)
		{
			date = date.replace(/年/g,"").replace(/月/g,"").replace(/日/g,"").replace(/时/g,"").replace(/分/g,"").replace(/秒/g,"").replace(/:/g,"").replace(/ /g,"");
		};
		ayear = date.substring(0,4);
		amonth = date.substring(4,6);
		aday = date.substring(6,8);
		ahour = date.substring(8,10);
		aminute = date.substring(10,12);
		asecond = date.substring(12,14);
					
		assign = amonth+"/"+aday+"/"+ayear+" "+ahour+":"+aminute+":"+asecond;
				
		return new Date(assign);
	},
	show: function() {
		this.rootLayers.css("display", "block");
		$([window, document]).click(this.hideIfClickOutside);
		this.input.unbind("focus", this.show);
		$(document).keydown(this.keydownHandler);
		this.setPosition();
	},
	
	hide: function() {
		this.rootLayers.css("display", "none");
		$([window, document]).unbind("click", this.hideIfClickOutside);
		this.input.focus(this.show);
		$(document).unbind("keydown", this.keydownHandler);
	},
	
	hideIfClickOutside: function(event) {
		if (event.target != this.input[0] && !this.insideSelector(event)) {
		  this.hide();
		};
	},
	
	insideSelector: function(event) {
		var offset = this.dateSelector.position();
		offset.right = offset.left + this.dateSelector.outerWidth();
		offset.bottom = offset.top + this.dateSelector.outerHeight();
		
		return event.pageY < offset.bottom &&
			   event.pageY > offset.top &&
			   event.pageX < offset.right &&
			   event.pageX > offset.left;
	},
	
	keydownHandler: function(event) {
		switch (event.keyCode)
		{
		  case 9: 
		  case 27: 
			this.hide();
			return;
		  break;
		  case 13: 
			this.changeInput(this.selectedDateString);
		  break;
		  case 33: 
			this.moveDateMonthBy(event.ctrlKey ? -12 : -1);
		  break;
		  case 34: 
			this.moveDateMonthBy(event.ctrlKey ? 12 : 1);
		  break;
		  case 38: 
			this.moveDateBy(-7);
		  break;
		  case 40: 
			this.moveDateBy(7);
		  break;
		  case 37: 
			this.moveDateBy(-1);
		  break;
		  case 39: 
			this.moveDateBy(1);
		  break;
		  default:
			return;
		}
		event.preventDefault();
	},
	
	stringToDate: function(string) {
		var matches;
		if (matches = string.match(/^(\d{1,2}) ([^\s]+) (\d{4,4})$/)) {
		  return new Date(matches[3], this.shortMonthNum(matches[2]), matches[1], 12, 00);
		} else {
		  return null;
		};
	},
	
	datetimeToString: function(date) {
		var str = this.options.format;		
		str=str.replace(/yyyy|YYYY/,date.getFullYear()); 
		str=str.replace(/yy|YY/,(date.getYear() % 100)>9?(date.getYear() % 100).toString():"0" + (date.getYear() % 100)); 
		str=str.replace(/MM/,date.getMonth()>8?(date.getMonth()+1).toString():"0" + (date.getMonth()+1)); 
		str=str.replace(/M/g,date.getMonth()+1); 
		str=str.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():"0" + date.getDate()); 
		str=str.replace(/d|D/g,date.getDate());
		str=str.replace(/hh|HH/,date.getHours()>9?date.getHours().toString():"0" + date.getHours()); 
		str=str.replace(/h|H/g,date.getHours()); 
		str=str.replace(/mm/,date.getMinutes()>9?date.getMinutes().toString():"0" + date.getMinutes()); 
		str=str.replace(/m/g,date.getMinutes()); 
		str=str.replace(/ss|SS/,date.getSeconds()>9?date.getSeconds().toString():"0" + date.getSeconds()); 
		str=str.replace(/s|S/g,date.getSeconds());
		return str; 
	},
	
	dateToString: function(date) {
		var str = this.options.format;
		if(this.options.calendar == true) str = 'yyyy-MM-dd';
		str=str.replace(/yyyy|YYYY/,date.getFullYear()); 
		str=str.replace(/yy|YY/,(date.getYear() % 100)>9?(date.getYear() % 100).toString():"0" + (date.getYear() % 100)); 
		str=str.replace(/MM/,date.getMonth()>8?(date.getMonth()+1).toString():"0" + (date.getMonth()+1)); 
		str=str.replace(/M/g,date.getMonth()+1); 
		str=str.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():"0" + date.getDate()); 
		str=str.replace(/d|D/g,date.getDate());
		str=str.replace(/hh|HH/,"");
		str=str.replace(/h|H/g,""); 
		str=str.replace(/mm/,""); 
		str=str.replace(/m/g,""); 
		str=str.replace(/ss|SS/,""); 
		str=str.replace(/s|S/g,"");
		str=str.replace(/时/g,"");
		str=str.replace(/分/g,"");
		str=str.replace(/秒/g,"");
		str=str.replace(/:/g,"");
		str=str.replace(/ /g,"");
		return str; 
	},
	
	timeToString: function(date) {
		var str = this.options.format;
		str=str.replace(/yyyy|YYYY/,""); 
		str=str.replace(/yy|YY/,""); 
		str=str.replace(/MM/,""); 
		str=str.replace(/M/g,""); 
		str=str.replace(/dd|DD/,""); 
		str=str.replace(/d|D/g,"");
		str=str.replace(/年/g,"");
		str=str.replace(/月/g,"");
		str=str.replace(/日/g,"");
		str=str.replace(/-/g,"");
		str=str.replace(/hh|HH/,date.getHours()>9?date.getHours().toString():"0" + date.getHours()); 
		str=str.replace(/h|H/g,date.getHours()); 
		str=str.replace(/mm/,date.getMinutes()>9?date.getMinutes().toString():"0" + date.getMinutes()); 
		str=str.replace(/m/g,date.getMinutes()); 
		str=str.replace(/ss|SS/,date.getSeconds()>9?date.getSeconds().toString():"0" + date.getSeconds()); 
		str=str.replace(/s|S/g,date.getSeconds());
		return str; 
	},
	
	setPosition: function() {
		var offset = this.input.offset();
		this.rootLayers.css({
		  top: offset.top + this.input.outerHeight(),
		  left: offset.left
		});
		
		if (this.ieframe) {
		  this.ieframe.css({
			width: this.dateSelector.outerWidth(),
			height: this.dateSelector.outerHeight()
		  });
		};
	},
	
	moveDateBy: function(amount) {
		var newDate = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth(), this.selectedDate.getDate() + amount);
		this.selectDate(newDate);
	},
	
	moveDateMonthBy: function(amount) {
		var newDate = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth() + amount, this.selectedDate.getDate());
		if (newDate.getMonth() == this.selectedDate.getMonth() + amount + 1) {
		  
		  newDate.setDate(0);
		};
		this.selectDate(newDate);
	},
  
	moveMonthBy: function(amount) {
		var newMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() + amount, this.currentMonth.getDate());
		this.selectMonth(newMonth);
	},
  
	monthName: function(date) {
		return this.options.month_names[date.getMonth()];
	},
  
	bindToObj: function(fn) {
		var self = this;
		return function() { return fn.apply(self, arguments) };
	},
  
	bindMethodsToObj: function() {
		for (var i = 0; i < arguments.length; i++) {
		  this[arguments[i]] = this.bindToObj(this[arguments[i]]);
		};
	},
  
	indexFor: function(array, value) {
		for (var i = 0; i < array.length; i++) {
		  if (value == array[i]) return i;
		};
	},
	  
	monthNum: function(month_name) {
		return this.indexFor(this.options.month_names, month_name);
	},
	  
	shortMonthNum: function(month_name) {
		return this.indexFor(this.options.short_month_names, month_name);
	},
	  
	shortDayNum: function(day_name) {
		return this.indexFor(this.options.short_day_names, day_name);
	},
	  
	daysBetween: function(start, end) {
		start = Date.UTC(start.getFullYear(), start.getMonth(), start.getDate());
		end = Date.UTC(end.getFullYear(), end.getMonth(), end.getDate());
		return (end - start) / 86400000;
	},
	  
	changeDayTo: function(dayOfWeek, date, direction) {
		var difference = direction * (Math.abs(date.getDay() - dayOfWeek - (direction * 7)) % 7);
		return new Date(date.getFullYear(), date.getMonth(), date.getDate() + difference);
	},
	  
	rangeStart: function(date) {
		return this.changeDayTo(this.options.start_of_week, new Date(date.getFullYear(), date.getMonth()), -1);
	},
	  
	rangeEnd: function(date) {
		return this.changeDayTo((this.options.start_of_week - 1) % 7, new Date(date.getFullYear(), date.getMonth() + 1, 0), 1);
	},
	  
	isFirstDayOfWeek: function(date) {
		return date.getDay() == this.options.start_of_week;
	},
	  
	isLastDayOfWeek: function(date) {
		return date.getDay() == (this.options.start_of_week - 1) % 7;
	},
	  
	adjustDays: function(days) {
		var newDays = [];
		for (var i = 0; i < days.length; i++) {
		  newDays[i] = days[(i + this.options.start_of_week) % 7];
		};
		return newDays;
	}
});
$.extend($.ui.datetime, {
	version: "1.5",
	defaults: {
		month_names: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
  		short_month_names: ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"],
  		short_day_names: [ "日","一", "二", "三", "四", "五", "六"],
  		start_of_week: 1,
		showToday:false,
		format:'yyyy年MM月DD日',//yyyy-MM-DD hh:mm:ss,yyyy年MM月DD日 hh时mm分ss秒
		calendar:false,
		background:false,
		border:false,
		width:162,
		validate:true,
		url:false,
		calendarData:null,
		between:false,
		betweenMsg:"日期时间必须比前面日期时间大！"
	}
});

})(sundun);



/*
*   消息提示框
*/
sundun.extend({
	msgbox : {
		options: {
			maskAlphaColor:'#000',    //遮罩透明色
			maskAlpha:0.3,    //遮罩透明度
			title: '提示', //消息框标题
			message: '内容', //消息框按钮
			width: 300, //宽
			height: 70, //高
			handler: null,    //回调事件
			winType: 'alert'//消息框类型，包括alert、succeed、error、confirm四种，默认为alert
			
		},
		doHandler:function(sign){
			this.destory();
			try{eval(this.options.handler).call(window,sign)}catch(e){};	
		},
		destory: function(){
			sundun('#promptWinContainer').remove();	//隐藏容器
			this.hiddenMask();
		},
		//遮罩层
		showMask: function(options){
			//第一次需要创建一个蒙板层
			if(!sundun('#maskBackground')[0]){
				var shieldStyle='position:absolute;top:0px;left:0px;right:0px;width:0;height:0;background:'+options.maskAlphaColor+';text-align:center;z-index:30000;filter:alpha(opacity='+(options.maskAlpha*100)+');opacity:'+options.maskAlpha;
				sundun('body').append(sundun("<div id='maskBackground' style=\'"+shieldStyle+"\'></div>"));
			};
							//使用scrollTop和scrollWidth判断是否有滚动条更加准确，但需要加上onscroll监听,一旦发现有scrollTop或scrollLeft则使用scrollWidth/Height
			var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;	//根元素
			sundun('#maskBackground').css('width',(rootEl.scrollLeft==0?rootEl.clientWidth:rootEl.scrollWidth)+"px");
			sundun('#maskBackground').css('height',(rootEl.scrollTop==0?rootEl.clientHeight:rootEl.scrollHeight)+"px");
		
			//显示蒙板
			sundun('#maskBackground').css('display','block');		
			//禁止对页面的任何操作
			document.body.onselectstart = function(){return false};
			document.body.oncontextmenu = function(){return false};
		},
		//隐藏遮罩层
		hiddenMask: function(){
			sundun('#maskBackground').remove();
			document.body.onselectstart = function(){return true};
			document.body.oncontextmenu = function(){return true};
		},
		msgbody: function(options){
			var self = this;
			var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;	//根元素
			//浏览器类型判断
			var browser=function(s){return navigator.userAgent.toLowerCase().indexOf(s)!=-1}; 
			var isOpera=browser('opera'),isIE=browser('msie')!=-1&&(document.all&&!isOpera);
			var addCSS=function(obj,css,append){
				!append?(isOpera?obj.setAttribute('style',css):obj.style.cssText=css):(isOpera?obj.setAttribute('style',obj.getAttribute('style')+css):obj.style.cssText+=css);
			};
			 var addEvent=function(env,fn,obj){
				obj=obj||document;	//默认是document对象
				isIE?obj.attachEvent('on'+env,fn):obj.addEventListener(env,fn,false);
			};
			//开始拖动
			var setDrag=function(){
				var event=window.event||arguments[0];
				setDrag.startDrag=true;
				setDrag.startX=event.x||event.pageX;
				setDrag.startY=event.y||event.pageY;
				setDrag.containX=sundun("#promptWinContainer")[0].offsetLeft;
				setDrag.containY=sundun("#promptWinContainer")[0].offsetTop;
			};
			addEvent("mousemove",function(){
				if(setDrag.startDrag){
					var event=window.event||arguments[0];
					try{
						sundun("#promptWinContainer")[0].style.left=(setDrag.containX+(event.x||event.pageX)-setDrag.startX)+"px";
						sundun("#promptWinContainer")[0].style.top=(setDrag.containY+(event.y||event.pageY)-setDrag.startY)+"px";
					}catch(e){};
				};
			});
			//取消拖动
			addEvent("mouseup",function(){setDrag.startDrag=false});
			
			//弹出消息框时监听键盘事件
			var btnIndex=0,listensundunydown=function(){
				//无弹出框或弹出框隐藏则不屏蔽操作
				if(!btnCache||!sundun('#promptWinContainer')[0]||sundun('#promptWinContainer')[0].style.display=='none') return true;
				var ev=window.event||arguments[0],l=btnCache.length;
				
				if(l==1){	//一个按钮就不用麻烦了
					sundun(btnCache[0].id).focus();
				}else{
					var forward=function(){return sundun(btnCache[++btnIndex<l?btnIndex:(btnIndex=0)].id)};//后一个按钮
					var backward=function(){return sundun(btnCache[--btnIndex<0?(btnIndex=l-1):btnIndex].id)}//前一个按钮
					//tab键/左右方向键切换焦点
					if(ev.keyCode==9||ev.keyCode==39){forward().focus()}
					if(ev.keyCode==37){backward().focus()}
				};
				if(ev.keyCode==13)return true;	//允许回车键
				//屏蔽所有键盘操作包括刷新等
				try{
					ev.keyCode=0;
					ev.cancelBubble=true;
					ev.returnValue=false;
				}catch(e){
					try{	//2007-11-13 避免IE下event.keycode=0执行出错后转向此处而报错，先暂时用try..catch解决吧
						ev.stopPropagation();
						ev.preventDefault();
					}catch(e){}
				};
			};
			//第一次需要创建一个容器
			//总容器的样式
			var outerStyle='position:absolute;left:'+((rootEl.clientWidth-options.width)/2+rootEl.scrollLeft)+'px;width:'+options.width+'px;top:'+((rootEl.clientHeight)/2-options.height+rootEl.scrollTop)+'px;height:'+options.height+'px;z-index:100012';
			if(!sundun('#promptWinContainer')[0]){
				//标题容器层
				var title_div="<table class=\"msg-box\" border=\"0\" id=\"msg-box-tab\" cellpadding=\"0\" cellspacing=\"0\"><tr id=\'titleContainer\' style=\'cursor:move;width:100%;overflow:hidden\'><td class=\"msg-tl\"></td><td class=\"msg-tm\"><div style=\'float:left\' id=\'titleText\'>&nbsp;</div><div class=\"msg-close\"  onmouseover=\"this.className='msg-close-mover'\" onmouseout=\"this.className='msg-close'\" onclick='sundun.msgbox.doHandler(\"close\")'></div></td><td class=\"msg-tr\"></td></tr>";    		
				//内容容器层
				var content_div="<tr id='promptContentTable'><td class=\"msg-ml\"></td><td class=\"msg-mm\" id='promptMiddleCenter'></td><td class=\"msg-mr\"></td></tr>";
							//按钮区
				content_div+="<tr><td class=\"msg-ml\"></td><td class=\"msg-mm-b\" id='winBtnLineCenter'></td><td class=\"msg-mr\"></td></tr>";            
				//最下部的区域
				content_div+="<tr><td class=\"msg-bl\"></td><td class=\"msg-bm\"></td><td class=\"msg-br\"></td></tr></table>"; 
				//iframe优先层
				var ifr = '<iframe id="msg-mask-frame" style="position:absolute;visibility:inherit;width:100px;top:0;left:0;z-index:-1;"></iframe>';
				//创建总容器
				var outContainer=sundun('<div />');
				outContainer[0].id='promptWinContainer';
				
				if ( sundun.browser.msie && sundun.browser.version < 7)
					outContainer[0].innerHTML=ifr+title_div+content_div;
				else
					outContainer[0].innerHTML=title_div+content_div;
				
				sundun('body').append(outContainer);
				addEvent('mousedown',setDrag,sundun('#titleContainer')[0]);
				//缓存原始高度
				//options.cacheH=[sundun('#promptContentTable').height(),sundun('#promptMiddleCenter').height()];
				//添加监听事件
				addEvent("keydown",listensundunydown);	//键盘按下事件
				function resizeMask(){if( sundun("#maskBackground")[0]&&sundun("#maskBackground").css('display') != "none" ) self.showMask()};	//重新计算遮罩大小
				addEvent("resize",resizeMask,window);
				addEvent("scroll",resizeMask,window);
			};
			
			//按钮记录，id种子
			var btnCache,seed=0;
			//生成按钮的函数
			var mkBtn=function(txt,sign,id){
				id=id||'msgbox_btn_'+seed++;
				return {
					id:id,
					html:"<input type='button' id='"+id+"' onclick='sundun.msgbox.doHandler(\""+sign+"\")' style='cursor:pointer' class='msg-box-button' value='"+txt+"' />"
				};
			};
			var okBtn=mkBtn(' 确 定 ','ok'), cancelBtn=mkBtn(' 取 消 ','cancel');
			//生成按钮组合的html
			var useBtn=function(btn){
				if(!btn) return btnCache=null;
				if(!(btn instanceof Array))btn=[btn];
				btnCache=btn;
				var html=[];
				for(var i=0;i<btn.length;i++){
					html.push(btn[i].html);
				};
				return html.join('&nbsp;&nbsp;');
			};
			//每种图标所需要的按钮
			var btnMap={alert:okBtn,succeed:okBtn,error:okBtn,confirm:[okBtn,cancelBtn]};

			//传入标题和内容
			//var msg;
			//if(document.getElementById(y.message))	{ msg = sundun(y.message+'').innerHTML; } else{ msg = y.message };
			sundun('#titleText')[0].innerHTML=options.title;	//标题
			sundun('#promptMiddleCenter')[0].innerHTML=options.message;	//内容
			sundun('#promptMiddleCenter')[0].className="msgbox_"+options.winType;	//图标类型
			sundun('#winBtnLineCenter')[0].innerHTML=useBtn(btnMap[options.winType]);	//更新按钮类型
			sundun('#promptContentTable')[0].style.height=sundun('#promptContentTable').height();
			sundun("#promptMiddleCenter")[0].style.height=sundun('#promptMiddleCenter').height();
			
			
			//显示消息容器
			addCSS(sundun('#promptWinContainer')[0],outerStyle);	//居中定位消息框
			//设定内容区的高度
			sundun('#promptContentTable')[0].style.height=(options.height-sundun('#titleContainer')[0].offsetHeight)+'px';
			
			//内容区的高度,对于xhtml页面必须有下面三行
			var contentHeight=sundun('#promptContentTable').height()-sundun("#winBottomCenter").height();
			if(sundun("#winBtnLineCenter")[0]){contentHeight-=sundun("#winBtnLineCenter").height()};
			sundun("#promptMiddleCenter")[0].style.height=contentHeight+"px";
			sundun('#promptWinContainer')[0].style.display='';	//显示容器
	
			//alert(pxtonum(y.height));
			if ( sundun.browser.msie && sundun.browser.version < 7)
			{
				sundun("#msg-mask-frame").css('height',options.height + 31);
				sundun("#msg-mask-frame").css('width',sundun('#promptMiddleCenter').width() + 71);
			}
			//alert(sundun('#promptWinContainer').width());
			//alert(1);
			if(btnCache)sundun(btnCache[btnIndex=0].id).focus();	//确定按钮获取焦点
		},
		getOptions:function(args){
			var a=Array.prototype.slice.call(args,0),cfg=['message','width','height','title','handler','maskAlphaColor','maskAlpha'],obj={};
			if(typeof a[0]!='object'){
				for(var i=0;i<a.length;i++){
					if(a[i]){obj[cfg[i]]=a[i]} else if(!a[4]) {obj[cfg[4]]=null};
				};
			}else{
				obj=a[0];
			};
			var options = this.options;
			sundun.extend(options,obj);
			if(obj["handler"] == undefined) options["handler"] = null;
			return options;
		},
		alert: function(){	
			var options = this.getOptions(arguments);
			sundun.extend(options,{winType: 'alert'});
			
			this.showMask(options);
			this.msgbody(options);
		},
		succeedInfo: function(){
			var options = this.getOptions(arguments);
			sundun.extend(options,{winType: 'succeed'});
			
			this.showMask(options);
			this.msgbody(options);
		},
		errorInfo: function(){
			var options = this.getOptions(arguments);
			sundun.extend(options,{winType: 'error'});
			
			this.showMask(options);
			this.msgbody(options);
		},
		confirmInfo: function(){
			var options = this.getOptions(arguments);
			sundun.extend(options,{winType: 'confirm'});
			
			this.showMask(options);
			this.msgbody(options);
		},
		msg:function() {
			
		}
	}
});



/*
*   window窗口
*/
sundun.extend({
	win : {
		options: {
			maskAlphaColor:'#000',    //遮罩透明色
			maskAlpha:0.3,    //遮罩透明度
			title: '提示', //消息框标题
			message: '内容', //消息框按钮
			width: 400, //宽
			height: 200, //高
			handler: null,    //回调事件
			data:false,
			mark:false
		},
		doHandler:function(sign,id){
			this.destory(id);
			try{eval(this.options.handler).call(window,sign)}catch(e){};
			if(id == undefined) id = "msgbox_win" + (sundun('.msgbox_win').length - 1);			
		},
		destory: function(id){
			if(id != undefined)
			{
				if(sundun('.msgbox_el','#'+id)[0]) sundun('.msgbox_el','#'+id).hide().insertBefore(sundun('.msgbox_win'))//.appendTo('body').hide();
				sundun('#'+id).remove();
			}
			else
			{
				if(sundun('.msgbox_el','.msgbox_win')[0]) sundun('.msgbox_el','.msgbox_win').hide().insertBefore(sundun('.msgbox_win'))//.appendTo('body').hide();
				sundun('.msgbox_win').remove();
			};
			var msgbox_msg = sundun('body').data('msgbox_msg');
			msgbox_msg = msgbox_msg.replace(this.options.message,'');
			msgbox_msg = msgbox_msg.replace('undefined','');
			sundun('body').data('msgbox_msg',msgbox_msg);
			if(this.options.mark) this.hiddenMask();
		},
		//遮罩层
		showMask: function(options){
			//第一次需要创建一个蒙板层
			if(!sundun('#maskBackground')[0]){
				var shieldStyle='position:absolute;top:0px;left:0px;right:0px;width:0;height:0;background:'+options.maskAlphaColor+';text-align:center;z-index:30000;filter:alpha(opacity='+(options.maskAlpha*100)+');opacity:'+options.maskAlpha;
				sundun('body').append(sundun("<div id='maskBackground' style=\'"+shieldStyle+"\'></div>"));
			};
							//使用scrollTop和scrollWidth判断是否有滚动条更加准确，但需要加上onscroll监听,一旦发现有scrollTop或scrollLeft则使用scrollWidth/Height
			var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;	//根元素
			sundun('#maskBackground').css('width',(rootEl.scrollLeft==0?rootEl.clientWidth:rootEl.scrollWidth)+"px");
			sundun('#maskBackground').css('height',(rootEl.scrollTop==0?rootEl.clientHeight:rootEl.scrollHeight)+"px");
		
			//显示蒙板
			sundun('#maskBackground').css('display','block');		
			//禁止对页面的任何操作
			document.body.onselectstart = function(){return false};
			document.body.oncontextmenu = function(){return false};
		},
		//隐藏遮罩层
		hiddenMask: function(){
			sundun('#maskBackground').remove();
			document.body.onselectstart = function(){return true};
			document.body.oncontextmenu = function(){return true};
		},
		winbody: function(options){
			var self = this;
			var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;	//根元素
			//浏览器类型判断
			var browser=function(s){return navigator.userAgent.toLowerCase().indexOf(s)!=-1}; 
			var isOpera=browser('opera'),isIE=browser('msie')!=-1&&(document.all&&!isOpera);
			
			 var addEvent=function(env,fn,obj){
				obj=obj||document;	//默认是document对象
				isIE?obj.attachEvent('on'+env,fn):obj.addEventListener(env,fn,false);
			};
			
			//开始拖动
			var setDrag=function(){
				var event=window.event||arguments[0];
				setDrag.startDrag=true;
				setDrag.startX=event.x||event.pageX;
				setDrag.startY=event.y||event.pageY;
				setDrag.containX=outContainer[0].offsetLeft;
				setDrag.containY=outContainer[0].offsetTop;
				sundun('#winmsg',outContainer).hide();
				sundun('#winMiddleCenter',outContainer).addClass("alpha");				
			};
			addEvent("mousemove",function(){
				if(setDrag.startDrag){
					var event=window.event||arguments[0];
					try{
						outContainer[0].style.left=(setDrag.containX+(event.x||event.pageX)-setDrag.startX)+"px";
						outContainer[0].style.top=(setDrag.containY+(event.y||event.pageY)-setDrag.startY)+"px";
					}catch(e){};
				};
			});
			//取消拖动
			addEvent("mouseup",function(){setDrag.startDrag=false;sundun('#winmsg',outContainer).show();sundun('#winMiddleCenter',outContainer).removeClass("alpha");});
			
			//第一次需要创建一个容器
			var id = "msgbox_win" + sundun('.msgbox_win').length||0;
				//标题容器层
	
				//var title_div="<table class=\"win-box\" border=\"0\" id=\"win-tab\" cellpadding=\"0\" cellspacing=\"0\"><tr id=\'wintitleContainer\' style=\'cursor:move;width:100%;overflow:hidden\'><td class=\"win-tl\"></td><td class=\"win-tm\"><div style=\'float:left\' id=\'wintitleText\'>&nbsp;</div><div class=\"msg-close\"  onmouseover=\"this.className='msg-close-mover'\" onmouseout=\"this.className='msg-close'\" onclick='sundun.win.close(\""+id+"\")' title='关闭'></div><div id=\"win-max\" class=\"win-max\"  onmouseover=\"this.className='win-max-mover'\" onmouseout=\"this.className='win-max'\" onclick='sundun.win.maximize(\""+id+"\")' title='最大化'></div><div id=\"win-min\" class=\"win-min\"  onmouseover=\"this.className='win-min-mover'\" onmouseout=\"this.className='win-min'\" onclick='sundun.win.minimize(\""+id+"\")' style=\"display:none;\" title='向下还原'></div><div id=\"win-hide\" class=\"win-hide\"  onmouseover=\"this.className='win-hide-mover'\" onmouseout=\"this.className='win-hide'\" onclick='sundun.win.hide(\""+id+"\")' title='最小化'></div></td><td class=\"win-tr\"></td></tr>";
				var title_div="<table class=\"win-box\" border=\"0\" id=\"win-tab\" cellpadding=\"0\" cellspacing=\"0\"><tr id=\'wintitleContainer\' style=\'cursor:move;width:100%;overflow:hidden\'><td class=\"win-tl\"></td><td class=\"win-tm\"><div style=\'float:left\' id=\'wintitleText\'>&nbsp;</div><div class=\"msg-close\"  onmouseover=\"this.className='msg-close-mover'\" onmouseout=\"this.className='msg-close'\" onclick='sundun.win.close(\""+id+"\")' title='关闭'></div><div id=\"win-max\" class=\"win-max\"  onmouseover=\"this.className='win-max-mover'\" onmouseout=\"this.className='win-max'\" onclick='sundun.win.maximize(\""+id+"\")' title='最大化'></div><div id=\"win-min\" class=\"win-min\"  onmouseover=\"this.className='win-min-mover'\" onmouseout=\"this.className='win-min'\" onclick='sundun.win.minimize(\""+id+"\")' style=\"display:none;\" title='向下还原'></div></td><td class=\"win-tr\"></td></tr>";
				
				//内容容器层
				var content_div="<tr id='winContentTable'><td class=\"win-ml\"></td><td class=\"win-mm\" id='winMiddleCenter'><div id=\"winmsg\"><div id=\"wmreplace\"></div></div></td><td class=\"win-mr\"></td></tr>";
				
				//最下部的区域
				content_div+="<tr><td class=\"win-bl\"></td><td class=\"win-bm\"></td><td class=\"win-br\"></td></tr></table>";
			   //iframe优先层
				var ifr = '<iframe id="win-mask-frame" style="position:absolute;visibility:inherit;width:100px;top:0;left:0;z-index:-1;"></iframe>';
				
				//创建总容器
				var outContainer = sundun('<div />');
				self.container = outContainer;
				outContainer.addClass('msgbox_win');
				
				outContainer[0].id = id;
				
				if ( sundun.browser.msie && sundun.browser.version < 7)
					outContainer[0].innerHTML=ifr+title_div+content_div;
				else
					outContainer[0].innerHTML=title_div+content_div;
				if(sundun('#'+options.message)[0]){ 
					sundun('#'+options.message).after(outContainer);
				}
				else{
					sundun('body').append(outContainer);
				}
				
				if(sundun.ui && sundun.ui.draggable)
				{
					outContainer.draggable({ 
						  handle: '#wintitleContainer',
						  cursor: 'move',
						  start:function(event,ui){ sundun('#winmsg',event.target).hide();sundun('#winMiddleCenter',event.target).addClass("alpha"); },
						  end:function(event,ui){ sundun('#winmsg',event.target).show();sundun('#winMiddleCenter',event.target).removeClass("alpha"); }
						  
					});
				}
				else
					addEvent('mousedown',setDrag,sundun('#wintitleContainer',outContainer)[0]);
				
				//alert(outContainer.ohtml());
			//};
			//sundun('div',outContainer).xpng();
			
			//传入标题和内容
			sundun('#winmsg',outContainer).html(''); 
			if(sundun('#'+options.message)[0]){ 
				var iidd = '#'+options.message;
				sundun('#winmsg',outContainer).append(sundun(document.body).find(iidd));
				sundun(iidd).addClass('msgbox_el');
				
				sundun(iidd).show();
				sundun('#winmsg',outContainer).css('overflow','auto');
			}		
			else if(options.message.substring(0,4) == "url:")//如果主位是ajax读取的数据
			{
				//sundun('#winmsg').load(y.message.substring(4));
				var url = options.message.substring(4);
				sundun.ajax({ 
							url: url, 
							async: false,
							cache:false,
							success:function(html){
								sundun('#winmsg',outContainer).append(html);
							}
				});
			}
			else if(options.message.substring(0,7) == "iframe:")//如果主位是iframe包括页面
			{
				sundun('#winmsg',outContainer).append('<iframe class="win-frame" src="'+ options.message.substring(7) +'" frameborder="0" hspace="0" vspace="0" marginheight="0" marginwidth="0" style="width:100%;height:100%;overflow:auto;"></iframe>');			
			}
			else{ 
				sundun('#winmsg',outContainer).html(options.message);
				//sundun('#winmsg').css('overflow','auto').css('height',y.height);
			};	
			
			sundun('#wintitleText',outContainer)[0].innerHTML=options.title;	//标题    	
			sundun('#winMiddleCenter',outContainer)[0].style.height=options.height;
			sundun('#winMiddleCenter',outContainer)[0].style.width=options.width;
			sundun('#winMiddleCenter',outContainer).attr("w",options.width).attr("h",options.height);
			sundun('#winMiddleCenter',outContainer)[0].style.overflow='auto';
			//总容器的样式
			outContainer.css({"position":"absolute","left":((rootEl.clientWidth-options.width)/2+rootEl.scrollLeft)+"px","width":options.width+"px","top":((rootEl.clientHeight-options.height)/2+rootEl.scrollTop)+"px","height":options.height+"px","z-index":"100011"});
			
			//设定内容区的高度
			sundun('#winContentTable',outContainer)[0].style.height=(options.height-sundun('#wintitleContainer',outContainer)[0].offsetHeight)+'px';
			
			if ( sundun.browser.msie && sundun.browser.version < 7)
			{
				sundun("#win-mask-frame",outContainer).css('height',options.height + 32);
				sundun("#win-mask-frame",outContainer).css('width',sundun('#winMiddleCenter').width() + 13);
			};
			
			function resizeMask(){if( sundun("#maskBackground")[0]&&sundun("#maskBackground").css('display') != "none" ) self.showMask()};	//重新计算遮罩大小
			if(this.options.mark)
			{
				addEvent("resize",resizeMask,window);
				addEvent("scroll",resizeMask,window);
			};
			//内容区的高度,对于xhtml页面必须有下面三行
			var contentHeight=sundun('#winContentTable',outContainer).height();
			sundun("#winMiddleCenter",outContainer)[0].style.height=contentHeight+"px";
			sundun('#WinContainer',outContainer).show();	//显示容器
		},
		close:function(id){			
			sundun.win.doHandler("close",id);
			
			var hidenum = 0;
			sundun(".msgbox_win[hide=true]").each(function(){
				sundun(this).css("left",hidenum*150);
				hidenum++;
			});
		},
		maximize:function(id){
			var win = sundun("#"+id)[0];
			var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;
			win.style.position = 'absolute';
			win.style.top = '0';
			win.style.left = '0';
			win.style.width = '100%';
			win.style.right = '100%';
		    sundun('#winMiddleCenter',win)[0].style.width = rootEl.clientWidth - 16;
			sundun('#winMiddleCenter',win)[0].style.height = rootEl.clientHeight - 33;
			sundun('#win-max',win).hide();
			sundun('#win-min',win).show();
		},
		minimize:function(id){
			var win = sundun("#"+id)[0];
			var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;
			win.style.position = 'absolute';
			win.style.top = (rootEl.clientHeight-sundun('#winMiddleCenter',win).attr("h"))/2+rootEl.scrollTop;
			win.style.left = (rootEl.clientWidth-sundun('#winMiddleCenter',win).attr("w"))/2+rootEl.scrollLeft;
			win.style.width = sundun('#winMiddleCenter',win).attr("w");
			win.style.right = sundun('#winMiddleCenter',win).attr("h");
		    sundun('#winMiddleCenter',win)[0].style.width = sundun('#winMiddleCenter',win).attr("w");
			sundun('#winMiddleCenter',win)[0].style.height = sundun('#winMiddleCenter',win).attr("h");
			sundun('#win-max',win).show();
			sundun('#win-min',win).hide();
			sundun('#winContentTable',win).show();
			sundun('#win-hide',win).show();
			sundun("#"+id).removeAttr("hide");
			
			var hidenum = 0;
			sundun(".msgbox_win[hide=true]").each(function(){
				sundun(this).css("left",hidenum*150);
				hidenum++;
			});
		},
		hide:function(id){
			sundun("#"+id).attr("hide",true);
			var win = sundun("#"+id)[0];
			var rootEl=document.compatMode=='CSS1Compat'?document.documentElement:document.body;
			
			var hidenum = (sundun(".msgbox_win[hide=true]").length-1)||0,hidewidth = 150;
			
			win.style.position = 'absolute';
			win.style.left = hidenum*hidewidth;
			win.style.top = rootEl.clientHeight+rootEl.scrollTop-30;
			win.style.right = 'auto';
			win.style.width = hidewidth;
		    sundun('#winContentTable',win).hide();
			sundun('#win-hide',win).hide();
			sundun('#win-min',win).show();
			sundun('#win-max',win).hide();
		},
		getOptions:function(args){
			var a=Array.prototype.slice.call(args,0),cfg=['message','width','height','title','handler','mark','data','maskAlphaColor','maskAlpha'],obj={};
			if(typeof a[0]!='object'){
				for(var i=0,l=a.length;i<l;i++){
					obj[cfg[i]]=a[i];
					//if(i == 5)
					//	obj[cfg[5]]=a[5];
					//else
					//	if(a[i]){obj[cfg[i]]=a[i]} else if(!a[4]) {obj[cfg[4]]=null};
				};
			}else{
				obj=a[0];
			};
			var options = this.options;
			sundun.extend(options,obj);
			if(obj["handler"] == undefined) options["handler"] = null;
			return options;			
		},
		show: function(){
			var options = this.getOptions(arguments);
			
			var already = sundun('body').data('msgbox_msg')||"";
			if(already.indexOf(options.message) > -1) return false;
			
			this.winbody(options);
			sundun('body').data('msgbox_msg',sundun('body').data('msgbox_msg')+options.message);
			//sundun.win.minimize()
			if(this.options.mark) this.showMask(options);
		}
	}
});





/*
tip消息提示
*/
sundun.fn.tip = function(pos,msg,time){	
		var tip = sundun('<DIV style="WIDTH: 192px;" class="ui-tip hide"><DIV class=ui-tip-tl><DIV class=ui-tip-tr><DIV class=ui-tip-tc></DIV></DIV></DIV><DIV class=ui-tip-bwrap><DIV class=ui-tip-ml><DIV class=ui-tip-mr><DIV class=ui-tip-mc><DIV style="WIDTH: 180px; HEIGHT: auto" class=ui-tip-body>'+msg+'</DIV></DIV></DIV></DIV><DIV class="ui-tip-bl"><DIV class=ui-tip-br><DIV class=ui-tip-bc></DIV></DIV></DIV></DIV><DIV style="Z-INDEX: 2000001; TOP: -8px; LEFT: 96px" class="ui-tip-anchor hide"></DIV></DIV><DIV class="ui-ie-shadow hide"></DIV>').prependTo('body');
		//var tip_ie_shadow = sundun('<DIV style="Z-INDEX: 19999; FILTER: progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius=4);background-color:#777;position:absolute;top:-8px;left:-6px;WIDTH: 189px;height:28px;" class="ui-ie-shadow hidden"></DIV>');
		//tip.after(tip_ie_shadow);
		// style="Z-INDEX: 1999999; FILTER: progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius=4);background-color:#777;position:absolute;top:-8px;left:-6px;WIDTH: 188px;height:26px;"
		
		if(pos == "close")
		{
			sundun(".ui-tip").fadeOut("slow");
			sundun(".ui-tip").next('.ui-ie-shadow').fadeOut("fast"); 
			setTimeout(function(){ 
				sundun(".ui-tip").next('.ui-ie-shadow').remove();
				sundun(".ui-tip").remove(); 
			},600);
			return false;
		};
		
		if(pos == "middle")//置中
			sundun.fixedPos(tip[0],null,null,null,null,this,time);
		if(pos == "nw")//西北
			sundun.fixedPos(tip[0],0,null,null,0,this,time);
		if(pos == "sw")//西南
			sundun.fixedPos(tip[0],null,null,0,0,this,time);
		if(pos == "se")//东南
			sundun.fixedPos(tip[0],null,0,0,null,this,time);
		if(pos == "ne")//东北
			sundun.fixedPos(tip[0],0,0,null,null,this,time);
		if(pos == "top")//顶
			sundun.fixedPos(tip[0],0,null,null,null,this,time);
		if(pos == "bottom")//底
			sundun.fixedPos(tip[0],null,null,0,null,this,time);
		
		if(pos == "mouse")//鼠标跟随
			sundun.mouseTip(sundun(this),tip,msg);
		
		if(pos.substring(0,5) == "hover")//鼠标悬浮
		{
			var hover = pos.split(":");
			var anchors = hover[1];
			if(anchors == undefined) anchors = "bottom";
			sundun(this).each(function(){
				sundun.hoverTip(sundun(this),tip,msg,anchors);
			});			
		};
		
		
};
sundun.mouseTip = function(el,tip,source){//attr:属性，el：对象，ajax：ajax load
	var el = sundun(el),data = sundun("<div />");
	el.hover(
	function(e){		
		if(source.substring(0,5) == "attr:")
			data.html(el.attr(source.substring(5)));
		else if(source.substring(0,3) == "el:")
			data.html(sundun(source.substring(3)).clone().ohtml());
		else if(source.substring(0,5) == "ajax:")
		{
			data.html("加载中...");
			sundun(".ui-tip-body",tip).load(source.substring(5),function(){ tip.next('.ui-ie-shadow').css('height',tip.height() - 2); });
		};
		
		sundun(".ui-tip-body",tip).html(data.html());
		
		var coords = sundun.getMouseCoords(e);
		tip.css({"top":coords.y + 20 +"px","left":coords.x + 10 + "px"}).show();
		tip.next('.ui-ie-shadow').css('height',tip.height() - 2);
	},
	function(e){
		tip.hide();
	});
	el.bind('mousemove',function(e){
		var coords = sundun.getMouseCoords(e);
		tip.css({"top":coords.y + 20 +"px","left":coords.x + 10 + "px"}).show();	
	});
};

sundun.hoverTip = function(el,tip,source,anchors){//attr:属性，el：对象，ajax：ajax load
	var el = sundun(el),data = sundun("<div />");
	el.hover(
	function(){		
		if(source.substring(0,5) == "attr:")
			data.html(el.attr(source.substring(5)));
		else if(source.substring(0,3) == "el:")
			data.html(sundun(source.substring(3)).clone().ohtml());
		else if(source.substring(0,5) == "ajax:")
		{
			data.html("加载中...");
			sundun(".ui-tip-body",tip).load(source.substring(5),function(){ tip.next('.ui-ie-shadow').css('height',tip.height() - 2); });
		};
		
		if(anchors == "bottom")
		{
			sundun(".ui-tip-anchor",tip).addClass("ui-tip-anchor-top");
			tip.css({"top":sundun(this).offset().top + el.outerHeight() + 7 +"px","left":sundun(this).offset().left  + el.outerWidth()/2 - tip.outerWidth()/2 - 6 + "px"});
			
		}
		else if(anchors == "top")
		{
			sundun(".ui-tip-anchor",tip).addClass("ui-tip-anchor-bottom").css({"top":sundun(this).outerHeight() - 1 +"px","left":"96px"});
			tip.css({"top":sundun(this).offset().top - tip.outerHeight() - 7 +"px","left":sundun(this).offset().left  + el.outerWidth()/2 - tip.outerWidth()/2 - 6 + "px"});
		}
		else if(anchors == "left")
		{
			sundun(".ui-tip-anchor",tip).addClass("ui-tip-anchor-right").css({"top":"11px","left":"190px"});
			tip.css({"top":sundun(this).offset().top,"left":sundun(this).offset().left - tip.outerWidth() - 8});
		}
		else if(anchors == "right")
		{
			sundun(".ui-tip-anchor",tip).addClass("ui-tip-anchor-left").css({"top":"11px","left":"-8px"});
			tip.css({"top":sundun(this).offset().top,"left":sundun(this).offset().left + sundun(this).outerWidth() + 8});						
		};
		if(sundun.trim(data.text()) != "") 
		{
			tip.show();
			sundun(".ui-tip-anchor",tip).show();
		};
		sundun(".ui-tip-body",tip).html(data.html());
		tip.next('.ui-ie-shadow').css('height',tip.height() - 2);
	},
	function(){
		tip.hide();
		tip.next('.ui-ie-shadow').hide();
	});
};
sundun.getMouseCoords = function(e){		
	// pageX/Y is not supported in IE
	// http://www.quirksmode.org/dom/w3c_cssom.html			
	if (!e.pageX && e.clientX){
		// In Internet Explorer 7 some properties (mouse coordinates) are treated as physical,
		// while others are logical (offset).
		var zoom = 1;	
		var body = document.body;
		
		if (body.getBoundingClientRect) {
			var bound = body.getBoundingClientRect();
			zoom = (bound.right - bound.left)/body.clientWidth;
		}

		return {
			x: e.clientX / zoom + d.body.scrollLeft + d.documentElement.scrollLeft,
			y: e.clientY / zoom + d.body.scrollTop + d.documentElement.scrollTop
		};

	}
	
	return {
		x: e.pageX,
		y: e.pageY
	};		

};
sundun.fixedPos = function(element ,top , right ,bottom ,left ,coverage ,time){
		var self = this;
		
		if(time == undefined) time = 3000;
		sundun(element).fadeIn("slow");
		
		if(time != 0)
		setTimeout(function(){ sundun(element).fadeOut("slow");sundun(element).next('.ui-ie-shadow').fadeOut("fast"); setTimeout(function(){ sundun(element).next('.ui-ie-shadow').remove();sundun(element).remove(); },600); },time);
		
		/*
		功能：使元素fixed定位
		*/
		element.style.display = "block";
		if (!window.XMLHttpRequest && window.ActiveXObject)
		{
			element.style.position = "absolute";
			//self.setGlobal();
		}
		else
		{
			element.style.position = "fixed";
		};
		
		if(sundun(coverage)[0] == document)
		{
			if(top != null) element.style.top = top +"px";
			if(right != null) element.style.right = right +"px";
			if(bottom != null) element.style.bottom = bottom +"px";
			if(left != null) element.style.left = left +"px";
		}
		else
		{
			element.style.position = "absolute";
			if(top != null) element.style.top = sundun(coverage).offset().top +"px";
			if(right != null) element.style.right = (sundun(document).width() - (sundun(coverage).offset().left + sundun(coverage).width())) +"px";
			if(bottom != null) element.style.top = (sundun(coverage).offset().top + sundun(coverage).height() - sundun(element).height()) +"px";
			if(left != null) element.style.left = sundun(coverage).offset().left +"px";
		};
		
		if(top == null && right == null && bottom == null && left == null)
		{
			if(sundun(coverage)[0] == document)
			{
				element.style.bottom = 0;
				element.style.left = (sundun(coverage).width() - sundun(element).width())/2 +"px";
				element.style.bottom = (sundun(element).offset().top - sundun(element).height())/2 +"px";
			}
			else
			{
				element.style.position = "absolute";
				element.style.top = 0;
				element.style.left = (sundun(coverage).offset().left + sundun(coverage).width()/2 - sundun(element).width()/2) + "px";
				element.style.top = (sundun(coverage).offset().top + sundun(coverage).height()/2 - sundun(element).height()/2) + "px";	
			};
		};
		if(top == 0 && right == null && bottom == null && left == null)
		{
			if(sundun(coverage)[0] == document)
			{
				element.style.top = 0;
				element.style.left = (sundun(coverage).width() - sundun(element).width())/2 +"px";	
			}
			else
			{
				element.style.top = sundun(coverage).offset().top +"px";
				element.style.left = (sundun(coverage).offset().left + sundun(coverage).width()/2 - sundun(element).width()/2) +"px";
			};
		};
		if(top == null && right == null && bottom == 0 && left == null)
		{
			if(sundun(coverage)[0] == document)
			{
				element.style.bottom = 0;
				element.style.left = (sundun(coverage).width() - sundun(element).width())/2 +"px";	
			}
			else
			{
				element.style.top = (sundun(coverage).offset().top + sundun(coverage).height() - sundun(element).height()) +"px";
				element.style.left = (sundun(coverage).offset().left + sundun(coverage).width()/2 - sundun(element).width()/2) +"px";	
			};			
		};
		
		/*添加css规则*/
		self.addCSSRule = function(key ,value){
		   var css = document.styleSheets[document.styleSheets.length-1];
			css.cssRules ? 
				 (css.insertRule(key +"{"+ value +"}", css.cssRules.length)) :
				 (css.addRule(key ,value));
		
		};
		
		/*标志特定公共规则是否存在*/
		self.inited = false;
		
		/*设置特定公共规则*/
		self.setGlobal = function(){
			if (! self.inited)
			{
				document.body.style.height = "100%";
				document.body.style.overflow = "auto";
				self.addCSSRule("*html" ,"overflow-x:auto;overflow-y:hidden;");
				self.inited = true;
			}
		};
		
		sundun(element).next('.ui-ie-shadow').css({"top":sundun(element).offset().top,"left":sundun(element).offset().left}).fadeIn("slow");
};



sundun.extend({
	/*
	href地址分解
	用法：
	var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');
	
	myURL.file;     // = 'index.html'
	myURL.hash;     // = 'top'
	myURL.host;     // = 'abc.com'
	myURL.query;    // = '?id=255&m=hello'
	myURL.params;   // = Object = { id: 255, m: hello }
	myURL.path;     // = '/dir/index.html'
	myURL.segments; // = Array = ['dir', 'index.html']
	myURL.port;     // = '8080'
	myURL.protocol; // = 'http'
	myURL.source;   // = 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'
	
	*/
	parseURL : function (url) {
		var a =  document.createElement('a');
		a.href = url;
		return {
			source: url,
			protocol: a.protocol.replace(':',''),
			host: a.hostname,
			port: a.port,
			query: a.search,
			params: (function(){
				var ret = {},
					seg = a.search.replace(/^\?/,'').split('&'),
					len = seg.length, i = 0, s;
				for (;i<len;i++) {
					if (!seg[i]) { continue; }
					s = seg[i].split('=');
					ret[s[0]] = s[1];
				}
				return ret;
			})(),
			file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
			hash: a.hash.replace('#',''),
			path: a.pathname.replace(/^([^\/])/,'/$1'),
			relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
			segments: a.pathname.replace(/^\//,'').split('/')
		};
	},
	//把字符串进行HTML编码
	HtmlEncode : function(str){
	  return str.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&#34;").replace(/\'/g,"&#39;");
	},
	//把字符串进行HTML反编码
	HtmlDecode : function(str){
	 return str.replace(/\&amp\;/g, '\&').replace(/\&gt\;/g, '\>').replace(/\&lt\;/g, '\<').replace(/\&quot\;/g, '\'').replace(/\&\#39\;/g, '\'');
	},
	//去除字符串中的所有非数字,(得到数字).
	getNumber : function(str){
		return str.replace(/[\D]/g,'');
	},
	//获取0-N之间的随机整数
	randomInt : function(num1){
		return Math.floor(Math.random()*num1);
	},
	// func函数在t毫秒延时后执行
	runAfter : function(func , t){
		var B = Array.prototype.slice.call(arguments,1);
		var f = function(){
			func.apply(null, B);
		};
		return setTimeout(f , t);
	},
	// 函数每隔t毫秒执行一次
	runEach : function(func , t){
		var B = Array.prototype.slice.call(arguments,1);
		var f = function(){
			func.apply(null,B);
		};
		return setInterval(f, t);
	},
	//函数每隔t毫秒执行，总执行n次
	runNum : function(func , t , n){
		var A = func;
		var B = Array.prototype.slice.call(arguments,2);
		var f = function(){
			A.apply(null, B);
		};
		if(t==0){
			f();return;
		};
		if(n<1){
			return;
		};
		for (i=1;i<=n;i++){
			setTimeout(f,t*i);
		};
	},
	//判断两个object的值是不是相同
	compare : function(obj1,obj2){
		for(elements   in   obj1){   
			if(obj1[elements]   !=   obj2[elements])   
		return   false   
		}   
		return   true  
	},
	//格式化日期格式
	//var dates = format( new Date() , "yyyy-MM-DD hh:mm:ss");
	format : function(date , formatStr){ 
		var str = formatStr; 
		str=str.replace(/yyyy|YYYY/,date.getFullYear()); 
		str=str.replace(/yy|YY/,(date.getYear() % 100)>9?(date.getYear() % 100).toString():"0" + (date.getYear() % 100)); 
		str=str.replace(/MM/,date.getMonth()>9?(date.getMonth()+1).toString():"0" + (date.getMonth()+1)); 
		str=str.replace(/M/g,date.getMonth()+1); 
		str=str.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():"0" + date.getDate()); 
		str=str.replace(/d|D/g,date.getDate()); 
		str=str.replace(/hh|HH/,date.getHours()>9?date.getHours().toString():"0" + date.getHours()); 
		str=str.replace(/h|H/g,date.getHours()); 
		str=str.replace(/mm/,date.getMinutes()>9?date.getMinutes().toString():"0" + date.getMinutes()); 
		str=str.replace(/m/g,date.getMinutes()); 
		str=str.replace(/ss|SS/,date.getSeconds()>9?date.getSeconds().toString():"0" + date.getSeconds()); 
		str=str.replace(/s|S/g,date.getSeconds()); 
		return str; 
	},
	//格式化日期格式(string日期来源)
	//var dates = format( '2008-01-01 11:20:00' , "yyyy-MM-DD hh:mm:ss");
	formatDateString : function(datetime , formatStr){ 
		var str = formatStr; 
		
		var datetime = datetime.split(' ');
		var datestr = datetime[0].split('-');
		var timestr = datetime[1].split(':');
		
		var year = Number(datestr[0]);
		var syear = Number(datestr[0]);
		var month = Number(datestr[1]);
		var smonth = Number(datestr[1]);
		var date = Number(datestr[2]);
		var sdate = Number(datestr[2]);
		var hours = Number(timestr[0]);
		var shours = Number(timestr[0]);
		var minutes = Number(timestr[1]);
		var sminutes = Number(timestr[1]);
		var seconds = Number(timestr[2]);
		var sseconds = Number(timestr[2]);
		
		str=str.replace(/yyyy|YYYY/,year); 
		str=str.replace(/yy|YY/,(syear % 100)>9?(syear % 100):"0" + (syear % 100)); 
		str=str.replace(/MM/,month>9?month:"0" + month); 
		str=str.replace(/M/g,smonth); 
		str=str.replace(/dd|DD/,date>9?date:"0" + date); 
		str=str.replace(/d|D/g,sdate); 
		str=str.replace(/hh|HH/,hours>9?hours:"0" + hours); 
		str=str.replace(/h|H/g,shours); 
		str=str.replace(/mm/,minutes>9?minutes:"0" + minutes); 
		str=str.replace(/m/g,sminutes); 
		str=str.replace(/ss|SS/,seconds>9?seconds:"0" + seconds); 
		str=str.replace(/s|S/g,sseconds); 
		return str; 
	},
	//日期比较
	compare : function(oldDate  , newDate) { 
		if(typeof(newDate)!="object" && newDate.constructor != Date){
			return -2; 
		}
		var d = oldDate.getTime() - newDate.getTime();
		if(d>0){
			return 1;
		}else{
			if(d==0){
				return 0;
			}else {
				return -1;
			}
		}
	},
	//针对不同的时间单位做加运算，得到日期年月日等加数字后的日期
	dateAdd : function( date , interval , number) {
		switch(interval) {
		case "y" : 
			date.setFullYear(date.getFullYear()+number); 
			return date; 
		case "q" : 
			date.setMonth(date.getMonth()+number*3);
			return date; 
		case "m" : 
			date.setMonth(date.getMonth()+number);
			return date; 
		case "w" : 
			date.setDate(date.getDate()+number*7);
			return date; 
		case "d" : 
			date.setDate(date.getDate()+number);
			return date; 
		case "h" : 
			date.setHours(date.getHours()+number);
			return date; 
		case "m" : 
			date.setMinutes(date.getMinutes()+number); 
			return date; 
		case "s" : 
			date.setSeconds(date.getSeconds()+number);
			return date; 
		default : 
			date.setDate(d.getDate()+number);
			return date; 
		}
	},
	cookie: function(name, value, options) {
		if (typeof value != 'undefined') { // name and value given, set cookie
			options = options || {};
			if (value === null) {
				value = '';
				options = $.extend({}, options); // clone object since it's unexpected behavior if the expired property were changed
				options.expires = -1;
			}
			var expires = '';
			if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
				var date;
				if (typeof options.expires == 'number') {
					date = new Date();
					date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
				} else {
					date = options.expires;
				}
				expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
			}
			// NOTE Needed to parenthesize options.path and options.domain
			// in the following expressions, otherwise they evaluate to undefined
			// in the packed version for some reason...
			var path = options.path ? '; path=' + (options.path) : '';
			var domain = options.domain ? '; domain=' + (options.domain) : '';
			var secure = options.secure ? '; secure' : '';
			document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
		} else { // only name given, get cookie
			var cookieValue = null;
			if (document.cookie && document.cookie != '') {
				var cookies = document.cookie.split(';');
				for (var i = 0; i < cookies.length; i++) {
					var cookie = sundun.trim(cookies[i]);
					// Does this cookie string begin with the name we want?
					if (cookie.substring(0, name.length + 1) == (name + '=')) {
						cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
						break;
					}
				}
			}
			return cookieValue;
		}
	},
	//flash加载
	LoadFlash : function(arg)
	{
		var parm = [];
		var _default_version = "8,0,24,0";
		var _default_quality = "high";
		var _default_align = "middle";
		var _default_menu = "false";
		
		for(i = 0; i < arguments.length; i ++)
		{
		parm[i] = arguments[i].split(' ').join('').split('=');
		for (var j = parm[i].length-1; j > 1; j --){
		parm[i][j-1]+="="+parm[i].pop();
		}
		switch (parm[i][0])
		{
		case '_version' : var _version = parm[i][1] ; break ; 
		case '_swf' : var _swf = parm[i][1] ; break ; 
		case '_base' : var _base = parm[i][1] ; break ; 
		case '_quality' : var _quality = parm[i][1] ; break ; 
		case '_loop' : var _loop = parm[i][1] ; break ; 
		case '_bgcolor' : var _bgcolor = parm[i][1] ; break ; 
		case '_wmode' : var _wmode = parm[i][1] ; break ; 
		case '_play' : var _play = parm[i][1] ; break ; 
		case '_menu' : var _menu = parm[i][1] ; break ; 
		case '_scale' : var _scale = parm[i][1] ; break ; 
		case '_salign' : var _salign = parm[i][1] ; break ; 
		case '_height' : var _height = parm[i][1] ; break ; 
		case '_width' : var _width = parm[i][1] ; break ; 
		case '_hspace' : var _hspace = parm[i][1] ; break ; 
		case '_vspace' : var _vspace = parm[i][1] ; break ; 
		case '_align' : var _align = parm[i][1] ; break ; 
		case '_class' : var _class = parm[i][1] ; break ; 
		case '_id' : var _id = parm[i][1] ; break ; 
		case '_name' : var _name = parm[i][1] ; break ; 
		case '_style' : var _style = parm[i][1] ; break ; 
		case '_declare' : var _declare = parm[i][1] ; break ; 
		case '_flashvars' : var _flashvars = parm[i][1] ; break ; 
		default :;
		};
		};
		var thtml = "";
		thtml += "<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='install/swflash.cab'";
		if(_width) thtml += " width='" + _width + "'";
		if(_height) thtml += " height='" + _height + "'";
		if(_hspace) thtml += " hspace='" + _hspace + "'";
		if(_vspace) thtml += " vspace='" + _vspace + "'";
		if(_align) thtml += " align='" + _align + "'";
		else thtml += " align='" + _default_align + "'";
		if(_class) thtml += " class='" + _class + "'";
		if(_id) thtml += " id='" + _id + "'";
		if(_name) thtml += " name='" + _name + "'";
		if(_style) thtml += " style='" + _style + "'";
		if(_declare) thtml += " " + _declare;
		thtml += ">";
		if(_swf) thtml += "<param name='movie' value='" + _swf + "'>";
		if(_quality) thtml += "<param name='quality' value='" + _quality + "'>" ;
		else thtml += "<param name='quality' value ='" + _default_quality + "'>";
		if(_loop) thtml += "<param name='loop' value='" + _loop + "'>";
		if(_bgcolor) thtml += "<param name='bgcolor' value='" + _bgcolor + "'>";
		if(_play) thtml += "<param name='play' value='" + _play + "'>";
		if(_menu) thtml += "<param name='menu' value='" + _menu + "'>";
		else thtml += "<param name='menu' value='" + _default_menu + "'>";
		if(_scale) thtml += "<param name='scale' value='" + _scale + "'>";
		if(_salign) thtml += "<param name='salign' value='" + _salign + "'>";
		if(_wmode) thtml += "<param name='wmode' value='" + _wmode + "'>";
		if(_base) thtml += "<param name='base' value='" + _base + "'>";
		if(_flashvars) thtml += "<param name='flashvars' value='" + _flashvars + "'>";
		thtml += "<embed pluginspage='http://www.macromedia.com/go/getflashplayer'";
		if(_width) thtml += " width='" + _width + "'";
		if(_height) thtml += " height='" + _height + "'";
		if(_hspace) thtml += " hspace='" + _hspace + "'";
		if(_vspace) thtml += " vspace='" + _vspace + "'";
		if(_align) thtml += " align='" + _align + "'";
		else thtml += " align='" + _default_align + "'";
		if(_class) thtml += " class='" + _class + "'";
		if(_id) thtml += " id='" + _id + "'";
		if(_name) thtml += " name='" + _name + "'";
		if(_style) thtml += " style='" + _style + "'";
		thtml += " type='application/x-shockwave-flash'";
		if(_declare) thtml += " " + _declare ;
		if(_swf) thtml += " src='" + _swf + "'";
		if(_quality) thtml += " quality='" + _quality + "'";
		else thtml += " quality='" + _default_quality + "'";
		if(_loop) thtml += " loop='" + _loop + "'";
		if(_bgcolor) thtml += " bgcolor='" + _bgcolor + "'";
		if(_play) thtml += " play='" + _play + "'";
		if(_menu) thtml += " menu='" + _menu + "'";
		else thtml += " menu='" + _default_menu + "'";
		if(_scale) thtml += " scale='" + _scale + "'";
		if(_salign) thtml += " salign='" + _salign + "'";
		if(_wmode) thtml += " wmode='" + _wmode + "'";
		if(_base) thtml += " base='" + _base + "'";
		if(_flashvars) thtml += " flashvars='" + _flashvars + "'";
		thtml += "></embed>";
		thtml += "</object>";
		document.write(thtml);
	},
	
	
	//得到请求url的参数的值
	getQueryString : function(queryStringName, anchors){
		var returnValue = "";
		var URLString = new String(document.location);
		var serachLocation = -1;
		if(!!anchors ){
			serachLocation = URLString.lastIndexOf("#");
			if (serachLocation != -1) {
				return URLString.substr(0, serachLocation);
			}
			else{
				return "";
			}
			
		}
		if(!queryStringName){
			serachLocation = URLString.indexOf("?");
			if (serachLocation != -1) {
				return URLString.substr(serachLocation + 1);
			}
			else{
				return "";
			}
		}
		var queryStringLength = queryStringName.length;
		do {
			serachLocation = URLString.indexOf(queryStringName + "\=");
			if (serachLocation != -1) {
				if ((URLString.charAt(serachLocation - 1) == '?')
						|| (URLString.charAt(serachLocation - 1) == '&')) {
					URLString = URLString.substr(serachLocation);
					break;
				}
				URLString = URLString.substr(serachLocation + queryStringLength + 1);
			}
	
		} while (serachLocation != -1)
		if (serachLocation != -1) {
			var seperatorLocation = URLString.indexOf("&");
			if (seperatorLocation == -1) {
				returnValue = URLString.substr(queryStringLength + 1);
			} else {
				returnValue = URLString.substring(queryStringLength + 1,
						seperatorLocation);
			}
		};
		return returnValue;
	},
	
	//获取功能URL参数的值
	getUrlParam : function(url,paramname)
	{
	 	var returnValue="";
	 	var URLString=url;
	 	var serachLocation=-1;
	 	var paramLength=paramname.length;
	 	
	 	do
	 	{
	  		serachLocation=URLString.indexOf(paramname+"\=");
	  		if (serachLocation!=-1)
	  		{
	  			if ((URLString.charAt(serachLocation-1)=='?') || (URLString.charAt(serachLocation-1)=='&'))
	   			{
	    			URLString=URLString.substr(serachLocation);
	    			break;
	   			}
	   			
	   			URLString=URLString.substr(serachLocation+paramLength+1);
	  		}  
	 	} 	
	 	while (serachLocation!=-1)
	 	
		if (serachLocation!=-1)
		{
			var seperatorLocation=URLString.indexOf("&");
		  	if (seperatorLocation==-1)
		  	{
		   		returnValue=URLString.substr(paramLength+1);
		  	}
		  	else
		  	{
		   		returnValue=URLString.substring(paramLength+1,seperatorLocation);
		  	} 
		 }
		 
		 return returnValue;
	}
	,
	
	//获取除关键参数之外的其它参数字符串
	getOtherUrlParamString : function(obj)
	{	
		var url=unescape(window.location.href);//获取URL,unescape解析URL字符
	   	var allargs=url.split("?")[1];//获取?后的值
	   	var args=allargs.split("&");//获取参数数组
	   	
	   	var paramName = "";
	   	var paramValue = "";
	   	var otherUrl = "";
	   	
	   	for(var i=0;i<args.length; i++)
	   	{ 
	   		paramName = args[i].split("=")[0];
	   		paramValue = args[i].split("=")[1];
	  		
	  		if(!$.arrayContainName(obj, paramName))
	  		{
	  			otherUrl += "&" + paramName + "=" + paramValue;
	  		}
	   	}
	   	
	   	return otherUrl;
	}
	,
	
	//设置url中的参数值
	setUrlParam : function(url, paramName, paramValue)
	{		
		var finalurl = url.split("?")[0] + "?";
	   	var allargs = url.split("?")[1];	//获取?后的值
	   	var args=allargs.split("&");		//获取参数数组	   	
	   	
	   	var flag = false;					//是否找到该参数标志
	   	
	   	var tempParamName = "";
	   	var tempParamValue = "";
	   	
	   	for(var i=0;i<args.length; i++)
	   	{ 
	   		//添加特殊分隔符
	   		var lastChar = finalurl.substr(finalurl.length - 1, 1);
	   		
	   		if(lastChar != "?")
	   		{
	   			finalurl += "&";
	   		}
	   		
	   		tempParamName = args[i].split("=")[0];
	   		tempParamValue = args[i].split("=")[1];
	  		
	  		if(tempParamName == paramName)
	  		{
	  			finalurl += tempParamName + "=" + paramValue;
	  			flag = true;
	  		}
	  		else
	  		{
	  			finalurl += tempParamName + "=" + tempParamValue;
	  		}	  		
	   	}
	   	
	   	if(!flag)
	   	{	   		
	   		finalurl += "&" + paramName + "=" + paramValue;
	   	}	   	
	   	
	   	return finalurl;
	}
	,
	
	//比较当前URL与参数URL，加入不同的参数
	setOtherUrlParam : function(inputurl)
	{		
		var url=unescape(window.location.href);//获取URL,unescape解析URL字符
	   	var allargs=url.split("?")[1];//获取?后的值
	   	var args=allargs.split("&");//获取参数数组
	   	
	   	var paramName = "";
	   	var paramValue = "";
	   	var outputurl = inputurl;
	   	
	   	for(var i=0;i<args.length; i++)
	   	{ 
	   		paramName = args[i].split("=")[0];
	   		paramValue = args[i].split("=")[1];
	  		
	  		if(inputurl.indexOf(paramName) == -1)
	  		{
	  			outputurl += "&" + paramName + "=" + paramValue;
	  		}
	   	}
	   	
	   	return outputurl;
	}
	,
	
	//判断数组中是否包含某对象
	
	arrayContainName : function(obj, paramName)
	{
		var flag = false;
		
		for(var j=0;j<obj.length;j++)
		{
			var objName = obj[j];
			
			if(objName == paramName)
			{
				flag = true;
				break;
			}
		}
		
		return flag;
	}
	,
	
	//最大化打开一个新窗口
	openWindowMax : function(url)
	{
		var ww = window.screen.width-5;
	  	var hh = window.screen.height-60;
	  	window.open(url,"","top=0,left=0,width="+ww+",height="+hh+",resizable=yes,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no");
	}
	,
	/**
	 * 打开模式窗口
	 * @param {} sPath
	 * @param {} oArgs
	 * @param {} iX
	 * @param {} iY
	 * @return {}
	 */
	openModalDlg : function(sPath, oArgs, iX, iY){
	
		/**
		*1、在对话模中打开新的窗口，经常会发生会话丢失的现象，特修改为传递整个window作为参数。
		*2、追加手动构建的参数(目前用到的是mode和id)
		**/
		var args = new Object;
		args.window = window;
		
		if(oArgs != null)
		{
			try
			{
				for(key in oArgs)
				{	
					//var jsStr = "args." + key + "='" + oArgs[key] + "';";
					//eval(jsStr);  args.aa = val;
					args[key] = oArgs[key];
				}				
			}
			catch(e)
			{
				alert(e.message);
			}
		}		
		
		return window.showModalDialog(sPath, args, "dialogWidth:" + iX + "px;dialogHeight:" + iY + "px;resizable:yes;help:0;status:0;center:1"); 
	}
	,
	/**
	 * 打开窗体
	 * @param {} url
	 * @param {} ww
	 * @param {} hh
	 */
	openWindow : function(url,ww,hh) {
		 var top = (screen.height - hh)/2;
	  	var left= (screen.width - ww)/2;
	 	 window.open(url,"","top="+top+",left="+left+",width="+ww+",height="+hh+",resizable=yes,scrollbars=yes,status=yes,toolbar=no,menubar=no,location=no");
	}
	,
	/**
	 * 居中打开窗体
	 * @param {} url
	 * @param {} ww
	 * @param {} hh
	 */
	openWindowNoMax : function(url,ww,hh){
		var top = (screen.height - hh)/2;
	  	var left= (screen.width - ww)/2;
	  	window.open(url,"","top="+top+",left="+left+",width="+ww+",height="+hh+",resizable=no,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no");
	}
	,
	/**
	 * 最大化打开窗体
	 * @param {} url
	 * @param {} ww
	 * @param {} hh
	 */
	openWindowMax : function(url){
		var ww = window.screen.width-5;
	  var hh = window.screen.height-60;
	  window.open(url);
	}
	,
	/**
	 * 
	 * @param {} url
	 */
	openNormalWindowMax : function(url){
		 var ww = window.screen.width-5;
	  var hh = window.screen.height-60;
	  window.open(url,"","top=0,left=0,width="+ww+",height="+hh+",resizable=yes,scrollbars=yes,status=yes,toolbar=yes,menubar=yes,location=yes");
	}
	,	
	/**
	 * 格式化xml
	 * @param {} rootName
	 * @param {} arrNames
	 * @param {} arrValues
	 * @return {}
	 */
	buildFlatXmlString : function(rootName, arrNames, arrValues){
		var returnVal = ("<" + rootName + ">");
		for(var i = 0; i < arrNames.length; i++)
		{
			returnVal += ("<" + arrNames[i] + ">");
			if(arrValues[i] != null) returnVal += this.encodeXml(arrValues[i]);
			returnVal += ("</" + arrNames[i] + ">");
		}
		returnVal += ("</" + rootName + ">");
		return returnVal;
	}
	,
	/**
	 * 去除特殊字符
	 * @param {} s
	 * @return {}
	 */
	encodeXml : function(s){
		s = s.replace(/\x26/g,"&#38;");     //&
	    s = s.replace(/\x3c/g,"&#60;");     //<
	    s = s.replace(/\x3e/g,"&#62;");     //>
	    s = s.replace(/\x22/g,"&#34;");     //"
	    s = s.replace(/\x27/g,"&#39;");     //'
	    return s;
	}	
	,
	/**
	 * iframe高度自适应
	 * @param {} iframeId
	 * @return {}
	 */
	resizeIframe : function(iframeId){
		try 
		{ 				
			var obj = document.getElementById(iframeId);
			obj.height = document.frames[iframeId].document.body.scrollHeight;				
		}
		catch(e){} 		
	}	
	,
	/**
	 * 下拉框值清空并赋缺省值
	 * @param {} iframeId
	 * @param {} defaultValue
	 * @param {} defaultText
	 * @return {}
	 */
	removeSelect : function(selectId, defaultValue, defaultText){
		try
		{		
			var selectObj = document.getElementById(selectId);	
	    	
	    	for(var j=selectObj.length; j>0; j--)
   			{
   				selectObj.options[j] = null;
   				selectObj.options.remove(j);
   			}
   			
   			if(defaultValue != null && defaultText != null)
   			{
   				selectObj.options[0] = Option(defaultValue, defaultText);
   			}
		}
		catch(e)
		{}
	},
	/**
	 * 将原字符串中指定的值用指定的值替换
	 */	
 	replaceStr :function (Str,toMoveStr,toReplaceStr)
	 {
	   var returnStr="";
	   var sourceStr=Str.toString();
	   while (sourceStr.length>0 && sourceStr.indexOf(toMoveStr)!=-1)
	   {
	     var curPlace=sourceStr.indexOf(toMoveStr);
	     returnStr+=sourceStr.substring(0,curPlace)+toReplaceStr;
	     sourceStr=sourceStr.substring(curPlace+toMoveStr.length,sourceStr.length);
	   }
	   returnStr+=sourceStr;
	   return returnStr;
	 },
	 
	 /**
	 * 获取浏览器url的域名（ip）和根目录。
	 * 如：http://192.168.1.80/theme
	 */		 
	 getrootpath : function(){
			var strFullPath=window.document.location.href;
			var strPath=window.document.location.pathname;
			var pos=strFullPath.indexOf(strPath);
			var prePath=strFullPath.substring(0,pos);
			var postPath=strPath.substring(0,strPath.substr(1).indexOf('/')+1);
			return(prePath+postPath);
	},
	/**
	 * 获取浏览器url的域名（ip）。
	 * 如：http://192.168.1.80
	 */		 
	 getdomain : function(){
			var strFullPath=window.document.location.href;
			var strPath=window.document.location.pathname;
			var pos=strFullPath.indexOf(strPath);
			var prePath=strFullPath.substring(0,pos);
			var postPath=strPath.substring(0,strPath.substr(1).indexOf('/')+1);
			return(prePath);
	},
	/**
	 * 获取浏览器根目录。
	 * 如：/theme/
	 */	
	getpathname : function(){
		var urlpath = window.document.location.pathname;
		var i = urlpath.indexOf("/");
		if(i==0)
		{
			urlpath=urlpath.substr(1);
		}
		i = urlpath.indexOf("/");
		return("/" + urlpath.substr(0,i + 1));
	},
	/*
	*  字典格式化 
	*/
	formatDic : function(dm,dic){
		try{
			var _arrDm = dm.split(","),dicdata;
			if(typeof(dic) == "function")
				dicdata = dic();
			else
				dicdata = eval(dic + '()');	
			var mc = "";
			for(var m=0;m<_arrDm.length;m++){
				$.each(dicdata,function(i,n){
					if(n.dm == _arrDm[m]) 
					{
						if(mc==""){
							mc = n.mc;
						}else{
							mc = mc+","+n.mc;
						};
					};
					
				});
			};
			
			dicdata = null;
			return mc;
		}
		catch(e){
			//alert('字典文件('+ dic.toString() +'.js)尚未引用！');
		};
	},
	/*
	*  将px单位的值转为没有单位的整数
	*/
	pxtonum: function(prop){
		var tempcalc = prop;
		if( typeof(tempcalc) == "number" )
			return tempcalc;
		else
		{
			tempcalc = Number(tempcalc.replace(/px/,""));
			return tempcalc;
		}
	},
	/*
	*  将图层固定于水平位置
	*/
	fixedPosition: function(element ,top , right ,bottom ,left){
		/*标志特定公共规则是否存在*/
		var inited = false;
		
		/*设置特定公共规则*/
		setGlobal = function(){
			if (! inited)
			{
				document.body.style.height = "100%";
				document.body.style.overflow = "auto";
				$.addCSSRule("*html" ,"overflow-x:hidden;overflow-y:hidden;");
				inited = true;
			}
		};
		/*
		功能：使元素fixed定位
		*/
		element.style.display = "block";
		if (!window.XMLHttpRequest && window.ActiveXObject)
		{
			element.style.position = "absolute";
			setGlobal();
		}
		else
		{
			element.style.position = "fixed";
		};
		
		if(top != null) element.style.top = top +"px";
		if(right != null) element.style.right = right +"px";
		if(bottom != null) element.style.bottom = bottom +"px";
		if(left != null) element.style.left = left +"px";
		
		
	},
	/*添加css规则*/
	addCSSRule: function(key ,value){
		var css = document.styleSheets[document.styleSheets.length-1];
		css.cssRules ? 
			(css.insertRule(key +"{"+ value +"}", css.cssRules.length)) :
			(css.addRule(key ,value));		
	},
	/**************************************
	 *  html片段复制和渲染
	 *  fr,to,how,fn  -- fr：html片段；to：复制到什么地方，dom节点；how：复制方式；fn：回调函数，在将复制的片段附加到dom之前进行处理
	 **************************************/
	htmlclone : function (fr,to,how,fn){
			//复制
			var data = (arguments[3] == undefined)?($(fr).clone(true)):fn($(fr).clone(true));
			//对下拉列表进行处理
			data.find("*").each(function() {
				 $(this).removeData();
			});
			data.removeData();
			
			
			//渲染
			if(how == "before")
			{
				$(to).before(data.ohtml());
			}
			else if(how == "after")
			{
				$(to).after(data.ohtml());
			}
			else if(how == "append")
			{
				$(to).append(data.ohtml());
			}
			else if(how == "prepend")
			{
				$(to).prepend(data.ohtml());
			}
			else
			{
				if($.msgbox) 
					$.msgbox.alert('附加方式错误，仅支持before、after、append和prepend！',null,null,'温馨提示',null);
				else 
					alert('附加方式错误，仅支持before、after、append和prepend！');
			}
			
						
	},
	/*
	*  iframe高度自适应
	*/
	iframeAutoHeight: function(el){
		//if(el.style.height != "100%" || el.style.height != "auto" || el.style.height != "") return false;
				
		function iResize()
		{
			$(el).each(function(){
				this.style.height = $(this.contentWindow.document.body).height() + 'px';
			});			
		}
		if ($.browser.safari || $.browser.opera)
		{
			$(el).load(function(){
				setTimeout(iResize, 0);
			});
			$(el).each(function(){
				var iSource = this.src;
				this.src = '';
				this.src = iSource;
			});
		}
		else
		{
			function autoh()
			{
				try{
					el.style.height = $(el.contentWindow.document.body).height() + 'px';
					$(el).load(function(){
						this.style.height = $(this.contentWindow.document.body).height() + 'px';
					});
				}
				 catch (e){};
			};
			autoh();
		};
		
	},
	/*
	*  传入第几周的数字和年度，返回该周的开始日期和结束日期
	*/
	weekToDate: function(week,year){
		if(year == undefined) year = new Date().getFullYear();		
		var d = new Date();    
		d.setFullYear( year  , 0 );
		var firstweek = 8;
		for( var i = 1 ; i <= 31 ; i++ ){
			d.setDate( i );        
			if( d.getDay() == 1 )
			{
			    if(i == 2) firstweek = 2;
			    break;
			};
			if(i > 1) firstweek = d.getDate() + 1;			
		};
		var daynum = 0 ,w1 = "" ,w2 = "";
						
		daynum = firstweek + (Number(week) - 2)*7;
		
		if(week == 1)
		{			
			d.setFullYear(year,0,1);
			w1 = this.format(d,'yyyy-MM-dd');
			w2 = (firstweek == 2)?w1:this.format(this.dateAdd(d,'d',firstweek - 2),'yyyy-MM-dd');
		}
		else
		{
			d.setDate( daynum );
			w1 = this.format(d,'yyyy-MM-dd');
			w2 = this.format(this.dateAdd(d,'d',6),'yyyy-MM-dd');
		};
    	return ( w1 + ',' + w2 );
	},
	/*
	*  传入一个日期，返回该日期所在的当年的第几周周数
	*/
	dateToWeek: function(date){
		var date = date.split('-');
		var d = new Date();    
		d.setFullYear(date[0],Number(date[1])-1,date[2]);
		
		var dd = new Date();
		for( var i = 1 ; i <= 53 ; i++ )
		{
			var oneDate = this.weekToDate(i,date[0]).split(',');
			var oneDateSplit = oneDate[0].split('-');			    
			dd.setFullYear(oneDateSplit[0],Number(oneDateSplit[1])-1,oneDateSplit[2]);
			if(this.compare(d,dd) == 0)
				return i;
			else if(this.compare(d,dd)<1)
				return i-1;
		};
	},
	/*
	*  传入一个日期，返回该日期距离今日还有多少天
	*/
	compareNowDate: function(date){
		if(date.indexOf("-")>-1) date = date.replace(/-/g,'/');
		var d = new Date(date);
		var dd = new Date();
		//return this.compare(d,dd);
		var days= d.getTime() - dd.getTime(); 
		var time = parseInt(days / (1000 * 60 * 60 * 24));

		return time;
	},
	/**  
     * 清除当前选择内容  
     */  
    unselectContents: function(){   
        if(window.getSelection)   
            window.getSelection().removeAllRanges();   
        else if(document.selection)   
            document.selection.empty();   
    },
	/**  
     * 复制文本  
     */  
	copyCode: function(obj) {
		if(is_ie && obj.style.display != 'none') {
			var rng = document.body.createTextRange();
			rng.moveToElementText(obj);
			rng.scrollIntoView();
			rng.select();
			rng.execCommand("Copy");
			rng.collapse(false);
		}
	},
	/**  
     * 在新窗口预览html  
     */  
	runCode: function(value) {
		var winname = window.open('', "_blank", '');
		winname.document.open('text/html', 'replace');
		winname.document.write(value);
		winname.document.close();
	},
	/**  
     * 保存为html文件  
     */  
	saveCode: function(value) {
		var winname = window.open('', '_blank', 'top=10000');
		winname.document.open('text/html', 'replace');
		winname.document.writeln(value);
		winname.document.execCommand('saveas','','code.htm');
		winname.close();
	},
	/**
	*   生成随机字符串
	**/
	randstr: function(len)
	{
		 var seed = new Array(
			//'abcdefghijklmnopqrstuvwxyz',
			'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
			'0123456789'
		   );
		 
		 var idx,i;
		 var result = '';
		 for (i=0; i<len; i++)
		 {
		  idx = Math.floor(Math.random()*2);
		  result += seed[idx].substr(Math.floor(Math.random()*(seed[idx].length)), 1);
		 }
		
		 return result; 
	},
	/* 判断文本宽度 */
	checkStrLen: function(value,maxLength){     
		  var  str,Num = 0,maxLength = 2*maxLength,stringLength = 0;   
		  for(var i=0;i<value.length;i++){   
			  str = value.substring(i,i+1);   
			  if(str<="~")     //判断是否双字节   
				Num+=1;
			  else   
				Num+=2;
			  
			  stringLength++;
			  
			  if(Num > maxLength) break;
		  };
		  return  stringLength;   
		  //return  value.length;   
	}
});

sundun.fn.extend({   
    /**  
     * 选中内容  
     */  
    selectContents: function(){   
        $(this).each(function(i){   
            var node = this;   
            var selection, range, doc, win;   
            if ((doc = node.ownerDocument) &&   
                (win = doc.defaultView) &&   
                typeof win.getSelection != 'undefined' &&   
                typeof doc.createRange != 'undefined' &&   
                (selection = window.getSelection()) &&   
                typeof selection.removeAllRanges != 'undefined')   
            {   
                range = doc.createRange();   
                range.selectNode(node);   
                if(i == 0){   
                    selection.removeAllRanges();   
                }   
                selection.addRange(range);   
            }   
            else if (document.body &&   
                     typeof document.body.createTextRange != 'undefined' &&   
                     (range = document.body.createTextRange()))   
            {   
                range.moveToElementText(node);   
                range.select();   
            }   
        });   
    },
	/**  
     * 初始化需要插入文本的光标所在控件  
     */
	setCaret: function(){
		if($.browser.msie){
         $(this)
           .click(function(){
             caret($(this).get(0));
           })
           .select(function(){
             caret($(this).get(0));
           })
           .keyup(function(){
             caret($(this).get(0));
           });
       	};
		function caret(textObj)
		{
			if(textObj.createTextRange){    
				textObj.caretPos=document.selection.createRange().duplicate();    
			}
		};
    },
    /**  
     * 在当前对象光标处插入指定的内容  
     */
    insertAtCaret: function(text){
        function insertAtCaret(textObj,textFeildValue){  
          if(document.all&&textObj.createTextRange&&textObj.caretPos){       
              var caretPos=textObj.caretPos;      
              caretPos.text=caretPos.text.charAt(caretPos.text.length-1)==''?textFeildValue+'':textFeildValue; 
          }else if(textObj.setSelectionRange){        
              var rangeStart=textObj.selectionStart;
              var rangeEnd=textObj.selectionEnd;     
              var tempStr1=textObj.value.substring(0,rangeStart);      
              var tempStr2=textObj.value.substring(rangeEnd);      
              textObj.value=tempStr1+textFeildValue+tempStr2;
              textObj.focus();
              var len=textFeildValue.length;
              textObj.setSelectionRange(rangeStart+len,rangeStart+len);
              textObj.blur();
          }else {
            textObj.value+=textFeildValue;
          } 
        };
        
        insertAtCaret($(this).get(0),text);
    }
	
}); 


/* $('.top-div').ScrollTo2(500) */
$.getPos = function (e)
{
	var l = 0;
	var t  = 0;
	var w = $.intval($.css(e,'width'));
	var h = $.intval($.css(e,'height'));
	var wb = e.offsetWidth;
	var hb = e.offsetHeight;
	while (e.offsetParent){
		l += e.offsetLeft + (e.currentStyle?$.intval(e.currentStyle.borderLeftWidth):0);
		t += e.offsetTop  + (e.currentStyle?$.intval(e.currentStyle.borderTopWidth):0);
		e = e.offsetParent;
	}
	l += e.offsetLeft + (e.currentStyle?$.intval(e.currentStyle.borderLeftWidth):0);
	t  += e.offsetTop  + (e.currentStyle?$.intval(e.currentStyle.borderTopWidth):0);
	return {x:l, y:t, w:w, h:h, wb:wb, hb:hb};
};
$.getClient = function(e)
{
	if (e) {
		w = e.clientWidth;
		h = e.clientHeight;
	} else {
		w = (window.innerWidth) ? window.innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : document.body.offsetWidth;
		h = (window.innerHeight) ? window.innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body.offsetHeight;
	}
	return {w:w,h:h};
};
$.getScroll = function (e) 
{
	if (e) {
		t = e.scrollTop;
		l = e.scrollLeft;
		w = e.scrollWidth;
		h = e.scrollHeight;
	} else  {
		if (document.documentElement && document.documentElement.scrollTop) {
			t = document.documentElement.scrollTop;
			l = document.documentElement.scrollLeft;
			w = document.documentElement.scrollWidth;
			h = document.documentElement.scrollHeight;
		} else if (document.body) {
			t = document.body.scrollTop;
			l = document.body.scrollLeft;
			w = document.body.scrollWidth;
			h = document.body.scrollHeight;
		}
	}
	return { t: t, l: l, w: w, h: h };
};

$.intval = function (v)
{
	v = parseInt(v);
	return isNaN(v) ? 0 : v;
};

$.fn.ScrollTo = function(s) {
	o = $.speed(s);
	return this.each(function(){
		new $.fx.ScrollTo(this, o);
	});
};

$.fx.ScrollTo = function (e, o)
{
	var z = this;
	z.o = o;
	z.e = e;
	z.p = $.getPos(e);
	z.s = $.getScroll();
	z.clear = function(){clearInterval(z.timer);z.timer=null};
	z.t=(new Date).getTime();
	z.step = function(){
		var t = (new Date).getTime();
		var p = (t - z.t) / z.o.duration;
		if (t >= z.o.duration+z.t) {
			z.clear();
			setTimeout(function(){z.scroll(z.p.y, z.p.x)},13);
		} else {
			st = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.y-z.s.t) + z.s.t;
			sl = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.x-z.s.l) + z.s.l;
			z.scroll(st, sl);
		}
	};
	z.scroll = function (t, l){window.scrollTo(l, t)};
	z.timer=setInterval(function(){z.step();},13);
};
