if(Object.isUndefined(BoncBase))
  throw("boncxframe.js requires including boncbase.js library");
//requires Bonc
var BoncXframe = Class.create();
BoncXframe.prototype = {
	initialize 	: function(){
	},
	/**
	 * 在当前页面直接通过URL调用其它页面,并不刷新地显示出来
	 * 并执行其中的javascript(要执行的script标签必须作为容器的一级子结点)
	 * @param url 跳转到的链接地址
	 * @param containerID 装载url返回的HTML内容的容器
	 */
	linkThisPageDefer : function (url, containerID){
        var obj = $(containerID);
        var url=Bonc.toFullPath(url);
        if (obj != null && obj != "undefined"){
			new Ajax.Request(url, {
                method: 'post',
                onSuccess: function(transport){
                    obj.innerHTML = transport.responseText;
                    // 执行其中的javascript(要执行的script标签必须作为容器的一级子结点)
                    var scripts = obj.getElementsByTagName("SCRIPT");
                    for (var i = 0; i < scripts.length; i++){
                       if (scripts[i] && scripts[i].tagName == "SCRIPT"){
                           scripts[i].src = scripts[i].src;
                           scripts[i].defer = true;
                           scripts[i].type =  "text/javascript";
                       }
                    }
                },
                onFailure: function(transport){
                    if (param.failMsg) 
                        obj.innerHTML = failMsg;
                }
            });
		}else{
            alert("容器指定错误!");
        }
	},
	/**
	 * 在当前页面直接通过URL调用其它页面,并不刷新地显示出来
	 * @param url 跳转到的链接地址
	 * @param containerID 装载url返回的HTML内容的容器
	 */
	linkThisPage : function (url, containerID){
        var obj = $(containerID);
        var url=Bonc.toFullPath(url);
        if (obj != null && obj != "undefined"){
          new Ajax.Updater($(obj),url,{evalScripts: true});
        }else{
            alert("容器指定错误!");
        }
	},
	/**
	 * 在当前页面直接通过URL调用其它页面,并不刷新地显示出来
	 * 并执行其中的javascript(要执行的script标签必须作为容器的一级子结点)
	 * @param url 跳转到的链接地址
	 * @param containerID 装载url返回的HTML内容的容器
	 * @param param 参数对象
	 */
	linkThisPagebyParamDefer : function (url, containerID,param){
        var obj = $(containerID);
        var url=Bonc.toFullPath(url);
        if (obj != null && obj != "undefined"){
            new Ajax.Request(url, {
                method: 'post',
                onSuccess: function(transport){
                    obj.innerHTML = transport.responseText;
                    // 执行其中的javascript(要执行的script标签必须作为容器的一级子结点)
                    var scripts = obj.getElementsByTagName("SCRIPT");
                    for (var i = 0; i < scripts.length; i++){
                       if (scripts[i] && scripts[i].tagName == "SCRIPT"){
                           scripts[i].src = scripts[i].src;
                           scripts[i].defer = true;
                           scripts[i].type =  "text/javascript";
                       }
                    }
                },
                onFailure: function(transport){
                    if (param.failMsg) 
                        obj.innerHTML = failMsg;
                },
                parameters: param
            });
		}
        else{
            alert("容器指定错误!");
        }
	},
	/**
	 * 在当前页面直接通过URL调用其它页面,并不刷新地显示出来
	 * @param url 跳转到的链接地址
	 * @param containerID 装载url返回的HTML内容的容器
	 * @param param 参数对象
	 */
	linkThisPagebyParam : function (url, containerID,param){
        var obj = $(containerID);
        var url=Bonc.toFullPath(url);
        if (obj != null && obj != "undefined"){
			new Ajax.Updater($(obj),url,{parameters: param,evalScripts: true});
		}
        else{
            alert("容器指定错误!");
        }
	},
	createElementIdRange : 0,
	/**
	 * 用来创建一个唯一的ID，一般用来创建HTML元素的ID
	 */
	createElementId : function(){
		return "pid"+new Date().getTime()+(this.createElementIdRange++ % 65536);
	},
	/**
	 * 引入js文件
	 * */
	importJS : function(url){
		if(url.startsWith('/')) url=Bonc.getContextPath()+url;
		var head = document.getElementsByTagName("head")[0];
		if(head){
			var scripts = document.getElementsByTagName("script");
			var flag=true;
			if(scripts){
				for(var i = 0;i < scripts.length;i++){
					if(scripts[i].getAttribute('src') == url){
						flag=false;
						break;
					}
				}
			}
			if(flag){
				var scriptObj = document.createElement( "script" );
				scriptObj.setAttribute( "type", "text/javascript" );
				scriptObj.setAttribute( "src", url);
				scriptObj.setAttribute( "defer", true);
				head.appendChild( scriptObj );
			}
		}
	}
};
if(!BoncXframe.Component)
	BoncXframe.Component={};
