/* TGBUS API Javascript Library 1.2

Copyright (2008) Tgbus Inc.  All rights reserved.

*/

(function(){
    
    var isFunction = function( fn ) {
        return !!fn && typeof fn != "string" && !fn.nodeName &&
            fn.constructor != Array && /function/i.test( fn + "" );
    }
    var buildURL = function(url, params){
        var tmp = url.split("?");
        var uri = tmp[0];
        var ps = null;
        if (tmp.length > 1) ps = tmp[1].split("&");
        var pnames = uri.match(/{\w+}/g);
        if (pnames != null) {
            for (var i=0; i<pnames.length; ++i){
                var pn = pnames[i];
                var ppn = pnames[i].match(/{(\w+)}/)[1];
                if (!params[ppn]) return null;
                else uri = uri.replace(pn, params[ppn]);
            }
        }
        if (!ps) return uri;
        var re_ps = [];
        for (var i=0; i<ps.length; ++i) {
            var tmp = ps[i].match(/{(\w+)}/);
            if (tmp==null) re_ps.push(ps[i]);
            else {
                var pn = tmp[0];
                var ppn = tmp[1];
                if (params[ppn]) re_ps.push(encodeURI(ps[i].replace(pn, params[ppn])));
            }
        }
        if (re_ps.length>0) return [uri, re_ps.join("&")].join("?");
        else return uri;
    }
    var jsc = (new Date).getTime();
    var buildTempFunction = function(cb){
        var jsonp = "jsonp" + jsc++;
        window[ jsonp ] = function(data){
            cb(data);
            // Garbage collect
            window[ jsonp ] = undefined;
            try{ delete window[ jsonp ]; } catch(e){}
        };
        return jsonp;
    }
    var sendScriptRequest = function(url){
        var head = document.getElementsByTagName("head")[0];
        var script = document.createElement("script");
        script.src = url;
        script.charset = 'utf-8';
        head.appendChild(script);
    }
    var formatParams = function(params) {
        if (isFunction(params.callback)) params.callback = buildTempFunction(params.callback);
        if (!params.apikey) params.apikey = api_obj.apikey;
        return params;
    }
    var send = function(url, params){
        var url = buildURL(url, params);
        if (url!=null) sendScriptRequest(url);
    }

    var apikey = '';
    var namespace = 'TGBUS';
    var obj = {
        apikey:apikey
    };
    
    
    var scoreBaseUri = 'http://api.tgbus.com/score/scorehandler.ashx';  
    var commentBaseUri = 'http://api.tgbus.com/comment/commenthandler.ashx';
    //var zhidaoBaseUri = 'http://api.tgbus.com/zhidao/zhidaoread.ashx';
    var zhidaoBaseUri = 'http://api.tgbus.com/zhidao/zhidaoread.ashx';
    var zhidaoWriteUri = 'http://api.tgbus.com/zhidao/ZhiDaoWrite.ashx';
    var cp = 'apikey={apikey}&type=json&callback={callback}&math='+Math.random();
    
    var apis = {
    
        ScoresGet: {url:scoreBaseUri+'?method=01&appid={appid}&itemid={id}&results={results}'},
        ScoresSend: {url:scoreBaseUri+'?method=03&appid={appid}&itemid={id}&score={score}'},
        
        ZhidaoAnsGet: {url:zhidaoBaseUri+'?method=01&appid={appid}&results={results}&qid={qid}&pageindex={pageindex}'},
        ZhidaoAnsTotalCount: {url:zhidaoBaseUri+'?method=02&appid={appid}&results={results}&qid={qid}'},
        ZhidaoQuGetModel: {url:zhidaoBaseUri+'?method=03&appid={appid}&itemid={id}&qid={qid}'},
        ZhidaoQuGetListById: {url:zhidaoBaseUri+'?method=04&appid={appid}&itemid={id}&results={results}&qstate={qstate}&pageindex={pageindex}'},
        ZhidaoQuGetListByIdCount: {url:zhidaoBaseUri+'?method=05&appid={appid}&itemid={id}&results={results}&qstate={qstate}'},
        ZhidaoQuGetListByUser: {url:zhidaoBaseUri+'?method=06&appid={appid}&results={results}&qstate={qstate}&username={username}&pageindex={pageindex}'},
        ZhidaoQuGetListByUserCount: {url:zhidaoBaseUri+'?method=07&appid={appid}&results={results}&qstate={qstate}&username={username}'},
        ZhidaoQuGetListByPlat: {url:zhidaoBaseUri+'?method=08&appid={appid}&results={results}&qstate={qstate}&plat={plat}&gameclass={gameclass}&pageindex={pageindex}'},
        ZhidaoQuGetListByPlatCount: {url:zhidaoBaseUri+'?method=09&appid={appid}&results={results}&qstate={qstate}&plat={plat}&gameclass={gameclass}'},
        ZhidaoQuGetListByTopUser: {url:zhidaoBaseUri+'?method=10&appid={appid}&itemid={id}&results={results}&refclass={refclass}'},
        
        ZhidaoAnswerSave: {url:zhidaoWriteUri+'?method=01&username={username}&qid={qid}&acontent={acontent}'},
        ZhidaoQuestionSave: {url:zhidaoWriteUri+'?method=02&appid={appid}&itemid={itemid}&username={username}&qtitle={qtitle}&qcontent={qcontent}&qclass={qclass}&qreward={qreward}&qflatid={qflatid}&qgameclassid={qgameclassid}&producttitle={producttitle}&producturl={producturl}'},
        ZhidaoSetBestAnswer: {url:zhidaoWriteUri+'?method=03&aid={aid}&qid={qid}&qreward={qreward}'},
        ZhidaoQuestionClose: {url:zhidaoWriteUri+'?method=04&username={username}&qid={qid}'},
       
        CommentGet: {url:commentBaseUri+'?method=01&appid={appid}&itemid={id}&results={results}'},
        CommentGetByUser:{url:commentBaseUri+'?method=02&appid={appid}&name={name}&pageindex={pageindex}&pagesize={pagesize}'},
        CommentSend: {url:commentBaseUri+'?method=03&typeid={appid}&itemid={id}&title={title}&formreplyname={formreplyname}&formcontent={formcontent}&returnurl={returnurl}'},
        CommentBallot:{url:commentBaseUri+'?method=04&commentid={commentid}&oppclass={oppclass}'},
        CommentGetPage: {url:commentBaseUri+'?method=05&appid={appid}&itemid={id}&pageindex={pageindex}&pagesize={pagesize}'}

    };
    for (var name in apis)
        if (apis[name].url.search(/\?/)!=-1) apis[name].url = apis[name].url + '&' + cp;
        else apis[name].url = apis[name].url + '?' + cp;

    //Set Global Values
    if (!window[namespace]) window[namespace] = {}
    var api_obj = window[namespace]; //a Temp Reference
    for (var name in obj) api_obj[name] = obj[name];
    for (var name in apis)
        api_obj[name] = (function(url){
            return function(params){
                send(url, formatParams(params));
            };
        })(apis[name].url)
})()
