

/*
 * use ../tho/prototype/*.js,lightbox.js
 * */
if(Object.isUndefined(Prototype))
  throw("boncbase.js requires including prototype.js library");

/*公用对象*/
var Bonc = {
	/*系统常量*/
	Constants : {
	/*web应用名*/
	WEB_APP_CONTEXT_PATH : '/',
	/*web应用Action后缀*/
	WEB_APP_ACTION_EXTENSION :'action',
	/**/
	BLANK_IMAGE_URL :this.WEB_APP_CONTEXT_PATH+'/resources/niche/img/s.gif',
	CLOSE_IMAGE_URL :this.WEB_APP_CONTEXT_PATH+'/resources/iess/images/3G_close.gif'
	}
};

/*Base*/
var BoncBase = Class.create();
BoncBase.prototype = {
	initialize : function(){
	},
	/*获取Web应用上下文路径*/
	getContextPath : function (){
		return Bonc.Constants.WEB_APP_CONTEXT_PATH;
	},
	/*将URL转换为全路径*/
	toFullPath : function (action){
		if(!action || 'string'!=typeof(action)) return action;
		if(action.startsWith('/')) action=this.getContextPath()+action;
		var i=action.indexOf('?');
		if(i<0) i=action.length;
		return action.lastIndexOf('.',i)<0 ? action.substring(0,i)+'.'+Bonc.Constants.WEB_APP_ACTION_EXTENSION+action.substring(i) : action;
	},
	/*private AppletBox*/
	_slideAppletBox : function (a,b){
		if(b=="1"){
			$("img_1"+a).hide();
			$("img_2"+a).show();
			Effect.SlideUp($('inner'+a),{duration:0.5});
		}else if(b=="2"){
			$("img_1"+a).show();
			$("img_2"+a).hide();
			Effect.SlideDown($('inner'+a),{duration:0.5});
		}else{
			Effect.DropOut($(a));
		}
	},
	/*AppletBox的关闭按钮图片*/
	getAppletCloseIcon : function(boxId){
		return $('img_3'+boxId);
	},
	/*AppletBox的最小化按钮图片*/
	getAppletMinIcon : function(boxId){
		return $('img_1'+boxId);
	},
	/**/
	showDialog : function (params){
		new lightbox(params).activate();
	},
	/**/
	showPopupTooltip : function(x,y,content){
		var div=new Element("DIV",{'class':"popupTooltip"});
		div.setOpacity(0.8);
		div.style.left=x+'px';
		div.style.top=y+'px';
		div.style.zIndex='99999';
		document.body.appendChild(div);
		div.update(content);
		new Effect.Fade(div,{duration:3,afterFinish:function(effect){effect.element.remove()}});
	},
	/*触发指定元素的指定事件  from jehiah */
	fireEvent : function (element,event){
	    if (document.createEventObject){
	    	   // dispatch for IE
	        var evt = document.createEventObject();
	        return element.fireEvent('on'+event,evt)
	    }
	    else{
	    	 // dispatch for firefox + others
	        var evt = document.createEvent("HTMLEvents");
	        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
	        return !element.dispatchEvent(evt);
	    }
	},
	/**
	 * 设置cookie from WebFXTabPane
	 */
	setCookie : function( sName, sValue, nDays ) {
		var expires = "";
		if ( nDays ) {
			var d = new Date();
			d.setTime( d.getTime() + nDays * 24 * 60 * 60 * 1000 );
			expires = "; expires=" + d.toGMTString();
		}
		document.cookie = sName + "=" + sValue + expires + "; path=/";
	},
	/**
	 * 读取cookie
	 */
	getCookie : function (sName) {
		var re = new RegExp( "(\;|^)[^;]*(" + sName + ")\=([^;]*)(;|$)" );
		var res = re.exec( document.cookie );
		return res != null ? res[3] : null;
	},
	/**
	 * 删除cookie
	 */
	removeCookie : function ( name ) {
		this.setCookie( name, "",  -1);
	}
};
/*Form工具集*/
BoncBase.Form = Class.create();
BoncBase.Form.prototype={
	initialize : function(){
	},
	/**
	 * 对指定的form中的指定的CheckBox集合选中
	 * @param formId form
	 * @param checkName CheckBox集合的name
	 * @param checkAllId 全选按钮id
	 **/
	checkAllRecords : function (formId,checkName,checkAllId){
		$(formId).getInputs('checkbox',checkName).each(function(ck){
			ck.checked=$(checkAllId).checked;
		});
	},
	/**
	 * 对指定的form中的指定的CheckBox集合进行form提交
	 * @param formid form
	 * @param checkName CheckBox集合的name
	 * @param nullWarnDesc CheckBox集合没有选中时的提示
	 * @param confirmDesc 提交确认提示
	 */
	commitBatchOperation : function (formId,checkName,nullWarnDesc,confirmDesc){
		var checked=false;
		$(formId).getInputs('checkbox',checkName).each(function(ck){
			if(checked=ck.checked) throw $break;
		});	
		if(!checked){
			alert(nullWarnDesc || '请先选择要删除的记录!');
			return false;
		}
		else{
			if(confirm(confirmDesc || '是否确认删除所选记录？')){
				$(formId).submit();
			}
		}
		return false;
	},
	/**
	 * 检查指定的form中的指定的CheckBox集合是否只选中了一个
	 * @param formid form
	 * @param checkName CheckBox集合的name
	 * @param nullWarnDesc CheckBox集合不符合要求时的提示
	 */
	selectOneCheckbox : function(formId,checkName,nullWarnDesc){
	    var checked=false;
	    var num=0;
	    var svalue;
	    $(formId).getInputs('checkbox',checkName).each(function(ck){
	    	if(ck.checked) {
	           num++;
	           svalue=ck.value;
	           checked=true;
	        }
	    });
	    if(!checked){
			alert(nullWarnDesc || '请先选择记录!');
			return false;
		}else if(num>1){
	        alert(nullWarnDesc || '只能选择一条记录!');
	    }else{
	        return svalue;
	    }
	    return false;
	},
	/*private Form表单校验*/
	_checkFormField: function(vForm, vName, vExpr, label){
		var v_Form = $(vForm[vName]);
		var v_type = v_Form.type;
		var v_values = new Array();
		if (v_type == "select-multiple") {
		    v_values = $F(v_Form);
		} else if (v_type == "text" || v_type == "file" || v_type == "textarea") {
		    v_values[0] = $F(v_Form).strip();
		}else if (v_type == "select-one" || v_type == "password") {
		    v_values[0] = $F(v_Form);
		}else {
		    var v_Form_Tmp = $(vForm)[vName];
		    var i = 0;
		    var j = 0;
		    v_type = $(vForm)[vName][0].type;
		    for (i = 0; i < v_Form_Tmp.length; i++) {
		        if (v_Form_Tmp[i].checked) {
		            v_values[j] = v_Form_Tmp[i].value;
		            j++;
		        }
		    }
		}
		var isvaliReq = true;
	    if (vExpr.indexOf("required") != -1) {
	        isvaliReq = validateRequired(v_values, label);
	        if (isvaliReq != true) 
	            return isvaliReq;
	    }
	    if (true == isvaliReq) {
	        if (vExpr.indexOf("email") != -1) {
	            return validateEmail(v_values, label);
	        }
	        if (vExpr.indexOf("numeric") != -1) {
	            return validateNumeric(v_values, label);
	        }
	        if (vExpr.indexOf("trimLen") != -1) {
	            var len = vExpr.substring(vExpr.indexOf("(") + 1, vExpr.indexOf(")")).strip();
	            return validateLen(v_values, len, true, label);
	        }
	        if (vExpr.indexOf("len") != -1) {
	            var len = vExpr.substring(vExpr.indexOf("(") + 1, vExpr.indexOf(")")).strip();
	            return validateLen(v_values, len, false, label);
	        }
	    }
	    return true;
	    
	    function validateRequired(req, label){
	        var errorMsg = label + "不能为空";
	        if (req == null || req.length == 0) 
	            return errorMsg;
	        if (req[0] == "" || req[0] == "-1") 
	            return errorMsg;
	        
	        return true;
	    }
	    function validateEmail(req, label){
	        if (validateRequired(req, label) != true) 
	            return true;
	        else {
	            var mailReg = new RegExp(/^[0-9a-zA-Z_\-\.]+@[0-9a-zA-Z_\-]+(\.[0-9a-zA-Z_\-]+)*$/);
	            var i = 0;
	            for (i = 0; i < req.length; i++) {
	                if ((req[i].strip().match(mailReg) == null)) 
	                    return label + "不是有效的Email地址";
	            }
	            return true;
	        }
	    }
	    function validateNumeric(req, label){
	        if (validateRequired(req, label) != true) 
	            return true;
	        else {
	            var numReg = new RegExp(/^[0-9]*$/);
	            var i = 0;
	            for (i = 0; i < req.length; i++) {
	                if ((req[i].strip().match(numReg) == null)) 
	                    return label + "不是有效的数字";
	            }
	            return true;
	        } 
	    }
	    function validateLen(req, len, isTrim, label){
	        if (validateRequired(req, label) != true) 
	            return true;
	        else {
	            var i = 0;
	            for (i = 0; i < req.length; i++) {
	                if (isTrim) 
	                    req[i] = req[i].strip();
	                if (req[i].length != len) 
	                    return label + "长度不等于" + len;
	            }
	            return true;
	        }
	    }
	},
	/*Form表单校验*/
	checkFormField : function(vForm, vName, vExpr, label){
		var o=this._checkFormField(vForm, vName, vExpr, label);
		if(o==true)
			return true;
		Bonc.showDialog({title:"输入错误",content:o});
		return false;
	}
};
/*TAB导航*/
BoncBase.NavTab = Class.create();
BoncBase.NavTab.prototype = {
	target:null,
	/*Tab元素点击事件*/
	clickFunc:null,
	/*Tab元素数据集*/
	tabs:null,
	/*Tab样式*/
	cssClass:"navtab",
	subtabs:null,
	initialize : function(params){
		if(params.target)
			this.target=params.target;
		if(params.click)
			this.clickFunc=params.click;
		if(params.cssClass)
			this.cssClass=params.cssClass;			
		this.tabs=params.tabs;
	},
	/*渲染 Tab*/
	render:function(id){
		var container=$(id);
		Bonc.fireEvent(this.createTabs(container,this.tabs).down('A'),'click');
	},
	/*创建Tab*/
	createTabs:function(container,tabs){
		container.addClassName(this.cssClass);
		for(var i=0;i<tabs.length;i++){
			var tab=tabs[i];
			if(tab.url.strip()==""&&tab.children!=""){
				tab.url=(tab.children[0].url);
			}
			var li=new Element('LI');
			var a=new Element('A',{tabind:i,href:tab.url,target:this.target,menuId:tab.id,leaf:''+tab.leaf,lvl:tab.lvl});
			a.update(tab.title);
			li.appendChild(a);
			container.appendChild(li);
			Event.observe(a,'click',this.click.bindAsEventListener(this));						
		}
		return container;
	},
	/*点击Tab*/
	click:function(event){
		var el=Event.element(event);
		el.blur();
		var l=el.up('.'+this.cssClass);
		if('OL'==l.tagName){
			var oldsel=l.down('.selectedtab');
			if(oldsel) oldsel.removeClassName('selectedtab');
			el.addClassName('selectedtab');
		}
		else
			this.switchTab(el,l,event);
		if(this.clickFunc && !this.clickFunc(event,el))
			Event.stop(event);			
	},
	/*切换Tab*/
	switchTab:function(el,vul){
		if(this.subtabs){this.subtabs.remove();this.subtabs=null;}
		var oldsel=vul.down('.selectedtab');
		if(oldsel) oldsel.removeClassName('selectedtab');
		el.addClassName('selectedtab');
		var cs=this.tabs[el.getAttribute('tabind')].children;
		if(cs && cs.length){
			var  st;
			vul.parentNode.insertBefore(st=this.subtabs=this.createTabs(new Element('OL'),cs),vul.nextSibling);
			st.style.position="absolute";
			var pos=el.cumulativeOffset();var dim=el.getDimensions();var dimSelf=st.getDimensions();
			var top=pos.top+dim.height;			
			var left=pos.left+dim.width/2-dimSelf.width/2;
			if(left<0)
				left=0;
			else{
				var sw=document.viewport.getWidth();
				if(left+dimSelf.width>sw)
					left=sw-dimSelf.width;
			}
			st.style.left=left+'px';st.style.top=top+'px';
			$A(st.getElementsByTagName('A')).each(function(a){
				if(a.href==el.href){
					$(a).addClassName('selectedtab');throw $break;
				}
			});
		}
	}
};
/*Web页初始化操作*/
BoncBase.WebInit ={
	/*在prototype.js中的Ajax请求中增加载入提示*/
	ajaxRespondersRegister : function(){
		Ajax.Responders.register({
		    onCreate: function(){
				if(!$('ajax-indicator') ){
					var o=new Element('DIV',{'id':"ajax-indicator", 'style':"display:none;"}).update("<span>载入中...</span>");
					document.body.appendChild(o);			
				}
		        if (Ajax.activeRequestCount > 0) {
		            Element.show('ajax-indicator');
		        }
		    },
		    onComplete: function(){
		        if ($('ajax-indicator') && Ajax.activeRequestCount < 1) {
		            Element.hide('ajax-indicator');
		        }
		    } 
		});		
	},
	/**
	 * 修改Ajax.Updater的updateContent方法，增加样式引入功能
	 */
	ajaxUpdaterUpdateContent : function(){
		Ajax.Updater.addMethods({
			updateContent:function(responseText) {
			    var receiver = this.container[this.success() ? 'success' : 'failure'],
			    options = this.options;
			
				if (!options.evalScripts) responseText = responseText.stripScripts();
				if(Prototype.Browser.IE){
					responseText = '<div style="display: none;">&nbsp;</div>' + responseText;
					//responseText = '<span style="display: none;"></span>' + responseText;
					//responseText = responseText.replace(/<script(.*)defer([^\s|^>]*)([^>]*)>/gi,'<script$1$3>');
				}
				
				if (receiver = $(receiver)) {
				  if (options.insertion) {
				    if (Object.isString(options.insertion)) {
				      var insertion = { }; insertion[options.insertion] = responseText;
				      receiver.insert(insertion);
				    }else 
				    	options.insertion(receiver, responseText);
				  }else{
					  receiver.update(responseText);
				  }
				}
				
			}
		});
	},
	/*向表格增加隔行换色样式*/
	changleTableTRColor : function(){
		$$('TABLE.grid0 TBODY TR').each(function(t,ind){
			if(ind % 2 ==1) t.addClassName('odd');
		});
	}
};
BoncBase.Event = Class.create();
BoncBase.Event.prototype = {
	//private
	events : {'dom:loaded':[]},
	initialize : function(){
	},
	/*注册事件*/
	on : function(eventName,handler,scope){
		eventName = eventName.toLowerCase();
		var es=this.events[eventName];
		if(!es) return false;
		
		for(var i=0;i<es.length;i++){
			if(es[i].handler==handler)
				return false;
		}
		scope = scope || this.obj;
		es.push({'handler' : handler,'scope' : scope});
	},
	/*执行事件*/
	fire : function(){
		var es=this.events[arguments[0].toLowerCase()];
		if(!es) return false;
		var e=es.pop();
		while(typeof e == "object"){
			e.handler.apply(e.scope||window,Array.prototype.slice.call(arguments, 1));
			e = es.pop();
		}
		return true;
	}		
};
Object.extend(Bonc,new BoncBase());

Object.extend(Bonc, {
	/*Form表单*/
	Form : new BoncBase.Form(),
	/*Form表单校验*/
	checkFormField : function(){
		return this.Form.checkFormField.apply(this.Form,arguments);
	},
	/*TAB导航*/
	NavTab : BoncBase.NavTab,
	Event : new BoncBase.Event()
});
/*Web页面初始化*/

BoncBase.WebInit.ajaxRespondersRegister();
BoncBase.WebInit.ajaxUpdaterUpdateContent();

Bonc.Event.on('dom:loaded',function(){
	BoncBase.WebInit.changleTableTRColor();
});	
document.observe('dom:loaded',function(){
	Bonc.Event.fire('dom:loaded');
});