/*

  ---
    spModalLayer - Dialog Window - Version 1.3
  ---
    author: Dott. Stefano Ceschi Berrini (Padova)
    author: Dott. Ing. Daniele Baldi (Aulla)
  ---
    Dependencies: mootools Core, mootools More, doctype

*/
if (typeof(spModalLayer)=='undefined'){
  if (typeof(MooTools)=='undefined' || typeof(MooTools.More)=='undefined') {
    if(typeof(ZtVWeb)!='undefined') {
      ZtVWeb.RequireLibrary('../mootools.js')
      ZtVWeb.RequireLibrary('../mootools_more.js')
    } else {
      LibJavascript.RequireLibrary('../mootools.js')
      LibJavascript.RequireLibrary('../mootools_more.js')
    }
  }
  var spModalLayerUid = (
    function(){
      var id=0;
      return function(){
        return id++ ;
      };
    }
  )();
  var spModalLayer = function(src,options){
    options = options || {};

    /* Reference to the instantiated obj */
    var _this_dialog = this;

    /* LOCAL VARS */
    var src = src;
    var effect = options.effect || "default";
    //var modal = (!Empty($('cinema'))) ? false : (options.modal || true);

    /* OPTIONS */

    var modal = (options.modal == "off") ? false : true;
    var quirksOn = document.compatMode=='BackCompat';
    var resizable = (options.resizable && !quirksOn) || false;
    var draggable = (options.draggable && !quirksOn) || false;
    var cinema_morph_ms = options.cinema_morph_ms || 300;
    var dialog_morph_ms = options.dialog_morph_ms || 300;
    var show_scrollbars = options.show_scrollbars || false;
    var close_on_click_mask = options.close_on_click_mask || false;
    var in_iframe = options.in_iframe || false;
    var multiple_instances = options.multiple_instances || false;
    var dialog_width = options.width;
    var dialog_height = options.height;
    var top = options.top;
    var left = options.left;
    var dialog_margin_left = parseInt(dialog_width/2) - (parseInt(dialog_width/2)*2);
    var dialog_margin_top= parseInt(dialog_height/2) - (parseInt(dialog_height/2)*2);
    var mask_color = options.mask_color || "#000000";
    var border_color = options.border_color || "#000000";
    var border_width = options.border_width || "20";
    var mask_opacity = options.mask_opacity || 0.4;
    var opener_ref = options.opener || null;

    var dialog_uid = spModalLayerUid();

    this.isDragging = false;
    this.isResizing = false;

    this.getOpenerRef=function() {
      return opener_ref;
    }
    var components = {
      dialog : new Element('div',{'id':'spModalLayer'+"_"+dialog_uid,'class':'spModalLayer'}).setStyles({
        'position':(quirksOn) ? 'absolute' : 'fixed',
        'z-index':'10000',
        'border':border_width + 'px solid ' + border_color,
        'border-top':'0px',
        'font-family':'Verdana',
        'opacity': '0',
        'min-width':150,
        'min-height':150,
        'background':'#FFFFFF url(../visualweb/images/dialog_loader.gif) no-repeat center center',
        'padding':'0px'
      }),
      resource_container : new Element('div').setStyles({
        'position':'relative',
        'left':'0px',
        'width':'100%',
        'opacity': '1',
        'overflow': 'hidden',
        'top': '-1px'
      }),
      resource_container_wrapper : new Element('div').setStyles({
        'position':'relative',
        'left':'0px',
        'opacity': '1',
        'height':dialog_height-parseInt(border_width),
        'overflow-x': 'hidden',
        'overflow-y': 'auto'
      }),
      cinema : new Element('div',{'id':'cinema'}).setStyles({
        'position': (quirksOn) ? 'absolute' : 'fixed',
        'top':'0',
        'left':'0',
        'z-index':'9999',
        'width':'100%',
        'border':'0',
        'background':mask_color,
        'opacity': '0'
      }),
      close_btn : new Element('div',{'id':'spModalLayer_closebtn'+"_"+dialog_uid,'title':'close layer'}).setStyles({
        'position':'absolute',
        'width':'24px',
        'height':'24px',
        'top':'-12px',
        'right':-(parseInt(border_width)+12)+'px',
        'background':'url(../visualweb/images/dialog_closebtn.png) no-repeat center center',
        'cursor':'pointer',
        'z-index':'10001'
      }).addEvent('click',function(){_this_dialog.close()}),
      resize_handler : new Element('div',{'title':'drag layer'}).setStyles({
        'cursor':'se-resize',
        'background':'url(../visualweb/images/dialog_resize.png) no-repeat top right',
        '-moz-user-select':'none',
        'position':'absolute',
        'bottom':'-20px',
        'right':'-20px',
        'width':'20px',
        'height':'20px'
      }),
      drag_handler : new Element('div',{'title':'drag layer'}).setStyles({
        'width':'100%',
        'background':border_color,
        'height':border_width+"px"
      })
    }

    if(options.close_on_click_mask){
        components['cinema'].addEvent('click',function(){_this_dialog.close()});
    }

    var morphs = {
      morph_dialog : new Fx.Morph(components['dialog'],{'duration':dialog_morph_ms, link:'cancel', transition: Fx.Transitions.Quint.easeOut}),
      morph_cinema : new Fx.Morph(components['cinema'],{'duration':cinema_morph_ms, link:'chain', transition: Fx.Transitions.Quint.easeOut}),
      morph_container : new Fx.Morph(components['resource_container_wrapper'],{'duration':dialog_morph_ms, link:'cancel', transition: Fx.Transitions.Quint.easeOut})
    }

    /* METHODS */

    this.init = function(){
      //var screenSize = window.getScrollSize();
      if(quirksOn){
        components['cinema'].setStyle('height',window.getScrollHeight());
      }else{
        components['cinema'].setStyle('height','100%');
      }
      _this_dialog._open();
      if (!multiple_instances)
        window.top.modalLayerOpened=_this_dialog;
    }

    this.close = function(){
      components['resource_container'].setStyle('visibility','hidden');
      components['dialog'].setStyle('background','#FFFFFF url(../visualweb/images/dialog_loader.gif) no-repeat center center');
      morphs['morph_dialog'].start({
        'opacity': '0'
      }).chain(
        function(){
          if(in_iframe) components['resource_container'].getElement('iframe').src='';
          morphs['morph_cinema'].start({
            'opacity': '0'
          }).chain(
            function(){
              components['cinema'].destroy();
              components['dialog'].destroy();
              components['resource_container'].destroy();
              if(!show_scrollbars)
                _this_dialog.showScrollbars();
              if (!multiple_instances)
                window.top.modalLayerOpened=null;
              delete spModalLayer['propIframe_'+dialog_uid];
            }
          );
        }
      )
    }

    this.open = function(){
      this.init();
    }

    this._restZIndex = function(){
      $$('.spModalLayer').each(function(elem){
        elem.setStyle('z-index',10000);
      })
      components['dialog'].setStyle('z-index',10001);
    }

    this._open = function(){
      if(!show_scrollbars)
        this.hideScrollbars();
      var panel = components['dialog'];
      var cinema = components['cinema'];
      var resource_container = components['resource_container'];
      var close_btn = components['close_btn'];

      var resize_handler = components['resize_handler'];
      var resource_container_wrapper = components['resource_container_wrapper'];
      var drag_handler = components['drag_handler']
      panel.inject(document.body);
      drag_handler.inject(panel);

      if(draggable){
        drag_handler.setStyle('cursor','move');
        drag_handler.addEvents({
            'mouseenter':function(){
                resource_container.hide();
                close_btn.hide();
                panel.setStyles({
                    'opacity': 0.7
                });
            },
            'mouseleave':function(){
                if(!_this_dialog.isDragging){
                    panel.setStyles({
                        'opacity': 1
                    });
                    resource_container.show();
                    close_btn.show();
                }
            }
        });
        var dragger = panel.makeDraggable({
          handle: drag_handler,
          limit: {x:[0],y:[0]},
          onStart: function(el){
            _this_dialog.isDragging = true;
            resource_container.hide();
            close_btn.hide();
            panel.setStyles({
                'opacity': 0.7
            });
          },
          onDrag: function(el) {
          },
          onComplete: function(el){
                _this_dialog.isDragging = false;
              panel.setStyles({
                'opacity': 1
              })
              resource_container.show();
              close_btn.show();
          }
        });
      }
      if(resizable){
        resize_handler.inject(panel);
        resize_handler.addEvents({
            'mouseenter':function(){
                resource_container.hide();
                close_btn.hide();
                 panel.setStyles({
                    'opacity': 0.7
                  });
            },
            'mouseleave':function(){
                if(!_this_dialog.isDragging){
                     panel.setStyles({
                        'opacity': 1
                      });
                    resource_container.show();
                    close_btn.show();
                }
            }
        });
        resource_container_wrapper.makeResizable({
          handle: resize_handler,
          limit: {x:[150],y:[150]},
          onStart: function(el){
            _this_dialog.isDragging = true;
            resource_container.hide();
            close_btn.hide();
            panel.setStyles({
                'opacity': 0.7
              });
          },
          onComplete: function(el){
            _this_dialog.isDragging = false;
            panel.setStyles({
              'opacity': 1
            });
            resource_container.show();
            close_btn.show();
            if(Browser.Engine.trident)
                $('propIframe_'+dialog_uid).setStyle('width',el.getSize().x);
            /*
            var ifrHeight = $($('propIframe_'+dialog_uid).contentWindow.document.body).getElement('.grid_table').getSize().y;
            var titleHeight = $($('propIframe_'+dialog_uid).contentWindow.document.body).getElement('.ZoomTitle').getSize().y;
            resource_container.setStyles({
                'min-height':ifrHeight+titleHeight
              });
            */
          },
          onDrag: function(el){
          }
        });
      }
      close_btn.inject(panel);
      panel.setStyles({'display':'none'});

      this._restZIndex();

      panel.addEvent('mousedown',function(evt){
        _this_dialog._restZIndex();
      })

      var _build = function(){
        cinema.setStyles({'display':'block'});
        resource_container_wrapper.inject(panel);
        resource_container.inject(resource_container_wrapper);
        resource_container.setStyle('display','block');
        panel.setStyle('display','block');

        if(quirksOn){
          drag_handler.setStyles({
            'width':dialog_width
          });
        }
        resource_container_wrapper.setStyles({
            'width':(dialog_width) ? dialog_width : null,
            'height':(dialog_height) ? dialog_height : null
        });
        resource_container.setStyles({
            'height':(dialog_height) ? dialog_height : null
        });
        var dBorder = panel.getStyle('border').toInt();
        var dLeft = (dialog_width) ? ((window.getWidth()/2)-(dialog_width/2)-dBorder) : ((left) ? left : 50);
        var dTop= (dialog_height) ? ((window.getHeight()/2)-(dialog_height/2)-dBorder) : ((top) ? top : 50);
        panel.setStyles({
          'left': (left) ? left : dLeft,
          'top': (top) ? top : dTop
        })
        morphs['morph_dialog'].start({
          'opacity': '1'
        }).chain(function(){
          if(!in_iframe){
            ZtVWeb.Include(src,resource_container);
            panel.setStyle('background-image','none');
          }else{
            new Element('iframe', {
              'id': 'propIframe_'+dialog_uid,
              'src': src,
              'modallayer': 'true',
              'frameborder': '0',
              'events': {
                'load': function(){
                  panel.setStyle('background-image','none');
                  this.setStyles({
                    'display':'block'
                  });
                  spModalLayer['propIframe_'+dialog_uid]=_this_dialog;
                  if (opener_ref) {
                    var opened = document.getElementById('propIframe_'+dialog_uid).contentWindow;
                    if( opened.adjustWidthAndHeight ) opened.adjustWidthAndHeight();
                    opened.caller = opener_ref; //assegno solo se ho impostato l'opener
                    opened.close = _this_dialog.close; // sostituisco la window.close standard con la close del layer
                    opened.focus();
                  }
                }
              }
            }).setStyles( {
              'width': (Browser.Engine.trident) ? dialog_width+"px" : '100%',
              'overflow': 'hidden',
              'top': '0px',
              'border': '0',
              'display': 'none',
              'height': '100%'
            }).inject(resource_container);
          }
        });
      }

      if(modal){
        cinema.inject(document.body);
        cinema.setStyles({'display':'block'});
        morphs['morph_cinema'].start({
          'opacity': mask_opacity
        }).chain(_build);
      }else{
        _build();
      }
    }

    this.hideScrollbars = function(){
      if(window.frameElement){
        if(document.all)
          window.frameElement.contentWindow.document.body.scroll="no"
        else
          window.frameElement.setAttribute("scrolling","no")
      }else{
        if(document.all)
          document.body.scroll="no"
        else{
          document.body.setAttribute("scrolling","no")
          document.body.style.overflow = "hidden";
        }
      }
    }

    this.showScrollbars = function(){
      if(window.frameElement){
        if(document.all)
          window.frameElement.contentWindow.document.body.scroll="auto";
        else
          window.frameElement.setAttribute("scrolling","auto");
      }else{
        if(document.all)
          document.body.scroll="auto";
        else{
          document.body.setAttribute("scrolling","auto");
          document.body.style.overflow = "auto";
        }
      }
    }
  }
}

function detectDoctype(){ /* DEPRECATED: see document.compatMode=='BackCompat' */
    var re=/\s+(X?HTML)\s+([\d\.]+)\s*([^\/]+)*\//gi;
    /*********************************************
    Just check for internet explorer.
    **********************************************/
    if(typeof document.namespaces != "undefined"){
        if(document.all[0].nodeType==8)
            return true;
        else
            return false;
    }else{
        if(document.doctype != null)
            return true;
        else
            return false;
    }
}

//Object Instance
var myDialog;

function showDialog(src,width,height){
  myDialog=new spModalLayer(src,{
            'in_iframe':false, //se è a false va di include
            'draggable':false,
            'resizable':false,
            'width':width,
            'height':height,
            'mask_opacity':0.5,
            'show_scrollbars':false,
            'border_width':"20",
            'border_color':"#000000"
  });
  myDialog.open();
}


function closeDialog(){
  myDialog.close();
}

