/* 
 * JSUCIC v2.0 - Copyright (c) 2006-2007 George Huang
 *                            2007- UCICSoft.com
 * This copyright notice MUST stay intact for use (see LICENSE.TXT).
 * For full source code and docs, visit http://www.ucicsoft.com/
 * 
 * @author George Huang
*/

var _isFF=false;var _isIE=false;var _isOpera=false;var _isKHTML=false;var _isMacOS=false;

if(navigator.userAgent.indexOf('Macintosh')!= -1)_isMacOS=true;
if((navigator.userAgent.indexOf('Safari')!= -1)||(navigator.userAgent.indexOf('Konqueror')!= -1))
 _isKHTML=true;
else if(navigator.userAgent.indexOf('Opera')!= -1){
 _isOpera=true;
 _OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6,3));
}
else if(navigator.appName.indexOf("Microsoft")!=-1)
 _isIE=true;
else{
 _isFF=true;
 var _FFrv=parseFloat(navigator.userAgent.split("rv:")[1])
}

var imageFolder = "images/";	// Path to images
var plusImage = 'ucic_plus.gif';
var minusImage = 'ucic_minus.gif';

function ValueModel(model,field){
	this._listeners=new Array();
	this.model=model;
	this._listModel=false;
	this.field=field;
	this._parent=false;
	this.getValue=function(){
		var index = this.field.indexOf('.');
	    if (index > 0 && !this.model[this.field]) {
	      var fields = this.field.split('.');
	      var data = this.model[fields[0]];
	      for (var i=1; i<fields.length-1; i++) {
			if(data)  data = data[fields[i]];
			else break;
	      }
	      return data;
	    }
		if(itemsIndex(this.model._functions,field)>0){
			var _v=this.model[field]();return _v;
		}
		return this.model[field];
	}
	this.setValue=function(value,_t){
		if(itemsIndex(this.model._functions,field)<1){
			this.model[field]=value;
			if(this.model._functions){
				for(var f in this.model._functions){
					this._parent[this.model._functions[f]].firedChangedEvent();
				}
			}
		} else return;
		if(this._parent.status=='none'){
			this._parent.status='edit';
		}
		this.firedChangedEvent(_t);
		if(this._listModel && this._listModel.getSelected()){
			this._listModel.getSelected().setValue(this.field,value);
		}
		this._parent.validate();
	}
	this.contains=function(obj){
		for(var i in this._listeners){
			if(this._listeners[i]==obj) return true;
		}
		return false;
	}
	this.addChangedListener=function(widget){
		if(!this.contains(widget))
			this._listeners=this._listeners.concat(widget);
	}
	this.firedChangedEvent=function(_t){
		for(var i in this._listeners){
			if(_t==this._listeners[i]) continue;
			if(this._listeners[i].setWidgetProp){
				this._listeners[i].setWidgetProp(this.getValue());continue;
			}
			if(!this.getValue()&&this.getValue()!=false){
				this._listeners[i].setWidgetValue('');
			}else{
				this._listeners[i].setWidgetValue(this.getValue());
			}
		}
	}
	this.setWidgetValue=false;
}


