
var BaseDialog = function(mixedElement, maxWidth, showMask, autoResize, async) {
    this.identifer = new Date().getTime();
    BaseDialog.instances[this.identifer] = this;
    this.setMaxWidth(maxWidth);
    this.setShowMask(showMask);
    this.setAutoResize(autoResize);
    this.setContent(mixedElement);
}

BaseDialog.instances      = {};
BaseDialog.mask_id        = '_quan_dialog_mask_';
BaseDialog.content_div_id = '_quan_dialog_show_div_';
BaseDialog.selectElements = new Array();
BaseDialog.objectElements = new Array();
BaseDialog.toggleObj      = false;

BaseDialog.buttons = {'confirm':'确定', 'cancel': '取消'};
BaseDialog.config = {};
BaseDialog.config['overflow']  = 'auto';
BaseDialog.requesting = false;

BaseDialog.context = null;

BaseDialog.getWindowSize = function () {
    var size = {};
    size.x   = Math.max(document.documentElement.clientWidth,document.body.clientWidth);
    size.y   = document.all ?
                (document.documentElement.clientHeight > 0 ?
                  document.documentElement.clientHeight :
                  document.body.clientHeight) :
                window.innerHeight;
    return size;
}

BaseDialog.getContext = function() {
    if(BaseDialog.context == null) {
        var wrap = document.getElementById("body-wrap-bg");
        if(wrap){
            return wrap;
        } else {
            return document.body;
        }
    }
    return  BaseDialog.context;
}

BaseDialog.getWindowScroll = function () {

    var bodyWrap = document.getElementById('body-wrap'); 
    var bodyWrapScrollTop = bodyWrap ? bodyWrap.scrollTop : 0;
    var bodyWrapScrollHeight = bodyWrap ? bodyWrap.scrollHeight : 0;

    var size    = {};
    size.top    = bodyWrapScrollTop
                    || window.pageYOffset
                    || document.documentElement.scrollTop
                    || document.body.scrollTop;

    if(document.all) {
     size.height = Math.max(document.documentElement.offsetHeight,document.documentElement.scrollHeight, document.body.scrollHeight, bodyWrapScrollHeight);
    } else {
     size.height = Math.max(document.body.scrollHeight,document.documentElement.scrollHeight, bodyWrapScrollHeight);
    }
    return size;
}

BaseDialog.getFitPos = function () {
    var position        = {};

    var window_size     = BaseDialog.getWindowSize();
    var window_scroll   = BaseDialog.getWindowScroll();

    position.x          = (window_size.x - BaseDialog.content_div.clientWidth)/2;
    position.y          = window_scroll.top + (window_size.y - BaseDialog.content_div.clientHeight)/2;

    return position;
}

BaseDialog.initMask = function (isShowMask) {
    BaseDialog.isShowMask = (isShowMask == true);
    if(BaseDialog.mask){
        BaseDialog.mask.style.display = '';
    } else {
        BaseDialog.mask             = document.createElement("DIV");
        BaseDialog.mask.id          = BaseDialog.mask_id;
        BaseDialog.mask.style.position  = "absolute";
        BaseDialog.mask.style.backgroundColor = "#333";
        BaseDialog.mask.style.left  = "0px";
        BaseDialog.mask.style.top   = "0px";
        BaseDialog.mask.style.zIndex    = "10000";
        BaseDialog.mask.style.width     = BaseDialog.getWindowSize().x + "px";
        BaseDialog.mask.style.height    = BaseDialog.getWindowScroll().height + "px";
        BaseDialog.mask.style.filter    = "Alpha(opacity=50)";
        BaseDialog.mask.style.opacity   = 0.5;
        BaseDialog.getContext().appendChild(BaseDialog.mask);
    }

    if(!BaseDialog.isShowMask) {
        BaseDialog.mask.style.left      = parseInt(BaseDialog.content_div.style.left) + 5 + 'px';
        BaseDialog.mask.style.top       = parseInt(BaseDialog.content_div.style.top) + 5 + 'px';
        BaseDialog.mask.style.width     = parseInt(BaseDialog.content_div.clientWidth) + 2 + 'px';
        BaseDialog.mask.style.height    = parseInt(BaseDialog.content_div.clientHeight) + 2 + 'px';
    } else {
        BaseDialog.mask.style.left  = "0px";
        BaseDialog.mask.style.top   = "0px";
        BaseDialog.mask.style.width     = BaseDialog.getWindowSize().x + "px";
        BaseDialog.mask.style.height    = BaseDialog.getWindowScroll().height + "px";
    }
    return true;
}

