height : 100%;\r
overflow : hidden;\r
margin : 0;\r
- padding : 0;/* opera 8 */\r
+ padding : 0; /* opera 8 */\r
border : 0;\r
}\r
\r
+ body {\r
+ background : #111;\r
+ color : #eee;\r
+ }\r
+ .js-disabled body {\r
+ background : #111 url( "../img/loading.gif" ) 50% 50% no-repeat;\r
+ }\r
+\r
.IE5x body,\r
.IE6 body,\r
.IE7 body,\r
body, textarea {\r
font-family:'ヒラギノ角ゴ Pro W3','Hiragino Kaku Gothic Pro','メイリオ',Meiryo,'MS Pゴシック',sans-serif;\r
}\r
+\r
.IE5x body, .IE5x textarea,\r
.IE6 body, .IE6 textarea, {\r
- font-family: 'MS Pゴシック',sans-serif;\r
- }\r
-\r
- .js-disabled {\r
- background : #111 url( "../img/loading.gif" ) 50% 50% no-repeat;\r
+ font-family : 'MS Pゴシック',sans-serif;\r
}\r
\r
\r
+/*------------------------------------------------------------------------------------\r
+ * X.UI\r
+ */\r
.Root {\r
height : 100%;\r
}\r
white-space : pre; /* CSS 2.0 */\r
white-space : pre-wrap; /* CSS 2.1 */\r
white-space : pre-line; /* CSS 3.0 */\r
- /* white-space : -pre-wrap; Opera 4-6 */\r
white-space : -o-pre-wrap; /* Opera 7 */\r
- white-space : -moz-pre-wrap; /* Mozilla */\r
- /* white-space : -hp-pre-wrap; HP Printers */ \r
+ white-space : -moz-pre-wrap; /* Mozilla */ \r
}\r
.IE5x .Root, .IE5x .Root div,\r
.IE6 .Root, .IE6 .Root div,\r
white-space : normal/* ie系では、 float要素へ回り込みする、 white-space の効いているテキストの位置が狂う */\r
}\r
\r
-* {zoom:1}\r
+\r
\r
/*------------------------------------------------------------------------------------\r
* mouse-operation-catcher\r
*/\r
- .mouse-operation-catcher {\r
+ .mouse-operation-catcher,\r
+ .mouse-operation-catcher-scrollFix {\r
position : absolute;\r
top : 0;\r
left : 0;\r
background : #fff;\r
filter : alpha( opacity=0 );\r
}\r
+ \r
+ .mouse-operation-catcher-scrollFix {\r
+ overflow : scroll;\r
+ }\r
+ .mouse-operation-catcher-scrollFix div {\r
+ width : 300%;\r
+ height : 300%;\r
+ /* background : url( "../img/grid.gif" ) repeat; */\r
+ }\r
\r
/*------------------------------------------------------------------------------------\r
* hidden-sysyem-node\r
<!DOCTYPE html>\r
-<html lang="ja" class="js-disabled">\r
+<html lang="ja" class="js-disabled notranslate" xmlns:v="urn:schemas-microsoft-com:vml">\r
<head>\r
<meta charset="utf-8">\r
-<title>New X.UI</title>\r
+<title>pettanR UI\83V\83X\83e\83\80</title>\r
+<meta name="msapplication-tap-highlight" content="no">\r
<meta name="HandheldFriendly" content="true">\r
<meta name="mobileoptimized" content="0">\r
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\r
<script type="text/javascript" src="js/20_ui/17_Text.js"></script>\r
<script type="text/javascript" src="js/20_ui/20_Root.js"></script>\r
\r
+<script type="text/javascript" src="js/22_uipage/01_Page.js"></script>\r
+\r
<script type="text/javascript" src="js/onReachEndOfScript.js"></script>\r
\r
<script type="text/javascript" src="js/main.js"></script>\r
* @type {boolean}\r
*/\r
X_UA[ sys ] = true;\r
- \r
- if( v = dav.split( 'Windows NT 10' )[ 1 ] ){\r
+\r
+ if( v = dua.split( 'Windows NT 10' )[ 1 ] ){\r
switch( v.substr( 0, 2 ) ){\r
case '.0' : v = 10; break;\r
default : v = '?';\r
};\r
} else\r
- if( v = dav.split( 'Windows NT ' )[ 1 ] ){\r
+ if( v = dua.split( 'Windows NT ' )[ 1 ] ){\r
switch( v.substr( 0, 3 ) ){\r
case '6.3' : v = 8.1; break;\r
case '6.2' : v = 8; break;\r
case '5.0' : v = v.indexOf( '5.01' ) ? 2000 : '2kSP1'; break;\r
case '4.0' : v = 'NT'; break;\r
default : v = '?';\r
- }; \r
+ }; \r
} else\r
- if( v = dav.split( 'Windows ' )[ 1 ] ){\r
+ if( v = dua.split( 'Windows ' )[ 1 ] ){\r
switch( v.substr( 0, 2 ) ){\r
case '98' : v = v.indexOf( '98; Win 9x 4.90' ) ? '98|98SE' : 'ME'; break;\r
case '95' : v = 95; break;\r
/**\r
* オブジェクトの全てのメンバーを破棄します。\r
* @alias X.Object.clear\r
- * @param {object} obj。\r
+ * @param {object} obj\r
*/\r
function X_Object_clear( obj, k ){\r
if( obj ){\r
* obj に対し、selector で示した値を返す。メンバを辿れなかった場合、undefined が返る。\r
* @alias X.Object.find\r
* @param {object} obj\r
- * @param {string} selector\r
+ * @param {string} selector 'navigator>mineTypes>hoge'\r
* @return {*}\r
*/\r
function X_Object_find( obj, selector ){\r
},\r
\r
/**\r
- * 関数は Constructor 内で使用します。クラス定義を辿ってスーパークラスのコンストラクタを探します。<br>\r
+ * 関数は Constructor 内で使用します。クラス定義を辿ってスーパークラスのコンストラクタを呼び出します。<br>\r
* 内部的には、呼び出したコンストラクタは配列に控え(X_Class_CALLING_SUPER)、呼び出したコンストラクタ内でさらに Super が呼ばれた場合、配列を元にさらにスーパーなコンストラクタを辿ります。\r
* @example Constructor : function( arg1, arg2 ){\r
* this.Super( aeg1, arg2 );\r
// TODO 現在 new しているインスタンスを保持してチェックする\r
'Super' : function( var_args ){\r
var me = this,\r
- sClass = me,\r
+ sClass = me.constructor,\r
i = X_Class_SUPER_CALLER.indexOf( me ),\r
stack, t, def, ret;\r
\r
if( i === -1 ){\r
X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;\r
- X_Class_SUPER_STACKS[ i ] = stack = 0;\r
+ t = stack = X_Class_SUPER_STACKS[ i ] = 0;\r
} else {\r
- stack = X_Class_SUPER_STACKS[ i ];\r
+ t = stack = X_Class_SUPER_STACKS[ i ];\r
+ \r
+ while( t ){\r
+ sClass = X_Class_getClassDef( sClass ).SuperClass;\r
+ --t;\r
+ }; \r
};\r
- \r
- t = stack;\r
- \r
- while( t ){\r
- sClass = X_Class_getClassDef( sClass ).SuperClass;\r
- --t;\r
- };\r
- \r
+\r
while( sClass ){\r
++t;\r
sClass = X_Class_getClassDef( sClass ).SuperClass;\r
},\r
\r
/**\r
- * func について、親クラスで設定されている同名の関数メンバーを呼び出す。<br>\r
- * 第一引数にオーバーライド済の自身の(自身から参照できる)関数を指定します。内部では関数名を調べた上で prototype チェーンをゴリゴリ辿る、特別なことはしていません。\r
- * superCall がネストする場合、arguments.callee でないと正しく現在階層を取得して親関数を知ることができない\r
- * 次の理由によって、関数名で辿ることはやめました\r
+ * myFunc について、スーパークラスで設定されている同名の関数を呼び出す。<br>\r
+ * 低速な関数なので多用されるべきではありません!<br>\r
+ * 第一引数に自身の(自身から参照できる)関数を指定します。内部では関数名を調べた上で prototype チェーンをゴリゴリ辿る、特別なことはしていません。<br>\r
+ * superCall と Super がネストする場合も現在のクラス階層を X_Class_SUPER_CALLER, X_Class_SUPER_STACKS を使って控えているので、意図した親関数が呼ばれます。<br>\r
+ * 次の理由によって、関数名で辿ることは非推奨です。\r
* <ol>\r
* <li>closur compiler でメソッド名が変更される\r
- * <li>superCall 内からさらに superCall が呼ばれた場合に、起点となる関数を特定できない\r
* </ol>\r
- * 次の場合、意図した動作が得られません\r
+ * 次の場合、意図した動作が得られません。\r
* <ol>\r
- * <li>2つ以上の異なる名前で同じ関数がメンバーがいた場合<br>\r
- * <li>または、サブクラスのメンバーにスーパークラスと同じ関数が出現する\r
- * <li>superCall 以外の手段で親関数を呼び、そのなかで superCall を読んだ\r
+ * <li>2つ以上の異なる名前で同じ関数がメンバーがいた場合\r
+ * <li>サブクラスの prototype にスーパークラスと同じ関数をコピーしている\r
+ * <li>非関数でメンバーを上書きしている\r
+ * <li>superCall 以外の手段で親関数を呼び、そのなかで superCall を呼んだ\r
* </ol>\r
- * 通常の X.Class.create の書き方ではこのような状況は起きませんが、js はなんでもできるので\r
- * 参考:<a href="http://qiita.com/no22@github/items/d3bead2acbb7ff1fb86b" target="_blank">ES5なJavascriptでモダンなクラス的継承&スーパー呼び出し </a>\r
+ * 通常の X.Class.create の書き方ではこのような状況は起きませんが、js はなんでもいろいろ出来てしまいますから…<br>\r
+ * 参考:<a href="http://qiita.com/no22@github/items/d3bead2acbb7ff1fb86b" target="_blank">ES5なJavascriptでモダンなクラス的継承&スーパー呼び出し </a><br>\r
+ * original:<a href="http://javascript.crockford.com/inheritance.html" target="_blank">Classical Inheritance in JavaScript</a>\r
* @param myFunc {Function|string} オーバーライド済の自身の(自身から参照できる)関数。\r
* @param var_args {...*} オーバーライド元関数に渡す任意の数の引数\r
- * @example return this.superCall( arguments.callee, param0, param1, ... );\r
+ * @example return this.superCall( this.myFunc, param0, param1, ... );\r
* @return {*} オーバーライド元の関数を呼び出した戻り値。\r
*/\r
'superCall' : function( myFunc, var_args ){\r
sClass = me.constructor,\r
proto = sClass.prototype,\r
i = X_Class_SUPER_CALLER.indexOf( me ),\r
- l, d, ret,\r
args = arguments,\r
- name, p, sFunc;\r
+ p, name, t, sFunc, ret;\r
\r
if( X_Type_isFunction( myFunc ) ){\r
for( p in proto ){\r
};\r
};\r
if( !name ) return;\r
+ } else\r
+ if( X_Type_isString( myFunc ) && X_Type_isFunction( me[ myFunc ] ) ){\r
+ name = myFunc;\r
} else {\r
return;\r
};\r
\r
if( i === -1 ){\r
X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;\r
- X_Class_SUPER_STACKS[ i ] = stack = 0;\r
+ t = stack = X_Class_SUPER_STACKS[ i ] = 0;\r
} else {\r
- stack = X_Class_SUPER_STACKS[ i ];\r
+ t = stack = X_Class_SUPER_STACKS[ i ];\r
+ \r
+ while( t ){\r
+ sClass = X_Class_getClassDef( sClass ).SuperClass;\r
+ --t;\r
+ }; \r
};\r
\r
- t = stack;\r
-\r
- while( t ){\r
- sClass = X_Class_getClassDef( sClass ).SuperClass;\r
- --t;\r
- };\r
- \r
if( sClass ){\r
myFunc = sClass.prototype[ name ];\r
\r
// --- interface ----------------------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
\r
-/**\r
+/*\r
* @enum {number}\r
* @const\r
*/\r
// ------------------------------------------------------------------------- //\r
// ------------ local variables -------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
-var /** @const */\r
- X_EventDispatcher_EVENT_TARGET_OTHER = 0,\r
- /** @const */\r
+var X_EventDispatcher_EVENT_TARGET_OTHER = 0,\r
X_EventDispatcher_EVENT_TARGET_XHR = 1,\r
- /** @const */\r
X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT = 2;\r
\r
var X_EventDispatcher_once = false,\r
{\r
\r
/**\r
- * OTHER(Node,window,document,Image,Audio), XHR, Silverlight\r
+ * EventDispatcher がラップしている EventTarget オブジェクトのタイプです。<br>\r
+ * X_EventDispatcher_actualAddEvent で使用されます。<br>\r
+ * OTHER:0(node,window,document,Image,Audio), XHR:1, Silverlight:2\r
* @private\r
* @type {number}\r
*/\r
* this[ 'listen' ]( [ 'open', 'close', 'ready' ], onUpdate );\r
* \r
* @alias EventDispatcher.prototype.listen\r
- * @param {string|number|Array.<string,number>} type 配列を指定した場合、複数のイベントタイプに対して同じコールバックを登録する。\r
- * @param {listener|function|Array} [opt_arg1=]\r
- * @param {function|Array} [opt_arg2=]\r
- * @param {Array} [opt_arg3=] コールバック時の引数を配列に入れる。引数がひとつでも配列を使用する。省略した場合引数なし。\r
* @return {EventDispatcher} チェインメソッド\r
*/\r
function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){\r
};\r
\r
/**\r
- * イベントリスナの解除を行う。登録時と同じ引数を与える必要がある。kill() ですべてのイベントが解除されるので、途中で解除されるイベント以外は kill() に任せてしまってよい。\r
+ * イベントリスナの解除を行う。登録時と同じ引数を与える必要がある。kill() で自信に登録されたすべてのイベントが解除されるので、途中で解除されるイベント以外は kill() に任せてしまってよい。<br>\r
+ * 他人に登録したイベントを解除せずに kill するのは NG。\r
* @alias EventDispatcher.prototype.unlisten\r
* @return {EventDispatcher}\r
- * @param {string|number|Array.<string,number>} opt_type イベントID, イベント名、またはその配列\r
- * @param {listener|function|Array} opt_arg1\r
- * @param {function|Array} opt_arg2\r
- * @param {Array} opt_arg3\r
*/\r
function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
var listeners = this[ '_listeners' ],\r
X_ViewPort_rootElement = document.compatMode !== 'CSS1Compat' ? X_elmBody : X_elmHtml || X_elmBody;
/**
- * Node( documentElement )
+ * X.Node( documentElement )
* @alias X.Doc.html
* @type {Node}
*/
html[ '_flags' ] |= X_NodeFlags_IN_TREE;
/**
- * Node( head )
+ * X.Node( head )
* @alias X.Doc.head
* @type {Node}
*/
X[ 'Doc' ][ 'head' ] = head = X_Node_head = X_elmHead && Node( X_elmHead );
/**
- * Node( documentElement )
+ * X.Node( body )
* @alias X.Doc.body
* @type {Node}
*/
filters[ ++n ] = v;
break;
case 2 : //'opacity' :
- filters[ ++n ] = 'alpha(opacity=' + ( v * 100 | 0 ) +')';
+ if( v !== 1 ) filters[ ++n ] = 'alpha(opacity=' + ( v * 100 | 0 ) +')';
break;
case 3 : //'boxShadow' :
// TODO カンマ区切りの複数指定
* @namespace X.CSS
*/
X[ 'CSS' ] = {
-
+ /**
+ * @alias X.CSS.VENDER_PREFIX
+ */
'VENDER_PREFIX' : X_Node_CSS_VENDER_PREFIX,
- // iscroll で使用
- 'uncamelize' : X_Node_CSS_uncamelize,
-
+
+ /**
+ * @alias X.CSS.Support
+ */
'Support' : X_Node_CSS_Support
};
};
testStyle.cssText = 'background:rgba(0,0,0,0.5);border-color:transparent';
+/**
+ * 色指定に rgba() が使用できるか?
+ * @alias X.CSS.Support.rgba
+ * @type {boolean}
+ */
X_Node_CSS_Support[ 'rgba' ] = !!testStyle[ 'background' ];
+
+/**
+ * 色指定に transparent が使用できるか?
+ * @alias X.CSS.Support.transparent
+ * @type {boolean}
+ */
X_Node_CSS_Support[ 'transparent' ] = !!testStyle[ 'borderColor' ];
// TODO border による三角形の可否
// 2:完全、 1:透過に非対応(IE7-) 0:borderの描画が非標準で三角形が作れない
-
- /*
- * chrome 1+, ff3.5(1.9.1), ie9+, opera10.5+, Safari3+(522)
- */
+
if( prop = X_Node_CSS_VENDER_PREFIX[ 'boxShadow' ] ){
testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0';
+
+ /**
+ * boxShadow が使用できるか?
+ * chrome 1+, ff3.5(1.9.1), ie9+, opera10.5+, Safari3+(522)
+ * @alias X.CSS.Support.boxShadow
+ * @type {boolean}
+ */
X_Node_CSS_Support[ 'boxShadow' ] = !!testStyle[ prop ];
- /*
+ testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0, 0 0';
+
+ /**
+ * boxShadow の複数指定が使用できるか?<br>
* chrome 4+, ff3.5(1.9.1), ie9+, opera10.5+, Safari5+(533)
+ * @alias X.CSS.Support.boxShadowMulti
+ * @type {boolean}
*/
- testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0, 0 0';
X_Node_CSS_Support[ 'boxShadowMulti' ] = !!testStyle[ prop ];
- /*
- * https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow
- * この値を用いる場合には、spread-radius を省略出来ません。box-shadow が効かないケースに遭遇した時はこの事を思い出して下さい。
- * chrome 4+, ff3.5(1.9.1), ie9+, opera10.5+, Safari5+(533)
+ testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0 inset';
+
+ /**
+ * https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow<br>
+ * この値を用いる場合には、spread-radius を省略出来ません。box-shadow が効かないケースに遭遇した時はこの事を思い出して下さい。<br>
+ * chrome 4+, ff3.5(1.9.1), ie9+, opera10.5+, Safari5+(533)<br>
*
- * http://unformedbuilding.com/articles/considerations-when-using-the-box-shadow/
- * box-shadow:inset と border-radius を指定しているときの Google Chrome の表示
- * このバグは Windows と Linux で発生するようです。
- * Windows 版 Chrome 10.0.648.127 で修正されているのを確認しました。
+ * http://unformedbuilding.com/articles/considerations-when-using-the-box-shadow/<br>
+ * box-shadow:inset と border-radius を指定しているときの Google Chrome の表示<br>
+ * このバグは Windows と Linux で発生するようです。<br>
+ * Windows 版 Chrome 10.0.648.127 で修正されているのを確認しました。<br>
+ * @alias X.CSS.Support.boxShadowInset
+ * @type {boolean}
*/
- testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0 inset';
X_Node_CSS_Support[ 'boxShadowInset' ] = testStyle[ prop ] && testStyle[ prop ].indexOf( 'inset' ) !== -1;
};
-
testStyle.cssText = temp;
})();
* flash player 10.3, Mac 10.5
* flash player 11.1, Win2k, Android 2.x-4.x
*/
-var X_Pulgin_FLASH_VERSION =
+var X_Plugin_FLASH_VERSION =
!X_UA[ 'IE' ] || !X_UA[ 'ActiveX' ] ? parseFloat( X_Object_find( navigator, 'plugins>Shockwave Flash>version' ) || 0 ) :
!X_UA[ 'IE4' ] && !X_UA[ 'IE5' ] && X_UA[ 'ActiveX' ] ? (function(){
var obj = X_Script_createActiveXObjectSafty( 'ShockwaveFlash.ShockwaveFlash' );
})() :
0,
- X_Pulgin_SILVER_LIGHT_VERSION =
+ X_Plugin_SILVER_LIGHT_VERSION =
!X_UA[ 'IE' ] || !X_UA[ 'ActiveX' ] ? parseFloat( X_Object_find( navigator, 'plugins>Silverlight Plug-In>version' ) || 0 ) :
X_UA[ 'ActiveX' ] && 6 <= X_UA[ 'IE' ] ? (function(){
var obj = X_Script_createActiveXObjectSafty( 'AgControl.AgControl' ),
0,
//http://docs.unity3d.ru/Manual/Detecting%20the%20Unity%20Web%20Player%20using%20browser%20scripting.html
- X_Pulgin_UNITY_VERSION =
+ X_Plugin_UNITY_VERSION =
!X_UA[ 'IE' ] || !X_UA[ 'ActiveX' ] ?
parseFloat( X_Object_find( navigator, 'plugins>Unity Player>version' ) || 0 ) :
!X_UA[ 'IE4' ] && !X_UA[ 'IE5' ] && X_UA[ 'ActiveX' ] ? (function(){
})() :
0,
- X_Pulgin_GEARS_ENABLED =
+ X_Plugin_GEARS_ENABLED =
window.GearsFactory ||
( X_UA[ 'ActiveX' ] && 6 <= X_UA[ 'IE' ] ?
(function(){
// https://support.microsoft.com/ja-jp/kb/279022
// Windows Media Player 7 がクライアントにインストールされている場合に、自動的に Web ページに埋め込む方法
// TODO GeckoActiveXObject
- X_Pulgin_WMP_VERSION =
+ X_Plugin_WMP_VERSION =
!X_UA[ 'IE' ] || !X_UA[ 'ActiveX' ] ? 0 :
(function(){
var obj = X_Script_createActiveXObjectSafty( 'WMPlayer.OCX.7' );
// QuickTime Plug-in 7.7.6
/*
- X_Pulgin_QUICKTIME_VERSION =
+ X_Plugin_QUICKTIME_VERSION =
!X_UA[ 'IE' ] || !X_UA[ 'ActiveX' ] ? (function( plugins, k ){
for( k in plugins ){
if( k.indexOf( 'QuickTime' ) === 0 ) return parseFloat( k.substr( 18 ) ) || 0;
0, */
/**
- * @namespace X.Pulgin
+ * @namespace X.Plugin
*/
-X[ 'Pulgin' ] = {
+X[ 'Plugin' ] = {
- 'Flash' : X_Pulgin_FLASH_VERSION,
+ 'Flash' : X_Plugin_FLASH_VERSION,
// FlashLite
- 'Silverlight' : X_Pulgin_SILVER_LIGHT_VERSION,
+ 'Silverlight' : X_Plugin_SILVER_LIGHT_VERSION,
- 'Unity' : X_Pulgin_UNITY_VERSION,
+ 'Unity' : X_Plugin_UNITY_VERSION,
- //'QuickTime' : X_Pulgin_QUICKTIME_VERSION,
+ //'QuickTime' : X_Plugin_QUICKTIME_VERSION,
- 'Gears' : !!X_Pulgin_GEARS_ENABLED,
+ 'Gears' : !!X_Plugin_GEARS_ENABLED,
- 'WMP' : X_Pulgin_WMP_VERSION
+ 'WMP' : X_Plugin_WMP_VERSION
};
-//if( X_Pulgin_GEARS_ENABLED ) alert( 'X_Pulgin_GEARS_ENABLED' );
+//if( X_Plugin_GEARS_ENABLED ) alert( 'X_Plugin_GEARS_ENABLED' );
* モバイルブラウザでの iframe の挙動(Mobile Safari, Chrome for Android)\r
* \r
* @alias X.Util.NinjaIframe\r
- * @class 隠し iframe 機能を提供します。\r
- * @constructor \r
+ * @class NinjaIframe 隠し iframe 機能を提供します。\r
* @constructs NinjaIframe\r
* @extends {Node}\r
*/\r
* http://hakuhin.jp/as/javascript.html\r
* Flash から JavaScript にアクセスする(3+)\r
*/\r
- 'FLASH' : 4 <= X_Pulgin_FLASH_VERSION ? 8 : 0,\r
+ 'FLASH' : 4 <= X_Plugin_FLASH_VERSION ? 8 : 0,\r
\r
'GADGET' : 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ] ? 16 : 0,\r
\r
});\r
\r
/**\r
- * <p>複数のバックエンドから、与えられた音声を再生可能なものを見つけ、音声を再生します。\r
+ * <p>è¤\87æ\95°ã\81®ã\82ªã\83¼ã\83\87ã\82£ã\82ªã\83»ã\83\90ã\83\83ã\82¯ã\82¨ã\83³ã\83\89ã\81\8bã\82\89ã\80\81ä¸\8eã\81\88ã\82\89ã\82\8cã\81\9fé\9f³å£°ã\82\92å\86\8dç\94\9få\8f¯è\83½ã\81ªã\82\82ã\81®ã\82\92è¦\8bã\81¤ã\81\91ã\80\81é\9f³å£°ã\82\92å\86\8dç\94\9fã\81\97ã\81¾ã\81\99ã\80\82\r
* <p>HTMLAudio の動作・機能がブラウザ毎にバラバラなのに業を煮やし、メソッドやイベントは独自に定義しています。\r
* <h4>バックエンドの種類</h4>\r
* <p>HTMLAudio, WebAudio, Silverlight, WMP\r
* <h4>イベント</h4>\r
* <dl>\r
- * <dt>X.Event.BACKEND_READY <dd>音声(src リスト)を再生可能なバックエンドが見つかった。\r
- * <dt>X.Event.BACKEND_NONE <dd>音声を再生可能なバックエンドが見つからなかった。Audio は kill されます。\r
- * <dt>X.Event.READY <dd>再生可能、実際の状態は canplay から loadeddata まで様々、、、\r
- * <dt>X.Event.ERROR <dd><ul>\r
+ * <dt>X.Event.BACKEND_READY <dd>音声(src リスト)を再生可能なバックエンドが見つかった。\r
+ * <dt>X.Event.BACKEND_NONE <dd>音声を再生可能なバックエンドが見つからなかった。Audio は kill されます。\r
+ * <dt>X.Event.MEDIA_CAN_TOUCH <dd>モバイル端末の制約で音声の再生またはロードに、タッチを必要とする場合、タッチイベント内で play を呼び出す準備が出来たことを通知する。\r
+ * <dt>X.Event.READY <dd>再生可能、実際の状態は canplay から loadeddata まで様々、、、\r
+ * <dt>X.Event.ERROR <dd><ul>\r
* <li> 1 : ユーザーによってメディアの取得が中断された\r
* <li> 2 : ネットワークエラー\r
* <li> 3 : メディアのデコードエラー\r
* <dt>X.Event.MEDIA_PAUSED <dd>ポーズした\r
* <dt>X.Event.MEDIA_WAITING <dd>再生中に音声が待機状態に。\r
* <dt>X.Event.MEDIA_SEEKING <dd>シーク中に音声が待機状態に。\r
- * <dt>X.Event.MEDIA_CAN_TOUCH <dd>シーク中に音声が待機状態に。\r
* </dl>\r
* \r
* @alias X.Audio\r
* @type {string}\r
*/\r
'source' : '',\r
+ \r
/**\r
* 音声再生バックエンドの名前。X.Event.BACKEND_READY で設定される。\r
* @alias Audio.prototype.backendName\r
* @type {string}\r
*/\r
'backendName' : '',\r
- \r
- // TODO\r
+\r
'Constructor' : function( sourceList, opt_option ){\r
X_Audio_startDetectionBackend(\r
X_Audio_BACKENDS[ 0 ], this,\r
/**\r
* 再生。開始位置・終了位置、ループの有無、ループ以降の開始位置、ループ以降の終了位置\r
* @alias Audio.prototype.play\r
+ * @param {number=} startTime 開始時間を ms で\r
+ * @param {number=} endTime 終了時間を ms で\r
+ * @param {boolean=} endTime に達した際に曲をループさせるか\r
+ * @param {number=} loopStartTime ループ以後の開始時間を ms で\r
+ * @param {number=} loopEndTime ループ以後の終了時間を ms で\r
+ * @return {Audio} メソッドチェーン\r
*/\r
'play' : function( startTime, endTime, loop, loopStartTime, loopEndTime ){\r
var pair = X_Pair_get( this );\r
return this;\r
},\r
/**\r
- * シーク\r
+ * シーク、再生中で無い場合は次回再生開始位置の指定のみ\r
* @alias Audio.prototype.seek\r
+ * @param {number} seekTime シーク位置を ms で\r
+ * @return {Audio} メソッドチェーン\r
*/\r
'seek' : function( seekTime ){\r
var pair = X_Pair_get( this );\r
/**\r
* ポーズ\r
* @alias Audio.prototype.pause\r
+ * @return {Audio} メソッドチェーン\r
*/\r
'pause' : function(){\r
var pair = X_Pair_get( this );\r
/**\r
* 状態の getter と setter\r
* @alias Audio.prototype.state\r
+ * @param {object=} obj setter の場合、上書きする値を格納したobject\r
+ * @return {Audio|object}\r
+ * @example\r
+ * audio.setState(\r
+ {\r
+ 'startTime' : 0,\r
+ 'endTime' : 80000,\r
+ 'loopStartTime' : 120000,\r
+ 'loopEndTime' : 200000,\r
+ 'currentTime' : 0,\r
+ 'loop' : true,\r
+ 'looded' : false,\r
+ 'volume' : 1,\r
+ 'autoplay' : true\r
+ });\r
*/\r
'state' : function( obj ){\r
var pair = X_Pair_get( this );\r
'currentTime' : -1,\r
'loop' : false,\r
'looded' : false,\r
- 'error' : false,\r
+ 'error' : 0,\r
+ 'autoplay' : false,\r
'playing' : false,\r
- 'source' : this[ 'source' ] || '',\r
- 'duration' : 0\r
+ 'source' : this[ 'source' ],\r
+ 'duration' : 0,\r
+ 'volume' : 0.5\r
};\r
};\r
pair && pair.setState( obj );\r
return this;\r
}, \r
/**\r
- * ループの getter と setter\r
+ * ループの setter\r
* @alias Audio.prototype.loop\r
+ * @param {boolean} v \r
+ * @return {Audio}\r
*/\r
'loop' : function( v ){\r
var pair = X_Pair_get( this );\r
return this;\r
},\r
/**\r
- * ボリュームの getter と setter 実装不十分!\r
+ * ボリュームの setter 実装不十分!\r
* @alias Audio.prototype.volume\r
+ * @param {number} v \r
+ * @return {Audio}\r
*/\r
'volume' : function( v ){\r
var pair = X_Pair_get( this );\r
return this;\r
},\r
/**\r
- * 再生位置。\r
+ * å\86\8dç\94\9fä½\8dç½®ã\81®setterã\80\82\r
* @alias Audio.prototype.currentTime\r
+ * @param {number} v msで\r
+ * @return {Audio}\r
*/\r
'currentTime' : function( v ){\r
var pair = X_Pair_get( this );\r
/**\r
* 再生中か?\r
* @alias Audio.prototype.isPlaying\r
+ * @return {boolean}\r
*/\r
'isPlaying' : function(){\r
var pair = X_Pair_get( this );\r
'volume' : this.gain,\r
'playing' : this.playing, \r
'duration' : this.duration,\r
+ 'autoplay' : this.autoplay,\r
\r
'currentTime' : this.playing ? this.getActualCurrentTime() : this.seekTime,\r
'error' : this.getActualError ? this.getActualError() : this.error\r
var X_SLAudio,\r
X_SLAudio_uid = 0;\r
\r
-if( X_Pulgin_SILVER_LIGHT_VERSION ){\r
+if( X_Plugin_SILVER_LIGHT_VERSION ){\r
\r
X_TEMP.slaudioInit = function(){\r
//\r
var X_WMPAudio;
-if( X_Pulgin_WMP_VERSION ){ // IETester で 6.x は不可
+if( X_Plugin_WMP_VERSION ){ // IETester で 6.x は不可
X_WMPAudio = X_AudioBase[ 'inherits' ](
'X.WMPAudio',
X_Class.POOL_OBJECT,
this.disatcher = disatcher || this;
this._source = source;
- if( 7 <= X_Pulgin_WMP_VERSION ){
+ if( 7 <= X_Plugin_WMP_VERSION ){
this.xnodeObject = X_Node_systemNode[ 'create' ]( 'object', {
'classID' : 'CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6',
width : 1,
switch( e.type ){
case X_EVENT_AFTER_UPDATE :
this._readyState = 1;
- if( 7 <= X_Pulgin_WMP_VERSION ){
+ if( 7 <= X_Plugin_WMP_VERSION ){
this._wmp = this.xnodeObject[ '_rawObject' ];
this._wmp[ 'URL' ] = this._source;
this.wmp = this._wmp[ 'controls' ];
// road 中の場合
if( this._readyState === 1 ){
- if( 7 <= X_Pulgin_WMP_VERSION ){
+ if( 7 <= X_Plugin_WMP_VERSION ){
progress = this._wmp[ 'network' ][ 'downloadProgress' ];
} else {
progress = this.wmp[ 'BufferingProgress' ];
this.disatcher[ 'dispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : progress } );
} else {
this._readyState = 2;
- if( 7 <= X_Pulgin_WMP_VERSION ){
+ if( 7 <= X_Plugin_WMP_VERSION ){
this.duration = this._wmp[ 'currentMedia' ].duration * 1000 | 0;
} else {
this.duration = this.wmp[ 'Duration' ] * 1000 | 0;
},
setVolume : function(){
- if( 7 <= X_Pulgin_WMP_VERSION ){
+ if( 7 <= X_Plugin_WMP_VERSION ){
this._wmp[ 'settings' ][ 'Volume' ] = this.gain * 100;
} else {
this.wmp[ 'Volume' ] = ( 1 - this.gain ) * 10000;
X_Audio_BACKENDS.push( {
backendID : 16,
- backendName : 'WMP' + X_Pulgin_WMP_VERSION,
+ backendName : 'WMP' + X_Plugin_WMP_VERSION,
canPlay : {
'mp3' : true,
ANIME_BEFORE_STOP : ++X_Event_last, // before cancel\r
ANIME_STOP : ++X_Event_last,\r
\r
- PAGE_BEFORE_SHOW : ++X_Event_last,\r
+ PAGE_SHOW_BEFORE : ++X_Event_last,\r
PAGE_SHOW : ++X_Event_last,\r
- PAGE_AFTER_SHOW : ++X_Event_last,\r
- PAGE_BEFORE_HIDE : ++X_Event_last,\r
+ PAGE_SHOW_AFTER : ++X_Event_last,\r
+ PAGE_HIDE_BEFORE : ++X_Event_last,\r
PAGE_HIDE : ++X_Event_last,\r
- PAGE_AFTER_HIDE : ++X_Event_last,\r
+ PAGE_HIDE_AFTER : ++X_Event_last,\r
\r
// X.UI.Form\r
CHANGE : ++X_Event_last,\r
\r
\r
var XUI_Gesture_LIST = [\r
- /**\r
+ /*\r
* Touch\r
* Called as first, tells the user has touched the screen\r
* @events touch\r
}\r
},\r
\r
- /**\r
+ /*\r
* Transform\r
* User want to scale or rotate with 2 fingers\r
* @events transform, transformstart, transformend, pinch, pinchin, pinchout, rotate\r
}\r
},\r
\r
- /**\r
+ /*\r
* Drag\r
* Move with x fingers (default 1) around on the page. Blocking the scrolling when\r
* moving left and right is a good practice. When all the drag events are blocking\r
}\r
},\r
\r
- /**\r
+ /*\r
* Tap/DoubleTap\r
* Quick touch at a place or double at the same place\r
* @events tap, doubletap\r
case 2:\r
\r
case 1:\r
- this.xnode[ 'kill' ]();\r
+ this.xnode[ 'remove' ]();\r
\r
delete this.root;\r
delete this.rootData;\r
delete this.parent;\r
delete this.parentData;\r
- delete this.xnode;\r
\r
delete this.phase;\r
};\r
delete this.rootData;\r
delete this.parent;\r
delete this.parentData;\r
- delete this.xnode;\r
};\r
delete this.phase;\r
}\r
XUI_ScrollBox_indicatorV = X_Doc_create( 'div' )[ 'className' ]( 'ScrollBox-IndicatorV' );\r
\r
};\r
- XUI_ScrollBox_indicatorV.parent !== scrollBox.xnode && scrollBox.xnode[ 'append' ]( XUI_ScrollBox_indicatorV );\r
+ scrollBox.xnode[ 'append' ]( XUI_ScrollBox_indicatorV );\r
XUI_ScrollBox_indicatorV[ 'animate' ](\r
{ opacity : 0 },\r
{ opacity : 1 },\r
if( !XUI_ScrollBox_indicatorH ){\r
XUI_ScrollBox_indicatorH = X_Doc_create( 'div' )[ 'className' ]( 'ScrollBox-IndicatorH' );\r
};\r
- XUI_ScrollBox_indicatorH.parent !== scrollBox.xnode && scrollBox.xnode[ 'append' ]( XUI_ScrollBox_indicatorH );\r
+ scrollBox.xnode[ 'append' ]( XUI_ScrollBox_indicatorH );\r
XUI_ScrollBox_indicatorH[ 'animate' ](\r
{ opacity : 0 },\r
{ opacity : 1 },\r
\r
_remove : function(){\r
XUI_AbstractUINode.prototype._remove.apply( this, arguments );\r
+ \r
if( this.scrolling ){\r
- // remove scroll\r
+ // scroller 削除\r
+ this[ 'unlisten' ]( XUI_Event._POINTER_DOWN, X_UI_ScrollBox_onStart )\r
+ [ 'unlisten' ]( XUI_Event.DRAG, X_UI_ScrollBox_onMove )\r
+ [ 'unlisten' ]( XUI_Event.DRAG_END, X_UI_ScrollBox_onEnd );\r
+ XUI_rootData[ 'unlisten' ]( XUI_Event.LAYOUT_BEFORE, this, X_UI_ScrollBox_onLayoutBefore );\r
+ \r
+ XUI_rootData[ 'unlisten' ]( XUI_Event.LAYOUT_COMPLETE, this, X_UI_ScrollBox_onLayoutComplete );\r
+ this[ 'unlisten' ]( XUI_Event.SCROLL_END, XUI_rootData, XUI_rootData.calculate );\r
+ \r
+ this.xnodeSlider[ 'stop' ]();\r
};\r
}\r
\r
X_UI_ScrollBox_translate( this, this.scrollXMax * this.scrollXRatio, this.scrollYMax * this.scrollYRatio, 100, '', 300 );\r
} else {\r
// scroller 作る\r
- // shadow の listen には this が必要!\r
- // TODO AbstractUI の listen が悪い!\r
- this[ 'listen' ]( XUI_Event._POINTER_DOWN, this, X_UI_ScrollBox_onStart )\r
- [ 'listen' ]( XUI_Event.DRAG, this, X_UI_ScrollBox_onMove );\r
- this[ 'listen' ]( XUI_Event.DRAG_END, this, X_UI_ScrollBox_onEnd );\r
+ this[ 'listen' ]( XUI_Event._POINTER_DOWN, X_UI_ScrollBox_onStart )\r
+ [ 'listen' ]( XUI_Event.DRAG, X_UI_ScrollBox_onMove )\r
+ [ 'listen' ]( XUI_Event.DRAG_END, X_UI_ScrollBox_onEnd );\r
XUI_rootData[ 'listen' ]( XUI_Event.LAYOUT_BEFORE, this, X_UI_ScrollBox_onLayoutBefore );\r
\r
X_UI_ScrollBox_translate( this, this.scrollXMax * this.scrollXRatio, this.scrollYMax * this.scrollYRatio, 100, '', 300 );\r
// scroll 不要\r
if( this.scrolling ){\r
// scroller 削除\r
- this[ 'unlisten' ]( XUI_Event._POINTER_DOWN, this, X_UI_ScrollBox_onStart )\r
- [ 'unlisten' ]( XUI_Event.DRAG, this, X_UI_ScrollBox_onMove );\r
- this[ 'unlisten' ]( XUI_Event.DRAG_END, this, X_UI_ScrollBox_onEnd );\r
+ this[ 'unlisten' ]( XUI_Event._POINTER_DOWN, X_UI_ScrollBox_onStart )\r
+ [ 'unlisten' ]( XUI_Event.DRAG, X_UI_ScrollBox_onMove )\r
+ [ 'unlisten' ]( XUI_Event.DRAG_END, X_UI_ScrollBox_onEnd );\r
XUI_rootData[ 'unlisten' ]( XUI_Event.LAYOUT_BEFORE, this, X_UI_ScrollBox_onLayoutBefore );\r
\r
( this.scrollX !== 0 || this.scrollY !== 0 ) && X_UI_ScrollBox_translate( this, 0, 0, 100, '', 300 );\r
this.User = user;\r
this.xnode = X_Doc_create( 'div' );\r
\r
- if( X_Type_isString( content ) && content ){\r
- this.content = content;\r
+ if( content != null ){\r
+ this.content = '' + content;\r
};\r
},\r
\r
\r
XUI_AbstractUINode.prototype.setItemData.apply( this, arguments );\r
\r
- if( X_Type_isObject( itemData = this.itemData ) && this.dataFeild ){\r
- this.setContent( itemData[ this.dataFeild ] || '' );\r
+ if( X_Type_isObject( itemData = this.itemData ) && itemData[ this.dataFeild ] != null ){\r
+ this.setContent( '' + itemData[ this.dataFeild ] );\r
};\r
}\r
}\r
if( v === undefined ){\r
return content;\r
};\r
+ v += '';\r
content !== v && data.setContent( v );\r
return this;\r
}\r
\r
-X(\r
- function(){\r
- var source = [\r
- {\r
- label : 'ぺったんR',\r
- summary : X.VERSION + ( X.buildTimeStamp ? ' ' + X.buildTimeStamp : '' )\r
- },\r
- {\r
- label : 'レンダリングエンジン',\r
- summary : X.UA.IE ? 'Trident' :\r
- X.UA.Opera ? 'Presto' :\r
- X.UA.Gecko ? 'Gecko' :\r
- X.UA.KHTML ? 'KHTML' : X.UA.WebKit ? 'WebKit' : X.UA.Blink ? 'Blink' :\r
- X.UA.Edge ? 'Edge' : 'Other'\r
- },\r
- {\r
- label : 'OS',\r
- summary : X.UA.Windows ? 'Windows' : X.UA.Mac ? 'Mac' : X.UA.Android ? 'Android' : X.UA.iOS ? 'iOS' : 'Other'\r
- },\r
- {\r
- label : '起動時間',\r
- summary : X.bootSpeed + 'ms'\r
- },\r
- {\r
- label : '設定'\r
- },\r
- {\r
- label : '情報'\r
- },\r
- {\r
- label : 'ローカルストレージ'\r
- },\r
- {\r
- label : '外部API接続'\r
- },\r
- {\r
- label : 'HID'\r
- }\r
- ];\r
+X( function(){\r
+ with( X.UI ){\r
+ Page(\r
+ 'ホーム',\r
+ 'home',\r
+ List(\r
+ [\r
+ {\r
+ label : 'ぺったんR',\r
+ summary : X.VERSION + ( X.buildTimeStamp ? ' ' + X.buildTimeStamp : '' )\r
+ },\r
+ { label : 'ツール' },\r
+ { label : 'テスト' , next : 'test' },\r
+ { label : '情報' , next : 'info' },\r
+ { label : 'ローカルストレージ' },\r
+ { label : '外部API接続' }\r
+ ],\r
+ AndroidItem()\r
+ )\r
+ ).show();\r
\r
+ Page(\r
+ 'テスト目次',\r
+ 'test',\r
+ List(\r
+ [\r
+ { label : '戻る', back : true },\r
+ { label : 'インタラクション・ジェスチャー' },\r
+ { label : 'Ajax' },\r
+ { label : 'マルチメディア' }\r
+ ],\r
+ AndroidItem()\r
+ )\r
+ );\r
\r
- with( X.UI ){\r
- Root(\r
- List(\r
- source,\r
- AndroidItem().listen( X.UI.Event.ITEMDATA_CHANGED )\r
- )\r
- ); \r
- };\r
- }\r
-);\r
+ Page(\r
+ '情報',\r
+ 'info',\r
+ List(\r
+ [\r
+ { label : '戻る', back : true },\r
+ { label : 'システムスコア' , next : 'spec' },\r
+ { label : 'OS・ブラウザ' , next : 'ua' },\r
+ { label : 'プラグインとアドオン', next : 'plugin' },\r
+ { label : 'ストレージ' },\r
+ { label : 'HID' },\r
+ { label : 'pettanR ビルド情報' }\r
+ ],\r
+ AndroidItem()\r
+ )\r
+ );\r
+\r
+ Page(\r
+ 'システムスコア',\r
+ 'spec',\r
+ List(\r
+ [\r
+ { label : '戻る', back : true },\r
+ {\r
+ label : '起動時間',\r
+ summary : X.bootSpeed + 'ms'\r
+ }\r
+ ],\r
+ AndroidItem()\r
+ )\r
+ );\r
+\r
+ Page(\r
+ 'OS・ブラウザ',\r
+ 'ua',\r
+ List(\r
+ [\r
+ { label : '戻る', back : true },\r
+ {\r
+ label : 'ブラウザ',\r
+ summary : X.UA.IE ? 'IE ' + X.UA.IE :\r
+ X.UA.Opera ? 'Presto Opera ' + X.UA.Opera :\r
+ X.UA.Gecko ? 'Gecko ' + X.UA.Gecko :\r
+ X.UA.KHTML ? 'KHTML ' + X.UA.KHTML :\r
+ X.UA.WebKit ? 'WebKit ' + X.UA.WebKit :\r
+ X.UA.BlinkOpera ? 'Blink Opera ' + X.UA.BlinkOpera :\r
+ X.UA.Blink ? 'Blink ' + X.UA.Blink :\r
+ X.UA.AOSP ? 'AOSP ' + X.UA.AOSP :\r
+ X.UA.ChromeWV ? 'Chrome WebView ' + X.UA.ChromeWV :\r
+ X.UA.Edge ? 'Edge' + X.UA.Edge : 'Other'\r
+ },\r
+ {\r
+ label : 'OS',\r
+ summary : X.UA.Windows ? 'Windows ' + X.UA.Windows : X.UA.Mac ? 'Mac' : X.UA.Android ? 'Android' : X.UA.iOS ? 'iOS' : 'Other'\r
+ },\r
+ {\r
+ label : 'ユーザーエージェント文字列',\r
+ summary : navigator.userAgent\r
+ },\r
+ {\r
+ label : 'プラットフォーム',\r
+ summary : 'navigator.platform=' + navigator.platform\r
+ },\r
+ {\r
+ label : 'アプリ名',\r
+ summary : 'navigator.appName=' + navigator.appName\r
+ },\r
+ {\r
+ label : 'アプリコード名',\r
+ summary : 'navigator.appCodeName=' + navigator.appCodeName\r
+ },\r
+ {\r
+ label : 'アプリバージョン',\r
+ summary : 'navigator.appVersion=' + navigator.appVersion\r
+ }\r
+ ],\r
+ AndroidItem()\r
+ )\r
+ );\r
+\r
+ Page(\r
+ 'プラグインとアドオン',\r
+ 'plugin',\r
+ List(\r
+ [\r
+ { label : '戻る', back : true },\r
+ {\r
+ label : 'Adobe FlashPlayer',\r
+ summary : X.Plugin.Flash || '-'\r
+ },\r
+ {\r
+ label : 'Silverlight',\r
+ summary : X.Plugin.Silverlight || '-'\r
+ },\r
+ {\r
+ label : 'Unity Web Player',\r
+ summary : X.Plugin.Unity || '-'\r
+ },\r
+ {\r
+ label : 'Google Gears',\r
+ summary : X.Plugin.Gears ? 'o' : '-'\r
+ },\r
+ {\r
+ label : 'Windows Media Player',\r
+ summary : X.Plugin.WMP || '-'\r
+ }\r
+ ],\r
+ AndroidItem()\r
+ )\r
+ );\r
+ \r
+ };\r
+} );\r
\r
\r
var AndroidItem = X.UI.Box.inherits(\r
'AndroidItem',\r
X.Class.NONE,\r
{\r
+ next : '',\r
+ back : false, \r
+ \r
Constructor : function(){\r
this.Super( {\r
sizing : 'border',\r
height : 4,\r
left : 0,\r
right : 0\r
- } ).listen( X.UI.Event.TAP );\r
+ } )\r
+ .listen( X.UI.Event.TAP )\r
+ .listen( X.UI.Event.ITEMDATA_CHANGED );\r
},\r
- \r
+\r
handleEvent : function( e ){\r
var txt;\r
\r
left : 1\r
} ) );\r
};\r
+ \r
+ if( e.itemData.next ){\r
+ this.add( X.UI.Text( String.fromCharCode( 9654 ), {\r
+ fontColor : 0xAAAAAA,\r
+ fontBold : true,\r
+ top : 1.35,\r
+ width : 1,\r
+ right : 1\r
+ } ) );\r
+ \r
+ this.next = e.itemData.next;\r
+ } else\r
+ if( e.itemData.back ){\r
+ this.back = true;\r
+ };\r
break;\r
\r
case X.UI.Event.TAP :\r
txt = this.getNodeAt( 0 );\r
txt.content( txt.content() + '+' );\r
+ \r
+ if( this.next ){\r
+ X.UI.Page.move( this.next );\r
+ } else\r
+ if( this.back ){\r
+ X.UI.Page.back();\r
+ };\r
+ \r
};\r
} \r
} \r
);\r
\r
-\r
-\r
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
\r
<title>Logger</title>\r
- \r
+ <meta name="msapplication-tap-highlight" content="no">\r
<meta name="HandheldFriendly" content="true">\r
<meta name="mobileoptimized" content="0">\r
\r