PresentationModel = function(bean,validator){
	this._type='PresentationModel';
	this.bean=bean;
	this._listModel=false;
	this._validator=validator;
	this._warn=false;
	this._error=false;
	this._info=false;
	this.status='none';//none/edit/add/deleted
	if(bean){
		for(var i in this.bean._beanMeta){
			this[this.bean._beanMeta[i][0]]=new ValueModel(this.bean,this.bean._beanMeta[i][0]);
			this[this.bean._beanMeta[i][0]]._parent=this;
		}
	}
	this.setListModel=function(listModel){
		this._listModel=listModel;
		for(var i in this.bean._beanMeta){
			this[this.bean._beanMeta[i][0]]._listModel=listModel;
		}
		this._listModel.addSelectedListener(this);
	}
	this.getBean=function(){
		return this.bean;
	}
	this.setBean=function(bean){
		var oldMeta=this.bean._beanMeta;
		var oldConstruct=this.bean._construct;
		this.bean=bean;
		if(!this.bean._beanMeta) this.bean._beanMeta=oldMeta;
		if(!this.bean._construct) this.bean._construct=oldConstruct;
		for(var i in this.bean._beanMeta){
			this[this.bean._beanMeta[i][0]].model=this.bean;
			this[this.bean._beanMeta[i][0]].setValue(this.bean[this.bean._beanMeta[i][0]]);
		}
	}
	this.getValue=function(field){
		var index = field.indexOf('.');
	    if (index > 0 && !this.bean[field]) {
	      var fields = field.split('.');
	      var data = this.bean[fields[0]];
	      for (var i=1; i<fields.length-1; i++) {
	        if(data)  data = data[fields[i]];
			else break;
	      }
	      return data;
	    }
		if(itemsIndex(this.bean._functions,field)>0){
			var _v=this.bean[field]();return _v;
		}
		return this.bean[field];
	}
	this.setValue=function(field,value){
		if(itemsIndex(this.bean._functions,field)>0) return;
		if(!this[field]){alert("当前字段:"+field+"不存在，这是一个BUG，请将当前的界面名和出现的字名报告给管理员。");return;}
		try{
			this[field].setValue(value);
		}catch(e){
			alert("给字段:"+field+"赋值发生错误，这是一个BUG，请将当前的界面名和出现的字名报告给管理员。");
		}
	}
	this.getValueModel=function(field){
		var index = field.indexOf('.');
	    if (index > 0 && !this[field]) {
	      var fields = field.split('.');
	      var data = this.bean[fields[0]];
	      for (var i=1; i<fields.length-1; i++) {
	        data = data[fields[i]];
	      }
	      var model = new PresentationModel(data);
	      this[field] = model.getValueModel(fields[fields.length-1]);
	    }

	    return this[field];

	}
	this.setValidator=function(_validator){
		this._validator=_validator;
	}
	this.getErrorMsg=function(){
		if(!this._error) return null;
		var r='';
		for(var i in this._error){
			r=r+'['+this._error[i].msg+']\n';
		}
		return r;
	}
	this.validate=function(){
		//todo...clear tips...
		this._error=false;
		this._warn=false;
		this._info=false;
		var _tips=document.getElementsByName(this.bean._beanName);
		if(_tips.length>0){
			var _l=_tips.length;
			for(var v=0;v<_l;v++){
				_tips[0].parentNode.removeChild(_tips[0]); 
			}
		}
		if(this._validator) var _msgResult=this._validator.validate(this.bean);
		if(_msgResult){
			for(var i in _msgResult){
				if(!this.getValueModel(_msgResult[i].key)) continue;
				var _vlstnr=this.getValueModel(_msgResult[i].key)._listeners;//is field
				if(_vlstnr){
					for(var j=0;j<_vlstnr.length;j++){
						if(!_msgResult[i].severity||_msgResult[i].severity=='ERROR'){
							if(!this._error){
								this._error=new Array();
							}
							this._error[this._error.length]=_msgResult[i];
						} 
						if(_msgResult[i].severity&&_msgResult[i].severity=='WARN') this._warn=true;
						if(_msgResult[i].severity&&_msgResult[i].severity=='INFO') this._info=true;
						appendTip(_vlstnr[j],this.bean._beanName,_msgResult[i].msg,_msgResult[i].severity);
					}
				}
			}
		}
	}
}

ValidatedMsg=function(_key,_msg,_severity){
	this.key=_key;
	this.msg=_msg;
	this.severity=_severity;
}

function getCoords (element) {
	var coords = { x: 0, y: 0, width: element.offsetWidth, height:
	element.offsetHeight };
	while (element) {
		coords.x += element.offsetLeft;
		coords.y += element.offsetTop;
		element = element.offsetParent;
	}
	return coords;
}

appendTip=function(obj,key,msg,severity){
	var tip=document.createElement('IMG');
	tip.style.position='absolute';
	tip.name=tip.id=key;
	var rect=getCoords(obj);
	if(!rect||!rect.x) return;
	if(obj.options && _isIE){
		tip.style.top=(rect.y-12)+'px';
		tip.style.left=(rect.x-12)+'px';
	}else{
		tip.style.top=(rect.y-5)+'px';
		tip.style.left=(rect.x-5)+'px';
	}
	var icon='error.gif';
	if(!severity||severity=='ERROR')
		icon='error.gif';
	else if(severity=='WARN')
		icon='warn.gif';
	else if(severity=='INFO')
		icon='info.gif';
	else if(severity=='HELP')
		icon='help.gif';
	tip.src=imageFolder+icon;
	tip.style.border='';
	tip.style.zIndex=100;
	tip.msg=msg;
	tip.onmouseover=showToolTip;
	tip.onmouseout=hideToolTip;
	obj.parentNode.appendChild(tip);
}

