/**
 * Copyright (c) ztgame.com All rights reserved.
 * 
 * v 0.1.0 - 2008/04/08 by Fuchun
 * 
 * Requires jQuery 1.2+
 * Requires core.js 0.1+
 */

var _ajax_loader = null;

var AjaxLoader = function(handle) {
    //return new AjaxLoader.prototype.init(handle);
    this.init(handle);
};

AjaxLoader.GetInstance = function(handle) {
    if(_ajax_loader == null) {
        _ajax_loader = new AjaxLoader(handle);
    }
    return _ajax_loader;
};

AjaxLoader.TEXT = '.ajax-text';
AjaxLoader.IMAGE = '.ajax-image';
AjaxLoader.CLOSE = '.ajax-close';

AjaxLoader.prototype = {
    init: function(handle) {
        this.options = {
            loadImg: PATH.image+'/ajax_loader.gif',
            successImg: PATH.image+'/success.gif',
            failureImg: PATH.image+'/failure.gif'
        };
        this.loader = null;
        this.position = false;
        this.queue =  "ajaxLoader";
    },
    
    load: function(text, callback) {
        this.loader = this.__assemble(this.options.loadImg, text);
        this.loader.find(AjaxLoader.CLOSE).hide();
        if(!this.position) this.__goto();
        if(callback)
            this.loader.show('fast', callback);
        else
            this.loader.show('fast');
    },
    
    success: function(text, callback) {
        this.loader = this.__assemble(this.options.successImg, text);
        this.loader.find(AjaxLoader.CLOSE).hide();
        this.loader.find(AjaxLoader.IMAGE).html('<img alt="" src="'+this.options.successImg+'"/>');
        this.loader.find(AjaxLoader.TEXT).html(text);
        this.__changeStyle();
        if(!this.position) this.__goto();
        var $this = this;
        setTimeout(function() {
        if(callback)
            $this.loader.hide('fast', callback);
        else
            $this.loader.hide('fast');
        }, 1500);
    },
    
    /** 载入完成 */
    complete: function(text, callback) {
        this.success(text, callback);
    },
    
    /** 手动关闭Ajax载入状态框 */
    close: function(callback) {
        var $this = this;
        if(callback)
            $this.loader.hide('fast', callback);
        else 
            $this.loader.hide('fast');
    },
    
    /** 操作失败，或者载入失败！ */
    failure: function(text, callback) {
        this.loader = this.__assemble(this.options.successImg, text);
        this.loader.find(AjaxLoader.CLOSE).hide();
        this.loader.find(AjaxLoader.IMAGE).html('<img alt="" src="'+this.options.failureImg+'"/>');
        this.loader.find(AjaxLoader.TEXT).html(text);
        this.__changeStyle();
        if(!this.position) this.__goto();
        var $this = this;
        setTimeout(function() {
        if(callback)
            $this.loader.hide('fast', callback);
        else
            $this.loader.hide('fast');
        }, 2000);
    },
    
    /** 组装提示框 */
    __assemble: function(image, text) {
        var loader = $('.ajax-loader');
        if(loader.length > 0) return loader.css('display', 'block');
        var b = new StringBuilder();
        b.append('<div class="ajax-loader">');
        b.append('<div class="ajax-close" onclick="jQuery(\'.ajax-loader\').hide(\'fast\');" style="display:hidden;"></div>');
        b.append('<div class="ajax-image"><img alt="" src="'+image+'"/></div>');
        b.append('<div class="ajax-text fB f_f f14 ta_c">'+text+'</div>');
        b.append('</div>');
        loader = $(b.toString());
        loader.appendTo('body')[0];
       // $circle.addIframe(loader);                        //遮挡下拉
        var bs = [$dom.clientWidth()+$dom.scrollLeft(), $dom.clientHeight()];
        var sz = [loader.width(), loader.height()];
        loader.setXY([(bs[0]/2)-(sz[0]/2), (bs[1]/4)+$dom.scrollTop()]);
        return loader;
    },
    
    /** 提示信息长度过长时更改提示框样式 */
    __changeStyle: function() {
        if(FUI.fn.length(this.loader.find(AjaxLoader.TEXT).html())>30) {
            this.loader.find(AjaxLoader.TEXT).removeClass('f14');
            //this.loader.find('.ajax-text').
            if(FUI.fn.length(this.loader.find(AjaxLoader.TEXT).html())>39) {
                this.loader.find(AjaxLoader.TEXT).css({top:'12px',height:'40px'});
            }
        } else {
            this.loader.find(AjaxLoader.TEXT).addClass('f14');
            if(this.loader.find(AjaxLoader.TEXT).css('top')>=12) {
                this.loader.find(AjaxLoader.TEXT).css({top:'22px',height:'20px'});
            }
        }
    },
    
    /** 定位提示框！ */
    __goto: function() {
        var bs = [$dom.clientWidth()+$dom.scrollLeft(), $dom.clientHeight()];
        var sz = [0, 0];
        if(this.loader.length <= 0 || this.loader.css('display')=='none') {
            this.position = false;
            return;
        } else {
            this.position = true;
            sz = [this.loader.width(), this.loader.height()];
            this.loader.setXY([(bs[0]/2)-(sz[0]/2), (bs[1]/4)+$dom.scrollTop()]);
            var $this = this;
            setTimeout(function() {$this.__goto();}, 100);
        }
    }
};

