
function GetHttpRequest(){
    if ( window.XMLHttpRequest ) // Gecko
        return new XMLHttpRequest() ;
    else if ( window.ActiveXObject ) // IE 
        return new ActiveXObject("Microsoft.XMLHTTP") ;
}

function IncludeJS(sId, fileUrl, source){ 
    if ( ( source != null ) && ( !document.getElementById( sId ) ) ){ 
        var oHead = document.getElementsByTagName('HEAD').item(0); 
        var oScript = document.createElement( "script" ); 
        oScript.language = "javascript"; 
        oScript.type = "text/javascript"; 
        oScript.id = sId; 
        oScript.defer = true; 
        oScript.text = source; 

        oHead.appendChild( oScript ); 
    }
}

function IncludeHTML(container, fileUrl, source){
	$(container).innerHTML = source;
	
	//装载js
	/*var i, j, k;
	i = source.indexOf('<script');
	while(i != -1){
		k = source.indexOf('src="', i);
		if(k != -1){
			i = k + 5;
			j = source.indexOf('"', i);
			var jsSrc = source.substring(i, j);
			if(jsSrc.length > 0 && !jsSrc.match(/alpha\.js([\?\.]|$)/))
				loadJS(jsSrc, true);
		}
		i = source.indexOf('<script', i+1);
	}//*/
	var i, j, k;
	var re = /<script/ig, ree = /<\/script>/ig, res = /src=/ig;
	i = re.exec(source);
	while(i != null){
		i = i.index;
		j = ree.exec(source).index;
		res.lastIndex = i;
		k = res.exec(source);
		if(k != null && k.index<j){
			k = k.index;
			var c = source.substr(k+4, 1);
			i = k + 5;
			j = source.indexOf(c, i);
			var jsSrc = source.substring(i, j);
			if(jsSrc.length > 0 && !jsSrc.match(/alpha\.js([\?\.]|$)/))
				loadJS(jsSrc, true);
		}else{
			k = source.indexOf('>', i) + 1;
			var ss = source.substring(k, j);
			if(ss.length > 0){
				IncludeJS('js_'+new Date().getTime(), '', ss);
			}
		}
		i = re.exec(source);
	}
}

function AjaxPage(sId, url, cbF){
    var oXmlHttp = GetHttpRequest() ;

    oXmlHttp.onreadystatechange = function(){ 
        if ( oXmlHttp.readyState == 4 ){
            if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 ){
                cbF( sId, url, oXmlHttp.responseText );
            }else{ 
                alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ; 
            } 
        } 
    } 

    oXmlHttp.open('GET', url, false); 
    oXmlHttp.send(null);
}

function getBaseURI(){
	if(this.baseUri){
		return this.baseUri;
	}
	var scripts = document.getElementsByTagName("script");
	var rePkg = /alpha\.js([\?\.]|$)/i;
	for(var i=0; i<scripts.length; ++i){
		var src = scripts[i].getAttribute("src");
		if(!src) { continue; }
		var m = src.match(rePkg);
		if(m){
			this.baseUri = src.substring(0, m.index);
			break;
		}
	}
	return this.baseUri;
	//return dojo.hostenv.getBaseScriptUri();
}


function loadJS(path, reload){
	if(this[path] && !reload)
		return;
		/*
	var s = document.createElement('<SCRIPT>');
	s.src = path;
	if(document.body == null)
		document.write(s.outerHTML);
	else
		document.body.appendChild(s);
		//*/
	AjaxPage('js_'+new Date().getTime(), path, IncludeJS);
	this[path] = 1;
}

function loadSysJS(jsName, reload){
	loadJS(getBaseURI() + jsName, reload);
}

function loadCSS(path, reload){
	if(this[path] && !reload)
		return;
		
	if(isIE()){
		document.createStyleSheet(path);
	}else{
		var style = document.createElement('link'); 
		style.href = path; 
		style.rel = 'stylesheet'; 
		style.type = 'text/css';
		document.getElementsByTagName('HEAD').item(0).appendChild(style);
	}
	
	this[path] = 1;
}

function loadSysCSS(cssName, style, reload){
	//TODO
}

loadSysJS('dojo.js');
//var lastTime = new Date().getTime();
//loadSysJS('jsonrpc.js');


//var jsonrpc = new JSONRpcClient("?_JSON_RPC_=JSON-RPC");
//alert("ok:"+(new Date().getTime()-lastTime));

function isIE(){
	return document.all ? true : false;
}

function include(widget){
	dojo.require(widget);
}

function addOnLoad(f){
	if(!__isLoadInSamePage)
		dojo.addOnLoad(f);
	else
		f();
}


//初始化alpha环境。
{
	loadCSS(getBaseURI()+"default/css/base.css");
}


function $(id){
	return dojo.byId(id);
}

function getElement(id){
	return $(id);
}

function findElementsBy(parent, attrName, value){
	var fields = [];
	var child = $(parent).firstChild;
	while(child != null){
		if(!child.getAttribute){
			child = child.nextSibling;
			continue;
		}
		if(child.getAttribute(attrName) != value){
			var fs = findElementsBy(child, attrName, value);
			//fields.concat(fs);  //这样写会导致最后返回的结果为空数组，很奇怪。
			for(var i=0,n=fs.length; i<n; ++i){
				fields.push(fs[i]);
			}
		}else{
			fields.push(child);
		}
		child = child.nextSibling;
	}
	
	return fields;
}