containsError=function(models){
	if(models){
		for(var i in models){
			if(models[i]._error) return true;
		}
		return false;
	}else{
		return false;
	}
}
containsWarn=function(models){
	if(models){
		for(var i in models){
			if(models[i]._warn) return true;
		}
		return false;
	}else{
		return false;
	}
}
containsInfo=function(models){
	if(models){
		for(var i in models){
			if(models[i]._info) return true;
		}
		return false;
	}else{
		return false;
	}
}

ListModel=function(list){
	this._type='ListModel';
	this._listeners=new Array();
	this.s_listeners=new Array();
	this._list=false;
	if(list) this._list=list;
	else this._list=new Array();
	this.index=-1;
	this.addModel=function(model){
		this._list[this._list.length]=model;
		//fireAddEvent here.
		for(var i in this._listeners){
			this._listeners[i].setTableModel(this);
		}
	}
	this.removeIndex=function(_index){
		if(this._list){
			removeItems(this.s_listeners,this._list[_index]);
			removeItems(this._list,this._list[_index]);
			//fireDeleteEvent here
			for(var i in this._listeners){
				this._listeners[i].setTableModel(this);
			}
			this.index=-1;
		}
	}
	this.removeItem=function(_object){
		if(this._list){
			removeItems(this._list,_object);
			//fireDeleteEvent here
			for(var i in this._listeners){
				this._listeners[i].setTableModel(this);
			}
			this.index=-1;
		}
	}
	this.setList=function(list){
		this._list=list;
		this.index=-1;
		//fireModelChangedEvent here;resetTableData
		for(var i in this._listeners){
			this._listeners[i].setTableModel(this);
		}
	}
	this.addModelEventListener=function(listener){
		if(this._listeners)
		removeItems(this._listeners,listener);
		this._listeners[this._listeners.length]=listener;
	}
	this.addSelectedListener=function(listener){
		if(this.s_listeners)
		removeItems(this.s_listeners,listener);
		this.s_listeners[this.s_listeners.length]=listener;
	}
	this.setIndex=function(_index){
		this.index=_index;
		//fireItemSelectedEvent here
		for(var i in this.s_listeners){
			this.s_listeners[i].setSelectedIndex(this.index);
		}
	}
	this.getIndex=function(){
		return this.index;
	}
	this.getSelected=function(){
		return this._list[this.index-1];
	}
	this.get=function(_index){
		return this._list[(_index)];
	}
	this.size=function(){
		return this._list.length;
	}
	this.getData=function(){
		return this._list;
	}
	this.indexOf=function(_object){
		if(this._list){
			var i = 0;
			while (i < this._list.length) {
				if (this._list[i] == _object) {
					i++;
					return i;
				}
				i++;
			}
		}
		return -1;
	}
	this.isChecked=function(){
		for (var i in this._list){
			if(this._list[i].getValue('ischecked')=='true')
			   return true;
		}
		return false;
	}
	this.getCheckedItems=function(){
		var _rv=new Array();
		for (var i in this._list){
			if(this._list[i].getValue('ischecked')=='true')
			   _rv[_rv.length]=this._list[i];
		}
		return _rv;
	}
	this.getEdited=function(){
		var _rv=new Array();
		for (var i in this._list){
			if(this._list[i].status!='none')
			   _rv[_rv.length]=this._list[i];
		}
		return _rv;
	}
}
/*
ListSelectedListener=function(pModel){
	this.pModel=pModel;
	this.setSelectedIndex=function(index){
		this.pModel.setBean(this.parent._list[index].getBean());
	}
}
*/
function removeItems(array, item) {
	var i = 0;
	while (i < array.length) {
		if (array[i] == item) {
			array.splice(i, 1);
			return;
		} else {
			i++;
		}
	}
	return array;
}

function itemsIndex(array,item){
	if(!array) return -1;
	var idx=1;
	for (var i in array) {
		if (array[i] == item) {
			return idx;
		} 
		idx++;
	}
	return -1;
}

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );return;
  } else
    obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;return;
  } else
    obj.removeEventListener( type, fn, false );
}

function disableContext(){
		return false;
}

