﻿/*Author: Daniel.Lin(http://www.aspstat.com)*/
jBox.settings = {
  content:'',trigger:'',ajax:'',
  x:0,y:0,width:'auto',height:'auto',center:true,
  showOverlay:true,topMost:false,
  onLoad:null,onClosing:null,onClosed:null,
  name:'auto',timeout:0,
  closer:'.jBox_action_close',poster:'.jBox_action_post',
  canceler:'.jBox_action_cancel',redirecter:'.jBox_action_redirect'
};
jBox.ajax ={
  type:'GET',dataType:'html',cache: false
};
jBox.ajax.onSuccess = function(box,data){
    box._dom.css('width','auto').css('height','auto');
    data = data.replace( /[\w\W\s\S]*<.*?body.*?>([\w\W\s\S]*)<.*?\/body.*?>[\w\W\s\S]*/gi , "$1");
    box._dom.html(data);box._data = true;
    box.size();    
    if( box._s.center ) box.center();
    box._bindEvents();
    box.show();
    if(  typeof(jBoxAjaxCallback) !=  'undefined' ){ 
      jBoxAjaxCallback(box);
      jBoxAjaxCallback = undefined;
    }
    else
      box.onClosed = function(){ location.reload(); };  
};
jBox.ajax.onError = function(box,res){
    box._dom.css('width','auto').css('height','auto');
    var data = res.responseText.replace( /[\w\W\s\S]*<.*?body.*?>([\w\W\s\S]*)<.*?\/body.*?>[\w\W\s\S]*/gi , "$1");
    if( data.length >0 )
    data = '<div style="text-align:left;"><h3>友好提示！<input type="button" class="jBox_action_cancel" value=" 确认 "/></h3>'+data+'</div>';
    else data = res.responseText;
    box._dom.html(data);box._data = true;
    box.size();    
    if( box._s.center ) box.center();
    box._bindEvents();
    box.show();
  
    if(  typeof(jBoxAjaxCallback) !=  'undefined' ){
      jBoxAjaxCallback(box);jBoxAjaxCallback = undefined;}
};
jBox.boxes = new Array();
jBox.topMost = function(bol){
  if( bol ){
  for(var i = 0 ; i< jBox.boxes.length ;i++)
    if(  !jBox.boxes[i]._s.topMost ){
      jBox.boxes[i]._dom.css('z-index',999);
    }}
  else{
    var hasMost = false;

    for(var i = 0 ; i< jBox.boxes.length ;i++)if( jBox.boxes[i]._s.topMost && jBox.boxes[i].isShow ){hasMost =true;break;}
    if( hasMost ) return;
    
    for(var i = 0 ; i< jBox.boxes.length ;i++)
    if(  !jBox.boxes[i]._s.topMost ){
      jBox.boxes[i]._dom.css('z-index',(1000+i));
    }
  }
};
jBox.addBox = function(box){
  jBox.boxes.push(box);
  return jBox.boxes.length-1;
};
jBox.getBoxIndex = function(box){
  for(var i = 0 ; i< jBox.boxes.length ;i++)
    if( jBox.boxes[i] == box ) return i;
  return -1;
};
jBox.getBoxByName = function(name){
  for(var i = 0 ; i< jBox.boxes.length ;i++)
    if( jBox.boxes[i]._s.name == name ) return jBox.boxes[i];
  return null;
};
jBox.removeBox = function(box){
  var index = jBox.getBoxIndex(box);
  for( var i=index;i++;i<jBox.boxes.length-1 ){
     jBox.boxes[i] = jBox.boxes[i+1];
     jBox.boxes[i].index = i;
     if( null!=jBox.boxes[i]._dom)
       jBox.boxes[i]._dom.css('z-index',1000+i);
  }
  --jBox.boxes.length;
};
jBox._docView = function(){
  var ret= [0,0];
  jQuery.each( [  "Width", "Height"], function(i, name){        
     ret[i]=jQuery.browser.opera && document.body[ "client" + name ]||jQuery.browser.safari && window[ "inner" + name ] ||
	 document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] 
  });
  return ret;
};
jBox._docSize = function(){
  var ret= [0,0];
  jQuery.each( [  "Width", "Height"], function(i, name){        
    ret[i]=Math.max(document.body["scroll" + name],document.documentElement["scroll" + name]);
  });
  return ret;
};
jBox._overlay = {
  _dom:null,
  show:function(){
    if( null==jBox._overlay._dom) jBox._overlay.initialize();
    jBox._overlay._dom.show();
  },
  hide:function(){
    var bol = true;
    for( var i = 0 ; i< jBox.boxes.length; i++){
      if( jBox.boxes[i]._s['showOverlay'] && jBox.boxes[i].isShow==true ) bol=false;
    
    }
    if( bol ) jBox._overlay.dispose();
  },
  initialize:function(){
    var docSize = jBox._docSize();
    var docView = jBox._docView();
    jBox._overlay._dom = $('<div id="jBox_overlay_layer" style="position:absolute;top:0px;left:0px;z-index:999;width:'+Math.max(docView[0],docSize[0])+'px;height:'+Math.max(docView[1],docSize[1])+'px;background:black;opacity:0.7;filter:alpha(opacity=70);"></div>').appendTo(document.body);
    jBox._overlay._dom.append('<iframe id="jBox_overlay_iframe" width="100%" height="100%" marginheight=0 marginwidth=0 frameborder=0 style="opacity:0.0;filter:alpha(opacity=0);"/> ');
    $(top).resize( jBox._overlay.reDraw );
    $(top).unload( jBox._overlay.dispose );
  },
  reDraw:function(){
    if( null == jBox._overlay._dom) return;    
    var docSize = jBox._docSize(); 
    var docView = jBox._docView();
    jBox._overlay._dom.css('width',Math.max(docView[0],docSize[0])+'px').css('height',Math.max(docView[1],docSize[1])+'px');
  },
  dispose:function(){
    if( null !=jBox._overlay._dom){     
       jBox._overlay._dom.remove();
       jBox._overlay._dom = null;
    }
  }
 
};
jBox._initialize=function(box,args,isNew){
  if( args.trigger == '' ) args.trigger = '#'+$(args.content).attr('id')+'Trigger';
  if( isNew ) box._s = args; else  box._s = jQuery.extend( true,{},box._s , args ); 

  box._data = false;box.onLoad = args.onLoad;box.onClosing = args.onClosing;box.onClosed= args.onClosed;box.filter = args.filter;
  if( args.topMost ) jBox.topMost(true);
  if( isNew ){ 
    box.index = jBox.addBox( box );
    box.id = args.name != 'auto'?'jBox_custombox_'+args.name:'jBox_box'+box.index;
    box._dom = null; 
    box.initialize();
  }else{
    box.addTrigger(box._s.trigger);
  }
};
jBox.drag = function(event,box){
  if( box._canDrag ){
  if ($.browser.msie && $.browser.version < 7) {
	box._dom.css({left: event.pageX-box._cursor[0]+box._position.left,top: event.pageY-box._cursor[1]+box._position.top});
  }else{
	box._dom.css({left: event.clientX-box._cursor[0]+box._position.left,top: event.clientY-box._cursor[1]+box._position.top});
  }}
};

