(function(){
    var _dialogTemplete;
	
	
	//Dialog scpoe : window
    Dialog=new Class({
    Implements:[Options,Events]
	,options:{
	   onShow:$empty,//显示时的事件
	   onHide:$empty,//关闭时的事件注册
	   onClose:$empty,//关闭时的事件注册
	   onLoad:$empty,
       callback:false,
	 	width:750,/*窗口宽度*/
		height:400,/*窗口高度*/
        dialogBoxWidth:10,
		title:'',/*窗口标题*/
		dragable:true,/*是否允许拖拽*/
		resizeable:true,/*是否允许改变尺寸*/
		ajaksable:true,/*是否允许被框架[Ajaks]动态注册异步事件*/
		singlon:true,/*是否仅允许单独实例*/
		modal:false,/*是否在弹出时候其他区域不可操作*/
		isClose:true,
		ajaxoptions: {/*ajax请求参数对象*/
			update:false,
			evalScripts: true,
            method: 'get',
		    autoCancel:true
		}
	 },
	 initialize:function(url,options){
	    
        var currentRegionDialogs=this.currentRegionDialogs=$$('.dialog');
         
		 if(currentRegionDialogs.some(function(item,idx){
			 if(item.retrieve('serial')==url.toString().trim()&&item.style.display!='none'){
			    item.inject(document.body)
			   return true;
			 }
		}) )return;
		
	     this.setOptions(options);
		 options=this.options;
		 this.UID = (Native.UID)++;
		 
		if(!_dialogTemplete){
		_dialogTemplete=$('dialogProtoType').innerHTML;
		$('dialogProtoType').empty();
		}
		 this.dialog = new Element('div',{id:'dialog_'+this.UID,'class':'dialog','styles':{'visibility':'hidden','zoom':1,'opacity':0,'zIndex':65534}})
		           .setHTML(_dialogTemplete).inject(document.body)
				   .store('serial',url.toString().trim());		
		
		if(this.options.callback){
           this.dialog.store('callback',this.options.callback);
        }
	this.dialog_head=$E('.head',this.dialog)
		           .addEvent('click',function(e){
				           if($$('.dialog').length>1)
						   this.inject(document.body);
				     }.bind(this.dialog));
		this.dialog_body=$E('.body',this.dialog);
		
		//options.ajaxoptions.update = this.dialog_body;
		//this.dialog_foot=$E('.foot',this.dialog);	
		
		$E('.title',this.dialog_head).setText(options.title||"Dialog");
		
		if(!this.options.isClose){
			$E('.closeBtn',this.dialog_head).addEvent('click',function(e){
				if(e)
				e=new Event(e).stop();
				this.close();
			}.bind(this));
		}else{
			$E('.closeBtn',this.dialog_head).hide();
		}
		
		if(options.dragable){
		  this.dragDialog();
		}
		
		if (options.resizeable) {
			this.dialog_body.makeResizable({
				handle: $E('.resizeBtn',this.dialog),
				limit: {
					x: [200,window.getSize().x*0.9],
					y:[100,Math.max(window.getSize().y,window.getScrollSize().y)]
				},
				onDrag: function(){
				    this.setDialogWidth();
				}.bind(this)
			});
			//this.dialog_foot.setStyle('display','');
			
			//this.dialog_body.setStyle('overflow','scroll');
		}else{
			$E('.resizeBtn',this.dialog).hide();
			//this.dialog_body.setStyle('overflow','hidden');
		}
		
		//this.dialogShowEffect=this.dialog.effect('opacity');
		
		$extend(options.ajaxoptions,{
		 'update':this.dialog_body,
		 'elMap':{
				'.mainHead':$E('.headContent',this.dialog).hide(),
				'.mainFoot':$E('.footContent',this.dialog).hide()
			},
		  'onRequest':function(){
		    this.setDialog_bodySize();
		  }.bind(this),
		  'onFailure':function(){
		    this.close();
			alert("加载弹出内容失败!");
		  }.bind(this),
		  'onComplete':function(re){
		    if('onComplete' in options)options.onComplete(re);
		    this.onLoad.call(this,re);
		  }.bind(this)
		});
		
		 this.popup(url,options);
	 },
	  onLoad:function(re){
	      var closebtn=$E('*[isCloseDialogBtn=true]',this.dialog);
		  if(closebtn){
			    closebtn.addEvent('click',this.close.bind(this));
			}
          this.dialog.store('instance',this);
	      this.show();
	 },
	 initContent:function(url,options,isreload){
	     options=options||this.options;
         
         if(!isreload){
             var ic=arguments.callee;   
             this.reload=function(){
               ic(url,options,true);
             }
         }

	     new Ajax(url,options.ajaxoptions).request();  
	 },
	 popup:function(url,options){
	  if(options.modal||options.singlon)MODALPANEL.show();
	  $('loadMask').amongTo(window).show();
	  this.fireEvent('onShow',this);
	  this.initContent(url,options);
	 },
	 show:function(){
	   this.setDialog_bodySize();
	    $('loadMask').hide();
        
        var crd=this.currentRegionDialogs;
        var crd_length=crd?crd.length:0;
        
	    if(crd_length&&crd_length>0){
            this.dialog.position($H(crd[crd_length-1].getPosition()).map(function(v){
                return v+=20;
            })).setOpacity(1);
        }else{
           this.dialog.amongTo(window);
        }
        this.fireEvent('onLoad',this);
	 },
	 close:function(){
         this.fireEvent('onClose',this.dialog);
         this.dialog.style.display='none';
         if(window.ie){
            $ES('iframe',this.dialog_body).remove();
         }
		 this.dialog.empty().remove();
		 $('dialogdragghost_'+this.UID)?$('dialogdragghost_'+this.UID).remove():'';
		 if(this.currentRegionDialogs.length>0)return false;
		   MODALPANEL.hide();
		  
		 return 'nodialog';
	 },
	 hide:function(){
	 	this.fireEvent('onHide');
		this.close.call(this);
	 },
	 setDialog_bodySize:function(){
	  this.dialog_body.setStyles({
			'height':this.options.height-this.dialog_head.getSize().size.y-this.options.dialogBoxWidth*2,
			'width':this.options.width-this.options.dialogBoxWidth*2
		});
	  this.setDialogWidth();
	 },
	 setDialogWidth:function(){
	   this.dialog.setStyle('width',this.dialog_body.getSize().size.x+this.options.dialogBoxWidth*2);
	 },
	 dragDialog:function(){
            var dialog=this.dialog;
			var dragGhost=this.dragGhost=new Element('div',{'id':'dialogdragghost_'+this.UID});
			    dragGhost.setStyles({
				'position':'absolute',
				'border':'2px #333333 dashed',
				'cursor':'move',
				'background':'#66CCFF',
				'display':'none',
				'opacity':0.3,
				'zIndex':65535
				}).inject(document.body);	
			this.addEvent('load',function(e){
				dragGhost.setStyles(dialog.getCis());
			});
			    new Drag(dragGhost,{
				    'handle':this.dialog_head,
					'limit':{'x':[0,window.getSize().x],'y':[0,window.getSize().y]},
					 'onStart':function(){
					     dragGhost.setStyles(dialog.getCis());
					     dragGhost.show();
					 },
					 'onComplete':function(){
					    var pos=dragGhost.getPosition();
						dialog.setStyles({
							'top': pos.y,
							'left':pos.x
						});
						dragGhost.hide();
					}
				});	
	 }
});

})();	