};\r
\r
//{+DEV\r
-if( !window['console'] || ( window.parent && window.parent.log ) )\r
+if( !window['console'] || ( window.parent && window.parent.log ) ){\r
console = {\r
log : function(a){\r
- var win, elm;\r
+ var 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
- dir : function(){}\r
- };\r
+ }\r
+ }; \r
+};\r
+\r
+if( !console.dir ) console.dir = function(){};\r
//+DEV}\r
\r
//{-AUDIO\r
* @alias X.Type.isFinite\r
*/\r
function X_Type_isFinite( v ){\r
- return typeof v === 'number' && isFinite( v );\r
+ return v + 0 === v && isFinite( v );\r
};\r
/**\r
* NaN か?判定する。isNaN( 'NaN' ) === true に対策済。\r
* <ol>\r
* <li>as3 の EventDispatcher ライクなクラス。そのまま使ったり、継承したり。\r
* <li>_rawObject メンバがいる場合、addEventListener, attachEvent, on 等で生のブラウザオブジェクトにリスナを登録する。\r
- * window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject\r
- * <li>イベントディスパッチにリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。\r
+ * window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject になる。\r
+ * <li>イベントディスパッチ中にリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。\r
* </ol>\r
* \r
* <blockquot>\r
* \r
* <p>またコールバックに対して、this コンテキストや、追加の引数を指定もできます。 this コンテキストを指定しなかった場合、EventDispatcher インスタンスがコールバックの this になります。 \r
* \r
- * <p>unlisten() ã\81¯ã\80\81å¼\95æ\95°ã\82\92æ\8c\87å®\9aã\81\97ã\81ªã\81\8bã\81£ã\81\9få ´å\90\88ã\80\81å\85¨ã\81¦ã\81®ã\82¤ã\83\99ã\83³ã\83\88ã\82\92解é\99¤ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\80\81systemListen 経由で登録されたハンドラは解除されません。\r
+ * <p>unlisten() ã\81§ã\81¯ systemListen 経由で登録されたハンドラは解除されません。\r
* \r
* systemListen, systemUnlisten は、ライブラリ内のコードからしかアクセスできません。\r
* \r
'_rawType' : X_EventDispatcher_EVENT_TARGET_OTHER,\r
\r
/**\r
- * イベントリスナをイベント名文字列や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
- * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
+ * イベントリスナをイベント名文字列や数値(5以上、フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
+ * Arrayには、{kind:種類,context:コンテキスト(thisObject),func:コールバック関数,supplement:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
* \r
* @private\r
* @type {__X_EventDispatcher_Listeners__}\r
\r
/**\r
* <p>イベントリスナの登録状況を真偽値で返す。戻り値が数値(index)の場合もあるが、これは内部のみで使用。\r
- * <p>this[ 'listening' ](); のように type を省略した場合、一つでも登録があれば true を返す。\r
- * <p>this[ 'listening' ]( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。\r
+ * <p>this.listening(); のように type を省略した場合、一つでも登録があれば true を返す。\r
+ * <p>this.listening( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。\r
* <p>type と イベントリスナの組み合わせが登録されているかを調べる場合は、listen 時の thisObject や args(Array) も一致させて渡す必要がある。\r
* \r
* @example \r
- * this[ 'listen' ]( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] );\r
- * this[ 'listening' ]( 'myevent', this, onMyEvent, args ) === true;\r
+ * this.listen( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] );\r
+ * this.listening( 'myevent', this, onMyEvent, args ) === true;\r
* \r
* @return {number|boolean}\r
* @param {string|number} opt_type\r
* kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。インスタンスが破棄された後にタイマーが呼ばれることがないので神経質にならなくても安全に使える。\r
* @example this[ 'asyncDispatch' ]( 'myevent' );\r
* // どちらのコードも同じ動作をする。\r
- * this[ 'asyncDispatch' ]( 0, 'myevent' );\r
+ * this.asyncDispatch( 0, 'myevent' );\r
* @param {number|eventHash|string} delay ms 省略した場合は 0 として扱う asyncDispatch( 'myevent' ) -> asyncDispatch( 0, 'myevent' )\r
* @param {eventHash|string|number} e イベントを表す数値、文字列、{ type : XXX, ... } なオブジェクト\r
* @return {number} X.Timer.add() の戻り値\r
type = e[ 'type' ],\r
list, unlistens, i, l, args, f, r, sysOnly, timerID;\r
\r
- if( !listeners || !( list = listeners[ type || e ] ) ) return ret;\r
+ if( !listeners || !( list = listeners[ type || e ] ) ) return X_Callback_NONE;\r
\r
// 数値, 文字が渡された場合\r
if( !type ){\r
};\r
if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
\r
- r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) );\r
+ r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) ) || 0;\r
\r
if( f.once || r & X_Callback_UN_LISTEN ){\r
// dispatch 中に unlisten が作られることがある\r
};\r
ret |= X_Type_isFinite( r ) ? r : 0;\r
\r
- if( r & X_Callback_STOP_NOW === X_Callback_STOP_NOW ){\r
+ if( ( r & X_Callback_STOP_NOW ) === X_Callback_STOP_NOW ){ // iOS では ( & ) 括弧が無いと判定を誤る\r
sysOnly = true;\r
break;\r
- }; \r
+ };\r
};\r
\r
if( ( --listeners[ X_LISTENERS_DISPATCHING ] ) === 0 ){\r
this._rawXML = xml;\r
};\r
\r
-XMLWrapper.prototype.length = 1;\r
-XMLWrapper.prototype.has = XMLWrapper_has;\r
-XMLWrapper.prototype.get = XMLWrapper_get;\r
-XMLWrapper.prototype.val = XMLWrapper_val;\r
-XMLWrapper.prototype.find = XMLWrapper_find;\r
+XMLWrapper.prototype.length = 1;\r
+XMLWrapper.prototype[ 'has' ] = XMLWrapper_has;\r
+XMLWrapper.prototype[ 'get' ] = XMLWrapper_get;\r
+XMLWrapper.prototype[ 'val' ] = XMLWrapper_val;\r
+XMLWrapper.prototype[ 'find' ] = XMLWrapper_find;\r
\r
function XMLWrapper_has( queryString ){\r
return !!this.find( queryString ).length;\r
\r
var XMLListWrapper_0 = new XMLListWrapper();\r
\r
-XMLListWrapper.prototype.length = 0;\r
-XMLListWrapper.prototype._wraps = null;\r
-XMLListWrapper.prototype.has = XMLWrapper_has;\r
-XMLListWrapper.prototype.get = XMLWrapper_get;\r
-XMLListWrapper.prototype.val = XMLWrapper_val;\r
-XMLListWrapper.prototype.find = XMLWrapper_find;\r
+XMLListWrapper.prototype.length = 0;\r
+XMLListWrapper.prototype._wraps = null;\r
+XMLListWrapper.prototype[ 'has' ] = XMLWrapper_has;\r
+XMLListWrapper.prototype[ 'get' ] = XMLWrapper_get;\r
+XMLListWrapper.prototype[ 'val' ] = XMLWrapper_val;\r
+XMLListWrapper.prototype[ 'find' ] = XMLWrapper_find;\r
* <dt>dataType<dd>'text', 'json', 'xml', 'blob', 'arraybuffer' 等。xhr.responseType に指定する値\r
* <dt>mimeType<dd>'text/xml', 'audio/mpeg' 等。xhr.overrideMimeType する値\r
* <dt>auth<dd>X.OAuth2 インスタンス(OAuth2 サービスの定義)\r
- * <dt>getFullHeaders<dd>getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。\r
+ * <dt>getFullHeaders<dd>getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。XDR は Content-Type しか取得でいない。\r
+ * <dt>canUse<dd>未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている\r
* </dl>\r
* \r
* @alias X.Net\r
6 <= X_UA[ 'iOS' ] ? 'loadeddata' :\r
X_UA[ 'iOS' ] < 5 ? 'stalled' :\r
X_UA[ 'iOS' ] ? 'suspend' :\r
- X_UA[ 'AndroidBrowser2' ] ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,,\r
+ X_UA[ 'AndroidBrowser2' ] || X_UA[ 'AndroidBrowser3' ] ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,,\r
X_UA[ 'AndroidBrowser4' ] ? 'loadeddata' : \r
- X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' : 'loadeddata', //'canplay',\r
+ X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' :\r
+ //X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ? 'canplay' :\r
+ 'loadeddata', //'canplay',\r
X_Audio_HTMLAudioWrapper,\r
X_Audio_constructor = window[ 'Audio' ] || window.HTMLAudioElement,\r
X_Audio_rawAudio,\r
\r
X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( e.type );\r
\r
- //console.log( e.type );\r
+ X_Audio_HTMLAudioWrapper_ieMobile9Fix && e.type !== 'timeupdate' && console.log( e.type );\r
\r
switch( e.type ){\r
case 'loadstart' : // ブラウザがコンテンツの検索を開始した場合に発生\r
if( this.playing ){\r
end = X_AudioWrapper_getEndTime( this );\r
now = this.getActualCurrentTime();\r
- //console.log( end + ' / ' + now );\r
+ console.log( end + ' / ' + now );\r
if( 0 + end <= 0 + now ){ // なぜか iem9 で必要,,,\r
if( this.autoLoop ){\r
if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_Callback_PREVENT_DEFAULT ) ){\r
\r
// もし kill 後に autoplayTimer で呼ばれても、_closed==true なので平気\r
if( this._closed ) return;\r
- if( !this._loaded /* && !X_Audio_Sprite_inTouchAction */ ){\r
+ if( !this._loaded && !X_Audio_HTMLAudioWrapper_ieMobile9Fix /* && !X_Audio_Sprite_inTouchAction */ ){\r
this.autoplay = true;\r
return;\r
};\r
-\r
+ \r
if( X_Audio_HTMLAudioWrapper_ieMobile9Fix && this._playForDuration === 0 ){\r
console.log( 'DurationFix開始 - ' + this[ '_rawObject' ].duration );\r
this._playForDuration = 1;\r
X_Timer_once( 0, this, this._fixForChrome );\r
this[ '_rawObject' ].volume = 0;\r
} else {\r
- this[ '_rawObject' ].volume = this.gain;\r
+ this[ '_rawObject' ].volume = X_Audio_HTMLAudioWrapper_ieMobile9Fix ? 1 : this.gain;\r
};\r
this[ '_rawObject' ].play();\r
this.playing = true;\r
this.actualPlay();\r
} else\r
if( result & 4 ){\r
- this[ '_rawObject' ].volume = this.gain;\r
+ this[ '_rawObject' ].volume = X_Audio_HTMLAudioWrapper_ieMobile9Fix ? 1 : this.gain;\r
}; \r
}\r
\r
X_Audio_Sprite_useVideoForMulti = 4 <= X_UA[ 'AndroidBrowser' ] && 534.3 < X_UA[ 'AndroidWebkit' ], // ドスパラパッドはビデオのインライン再生が不可 \r
X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti, \r
X_Audio_Sprite_needTouchFirst = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
- X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ),\r
+ X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ) && !( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
X_Audio_Sprite_maxTracks = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9,\r
X_Audio_Sprite_lengthSilence = 10000, // 一番最初の無音部分の長さ\r
i = 0, l = tracks.length;\r
for( ; i < l; ++i ){\r
if( X_UA[ 'WinPhone' ] ){\r
- console.log( 'touch -> play()' );\r
+ console.log( 'WinPhone : touch -> play()' );\r
//tracks[ i ].play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 );\r
this[ 'pause' ]( i );\r
} else {\r
};\r
\r
return X_Callback_STOP_NOW;\r
- break;\r
\r
case X_EVENT_BACKEND_NONE :\r
this[ 'unlisten' ]( X_EVENT_BACKEND_READY, this, X_AudioSprite_backendHandler )\r
[ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );\r
return X_Callback_STOP_NOW;\r
- break;\r
\r
case X_EVENT_READY :\r
console.log( 'X.AudioSprite - Ready!' );\r
node = uinodes[ i ];\r
node.calculate( detectionPhase, 0, _y, contentW, childH );\r
_y += node.boxHeight + gapY;\r
- console.dir( node );\r
+ //console.dir( node );\r
// 概算のみ\r
if( autoW ){\r
if( node.boxWidth !== XUI_Attr_AUTO ){\r