if (Function.prototype.bind == null)
{
	Function.prototype.bind = function(object)
	{
		var __method = this;
		return function()
		{
			return __method.apply(object, arguments);
		}
	}
}

if (typeof(Gingle) == "undefined")
	Gingle = { };

Gingle.$=function(arg) {
	if (arguments.length > 1) {
		var e=[];
		for (var i=0; i<arguments.length; i++) {
			e.push(Gingle.$(arguments[i]));
		}
		return e;
	} else if (typeof arg == 'string') {
		return document.getElementById(arg);
	} else {
		return arg;
	}
}

Gingle.emptyFunction = function() { };

Gingle.Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}

Gingle.Log = { 

	enabled: function() {
		return gingleAjaxDebugEnabled();
	},
	
	info: function(msg) {
	    if (Gingle.Log.enabled())
			GingleAjaxDebug.logInfo(msg);
	},
	
	error: function(msg) {
		if (Gingle.Log.enabled())
			GingleAjaxDebug.logError(msg);
	},  

	log: function(msg) {
		if(Gingle.Log.enabled())
		{
			if ( typeof(msg) == "object" )
			{
				var m=msg;
				msg="";
				for ( p in m )
				{
					msg += p + " -- " + m[p] + "\n";
				}
			}
			GingleAjaxDebug.log(msg);
		}
	}
}

Gingle.FunctionsExecuter = Gingle.Class.create();

Gingle.FunctionsExecuter.prototype = {
	initialize: function(functions) {
		this.functions = functions;
		this.current = 0;
		this.depth = 0; // we need to limit call stack depth
	},
	
	processNext: function() {
		if (this.current < this.functions.length) {
			var f = this.functions[this.current];
			var run = function() {
				f(this.notify.bind(this));
			}.bind(this);
			this.current++;
						
			if (this.depth > 50 || Gingle.Browser.isKHTML() || Gingle.Browser.isSafari()) {
				// to prevent khtml bug that crashes entire browser
				// or to prevent stack overflow (safari has small call stack)
				this.depth = 0;
				window.setTimeout(run, 1);
			} else {
				this.depth++;
				run();
			}				
		}
	},	
	
	start: function() {
		this.processNext();
	},
	
	notify: function() {
		this.processNext();
	}
}

Gingle.replaceOuterHtml = function(element, text) {	

    if (element.outerHTML) { // internet explorer or opera support outerHtml
    
		var parent = element.parentNode;
		var tn = element.tagName;
					
		var tempDiv = document.createElement("div");
		var tempParent;
		
		// array for javascripts that were in the text
		var scripts = new Array();
		
		
		if (tn != 'TBODY' && tn != 'TR' && tn != "TD" && tn != "THEAD") {
			// in case the element is not any of these
			
			// this is not exactly nice, but we need to get invalid markup inside innerHTML,
			// because otherwise IE just swallows the <script> tags (sometimes) 
			tempDiv.innerHTML = '<table style="display:none">' + text + '</table>';
			
			// now copy the script tags to array (needed later for script execution)
			var s = tempDiv.getElementsByTagName("script");
			for (var i = 0; i < s.length; ++i) {
				scripts.push(s[i]);
			}
			
			// now use regular div so that we won't mess the DOM
			tempDiv.innerHTML = '<div style="display:none">' + text + '</div>'; 
			
			// set the outer <div> as parent
			tempParent = tempDiv.childNodes[0];
		} else {
		
			// hack to get around the fact that IE doesn't allow to replace table elements
			tempDiv.innerHTML = '<table style="display: none">' + text + '</table>';
			
			// get the parent element of new elements
			tempParent = tempDiv.getElementsByTagName(tn).item(0).parentNode;
			
			// collect the scrips
			scripts = tempDiv.getElementsByTagName("script");	
		}	

		// place all newly created elements before the old element	
		while(tempParent.childNodes.length > 0) {
			var tempElement = tempParent.childNodes[0];
			parent.insertBefore(tempElement, element);
		}
       
	    // remove the original element
		parent.removeChild(element);
		
			
		// we need to execute the javascript in reverse order to be consistent with firefox 
		if (element.tagName == "SCRIPT") {
			// in case we replaced the script element
			Gingle.Head.addJavascripts(element);
		} else {
			for (i = scripts.length - 1; i >= 0; --i) {
				Gingle.Head.addJavascripts(scripts[i]); 
			}						
		} 
					
    } else {
    	// create range and fragment
        var range = element.ownerDocument.createRange();
        range.selectNode(element);
		var fragment = range.createContextualFragment(text);
		
		// get the elements to be added
		var elements = new Array();
		for (var i = 0; i < fragment.childNodes.length; ++i)
			elements.push(fragment.childNodes[i]);

        element.parentNode.replaceChild(fragment, element);        

		// for certain browsers we need to execute the javascript manually
		if (document.all != null) {
			for (var i in elements) {
				Gingle.Head.addJavascripts(elements[i]);
			}
		}
    }		
}	
Gingle.decode = function(encoding, text) {
    if (encoding == "wicket1") {
        return Gingle.decode1(text);
    }
}

Gingle.decode1 = function(text) {
    return Gingle.replaceAll(text, "]^", "]");
}

Gingle.replaceAll = function(str, from, to) {
    var idx = str.indexOf(from);
    while (idx > -1) {
        str = str.replace(from, to);
        idx = str.indexOf(from);
    }
    return str;
}
Gingle.stopEvent = function(e) {
	e=Gingle.fixEvent(e);		
	e.cancelBubble = true;
	if (e.stopPropagation)
		e.stopPropagation();
}

