/*
******************************************************************
** 名: init and bind  属于JFC － Jax Foundation Class
** 创建：welsham 2007-10-18  修改: welsham 2007-10-18
** 描述: parser之初始化和绑定模块，绑定数据和界面控件，如列表数据绑定
** 修改描述: 
******************************************************************
*/

//**************初始化parser对象和init/bind对象*************************
if(typeof parser != "object") { var parser={}; }
if(typeof parser.init != "object") { parser.init={}; }
if(typeof parser.bind != "object") { parser.bind={}; }

/****************************************************************** 
** 名: time  属于JFC － Jax Foundation Class
** 创建：welsham 2006-7-8  修改: welsham 2006-7-8
** 描述: parser.init的时间初始化函数
** 修改描述: 
******************************************************************/
//**************初始化时间列表框***********************************
parser.init.initTime=function(o,start,end,_default)
{
	var items='',sOption,i;
	removeAllOption(o);
	for(i=start;i<=end;i++) 
	{	
		o.options[o.length]=new Option(i,i);
		if(_default && _default==i) o.options[o.length-1].selected=true;
	}
};
parser.init.getDays=function(year,month)
{
	var days=31;year=parseInt(year);month=parseInt(month);
	switch(month)
	{
		case 4:case 6:case 9:case 11: {days=30;break;}
		case 2:
		{
			if( (year%4==0 && year%100!=0) || year%400==0 ) days=29;
			else days=28;
			break;
		}
	}
	return days;
};

//**************绑定日和月****************************************
parser.init.bindTime=function(oYear,oMonth,oDay)
{
	var year=oYear.options[oYear.selectedIndex].value;
	var month=oMonth.options[oMonth.selectedIndex].value;
	var day=oDay.options[oDay.selectedIndex].value;
	var days=parser.init.getDays(year,month);
  		
	parser.init.initTime(oDay,1,days,day);
};
//**************获取时间段***************************************
parser.init.getTimePart=function(_time,_part)
{
	var times,e,p;
	switch(_part)
	{
		case "date":case "y":case "m":case "d":
		{
			e= "([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})[0-9 :]*";
			p=new RegExp(e);
			times=_time.match(p);
			if( times==null ) return "";
		}
		case "date":
		{
			return times[1]+"-"+times[2]+"-"+times[3];		
		}
		case "y":
		{
			if(times.length>=1) return times[1];
			else return "";
		}
		case "m":
		{
			if(times.length>=2) return times[2];
			else return "";
		}
		case "d":
		{
			if(times.length>=3) return times[3];
			else return "";
		}
		case "time":case "h":case "mm":case "s":
		{
			e= "[0-9 -]*([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})";
			p=new RegExp(e);
			times=_time.match(p);
			if( times==null ) return "";
		}
		case "time":
		{
			return times[1]+":"+times[2]+":"+times[3];		
		}		
		case "h":
		{
			if(times.length>=1) return times[1];
			else return "";
		}
		case "mm":
		{
			if(times.length>=2) return times[2];
			else return "";
		}
		case "s":
		{
			if(times.length>=3) return times[3];
			else return "";
		}		
	}
};