//联合多个属性值查找子元素。
//attrs:是一个Map。比如{"cid":'checkbox1', "checked":false}。表示所有需要查询的属性值。
function findElementsByAttrs(parent, attrs){
	var cc = [];
	var i = 0;
	for(p in attrs){
		if(i == 0){
			cc = findElementsBy(parent, p, attrs[p]);
		}else{
			var temp = [];
			for(var j=0; j<cc.length; ++j){
				if(cc[j][p] == attrs[p])
					temp.push(cc[j]);
			}
			cc = temp;
		}
		++i;
	}
	
	return cc;
}

function getWidget(id){
	return dojo.widget.byId(id);
}

function stopEvent(event){
	dojo.event.browser.stopEvent(event);
}

//只适用于IE。
function sleep(timeout) {
	window.showModalDialog("javascript:document.writeln('<script>window.setTimeout(function () { window.close(); }, " + timeout + ");<\/script>');");
}

var AjaxAction = {
	/*asynchronous, action, param...*/
	call:function(){
		var asyn = true;
		var idx=0;
		if(arguments[0]===true || arguments[0]===false){
			asyn = arguments[0];
			++idx;
		}
		/*
		var act = arguments[idx++].split('.');
		var argus = new Array();
		for(var i=0; idx<arguments.length; ++i,++idx){
			argus[i] = 'arguments['+idx+']';
		}//*/
		
		var sendData = {};
		sendData["id"] = ++al_action_call_id;
		sendData["method"] = arguments[idx++];
		sendData["params"] = [];
		for(var i=idx; i<arguments.length; ++i){
			sendData["params"].push(arguments[i]);
		}
		try{
			/*if(asyn){
				var strArg = (argus.length==0) ? '' : (','+argus);
				eval('jsonrpc[act[0]][act[1]](function(result, e){if(e==null)AjaxAction._loadData(result, asyn);else alert(e.message);}' + strArg + ')');
			}else{
				return eval('this._loadData(jsonrpc[act[0]][act[1]]('+ argus +'), asyn)');
			}//*/
			var rt;
			var oXmlHttp = GetHttpRequest();
			var onreadystatechange = function(){ 
		        if ( oXmlHttp.readyState == 4 ){
		            if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 ){
		                eval('rt = ' + oXmlHttp.responseText);
		                if(rt.error)throw rt.error.msg;
		                rt = AjaxAction._loadData(rt['result'], asyn);
		            }else{ 
		                throw ( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ; 
		            } 
		        } 
		    };
		    if(asyn){
		    	oXmlHttp.onreadystatechange = onreadystatechange;
		    }
			oXmlHttp.open('POST', "?_JSON_RPC_=JSON-RPC", asyn);
			oXmlHttp.send(toJSON(sendData));
			
			// firefox 1.5 doesn't fire statechange for sync requests
			if(!asyn){
				onreadystatechange();
			}
			
			return rt;
		}catch(e){
			alert(e.message);
		}
	},
	
	/*action, param...*/
	syncCall:function(){
		var argus = new Array();
		for(var i=0; i<arguments.length; ++i){
			argus[i] = 'arguments['+i+']';
		}
		return eval('this.call(false, ' + argus + ')');
	},
	
	_loadData:function(result, asynchronous){
		if(result){
			if(result.toString().substr(0,5) != "<xml>")
				return result;
				
			var data;
			if(isIE()){
				data = new ActiveXObject('Microsoft.XMLDOM');
			}else{
				data = document.implementation.createDocument("text/xml", "", null);
			}
			data.loadXML(result);
			//load page
			var page = data.documentElement.selectNodes('page');
			if(page.length > 0){
				page = page[0];
				if(asynchronous==false){
					document.open();
					document.write(page.text);
					document.close();
				}else{
					document.write(page.text);
				}
				//document.body.innerHTML = page.text;
			}
			
			//装载数据
			var dataview = data.documentElement.selectNodes('dataview');
			if(dataview.length > 0){
				dataview = dataview[0];
				var cs = dataview.childNodes;
				for(var i=0; i<cs.length; ++i){
					eval(cs[i].tagName).loadData(cs[i]);
				}
			}
		}
		return result;
	}
}

