﻿/***
 * Modal Popup
 *
 */
var ModalPopup = {
    _queue : [],
    _onShow : {},
    _onHide : {},
    _isEmptyQueue : function() {
        return ModalPopup._queue.length<1;
    },
    _hasQueue : function() {
        return ModalPopup._queue.length>0;
    },    
	setBGImgToFullWindowSize : function (maskObj){ // Mask이미지를 높이/너비 100%로 조정
		var d = document;
		var docEl = (document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
		
		var w = (window.innerWidth && window.scrollMaxX) ? 
					(window.innerWidth +window.scrollMaxX) : 
				    (docEl.scrollWidth > docEl.offsetWidth) ? 
					    docEl.scrollWidth : 
					    docEl.offsetWidth;

		var h = (window.innerHeight && window.scrollMaxY) ? 
					(window.innerHeight + window.scrollMaxY) : 
					(docEl.scrollHeight > docEl.offsetHeight) ? 
						docEl.scrollHeight : 
						docEl.offsetHeight;
						
		maskObj.style.width  =  w + 'px';
		maskObj.style.height =  h + 'px';
	},
    show : function(element, options) { 
        
        var el = $(element);
        if(typeof(el)=='undefined') return;

        // 중복 창 Open방지        
        for (var i = 0; i < ModalPopup._queue.length; i++) {
            // alert(ModalPopup._queue[i].id + ' / ' + el.id);
            if(ModalPopup._queue[i].id==el.id) return;
        }
        
        // offset은 창의 한 가운데를 기준
        // offsetX, offsetY, isShadowMode, defaultButton, shadowWidth 옵션들 초기화
        var offsetX = options['offsetX'];
        offsetX = parseInt(offsetX, 10);
        if(isNaN(offsetX)) offsetX = 0;
        
        var offsetY = options['offsetY'];
        offsetY = parseInt(offsetY, 10);
        if(isNaN(offsetY)) offsetY = 0;

        var zIndex = 500;
        
        var isShadowMode = options['isShadowMode'];
        if(isShadowMode) {
            shadowWidth = options['shadowWidth'];
            shadowWidth = parseInt(shadowWidth, 10);
            if(isNaN(shadowWidth)) shadowWidth = 4;
        }
        var defaultButton = options['defaultButton'];
        
        el.options = options;
        
        var maskBgImg = $('maskBgImg');
        if(typeof(maskBgImg)=='undefined' || maskBgImg==null){
            maskBgImg = document.createElement('DIV');
            maskBgImg.id = 'maskBgImg';
            
            var ds = maskBgImg.style;
            ds.position = 'absolute';
            ds.left = '0px';
            ds.top = '0px';
            ds.zIndex = '99';
            //ds.filter= 'alpha(opacity=10)';
            ds.background='url(http://image.aladdin.co.kr/img/mask.gif) repeat';
            
            // document.body.appendChild(maskBgImg);
            el.parentNode.appendChild(maskBgImg);
        }
        maskBgImg.style.display = 'block';
		ModalPopup.setBGImgToFullWindowSize(maskBgImg);
		
		el.style.position = 'absolute';
		el.style.zIndex = zIndex.toString();
		el.style.display = 'block';
				
		var pos = this.getScrollOffset();
		var elSize = this.getWidthAndHeight(el);
		var elSizeTemp = {}; // 나중을 위해 elSize는 값을 남겨놓음
		
		elSizeTemp['x'] = elSize['x']==0 ? 60 : elSize['x'];
		elSizeTemp['y'] = elSize['y']==0 ? 60 : elSize['y'];
		
		var docEl = (document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
		if(isOpera) docEl = document.body;
		
		var centerPos = [ parseInt(docEl.clientWidth - elSizeTemp['x'])/2, parseInt(docEl.clientHeight - elSizeTemp['y'])/2];
		el.style.top  = (parseInt(pos['y'],10) + offsetY + centerPos[1]) + 'px';
		el.style.left = (parseInt(pos['x'],10) + offsetX + centerPos[0]) + 'px';

        if(ModalPopup._isEmptyQueue()) {
            Event.observe(window, "resize", ModalPopup.onResize);
            Event.observe(document.body, 'keydown', ModalPopup.ESCKeyDown);
        }

		if(isShadowMode) {
		    // 그림자
            var elShadow = document.createElement('DIV');

            if(isGecko) shadowWidth = shadowWidth * 1.2;
            
            elShadow.id = 'popShadow_' + el.id;
            
            if(isOpera) {
                // shadowWidth = shadowWidth/2;
                Element.copy4Style(el, elShadow, 'padding');
                Element.copy4Style(el, elShadow, 'margin'); 
            } else {
                Element.copy4Style(el, elShadow, 'padding');
                Element.copy4Style(el, elShadow, 'margin');   		            
	        }
	        
            elShadow.style.top  = (parseInt(Element.getStyle(el, 'top' )) + shadowWidth) + 'px';
            elShadow.style.left = (parseInt(Element.getStyle(el, 'left')) + shadowWidth) + 'px'; 
	        elShadow.style.position = 'absolute';
	        elShadow.style.zIndex = (zIndex-1).toString();
	        elShadow.style.display = 'block';		
            elShadow.style.width  = (elSize['x']==0 ? 'auto' : elSize['x'] + 'px');
            elShadow.style.height = (elSize['y']==0 ? 'auto' : elSize['y'] + 'px');
            elShadow.style.color='red';
            elShadow.style.backgroundColor = 'black';
            
            try{
                elShadow.style.opacity = '0.4';
            }catch(ex){}
            
            try{
                elShadow.style.filter= 'alpha(opacity=40)';
            }catch(ex){}
            
            document.body.appendChild(elShadow);
        }
        
        var prevEl = ModalPopup._queue[ModalPopup._queue.length-1];
        
        /* Default 버튼 */
        try{
            if(typeof(defaultButton)!='undefined' && defaultButton!=null){
                defaultButton = $(defaultButton);
                defaultButton.focus();
            } 
        } catch(ex){}
        
        if(ModalPopup._hasQueue()) {
            prevEl.style.zIndex = "98";
            var popShadow = $('popShadow_'+ prevEl.id);
            popShadow.style.zIndex = "97";
        }
        
        var onShowFns = ModalPopup._onShow[el.id];
        if(typeof(onShowFns)!='undefined' && onShowFns!=null) {
            for(var i=0; i<onShowFns.length; i++){
                onShowFns[i].call();
            }
        }
       
        ModalPopup._queue.push(el);
    },
    hide : function(element){
        if(!ModalPopup._queue) return;

        element = $(element);

        var popEl = ModalPopup._queue.pop();
        if(popEl.id!=element.id) {
            // disabled된 window의 click처리
            ModalPopup._queue.push(popEl);
            return;
        }        
        
        element.style.display = 'none';

        var popShadow = $('popShadow_'+ element.id);
        if(typeof(popShadow)!='undefined' && popShadow!=null) {
            document.body.removeChild(popShadow);
        }
                                
        if(ModalPopup._isEmptyQueue()) {
            var maskBgImg = $('maskBgImg');
            maskBgImg.style.display = 'none';

		    // esc키등록해제
            Event.stopObserving(document.body, 'keydown', ModalPopup.ESCKeyDown);            
            Event.stopObserving(window, "resize", ModalPopup.onResize);
        } else {
            var nextEl = ModalPopup._queue[ModalPopup._queue.length-1];
            nextEl.style.zIndex = "500";
            popShadow = $('popShadow_'+ nextEl.id);
            popShadow.style.zIndex = "499";

            try{
                var defaultButton = nextEl.options['defaultButton']

                if(typeof(defaultButton)!='undefined' && defaultButton!=null){
                    defaultButton = $(defaultButton);
                    defaultButton.focus();
                }
            } catch(ex){ alert(ex); }            
        }
        
        var onHideFns = ModalPopup._onHide[element.id];
        if(typeof(onHideFns)!='undefined' && onHideFns!=null) {
            for(var i=0; i<onHideFns.length; i++){
                onHideFns[i].call();
            }
        }
    },
    getCurrentElement : function(){
        return ModalPopup._queue[ModalPopup._queue.length-1];
    },
    ESCKeyDown : function(ev){
	    if(typeof ev == 'undefined') ev = window.event;
	    if(typeof ev == 'undefined') return;
		
	    if(ev.keyCode==27) {
	        ModalPopup.hide(ModalPopup.getCurrentElement());
	        Event.stop(ev);
        }	        
    },
    onResize : function(ev){
        ModalPopup.setBGImgToFullWindowSize($('maskBgImg'));
    },
    addOnShow : function(popupName, fn){
        var onShowFns = ModalPopup._onShow[popupName];
        if(typeof(onShowFns)=='undefined' || onShowFns==null) {
            onShowFns = [];
            ModalPopup._onShow[popupName] = onShowFns;
        }
        onShowFns.push(fn);        
    },
    addOnHide : function(popupName, fn){
        var onHideFns = ModalPopup._onHide[popupName];
        if(typeof(onHideFns)=='undefined' || onHideFns==null) {
            onHideFns = [];
            ModalPopup._onHide[popupName] = onHideFns;
        }
        onHideFns.push(fn);
    },
    getScrollOffset : function (){
        var x=0;
        var y=0;

        if (self.pageYOffset) {
            // IE 외 모든 브라우저
            x = self.pageXOffset;
            y = self.pageYOffset;
        } else if(document.compatMode && document.compatMode != "BackCompat") {
            // } else if (document.documentElement && document.documentElement.scrollTop) { 이전소스에 문제!
             
            // Explorer 6 Strict
            x = document.documentElement.scrollLeft;
            y = document.documentElement.scrollTop;
        } else if (document.body) { 
            // IE 브라우저
            x = document.body.scrollLeft;
            y = document.body.scrollTop;
        }
        return {'x':x, 'y':y};
    },
    getWidthAndHeight : function(el){
        var el = $(el);
        var esw = 0;
        var esh = 0;

        esw = parseInt(Element.getStyle(el, 'width'));
        esh = parseInt(Element.getStyle(el, 'height'));
        
        if(isNaN(esw)) esw = 0;
        if(isNaN(esh)) esh = 0;
        return {'x':esw, 'y':esh};   
    }    
}