/****************************************************************** 
** 名: list  属于JFC － Jax Foundation Class
** 创建：welsham 2006-7-8  修改: welsham 2006-7-8
** 描述: parser.init的列表初始化函数
** 修改描述: 
******************************************************************/
//**************列表初始化****************************************
//参数：DD-数据字典,如place；_key-选中键，不空将填充该键下级键；isStrict-有(false)无(true)“不限”或“所有”项；
//_default-默认键值; list节点对象，可多级
//情形：默认值；DD和_key与节点对应，可选取DD不同层级往下递推；DD子项不完全时，以父项填充；
//设定不同参数，实现list多级之间关联
parser.init.initList=function(DD,_key,isStrict,_default)
{
	var i,j,key,flag,o,pKey=null,childNodes,sOption,defaults=[];
	//默认值的父树计算
	if(_default && DD[_default])
	{
		defaults[0]=_default;
		key=_default;
		while(DD[key].parent&&DD[key].parent!="0"&&DD[key].parent!=_key)
		{
			key=DD[key].parent;defaults[defaults.length]=key;
		}
		defaults.reverse();
	}
	else _default=false;
	//遍历节点，填充数据
	for(i=4;i<arguments.length;i++)
	{
		o=arguments[i];
		removeAllOption(o);
		//遍历数组，寻找子节点填充
		if(i==4) pKey=_key;
		childNodes=parser.JSON.childNodes(DD,pKey);
		//没有子项，用父项值填充
		if(childNodes.length==0)
		{
			o.options[o.length]=new Option(DD[pKey].value,pKey);
			continue;
		}
		//不限填充
		if(childNodes.length>0 && !isStrict)
		{
			flag=false;
			for(j in childNodes)
			{
				if( childNodes[j]=="0" || childNodes[j]=="0"+pKey ) {flag=true;continue;}
			}
			if(!flag)
			{
				o.options[o.length]=new Option(DD[pKey].value,pKey);		
			}
		}
		//循环，填充
		flag=true;
		for(j in childNodes)
		{
			if(isStrict && (childNodes[j]=="0" || childNodes[j]=="0"+pKey) ) continue;
			o.options[o.length]=new Option(DD[childNodes[j]].value,childNodes[j]);	
			if(flag) {pKey=childNodes[j];flag=false;}
			if(_default && i-4<defaults.length && childNodes[j]==defaults[i-4])
			{ o.options[o.length-1].selected=true;pKey=childNodes[j]; }
		}
	}
};

//**************移动列表数据*************************************
//参数：_max-最多可移动个数,0不限; list节点对象，索引1为移动到的目标对象，索引2开始为源对象，多级（低到高）
parser.init.moveList=function(_max)
{
	var i,toO=arguments[1],fromO=arguments[2],toValue,toText="";
	if(fromO.length<=0) return false; //源对象是否有效
	if(fromO.selectedIndex<0) fromO.options[0].selected=true;
	if(_max>0 && toO.length>=_max) {alert("您只能最多选择" + _max + "个!");return false;} //不超过最大可移动数
	//目标对象重复判断
	toValue=fromO.options[fromO.selectedIndex].value;
	for(i=0;i<toO.length;i++)
	{
		if(toValue==toO.options[i].value) return false;
	}
	//获取父树,生成目标文本
	for(i=arguments.length-1;i>2;i--)
	{ 
		if(toText) toText += ">>" + arguments[i].options[arguments[i].selectedIndex].text;
		else toText = arguments[i].options[arguments[i].selectedIndex].text;
	}
	if(toText) toText += ">>" + fromO.options[fromO.selectedIndex].text;
	else toText = fromO.options[fromO.selectedIndex].text;
	toO.options[toO.length]=new Option(toText,toValue);	
	fromO.remove(fromO.selectedIndex);
	fromO.reset;
};

//**************删除列表数据*************************************
//参数：list节点对象，索引0为源对象
parser.init.removeList=function()
{
	var fromO=arguments[0];
	if(fromO.length<=0) return false;
	if(fromO.selectedIndex==-1) fromO.options[0].selected=true;
	fromO.remove(fromO.selectedIndex);
	fromO.reset;
	return true;
};

//**************初始化列表时进行左右数据对比***********************
//list节点对象，索引0为源对象，索引1为目标对象
parser.init.compareList=function()
{
	var i,j,fromO=arguments[0],toO=arguments[1],toValue;
	if(toO.length<=0) return;
	for(i=0;i<toO.length;i++)
	{
		var toValue=toO.options[i].value;
		for(j=0;j<fromO.length;j++)
		{
			if(fromO.options[j].value==toValue)
			{
				fromO.remove(j);fromO.reset;
			}
		}
	}
};

//**************全选列表****************************************
parser.init.selectAll=function()
{
	var i,o=arguments[0];
	for(i=0;i<o.length;i++)
	{
		o.options[i].selected=true;
	}
};