var FormAction = {
	call: function() {
		var asyn = true;
		var idx=0;
		if(arguments[0]==true || arguments[0]==false){
			asyn = arguments[0];
			++idx;
		}
		form = $(arguments[idx]); 
		cb = arguments[idx+1];  //回调函数

		stopEvent(window.event);
		//处理文件上传
		if(form.enctype == "multipart/form-data"){
			dojo.require("dojo.io.IframeIO");
			
			var w = document.createElement("<div>");
			w.style.position = 'absolute';
			w.style.left = document.body.clientWidth/2 - 110;
			w.style.width = 220;
			w.style.top = document.body.clientHeight/2 - 30;
			w.style.height = 60;
			w.style.lineHeight = '60px';
			w.style.backgroundColor = 'white';
			w.style.textAlign = 'center';
			w.innerHTML = '<img src="'+dojo.hostenv.getBaseScriptUri()+'default/image/wait.gif"/>'+'<h3>uploading...</h3>';
			document.body.appendChild(w);
			
			var uploading = true;
			var bindArgs = {
				url:"?_FILE_UPLOAD_=FILEUPLOAD",
				//sync:true,				//不支持同步call。
				formNode: form,
				mimetype: "text/html",
				load: function(type, data, evt){
					var fileNames = data.body.innerHTML.split(";");
					fileNames.splice(fileNames.length-1, 1);  //去除最后一个空元素.
					
					/*fileFields = findElementsBy(form, "type", "file");
					for(var i=0; i<fileNames.length; ++i){
						fileFields[i].path = fileNames[i];
					}//*/
					for(var i=0, j=0; i<form.all.length; ++i){
						if(form.all[i].type == 'file'){
							form.all[i].path = fileNames[j++];
						}
					}
					uploading = false;

					document.body.removeChild(w);
					var rs = FormAction._post(form, false);
					if(cb)cb(rs);	//执行回调函数.
				},
				error: function(){
					uploading = false;
					document.body.removeChild(w);
					if(cb)cb();	//执行回调函数.
				}
			};
			
			dojo.io.bind(bindArgs);

			//while(uploading)sleep(100);
			
			//document.body.removeChild(w);
			//return FormAction._post(form, asyn);
		}else{
			return this._post(form, asyn);
		}
	},
	

	syncCall:function(form, cb){
		return this.call(false, form, cb);
	},
	
	_post:function(form, asyn){
		var params = this._getParams(form);
		if(params.length > 0){
			var argus = [];
			for(var i=0; i<params.length; ++i){
				argus[i] = 'params['+i+']';
			}
			return eval("AjaxAction.call(asyn,'" + form.action + "'," + argus + ")");
		}else{
			return eval("AjaxAction.call(asyn,'" + form.action + "')");
		}
	},
	
	_getParams: function(form) {
		var params = [];
		var count = form.bean.split(';').length;
		for(var i=0; i<count; ++i){
			params[i] = new Object();
		}
		
		fChildren = this._findAllFields(form);
		for(var i=0, n=fChildren.length; i<n; ++i){
			var fld = fChildren[i].field;
			var value = this._getValue(fChildren[i]);
			if(value == '')
				value = null;
				
			fs = fld.split(';');
			if(fs.length == 1){
				var f = fs[0].split(':');
				var pi = (f.length==1) ? 0 : (parseInt(f[0])-1);
				if(f[f.length-1] == 'this'){
					params[pi] = value;
				}else if(f[f.length-1].match(/this.\d+/)){
					if(!params[pi] || params[pi].length==undefined)
						params[pi] = [];
					params[pi][f[f.length-1].substring(5)] = value;
				}else{
					params[pi][f[f.length-1]] = value;
				}
			} else {
				for(var j=0; j<fs.length; ++j){
					var f = fs[j].split(':');
					var pi = parseInt(f[0])-1;
					if(f[f.length-1] == 'this'){
						params[pi] = value;
					}else if(f[f.length-1].match(/this.\d+/)){
						if(!params[pi] || params[pi].length==undefined)
							params[pi] = [];
						params[pi][f[f.length-1].substring(5)] = value;
					}else{
						params[pi][f[f.length-1]] = value;
					}
				}
			}
		}
		
		return params;
	},
	
	_getValue:function(obj){
		if(obj.type == "checkbox"){
			return obj.checked?1:0;
		}else if(obj.type == "file"){
			return obj.path;
		}else if(obj.group == "radio"){
			var radios = findElementsBy(obj, "type", "radio");
			for(var i=0; i<radios.length; ++i){
				if(radios[i].checked)
					return radios[i].value;
			}
			return null;
		}else if(obj.group == "checkbox"){
			var box = findElementsBy(obj, "type", "checkbox");
			var vs = [];
			for(var i=0; i<box.length; ++i){
				if(box[i].checked){
					vs.push(box[i].value);
				}
			}
			return vs;
		}else if(obj.tagName == "SELECT"){
			var c = obj.firstChild;
			var vs;
			if(obj.size <= 1){
				while(c != null){
					if(c.selected){
						vs = c.value;
						break;
					}
					c = c.nextSibling;
				}
			}else {
			 vs = [];
				while(c != null){
					if(c.selected){
						vs.push(c.value);
					}
					c = c.nextSibling;
				}
			}
			return vs;
		}else{
			return obj.value;
		}
	},
	
	_findAllFields:function(parent){
		var fields = [];
		var all = parent.all;
		for(var i=0; i<all.length; ++i){
			if(all[i].field)
				fields.push(all[i]);
		}/*
		var child = parent.firstChild;
		while(child != null){
			if(child.field == null){
				var fs = this._findAllFields(child);
				for(var i=0,n=fs.length; i<n; ++i){
					fields.push(fs[i]);
				}
			}else{
				fields.push(child);
			}
			child = child.nextSibling;
		}//*/
		
		return fields;
	}
};