Gingle.fixEvent = function(e) {
	if (typeof e == 'undefined') 
		e = window.event;
	return e;		
}

Gingle.Drag = {
	
	/**
	 * Initializes the dragging on the specified element.
	 * Element's onmousedown will be replaced by generated handler.
	 *
	 * @param {Element} element - element clicking on which the drag should begin 
	 * @param {Function} onDragBegin - handler called at the begin on dragging - passed element as first parameter
	 * @param {Function} onDragEnd - handler called at the end of dragging - passed element as first parameter
	 * @param {Function} onDrag - handler called during dragging - passed element and mouse deltas	 
	 */
	init: function(element, onDragBegin, onDragEnd, onDrag) {		
		
		if (typeof(onDragBegin) == "undefined")
			onDragBegin = Gingle.emptyFunction;
		if (typeof(onDragEnd) == "undefined")
			onDragEnd = Gingle.emptyFunction;
		if (typeof(onDrag) == "undefined")
			onDrag = Gingle.emptyFunction;
		
		// set the mousedown handler 
		element.onmousedown = function(e) {			
			
			e = Gingle.fixEvent(e);
	
			// HACK - for safari stopPropagation doesn't work well because
			// it also prevents scrollbars and form components getting the
			// event. Therefore for safari the 'ignore' flag is set on event. 
			if (typeof(e.ignore) == "undefined") {
				
				Gingle.stopEvent(e);
	
				onDragBegin(element);
			
				element.onDrag = onDrag;
				element.onDragEnd = onDragEnd;
				
				element.lastMouseX = e.clientX;
				element.lastMouseY = e.clientY;
				
				element.old_onmousemove = document.onmousemove;
				element.old_onmouseup = document.onmouseup;
				element.old_onselectstart = document.onselectstart;			
				
				document.onselectstart = function() { return false; }
				document.onmousemove = Gingle.Drag.mouseMove;
				document.onmouseup = Gingle.Drag.mouseUp;
							
				Gingle.Drag.current = element;
							
				return false;
			} 			
		};		
	},
	
	/**
	 * Deinitializes the dragging support on given element. 
	 */
	clean: function(element) {
		element.onmousedown = null;
	},

	/**
	 * Called when mouse is moved. This method fires the onDrag event
	 * with element instance, deltaX and deltaY (the distance
	 * between this call and the previous one).
	 
	 * The onDrag handler can optionally return an array of two integers 
	 * - the delta correction. This is used, for example, if there is
	 * element being resized and the size limit has been reached (but the
	 * mouse can still move).
	 * 
	 * @param {Event} e
	 */	
	mouseMove: function(e) {
		e = Gingle.fixEvent(e);
		var o = Gingle.Drag.current;

		// this happens sometimes in Safari 
		if (e.clientX < 0 || e.clientY < 0) {
			return;
		}

		if (o != null) {		
			var deltaX = e.clientX - o.lastMouseX;
			var deltaY = e.clientY - o.lastMouseY;
				
			var res = o.onDrag(o, deltaX, deltaY);
			
			if (res == null)
				res = [0, 0];
			
			o.lastMouseX = e.clientX + res[0];
			o.lastMouseY = e.clientY + res[1];
		}
		
		return false;
	},

	/**
	 * Called when the mouse button is released.
	 * Cleans all temporary variables and callback methods.
	 * 
	 * @param {Event} e
	 */	
	mouseUp: function(e) {		
		e = Gingle.fixEvent(e);
		var o = Gingle.Drag.current;
		
		o.onDragEnd(o);		
		
		o.onDrag = null;
		o.onDragEnd = null;
		o.lastMouseX = null;
		o.lastMouseY = null;
		
		document.onmousemove = o.old_onmousemove;
		document.onmouseup = o.old_onmouseup;		
		document.onselectstart = o.old_onselectstart;
		
		o.old_mousemove = null;		
		o.old_mouseup = null;
		o.old_onselectstart = null;
		
		Gingle.Drag.current = null;
	}
};

var GW = screen.width;
var GH = screen.height;