//**************查询****************************************
//(用initList初始化的列表框)oList = [{name:'UtorState',DD:_UtorState, dv:'00'}, {name:'UtorLevel',DD:_UtorLevel}]
//moreSearch，更多选项相关参数：moreSearch = ['moreSearchBtn', 'moreSearch', 'switchDown1', 'switchUp1']－－这也是默认值
parser.init.initQuery = function (searchFormID, query, order, oList, moreSearch)
{
	var i, j, defaultOrder, oSearchForm, oElements, querys;	
	if (!moreSearch) moreSearch = ['moreSearchBtn', 'moreSearch', 'switchDown1', 'switchUp1'];
	var isOpen = false;
	//添加事件
	oSearchForm = $(searchFormID);
	if (!oSearchForm) return;
	oElements = oSearchForm.elements;	
	for(i=0;i<oElements.length;i++)
	{
		if (oElements[i].getAttribute('dv'))
		{
			parser.init.addQueryEvents(oElements[i]);
		}
	}
	//初始化
	querys=query.split("&");
	for(i in querys)
	{
		querys[i]=querys[i].split("=");
		if( querys[i][1]!="" && $(querys[i][0]) && $(querys[i][0]).nodeName.toLowerCase()=="input" )
		{
			switch( $(querys[i][0]).type.toLowerCase() )
			{
				case "text":
				case "hidden":{ $(querys[i][0]).value=querys[i][1];break; }
			}
		}
	}
	
	for(i in oList)
	{
		oList[i].value = getQuery(oList[i].name, query);		
		if (!oList[i].dv) oList[i].dv = '';
		
		parser.init.initList(oList[i].DD, "", false, oList[i].dv, $(oList[i].name));
		
		oList[i].dv = $$(oList[i].name); //获取默认值从
		
		if (oList[i].value.length>0)
		{			
			parser.bind.bindList($(oList[i].name), oList[i].value);
		}
	}
	
	if ($("order"))
	{
		defaultOrder = $$("order");
		parser.bind.bindList($("order"), order);
	}	
	
	//切换更多查询框
	if (!$(moreSearch[1])) return;
	
	oElements = $(moreSearch[1]).getElementsByTagName('input');
	for(i=0;i<oElements.length;i++)
	{
		if ( oElements[i].type.toLowerCase() == "text" && oElements[i].value.length > 0 && oElements[i].value != oElements[i].getAttribute('dv') )
		{
			isOpen = true;
			break;
		}
	}
	if (!isOpen)
	{
		oElements = $(moreSearch[1]).getElementsByTagName('select');
		for (j in oElements)
		{
			for(i in oList)
			{
				if($(oList[i].name) == oElements[j])
				{
					if (oList[i].value.length>0 && oList[i].value != oList[i].dv)
					{
						isOpen = true;
						break;
					}
				}
			}
			
			if (oElements[j].name == 'order' && order.length>0 && order !=defaultOrder)  isOpen = true;
		}			
	}	
	
	if (isOpen) parser.widget.doSwitch($(moreSearch[0]), moreSearch[1], moreSearch[2], moreSearch[3]);
};
parser.init.checkQuery = function(searchFormID, checkNumber, checkDate)
{
	var i, oSearchForm, oElements, id, checkNumber2 = [], checkDate2 = [];
	
	if(checkNumber)
	{
		checkNumber2[0] = checkNumber[0].split(",");
		checkNumber2[1] = checkNumber[1].split(",");
		for(i=0;i<checkNumber2[0].length;i++)
		{
			id = checkNumber2[0][i];
			if (!$(id).getAttribute('dv') || $(id).value != $(id).getAttribute('dv'))
			{
				if(!parser.check.isNumbers(checkNumber2[0][i], checkNumber2[1][i]) ) return false;
			}
		}
	}
	if(checkDate)
	{
		checkDate2[0] = checkDate[0].split(",");
		checkDate2[1] = checkDate[1].split(",");
		for(i=0;i<checkDate2[0].length;i++)
		{
			id = checkDate2[0][i];
			if (!$(id).getAttribute('dv') || $(id).value != $(id).getAttribute('dv'))
			{
				if(!parser.check.isDates(checkDate2[0][i], checkDate2[1][i]) ) return false;
			}
		}		
	}

	oSearchForm = $(searchFormID);
	oElements=oSearchForm.elements;
	for(var i=0;i<oElements.length;i++)
	{
		if (oElements[i].getAttribute('dv') && oElements[i].value == oElements[i].getAttribute('dv'))
		{
			oElements[i].value = "";
		}
	}
	
	return true;
};
parser.init.addQueryEvents = function(el)
{
	addEventListener(el, 'focus', function(e){ parser.init.onKeyword(el) }, false);
	addEventListener(el, 'blur', function(e){ parser.init.outKeyword(el) }, false);
};
parser.init.onKeyword = function(_o)
{
	if(_o.value==_o.getAttribute('dv')) _o.value="";
	else _o.select();
};
parser.init.outKeyword = function (_o)
{
	if(_o.value=="") _o.value=_o.getAttribute('dv');
};