BaseDialog.initContent = function(element) {
    if(!BaseDialog.content_div) {
        BaseDialog.content_div          = document.createElement("DIV");
        BaseDialog.content_div.id       = BaseDialog.content_div_id;
        BaseDialog.content_div.style.position = "absolute";
        BaseDialog.content_div.style.zIndex   = "10001";
        BaseDialog.getContext().appendChild(BaseDialog.content_div);
    }

    if(element) {
        if(typeof(element) == 'object') {
            BaseDialog.content_div.appendChild(element);
            this.element = element;
            this.element.style.display = '';
        } else if(typeof(element) == 'string') {
            BaseDialog.content_div.innerHTML = element;
        }

        BaseDialog.content_div.style.visibility = "hidden";
        BaseDialog.content_div.style.display    = '';

        if(BaseDialog.maxWidth) {
            if((parseInt(BaseDialog.content_div.clientWidth) > parseInt(BaseDialog.maxWidth))){
                BaseDialog.content_div.style.width =  parseInt(BaseDialog.maxWidth) + 'px';
                BaseDialog.content_div.style.overflow = BaseDialog.config.overflow;
            }
        }else {
            BaseDialog.content_div.style.width = '';
            BaseDialog.content_div.style.overflow = '';
        }

        BaseDialog.content_div.style.left       = BaseDialog.getFitPos().x + 'px';
        BaseDialog.content_div.style.top        = BaseDialog.getFitPos().y + 'px';
        BaseDialog.content_div.style.visibility = '';
    }

    //fuck firefox
    try {BaseDialog.content_div.focus();} catch(e) {}
    return true;
}

BaseDialog.init = function (content,mask,autoResize, maxWidth) {

    BaseDialog.maxWidth = maxWidth;
    BaseDialog.initContent(content);

    BaseDialog.initMask(mask);
    BaseDialog.toggleSelect(true);

    if(BaseDialog.toggleObj) {
        BaseDialog.toggleObject(true);
    }

    BaseDialog.isAutoResize = autoResize;

    if(BaseDialog.isAutoResize) {
        BaseDialog.attachEvent();
    }

    return true;
}

BaseDialog.hiddenMask   = function () {
    BaseDialog.mask.style.display = 'none';
}

BaseDialog.hiddenBaseDialog = function () {
    BaseDialog.content_div.style.display = 'none';
}

BaseDialog.close = function () {
    BaseDialog.content_div.style.width = '';
    BaseDialog.content_div.style.overflow = '';

    if(this.element) {
        BaseDialog.getContext().appendChild(this.element);
        this.element.style.display = 'none';
        this.element = null ;
    }
    BaseDialog.content_div.innerHTML = '';

    BaseDialog.toggleSelect(false);
    BaseDialog.toggleObject(false);
    BaseDialog.detachEvent();
    BaseDialog.hiddenBaseDialog();
    BaseDialog.hiddenMask();
}

BaseDialog.detachEvent= function () {
    if(window.attachEvent){
        window.detachEvent("onresize", BaseDialog.onResize);
        window.detachEvent("onscroll", BaseDialog.onScroll);
        document.body.detachEvent("onkeyup",  BaseDialog.onKeyUp);

    }else if( window.addEventListener){
        window.removeEventListener("resize", BaseDialog.onResize, false);
        window.removeEventListener("scroll", BaseDialog.onScroll, false);
        window.removeEventListener("keyup", BaseDialog.onKeyUp, false);
    }

    BaseDialog.bodyWrapDetachEvent(); 
}

BaseDialog.attachEvent= function () {
    if(window.attachEvent){
        window.attachEvent("onresize", BaseDialog.onResize);
        window.attachEvent("onscroll", BaseDialog.onScroll);
        document.body.attachEvent("onkeyup",  BaseDialog.onKeyUp);
    }else if(window.addEventListener){
        window.addEventListener("resize", BaseDialog.onResize, false);
        window.addEventListener("scroll", BaseDialog.onScroll, false);
        window.addEventListener("keyup", BaseDialog.onKeyUp, false);
    }

    BaseDialog.bodyWrapAttachEvent();
}

