Object.prototype.hasOwnProperty || (Object.prototype.hasOwnProperty = function( p ){\r
var proto = this.constructor && this.constructor.prototype,\r
__p__ = proto && proto.__proto__,\r
- v = this[ p ],\r
- isNaN = v !== v;\r
- r = false;\r
+ r = false,//!!( __p__ && ( proto.__proto__ = null ) )\r
+ _pro_, v, isNaN;\r
\r
if( __p__ ) proto.__proto__ = null;\r
- \r
- if( p in this ){\r
- if( proto && p in proto && ( proto[ p ] === v ) ^ isNaN ){ //true + false, false + true\r
- // this と proto に同名で同値が書かれている可能性あり\r
- proto[ p ] = v + ' '; // different value\r
- r = ( v === this[ p ] ) ^ isNaN; // true + false, false + true\r
- proto[ p ] = v;\r
- } else {\r
- r = true;\r
- };\r
+ if( this.__proto__ ){\r
+ _pro_ = this.__proto__;\r
+ this.__proto__ = null;\r
};\r
\r
+ if( p === '__proto__' ){\r
+ r = !!_pro_;\r
+ } else {\r
+ v = this[ p ];\r
+ isNaN = v !== v; \r
+ \r
+ if( p in this ){\r
+ if( proto && p in proto && ( proto[ p ] === v ) ^ isNaN ){ //true + false, false + true\r
+ // this と proto に同名で同値が書かれている可能性あり\r
+ proto[ p ] = v + ' '; // different value\r
+ r = ( v === this[ p ] ) ^ isNaN; // true + false, false + true\r
+ proto[ p ] = v;\r
+ } else {\r
+ r = true;\r
+ };\r
+ }; \r
+ };\r
+\r
if( __p__ ) proto.__proto__ = __p__;\r
- \r
+ if( _p_ ) this.__proto__ = _pro_;\r
return r;\r
}); */
\ No newline at end of file
};\r
\r
// TODO Blink\r
- \r
- acme.Khtml = ( 0 <= dav.indexOf('Konqueror') ) ? tv : undefined;\r
- \r
- \r
- acme.WebKit = i = parseFloat(dua.split('WebKit\/')[1]) || undefined;\r
- acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;\r
- \r
- // TODO webkit Opera\r
-\r
- console.log( '>>Webkit : ' + acme.WebKit );\r
-\r
- if( i && !acme.Chrome && dua.indexOf( 'Safari' ) !== -1 ){\r
- if( dav.indexOf( 'Version/' ) !== -1 ){\r
- acme.Safari = parseFloat( dav.split('Version/')[1] );\r
- } else {\r
- if( i < 73 ){\r
- acme.Safari = 0.8;\r
- } else\r
- if( i < 85 ){\r
- acme.Safari = 0.9;\r
- } else\r
- if( i < 100 ){\r
- acme.Safari = 1;\r
- } else\r
- if( i < 125 ){\r
- acme.Safari = 1.1;\r
- } else\r
- if( i < 312 ){\r
- acme.Safari = 1.2;\r
- } else\r
- if( i < 412 ){\r
- acme.Safari = 1.3;\r
- } else\r
- if( i <= 419.3 ){\r
- acme.Safari = 2;\r
- } else\r
- if( i <= 525.13 ){\r
- acme.Safari = 3;\r
- } else\r
- if( i <= 525.25 ){\r
- acme.Safari = 3.1;\r
- } else\r
- if( i <= 528.16 ){\r
- acme.Safari = 3.2;\r
+ if( window.chrome ){\r
+ acme.Blink = tv;\r
+ console.log( '>>Blink : ' + acme.Blink );\r
+ \r
+ } else\r
+ if( dav.indexOf( 'Konqueror' ) !== -1 ){\r
+ acme.Khtml = tv;\r
+ console.log( '>>Khtml : ' + acme.Khtml );\r
+ \r
+ } else\r
+ if( i = parseFloat(dua.split('WebKit\/')[1]) ){\r
+ acme.WebKit = i;\r
+ \r
+ acme.Chrome = parseFloat(dua.split('Chrome\/')[1]) || undefined;\r
+ \r
+ // TODO webkit Opera\r
+ \r
+ console.log( '>>Webkit : ' + acme.WebKit );\r
+ \r
+ if( i && !acme.Chrome && dua.indexOf( 'Safari' ) !== -1 ){\r
+ if( dav.indexOf( 'Version/' ) !== -1 ){\r
+ acme.Safari = parseFloat( dav.split('Version/')[1] );\r
+ } else {\r
+ if( i < 73 ){\r
+ acme.Safari = 0.8;\r
+ } else\r
+ if( i < 85 ){\r
+ acme.Safari = 0.9;\r
+ } else\r
+ if( i < 100 ){\r
+ acme.Safari = 1;\r
+ } else\r
+ if( i < 125 ){\r
+ acme.Safari = 1.1;\r
+ } else\r
+ if( i < 312 ){\r
+ acme.Safari = 1.2;\r
+ } else\r
+ if( i < 412 ){\r
+ acme.Safari = 1.3;\r
+ } else\r
+ if( i <= 419.3 ){\r
+ acme.Safari = 2;\r
+ } else\r
+ if( i <= 525.13 ){\r
+ acme.Safari = 3;\r
+ } else\r
+ if( i <= 525.25 ){\r
+ acme.Safari = 3.1;\r
+ } else\r
+ if( i <= 528.16 ){\r
+ acme.Safari = 3.2;\r
+ };\r
};\r
- };\r
+ }; \r
+ \r
+ console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );\r
};\r
\r
// Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0\r
// Sony Reader Mozilla/5.0 (Linux; U; ja-jp; EBRD1101; EXT) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1\r
dua.indexOf( 'EBRD' ) !== -1; \r
\r
- console.log( '>> Webkit : ' + acme.WebKit + ' Safari : ' + acme.Safari );\r
return acme;\r
})( navigator );\r
\r
return typeof v === 'function';\r
},\r
isArray :\r
- X.UA.IE && ( X.UA.IE < 5 || X.UA.MacIE ) ? (function(v){ return v && typeof v.length === 'number';}) :\r
- window['Array'] ? (new Function('v', 'return v instanceof Array;')) :\r
- (function(v){ return Object.prototype.toString.call(v) === '[object Array]';}),\r
+ ( X.UA.IE4 || X.UA.MacIE ) ? (function(v){ return v && typeof v.length === 'number';}) : // v && v.push === Array.prototype.push\r
+ X.UA.IE ? (function(v){ return Object.prototype.toString.call(v) === '[object Array]';}) :\r
+ (new Function('v', 'return v instanceof Array;')),\r
\r
isBoolean : function(v) {\r
- return typeof v === 'boolean';\r
+ return typeof v === 'boolean'; // v === true || v === false;\r
},\r
isString : function(v) {\r
return typeof v === 'string';\r
return typeof v === 'number';\r
},\r
isFinite : function(v){\r
- return X.Type.isNumber(v) && isFinite(v);\r
+ return typeof v === 'number' && isFinite(v);\r
+ },\r
+ isNaN : function(v){\r
+ return typeof v === 'number' && v !== v;\r
},\r
isHTMLElement :\r
// ie4 or MacIE5.23\r
- X.UA.IE && ( X.UA.IE < 5 || X.UA.MacIE ) ? (function(v){ return v && v.tagName && v.all;}) :\r
+ ( X.UA.IE4 || X.UA.MacIE ) ? (function(v){ return v && v.tagName && v.all;}) :\r
window['HTMLElement'] ? (new Function('v', 'return v instanceof HTMLElement')) :\r
(function(v){ return v && v.nodeType === 1 && v.appendChild;}),\r
/*\r
params.push( classSetting );\r
\r
// サブクラスのシャドウ\r
- if( X.Class._getClass( args[ 0 ] ) ){\r
+ if( args[ 0 ] && X.Class._getClass( args[ 0 ] ) ){\r
params.push( args.shift() );\r
} else\r
if( superDef.privateClass ){\r
\r
// インスタンスのメンバー\r
props = args[ 0 ];\r
- if( props === null || !X.Type.isObject( props ) ){\r
+ if( !X.Type.isObject( props ) ){\r
// サブクラスの場合、クラス定義の上書きがなくても作成可能\r
- if( !traits ){\r
- X.Notification.critical( 'No Class Def!' );\r
- return;\r
- };\r
+ // サブクラスでなくても、クラスメンバ用オブジェクトが無しでも作成可能\r
+ //if( !traits ){\r
+ // X.Notification.critical( 'No Class Def!' );\r
+ // return;\r
+ //};\r
props = {};\r
} else\r
if( props[ CONSTRUCTOR ] && X.Type.isFunction( props[ CONSTRUCTOR ] ) ){\r
var next = X.Timer.next,\r
list = X.Timer.TICKET_LIST,\r
i = list.length,\r
- q, f, c;\r
+ q, f, c, r;\r
\r
if( X.Timer.busy ){\r
alert( 'busy!' );\r
*/\r
\r
X.Event = {\r
- COMPLETE : 1,\r
- SUCCESS : 2,\r
- ERROR : 3,\r
- PROGRESS : 4,\r
- _LAST_EVENT : 4\r
+ COMPLETE : 1,\r
+ SUCCESS : 2,\r
+ ERROR : 3,\r
+ PROGRESS : 4,\r
+ BEFORE_CANCEL : 5,\r
+ CANCELED : 6,\r
+ TIMEOUT : 7,\r
+ _LAST_EVENT : 7\r
};\r
\r
\r
\r
listen : function( type, arg1, arg2, arg3 ){\r
var list = this._listeners,\r
- r, f;\r
+ i, l, r, f;\r
if( this._dispatching ){\r
if( !this._reserves ) this._reserves = [];\r
this._reserves[ this._reserves.length ] = [ type, arg1, arg2, arg3, X.EventDispatcher._once ];\r
return this;\r
- } else\r
+ };\r
+ \r
+ if( X.Type.isArray( type ) ){\r
+ for( i = 0, l = type.length; i < l; ++i ){\r
+ this.listen( type[ i ], arg1, arg2, arg3 );\r
+ };\r
+ return this;\r
+ };\r
+ \r
if( this.listening( type, arg1, arg2, arg3 ) ) return this;\r
\r
if( !list ) list = this._listeners = {};\r
var list = this._listeners,\r
_list, reserves, unlistens, i, f;\r
if( !list ) return this;\r
+ \r
+ if( X.Type.isArray( type ) ){\r
+ for( i = type.length; i; ){\r
+ this.unlisten( type[ --i ], arg1, arg2, arg3 );\r
+ };\r
+ return this;\r
+ };\r
+ \r
if( type === undefined ){\r
// 全て削除\r
for( type in list ){\r
* getBoundingClientRect で fontsize の調査\r
*/\r
_resize :\r
- X.UA.IE && X.UA.IE < 9 ?\r
+ X.UA.IE < 9 ?\r
(function(){\r
var size;\r
if( !X.Dom._lock ){\r
}\r
);\r
\r
-if( !X.UA.IE || 9 <= X.UA.IE ){\r
+if( !( X.UA.IE < 9 ) ){\r
X.Dom._detectFontSize = function(){\r
var size = Node._fontSizeNode._rawNode.offsetHeight;\r
if( X.Dom.baseFontSize !== size ){\r
* http://d.hatena.ne.jp/t-uchima/20051003/p1\r
* MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
*/\r
-if( X.UA.MacIE || X.UA.NetFront < 4 ){\r
+if( X.UA.MacIE ){\r
X.Dom.DOM_W3C = true;\r
X.Dom.EVENT_DOM0 = true;\r
} else\r
Node.prototype.text = function( text ){\r
var xnodes, texts, i, l;\r
// setter\r
- if( X.Type.isString( text ) ){\r
+ if( text !== undefined ){\r
if( this._xnodeType === 3 ){\r
if( this._text !== text ){\r
text ? ( this._text = text ) : delete this.text;\r
* \r
*/\r
\r
-if( X.Dom.EVENT_W3C ){\r
+if( !X.UA.IE || 9 <= X.UA.IE ){\r
X.Dom.Event = function( e, xnode ){\r
var touch0;\r
//this._event = e;\r
// hash_change\r
X.Dom.Event.BEFORE_UNLOAD = ++X.Event._LAST_EVENT;\r
X.Dom.Event.UNLOAD = ++X.Event._LAST_EVENT;\r
-X.Dom.Event.LOAD_BEFORE_STOP = ++X.Event._LAST_EVENT;\r
-X.Dom.Event.LOAD_ASSET_STOP = ++X.Event._LAST_EVENT;\r
-X.Dom.Event.LOAD_ASSET_COMPLETE = ++X.Event._LAST_EVENT;\r
-X.Dom.Event.LOAD_ASSET_ERROR = ++X.Event._LAST_EVENT;\r
\r
X.Dom.Event.ANIME_BEFORE_START = ++X.Event._LAST_EVENT;\r
X.Dom.Event.ANIME_START = ++X.Event._LAST_EVENT;\r
X.Dom.Event.ANIME_STOP = ++X.Event._LAST_EVENT;\r
X.Dom.Event._LAST_EVENT = X.Event._LAST_EVENT; // ここに書いてあるイベントの最後の値 X.Dom.Event.ANIME_STOP と同じ値\r
\r
+// TODO load -> readystatechange this.readyState === "loaded" || this.readyState === "complete"\r
+X.Dom.Event._LOAD_FIX_TAGS = {\r
+ IFRAME : true,\r
+ SCRIPT : true//,\r
+ //LINK : true\r
+};\r
+\r
X.Dom.Event.Rename = {};\r
X.Dom.Event.RenameTo = {};\r
// https://github.com/georgeadamson/jQuery.prefixfree-events/blob/master/jQuery.prefixfree-events.js\r
};\r
})( X.Dom.Event.Rename, X.Dom.Event.RenameTo );\r
\r
-X.Dom.Node.prototype.listen = function( type /* , arg1, arg2, arg3[ listener || ( context + function ) || function ][ arguments ] */ ){\r
+\r
+\r
+X.Dom.Node.prototype.listen = function( type, arg1, arg2, arg3 /* [ listener || ( context + function ) || function ][ arguments ] */ ){\r
if( this._xnodeType === 0 || this._xnodeType === 3 ) return this;\r
\r
+ if( X.Type.isArray( type ) ){\r
+ return X.EventDispatcher.prototype.listen.apply( this, arguments );\r
+ };\r
+ \r
( !this._listeners || !this._listeners[ type ] ) && X.Type.isString( type ) && this._addEvent( type );\r
\r
return X.EventDispatcher.prototype.listen.apply( this, arguments );\r
// Days on the Moon DOM Events とブラウザの実装 \r
// http://nanto.asablo.jp/blog/2007/03/23/1339502\r
// Safari 2 では関数オブジェクトしか EventListener として使えませんが、Safari のナイトリービルドでは handleEvent メソッドを持つオブジェクトも EventListener として使えるようです。\r
- X.Dom.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 ) ? // Safari3-\r
+ X.Dom.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
(function( type ){\r
var raw = this._rawNode;\r
if( !raw ) return;\r
(function( type ){\r
var raw = this._rawNode;\r
if( !raw ) return;\r
+ //if( type === 'load' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){\r
+ // type = 'readystatechange';\r
+ //};\r
this._handleEvent = this._handleEvent || X.Callback.create( this );\r
if( raw.attachEvent ){\r
raw.attachEvent( 'on' + type, this._handleEvent );\r
});\r
\r
\r
-X.Dom.Node.prototype.unlisten = function( type /* , arg1, arg2, arg3 */ ){\r
- var list = this._listeners,\r
- l = !this._dispatching && list && type !== undefined && list[ type ] && list[ type ].length;\r
+X.Dom.Node.prototype.unlisten = function( type, arg1, arg2, arg3 ){\r
+ var list = this._listeners, l;\r
+ \r
+ if( X.Type.isArray( type ) ){\r
+ return list ? X.EventDispatcher.prototype.unlisten.apply( this, arguments ) : this;\r
+ };\r
+\r
+ l = !this._dispatching && list && type !== undefined && list[ type ] && list[ type ].length;\r
\r
X.EventDispatcher.prototype.unlisten.apply( this, arguments );\r
\r
};\r
\r
X.Dom.Node.prototype._removeEvent =\r
- X.Dom.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 ) ? // Safari3-\r
+ X.Dom.EVENT_W3C && ( X.UA.WebKit < 525.13 || X.UA.Opera7 || X.UA.NetFront < 4 ) ? // Safari3-\r
(function( type ){\r
var raw = this._rawNode;\r
if( !raw ) return;\r
(function( type ){\r
var raw = this._rawNode;\r
if( !raw ) return;\r
+ //if( type === 'load' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){\r
+ // type = 'readystatechange';\r
+ //};\r
if( raw.attachEvent ){\r
raw.detachEvent( 'on' + type, this._handleEvent );\r
} else {\r
// Is this in regard to the Safari 1.x preventDefault bug on click/dblclick?\r
// https://groups.google.com/forum/#!msg/comp.lang.javascript/uYEuCHjHxnw/yKoHtZJPa1QJ\r
X.Dom.Node.prototype.handleEvent =\r
- X.UA.IE < 9 ? // ie45678 EVENT_IE & EVENT_DOM0 for ie4\r
+ X.UA.IE4 || X.UA.IE5678 ? // ie45678 EVENT_IE & EVENT_DOM0 for ie4\r
(function(){\r
- var ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( event, this, this._rawNode ) );\r
+ var ret;\r
+ \r
+ if( event.type === 'readystatechange' && this._tag && X.Dom.Event._LOAD_FIX_TAGS[ this._tag ] ){\r
+ //type = 'readystatechange';\r
+ };\r
+ \r
+ ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( event, this, this._rawNode ) );\r
\r
if( ret & X.Callback.STOP_PROPAGATION ){\r
event.cancelBubble = true;\r
return event.returnValue = false;\r
};\r
}) :\r
- //X.Dom.EVENT_W3C & EVENT_DOM0 for NetFront\r
+ //X.Dom.EVENT_W3C & EVENT_DOM0\r
(function( e ){\r
var ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( e, this ) );\r
\r
}) :
(function( obj ){
var test = X.Dom.Style.SPECIAL_FIX_PROP,
- ret = [], p, id, v;
+ ret = [], p, id, v, bgpX, bgpY, clipT, clipB, clipL, clipR;
for( p in obj ){
if( !( id = test[ p ] ) ) continue;
v = obj[ p ];
X.Dom.Node( img = new Image() ) :\r
X.Dom.Node._systemNode.create( 'img', { src : abspath } )\r
)\r
- .listen( 'load', this )\r
- .listen( 'error', this )\r
- .listen( 'abort', this )\r
- .listen( X.Dom.Event.LOAD_ASSET_COMPLETE, this )\r
- .listen( X.Dom.Event.LOAD_ASSET_ERROR, this );\r
+ .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR ], this );\r
img && ( img.src = abspath );\r
this._detect();\r
},\r
case 'abort' :\r
if( this.finish ) return;\r
this.finish = true;\r
- this.timerID = this.asyncDispatch( 0, { type : X.Dom.Event.LOAD_ASSET_ERROR } );\r
+ this.timerID = this.asyncDispatch( 0, { type : X.Event.ERROR } );\r
break;\r
case 'load' :\r
// if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
this.finish = true;\r
this.timerID && X.Timer.remove( this.timerID );\r
if( window.opera && !this.xnode._rawNode.complete ){\r
- this.timerID = this.asyncDispatch( 0, { type : X.Dom.Event.LOAD_ASSET_ERROR } );\r
+ this.timerID = this.asyncDispatch( 0, { type : X.Event.ERROR } );\r
return;\r
};\r
size = X.Dom.Image.getActualDimension( X.UA.IE && X.UA.IE < 9 && window.Image ? this.abspath : this.xnode );\r
this.timerID = this.asyncDispatch( 0, {\r
- type : X.Dom.Event.LOAD_ASSET_COMPLETE,\r
+ type : X.Event.SUCCESS,\r
src : this.abspath,\r
w : size[ 0 ],\r
h : size[ 1 ]\r
} );\r
break;\r
- case X.Dom.Event.LOAD_ASSET_COMPLETE :\r
- case X.Dom.Event.LOAD_ASSET_ERROR :\r
+ case X.Event.SUCCESS :\r
+ case X.Event.ERROR :\r
delete this.timerID;\r
X.Timer.once( 0, this, this.kill );\r
break;\r
if( this.xnode._rawNode && this.xnode._rawNode.complete ){\r
this.finish = true;\r
if( this.xnode._rawNode.width ) return;\r
- this.timerID = this.asyncDispatch( 0, { type : X.Dom.Event.LOAD_ASSET_ERROR } );\r
+ this.timerID = this.asyncDispatch( 0, { type : X.Event.ERROR } );\r
return;\r
};\r
if( ( this.tick += this.delay ) > this.timeout ){\r
this.finish = true;\r
- this.timerID = this.asyncDispatch( 0, { type : X.Dom.Event.LOAD_ASSET_ERROR, msg : 'timeout' } );\r
+ this.timerID = this.asyncDispatch( 0, { type : X.Event.ERROR, msg : 'timeout' } );\r
return;\r
};\r
this.timerID = X.Timer.once( this.delay, this, this._detect );\r
},\r
stop : function(){\r
- // if( this.dispatch( { type : X.Dom.Event.LOAD_BEFORE_STOP } ) & X.Callback.CANCEL_NOW ) return;\r
+ // if( this.dispatch( { type : X.Event.BEFORE_CANCEL } ) & X.Callback.CANCEL_NOW ) return;\r
\r
- // this.dispacth( { type : X.Dom.Event.LOAD_ASSET_STOPED } );\r
+ // this.dispacth( { type : X.Event.CANCELED } );\r
this.kill();\r
},\r
onKill : function(){\r
\r
X.UI.attrClassProto = null;\r
\r
-X.UI.AttrClass = function( opt_supports, opt_attrs ){\r
- var klass, proto, p, support;\r
- if( opt_supports && opt_attrs ){\r
- // クラス拡張\r
- klass = new Function( 'a,b', 'var f=arguments.callee;if(a||b)return f._(a,b)' );\r
- klass._ = X.UI.AttrClass;\r
- klass.prototype = proto = new ( this._ === X.UI.AttrClass ? this : X.UI.AttrClass )();\r
- proto.constructor = klass;\r
- \r
- // 属性プリセット\r
- for( p in opt_supports ){\r
- if( p === '_last' ) continue;\r
- support = opt_supports[ p ];\r
- proto[ support.No ] = support[ 0 ];\r
- if( support[ 3 ] & X.UI.Attr.Type.QUARTET ){\r
- proto[ support.No + 1 ] = support[ 0 ];\r
- proto[ support.No + 2 ] = support[ 0 ];\r
- proto[ support.No + 3 ] = support[ 0 ];\r
- } else\r
- if( support[ 3 ] & X.UI.Attr.Type.COMBI ){\r
- proto[ support.No + 1 ] = support[ 0 ];\r
- };\r
- };\r
- \r
- // setAttr に書き換え\r
- X.UI.attrClassProto = proto;\r
- for( p in opt_attrs ){\r
- X.UI._AbstractUINode.prototype.setAttr( p, opt_supports[ p ], opt_attrs[ p ] );\r
- };\r
- X.UI.attrClassProto = null;\r
- return klass;\r
- };\r
-};\r
+X.UI.AttrClass = X.Class.create( 'X.UI.AttrClass', X.Class.POOL_OBJECT );\r
\r
-(function(){\r
- var proto = X.UI.AttrClass.prototype,\r
- supports = X.UI.Attr.Support,\r
- support, p;\r
+\r
+X.UI.Attr.copy = function( proto, supports ){\r
+ var support, p;\r
\r
for( p in supports ){\r
if( p === '_last' ) continue;\r
proto[ support.No + 1 ] = support[ 0 ];\r
};\r
};\r
-})();\r
+};\r
\r
+X.UI.Attr.copy( X.UI.AttrClass.prototype, X.UI.Attr.Support );\r
+\r
+X.UI.Attr.preset = function( baseKlass, opt_supports, opt_attrs ){\r
+ var klass = baseKlass.inherits(),\r
+ proto = klass.prototype,\r
+ p;\r
+ \r
+ // 属性プリセット\r
+ X.UI.Attr.copy( proto, opt_supports );\r
+ \r
+ // setAttr に書き換え\r
+ X.UI.attrClassProto = proto;\r
+ for( p in opt_attrs ){\r
+ opt_supports[ p ] && X.UI._AbstractUINode.prototype.setAttr( p, opt_supports[ p ], opt_attrs[ p ] );\r
+ };\r
+ X.UI.attrClassProto = null;\r
+ return klass;\r
+};\r
gestures = Detection.gestures,\r
numTouches = 0,// count the total touches on the screen\r
pointerType, i, l, touches, ret, active, gesture, startEv,\r
- hammer, deltaTime, deltaX, deltaY, velocity;\r
+ hammer, deltaTime, deltaX, deltaY, velocity, center;\r
\r
//console.log( 'Hammer@handleEvent ' + X.UI.Event.IdToName[ e.type ] + ' ' + e.pointerType );\r
if( !type ) return;\r
/*\r
* "Android version < 2.2" return ev.touches.length === 1 when touchend, others return ev.touches.length === 0\r
*/\r
- Hammer.DO_TOUCHES_FIX = Hammer.HAS_TOUCHEVENTS && X.UA.Android < 2.2;\r
+ Hammer.DO_TOUCHES_FIX = Hammer.HAS_TOUCHEVENTS && ( X.UA.Android < 2.2 || X.UA.Blink || X.UA.Opera );\r
\r
// detect touchevents\r
Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled;\r
return X.EventDispatcher.prototype.listen.apply( this, arguments );\r
},\r
unlisten : function( type, arg1, arg2, arg3 ){\r
- var root, events, i, ev, counter;\r
+ var root, events, i, ev, counter, f;\r
if( X.UI.Event._START_POINTER <= type && type <= X.UI.Event._END_POINTER ){\r
if( this.phase < 3 ){\r
if( !( events = this.reserveEvents ) ) return this;\r
\r
klass = this.inherits( privateKlass );\r
privateKlass.prototype.supportAttrs = supports,\r
- privateKlass.prototype.attrClass = privateKlass.prototype.attrClass( supports, attrs );\r
+ privateKlass.prototype.attrClass = X.UI.Attr.preset( privateKlass.prototype.attrClass, supports, attrs );\r
} else {\r
supports = X.UI.Attr.createAttrDef( shadow.prototype.supportAttrs, layout.overrideAttrsForSelf );\r
\r
{\r
layout : layout,\r
supportAttrs : supports,\r
- attrClass : shadow.prototype.attrClass( supports, attrs )\r
+ attrClass : X.UI.Attr.preset( shadow.prototype.attrClass, supports, attrs )\r
}\r
)\r
); \r
{\r
chromeNodes : null,\r
containerNode : null,\r
+ \r
Constructor : function( layout, args ){\r
\r
this.SuperConstructor( layout, args );\r
};\r
\r
// Prototype\r
-iScroll.prototype = {\r
+X.Class._override( iScroll.prototype, {\r
uinodeRoot : null,\r
uinodeTarget : null,\r
xnodeTarget : null,\r
isReady: function () {\r
return !this.moved && !this.zoomed && !this.animating;\r
}\r
-};\r
+} );\r
\r
\r
\r
args[ args.length ] = arg;\r
};\r
};\r
- \r
+ /*\r
this.style = DisplayNodeStyle( this,\r
X.Class._newPrivate(\r
this,\r
]\r
)\r
);\r
- this.style.addName( 'ScrollBox' );\r
+ this.style.addName( 'ScrollBox' ); */\r
},\r
scrollX : function(){\r
\r