Gingle.alert = {
	messageId : 1,
	boxes:[],
	getElementPos : function(el)
	{
		var ua = navigator.userAgent.toLowerCase();
		var isOpera = (ua.indexOf('opera') != -1);
		var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
		if ( typeof(el) != "object" )
		{
			var el0 = document.getElementsByName(el);
			if ( ! el0 )
				el0=document.getElementById(el);
			el=el0;
			Gingle.Log.log(el);
		}
		if(el.parentNode === null || el.style.display == 'none')
		{
			return false;
		}
		var parent = null;
		var pos = [];
		var box;
		if(el.getBoundingClientRect)    //IE
		{
			box = el.getBoundingClientRect();
			var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
			var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
			return {x:box.left + scrollLeft, y:box.top + scrollTop};
		}
		else if(document.getBoxObjectFor)    // gecko
		{
			box = document.getBoxObjectFor(el);
			var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0;
			var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0;
			pos = [box.x - borderLeft, box.y - borderTop];
		}
		else // safari & opera 
		{ 
			pos = [el.offsetLeft, el.offsetTop]; 
			parent = el.offsetParent; 
			if (parent != el)
			{ 
				while (parent)
				{ 
					pos[0] += parent.offsetLeft; 
					pos[1] += parent.offsetTop; 
					parent = parent.offsetParent; 
				} 
			} 
			if (ua.indexOf('opera') != -1 || ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' )) 
			{ 
				pos[0] -= document.body.offsetLeft; 
				pos[1] -= document.body.offsetTop; 
			} 
		} 
		if (el.parentNode) { parent = el.parentNode; } 
		else { parent = null; } 
		while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') 
		{ // account for any scrolled ancestors 
			pos[0] -= parent.scrollLeft; 
			pos[1] -= parent.scrollTop; 
			if (parent.parentNode) { parent = parent.parentNode; } 
			else { parent = null; } 
		} 
		return {x:pos[0], y:pos[1]}; 
	},

	initBox : function(box,message,target)
	{
		box.element.innerHTML="<div class='ms'>" + message + "</div>";
		box.flag = 1;
		Gingle.Log.log(target);
		var point=Gingle.alert.getElementPos(target);
//		box.element.style.left = target.offsetWidth  + target.offsetParent.offsetWidth +target.clientWidth-10 + "px";
//		box.element.style.top = target.offsetHeight + target.offsetParent.offsetHeight + target.offsetParent.offsetParent.offsetHeight-30 + "px";
		box.element.style.left=point.x  +target.clientWidth-10+ "px";
		box.element.style.top=point.y + - 30 +"px";
		box.element.style.filter = "Alpha(Opacity=10)";
		box.element.style.MozOpacity = 0.1;
		box.element.style.zIndex = Gingle.Messagebox.zIndex++;
		box.element.style.display = "";
		box.element.fousEle=target;
		
	},
	createBox : function()
	{
		var box = {};
		box.element = document.createElement("div");
		box.element.className="msbx_1";
		box.element.onclick=function()
		{
			//alert("asdfasdf");
			this.style.display="none";
			box.element.fousEle.focus();
			box.element.fousEle.select();
		}.bind(box.element);
	//	alert("this");
	//	box.element.setAttribute("style","border:1px solid #ccc");
		document.body.appendChild(box.element);
		return box;
	},
	getBox : function()
	{
		var t = Gingle.alert.boxes;
		for (var i = 0; i < t.length; ++i) {
			return t[i];
//			if (t[i].element.style.display == "none" ) {
//				return t[i];
//			}
		}
		t.push(Gingle.alert.createBox());
		return t[t.length-1];		
	},
	show: function(mes,target)
	{
		var box = Gingle.alert.getBox();
		Gingle.alert.initBox(box,mes,target);
	},
	timeout:function()
	{
		var t = Gingle.alert.boxes;
		for (var i = 0; i < t.length; ++i) {
			var box = t[i];
			if ( box.element.style.display == "" )
			{
				if ( box.flag >30 && box.flag <= 40 )
				{
					var i=40-box.flag;
					box.element.style.filter = "Alpha(Opacity=" + i*10 + ")";
					box.element.style.MozOpacity = i/10.0;
					
				}
				else if ( box.flag <= 10 )
				{
					var i=box.flag;
					box.element.style.filter = "Alpha(Opacity=" + i*10 + ")";
					box.element.style.MozOpacity = i/10.0;
				}
				else if ( box.flag > 40 )
					box.element.style.display="none";
				box.flag++;
			}
		}
		setTimeout("Gingle.alert.timeout()",200);
	}
	
	
}
Gingle.alert.timeout();
gingleAlert = Gingle.alert.show;

Gingle.Messagebox = {
	messageId : 1,
	zIndex : 1000,
	initBox : function(box,message)
	{
		box.element.innerHTML=message;
		box.element.style.position = "absolute";
		box.element.style.padding="15px";
		box.element.style.background="#efefef";
		box.flag = 1;
		box.element.style.left = 100 + box.mid*200+"px";
		box.element.style.top = "0px";
		box.element.style.width =  "auto";
		box.element.style.height = "auto";
		box.element.style.filter = "Alpha(Opacity=10)";
		box.element.style.MozOpacity = 0.1;
		box.element.style.zIndex = Gingle.Messagebox.zIndex++;
		box.element.style.display = "";
	},
	createBox : function()
	{
		var box = {};
		box.element = document.createElement("fieldset");
        box.mid = (Gingle.Messagebox.messageId++);
		box.element.setAttribute('id', "Messagebox_" + box.mid);
		document.body.appendChild(box.element);
		return box;
	},
	getBox : function()
	{
		var t = Gingle.Messagebox.boxes;
		for (var i = 0; i < t.length; ++i) {
			if (t[i].element.style.display == "none" ) {
				return t[i];
			}
		}
		t.push(Gingle.Messagebox.createBox());
		return t[t.length-1];		
	},
	boxes: [],
	show: function(mes)
	{
		var box = Gingle.Messagebox.getBox();
		Gingle.Messagebox.initBox(box,mes);
	},
	timeout:function()
	{
		var t = Gingle.Messagebox.boxes;
		for (var i = 0; i < t.length; ++i) {
			var box = t[i];
			if ( box.element.style.display == "" )
			{
				if ( box.flag >30 && box.flag <= 40 )
				{
					var i=40-box.flag;
					box.element.style.filter = "Alpha(Opacity=" + i*10 + ")";
					box.element.style.MozOpacity = i/10.0;
					
				}
				else if ( box.flag <= 10 )
				{
					var i=box.flag;
					box.element.style.filter = "Alpha(Opacity=" + i*10 + ")";
					box.element.style.MozOpacity = i/10.0;
				}
				else if ( box.flag > 40 )
					box.element.style.display="none";
				box.flag++;
			}
		}
		setTimeout("Gingle.Messagebox.timeout()",200);
	}
	
}
Gingle.Messagebox.timeout();
gingleMessagebox = Gingle.Messagebox.show;


Gingle.useLoadingImage = function useLoadingImage(imageSrc)
{
	var loadingImage;
	if (imageSrc) loadingImage = imageSrc;
	else loadingImage = "ajax-loader.gif";
	dwr.engine.setPreHook( function() 
	{
		var disabledImageZone = $('disabledImageZone');
		if (!disabledImageZone)
		{
			disabledImageZone = document.createElement('div');
			disabledImageZone.setAttribute('id', 'disabledImageZone');
			disabledImageZone.style.position = "absolute";
			disabledImageZone.style.background = "#ccc";
			      
			disabledImageZone.style.zIndex = "1000";
			disabledImageZone.style.left = "0px";
			disabledImageZone.style.top = "0px";
			disabledImageZone.style.width = "105%";
			disabledImageZone.style.height = "100%";
			disabledImageZone.style.filter ="Alpha(Opacity=30)";
			disabledImageZone.style.MozOpacity='0.30';
			var imageZone = document.createElement('img');
			imageZone.setAttribute('id','imageZone');
			imageZone.setAttribute('src',imageSrc);
			imageZone.style.position = "absolute";
			imageZone.style.top = "30px";
			imageZone.style.right = "40%";
			document.body.appendChild(imageZone);
			document.body.appendChild(disabledImageZone);
		}
		else
		{
			$('imageZone').src = imageSrc;
			$('imageZone').style.visibility = "visible";
			disabledImageZone.style.visibility = 'visible';
		}
	});
	dwr.engine.setPostHook(function()
	{
		$('disabledImageZone').style.visibility = 'hidden';
		$('imageZone').style.visibility = "hidden";
	});
}

// DEBUG FUNCTIONS
function gingleAjaxDebugEnabled() {
    if (typeof(gingleAjaxDebugEnable)=="undefined") {
        return false;
    } else {
        return gingleAjaxDebugEnable==true;
    }
}
function gingleGet(id) {
	return Gingle.$(id);
}

function gingleShow(id) {
    var e=gingleGet(id);
    if (e!=null) {
	    e.style.display = "";
	}
}

function gingleHide(id) {
    var e=gingleGet(id);
	if (e!=null) {
	    e.style.display = "none";
	}
}

Gingle.Form = 
{
	ajaxFormSubmit : function(moduleName,action,moduleId,parentPage,formid)
	{
		if ( Gingle.Form.checkForm(gingleGet(formid)) == false ) return;
		var formMap = DWRUtil.getFormValues(formid);
		var tempMap={};
		 for(var a in formMap){
			 var c = a.split(":");
			 if(c.length>1)
			 	tempMap[c[1]]=formMap[a];
			 else
			 	tempMap[c]=formMap[a];
			 	Gingle.Log.log(c+"--------"+formMap[a]);
		 }
		servicesDwr.ajaxModuleAction(moduleName,action,moduleId,parentPage,tempMap); 
		
	},
	ajaxGetvalueSubmit : function(moduleName,action,moduleId,parentPage,vname)
	{
		var o=DWRUtil.getValue(vname);
		Gingle.Log.log(o);
		var r={};
		if ( typeof(o) == "object" )
		{
			for ( var p in o )
				r[p]=o[p];
		}
		else
			r['data']=o;
		servicesDwr.ajaxModuleAction(moduleName,action,moduleId,parentPage,r); 
		
	},
	unLoading : function(node)
	{
		if ( node.markLayer )
		{
			node.markLayer.style.display="none";
		}
	},
	loading : function(node)
	{
		if ( ! node.markLayer )
		{
			node.markLayer = document.createElement("div");
			node.markLayer.style.position="absolute";
			node.markLayer.style.backgroundColor="#eeeeee";
			node.markLayer.innerHTML="<div class='loadingMark'>&nbsp;</div>";
			var h=parseInt(node.clientHeight);
			var w=parseInt(node.clientWidth);
			node.markLayer.style.paddingTop =  Math.round(h/2) - 8;
			node.markLayer.style.paddingLeft = Math.round(w/2) - 8;
			if ( Gingle.Browser.isIE() )
			{
				node.markLayer.style.width = w + 5 + "px";
				node.markLayer.style.height = h + 3 + "px";
				node.markLayer.style.filter ="Alpha(Opacity=50)";	
			}
			else
			{
				node.markLayer.style.width = w-Math.round(w/2) + 8 + "px";
				node.markLayer.style.height = h-Math.round(h/2) + 8 + "px";
				node.markLayer.style.MozOpacity=0.5;
			}
			document.body.appendChild(node.markLayer);
		}
		var ss = Gingle.alert.getElementPos(node);
		node.markLayer.style.top = ss.y + "px";
		
		node.markLayer.style.left = ss.x + "px";
		node.markLayer.style.display="";
	},
	markNode : function(errorMsg,node,status)
	{
		if ( typeof(status) == "undefined" )
			status = 1;	//error
		node.checkstatus = status;
		if ( status == 2 ) //waiting
		{
			Gingle.Form.loading(node);
			return;
		}
		else
			Gingle.Form.unLoading(node);
		var dest
		try
		{
			dest = gingleGet(node.getAttribute("dest"));
		}
		catch (ex)
		{
		}
		if ( dest )
		{
			errorType = "dest";
			if ( ! node.oldc )
			{
				node.oldc = dest.getAttribute("class");
				if ( !node.oldc ) node.oldc="undefined";
			}
		}
		else
			errorType ="alert";
		if ( errorType == "alert" )
		{
			if ( errorMsg && errorMsg!="" ) gingleAlert(errorMsg,node);
			return;
		}
		if ( errorType == "dest" )
		{
			if ( status == 0 )
			{
				if ( node.oldc && node.oldc != "undefined" )
					dest.className=node.oldc;
				else
					dest.className="";
			}
			else 
			{
				dest.className=errorMsg;
			}
		}
	},
 	checkNode:function(node,moduleName,moduleId,parentPage,ajaxCheckFlag)
 	{
		try
		{		
			if(typeof(ajaxCheckFlag) == "undefined" )
				ajaxCheckFlag = true; 
			var	regexp = node.getAttribute("regexp");
	
			if ( regexp )
			{
				var reg=regexp.split(";");
				var	errorMsg = node.getAttribute("error").split(";");
				var defaultMsg = "输入错误，请确认。";
				if ( errorMsg && errorMsg.length >= 1 ) 
					defaultMsg=errorMsg[0];
				for ( var i=0;i<reg.length;i++ )
				{
				
					var	emsg = (errorMsg[i]?errorMsg[i]:defaultMsg);
					var sreg = reg[i].split(":");
					if ( sreg[0] == "not null" )
					{
						if ( node.value=="" )
						{
						
							Gingle.Form.markNode((errorMsg[i]?errorMsg[i]:defaultMsg),node);
							return false;
						}
					}
					else if(sreg[0] == "number"){					
						var re = /^[0-9]+[0-9]*]*$/; 
						if (!re.test(node.value))
						{
							Gingle.Form.markNode((errorMsg[i]?errorMsg[i]:defaultMsg),node);
            				return false;  
      					}
      					if(typeof(sreg[1])!=="undefined"){
      						if(parseInt(node.value)<parseInt(sreg[1]))
      						{
      							Gingle.Form.markNode((errorMsg[i]?errorMsg[i]:defaultMsg),node);
            					return false;  
      						}
      					}
      					if(typeof(sreg[2])!=="undefined"&&parseInt(node.value)>parseInt(sreg[2])){
 							Gingle.Form.markNode((errorMsg[i]?errorMsg[i]:defaultMsg),node);
            				return false;  
      					}   
					}
					else if(sreg[0] == "telephone"){
						var re1 = /^(?:13\d|15[89])-?\d{5}(\d{3}|\*{3})$/;
						var re2 = /^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/;  
  						if(re1.test(node.value)){  
  							return true; 
  						}else if(re2.test(node.value)){  
  							 return true;
  						}else{
  							Gingle.Form.markNode(emsg,node);
  							return false; 
  						}   
					}
					else if ( sreg[0] == "length" && sreg.length >= 2 )
					{
						var len = parseInt(sreg[1]);
						var docLen = 0;
						for(var j = 0;j<node.value.length;j++)
						{   
  							if ( node.value.charCodeAt(j) > 255)docLen+=2;   
  							else  docLen+= 1;   
  						}   					
						if ( docLen<len )
						{
							Gingle.Form.markNode(emsg,node);
							return false;
						}
						if ( sreg.length >= 3 )
						{
							var len = parseInt(sreg[2]);
							if ( docLen>len )
							{
								Gingle.Form.markNode(emsg,node);
								return false;
							}							
						}
					}else if (sreg[0] == "equals" && sreg.length>=2)
					{
						var other = document.getElementsByName(sreg[1])[0];
						if(other){
							if(node.value!=other.value){
								Gingle.Form.markNode(emsg,node);
								return false;
							}
						}
					}else if(sreg[0] == "email"){
						 if (node.value.search(/^\w+((-\w+)|(\.\w+))*\w\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\w\.[A-Za-z0-9]{2,3}$/) == -1)					 
  						  	{	
  						  		Gingle.Form.markNode(emsg,node);
  						  		return false;
  						 	 }			
					}
					else if (sreg[0] == "not chinese"){
						var   hanzireg=/^\w*$/;   
  						if(!hanzireg.test(node.value)){
  							Gingle.Form.markNode(emsg,node);
  							return false;
  						}				
					}else if(sreg[0]=="must check"){
						if(node.checked == false){
							Gingle.Form.markNode(emsg,node);
  							return false;
						}
					}else if(sreg[0]=="must filter"){//内容过滤
						var keyWords=new Array("他妈的","你妈的","共产党","法轮功","胡锦涛","国名党","反共","我操","退党","天安门事件","色情网站","江主席","江贼民","腐败","三个代表","西藏独立");
						for(var i=0;i<keyWords.length;i++)
						{
							if(node.value.indexOf(keyWords[i])!=-1){
								Gingle.Form.markNode(emsg,node);
  								return false;
							}
						}
					}
					else if ( sreg[0] == "ajax" && sreg.length >= 2  && ajaxCheckFlag)
					{
						var failMessage = emsg.split(":")[0];
						var succMessage = emsg.split(":")[1];
						Gingle.Form.markNode(null,node,2);	// waiting
						servicesDwr.ajaxModuleCheck(moduleName,sreg[1],moduleId,parentPage,node.value,{						
						callback:function(ret){
							if ( ret == false )
							{
								Gingle.Form.markNode(failMessage,this);
							}
							else
							{
								Gingle.Form.markNode(succMessage,this,0);	// successful
							}
						
						}.bind(node),
						errorHandler:function(message) { 
								alert('请求超时');
								Gingle.Form.markNode('请求超时',node); 
						},
 						timeout:8000						
						});
						return true;
					}
				}
				Gingle.Form.markNode(null,node,0);
			}
 		}
 		catch(ex)
 		{
  		}
 		return true;
 	},
	checkForm:function (form,moduleName,moduleId,parentPage)
	{
		for ( var node in form )
		{
			try
			{
			Gingle.Log.log(node + " -- " + form[node].checkstatus);
				if ( Gingle.Form.checkNode(form[node],moduleName,moduleId,parentPage,false) == false ){
					return false;
				} 
			}
			catch(ex)
			{
				
			}
		}
		return true;
	}
}