var _confirm_instance = null;

/** 确认提示框类 */
var Confirm = function(handle, confirmCallback, cancelCallback) {
    this.init(handle, confirmCallback, cancelCallback);
};

/** 返回Confirm的唯一实例。*/
Confirm.GetInstance = function(handle, confirmCallback, cancelCallback) {
    if(_confirm_instance == null) {
        _confirm_instance = new Confirm(handle, confirmCallback, cancelCallback);
    }
    return _confirm_instance.init(handle, confirmCallback, cancelCallback);
    //return new Confirm(handle, confirmCallback, cancelCallback);
};

Confirm.prototype = {
    init: function(handle, confirmCallback, cancelCallback) {
        this.ohandle = $.extend({
            text: '确认吗？',
            content: '若不进行任何操作，请点取消或关闭该提示框！'
        }, handle || {});
        this.txtTitle = this.ohandle.text;
        this.txtContent = this.ohandle.content;
        this.confirmCallback = confirmCallback || null;
        this.cancelCallback = cancelCallback || null;
        this.confirmId = '_green_confirm';
        this.cfButtonId = '_btn_confirm'; // 确认按钮ID
        this.ccButtonId = '_btn_cancel';  // 取消按钮ID
        this.closeButtonId = '_btn_close_confirm'; // 关闭提示框按钮ID
        this.oConfirm = this.__assemble();
        this.__goto();
        return this;
    },
    
    /** 设置或获取提示标题。 */
    title: function(text) {
        if( text )
            this.txtTitle = text;
        else
            return this.txtTitle;
    },
    
    /** 设置或获取提示内容。 */
    content: function(text) {
        if( text )
            this.txtContent = text;
        else
            return this.txtContent;
    },
    
    /** 点击确认执行的方法。 */
    confirm: function(callback) {
        if(callback)
            this.oConfirm.hide('fast', callback);
        else
            this.oConfirm.hide('fast');
    },
    
    /** 点击取消执行的方法。 */
    cancel: function(callback) {
        if(callback)
            this.oConfirm.hide('fast', callback);
        else
            this.oConfirm.hide('fast');
    },
    
    /** 组装确认提示框 */
    __assemble: function() {
        var oConfirm = $('#'+this.confirmId);
        var $this = this;
        if(oConfirm.length > 0) {
            $('#'+this.closeButtonId).removeAttr('onclick').unbind();
            $('#'+this.cfButtonId).removeAttr('onclick').unbind();
            $('#'+this.ccButtonId).removeAttr('onclick').unbind();
            $('#'+this.closeButtonId).bind('click', function(){$this.cancel($this.cancelCallback);});
            $('#'+this.cfButtonId).bind('click', function(){$this.confirm($this.confirmCallback);});
            $('#'+this.ccButtonId).bind('click', function(){$this.cancel($this.cancelCallback);});
            $('#_confirm_title').text(this.txtTitle);
            $('#_confirm_content').text(this.txtContent);
            
            oConfirm.show();
            return oConfirm;
        }
        var b = new StringBuilder();
        b.append('<div id="'+this.confirmId+'" class="popup-wrapper confirm-wrapper">\n');
        b.append('  <div class="popup-container confirm-container">\n');
        b.append('    <div class="sys-bar">\n');
        b.append('      <span class="sys-title fs05">确认提示框</span>\n');
        b.append('      <span class="sys-close" id="'+this.closeButtonId+'" title="关闭提示框"></span>\n');
        b.append('    </div>\n');
        b.append('    <div class="sys-content confirm-content">\n');
        b.append('      <div class="confirm-title"><h4 id="_confirm_title">'+this.txtTitle+'</h4></div>\n');
        b.append('      <div class="confirm-info f_f">\n');
        b.append('      <span class="icons01 ic_notice">&nbsp;</span><span id="_confirm_content">' + this.txtContent + '</span>\n');
        b.append('      </div>\n');
        b.append('      <div class="confirm-handle">\n');
        b.append('      <input type="button" id="'+this.cfButtonId+'" class="sys-btn" value="确 认" />\n');
        b.append('&nbsp;&nbsp;&nbsp;\n<input type="button" id="'+this.ccButtonId+'" class="sys-btn" value="取 消"/>\n');
        b.append('      </div>\n');
        b.append('    </div>\n');
        b.append('  </div>\n');
        b.append('  <div class="popup-shadow confirm-shadow"></div>\n');
        b.append('</div>');
        oConfirm = $(b.toString());
        oConfirm.appendTo('body')[0];
        var bs = [$dom.clientWidth()+$dom.scrollLeft(), $dom.clientHeight()];
        var sz = [oConfirm.width(), oConfirm.height()];
        oConfirm.setXY([(bs[0]/2)-(sz[0]/2), (bs[1]/4)+$dom.scrollTop()]);
        $('#'+this.closeButtonId).unbind();
        $('#'+this.cfButtonId).unbind();
        $('#'+this.ccButtonId).unbind();
        $('#'+this.closeButtonId).bind('click', function(){$this.cancel($this.cancelCallback);});
        $('#'+this.cfButtonId).bind('click', function(){$this.confirm($this.confirmCallback);});
        $('#'+this.ccButtonId).bind('click', function(){$this.cancel($this.cancelCallback);});
        oConfirm.show();
        return oConfirm;
    },
    
    /** 定位确认提示框 */
    __goto: function() {
        var bs = [$dom.clientWidth()+$dom.scrollLeft(), $dom.clientHeight()];
        var sz = [0, 0];
        if(this.oConfirm.length <= 0 || this.oConfirm.css('display')=='none') {
            return;
        } else {
            sz = [this.oConfirm.width(), this.oConfirm.height()];
            this.oConfirm.setXY([(bs[0]/2)-(sz[0]/2), (bs[1]/4)+$dom.scrollTop()]);
            var $this = this;
            setTimeout(function() {$this.__goto();}, 100);
        }
    }
};

(function(jQuery) {
    
    var $j = jQuery;
    
    $j.ajaxLoader = function() {
        return AjaxLoader.GetInstance();
    };
    
    $j.confirm = function(handle, confirmCallback, cancelCallback) {
        Confirm.GetInstance(handle, confirmCallback, cancelCallback);
    };
    
})(jQuery);