var OnReady=(function () {
    var load_events=[],
	load_timer,
	script,
	done,
	exec,
	old_onload,
	init=function () {
	    done=true;
	    clearInterval(load_timer);
	    while(exec=load_events.shift()) exec();
	    if(script) script.onreadystatechange='';
	};
    return function (func) {
        if(done) return func();
        if(!load_events[0]) {
            if(document.addEventListener) document.addEventListener("DOMContentLoaded",init,false);
            if(/WebKit/i.test(navigator.userAgent)) {
                load_timer=setInterval(function () {
                    if(/loaded|complete/.test(document.readyState)) init();
                },
				10);
            }
            old_onload=window.onload;
            window.onload=function () {
                init();
                if(old_onload) old_onload();
            };
        }
        load_events.push(func);
    }
})();
var Ajax={
    request: function (p) {
        if(typeof p.loading=="function") {
            p.loading();
        }
        var postData=null;
        if(p.params) {
            postData="";
            for(var i in p.params) {
                postData+=i;
                postData+="=";
                postData+=encodeURIComponent(p.params[i]);
                postData+="&";
            }
            if(p.method=="GET") {
                if(postData) {
                    p.url+=("?"+postData);
                    postData=null;
                }
            }
        }
        var xmlhttp=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp.open(p.method,p.url,true);
        if(p.method=="POST") {
            xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
        }
        xmlhttp.setRequestHeader("X-Requested-With","XMLHttpRequest");
        if(p.dataType=="JSON") {
            xmlhttp.setRequestHeader("Accept","application/json");
            xmlhttp.setRequestHeader("X-Request","JSON");
        } else {
            xmlhttp.setRequestHeader("Accept","text/javascript,text/html,application/xml,text/xml,*/*");
        }
        xmlhttp.onreadystatechange=function () {
            if(xmlhttp.readyState==4) {
                if(xmlhttp.status==200) {
                    if(typeof p.success=="function") {
                        if(p.dataType=="JSON") {
                            p.success(JSON.decode(xmlhttp.responseText));
                        } else {
                            p.success(xmlhttp.responseText);
                        }
                    }
                } else {
                    if(typeof p.failure=="function") {
                        p.failure(xmlhttp.responseText);
                    } else {
                        document.write(xmlhttp.responseText);
                    }
                }
            }
        };
        xmlhttp.send(postData);
    }
};
var JSON={};(function () {
    function f(n) {
        return n<10?'0'+n:n;
    }
    if(typeof Date.prototype.toJSON!='function') {
        Date.prototype.toJSON=function (key) {
            return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z':null;
        };
        String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function (key) {
            return this.valueOf();
        };
    }
    var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
    escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
    gap,
    indent,
    meta={
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"': '\\"',
        '\\': '\\\\'
    },
    rep;
    function quote(string) {
        escapable.lastIndex=0;
        return escapable.test(string)?'"'+string.replace(escapable,
        function (a) {
            var c=meta[a];
            return typeof c=='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);
        })+'"':'"'+string+'"';
    }
    function str(key,holder) {
        var i,
        k,
        v,
        length,
        mind=gap,
        partial,
        value=holder[key];
        if(value&&typeof value=='object'&&typeof value.toJSON=='function') {
            value=value.toJSON(key);
        }
        if(typeof rep=='function') {
            value=rep.call(holder,key,value);
        }
        switch(typeof value) {
            case 'string':
                return quote(value);
            case 'number':
                return isFinite(value)?String(value):'null';
            case 'boolean':
            case 'null':
                return String(value);
            case 'object':
                if(!value) {
                    return 'null';
                }
                gap+=indent;
                partial=[];
                if(Object.prototype.toString.apply(value)=='[object Array]') {
                    length=value.length;
                    for(i=0;i<length;i+=1) {
                        partial[i]=str(i,value)||'null';
                    }
                    v=partial.length==0?'[]':gap?'[\n'+gap+partial.join(',\n'+gap)+'\n'+mind+']':'['+partial.join(',')+']';
                    gap=mind;
                    return v;
                }
                if(rep&&typeof rep=='object') {
                    length=rep.length;
                    for(i=0;i<length;i+=1) {
                        k=rep[i];
                        if(typeof k=='string') {
                            v=str(k,value);
                            if(v) {
                                partial.push(quote(k)+(gap?':':':')+v);
                            }
                        }
                    }
                } else {
                    for(k in value) {
                        if(Object.hasOwnProperty.call(value,k)) {
                            v=str(k,value);
                            if(v) {
                                partial.push(quote(k)+(gap?':':':')+v);
                            }
                        }
                    }
                }
                v=partial.length==0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+mind+'}':'{'+partial.join(',')+'}';
                gap=mind;
                return v;
        }
    }
    if(typeof JSON.encode!='function') {
        JSON.encode=function (value,replacer,space) {
            var i;
            gap='';
            indent='';
            if(typeof space=='number') {
                for(i=0;i<space;i+=1) {
                    indent+=' ';
                }
            } else if(typeof space=='string') {
                indent=space;
            }
            rep=replacer;
            if(replacer&&typeof replacer!='function'&&(typeof replacer!='object'||typeof replacer.length!='number')) {
                throw new Error('JSON.encode');
            }
            return str('',{
                '': value
            });
        };
    }
    if(typeof JSON.decode!='function') {
        JSON.decode=function (text,reviver) {
            var j;
            function walk(holder,key) {
                var k,
                v,
                value=holder[key];
                if(value&&typeof value=='object') {
                    for(k in value) {
                        if(Object.hasOwnProperty.call(value,k)) {
                            v=walk(value,k);
                            if(v!=undefined) {
                                value[k]=v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder,key,value);
            }
            text=String(text);
            cx.lastIndex=0;
            if(cx.test(text)) {
                text=text.replace(cx,
                function (a) {
                    return '\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);
                });
            }
            if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))) {
                j=eval('('+text+')');
                return typeof reviver=='function'?walk({
                    '': j
                },
                ''):j;
            }
            throw new SyntaxError('JSON.decode');
        };
    }
} ());