Gingle.AjaxOperation = {//ajax操作前确认
	ConfirmBeforeCommit : function(moduleName,action,moduleId,parentPage,params)
	{
		var confirms = params.split("&&");
		var tempMap={};	
		for(var i =0;i<confirms.length;i++){
			
			var confirm = confirms[i].split(":");
			if(confirm[0] == "confirm"){
				var yesOrNo = window.confirm(confirm[1]);
				if(yesOrNo == false){
					return false;
				}
			}else if(confirm[0] == "elements"){
				var value = document.getElementById(confirm[1]).value;
				tempMap[confirm[1]]=value;
			}
			else if(confirm[0] == "checkbox"){
				var s = "";
				var checks = document.getElementsByName(confirm[1]);
				var tempFlag = true;
				for(var j=0;j<checks.length;j++){ 
					if(checks[j].checked==true){
						if(tempFlag){
							tempFlag = false;
							s = s+ parseInt(checks[j].value);
						}else
							s=s+","+parseInt(checks[j].value); 
					}
				}
				if(s.length<=0)
				{
					alert("请至少选中一个进行操作");
					return false;
				}
				tempMap["checked"] = s; 
			}else{
				tempMap[confirm[0]] = confirm[1];
			}
			
		}
		servicesDwr.ajaxModuleAction(moduleName,action,moduleId,parentPage,tempMap); 
		
	}
}