var Component = {
	loadData:function(xmlNode, obj){
		if(obj==null || obj==undefined)
			obj = this.findComponent(xmlNode);
			
		var displayed = xmlNode.selectNodes('./visible');
		if(displayed.length > 0){
			displayed = displayed[0];
			if(displayed.text=='0'){
				obj.style.visibility = 'hidden';
			}else{
				obj.style.visibility = 'inherit';
			}
		}
	},
	
	findComponent:function(xmlNode){
		var name = xmlNode.getAttributeNode('id').nodeValue;
		var comp = $(name);
		this.assertComponent(comp, name);
		return comp;
	},
	
	assertComponent:function(obj, name){
		if(obj==null || obj==undefined){
			alert('can not find component:' + name);
		}
	}
};

var Label = {
	loadData:function(xmlNode, label){
		if(label == null)
			label = Component.findComponent(xmlNode);
			
		Component.loadData(xmlNode, label);
		label.innerText = xmlNode.selectNodes('./text')[0].text;
	}
};

var HtmlText = {
	loadData:function(xmlNode, htmlText){
		if(htmlText == null)
			htmlText = Component.findComponent(xmlNode);
			
		Component.loadData(xmlNode, htmlText);
		htmlText.innerHTML = xmlNode.selectNodes('./c')[0].text;
	}
};

var Link = {
	loadData:function(xmlNode, link){
		if(link == null)
			link = Component.findComponent(xmlNode);
			
		Component.loadData(xmlNode, link);
		link.innerText = xmlNode.selectNodes('./t')[0].text;
		link.href = xmlNode.selectNodes('./h')[0].text;
	}
};

var Image = {
	loadData:function(xmlNode, img){
		if(img == null)
			img = Component.findComponent(xmlNode);
			
		Component.loadData(xmlNode, img);
		img.src = xmlNode.selectNodes('./s')[0].text;
	}
};


var Tree = {
	loadData:function(xmlNode){
		var id = xmlNode.getAttributeNode('id').nodeValue;
		this._createTree($(id), xmlNode.selectNodes('./t')[0].childNodes);
		Component.loadData(xmlNode, $(id));
	},

	_createTree: function(tree, nodes){
		var strHtml = '<ul id="alpha_tree" style="font:bold">';
		for(var i=0, n=nodes.length; i<n; ++i){
			strHtml += this._createNodeHtml(nodes[i]);
		}
		strHtml += '</ul>';
		tree.innerHTML = strHtml;
		
		this.initTree(tree);
		if(!isIE()){
			tree.style.MozUserSelect = 'none';
		}
	},
	
	_createNodeHtml: function(node){
		var str = '<li><span t_t="t" UNSELECTABLE="on" value="'+node.getAttributeNode('v').nodeValue+'">';
		str += node.getAttributeNode('t').nodeValue + '</span>';
		if(node.childNodes.length > 0){
			str += '<ul>';
			for(var i=0,n=node.childNodes.length; i<n; ++i){
				str += this._createNodeHtml(node.childNodes[i]);
			}
			str += '</ul>';
		}
		str += '</li>';
		
		return str;
	},
	
	initTree: function(tree){
		var liChildren = tree.getElementsByTagName("li");
		for(var i=0, n=liChildren.length; i<n; ++i){
			var ulChildren = liChildren[i].getElementsByTagName("ul");

			var node = findElementsBy(liChildren[i], "t_t", "t")[0];
			node.style.cursor = 'pointer';
			node.onclick = function(event){
				var t ;
				if(!event){
					t = window.event.srcElement;
				}else{
					t = event.target;
				}
				var ln = tree.lastClickNode;
				if(ln == t)return;
				if(ln){
					ln.style.background = ln.bgValue;
					ln.style.color = ln.colorValue;
				}
				tree.lastClickNode = t;
				t.bgValue = t.style.background;
				t.colorValue = t.style.color;
				t.style.background = "highlight";
				t.style.color = "white";

				if(tree.getAttribute('onNodeSelected')){
					eval(tree.getAttribute('onNodeSelected')+'(t)');
				}
			};

			if(ulChildren.length > 0){
				node.ondblclick = function(event){
					if(!event){
						Tree.showhide(window.event.srcElement.parentNode);
					}else{
						Tree.showhide(event.target.parentNode);
					}
				};

				var t = document.createElement("span");
				t.className = "alpha_tree_symbols";
				t.style.backgroundImage	="url("+getBaseURI()+"default/image/treenode_expand_plus.gif)";
				t.onclick=function(){Tree.showhide(this.parentNode);};
				liChildren[i].insertBefore(t, liChildren[i].firstChild);
				ulChildren[0].style.display = "none";
			}else{
				var t = document.createElement("span");
				t.className	= "alpha_tree_symbols";
				//t.style.backgroundImage	= "url("+getBaseURI()+"default/image/node.png)";
				node.parentNode.insertBefore(t, node);
			}
		}
	},
	
	showhide: function(el){
		el.getElementsByTagName("ul")[0].style.display=(el.getElementsByTagName("ul")[0].style.display=="block")?"none":"block";

		el.getElementsByTagName("span")[0].style.backgroundImage=(el.getElementsByTagName("ul")[0].style.display=="block")?"url("+getBaseURI()+"default/image/treenode_expand_minus.gif)":"url("+getBaseURI()+"default/image/treenode_expand_plus.gif)";
	}
};