function showTab(tab,tabs){
	var ttab,ltab;
	for(var i=0;i<tabs.length;i++){
		var etab=document.getElementById(tabs[i]);
		var eltab=document.getElementById(tabs[i]+'Tab');
		if(tabs[i]==tab){
			ttab=etab;
			ltab=eltab;continue;
		}else{
			etab.style.display='none';
			eltab.className='tab1';
		}
	}
	ttab.style.display='block';
	ltab.className='tab2';
}
function UCICArray(dataBean){
	this._beanName='ucic.asp.UCICArray';
	this._alias='arraydto';
	this._beanMeta=[
		["dtos","list","dtos","bean",dataBean]
		];
	this.dtos;
	this._construct=function(){
		return new UCICArray(dataBean);
	}
}
NameBean=function(name){
	this._beanName='com.ggh.NameBean';
	this._alias='namebean';
	//Defined field type.
	this._beanMeta=[//if is list,it has 4 index which discribes list type.
		["name","string","name"]
		];
	this.name=name;
	this._construct=function(){
		return new NameBean();
	}
}

ParameterBean=function(name,value){
	this._beanName='com.ggh.ParameterBean';
	this._alias='parameter-bean';
	//Defined field type.
	this._beanMeta=[//if is list,it has 4 index which discribes list type.
		["name","string","name"],
		["value","string","value"]
		];
	this.name=name;
	this.value=value;
	this._construct=function(){
		return new ParameterBean();
	}
}

PrmsBean=function(name,value){
	this._beanName='com.ggh.PrmsBean';
	this._alias='arraydto';
	this._beanMeta=[//if is list,it has 4 index which discribes list type.
		["dtos","list","dtos","bean","ParameterBean"]
		];
	this.dtos;
	this._construct=function(){
		return new PrmsBean();
	}
}

cloneBean=function(bean){
	var r=bean._construct();
	var a=bean._beanMeta;
	for(var i in a){
		r[a[i][0]]=bean[a[i][0]];
	}
	return r;
}
updateBean=function(_tgt,_src){
	var a=_tgt._beanMeta;
	for(var i in a){
		_tgt[a[i][0]]=_src[a[i][0]];
	}
}
function NameValidator(){
	this.validate=function(_bean){
		if(!_bean) return false;
		var result=new Array();
		if(!(_bean['name'])){
			result[result.length]=new ValidatedMsg('name','名字不能够为空.','ERROR');
		}
		return result;
	}
}


function IdNameValidator(){
	this.validate=function(_bean){
		if(!_bean) return false;
		var result=new Array();
		if(!(_bean['id'])){
			result[result.length]=new ValidatedMsg('id','Id不能够为空.','ERROR');
		}
		if(!(_bean['name'])){
			result[result.length]=new ValidatedMsg('name','名字不能够为空.','ERROR');
		}
		return result;
	}
}

function checkdate(str){
	var   reg   =   /^(\d{4})-(\d{1,2})-(\d{1,2})$/   
    var r = str.match(reg);  
    if(r==null)return false;   
    r[2]=r[2]-1;   

    var d= new Date(r[1],r[2],r[3]);   
    if(d.getFullYear()!=r[1])return false;   
    if(d.getMonth()!=r[2])return false;   
    if(d.getDate()!=r[3])return false;     
    return true;   
}
function checkdatetime(str)  
{   
    var   reg   =   /^(\d{4})-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2})$/   
    var r = str.match(reg);  
    if(r==null)return false;   
    r[2]=r[2]-1;   

    var d= new Date(r[1],r[2],r[3],r[4],r[5]);   
    if(d.getFullYear()!=r[1])return false;   
    if(d.getMonth()!=r[2])return false;   
    if(d.getDate()!=r[3])return false;   
    if(d.getHours()!=r[4])return false;   
    if(d.getMinutes()!=r[5])return false;   
    return true;   
}   
function checkFloat(NUM){
 var i,j,strTemp;
 var v=0;
 strTemp="0123456789";
 if ( NUM.length== 0)
  return false
 for (i=0;i<NUM.length;i++){
  var _a=NUM.charAt(i);
  j=strTemp.indexOf(_a); 
  if (j==-1){
  	if(_a=='.' && v==1)
   		return false;
   	else if(_a=='.') v=1;
	else return false;
  }
 }
 return true;
}
showUcicDlg = function(id,objId){
		var _dlg		= document.getElementById(id);
		_dlg.style.zIndex='300';
		_dlg.style.position='absolute';
		var obj=document.getElementById(objId);
		var rect=getCoords(obj);
		if(!rect||!rect.x) return;
			_dlg.style.top=(rect.y-1)+'px';
			_dlg.style.left=(rect.x+2)+'px';
		//_dlg.style.border='';
		_dlg.style.width=obj.offsetWidth+'px';
		_dlg.style.height=obj.offsetHeight+'px';
		_dlg.style.display = "block";
}
hideUcicDlg=function(id){
	var _dlg		= document.getElementById(id);
	_dlg.style.display="none";
}