OSDN Git Service

Version 0.6.134, add comments for closure compiler.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 01_X.js
index 035cfae..5b76024 100644 (file)
-if( !window['console'] || ( window.parent && window.parent.log ) ) console = { log : function(a){\r
-       var win, elm;\r
-       //alert(a);\r
-       if( window.parent ){\r
-               elm = parent.document.all ? parent.document.all.log : parent.log || parent.document.getElementById( 'log' );\r
-               elm && ( elm.innerHTML = a + '<br>' + elm.innerHTML );\r
+\r
+/**\r
+ * <h4>はじめに:Web 開発の世界へようこそ!</h4>\r
+ * DHTML と XHR 等を活用した Ajax によってその真価を発揮した javascript は、現在では RIA に SPA や 3D ゲームなど、あらゆるアプリケーションがブラウザ上で動きつつあります。\r
+ * それらの素晴らしいデモに触れ、これから Web 開発に望む皆さんは、胸をときめかせていることでしょう。\r
+ * そうです、今や Web ブラウザは、あなたの夢を何でも描くことの出来る自由なフロンティアです。\r
+ * \r
+ * しかし、いざ Javascript を触り始め、初めての開発に着手すると、Web ブラウザというフロンティアは、少し雑草の茂るだけの荒野だと気付くでしょう。\r
+ * ここに RIA や 3D ゲームといった素晴らしいテーマパークを築機上げるには、まずは測量に整地、地盤や土壌の改良といった膨大な作業をしなくてはいけません。\r
+ * \r
+ * 簡素な物置小屋のための最初の柱を建てるのにも、それ以前に膨大な作業の必要なことに、あなたは唖然となるでしょう。\r
+ * そのような基礎もそこそこに、勇んで建てた一本目の柱は傾き、または無残に朽ち果てるのを目撃し、あなたは深いため息をつくかもしれません。\r
+ * \r
+ * Javascript は様々な問題を孕みつつも、今や最もあらゆるプラットフォームで動作する言語のひとつへと躍進しました。\r
+ * これから、このフロンティアに如何に基礎を作り、その上にテーマパークを作るのか?一緒に考えていきましょう。\r
+ * ようこそ、Web 開発の世界へ!\r
+ * \r
+ * <h4>pettanR フレームワーク API ドキュメントについて</h4>\r
+ * このAPIドキュメントには、折に触れこのような長文が登場します。\r
+ * Web 開発は今では、そのカジュアルなイメージとは裏腹に、膨大な知識と経験が必要なものになってしまっています。\r
+ * どのようにして、それらの情報を、妥当な業務時間の間に継承していけばよいか?\r
+ * \r
+ * この意識は常にありましたが、このたび pettanR フレームワークの API ドキュメントを作成するにあたり、それに付記していく形で取り組んでみようと思います。\r
+ * \r
+ * <h4>フレームワークのレイヤー構造について</h4>\r
+ * <h5>\core 以下:javascript の整地を行い大規模開発の基礎を整える</h5>\r
+ * <p>ブラウザの種類とバージョンを調べ、続いて javascript 自体の差異を埋め、足りない関数を補います。\r
+ * <p>続いて、ファーストオブジェクトとも呼ばれる function について、その能力を引き出しつつ安心して使えるように、再利用可能クロージャの生成・破棄ができるようにします。\r
+ * ガベージコレクション周りが怪しいブラウザがあるため、クロージャを再利用可能にしておくことは重要です。\r
+ * <p>javascript が大規模開発に使えるように、クラス定義関数を用意します。prototype 周りの差異やバグを吸収するためにも、クラス定義の共通化は有効です。\r
+ * <p>このクラス定義関数を用いて EventDispatcher クラスを定義します。ブラウザの提供するイベントターゲットオブジェクトをラップしたり、単にアプリケーション独自のイベントを配信するためにも使えます。\r
+ * フレームワークの各所でサブクラスや単にインスタンスを拡張して使われています。フレームワークの API 設計の性格を決めている、とても重要なクラスです。\r
+ * 再利用可能クロージャや、タイマー(setTimeout のラッパー) とも密に結合しています。\r
+ * \r
+ * <h5>\dom 以下:DHTML の差異を吸収し、非同期化された仮想 Node を提供する</h5>\r
+ * <p>jQuery ライクな構文で DOM ツリーの操作を行います。チェーンメソッドは速い、と聞きかじったのでこのデザインにしました。\r
+ * <p>Real DOM の操作は非同期に行われるため高速です。Virtual DOM 時代のライバル達にひけをとることはありません。\r
+ * <p>10 年後の変化に対応するため、確かな抽象化実装を行う。それを証明するために 10 年前の環境でも動作させます。\r
+ * \r
+ * <h5>\ui 以下:UI フレームワーク</h5>\r
+ * <p>\dom までで吸収できなかった Web ブラウザの差異を最終的に吸収し、HTML 要素を UI 部品として利用するためのレイヤーです。\r
+ * <p>この層で吸収できなかった差異に関する情報を提供して、アプリケーションに UI をグレースフルグラデーションするための情報を提供します。\r
+ * <p>任意の UI を実現するための最適な HTML タグ構造がブラウザ毎に異なる場合に、その差異をカプセル化します。\r
+ * <p>Web ブラウザ自体のレンダリングコストを最小にし、高速な UI 部品を提供するために、独自のレイアウトルールを持ちます。\r
+ * <p>フォントサイズをベースとしたレイアウト指定のため、レスポンシブな画面作りを後押しします。\r
+ * \r
+ * @example // ライブラリは X という名前空間を使用します。\r
+ * //ショートハンド\r
+ * X( func ) == X.ViewPort[ 'listenOnce' ](X.Event.XDOM_READY, func);\r
+ * X('#mydiv') == X.Doc.find('#mydiv');\r
+ * @namespace X\r
+ */\r
+function X( v ){\r
+       if( X_Type_isFunction( v ) ){\r
+               X[ 'ViewPort' ][ 'listenOnce' ]( X_EVENT_XDOM_READY, v );\r
+       } else\r
+       if( X_shortcutFunction ){\r
+               return X_shortcutFunction.apply( X_shortcutContext || X, arguments );\r
        };\r
-} };\r
+};\r
+\r
+//{+DEV\r
+if( !window['console'] || ( window.parent && window.parent.log ) )\r
+       console = { log : function(a){\r
+               var win, elm;\r
+               //alert(a);\r
+               if( window.parent ){\r
+                       elm = parent.document.all ? parent.document.all.log : parent.log || parent.document.getElementById( 'log' );\r
+                       elm && ( elm.innerHTML = a + '<br>' + elm.innerHTML );\r
+               };\r
+       } };\r
+//+DEV}\r
+\r
+//{-AUDIO\r
+//-AUDIO}\r
 \r
 var undefined,\r
-       X = new Function( 'return X._shortcut && X._shortcut.apply( X._shortcut, arguments )' ),\r
-       X_TEMP = {};\r
+       X_EMPTY_OBJECT = {},\r
+       X_TEMP = { onSystemReady : [] },\r
+       X_emptyFunction = new Function,\r
+       X_shortcutFunction,\r
+       X_shortcutContext;\r
 \r
-X.VERSION = '0.6.89';\r
-               \r
-X.bootTime = + new Date;\r
-               \r
-X.getTime = Date.now ? Date.now : new Function( 'return +new Date' );\r
+/**\r
+ * バージョン文字列:"0.6.123"\r
+ * @type {string} */\r
+X[ 'VERSION' ] = '0.6.127';\r
 \r
+/**\r
+ * ブートタイム ms\r
+ * @type {number} */\r
+X[ 'bootTime' ] = + new Date;\r
 \r
-X.emptyFunction = new Function;\r
+/**\r
+ * 空の関数\r
+ * @type {Function} */\r
+X[ 'emptyFunction' ] = X_emptyFunction;\r
 \r
-               // defer の場合もあるので、document.readyState を見る MacIE で false\r
-X.inHead = (function( s ){\r
+/**\r
+ * このscriptはheadタグの中にあるか?\r
+ *  @type {boolean} */\r
+// TODO defer の場合もあるので、document.readyState を見る\r
+// MacIE で false\r
+X[ 'inHead' ] = (function( s ){\r
        if( !s ) return false;\r
        if( !s.length ) return false; // Safari1.3 312.8 でerror\r
        s = s[ s.length - 1 ];\r
@@ -30,94 +110,3 @@ X.inHead = (function( s ){
        return s.tagName.toLowerCase() === 'head';// opera7.23 s.tagName is 'HTML'\r
 })( document.scripts || document.getElementsByTagName && document.getElementsByTagName( 'script' ) || document.all && document.all.tags( 'script' ) );\r
 \r
-X.parse = function( v ){\r
-       var _v, n;\r
-       if( Type.isString( v ) === true ){\r
-               switch( v ){\r
-                       case ''          : return v;\r
-                       //case '{}'        : return {};\r
-                       //case '[]'        : return [];\r
-                       case 'NaN'       : return NaN;\r
-                       case 'null'      : return null;\r
-                       case 'true'      : return true;\r
-                       case 'false'     : return false;\r
-                       case 'Infinity'  : return 1/0;//Number.POSITIVE_INFINITY;\r
-                       case '-Infinity' : return -1/0;//Number.NEGATIVE_INFINITY;\r
-                       case 'void(0)' :\r
-                       case 'void 0' :\r
-                       case 'undefined' : return;\r
-               };\r
-               _v = v.split( ' ' ).join( '' );\r
-               n  = _v - 0;\r
-               if( '' + n === _v || '' + n === '0' + _v  ) return n;\r
-       };\r
-       return v;\r
-};\r
-               \r
-X.cloneObject = function( src ){\r
-       var ret, k;\r
-       if( typeof src !== 'object' ) return src;\r
-       ret = {};\r
-       for( k in src ){\r
-               ret[ k ] = src[ k ];\r
-       };\r
-       return ret;\r
-};\r
-\r
-X.deepCopy = function( src ){\r
-       function clone( src, objSrc, objCopy, n ) {\r
-               var ret, i, key;\r
-               if( !src ){ // 0, "", null, undefined, NaN, false\r
-                       return src;\r
-               } else\r
-               if( X.Type.isArray( src ) ){\r
-                       i = objSrc.indexOf( src );\r
-                       if( i !== -1 ) return objCopy[ i ];\r
-                       objSrc[ ++n ] = src;\r
-                       objCopy[ n ]  = ret = [];\r
-               } else\r
-               if( X.Type.isObject( src ) ){\r
-                       i = objSrc.indexOf( src );\r
-                       if( i !== -1 ) return objCopy[ i ];\r
-                       objSrc[ ++n ] = src;\r
-                       objCopy[ n ]  = ret = {};\r
-               } else {\r
-                       // string, number, true\r
-                       return src;\r
-               };\r
-               for( key in src ){\r
-                       ret[ key ] = clone( src[ key ], objSrc, objCopy, n );\r
-               };\r
-               return ret;\r
-       };                              \r
-       return clone( src, [], [], -1 );\r
-};\r
-\r
-\r
-\r
-\r
-X.copyArray = function( ary ){\r
-       var ret = [], i = ary.length;\r
-       if( !i ) return ret;\r
-       for( ; i; ){\r
-               ret[ --i ] = ary[ i ];\r
-       };\r
-       return ret;\r
-};\r
-       \r
-X.isEmptyObject = function( v ){\r
-       var p;\r
-//     if( v.length ) return false;\r
-       for( p in v ){\r
-               if( v.hasOwnProperty( p ) ) return false;\r
-       };\r
-       return true;\r
-};\r
-               \r
-X.matchTest = function( array1, array2 ){\r
-       var i = array2.length;\r
-       for( ; i; ){\r
-               if( array1.indexOf( array2[ --i ] ) === -1 ) return false;\r
-       };\r
-       return true;\r
-};\r