var Table = {
	loadData:function(xmlNode, table){
		if(table == null)
			table = Component.findComponent(xmlNode);
		Component.loadData(xmlNode, table);
		
		var dd = xmlNode.selectSingleNode('./data');
		var data = (dd==null) ? [] : dd.childNodes;
		var rowCount = (dd==null) ? 0 : parseInt(dd.getAttributeNode('rowCount').nodeValue); //总行数，不是当页行数。
		var rows = table.rows;
		var template_row ;
		if(table.template_row){
			if(rows.length == 0){
				table.insertRow();
				rows[0].parentNode.insertBefore(table.template_row, rows[0]);
				table.deleteRow();
			}else{
				rows[0].parentNode.insertBefore(table.template_row, rows[table.template_row.idx]);
			}
		}
		for(var i=0; i<rows.length; ++i){
			var row = rows[i];
			if(row.template != null){
				if(!template_row){
					template_row = row;
					table.template_row = row;
					table.template_row.idx = i;
					//template_row.style.display='none';
				}else{
					row.parentNode.removeChild(row);
					--i;
				}
			}
		}

		var template_index = 0;
		for(; template_index < data.length; ++template_index){
			var new_row = template_row.cloneNode(true);
			//new_row.style.display = 'inline';
			template_row.parentNode.insertBefore(new_row, template_row.nextSibling);
			this._setRowData(new_row, data[template_index].childNodes);
			template_row = new_row;
		}
		table.template_row.parentNode.removeChild(table.template_row);
		
		//设置分页栏
		if(table.pagingBar){
			if(!PagingBar.isRegistered(table.pagingBar)){
				$(table.pagingBar).rowCount = rowCount;
				PagingBar.register(table.pagingBar);
			}else{
				PagingBar.setRowCount(table.pagingBar, rowCount);
			}
		}
	},
	
	_setRowData:function(row, colsXml){
		var col = row.firstChild;
		for(var c=0; c<colsXml.length;){
			if(col.ori != null){
				col = col.nextSibling;
				continue;
			}
			if(colsXml[c].tagName == 's'){
				if(col.valueMapping != null){
					eval("var map="+col.valueMapping);
					var t = map[colsXml[c].text];
					col.innerText = (t==null)?' ':t;
				}else{
					col.innerText = colsXml[c].text=='' ? ' ' : colsXml[c].text;
				}
			}else if(colsXml[c].tagName == 'c'){
				var nodes = colsXml[c].childNodes;
				for(var i=0; i<nodes.length; ++i){
					eval(nodes[i].tagName).loadData(nodes[i], findElementsBy(col, "cid", nodes[i].getAttributeNode('id').nodeValue)[0]);
				}
			}else{
				eval(colsXml[c].tagName).loadData(colsXml[c], col.firstChild);
			}
			++c;
			col = col.nextSibling;
		}
	}
};

var Grid = {
	loadData:function(xmlNode, table){
		Table.loadData(xmlNode, table);
	}
};

var Select = {
	loadData:function(xmlNode, select){
		if(select == null)
			select = Component.findComponent(xmlNode);
		Component.loadData(xmlNode, select);
		
		select.innerHTML = '';
		var optionsXml = xmlNode.selectSingleNode('./options').childNodes;
		for(var i=0; i<optionsXml.length; ++i){
			var o = document.createElement("OPTION");
			o.value = optionsXml[i].getAttributeNode('v').nodeValue;
			o.text = optionsXml[i].text;
			select.add(o);
			if(optionsXml[i].getAttributeNode('s'))
				o.selected = true;
		}
	}
};

var CheckBox = {
	loadData:function(xmlNode, checkbox){
		if(checkbox == null)
			checkbox = Component.findComponent(xmlNode);
		Component.loadData(xmlNode, checkbox);

//*
		var cbData = xmlNode.selectSingleNode('./cb');
		var cb = document.createElement("INPUT");
		cb.type = "CHECKBOX";
		cb.value = cbData.getAttributeNode('v').nodeValue;
		cb.onclick = "parentNode.checked=this.checked;";
		if(cbData.getAttributeNode('c'))
			cb.checked = true;
		else
			cb.checked = false;
		//if(checkbox.cid)
		//	cb.cid = checkbox.cid;
		
		checkbox.value = cb.value;
		checkbox.checked = cb.checked;
		checkbox.innerHTML = cb.outerHTML + cbData.getAttributeNode('t').nodeValue;
		//* */
		/*
		var cbData = xmlNode.selectSingleNode('./cb');
		checkbox.value = cbData.getAttributeNode('v').nodeValue;
		if(cbData.getAttributeNode('c'))
			checkbox.checked = true;
		else
			checkbox.checked = false;
			*/
	}
};

