/**
 *  @name global govern system class object / GGSCO
 *  @memo : GGSCO framework 
 *  @ver v0.0.1  --  下午 03:25 2006/11/17  --  create it  
 *  @ver v0.0.2  --  上午 10:59 2006/11/22  --  add gg.alert()
 *  @ver v0.0.3  --  下午 06:44 2006/12/11  --  add gg.show() , modify gg.pr()
 *  @ver v0.0.4  --  下午 02:28 2006/12/12  --  add gg.trys() , add gg.debug() gg.debug_show()
 *  
**/
window.gg = window.gg || {};


//
// 取代 document.getElementById( idName )
//
if (!gg.id) {                                                             
    gg.id = function() {
        var elements = new Array();
        for (var i = 0; i < arguments.length; i++) {
            var element = arguments[i];
            if (typeof element == 'string') {
                element = document.getElementById(element);
            }
            if (arguments.length == 1) {
                return element;
            }
            elements.push(element);
        }
        return elements;
    }
}
gg.$=gg.id;  //★★★以後盡量不要用 gg.$ 這個 function !!!!




//
// 取代  document.getElementsByTagName( tagName )
//
if (!gg.tag) {
    gg.tag = function() {
        var elements = new Array();
        for (var i = 0; i < arguments.length; i++) {
            var element = arguments[i];
            if (typeof element == 'string') {
                element = document.getElementsByTagName(element);
            }
            if (arguments.length == 1) {
                return element;
            }
            elements.push(element);
        }
        return elements;
    }
}




//
// 顯示到 document.write
// 顯示到 document.writeln
//
if (!gg.p)  {  gg.p  = function(s){            document.write(s);            }  }
if (!gg.pn) {  gg.pn = function(s){ this.p(s); document.writeln("<br />\n"); }  }





/*--------------------------------------------------------------------------------
開發時使用的 '列印『陣列物件』工具'
arr   = object物件陣列
type  = 0/全列  1/只列屬性元素,不印方法  2/只列印有資料的屬性
num   = 預設限制顯示為 80 個值, 可以自行設定
enter = 換行方式 0=無 , 1=<br /> , 2=\\n , 3=<br />\\n

v0.3  --  下午 05:07 2006/11/15  --  修改了布林運算的值
v0.4  --  上午 11:10 2006/11/22  --  新增數量代入參數值,可以改變顯示的上限限制
v0.5  --  下午 06:38 2006/12/11  --  新增換行方式
--------------------------------------------------------------------------------*/
if (!gg.show) {
    gg.show = function( arr , type , num , enter ) {

        if(typeof(enter)=='undefined') {
            enter='0';
        }
        enter=enter.toString();
        switch(enter) {
            case '1': enter='<br />';     break;
            case '2': enter='\\n';        break;
            case '3': enter='<br />\\n';  break;
            case '0':
            default:
                enter='';
                break;
        }

        var show='';


        if(typeof(num)!='undefined') {
            var define_over = parseInt(num);
        } else {
            var define_over = 80;  //每個物件列印超出 ???? 的數量時,也要停止列印 (第一層的物件不做任何限制 layer==0 )
        }
        
        if(typeof(type)=='undefined') {
            type=0;
        }
        //不是物件的話,簡單列印完就結束
        if(typeof(arr)!='object')
        {
            show += arr + enter ;
            return show;
        }

        //開頭
        show +=  "<font size=2 style=background-color:#e7f3fa;>/*------------------------------------------------------------------------------" + enter ;
      //show +=  '[物件長度] = '+ arr.length + enter ;
        var add=0;      //這個變數是用來限制每個物件不可以列印超過某個數量, 對應的值為 define_over
        var counts1=0;  //計算元素個數
        var counts2=0;  //計算方法個數
        var counts3=0;  //計算元素有值的個數
        for( keys in arr )
        {
            switch( typeof(arr[keys]) ) {
                case 'undefined':
                case 'function':
                case 'unknown':
                    counts1++;
                    if(type==1){break;}
                    show += '<font color=228822> '+ keys + " </font> = 未知的內容("+ typeof(arr[keys]) +")" + enter ;
                    break;
                case 'object':
                    counts1++;
                    if(type==1){break;}
                    show += '<font color=0000ff> '+ keys + " </font> = "+ typeof(arr[keys]) +"{}" + enter ;
                    break;
                default:
                    counts2++;
                    if(type==2 && typeof(arr[keys])!='boolean' && arr[keys]==''){break;}
                    counts3++;
                    show += '<font color=ff0000> '+ keys + ' </font> = ' + arr[keys] + enter ;
                    break;
            }

            //超過每個物件可以列印的數量就離開, 第一層的不做任何限制
            add++;
            if( add>=define_over ) {
                show += "<font color=999922> more.... </font>" + enter ;
                break;
                //return '';
            }

        }//for in
        //尾巴
        show += '[方法數量] = '+ counts1 + enter ;
        show += '[元素數量] = '+ counts2 + enter ;
        show += '[物件數量] = '+ (counts1+counts2) + enter ;
        show += '[有值元素] = '+ counts3 + enter ;
        show += "------------------------------------------------------------------------------*/</font>" + enter ;
        return show;

    }//function show
}



/*--------------------------------------------------------------------------------
開發時使用的 '列印『陣列物件』工具'
--------------------------------------------------------------------------------*/
if (!gg.pr) {
    gg.pr = function( arr , type , num ) {
        gg.pn(gg.show( arr , type , num , 1));
    }//function pr
}