function jBox(args){
    args = jQuery.extend(true,{} ,jBox.settings , args);
    
    var box =null;
    if( args.name != 'auto' ) box = jBox.getBoxByName(args.name);
    if( null == box ) jBox._initialize( this , args, true );
    else jBox._initialize( box , args, false );
}

jBox.prototype.addTrigger = function(trigger,evt){
  if( !!!evt ) evt = 'click';
  var self = this;
  var dom = $(trigger);
  if( dom.length == 0 || trigger=='') this.show();
  else {
   dom.unbind( evt , function(){self.show();} );
   dom.bind( evt , function(){ self.show();} );  
  }
  if( this._s.timeout>0 )
    this.hide( this._s.timeout,this.onClosed );
};
jBox.prototype.initialize = function(){
  this._dom = $('<div id="'+this.id+'" style="position:absolute;display:none;background:#fff;padding:5px;border:1px solid #ccc;" class="jBoxContainer"></div>').appendTo(document.body);
  this._dom.css( 'z-index' , (1000+this.index) )
    .css('left',this._s.x+'px')
    .css('top',this._s.y+'px');
  this.addTrigger( this._s.trigger );
};
jBox.prototype.load = function(content,ajaxSetting){
  if( jQuery.isFunction(this.filter) )
    this.filter(this);
  else
  {
      if( content == undefined ) content = this._s.content; else  this._s.content=content;
      if( ajaxSetting == undefined ) ajaxSetting = this._s.ajax; else this._s.ajax =ajaxSetting;
      
      this._dom.css('width','auto').css('height','auto');
      if( ajaxSetting == ''){  
        
        var cnt = $(document.body).find(content);
        if( cnt.length == 0 ){
         this._dom.html(content );
        }else{
       
        this._dom.empty().append( cnt.clone().show() );   
        cnt.remove();
      
        }
        this._data = true;
        this.size();    
        if( this._s.center ) this.center();
        this._bindEvents();
        this.show();
      }else{   
        this._ajaxing();
        ajaxSetting= jQuery.extend(true,{} ,jBox.ajax ,ajaxSetting);
        var self = this;
        if( !!!ajaxSetting.success ){ ajaxSetting.success = function(data){jBox.ajax.onSuccess(self,data)}; }
        if( !!!ajaxSetting.error ){ ajaxSetting.error = function(res){jBox.ajax.onError(self,res)}; }
        $.ajax(ajaxSetting);
      };
  }
};
jBox.prototype._ajaxing = function(){
    this._dom.css('width','auto').css('height','auto');
    if( this._s.showOverlay ) jBox._overlay.show();  
    this._dom.html( '<div style="background:#fff url(/images/smallwaitanim.gif) no-repeat 5px 5px;padding:10px 20px 10px 33px;color:gray;font-weight:bold;">正在加载......</div>' ).show();   
    this.size();
    this.center();
};
jBox.prototype._bindEvents=function(){
    var self=this;
    this._dom.find(this._s.closer).click(function(){self.hide(self.onClosed); });
    this._dom.find(this._s.canceler).click(function(){self.hide(); });
    if( jQuery.isFunction( this.onLoad ) ) this.onLoad( this );
    this._dom.find(this._s.poster).click(function(){
      var jThis = $(this);
      var tmpF = jThis.parents('form:eq(0)'); 
      if( tmpF.length == 0 ) return;
      if( jThis.hasClass( 'jBox_filter_confirm' ) )
        self.filter = function(box){$.jBox.confirm( jThis.attr('title') , function(){box.load('' ,{type:'post',url: tmpF.attr('action'),data:frmData });});};
      if( tmpF.attr("enctype") ==  "multipart/form-data" ){
        if( jQuery.isFunction(self.filter) ) self.filter(self);
        else{
          if( $('iframe[name=jBox_ajaxFrame__]').length == 0 )
            $('<iframe name="jBox_ajaxFrame__" style="display:none;"/>').appendTo(document.body);
          tmpF.attr('target','jBox_ajaxFrame__');
          tmpF.submit();          
          self._dom.css('width','auto').css('height','auto');
          self._ajaxing();
        };
      }else{
        var frmData =tmpF.serialize();
        self.load( '' ,{type:'post',url: tmpF.attr('action'),data:frmData });
      };
      self.filter = null;
    });
    this._dom.find(this._s.redirecter).click( function(){
       var jThis = $(this);
       if( jThis.hasClass( 'jBox_filter_confirm' ) )
         self.filter = function(box){$.jBox.confirm( jThis.attr('title') , function(){box.load( '' ,{type:'get',url:jThis.attr('href') });});};
       self.load( '' ,{type:'get',url:jThis.attr('href') });
       self.filter = null;
       return false;
    });
    this._dom.find('.jBox_action_drag').mousedown( function(event){
      self._canDrag = true;
      self._position = self._dom.position();
      self._cursor = [event.pageX,event.pageY];
      $(this).bind( 'mousemove' ,function(e){jBox.drag(e,self);})
        .css( 'cursor' , 'move' );      
    }).mouseup( function(){self._canDrag = false;$(this).css( 'cursor' ,'pointer' );});  
};
jBox.prototype.size = function(){
  if( null == this._dom) return;
  var w = this._s.width,h=this._s.height;
  if( this._s.width == 'auto' ){
    w = this._dom.width();
  }; 
  if( this._s.height == 'auto' ){
    h = this._dom.height();
  };
  this._dom.css('width',w+'px').css('height',h+'px');
};
jBox.prototype.center = function(){
  if( null != this._dom){
  var docPos = [document.body.scrollLeft||document.documentElement.scrollLeft,document.body.scrollTop||document.documentElement.scrollTop] ;

  var docView = jBox._docView();
  var bSize = [this._dom.width(),this._dom.height()];
  this._dom.css( 'left', (docPos[0]+(docView[0]- bSize[0])/2) + 'px' ).css( 'top' ,(docPos[1]+(docView[1]- bSize[1])/2) + 'px' );
  };
};