BoncXframe.Component.DepartmentTree=Class.create();
BoncXframe.Component.DepartmentTree.prototype={
	config:null,parameters:null,deptInfo:null,
	initialize : function(config){
		this.config = config||{};
		this.config.department = $(config.department);
		this.config.deptName = $(config.deptName);
		//this.config.deptName.readOnly='readOnly';
		
		//liling 20090701 为了规则划分方便，添加的规则的部门隐藏对象
		if(!Object.isUndefined($(config.deptRule))&&(config.deptRule)){
		this.config.deptRule=$(config.deptRule);
		}
		this.config.deptName.style.cursor='pointer';
		this.config.container=null;
			
		var instance = this;
		Event.observe(this.config.deptName,'click',function(event){
			if(instance.parameters!=instance.config.parameters){
				instance.parameters=instance.config.parameters;
				new Ajax.Request(Bonc.toFullPath('/xframe/security/Department'),{
					asynchronous : false,
					parameters : instance.parameters||{},
					onSuccess : function(transport){
						instance.deptInfo=transport.responseJSON[0];
					}
				});
				if(instance.tree){
					instance.tree.destroy();
				}
				//instance.config.container.update('');
				instance.render();
			}
			instance.config.container.show();
		});
	},
	//获得坐标位置 
	getXY:function(element,container){
	var elOffset=element.positionedOffset();
			var left=elOffset.left;
			var over=left+container.width-(document.body.scrollWidth-document.viewport.getScrollOffsets().left);
			if(over>0)left-=over;
			
			var top=elOffset.top+element.getHeight();
			var all_height;
			var top_height;
			var con_height;
			if(Prototype.Browser.IE){
			all_height=document.documentElement.scrollHeight;
			top_height=document.viewport.getScrollOffsets().top;
			con_height=container.height;
			}
			else{
			all_height=document.body.scrollHeight;
			con_height=container.height;			
			}			
			var th=document.documentElement.clientHeight;
			if((top-con_height)>0){
				if(all_height/2<top){
					top=top-con_height;
				}
			}
			left=left+'px';
			top=top+'px';
		    return {"x": left, "y": top};
	},
	render : function(){
		var clearButtonId=Bonc.createElementId();
		var colseButtonId=Bonc.createElementId();
		var title=['<div><span style="font-size:12px;">选择部门</span>',
			       	'<img style="width:50px;height:5px;" src="'+Ext.BLANK_IMAGE_URL+'"/>',
			       	'<a href="javascript:void(0);" id="'+clearButtonId+'">清空</a>&nbsp;&nbsp;&nbsp;&nbsp;',
			       	'<a href="javascript:void(0);" id="'+colseButtonId+'">关闭</a></div>'].join('');
		var instance = this;
	    this.tree = new  Ext.tree.TreePanel({
	      // el : el,
	       title: title,
	       width:230,
	       height:300,
	       autoScroll:true,   
	       containerScroll: true,
	       loader:new Ext.tree.TreeLoader({
	           dataUrl:Bonc.toFullPath('/xframe/security/Department!getChildren'),
	           baseParams :{regionNo:instance.deptInfo.regionNo}
	         }), 
	       //autoHeight:true,
	       rootVisible:(instance.deptInfo.deptName != null && instance.deptInfo.deptName != '' && instance.deptInfo.deptName != 'undefined')
	    });
	    //创建一个根节点   
	    this.root = new Ext.tree.AsyncTreeNode({
		    	id: instance.deptInfo.department,
		    	text: instance.deptInfo.deptName
	    });
	    //为tree设置根节点   
	    this.tree.setRootNode(this.root);

		this.tree.on("click",function(node,eventObject){
			instance.config.department.value=node.attributes.id;
			instance.config.deptName.value=node.attributes.text;
			//手动触发change事件 liling 20090722 修改，点击后文本内容赋入文本框就触发
		    //if(instance.config.department.value!=node.attributes.id){
		       if(instance.config.deptName&&instance.config.deptName.onchange){
		        //instance.config.department.value=node.attributes.id;
		        Bonc.fireEvent(instance.config.deptName,'change');
		       } 
		    //};
			//liling 20090701 新增方便规则划分的规则部门
			if(!Object.isUndefined(instance.config.deptRule)){
			 instance.config.deptRule.value=node.attributes.id;
			}
			instance.config.container.hide();
			return true;
		});
		
		instance.config.container=new Ext.Window({
			renderTo:Ext.getBody(),
			closable:false,
			width:230,//和树宽相同，防止过宽
			showshaw:false,//去掉背景的阴影
			frame:false,//去掉外框边角                              
			//x: instance.config.deptName.viewportOffset().left,
			//y:(instance.config.deptName.viewportOffset().top+this.config.deptName.getHeight()+2),
			//autoHeight:true,
		    height:300,layout:'table',items:[this.tree]});
		    
		    //为了那些在页面底部使用树的人，做的处理。这样处理后树可以正常的在底部显示在上面了
			var container=instance.config.container;
			container.x=instance.getXY(instance.config.deptName,container).x;
			container.y=instance.getXY(instance.config.deptName,container).y;
				
		instance.config.container.show();
	    //渲染  
	    //this.tree.render();
                                           
	    this.clearButton=$(clearButtonId);
	    this.colseButton=$(colseButtonId);
	    
		Event.observe(this.clearButton,"click",function(event){
			instance.config.department.value='';                        
			instance.config.deptName.value='';
			//liling 20090701 新增方便规则划分的规则部门
			if(!Object.isUndefined(instance.config.deptRule)){
			 instance.config.deptRule.value='';
			};
			instance.config.container.hide();
		});
		Event.observe(this.colseButton,"click",function(event){
			instance.config.container.hide();
		});
	   
	    this.root.expand(false,false,function(n){
	        if(n.firstChild)
	        	n.firstChild.expand();
	    });
	}
};
/*Web页初始化操作*/
BoncXframe.WebInit = Class.create();
BoncXframe.WebInit.prototype = {
	initialize : function(){
	},
	addTitleTip : function(){
		/**
		替换html元素的title属性。
		因为当鼠标放在元素上时，元素的title属性显示的时间很短，为了解决这个问题，特增加了一个titletip属性。
		使用方法：在需要定义元素的title属性时，改为定义titletip属性
		示例：
		之前： <td title="这是一个单位格，您看到的是这个单位的title属性的内容">这是一个单位格</td>
		现在： <td titletip="这是一个单位格，您看到的是这个单位的titletip属性的内容">这是一个单位格</td>
		如果需要改变titletip的样式，请定义名称为”titletip“的class
		var container =new Element('div',{
			'style':'position:absolute;display:none;z-index:19999;width:auto;height:auto;border:1px solid #ffd75a;background-color:#fff7bd;padding:4px;'
			});
		*/
		var container =new Element('div',{'style':'position:absolute;display:none;','class' : 'titletip'});
		if(document.body)document.body.appendChild(container);
		var timeId;
		var show = function(element){
			container.update(element.getAttribute('titletip'));
			var elOffset=element.positionedOffset();
			var left=elOffset.left+20;
			var over=left+container.getWidth()-(document.body.scrollWidth-document.viewport.getScrollOffsets().left);
			if(over>0)left-=over;
			var top=elOffset.top+element.getHeight();
			over=top+container.getHeight()-(document.body.scrollHeight-document.viewport.getScrollOffsets().top);
			if(over>0)top=elOffset.top-container.getHeight();
			
			container.style.left=left+'px';
			container.style.top=top+'px';
			container.show();
		};
		Event.observe(document.body, 'mouseover', function(event) {
			if(Event.element(event).getAttribute('titletip')){
				var element =Event.element(event);
				timeId=show.delay(0.4,element);
			}
		});
		Event.observe(document.body, 'mouseout', function(event) {
			if(Event.element(event).getAttribute('titletip')){
				if(container) container.hide();
				window.clearTimeout(timeId);
			}
		});
	}
};

Object.extend(Bonc,new BoncXframe());
if(!Bonc.Component)
	Bonc.Component={};
Object.extend(Bonc.Component, {
	DepartmentTree : BoncXframe.Component.DepartmentTree
});

Bonc.Event.on('dom:loaded',function(){
	(new BoncXframe.WebInit()).addTitleTip();
});



 