
/**
 * @author HP
 */
AE.namespace('AE.app');
if (!AE.app.dialog) {
    /**
     * dialog app
     */
    AE.app.dialog = function() {
        this.config = {
            tempContentId: '',
            closeClassName: '',
            contentClassName: '',
            contentTop: null,
            fixed: false,
            maskColor: '#666',
            maskDivId: 'ae-mask',
            zIndex: 1024,
            title: 'title',
            contentHTML: '',
            callback: null
        };
        this.cache = {
            isIE6: false,
            contentEl: null
        };
    };
    AE.app.dialog.prototype = {
        init: function(customConfig) {
            var config = YL.merge(this.config, customConfig || {});
            var _self = this;
            _self.config = config;
            //增加content元素到body
            var contentEl;

            if (AE.bom.isIE6) {
                this.cache.isIE6 = true;
            }

            contentEl = _self._addContentDom();
            this.cache.contentEl = contentEl;
            //增加title
            _self._appendTitle(contentEl);
            //增加content
            _self._appendContent(contentEl);
            //加载相应dom元素
            _self._run({
                contentEl: contentEl
            });
            //绑定事件
            _self._bindActions({
                contentEl: contentEl
            });
        },
        _appendTitle: function(contentEl) {
            if (this.config.title.length != 0) {
                var titleEl = document.createElement('h3');
                var titleTextEl = document.createTextNode(this.config.title);
                titleEl.appendChild(titleTextEl);
                contentEl.appendChild(titleEl);
            }
        },
        _appendContent: function(contentEl) {
            var contentTempEl = document.createElement('div');
            contentTempEl.innerHTML = this.config.contentHTML;
            contentEl.appendChild(contentTempEl);
        },
        _bindActions: function(args) {
            var _self = this;
            var config = _self.config;
            var contentEl = args.contentEl;
            YUE.on(window, 'resize', _self._onResize, {
                _self: _self,
                contentEl: contentEl
            });
            var closeEl = YUD.getElementsByClassName(config.closeClassName, 'a', contentEl)[0];
            YUE.on(closeEl, 'click', _self._close, {
                _self: _self
            });
            YUE.on(document, 'keyup', _self._onKeyup, {
                //没有绑定keypress的原因是chrome浏览器不响应esc的press
                _self: _self,
                config: config,
                contentEl: contentEl
            });
            YUE.on(document, 'keydown', _self._onKeydown, {
                _self: _self,
                config: config,
                contentEl: contentEl
            });
            if (_self.cache.isIE6 && _self.config.fixed) {
                //只有IE6需要绑定scroll方法，因为不支持position:fixed
                YUE.on(window, 'scroll', _self._scroll, {
                    _self: _self,
                    config: config,
                    contentEl: contentEl
                });
            }
        },
        _onKeydown: function(ev, args) {
            var _self = args._self;
            var config = _self.config;
            var contentEl = args.contentEl;
        },
        _onKeyup: function(ev, args) {
            var _self = args._self;
            var config = _self.config;
            var contentEl = args.contentEl;
            if (ev.keyCode == 27) {
                //用户按下了esc键
                _self.close();
            }
        },
        _addContentDom: function() {
            //把隐藏的dialog元素的innerHTML取出来添加到body元素中
            var _self = this;
            var config = _self.config;
            var tempContentEl = YUD.get(config.tempContentId);
            tempContentEl.style.zIndex = (config.zIndex + 1);
            tempContentEl.style.display = 'block';
            return tempContentEl;
        },
        _scroll: function(ev, args) {
            var _self = args._self;
            var config = args.config;
            var contentEl = args.contentEl;

            var top = _self._computeStyleTop({contentEl: args.contentEl});
            contentEl.style.top = top + 'px';
        },
        _close: function(ev, args) {
            var _self = args._self;
            var config = _self.config;
            //关闭对话框事件
            var maskEl = YUD.get(config.maskDivId);
            if (maskEl) {
                maskEl.parentNode.removeChild(maskEl);
                var contentEl;
                var oSrcElement = ev.target || ev.srcElement;
                YUE.removeListener(oSrcElement, 'click', _self._close);
                contentEl = oSrcElement.parentNode;
                contentEl.style.display = 'none';
                contentEl.innerHTML = '<a href="#" class="' + _self.config.closeClassName + '"></a>';
                //取消绑定document的esc事件
                YUE.removeListener(document, 'keyup', _self._onKeyup);
            }
            YUE.removeListener(window, 'resize', _self._onResize);
            //执行回调方法
            if (_self.config.callback) {
                _self.config.callback();
            }
            YUE.stopEvent(ev);
        },
        // 计算dialog居中时候的top值
        _computeStyleTop: function(args) {
            var _self = this;
            var contentEl = args.contentEl,
                styleTop = null;

            if (!!_self.config.contentTop) {
                styleTop = _self.config.contentTop + 'px';
            }else {
                styleTop = (document.documentElement.clientHeight - contentEl.offsetHeight) / 2;
                if (_self.cache.isIE6) {
                    styleTop = styleTop + YUD.getDocumentScrollTop();
                }
            }
            return parseInt(styleTop, 10);
        },
        _adjustPosition: function(args) {
            //调整对话框位置
            var _self = args._self;
            var config = args.config;
            var contentEl = args.contentEl;
            var maskElWidth = parseFloat(_self._getComputedStyle(contentEl, 'width'));
            if (!isNaN(maskElWidth)) {
                contentEl.style.left = parseInt((document.body.clientWidth - maskElWidth) / 2) + 'px';
            }

            var top = _self._computeStyleTop({contentEl: args.contentEl});
            contentEl.style.top = top + 'px';
        },
        _run: function(args) {
            //加载对话框DOM结构
            var _self = this;
            var config = _self.config;
            var maskEl;
            maskEl = document.createElement('div');
            maskEl.id = config.maskDivId;
            maskEl.style.opacity = 0.5;
            maskEl.style.width = YUD.getDocumentWidth() + 'px';
            maskEl.style.height = document.documentElement.clientHeight + 'px';
            maskEl.style.filter = 'alpha(opacity = 50)';
            maskEl.style.zIndex = config.zIndex;
            if (_self.cache.isIE6) {
                maskEl.style.height = YUD.getDocumentHeight() + 'px';
                var iframe = document.createElement('iframe');
                iframe.style.position = 'absolute';
                iframe.style.top = 0;
                iframe.style.left = 0;
                iframe.style.opacity = 0.5;
                iframe.src = 'https://img.escrow.alibaba.com/js/5v/util/blank.html';
                iframe.style.width = YUD.getDocumentWidth() + 'px';
                iframe.style.height = YUD.getDocumentHeight() + 'px';
                iframe.style.backgroundColor = config.maskColor;
                iframe.style.filter = 'alpha(opacity = 50)';
                iframe.style.zIndex = config.zIndex;
                maskEl.appendChild(iframe);
            }
            document.body.appendChild(maskEl);
            _self._adjustPosition({
                _self: _self,
                config: config,
                contentEl: args.contentEl
            });
            YUD.getElementsByClassName(config.closeClassName, 'a', args.contentEl)[0].focus();
        },
        _onResize: function(ev, args) {
            //用户改变浏览器大小事件
            var _self = args._self;
            var config = _self.config;
            var maskEl = YUD.get(config.maskDivId);
            var contentEl = args.contentEl;
            if (contentEl && maskEl) {
                maskEl.style.width = '0';//需要重新计算没有mask框时网页的宽度
                _self._adjustPosition({
                    _self: _self,
                    config: config,
                    contentEl: args.contentEl
                });
                maskEl.style.width = document.documentElement.scrollWidth + 'px';//YUI的一个bug，不能使用YUD.getDocumentHeight()
                if (_self.cache.isIE6) {
                    maskEl.style.height = YUD.getDocumentHeight() + 'px';
                }
                else {
                    maskEl.style.height = document.documentElement.clientHeight + 'px';
                }
            }
        },
        _getComputedStyle: function(el, style) {
            var result = '';
            if (window.getComputedStyle) {
                result = window.getComputedStyle(el, null)[style];
            }
            else {
                result = el.currentStyle[style];
            }
            return result;
        },
        close: function() {
            //对外方法，用于关闭对话框
            var config = this.config;
            var closeEl = YUD.getElementsByClassName(config.closeClassName, 'a', this.cache.contentEl)[0];
            if (document.createEvent) {
                var evt = document.createEvent('MouseEvents');
                evt.initEvent('click', true, true);
                closeEl.dispatchEvent(evt);
            }
            else {
                closeEl.click();
            }
        }
    };
}

