/**登录、注册、检测，未登录异常处理
 * Author:张炼
 * Time:2007-7-28
 */

function HttpdataStatus(){}
HttpdataStatus.prototype = {
    httpdataStatus:1,
    toString:function(){
        if(this.description) return this.description;
        var res = "服务器端返回状态：";
        for(var i in this) if(i != "toString" && i != "httpdataStatus") res += "\r\n" + i + " = " + this[i];
        return res;
    }
}

if(!window.status || !status.ajax) {
if(window.status && !status.ajax) alert("调试信息：\r\n请不要定义status变量，这个变量会在用户登录状态检测的时候用到。\r\n\r\nby 张炼");
//状态配置对象
var status = {

    //保存httpData函数的原始地址
    httpData:jQuery.httpData,
    
    //保存html函数的原始地址
    html:jQuery.prototype.html,
    
    //保存ajax函数的原始地址
    ajax:jQuery.ajax,
    
    //ajax请求组的保存对象
    ajaxList:{},
    
    //状态标识
    key:"return=",
    
    //对不同状态的响应函数
    $:{
        "-1": function(res){alert(res.description)},
        "-2": function(res){alert(res.description)}
    },
    
    //对不同状态的描述
    description:{
        "-1":"这个操作需要登录后才能进行，请登录",
        "-2":"缺少参数"
    },
    
    //对一个状态对象进行事件绑定
    bindStatus:function(res, ret){
        res["return"] = ret;
        if(!res.description) res.description = this.description[ret];
        if(this.$[ret]) this.$[ret](res);
    },
    
    //url传参解码函数
    fromUrl:function(str){
    
        //生成一个标识为httpdataStatus的对象
	    var r = new HttpdataStatus();
	    if(str == undefined) return r;
    	
	    //解析字符串
	    var paras = str.toString().split("&");
	    for(var i = 0; i < paras.length; i++){
		    var kv = paras[i].split("=");
		    if(kv[0] != "" && kv[1] != undefined){
		    	r[unescape(kv[0])] = unescape(decodeURI(kv[1]));
		    }
	    }
    	
	    //得到状态对象
	    return r;
    },
    
    //如果正在发送请求，应该做什么？
    request: function(r){
        alert("上一次请求正在发送中，请稍候...");
    },
    
    //是否已经登录
    isLogin: function(){
        return this.cookie("uid");
    },
    
    //对是否已经登录进行检查，如果没有登录，调用处理函数处理之
    checkLogin: function(s){
        var l = this.isLogin();
        if(!l) this.bindStatus(new HttpdataStatus(), "-1");
        this.lastNeedLoginSetting = l ? null : s;
        return l;
    },
    
    //最近一次因为需要登录而没有发送的请求的Setting
    lastNeedLoginSetting: null,
    
    //取得cookie
    cookie: function(key){
	    var reg = new RegExp("(^| )"+key+"=([^;]*)(;|$)","gi");
	    var ck = reg.exec(document.cookie);
	    try{if(ck[2] == null || ck[2] == undefined) return null;}catch(e){return null;}
	    return ck[2];
    }
};

window.status = status;
}

//重写ajax
jQuery.ajax = function(s){

    //如果需要登录，检查登录
    if(s.needLogin && !status.checkLogin(s))return false;
    
    //如果在上一次请求完成之前不再发送请求或需要取消上一次请求
    if(s.key){
        //重写setting的complete函数，对请求的完成进行拦截，以设置旗标
        var c = s.complete;
        s.complete = function(xml, s2){
            status.ajaxList[s.key] = null;
            if(c) c.call(s, xml, s2);
        }
        
        var r = status.ajaxList[s.key];
        if(r){
            
            //如果需要取消上一次请求，不过会触发timeout事件
            if(s.abortLast){
                r.abort();
            }
            
            //如果在上一次请求完成之前不再发送请求
            else{
                status.request(r);
                return;
            }
        }
    }
    
    //发送ajax请求
    var h  = status.ajax(s);
    
    //设下旗标
    if(s.key) status.ajaxList[s.key] = h;
    return h;
}

//重写httpData
jQuery.httpData = function( r, type ){
    var txt = r.responseText;
    
    //如果是使用了状态标识，就取得状态对象并执行默认操作
    if(txt.substr(0, status.key.length) == status.key){
        
        //取得状态对象
        var res = status.fromUrl(txt);
        
        //取得状态标识，绑定事件
        status.bindStatus(res, res["return"]);
        
        //返回状态对象
        return res;
    }
    
    //否则调用默认的httpData
    return status.httpData( r, type );
}

//对html函数进行重写，重写原因——原html函数对于object对象不会调用toString方法
jQuery.prototype.html = function(v){
    if(v && v.httpdataStatus) v = v.toString().replace(/\r\n/g, "<br />").toString();
    return status.html.call(this, v);
}
jQuery.fn.html = jQuery.prototype.html;