};\r
};\r
};\r
+ \r
return result.join( '' );\r
};\r
\r
\r
'override' : X_Object_override,\r
\r
+ 'clear' : X_Object_clear,\r
+ \r
'deepCopy' : X_Object_deepCopy,\r
\r
// TODO rename to X.Array.copy\r
};\r
\r
/**\r
+ * オブジェクトの全てのメンバーを破棄します。\r
+ * @alias X.Object.clear\r
+ * @param {object} obj。\r
+ */\r
+function X_Object_clear( obj, k ){\r
+ if( obj ){\r
+ for( k in obj ){\r
+ delete obj[ k ];\r
+ };\r
+ };\r
+};\r
+\r
+\r
+/**\r
* オブジェクト(object, Array)のメンバーを探索して、ディープコピーしたオブジェクトを返します。\r
* オブジェクトが循環参照している場合は、既にコピーしているオブジェクトが現れた時点で、先に作成しているコピーの参照を返すので無限にループすることはありません。\r
* @alias X.Object.deepCopy\r
+/**\r
+ * Object(Array|Function)をキーにする、キーバリューストアを作る。js 自体にオブジェクトをキーとするハッシュの機能は無い為、内部はArrayで代用している。そのため値へのアクセスは低速。\r
+ * 値を隠蔽したい場合に加え、速度が問題にならないケースや、速度対策を実施したうえで使用する。\r
+ * @namespace X.Pair\r
+ */\r
X[ 'Pair' ] = {\r
'create' : X_Pair_create,\r
\r
'release' : X_Pair_release\r
};\r
\r
-var X_Pair_SIZE = 1000,\r
+var X_Pair_SIZE = 1024,\r
X_Pair_KEY_STORE_LIST = [[]],\r
X_Pair_PAIR_STORE_LIST = [[]],\r
X_Pair_noChashe = false,\r
// TODO キャッシュするペアの数とヒット率、探索時間の記録\r
X_Pair_lastKey, X_Pair_lastPair;\r
\r
+/**\r
+ * Object(Array|Function)をキーとして値を登録。すでにキーが登録されている場合は登録できない。\r
+ * @alias X.Pair.create\r
+ * @param {object|function|array} key\r
+ * @param {*} pair == false な値は不可\r
+ * @return {boolean} true の場合、登録成功\r
+ */\r
function X_Pair_create( key, pair ){\r
var keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length - 1 ],\r
pairStore = X_Pair_PAIR_STORE_LIST[ X_Pair_PAIR_STORE_LIST.length - 1 ];\r
\r
X_Pair_noChashe = true;\r
- if( X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return;\r
+ if( !pair || X_Pair_get( key ) || !( X_Type_isObject( key ) || X_Type_isArray( key ) || X_Type_isFunction( key ) ) ) return false;\r
\r
if( keyStore.length === X_Pair_SIZE ){\r
keyStore = X_Pair_KEY_STORE_LIST[ X_Pair_KEY_STORE_LIST.length ] = [];\r
\r
keyStore[ keyStore.length ] = key;\r
pairStore[ pairStore.length ] = pair;\r
+ return true;\r
};\r
\r
+/**\r
+ * キーとペアになっている値の取得。\r
+ * @alias X.Pair.get\r
+ * @param {object|function|array} key\r
+ * @return {*}\r
+ */\r
function X_Pair_get( key ){\r
var chashe = !X_Pair_noChashe, pair;\r
\r
return pair;\r
};\r
\r
+/**\r
+ * キー/バリューのペアを解消する。バリューは指定しなくても可。\r
+ * @alias X.Pair.release\r
+ * @param {object|function|array} key\r
+ * @param {*} [pair=]\r
+ * @return {boolean} true の場合解除成功\r
+ */\r
function X_Pair_release( key, opt_pair ){\r
var i = 0,\r
l = X_Pair_KEY_STORE_LIST.length,\r
if( X_Pair_lastKey === key ){\r
X_Pair_lastKey = X_Pair_lastPair = null;\r
};\r
- break;\r
+ return true;\r
};\r
};\r
+ return false;\r
};\r
/**\r
* X.Timer と X.EventDispatcher からのコールバックの返り値を定義。\r
* @namespace X.Callback\r
- * @alias X.Callback\r
*/\r
X[ 'Callback' ] = {\r
/**\r
* このコールバックでは返り値による操作は無い。\r
+ * @alias X.Callback.NONE\r
*/\r
'NONE' : X_Callback_NONE,\r
/**\r
* X.Timer, X.EventDispatcher のコールバックでタイマーやイベントリスナの解除に使用。\r
+ * @alias X.Callback.UN_LISTEN\r
*/\r
'UN_LISTEN' : X_Callback_UN_LISTEN,\r
/**\r
* 上位階層へのイベント伝播のキャンセル。DOM イベントのコールバックの戻り値に指定すると e.stopPropagation() が呼ばれる。\r
+ * @alias X.Callback.STOP_PROPAGATION\r
*/\r
'STOP_PROPAGATION' : X_Callback_STOP_PROPAGATION,\r
/**\r
* 以降のイベントのディスパッチを中断する。STOP_PROPAGATION との違いは、次に控えているコールバックもキャンセルされる点。但し system によって追加されたイベントはキャンセルされない。\r
+ * @alias X.Callback.STOP_NOW\r
*/\r
'STOP_NOW' : X_Callback_STOP_NOW,\r
/**\r
* DOM イベントのコールバックの戻り値に指定すると e.preventDefault() が呼ばれる。\r
* またフレームワーク内で定義されたデフォルト動作の回避にも使用される。\r
+ * @alias X.Callback.PREVENT_DEFAULT\r
*/\r
'PREVENT_DEFAULT' : X_Callback_PREVENT_DEFAULT,\r
- \r
/**\r
- * X.UI に於いて、ポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
+ * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
+ * @alias X.Callback.CAPTURE_POINTER\r
*/\r
'CAPTURE_POINTER' : X_Callback_CAPTURE_POINTER,\r
- \r
+ /**\r
+ * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占を解除する。\r
+ * @alias X.Callback.RELEASE_POINTER\r
+ */\r
'RELEASE_POINTER' : X_Callback_RELEASE_POINTER\r
};\r
\r
var\r
/**\r
* 全てのクラスのスーパークラスのようなもの。(ライブラリ内にカプセル化されているため、ユーザが触ることはありません)<br>\r
- * X_Class.create() で定義されたクラスのインスタンスが共通で備えるメソッド を確認してください。\r
+ * X.Class.create() で定義されたクラスのインスタンスが共通で備えるメソッド を確認してください。\r
* @class __ClassBase__\r
* @private\r
* @abstract\r
*/\r
// TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ\r
'kill' : function(){\r
- var instance = this,\r
- klass = X_Class_getClass( instance ),\r
- def = X_Class_getClassDef( klass ),\r
- data, p, i;\r
+ var def, listeners, p;\r
\r
// TODO kill 中の kill の呼び出しを防ぐ, 破棄済のインスタンスへの kill\r
\r
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE_CANCELED );\r
return;\r
};\r
- if( this[ '_listeners' ] && this[ '_listeners' ][ X_LISTENERS_DISPATCHING ] ){\r
- this[ '_listeners' ][ X_LISTENERS_KILL_RESERVED ] = true;\r
+ \r
+ listeners = this[ '_listeners' ];\r
+ \r
+ if( listeners && listeners[ X_LISTENERS_DISPATCHING ] ){\r
+ listeners[ X_LISTENERS_KILL_RESERVED ] = true;\r
return;\r
};\r
\r
// asyncDispatch の削除\r
for( p in X_EventDispatcher_LAZY_TIMERS ){\r
if( X_EventDispatcher_LAZY_TIMERS[ p ] === this ){\r
- delete X_EventDispatcher_LAZY_TIMERS[ p ]; // 削除が先!理由は X.Timer.removeを確認。\r
- X_Timer_remove( parseFloat( p ) );\r
+ // delete X_EventDispatcher_LAZY_TIMERS[ p ]; コレ不要\r
+ X_Timer_remove( p );\r
};\r
};\r
\r
this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE );\r
- this[ '_listeners' ] && X_EventDispatcher_unlistenAll( this );\r
+ listeners && X_EventDispatcher_unlistenAll( this );\r
};\r
\r
- for( p in instance ){\r
- if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;\r
- delete instance[ p ];\r
- };\r
+ X_Object_clear( this );\r
+ \r
+ def = X_Class_getClassDef( this );\r
+ \r
if( def.pool ){\r
- def.live && def.live.splice( def.live.indexOf( instance ), 1 );\r
- def.pool[ def.pool.length ] = instance;\r
+ def.live.splice( def.live.indexOf( this ), 1 );\r
+ def.pool[ def.pool.length ] = this;\r
};\r
},\r
\r
privateDef,\r
props,\r
klass,\r
- classDef = {}, hash;\r
+ classDef = {},\r
+ cbHash = { proxy : X_Class_actualConstructor, classDef : classDef };\r
+\r
if( X_Type_isString( displayName ) === true ){\r
classDef.displayName = displayName;\r
args.shift();\r
// クラスメンバ用オブジェクトが無しでもクラスは作成可能\r
props = {};\r
} else\r
- if( props[ 'Constructor' ] && X_Type_isFunction( props[ 'Constructor' ] ) ){\r
+ if( props[ 'Constructor' ] ){\r
+ //{+dev\r
+ if( !X_Type_isFunction( props[ 'Constructor' ] ) ){\r
+ alert( '"Constructor" is not function.' );\r
+ return;\r
+ };\r
+ //}+dev\r
classDef.Constructor = props[ 'Constructor' ];\r
};\r
\r
- klass = X_Callback_actualClosure( hash = { proxy : X_Class_actualConstructor } ); // TODO hash = classDef\r
- hash.klass = klass;\r
+ klass = X_Callback_actualClosure( cbHash ); // TODO callbackHash を class定義の置き場所にしてしまう!なるほど…\r
+ cbHash.klass = klass;\r
klass[ 'superClassOf' ] = X_Class_superClassOf;\r
klass[ 'subClassOf' ] = X_Class_subClassOf;\r
\r
*/\r
function X_Class_actualConstructor( f, args ){\r
var klass = f.klass,\r
- def = X_Class_getClassDef( klass ),\r
- dataUser = def._tempUser,\r
- instance, obj,\r
- userDef;\r
+ def = f.classDef,\r
+ instance, obj;\r
\r
if( def.Abstract ){\r
X.Logger.critical( 'AbstractClass!' );\r
return;\r
};\r
\r
- instance = def.pool && def.pool.length > 0 ?\r
+ instance = def.pool && def.pool.length ?\r
def.pool.pop() :\r
X_Class_useObjectCreate ?\r
Object.create( klass.prototype ) :\r
};\r
\r
if( listeners[ X_LISTENERS_KILL_RESERVED ] ){\r
- /*\r
- for( timerID in X_EventDispatcher_LAZY_TIMERS ){\r
- if( X_EventDispatcher_LAZY_TIMERS[ timerID ] === this ) return ret;\r
- }; */\r
this[ 'kill' ]();\r
};\r
};\r
chr, chrCode, nameChr, name1st,\r
tmp, escape, quot, start,\r
name, key, value, operator, a, b, not;\r
+\r
query += ' ';\r
while( i < l ){\r
chr = query.charAt( ++i );\r
- chrCode = ALPHABET.indexOf( chr );\r
+ chrCode = ALPHABET.indexOf( chr ); // TODO この関数無くす!\r
nameChr = chrCode !== -1;\r
name1st = nameChr && chrCode < 52;\r
switch( phase ){\r
* <dt>mimeType<dd>'text/xml', 'audio/mpeg' 等。xhr.overrideMimeType する値\r
* <dt>auth<dd>X.OAuth2 インスタンス(OAuth2 サービスの定義)\r
* <dt>getFullHeaders<dd>getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。XDR は Content-Type しか取得でいない。\r
- * <dt>canUse<dd>未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている\r
+ * <dt>canUse<dd>未実装。gadget proxy, YQL, <del>YPipes</del> 等のマッシュアップの許可。現在は test : 'gadget' としている\r
* </dl>\r
* \r
* <h4>JSONP 用プロパティ</h4>\r
var opt, url, type, auth;\r
\r
if( X_Type_isObject( opt = urlOrObject ) ){\r
+ //{+xhr\r
if( X_Type_isString( url = opt[ 'xhr' ] ) ){\r
type = X_NET_TYPE_XHR;\r
} else\r
+ //}+xhr\r
+ //{+jsonp\r
if( X_Type_isString( url = opt[ 'jsonp' ] ) ){\r
type = X_NET_TYPE_JSONP;\r
} else\r
+ //}+jsonp\r
+ //{+netimage\r
if( X_Type_isString( url = opt[ 'img' ] || opt[ 'image' ] ) ){\r
type = X_NET_TYPE_IMAGE;\r
} else\r
+ //}+netimage\r
+ //{+netform\r
if( X_Type_isString( url = opt[ 'form' ] ) ){\r
type = X_NET_TYPE_FORM;\r
- //{+dev\r
} else\r
+ //}+netform\r
if( !( type = X_NET_NAME_TO_ID[ opt[ 'type' ] ] ) ){\r
+ //{+dev\r
alert( 'X.Net args error' );\r
+ //}+dev\r
return;\r
- //}+dev\r
} else {\r
url = opt[ 'url' ];\r
};\r
+//{+xhr"XHR,XDR,MSXMLによる通信"(XMLHTTPRequest, XDomainRequest, ActiveX-MSXML を使った通信)[+net]\r
+\r
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r
// https://web.archive.org/web/20071101021832/http://web.paulownia.jp/script/ajax/xmlhttp4.html\r
// https://web.archive.org/web/20091029170015/http://wiki.paulownia.jp/ajax/xmlhttprequest\r
\r
*/\r
var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+\r
- // ie7&8 ではローカルリソースには ActiveX の XHR を使う\r
+ // ie9- ではローカルリソースには MSXML を使う\r
X_Net_XHR_createW3C = window[ 'XMLHttpRequest' ] && function(){ return X_Net_XHR_w3c || ( X_Net_XHR_w3c = new XMLHttpRequest() ); },\r
X_Net_XHR_w3c = X_Net_XHR_createW3C && X_Net_XHR_createW3C(),\r
X_Net_XHR_cors = X_Net_XHR_w3c && X_Net_XHR_w3c.withCredentials !== undefined,\r
\r
X_Net_XHR_neverReuse = X_UA[ 'IE' ] < 9, // ie7,8 の xhr はリユース不可。msxml はリユース可能。\r
\r
- X_Net_XHR_init;\r
+ X_Net_XHR_TYPE_FLASH = 8,\r
+ X_Net_XHR_TYPE_GADGET = 16;\r
\r
if( X_Net_XHR_msXML ){\r
X_Net_XHR_msXMLVer = X_Net_XHR_msXML[ 0 ];\r
if( X_Net_XHR_w3c || X_Net_XHR_msXML ){\r
\r
X_TEMP.X_Net_XHR_init = function(){\r
+ X_NET_XHRWrapper = X_Class_override( X_EventDispatcher(), X_TEMP.X_Net_XHR_params, true );\r
\r
delete X_TEMP.X_Net_XHR_init;\r
+ delete X_TEMP.X_Net_XHR_params; \r
\r
- X_NET_XHRWrapper = X_Class_override(\r
- X_EventDispatcher(),\r
- {\r
+ return X_NET_XHRWrapper;\r
+};\r
+\r
+X_TEMP.X_Net_XHR_params = {\r
\r
'_rawType' : X_EventDispatcher_EVENT_TARGET_XHR,\r
- // '_rawObject' : X_Net_XHR_w3c || X_Net_XHR_msXML,\r
\r
_isXDR : false,\r
_isMsXML : false,\r
\r
for( p in headers ){\r
if( X_EMPTY_OBJECT[ p ] ) continue;\r
- console.log( headers[ p ] );\r
+ //console.log( headers[ p ] );\r
headers[ p ] !== undefined && raw.setRequestHeader( p, headers[ p ] + '' ); // Opera8.01+, MSXML3+\r
};\r
};\r
states, data;\r
live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent, 'uploadPercent' : ( e.loaded / e.total ) } );\r
}\r
- },\r
- true\r
- );\r
+ };\r
// 同期リクエストでなければならない場合, unload, beforeunload時\r
- \r
- return X_NET_XHRWrapper;\r
-};\r
\r
};\r
-\r
/*\r
* https://gist.github.com/mmazer/5404301\r
* \r
+//{+jsonp"jsonpによるajax"(jsonpによるクロスドメイン通信。)[+net,+ninjaiframe]
+
/*
* Operaでも非同期リクエストが並列処理できる img-JSONP
* http://developer.cybozu.co.jp/takesako/2007/06/opera_img-jsonp.html
+//{+netform"<form>によるGETとPOST"(動的に生成したフォームによるGETとPOST。)[+net,+ninjaiframe]\r
+\r
X[ 'Net' ][ 'Form' ] = {\r
// 隠し iframe 使用の可否\r
};\r
};\r
return X_Callback_UN_LISTEN;\r
};\r
+\r
+//}+netform
\ No newline at end of file
+//{+netimage"画像の読み込み監視"(Imageの読み込みを監視し画像表示のコントロールを行う)[+net,+utilimage]\r
/* \r
* original\r
* LICENSE: MIT?\r
* AUTHOR: uupaa.js@gmail.com\r
* \r
*/\r
-\r
var X_Net_Image_hasImage = !!window[ 'Image' ],\r
X_Net_Image_image = X_Net_Image_hasImage && new Image(),\r
// IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
+//{+xhrgadget"OpenSocialガジェット通信プロキシ"(Xドメインは元よりXプロトコルな擬似xhr通信を可能にする)[+xhr]\r
+\r
/*\r
* gadgets.io.makeRequest\r
* \r
* \r
*/\r
\r
-\r
-\r
var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],\r
\r
X_NET_GIMR_iframeName = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ),\r
\r
X_NET_GIMR_lastHashString,\r
\r
- X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString;\r
+ X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString = '';\r
\r
\r
function X_NET_GIMR_detectImageOverIframe(){\r
n = parseInt( ret );\r
\r
if( X_NET_GIMR_isReceiveBatches ){\r
- X_NET_GIMR_receivedString += ret;\r
+ X_NET_GIMR_receivedString += X_Net_GIMR_decodeLocationHash( ret ); \r
if( --X_NET_GIMR_isReceiveBatches ){\r
iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
return;\r
};\r
} else\r
if( 1 < n ){\r
- X_NET_GIMR_receivedString = ret.substr( ( n + ':' ).length );\r
+ ret = ret.substr( ( n + ':' ).length );\r
+ X_NET_GIMR_receivedString = X_Net_GIMR_decodeLocationHash( ret );\r
X_NET_GIMR_isReceiveBatches = --n;\r
iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
// speedup\r
X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe );\r
return X_Callback_UN_LISTEN;\r
} else {\r
- X_NET_GIMR_receivedString = ret;\r
+ X_NET_GIMR_receivedString = X_Net_GIMR_decodeLocationHash( ret );\r
};\r
\r
- zero = String.fromCharCode( 0 );\r
- console.log( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '--' ).split( zero + 'E0F' ).join( '--' ) );\r
- ret = X_String_parseTrustedJsonString( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '。' ).split( zero + 'F0E' ).join( '.' ) );\r
+ ret = X_String_parseTrustedJsonString( X_NET_GIMR_receivedString );\r
+ \r
\r
X_NET_GIMR_receivedString = '';\r
\r
};\r
};\r
};\r
+/*\r
+(function( i, l, res ){\r
+ var start = X.Timer.now(), loc = location, res = [], hash;\r
+ for( ; i < l; ++i ){\r
+ loc.replace = chr = '#' + String.fromCharCode( i );\r
+ hash = _builtin_decodeURI( loc.hash );\r
+ if( _builtin_decodeURI( chr ) !== hash ) res.push( i + ':' + _builtin_decodeURI( chr ) );\r
+ if( start + 16 < X.Timer.now() ){\r
+ //console.log( i + ' / ' + l + ' ' + start + ' ' + X.Timer.now() );\r
+ X.Timer.once( 16, arguments.callee, [ ++i, l, res ] );\r
+ return;\r
+ };\r
+ };\r
+ alert( res.length + '\n' + res.join() );\r
+})( 0xff, 0xffff, [] ); */\r
+\r
+// http://outcloud.blogspot.jp/2015/06/gecko-location-hash.html\r
+function X_Net_GIMR_decodeLocationHash( str ){\r
+ return X_UA[ 'Gecko' ] ? unescape( str ) : decodeURIComponent( str );\r
+};\r
\r
// コマンドが長い場合、分割する\r
function X_NET_GIMR_toJSONString( obj ){\r
}\r
};\r
\r
+//}+xhrgadget
\ No newline at end of file
+//{+oauth2"OAuth2 サービスの定義"(OAuth2外部サービスを定義し、認可プロセス・xhrの署名を自動化します)[+xhr]
var X_NET_OAUTH2_detection = new Function( 'w', 'try{return w.location.search}catch(e){}' ),
X_NET_OAUTH2_authorizationWindow,
X_NET_OAUTH2_authorizationTimerID;
return pair[ name ];
};
+//}+oauth2
\ No newline at end of file
\r
if( !user[ 'instanceOf' ]( X.UI.Box ) ){\r
//throw new Error( 'Box を継承したインスタンスだけが _Box のオーナーになれます' );\r
- }; \r
+ };\r
\r
this.User = user;\r
\r