BaseDialog.fitBaseDialog = function () {
    if(BaseDialog.content_div){
        BaseDialog.content_div.style.left = BaseDialog.getFitPos().x + 'px';
        BaseDialog.content_div.style.top  = BaseDialog.getFitPos().y + 'px';
    }
}

BaseDialog.fitMask = function () {
    if(BaseDialog.mask){
        if(BaseDialog.isShowMask) {
            BaseDialog.mask.style.width  = BaseDialog.getWindowSize().x + "px";
            BaseDialog.mask.style.height = BaseDialog.getWindowScroll().height + "px";
        } else {
            BaseDialog.mask.style.left = parseInt(BaseDialog.content_div.style.left) + 5 + 'px';
            BaseDialog.mask.style.top  = parseInt(BaseDialog.content_div.style.top) + 5 + 'px' ;
            BaseDialog.mask.style.width = parseInt(BaseDialog.content_div.clientWidth) + 2 + 'px';
            BaseDialog.mask.style.height = parseInt(BaseDialog.content_div.clientHeight) + 2 + 'px';
        }
    }
}

BaseDialog.onScroll = function () {
    BaseDialog.fitBaseDialog();
    if(!BaseDialog.isShowMask) {
        BaseDialog.fitMask();
    }
}

BaseDialog.onResize = function () {
    BaseDialog.fitBaseDialog();
    BaseDialog.fitMask();
}

BaseDialog.onKeyUp = function (e) {
    var event = window.event ? window.event : e;
    if(event.keyCode == 27){
        for(var i in Dialog.instances) {
            Dialog.instances[i].close();
        }

        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
        return true;
   }


   return true;
}

// fuck ie
BaseDialog.toggleSelect = function (hidden){
    if(hidden && BaseDialog.selectElements == '') {
        var selectElements = document.getElementsByTagName('select');
        for(var i=0; i<selectElements.length; i++) {
            if(selectElements[i].style.visibility !='hidden') {
                selectElements[i].style.visibility ='hidden';
                BaseDialog.selectElements.push(selectElements[i]);
            }
        }
    } else if(hidden == false){
        for(var i =0; i<BaseDialog.selectElements.length; i++) {
            BaseDialog.selectElements[i].style.visibility = '';
            delete(BaseDialog.selectElements[i]);
        }
        delete(BaseDialog.selectElements);
        BaseDialog.selectElements = new Array();
    }
    return true;
}


BaseDialog.toggleObject = function (hidden){

    if(hidden && BaseDialog.objectElements == '') {
        var objectElements = document.getElementsByTagName('object');
        for(var i=0; i<objectElements.length; i++) {
            if(objectElements[i].style.visibility !='hidden') {
                objectElements[i].style.visibility ='hidden';
                BaseDialog.objectElements.push(objectElements[i]);
            }
        }

        var objectElements = document.getElementsByTagName('embed');
        for(var i=0; i<objectElements.length; i++) {
            if(objectElements[i].style.visibility !='hidden') {
                objectElements[i].style.visibility ='hidden';
                BaseDialog.objectElements.push(objectElements[i]);
            }
        }

    } else if(hidden == false){
        for(var i =0; i<BaseDialog.objectElements.length; i++) {
            BaseDialog.objectElements[i].style.visibility = '';
            delete(BaseDialog.objectElements[i]);
        }
        delete(BaseDialog.objectElements);
        BaseDialog.objectElements = new Array();
    }
    return true;
}

BaseDialog.prototype = {

    maxWidth: null,
    showMask    : true,
    autoResize  : true,
    mask        : null,

    setMaxWidth : function (maxWidth){
        var cWidth = 0;
        if(((typeof maxWidth) != "undefined")  && ((cWidth = parseInt(maxWidth)) > 0)) {
            this.maxWidth = cWidth;
        }
        return this;
    },

    setContent : function (element) {
        if(typeof(element) != "undefined") {
            this.content = element;
        }

        return this;
    },

    setShowMask : function(showMask){
       return this.setSelfBool('showMask', showMask);
    },

    setAutoResize: function(autoResize) {
       return this.setSelfBool('autoResize', autoResize);
    },

   setSelfBool: function(property, value) {
       if(typeof(value) != "undefined") {
           this.setProperty(property,(value == true));
       }
       return this;
   },

   setProperty: function(property,value){
          this[property] = value;
          return this;
   },

   setRequesting: function(requesting){
          BaseDialog.requesting  = requesting;
          return this;
   },

   getRequesting: function() {
        return BaseDialog.requesting;
   },


   show: function(element) {
        this.setContent(element);
        BaseDialog.init(this.content, this.showMask, this.autoResize, this.maxWidth);
        return this;
   },

   close: function() {
     BaseDialog.close();
   }
}


