﻿var Modal = 
{
    show: function(url, cssClass, options, enableOverlayClick)
    { 
        var container = document.getElementById('modalContainer');
        if(!container)
        {
            var options = this.setOptions(this.getOptions(), options || {});
            
            var div = this.getContainer(cssClass, options.width, options.height, options.topOffSet, options.position)
            var overlay = this.addOverlay(options.colorOverlay, enableOverlayClick);
            
            if(options.showButton)
            {
                this.getButton(div)
            }
            
            this.getIFrame(div, url, options.width, options.height, options.showBorder, options.allowtransparency);
            
            Modal.selectBug();
            
        }
        window.onresize = function()
        {
            var options = Modal.setOptions(Modal.getOptions(), options || {});
            Modal.resizeWindow(options.width + 100, options.height, options.topOffSet);
        }
    },
    getOptions: function() 
    {
        return  {
            'height'        : 600,
            'width'         : 700,
            'topOffSet'     : 30,
            'position'      : 'absolute',
            'colorOverlay'  : '#000',
            'showButton'    : true,
            'showBorder'	: true,
            'allowtransparency' : true
        };
    },
    setOptions: function(destination, source) 
    {
        for (var property in source) 
        {
            destination[property] = source[property];
        }
        return destination;
    },
    getContainer : function(cssClass, width, height, topOffSet, position)
    {
        document.body.style.padding = '0';
        var pageSize = this.getPageSize();
        var pos = this.realOffset(document.body);

        div = document.createElement('div');
        var newTopOffSet = (pageSize.windowHeight/2 - height/2 + pos[1] + topOffSet);
        if (newTopOffSet < 0)
        {
            div.style.top = topOffSet + 'px';
        }
        else
        {
            div.style.top = newTopOffSet + 'px';
        }
        
        div.style.left = (pageSize.windowWidth/2 - width/2 + pos[0]) + 'px';
        div.id = 'modalContainer';
        div.style.height = height + 'px';
        div.style.width = width + 'px';
        div.style.position = position;
        div.style.zIndex = '1000';
        if(cssClass != '')
            div.className = cssClass;
        document.body.appendChild(div);
        return div;
    },
    getButton : function(div)
    {
        input = document.createElement('input');
        input.onclick = function() { Modal.close(); };
        input.setAttribute('type','button');
    
        div.appendChild(input);
        return input;
    },
    getIFrame: function(div, url, width, height, showBorder, allowtransparency) 
    {
        iFrame = document.createElement('IFRAME');
        
        iFrame.id = 'iframe';
        iFrame.setAttribute('src', url);
        iFrame.style.height = height + 'px';
        iFrame.style.width = width + 'px';
        iFrame.style.zIndex = '1000';
        iFrame.style.border = 'none';
        if(showBorder)
			iFrame.setAttribute('scrolling','yes');
        else
			iFrame.setAttribute('scrolling','no');
			
        if(allowtransparency)
			iFrame.setAttribute('allowtransparency','true');
        else
			iFrame.setAttribute('allowtransparency','false');
        div.appendChild(iFrame);
        return iFrame;
    },
    resizeWindow : function(width, height, topOffSet) 
    {
        var container = document.getElementById('modalContainer');
        if(container != null)
        {
            var pageSize = this.getPageSize();
            var pos = this.realOffset(document.body);
            
            var newTopOffSet = (pageSize.windowHeight/2 - height/2 + pos[1] + topOffSet);
            if (newTopOffSet < 0)
            {
                container.style.top = topOffSet + 'px';
            }
            else
            {
                container.style.top = newTopOffSet + 'px';
            }
            container.style.left = (pageSize.windowWidth/2 - width/2 + pos[0])+'px';

            var overlay = document.getElementById('overlay');
            overlay.style.height = pageSize.pageHeight+'px';
        }
    },
    realOffset: function(element) 
    {
        var top = 0, left = 0;
        do 
        {
            top += element.scrollTop  || 0;
            left += element.scrollLeft || 0;
            element = element.parentNode;
        } while (element);
        
        return [left, top];
    },
    addOverlay: function(backgroundColor, enableClick)
    {
        var overlay = document.createElement('div');
        overlay.id = 'overlay';
        overlay.style.top = '0px';
        overlay.style.left = '0px';
        overlay.style.position = 'absolute';
        
        if(backgroundColor == null)
        {
            overlay.style.background = '#000';
        }
        else
        {
            overlay.style.background = backgroundColor;
        }

        this.setOpacity(overlay, 0.5);
        var pageSize = this.getPageSize();
        overlay.style.height = pageSize.pageHeight+'px';
        overlay.style.width = '100%';
        overlay.style.zIndex = '999';
        
        if(enableClick)
        {
            overlay.onclick = function(){
                                        Modal.close();
                                    }
        }
        
        document.body.appendChild(overlay);
        return overlay;
    },
    close: function() 
    {
        document.body.removeChild(document.getElementById('overlay'));
        document.body.removeChild(document.getElementById('modalContainer'));
        return false;
    },
    setOpacity: function(element, value)
    {
        if (typeof element == 'string')
        {
            element= $(element);
        }
        if (value == 1)
        {
            element.style.opacity = (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0 ;
            if(/MSIE/.test(navigator.userAgent) && !window.opera)
            {
                element.style.filter = element.style.filter.replace(/alpha\([^\)]*\)/gi,'');
            }
        } 
        else 
        {
            if(value < 0.00001) value = 0;
            {
                element.style.opacity = value;
            }
            
            if(/MSIE/.test(navigator.userAgent) && !window.opera)
            {
                element.style.filter = element.style.filter.replace(/alpha\([^\)]*\)/gi,'') + 'alpha(opacity='+value*100+')';
            }
        }
        return element;
    },
    
    getPageSize: function()
    {
        var xScroll, yScroll;
        if (window.innerHeight && window.scrollMaxY) 
        {
            xScroll = document.body.scrollWidth;
            yScroll = window.innerHeight + window.scrollMaxY;
        } 
        else if (document.body.scrollHeight > document.body.offsetHeight)
        {
            // all but Explorer Mac
            xScroll = document.body.scrollWidth;
            yScroll = document.body.scrollHeight;
        } 
        else 
        {
            // Explorer Mac...would also work in Explorer 6 Strict,
            // Mozilla and Safari
            xScroll = document.body.offsetWidth;
            yScroll = document.body.offsetHeight;
        }
          
        var windowWidth, windowHeight;
        if (self.innerHeight) 
        {      // all except Explorer
            windowWidth = self.innerWidth;
            windowHeight = self.innerHeight;
        } 
        else if (document.documentElement && document.documentElement.clientHeight) 
        {
            // Explorer 6 Strict Mode
            windowWidth = document.documentElement.clientWidth;
            windowHeight = document.documentElement.clientHeight;
        } 
        else if (document.body) 
        { // other Explorers
            windowWidth = document.body.clientWidth;
            windowHeight = document.body.clientHeight;
        }

        // for small pages with total height less then height of the viewport
        if(yScroll < windowHeight)
        {
            pageHeight = windowHeight;
        } 
        else 
        {
            pageHeight = yScroll;
        }

        // for small pages with total width less then width of the viewport
        if(xScroll < windowWidth)
        {
            pageWidth = windowWidth;
        } 
        else 
        {
          pageWidth = xScroll;
        }
        
        return {
          'pageWidth':pageWidth,
          'pageHeight':pageHeight,
          'windowWidth':windowWidth,
          'windowHeight':windowHeight,
          'yScroll':yScroll,
          'xScroll':xScroll
        };
    },
    selectBug : function()
    {
        var RUNhideFrameSelects = false
        var priorhiddenitems = new Array();
        var priorvisibleitems = new Array();
        function hideFrameSelects()
        {
            if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7)) 
            {
                for (var k = 0 ; k < tagElements.length; k++) 
                {
                    if (RUNhideFrameSelects == true)
                    {
                        if (Array.indexOf(priorvisibleitems, tagElements[k].id) == -1 && Array.indexOf(priorhiddenitems, tagElements[k].id) == -1)
                        {
                            if (tagElements[k].style.visibility == 'hidden')
                            {
                                priorhiddenitems[priorhiddenitems.length] = tagElements[k].id
                            }
                            else
                            {
                                priorvisibleitems[priorvisibleitems.length] = tagElements[k].id
                            }
                            tagElements[k].style.visibility = 'hidden';
                        }
                        else
                        {
                            tagElements[k].style.visibility = 'hidden';
                        }
                    }
                    else
                    {
                        if (Array.indexOf(priorhiddenitems, tagElements[k].id) == -1)
                        {
                            tagElements[k].style.visibility = 'visible';
                        }
                    }

                }
            }
        }
        if (RUNhideFrameSelects == true)
        {
            setTimeout('hideFrameSelects()', 500)
        }
    }

}