/*--------------------------------------------------------------------------------
pr方法(v0.4) 的 alert 版本,本程式考貝 自 pr方法 , 請勿必修改於 pr方法 
--------------------------------------------------------------------------------*/
if (!gg.alert) {
    gg.alert = function( arr , type , num  ) {
        var show=''; //show buffer 
        
        if(typeof(num)!='undefined') {
            var define_over = parseInt(num);
        } else {
            var define_over = 80;  //每個物件列印超出 ???? 的數量時,也要停止列印 (第一層的物件不做任何限制 layer==0 )
        }
        
        if(typeof(type)=='undefined') {
            type=0;
        }
        //不是物件的話,簡單列印完就結束
        if(typeof(arr)!='object')
        {
            alert( arr );
            return '';
        }

        //開頭
        show += "/*------------------------------------------------------------------------------\n" ;
      //show += '[物件長度] = '+ arr.length ;
        var add=0;      //這個變數是用來限制每個物件不可以列印超過某個數量, 對應的值為 define_over
        var counts1=0;  //計算元素個數
        var counts2=0;  //計算方法個數
        var counts3=0;  //計算元素有值的個數
        for( keys in arr )
        {
            switch( typeof(arr[keys]) ) {
                case 'undefined':
                case 'function':
                case 'unknown':
                    counts1++;
                    if(type==1){break;}
                    show += keys + " = 未知的內容("+ typeof(arr[keys]) +")\n";
                    break;
                case 'object':
                    counts1++;
                    if(type==1){break;}
                    show += keys + " = "+ typeof(arr[keys]) +"{}\n";
                    break;
                default:
                    counts2++;
                    if(type==2 && typeof(arr[keys])!='boolean' && arr[keys]==''){break;}
                    counts3++;
                    show +=  keys + ' = ' + arr[keys] +"\n";
                    break;
            }

            //超過每個物件可以列印的數量就離開, 第一層的不做任何限制
            add++;
            if( add>=define_over ) {
                show += " more.... \n" ;
                break;
                //return '';
            }

        }//for in
        //尾巴
        show += '[方法數量] = '+ counts1 +"\n";
        show += '[元素數量] = '+ counts2 +"\n";
        show += '[物件數量] = '+ (counts1+counts2) +"\n";
        show += '[有值元素] = '+ counts3 +"\n";
        show += "------------------------------------------------------------------------------*/" +"\n";
        alert( show );

    }//function alert
}





/**
 * 本程式用於 連續取用 function 直到正確的為止 
 * 本程式取自 prototype 1.4.0 
 * 
 * ex.
 *      var xml = gg.trys(
 *                        function() {return new ActiveXObject('Msxml2.XMLHTTP')},
 *                        function() {return new ActiveXObject('Microsoft.XMLHTTP')},
 *                        function() {return new XMLHttpRequest()}
 *                ) || false ;
 * 
 */
if (!gg.trys) {
    gg.trys = function() {
        var returnValue;
        for (var i = 0; i < arguments.length; i++) {
          var lambda = arguments[i];
          try {
            returnValue = lambda();
            break;
          } catch (e) {}
        }
        return returnValue;
    }
}






//
// log 用的訊息資料, 儲存方式使用 JSON 格式 
// ex.
//     gg.log(' information ');
//
if (!gg.info) {
    gg.log_buffer={};  //資料儲存處
    gg.log = function( data ) {

        var add=0;
        for( a in gg.log_buffer ) {
            add++;
        }
        gg.log_buffer[add] = {"data":data};
    };
}
//
// log 用的訊息顯示
// ex.
//     gg.alert(gg.log_show());
//     gg.$("abc").innerHTML = "\n<pre>"+gg.log_show()+'</pre>';
//
if (!gg.log_show) {
    gg.log_show = function() {
        var i=null;
        var buffer= ''; 
        for( i in gg.log_buffer ) {
            if(i<=9)         { buffer += '00'+i+' ';
            } else if(i<=90) { buffer += '0' +i+' ';
            } else           { buffer += ''  +i+' ';
            }

            if(typeof( gg.log_buffer[i].data )!='object') {
                //非物件                
                buffer += gg.log_buffer[i].data+"\n";
            } else {
                //物件
                buffer += "{object}\n";
            }

        }
        return buffer;
    };
}





/**
 * 本程式用於 create namespace 
 * 本程式取自 YAHOO.namespace 
 *
 * gg.namespace("property.package");
 * gg.namespace("gg.property.package");
 * gg.namespace("really.long.nested.namespace");
 *
 * @param  {String} ns The name of the namespace
 * @return {Object}    A reference to the namespace object
if (!gg.namespace) {
    gg.namespace = function(ns) {
        if (!ns || !ns.length) {
            return null;
        }
        var levels = ns.split(".");
        var nsobj = gg;
        for (var i=(levels[0] == "gg") ? 1 : 0; i<levels.length; ++i) {
            nsobj[levels[i]] = nsobj[levels[i]] || {};
            nsobj = nsobj[levels[i]];
        }
        return nsobj;
    };
}
*/


//
// load javascript , 簡易快速載入功能, 請特別注意路徑問題!
//
if (!gg.load_all_js) {
    gg.load_all_js = function( path ) {
        if(!path) {
            var path='/include/js/ggsco_big5/';
        }
        var name=['bw','str','form','win','div','check','date','ajax'];  //bw,str 為必要工具
        for(var i=0;i<name.length;i++) {
            document.write('<s'+'cript type="text/javascript" src="'+path+name[i]+'.js"></s'+'cript>');
        }       
    }
}
//
// load all GGSCO library 
//
gg.load_all_js();






/*

gg.pn( 'offsetWidth ='+ gg.$("imx").offsetWidth  );
gg.pn( 'offsetHeight='+ gg.$("imx").offsetHeight );
gg.pn( 'offsetLeft  ='+ gg.$("imx").offsetLeft   );
gg.pn( 'offsetTop   ='+ gg.$("imx").offsetTop    );


gg.pr(gg);
gg.pr(gg.str);

*/