var Dialog = function(options) {
    this.identifer = new Date().getTime();
    Dialog.instances[this.identifer] = this;
    this.base = new BaseDialog();
    this.options = options ? options : {};

    if(typeof(this.options.show_mask) != 'undefined') {
        this.base.setShowMask(this.options.show_mask);
    }

    if(typeof(this.options.auto_resize) != 'undefined') {
        this.base.setAutoResize(this.options.auto_resize);
    }

    if(this.options.async) {
        this.async = this.options.async;
    }

    if(this.options.max_width){
        this.base.setMaxWidth(this.options.max_width);
    }

    if(this.options.overflow){
        BaseDialog.config.overflow = this.options.overflow;
    }

    if(this.options.confirm){
        this.confirm = this.options.confirm;
    }

    if(this.options.cancel){
        this.cancel = this.options.cancel;
    }


    var toggle_obj = this.options.toggle_obj ? this.options.toggle_obj : false;

    BaseDialog.toggleObj = toggle_obj;
}

Dialog.prototype.asyncCallBack = function(response) {
    this.base.setRequesting(false);
    this.options.internal = this.asyncFormat(response);
    var html = this.formatHtml(this.options);
    this.base.setContent(html);
    this.base.show();
}

Dialog.prototype.asyncOnFailure = function(response){
    this.base.setRequesting(false);
    this.options.internal = '<div class="clew">发生错误, <a href="javascript:void(0);" onclick="window.location.reload();return false;">刷新</a>一下页面吧！</div>';
    this.options.button = {cancel:true};
    var html = this.formatHtml(this.options);
    this.base.setContent(html);
    this.base.show();
}

Dialog.prototype.asyncFormat = function(response) {
    return response;
}

Dialog.prototype.show = function() {
    if(this.base.getRequesting()) {
        return false;
    }

    if(this.async) {
        var asyncOptions = {};
        asyncOptions.title = this.options.title;
        asyncOptions.internal = '<div class="clew"><img src="http://image.360quan.com/js/common/load.gif" /></div>';
        asyncOptions.button = {no:true};
        var html = this.formatHtml(asyncOptions);

        this.base.setContent(html);
        this.base.show();
        if(this.async.options.formatAsync) {
            this.asyncFormat = this.async.options.formatAsync;
        }

        this.async.addEvent('onSuccess',this.asyncCallBack.bind(this));
        this.async.addEvent('onFailure',this.asyncOnFailure.bind(this));
        this.async.request();
        this.base.setRequesting(true);
        return this;
    }

    var html = this.formatHtml(this.options);
    this.base.setContent(html);
    this.base.show();
    return this;
}

//dependance mootools 1.11
Dialog.prototype.setAsync = function (async) {
    this.async = async;
    return this;
}

Dialog.instances = {};

Dialog.prefix = {'button':'_quan_button_'};
Dialog.content_id = '_quan_dialog_mask_content_';

Dialog.prototype.setShowMask = function (isShowMask) {
    this.base.setShowMask(isShowMask);
    return this;
}

Dialog.prototype.setMaxWidth = function (maxWidth) {
    this.base.setMaxWidth(maxWidth);
    return this;
}

Dialog.prototype.setAutoResize = function (autoResize) {
    this.base.setAutoResize(autoResize);
    return this;
}

Dialog.prototype.setoverflow = function (overflow) {
    BaseDialog.config.overflow = overflow;
    return this;
}

Dialog.prototype.confirm = function () {
    this.close();
}

Dialog.prototype.cancel = function () {
    this.close();
}