jBox.prototype.show = function(){
  if( !this._data ){
    this.load(this._s.content,this._s.ajax);
  }else{
 
  this.isShow = true;
  
  if( this._s.showOverlay ) jBox._overlay.show();  
  this._dom.show().focus();
  }
};
jBox.prototype.hide = function(to,ck){
  if(!!this._hideTimeoutId){
      this._hideTimeoutId = clearTimeout( this._hideTimeoutId );
  }

  if( to!= undefined && to!= null){
     
     var t =parseInt(to);
     if( t >0 ){
     var self = this;
     self._hideTimeoutId = setTimeout( function(){self.hide(ck);} , t );
      return;
     }      
  }
  if( null == this._dom || !this.isShow ) return;
  var bol=true;
  if( jQuery.isFunction(this.onClosing) ) {this.onClosing();}
  if( bol ){ 
      this.isShow = false;
      if( this._s.showOverlay ) jBox._overlay.hide(); this._dom.hide();
    
      if( jQuery.isFunction( to ) )  to();
      if( this._s.topMost ) jBox.topMost(false);
  }
  
};
jBox.prototype.dispose = function(){  
  if( null != this._dom ){
    this.hide(this.onClosed);
    this._dom.remove();
    this._dom = null;
  }
  jBox.removeBox(this);
};
jQuery.jBox = function(args){
 args = args||{};
 args.content=this;
 return this.each( function(){return new jBox(args);});
};