//**************bind Start*************************

//**************列表绑定******************************************
parser.bind.bindList=function(o,_value)
{
	var i;
	for(i=0;i<o.length;i++)
	{
		if(o.options[i].value==_value) o.options[i].selected=true;
	}
};

//**************单选和多选框绑定************************************
//参数：_oName-对象的name；_value-值如"1, 2",用“, ”分隔多值
parser.bind.bindBox=function(_oName,_value,_disableOther)
{
	var i, boxs;
	boxs = document.getElementsByName(_oName);
	if ( _value.indexOf(", ") == -1 && _value.indexOf(",") >=0 ) _value = _value.replace(new RegExp(",", "g"), ", ");	
	_value = " " + _value + ",";	
	for(i=0;i<boxs.length;i++)
	{
		if ( _value.indexOf(" "+boxs[i].value+",") != -1 ) boxs[i].checked = true;
		else
		{
			boxs[i].checked = false;
			if(_disableOther) boxs[i].disabled = true;
		}
	}
};

//**************列表数据填充绑定************************************
//参数：DD-数据字典；_key-填充键如"1, 2",用“, ”分隔多值;list节点对象,索引2源对象，索引3为对应对象
parser.bind.fillList=function(DD,_key)
{
	if(_key.length==0) return false;
	var i,j,toO=arguments[2],aboutO=arguments[3];
	var keys=_key.split(","),key,text;	
	for(i in keys)
	{
		key=trim(keys[i]);
		if(DD=="")
		{
			for(j=0;j<aboutO.options.length;j++)
			{
				if(aboutO.options[j].value==key) text=	aboutO.options[j].text;
			}
		}
		else
		{
			_key=key;
			if(!DD[_key]) continue;
			text=DD[_key].value;
			while(DD[_key].parent&&DD[_key].parent!="0")
			{
				_key=DD[_key].parent; text = DD[_key].value+">>"+text;
			}
		}
		toO.options[toO.length]=new Option(text,key);
	}
	parser.init.compareList(aboutO,toO);
};
//**************获取DD的名称************************************
parser.bind.bindInnerHTML=function(_id,DD,_key)
{
	if(_key.length==0) return false;
	var i,keys=_key.split(","),key,text,fullText="";
	for(i in keys)
	{
		key=trim(keys[i]);
		_key=key; text = DD[_key].value;
		while(DD[_key].parent&&DD[_key].parent!="0")
		{
			_key=DD[_key].parent; text = DD[_key].value+">>"+text;
		}
		fullText += text+"<br>"
	}
	$(_id).innerHTML=fullText;
};
//**************检测值是否包含在字符串中**************************
//_val：如"1, 2"，检测__val是否在_val中；_view：显示与否
parser.bind.checkValue=function(_val,__val,_view)
{
	_val = " "+_val+",";
	__val= " "+__val+",";
	if(_val.indexOf(__val)>=0)
	{	if(_view) document.write("√"); return true;	}
	else
	{	if(_view) document.write("×"); return false;	}
};

//**************发布时的字段绑定**************************
parser.bind.bindCommon=function(_bindList,_noCovHtmlID)
{
	var id,i;
	var datas = $c( $("__data") );
	for(i=0;i<datas.length;i++)
	{
		id = datas[i].id;
		id = id.substring(2,id.length);
		if(!$(id)) continue;
		switch($(id).nodeName.toLowerCase())
		{
			case "input":
			{
				switch($(id).type.toLowerCase())
				{
					case "text":
					case "hidden":{ $(id).value=$$("__"+id);break;}
					case "radio":
					case "checkbox":{ parser.bind.bindBox(id,$$("__"+id));break; }
				}
				break;
			}
			case "textarea":
			{
				if(_noCovHtmlID && _noCovHtmlID.indexOf(id) != -1 )
				{
					$(id).value=$$("__"+id);
				}
				else
					$(id).value=unCovHtml($$("__"+id));
				break;
			}
			case "select":{if(_bindList) parser.bind.bindList($(id),$$("__"+id));break;}
			case "span":{ $(id).innerHTML=$$("__"+id);break; }
			case "div":{ $(id).innerHTML=$$("__"+id);break; }
		}	
	}
};