var CheckBoxGroup = {
	loadData:function(xmlNode, group){
		if(group == null)
			group = Component.findComponent(xmlNode);
		Component.loadData(xmlNode, group);
		
		var boxs = findElementsBy(group, "type", "checkbox");
		var vals = xmlNode.selectSingleNode('./values').childNodes;
		for(var i=0; i<boxs.length; ++i){
			var j=0;
			for(; j<vals.length; ++j){
				if(boxs[i].value == vals[i].text){
					boxs[i].checked = true;
					break;
				}
			}
			if(j==vals.length)
				boxs[i].checked = false;
		}
		
		var cbs = xmlNode.selectSingleNode('./checkboxes').childNodes;
		for(var i=0; i<cbs.length; ++i){
			var cb = document.createElement("INPUT");
			cb.type = "CHECKBOX";
			cb.value = cbs[i].getAttributeNode('v').nodeValue;
			if(cbs[i].getAttributeNode('c'))
				cb.checked = true;
			//cb.outerHTML += cbs[i].getAttributeNode('t').nodeValue;
			$(cbs[i].getAttributeNode('id').nodeValue).innerHTML = cb.outerHTML + cbs[i].getAttributeNode('t').nodeValue;
		}
	}
};


function getAttribute(id, attrName){
	return $(id).getAttribute(attrName);
}

//设置html对象属性。
function setAttribute(id, attrName, value){
	$(id).setAttribute(attrName, value);
}

//$A(id, attrName)：获取对象属性。
//$A(id, attrName, value)：设置对象属性值。
function $A(id, attrName, value){
	if(arguments.length == 2)
		return getAttribute(id, attrName);
	else
		setAttribute(id, attrName, value);
}


var Radio = {
	loadData:function(xmlNode, radio){
		if(radio == null)
			radio = Component.findComponent(xmlNode);
		Component.loadData(xmlNode, radio);
		
		var r = document.createElement("INPUT");
		r.type = "RADIO";
		var xn = xmlNode.selectSingleNode('./r');
		
		$A(r, "NAME", xn.getAttributeNode('gid').nodeValue);
		$A(r, "value", xn.getAttributeNode('v').nodeValue);
		if(xn.getAttributeNode('c').nodeValue == '1')
			$A(r, "checked", true);
			
		radio.innerHTML = r.outerHTML + xn.getAttributeNode('t').nodeValue;
		$A(radio, "value", $A(r, "value"));
	}
};

var RadioGroup = {
	loadData:function(xmlNode, group){
		if(group == null)
			group = Component.findComponent(xmlNode);
		Component.loadData(xmlNode, group);
		
		var xn = xmlNode.selectSingleNode('./radios');
		var cbs = xn.childNodes;
		var value = xn.getAttributeNode('v').nodeValue;
		var groupName = xn.getAttributeNode('gid').nodeValue;
		for(var i=0; i<cbs.length; ++i){
			var cb = document.createElement("INPUT");
			cb.type = "RADIO";
			$A(cb, "NAME", groupName);
			cb.value = cbs[i].getAttributeNode('v').nodeValue;
			var c = $$(cbs[i].getAttributeNode('id').nodeValue);
			if(!c)
				c = findElementsBy(group, "cid", cbs[i].getAttributeNode('id').nodeValue)[0];
			c.innerHTML = cb.outerHTML + cbs[i].getAttributeNode('t').nodeValue;
		}
		var radios = findElementsBy(group, "type", "radio");
		for(var i=0; i<radios.length; ++i){
			if(radios[i].value == value){
				radios[i].checked = true;
				break;
			}
		}
	}
};

var Message = {
	loadData:function(xmlNode, messageBox){
		var page = xmlNode.selectSingleNode('./msgpage');
		document.open();
		document.write(page.text);
		document.close();
		$("message").innerHTML = xmlNode.selectSingleNode('./msg').text;
	}
};