jQuery.jBox.openAjax = function(url,data,callback){
  var _args ={name:'jBox_ajax'};
  if( jQuery.isFunction( data ) ){
    _args.ajax={url:url,type:'get'};_args.onLoad = data;}
  else{
    _args.ajax={url:url,type:'post',data:data};_args.onLoad = callback;}
  return new jBox(_args);
};
jQuery.jBox.confirm = function(message,onOk){
  var _args = {name:'jBox_confirm'};
  var html = '<div style="text-align:center;border:solid red;border-width:1px 3px 2px 1px;padding:5px;"><p style="font-size:14px;margin-bottom:10px;">'+message+'</p><input type="button" value="确认" class="jBox_action_close"/>&nbsp;&nbsp;<input type="button" value="取消" class="jBox_action_cancel"/></div>';
  _args.content = html;
  _args.onClosed = onOk;
  _args.topMost = true;
  new jBox(_args);
};
jQuery.jBox.alert = function(message,onOk){
var _args = {name:'jBox_confirm'};
  var html = '<div style="text-align:center;border:solid red;border-width:1px 3px 2px 1px;padding:5px;"><p style="font-size:14px;margin-bottom:10px;">'+message+'</p><input type="button" value="确认" class="jBox_action_close"/></div>';
  _args.content = html;
  _args.onClosed = onOk;
  _args.topMost = true;
  new jBox(_args);
};
jQuery.jBox.mode = function(){
  return jBox.getBoxByName('jBox_mode');
};
jQuery( function(){
  bindGlobalEvents();
  $('<img src="/images/smallwaitanim.gif" style="display:none;"/>').appendTo(document.body);
});
function bindGlobalEvents(){
  $('.jBox_mode').each( function(){
    var jObject = $(this);
    if ( jObject.attr('href').indexOf('#' )==0  ) $(jObject.attr('href')).hide();
    jObject.click( function(){
     var _url = jObject.attr('href');
     var _args ={name:'jBox_mode'};
     if( _url.indexOf('#' )==0 ) {_args.content = _url;}else _args.ajax={url:_url,type:'get',data:''};
     var _timeout = jObject.attr('timeout');     
     if( !!_timeout ) _args.timeout = _timeout;
     if( jObject.hasClass( 'jBox_filter_confirm' ) ){
       _args.filter = function(box){
         $.jBox.confirm( jObject.attr('title') , function(){
           box.load();
         });
         box.filter = null;
       }; 
     }   
     new jBox(_args);
     return false;    
    });
});
$('.jBox_post').click(function() {
    var jThis = $(this);
    var tmpF = jThis.parents('form:eq(0)');
    if (tmpF.length == 0) return;
    var _args = { name: 'jBox_post', ajax: {} };
    if (jThis.hasClass('jBox_filter_confirm'))
        _args.filter = function(box) {
            $.jBox.confirm(jThis.attr('title'), function() { box.load(); });
            box.filter = null;
        };
    _args.ajax.url = tmpF.attr('action');

    _args.ajax.type = 'post';
    _args.ajax.data = tmpF.serialize();
    new jBox(_args);
    return false;
});
}