Gingle.images = {
	getimgcode:function(id){
		var   randomnum   =   Math.random();   
   		var   getimagecode   =   document.getElementById(id);   
   		getimagecode.src  =  "/image.jsp?"+randomnum;   
	}
}

Gingle.buttons = {
	setValue:function(id,value){
		var ele = document.getElementById(id);
		ele.value = value;
	}
}

Gingle.div = {
	show:function(id){
		var ele = document.getElementById(id);
		if(ele.style.display=="none")
			ele.style.display="";
		else
			ele.style.display="none";
	},
	insertSmile:function(smileface,commentContent){
		document.getElementById(commentContent).value += smileface;
		document.getElementById(commentContent).focus();
	}
}

Gingle.selectAddress = {
	setcity:function(provincal,city,cityName) {
    switch ( document.getElementById(provincal).value) {
        case "" :
            var cityOptions = new Array("", "");
            break;
        case "安徽" :
            var cityOptions = new Array(
            "合肥", "合肥","安庆", "安庆","蚌埠", "蚌埠","亳州", "亳州","巢湖", "巢湖","滁州", "滁州","阜阳", "阜阳","贵池", "贵池","淮北", "淮北","淮化", "淮化","淮南", "淮南", "黄山", "黄山", "九华山", "九华山", "六安", "六安","马鞍山", "马鞍山","宿州", "宿州","铜陵", "铜陵","屯溪", "屯溪","芜湖", "芜湖", "宣城", "宣城");
             break;
        case "北京" :
            var cityOptions = new Array(
            "北京", "北京","东城","西城","崇文","宣武","朝阳","丰台","石景山","海淀","门头沟","房山","通州","顺义","昌平","大兴","平谷","怀柔","密云","延庆");
            break;
        case "重庆" :
            var cityOptions = new Array(
            "重庆", "重庆","万州","涪陵","渝中","大渡口","江北","沙坪坝","九龙坡","南岸","北碚","万盛","双挢","渝北","巴南","黔江","长寿","綦江","潼南","铜梁","大足","荣昌","壁山","梁平","城口","丰都","垫江","武隆","忠县","开县","云阳","奉节","巫山","巫溪","石柱","秀山","酉阳","彭水","江津","合川","永川","南川");
            break;
        case "福建" :
            var cityOptions = new Array(
            "福州", "福州","福安", "福安","龙岩", "龙岩","南平", "南平","宁德", "宁德","莆田", "莆田","泉州", "泉州","三明", "三明","邵武", "邵武","石狮", "石狮","永安","永安", "武夷山", "武夷山","厦门", "厦门", "漳州", "漳州");
             break;
        case "甘肃" :
            var cityOptions = new Array("兰州", "兰州","白银", "白银","定西", "定西","敦煌", "敦煌","甘南", "甘南","金昌", "金昌","酒泉", "酒泉","临夏", "临夏","平凉", "平凉","天水", "天水","武都", "武都","西峰", "西峰","张掖", "张掖");
            break;
        case "广东" :
            var cityOptions = new Array(
            "广州", "广州","潮阳", "潮阳","潮州", "潮州","澄海", "澄海","东莞", "东莞","佛山", "佛山","河源", "河源","惠州", "惠州","江门", "江门", "揭阳", "揭阳","开平", "开平","茂名", "茂名","梅州", "梅州","清远", "清远","汕头", "汕头","汕尾", "汕尾","韶关", "韶关","深圳", "深圳","顺德", "顺德","阳江", "阳江","阳江", "阳江", "英德", "英德","云浮", "云浮","增城", "增城","湛江", "湛江","肇庆", "肇庆","中山", "中山","珠海", "珠海");
            break;
        case "广西" :
            var cityOptions = new Array("南宁", "南宁","百色", "百色","北海", "北海","桂林", "桂林","防城港", "防城港","河池", "河池","柳州", "柳州","钦州", "钦州","梧州", "梧州","玉林", "玉林");
            break;
        case "贵州" :
            var cityOptions = new Array("贵阳", "贵阳","安顺", "安顺","毕节", "毕节","都匀", "都匀","凯里", "凯里","六盘水", "六盘水","铜仁", "铜仁","兴义", "兴义","玉屏", "玉屏","遵义", "遵义");
            break;
        case "海南" :
            var cityOptions = new Array(
            "海口", "海口","儋县", "儋县","陵水", "陵水","琼海", "琼海","三亚", "三亚","通什", "通什","万宁", "万宁");
            break;
        case "河北" :
            var cityOptions = new Array(
            "石家庄", "石家庄","保定", "保定","北戴河", "北戴河","沧州", "沧州","承德", "承德","丰润", "丰润","邯郸", "邯郸","衡水", "衡水","廊坊", "廊坊","南戴河", "南戴河","秦皇岛", "秦皇岛","唐山", "唐山","新城", "新城","邢台", "邢台","张家口", "张家口");
            break;
        case "黑龙江" :
            var cityOptions = new Array(
            "哈尔滨", "哈尔滨","北安", "北安","大庆", "大庆","大兴安岭", "大兴安岭","鹤岗", "鹤岗","黑河", "黑河","佳木斯", "佳木斯","鸡西", "鸡西","牡丹江", "牡丹江","齐齐哈尔", "齐齐哈尔","七台河", "七台河","双鸭山", "双鸭山","绥化", "绥化","伊春", "伊春");
            break;
        case "河南" :
            var cityOptions = new Array("郑州", "郑州","安阳", "安阳","鹤壁", "鹤壁","潢川", "潢川","焦作", "焦作","开封", "开封","漯河", "漯河","洛阳", "洛阳","南阳", "南阳","平顶山", "平顶山","濮阳", "濮阳","三门峡", "三门峡","商丘", "商丘","新乡", "新乡","信阳", "信阳","许昌", "许昌","周口", "周口","驻马店", "驻马店");
            break;
        case "香港" :
            var cityOptions = new Array(
            "香港", "香港","九龙", "九龙");
            break;
        case "湖北" :
            var cityOptions = new Array(
            "武汉", "武汉","恩施", "恩施","鄂州", "鄂州","黄岗", "黄岗","黄石", "黄石","荆门", "荆门","荆州", "荆州","潜江", "潜江","十堰", "十堰","随州", "随州","武穴", "武穴","仙桃", "仙桃","咸宁", "咸宁","襄阳", "襄阳","襄樊", "襄樊","孝感", "孝感","宜昌", "宜昌");
            break;
        case "湖南" :
            var cityOptions = new Array(
            "长沙", "长沙","常德", "常德","郴州", "郴州","衡阳", "衡阳","怀化", "怀化","吉首", "吉首","娄底", "娄底","邵阳", "邵阳","湘潭", "湘潭","益阳", "益阳","岳阳", "岳阳","永州", "永州","张家界", "张家界","株洲", "株洲");
            break;
        case "江苏" :
            var cityOptions = new Array(
            "南京", "南京","常熟", "常熟","常州", "常州","海门", "海门","淮安", "淮安","江都", "江都","江阴", "江阴","昆山", "昆山","连云港", "连云港","南通", "南通","启东", "启东","沭阳", "沭阳","苏州", "苏州","太仓", "太仓","泰州", "泰州","同里", "同里","无锡", "无锡","徐州", "徐州","盐城", "盐城","扬州", "扬州","宜兴", "宜兴","仪征", "仪征","张家港", "张家港","镇江", "镇江","周庄", "周庄");
            break;
        case "江西" :
            var cityOptions = new Array(
            "南昌", "南昌","抚州", "抚州","赣州", "赣州","吉安", "吉安","景德镇", "景德镇","井冈山", "井冈山","九江", "九江","庐山", "庐山","萍乡", "萍乡","上饶", "上饶","新余", "新余","宜春", "宜春","鹰潭", "鹰潭");
            break;
        case "吉林" :
            var cityOptions = new Array(
            "长春", "长春","白城", "白城","白山", "白山","珲春", "珲春","辽源", "辽源","梅河", "梅河","吉林", "吉林","四平", "四平","松原", "松原","通化", "通化","延吉", "延吉");
            break;
        case "辽宁" :
            var cityOptions = new Array(
            "沈阳", "沈阳","鞍山", "鞍山","本溪", "本溪","朝阳", "朝阳","大连", "大连","丹东", "丹东","抚顺", "抚顺","阜新", "阜新","葫芦岛", "葫芦岛","锦州", "锦州","辽阳", "辽阳","盘锦", "盘锦","铁岭", "铁岭","营口", "营口");
            break;
        case "澳门" :
            var cityOptions = new Array(
            "澳门", "澳门");
            break;
        case "内蒙古" :
            var cityOptions = new Array(
            "呼和浩特", "呼和浩特","阿拉善盟", "阿拉善盟","包头", "包头","赤峰", "赤峰","东胜", "东胜","海拉尔", "海拉尔","集宁", "集宁","临河", "临河","通辽", "通辽","乌海", "乌海","乌兰浩特", "乌兰浩特","锡林浩特", "锡林浩特");
            break;
        case "宁夏" :
            var cityOptions = new Array(
            "银川", "银川","固源", "固源","石嘴山", "石嘴山","吴忠", "吴忠");
            break;
        case "青海" :
            var cityOptions = new Array(
            "西宁", "西宁","德令哈", "德令哈","格尔木", "格尔木","共和", "共和","海东", "海东","海晏", "海晏","玛沁", "玛沁","同仁", "同仁","玉树", "玉树");
            break;
        case "山东" :
            var cityOptions = new Array(
            "济南", "济南","滨州", "滨州","兖州", "兖州","德州", "德州","东营", "东营","荷泽", "荷泽","济宁", "济宁","莱芜", "莱芜","聊城", "聊城","临沂", "临沂","蓬莱", "蓬莱","青岛", "青岛","曲阜", "曲阜","日照", "日照","泰安", "泰安","潍坊", "潍坊","威海", "威海","烟台", "烟台","枣庄", "枣庄","淄博", "淄博");
            break;
        case "上海" :
            var cityOptions = new Array(
            "上海", "上海","崇明", "崇明","朱家角", "朱家角");
            break;
        case "山西" :
            var cityOptions = new Array(
            "太原", "太原","长治", "长治","大同", "大同","候马", "候马","晋城", "晋城","离石", "离石","临汾", "临汾","宁武", "宁武","朔州", "朔州","忻州", "忻州","阳泉", "阳泉","榆次", "榆次","运城", "运城");
            break;
        case "陕西" :
            var cityOptions = new Array(
            "西安", "西安","安康", "安康","宝鸡", "宝鸡","汉中", "汉中","渭南", "渭南","商州", "商州","绥德", "绥德","铜川", "铜川","咸阳", "咸阳","延安", "延安","榆林", "榆林");
            break;
        case "四川" :
            var cityOptions = new Array(
            "成都", "成都","巴中", "巴中","达安", "达安","德阳", "德阳","都江堰", "都江堰","峨眉山", "峨眉山","涪陵", "涪陵","广安", "广安","广元", "广元","九寨沟", "九寨沟","康定", "康定","乐山", "乐山","泸州", "泸州","马尔康", "马尔康","绵阳", "绵阳","南充", "南充","内江", "内江","攀枝花", "攀枝花","遂宁", "遂宁","汶川", "汶川","西昌", "西昌","雅安", "雅安","宜宾", "宜宾","自贡", "自贡");
            break;
        case "台湾" :
            var cityOptions = new Array(
            "台北", "台北","基隆", "基隆","台南", "台南","台中", "台中");
            break;
        case "天津" :
            var cityOptions = new Array(
            "天津", "天津");
            break;
        case "新疆" :
            var cityOptions = new Array(
            "乌鲁木齐", "乌鲁木齐","阿克苏", "阿克苏","阿勒泰", "阿勒泰","阿图什", "阿图什","博乐", "博乐","昌吉", "昌吉","东山", "东山","哈密", "哈密","和田", "和田","喀什", "喀什","克拉玛依", "克拉玛依","库车", "库车","库尔勒", "库尔勒","奎屯", "奎屯","石河子", "石河子","塔城", "塔城","吐鲁番", "吐鲁番","伊宁", "伊宁");
            break;
        case "西藏" :
            var cityOptions = new Array(
            "拉萨", "拉萨","阿里", "阿里","昌都", "昌都","林芝", "林芝","那曲", "那曲","日喀则", "日喀则","山南", "山南");
            break;
        case "云南" :
            var cityOptions = new Array(
            "昆明", "昆明","大理", "大理","保山", "保山","楚雄", "楚雄","大理", "大理","东川", "东川","个旧", "个旧","景洪", "景洪",
            "开远", "开远","临沧", "临沧","丽江", "丽江","六库", "六库","潞西", "潞西","曲靖", "曲靖","思茅", "思茅","文山", "文山","西双版纳", "西双版纳","玉溪", "玉溪","中甸", "中甸","昭通", "昭通");
            break;
        case "浙江" :
            var cityOptions = new Array(
            "杭州", "杭州","安吉", "安吉","慈溪", "慈溪", "定海", "定海","奉化", "奉化","海盐", "海盐",
            "黄岩", "黄岩", "湖州", "湖州","嘉兴", "嘉兴","金华", "金华","临安", "临安","临海", "临海","丽水", "丽水","宁波", "宁波","瓯海", "瓯海", "平湖", "平湖", "千岛湖", "千岛湖","衢州", "衢州","瑞安", "瑞安","绍兴", "绍兴","嵊州", "嵊州", "台州", "台州", "温岭", "温岭", "温州", "温州");
            break;    
    }
     document.getElementById(city).options.length = 0;
    for(var i = 0; i < cityOptions.length/2; i++) {
         document.getElementById(city).options[i]=new Option(cityOptions[i*2],cityOptions[i*2+1]);
        if ( document.getElementById(city).options[i].value==cityName) document.getElementById(city).selectedIndex = i;
    }
},
initprovcity:function(provincal,city,cityName) {
    for(var i = 0; i < document.getElementById(provincal).options.length; i++) {
        if ( document.getElementById(provincal).options[i].value=="")  document.getElementById(provincal).selectedIndex = i;
    }
    	Gingle.selectAddress.setcity(provincal,city,cityName);
    	
}
}