var PagingBar = {	
	objs:new Array(),
	
	doAction:function(bar, pageNo, condition){
		if(!PagingBar.isRegistered(bar))
			bar = this.register(bar);
		else
			bar = $(bar);
		if(pageNo != null)
			bar.curPage = pageNo;
		//AjaxAction.syncCall(bar.action, bar.curPage, bar.pageSize);
		var tb = $(bar.table);
		if(condition || (tb && (tb.condition != undefined || tb.orderBy != undefined))){
			if(!condition){
				if(typeof tb.condition == 'string' && tb.condition.length > 0){
					eval('condition='+tb.condition);
				}else if(tb.condition){
					condition = tb.condition;
				}else{
					condition = {};
				}
			}
			if(typeof tb.orderBy == 'string' && tb.orderBy.length>0){
				condition.orderBy = tb.orderBy;
				condition.asc = tb.asc?tb.asc:'';
			}

			AjaxAction.syncCall(bar.action, bar.curPage, bar.pageSize, condition);
		}else{
			AjaxAction.syncCall(bar.action, bar.curPage, bar.pageSize);
		}
	},

	register:function(id){
		var bar = PagingBar.objs[id] = $(id);
		bar.curPage = 1;
		bar.pageSize = parseInt(bar.pageSize);
		if(!bar.rowCount)
			bar.rowCount = 0;
		if(!bar.barStyle)
			bar.barStyle = 1;
		if(!bar.pageSels)
			bar.pageSels = 10;
		bar.pageSels = parseInt(bar.pageSels);
		this._show(id);
		return bar;
	},
	
	isRegistered:function(id){
		return PagingBar.objs[id] != null || ($(id)!=null && PagingBar.objs[$(id).id] != null);
	},

	setRowCount: function(id, count){
		var bar = this.objs[id];
		bar.rowCount = count;
		this._show(id);
	},

	_show:function(id){
		var bar = this.objs[id];
		eval('this._style'+bar.barStyle+'(bar)')
	},
	
	_style0:function(bar){
		var pageCount = bar.rowCount==0?0:Math.round((bar.rowCount-1)/bar.pageSize-0.5)+1;
		
		var rowC = findElementsBy(bar, "nav_attr", "rowCount");
		if(rowC.length>0){
			for(var i=0; i<rowC.length; ++i){
				rowC[i].innerText = bar.rowCount;
			}
		}
		var curP = findElementsBy(bar, "nav_attr", "curPage");
		if(curP.length>0){
			for(var i=0; i<rowC.length; ++i){
				curP[i].innerText = bar.curPage;
			}
		}
		var pC = findElementsBy(bar, "nav_attr", "pageCount");
		if(pC.length>0){
			for(var i=0; i<rowC.length; ++i){
				pC[i].innerText = pageCount;
			}
		}
		
		var fpage = findElementsBy(bar, "nav_attr", "first");
		if(fpage.length>0 && pageCount<=0) //首页失效。
			fpage[0].disabled = true;
		else if(fpage.length>0)
			fpage[0].disabled = false;
			
		var lpage = findElementsBy(bar, "nav_attr", "last");
		if(lpage.length>0 && pageCount<=0) //末页失效。
			lpage[0].disabled = true;
		else if(lpage.length>0)
			lpage[0].disabled = false;
			
		var ppage = findElementsBy(bar, "nav_attr", "pre");
		if(ppage.length>0 && (pageCount<=0 || bar.curPage<2)) //上一页失效。
			ppage[0].disabled = true;
		else if(ppage.length>0)
			ppage[0].disabled = false;
			
		var npage = findElementsBy(bar, "nav_attr", "next");
		if(npage.length>0 && bar.curPage>=pageCount) //下一页失效。
			npage[0].disabled = true;
		else if(npage.length>0)
			npage[0].disabled = false;
		
		var dpage = findElementsBy(bar, "nav_attr", "designated");
		if(dpage.length>0 && pageCount<=0) //指定页失效。
			dpage[0].disabled = true;
		else if(dpage.length>0)
			dpage[0].disabled = false;
			
		var number = findElementsBy(bar, "nav_attr", "number");
		var c_n = findElementsBy(bar, "nav_attr", "number_c");
		c_n = (c_n.length>0) ? c_n[0] : null;
		if(number.length > 0){
			bar.number_templ = number[0];
			for(var i=(c_n)? 0 : 1; i<number.length; ++i)
				number[i].parentNode.removeChild(number[i]);
		}
		if(c_n){
			c_n.innerText = bar.curPage;
		}
		if(bar.number_templ){
			var s = bar.curPage - 2;
			if(s < 1 || pageCount <= bar.pageSels)s=1;
			else if(s + bar.pageSels > pageCount)s = pageCount - bar.pageSels + 1;
			var e = s + bar.pageSels - 1;
			if(e > pageCount)e = pageCount;
			
			var endp = (c_n) ? c_n.nextSibling : bar.number_templ.nextSibling;
			for(var i=s; i<=e; ++i){
				var cl = bar.number_templ.cloneNode(true);
				cl.innerText = i;
				if(c_n){
					if(i < bar.curPage)
						c_n.parentNode.insertBefore(cl, c_n);
					else if(i > bar.curPage)
						endp.parentNode.insertBefore(cl, endp);
				}else{
					endp.parentNode.insertBefore(cl, endp);
				}
			}
			if(!c_n){
				if(s > e)
					bar.number_templ.innerText = s;
				else
					bar.number_templ.parentNode.removeChild(bar.number_templ);
			}
		}
	
		dojo.event.connect(bar, 'onclick', function(event) {
			stopEvent(event);
			var nav_attr = event.srcElement.nav_attr;
			if(!bar.action || bar.rowCount==0 || !nav_attr || event.srcElement.disabled
				|| bar.lastEvent == event)
				return;
			bar.lastEvent = event;
			
			var pageCount = bar.rowCount==0?0:Math.round((bar.rowCount-1)/bar.pageSize-0.5)+1;
			var act = event.srcElement.innerText;
			if(nav_attr == "number"){   
				var p = parseInt(act);
				if(isNaN(p) || p<1 || p>pageCount){
					return;
				}else{
					bar.curPage = p;
				}
			}else if(nav_attr == "first"){
				bar.curPage = 1;
			}else if(nav_attr == "pre"){
				--bar.curPage;
			}else if(nav_attr == "next"){
				++bar.curPage;
			}else if(nav_attr == "last"){
				bar.curPage = pageCount;
			}else if(nav_attr == "designated"){   
				var p = parseInt($(event.srcElement.iid).value);
				if(isNaN(p) || p<1 || p>pageCount){
					alert('Can not find page!');
					return;
				}else{
					bar.curPage = p;
				}
			}else{
				return;
			}
	
			PagingBar.doAction(bar);
			//翻页请求处理完毕。
			if(event.srcElement.onfinished)
				eval(event.srcElement.onfinished+'()');
		});
	},

	_style1:function(bar){
		bar.innerHTML = '';
		var pageCount = bar.rowCount==0?0:Math.round((bar.rowCount-1)/bar.pageSize-0.5)+1;

		var fbn = document.createElement('<button>');
		fbn.innerText = 'Index';
		if(pageCount<=0)  //注意页号从1开始。
			fbn.disabled = true;
		bar.appendChild(fbn);

		var lp = document.createElement('<button>');
		lp.innerText = 'Previous';
		if(pageCount<=0 || bar.curPage<2)  //注意页号从1开始。
			lp.disabled = true;
		bar.appendChild(lp);

		var np = document.createElement('<button>');
		np.innerText = 'Next';		
		if(bar.curPage>=pageCount)  //注意页号从1开始。
			np.disabled = true;
		bar.appendChild(np);

		var lbn = document.createElement('<button>');
		lbn.innerText = 'Last';
		if(pageCount<=0)  //注意页号从1开始。
			lbn.disabled = true;
		bar.appendChild(lbn);

		var selP = document.createElement('<button>');
		selP.innerText = 'Go Page:';
		if(pageCount<=0)
			selP.disabled = true;
		bar.appendChild(selP);

		var tp = document.createElement('<input>');
		if(pageCount<=0){
			tp.disabled = true;
		}else{
			tp.value = bar.curPage;
		}
		tp.width = 30;
		bar.appendChild(tp);

		var msg = document.createElement('<text>');
		msg.innerText = '('+(pageCount<=0?0:bar.curPage)+'/'+(pageCount)+') Total：'+bar.rowCount;
		bar.appendChild(msg);

		//include('dojo.event.*');
		dojo.event.connect(bar, 'onclick', function(event) {
			stopEvent(event);
			if(!bar.action || bar.rowCount==0 || event.srcElement.disabled || bar.lastEvent == event)return;
			bar.lastEvent = event;
			
			var pageCount = bar.rowCount==0?0:Math.round((bar.rowCount-1)/bar.pageSize-0.5)+1;
			var act = event.srcElement.innerText;
			if(act == 'Index'){
				bar.curPage = 1;
			}else if(act == 'Previous'){
				--bar.curPage;
			}else if(act == 'Next'){
				++bar.curPage;
			}else if(act == 'Last'){
				bar.curPage = pageCount;
			}else if(act == 'Go Page:'){   
				var p = parseInt(event.srcElement.nextSibling.value);
				if(p<1 || p>pageCount){
					alert('Can not find page');
					return;
				}else{
					bar.curPage = p;
				}
			}else{
				return;
			}
			
			PagingBar.doAction(bar);
		});	
	}
};