Dialog.prototype.formatHtml = function(options) {
    if(!options)options = {};
    var title = options.title ? options.title : '提示';

    var content_class = this.options.content_class ? this.options.content_class : 'alertWrap';

    var internal = options.internal ? options.internal : '';
    var strHtml = '';
    strHtml += '<div class="' + content_class + '" id="' + Dialog.content_id + '" style="position:static;">';
    strHtml += '    <div class="top"><a href="javascript:void(0);" class="close" onclick="Dialog.instances[\'' + this.identifer + '\'].cancel();return false;">取消</a>' + title + '</div>';

    strHtml += internal;
    strHtml += '<div class="butWrap">';
    if(options.button) {
        if(options.button.confirm) {
            var confirm_text = '确定';
            if(options.button.confirm !== true) {
                confirm_text = options.button.confirm;
            }
            strHtml += '<input type="button" value="' + confirm_text + '" name="" onclick="Dialog.instances[\'' + this.identifer + '\'].confirm();" class="but"/>';
        }

        if(options.button.cancel) {
            var cancel_text = '取消';
            if(options.button.cancel !== true) {
                cancel_text = options.button.cancel;
            }

            strHtml += '<input type="button" value="' + cancel_text + '" name=""  onclick="Dialog.instances[\'' + this.identifer + '\'].cancel();" class="but"/>';
        }

    } else {
        strHtml += '<input type="button" value="确定" name="" class="but" onclick="Dialog.instances[\'' + this.identifer + '\'].confirm();return false;"/>';
        strHtml += '<input type="button" value="取消" name="" class="but" onclick="Dialog.instances[\'' + this.identifer + '\'].cancel();return false;"/>';
    }
    strHtml += '</div>';

    strHtml += '</div>';

    return strHtml;
}

Dialog.prototype.close = function() {
    if(this.async) {
        this.async.cancel();
        this.base.setRequesting(false);
    }
    this.base.close();
    //delete(Dialog.instances[this.identifer]);
}

Dialog.prototype.setContent = function(text) {

    if(typeof (text) == 'string') {
        this.options.internal = '<div class="clew">' + text + '</div>';
    } else {
        this.options.internal = text.text;
    }
    BaseDialog.initContent(this.formatHtml(this.options));
    BaseDialog.fitMask();
    return this;
}

q_alert = window.q_alert = Dialog.alert = function(text, title, confirm_text, confirm, cancel_text, cancel, async) {
    var options = {};
    options.button = {no:true};
    if(typeof (text) == 'string') {
        options.internal = '<div class="clew">' + text + '</div>';
    } else {
        options.internal = text.text;
    }
    if(title)options.title = title;

    if(typeof(confirm_text) === 'undefined') {
        confirm_text = true;
    }

    if(confirm_text !== false){
        options.button.no = false;
        options.button.confirm = confirm_text;
    }

    if(cancel_text){
        options.button.no = false;
        options.button.cancel = cancel_text;
    }
    if(async) {
        options.async = async;
    }
    var dialog = new Dialog(options);
    if(async){
        dialog.setaAsync(async);
    }
    if(confirm)dialog.confirm = confirm;
    if(cancel)dialog.cancel = cancel;

    q_alert.close = Dialog.prototype.close.bind(dialog);

    return dialog.show();
}

Function.prototype.bind = function(obj) {
    var method     = this,
        temp       = function() {
            return method.apply(obj, arguments);
        };
    return temp;
}

BaseDialog.bodyWrapDetachEvent = function(){
    var bodyWrap = document.getElementById('body-wrap'); 
    if(bodyWrap){
        if(window.attachEvent){
            bodyWrap.detachEvent("onresize", BaseDialog.onResize);
            bodyWrap.detachEvent("onscroll", BaseDialog.onScroll);
            bodyWrap.detachEvent("onkeyup",  BaseDialog.onKeyUp);
        }else if( window.addEventListener){
            bodyWrap.removeEventListener("resize", BaseDialog.onResize, false);
            bodyWrap.removeEventListener("scroll", BaseDialog.onScroll, false);
            bodyWrap.removeEventListener("keyup", BaseDialog.onKeyUp, false);
        }
    }
}

BaseDialog.bodyWrapAttachEvent = function(){
    var bodyWrap = document.getElementById('body-wrap'); 
    if(bodyWrap){
        if(window.attachEvent){
            bodyWrap.attachEvent("onresize", BaseDialog.onResize);
            bodyWrap.attachEvent("onscroll", BaseDialog.onScroll);
            bodyWrap.attachEvent("onkeyup",  BaseDialog.onKeyUp);
        }else if(window.addEventListener){
            bodyWrap.addEventListener("resize", BaseDialog.onResize, false);
            bodyWrap.addEventListener("scroll", BaseDialog.onScroll, false);
            bodyWrap.addEventListener("keyup", BaseDialog.onKeyUp, false);
        }
    }
}
