﻿//Ajax Message

AM_Class = Class.create(PeriodicalExecuter,{
  initialize: function($super, element) {
    $super(null, 3);
    this.element   = $(element);
    this.start = new Date();
  },
  execute: function() {
    var now = new Date();
    if(now - this.start > 5 * 1000)
    {
        this.stop();
        this.fade();
    }
    now = null;
  },
  fade : function() {
    this.element.remove();
    return;
    var opacity = this.element.getOpacity();
    if(opacity == 0) 
    {
        this.element.remove();
        return;
    }
    this.element.setOpacity(opacity - 0.05);
    this.fade.bind(this).delay(0.1);
  }
});


// Ajax Message Box
var AMB_Class = Class.create();
var __i__ = 0;
AMB_Class.prototype = {
    box : null,
    loadingSpan : null,
    loadingTimes : 0,
    initialize : function()
    {
        Event.observe(window,'load',this.buildBox.bind(this));
    },
    buildBox : function()
    {
        if(this.box != null) return;
        this.box = document.createElement("div");
        this.box.id = 'AMB';
        this.box.innerHTML = '';
        Position.absolutize(this.box);
        this.box.setStyle({
            width : '0',
            height : '0'});
        document.body.appendChild(this.box);
        this.loadingSpan = document.createElement('div');
        this.loadingSpan.innerHTML = '正在读取数据...';
        this.loadingSpan.className = 'loading hidden';
        this.box.appendChild(this.loadingSpan);
        this.setBoxPosition();
    },
    setBoxPosition : function()
    {
        var size = document.viewport.getScrollOffsets();
        this.box.setStyle({
            /* left : (size.left + document.body.clientWidth - this.box.getWidth() - 7),*/
            left : 7,
            top : (size.top + 7)
        });
        if(this.box.childNodes.length == 1 && !this.loadingSpan.className == 'loading visible')
            this.loadingSpan.className = 'loading hidden';
        else
            this.setBoxPosition.bind(this).delay(0.3);
    },
    addMessage : function(msg,isError)
    {
        this.buildBox();
        var span = document.createElement('div');
        span.innerHTML = msg;
        var firstMsg = this.loadingSpan.nextSibling;
        if(firstMsg)
        {
            this.box.insertBefore(span,firstMsg);
        }
        else
        {
            this.box.appendChild(span);
        }
        if(isError) span.className = 'error';
        new AM_Class(span);
        this.showBox();
    },
    showBox : function()
    {
        Element.show(this.box);
        this.setBoxPosition();
    },
    showLoading : function(str)
    {
        this.buildBox();
        if(str && !str.blank())
        {
            this.loadingSpan.innerHTML = str;
            this.loadingSpan.className = 'loading visible';
            this.showBox();
        }
        try{
        this.loadingTimes++;
        }catch(e){alert(e);}
    },
    hideLoading : function()
    {
        if(--this.loadingTimes <= 0) 
            this.loadingSpan.className = 'loading hidden';
    }
};

var AMB = new AMB_Class();

//AdholAjax Class

var AdholAjax = Class.create();
AdholAjax.prototype = {
    className : null,
    methodName : null,
    options : null,
    responseText : null,
    initialize : function(className,methodName,options)
    {
        this.options = {
          onLoading     :   function(){this.disable();},
          onSuccess     :   function(ret){},
          onComplete    :   function(){this.enable();AMB.hideLoading(); },
          onFailure     :   function(){this.enable();AMB.addMessage('http error!', true);AMB.hideLoading(); },
          context       :   null,
          parameters    :   '',
          disabled      :   null
        };
        Object.extend(this.options, options || { });
        this.className = className;
        this.methodName = methodName;
    },
    _onSuccess : function(res)
    {
        this.responseText = res.responseText;
        this.options.onSuccess.bind(this)(this.responseText.evalJSON());
    },
    execute : function(loading)
    {
        AMB.showLoading(loading);
        var ajax = new Ajax.Request(
            '/' + this.className + ',' + this.methodName + '.ajax', 
            {
                parameters : this.options.parameters,
                onSuccess : this._onSuccess.bind(this),
                onFailure : this.options.onFailure.bind(this),
                onLoading : this.options.onLoading.bind(this),
                onComplete : this.options.onComplete.bind(this)
            });
        ajax = null;
    },
    disable : function()
    {
        try{
        if(this.options.disabled != null)
        {
            if(Object.isString(this.options.disabled))
            {
                $w(this.options.disabled).each(function(o){$(o).disabled = true;});
            }
            else if(Object.isArray(this.options.disabled))
            {
                this.options.disabled.each(function(o){$(o).disabled = true;});
            }
            else if(Object.isElement(this.options.disabled))
            {
                this.options.disabled.disabled = true;
            }
        }
        }catch(e){alert(e.message);}
    },
    enable : function()
    {
        if(this.options.disabled != null)
        {
            if(Object.isString(this.options.disabled))
            {
                $w(this.options.disabled).each(function(o){$(o).disabled = false;});
            }
            else if(Object.isArray(this.options.disabled))
            {
                this.options.disabled.each(function(o){$(o).disabled = false;});
            }
            else if(Object.isElement(this.options.disabled))
            {
                this.options.disabled.disabled = false;
            }
        }
    }
};