function getParamValueOfURL(param) {	
	//var hrefstr,pos,parastr,para,tempstr;	
	//hrefstr = window.location.href;	
	//pos = hrefstr.indexOf("?")	
	//parastr = hrefstr.substring(pos+1);
	var para,parastr;
	parastr = window.location.search;
	parastr = parastr.slice(1);
	para = parastr.split("&");	
	tempstr="";	
	for(i=0;i<para.length;i++)	{  
		tempstr = para[i];  
		pos = tempstr.indexOf("=");  
		if(tempstr.substring(0,pos) == param) {  	
			return tempstr.substring(pos+1);  
		}	
	}	
	return null;
}



var al_action_call_id = 0;
function escapeJSONString(s)
{
    /* The following should suffice but Safari's regex is b0rken
       (doesn't support callback substitutions)
       return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g,
       escapeJSONChar) + "\"";
    */

    /* Rather inefficient way to do it */
    var parts = s.split("");
    for(var i=0; i < parts.length; i++) {
	var c =parts[i];
	if(c == '"' ||
	   c == '\\' ||
	   c.charCodeAt(0) < 32 ||
	   c.charCodeAt(0) >= 128)
	    parts[i] = escapeJSONChar(parts[i]);
    }
    return "\"" + parts.join("") + "\"";
};
function escapeJSONChar(c)
{
    if(c == "\"" || c == "\\") return "\\" + c;
    else if (c == "\b") return "\\b";
    else if (c == "\f") return "\\f";
    else if (c == "\n") return "\\n";
    else if (c == "\r") return "\\r";
    else if (c == "\t") return "\\t";
    var hex = c.charCodeAt(0).toString(16);
    if(hex.length == 1) return "\\u000" + hex;
    else if(hex.length == 2) return "\\u00" + hex;
    else if(hex.length == 3) return "\\u0" + hex;
    else return "\\u" + hex;
};
function toJSON(o)
{
    if(o == null) {
	return "null";
    } else if(o.constructor == String) {
	return escapeJSONString(o);
    } else if(o.constructor == Number) {
	return o.toString();
    } else if(o.constructor == Boolean) {
	return o.toString();
    } else if(o.constructor == Date) {
	return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}';
    } else if(o.constructor == Array) {
	var v = [];
	for(var i = 0; i < o.length; i++) v.push(toJSON(o[i]));
	return "[" + v.join(", ") + "]";
    } else {
	var v = [];
	for(attr in o) {
	    if(o[attr] == null) v.push("\"" + attr + "\": null");
	    else if(typeof o[attr] == "function"); /* skip */
	    else v.push(escapeJSONString(attr) + ": " + toJSON(o[attr]));
	}
	return "{" + v.join(", ") + "}";
    }
};

