acme.OperaMini = 0 < dua.indexOf("Opera Mini");\r
acme.OperaMobile = 0 < dua.indexOf("Opera Mobi");\r
acme.OperaTablet = 0 < dua.indexOf("Opera Tablet");\r
- // TODO NDS\r
+ acme.Wii = dua.indexOf( 'Nintendo Wii' ) !== -1;\r
+ acme.NDS = dua.indexOf( 'Nitro' ) !== -1;\r
console.log( '>> Opera : ' + acme.Opera );\r
return acme;\r
};\r
\r
// Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\r
- if( document.all ){\r
+ if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){\r
acme.ActiveX = !!window[ 'ActiveXObject' ];\r
acme.IE = document.documentMode || parseFloat(dua.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || parseFloat(dav.split("MSIE ")[1]) || 0;\r
acme.IE4 = acme.IE && acme.IE < 5;\r
acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 || n.platform === 'WinCE';\r
acme.WinPhone = dua.toLowerCase().indexOf( 'windows phone' ) !== -1;\r
console.log( '>> IE : ' + acme.IE + ' ActiveX : ' + acme.ActiveX );\r
+ // TODO XBox360, XBox1\r
return acme;\r
};\r
\r
//Fennec\r
if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){\r
acme.Fennec = parseFloat( dua.substr( i + 7 ) );\r
+ console.log( '>> Fennec : ' + acme.Fennec + ', Gecko : ' + acme.Gecko );\r
+ return acme;\r
};\r
//Firefox\r
\r
//Netscape\r
//Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3\r
- if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 10 ) ) ) ){\r
- acme.NN = v;\r
+ if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 ){\r
+ acme.NN = parseFloat( dua.substr( i + 10 ) ) || 6;\r
acme.NN6 = true;\r
+ console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
return acme;\r
} else\r
//Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)\r
//Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3\r
- if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 9 ) ) ) ){\r
- acme.NN = v;\r
+ if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 ){\r
+ acme.NN = parseFloat( dua.substr( i + 9 ) ) || 7;\r
+ console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
return acme;\r
} else\r
//Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6\r
- if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 10 ) ) ) ){\r
- acme.NN = v;\r
+ if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 ){\r
+ acme.NN = parseFloat( dua.substr( i + 10 ) ) || 9;\r
+ console.log( '>> NN : ' + acme.NN + ', Gecko : ' + acme.Gecko );\r
return acme;\r
};\r
\r
};\r
};\r
\r
- acme.Android = dua.toLowerCase().indexOf( 'android' ) !== -1; \r
- \r
- acme.iOS = dua.toLowerCase().indexOf( 'iphone' ) !== -1 ||\r
- dua.toLowerCase().indexOf( 'ipad' ) !== -1 ||\r
- dua.toLowerCase().indexOf( 'ipod' ) !== -1;\r
- \r
- acme.TouchPad = dua.toLowerCase().indexOf( 'hp-tablet' ) !== -1; // webOS\r
+ // Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0\r
+ if( ( i = dua.toLowerCase().indexOf( 'android' ) ) !== -1 ){\r
+ acme.Android = parseFloat( ua.substr( i + 8 ) ) || 1.5;\r
+ console.log( '>> Android : ' + acme.Android );\r
+ } else\r
+ if( dua.indexOf( 'iPhone;' ) !== -1 || dua.indexOf( 'iPad;' ) !== -1 || dua.indexOf( 'iPod;' ) !== -1 ){\r
+ acme.iOS = parseFloat( dua.split( 'OS ' )[ 1 ].split( '_' ).join( '' ) ) || 1;\r
+ console.log( '>> iOS : ' + acme.iOS );\r
+ } else\r
+ if( dua.indexOf( 'hp-tablet' ) !== -1 || dua.indexOf( 'webOS' ) !== -1 ){\r
+ // http://user-agent-string.info/list-of-ua/os-detail?os=webOS\r
+ acme.webOS = true; // webOS\r
+ };\r
\r
//http://www.useragentstring.com/pages/Iris/\r
acme.Iris = dua.toLowerCase().indexOf( 'iris' ) !== -1;\r
};\r
};*/\r
\r
-if( X.UA.IE && X.UA.IE < 7 ){ // error @ NN7.2\r
+if( X.UA.IE < 7 ){ // error @ NN7.2\r
// bonus: hotfix for IE6 SP1 (bug KB823727)\r
document.execCommand && document.execCommand( 'BackgroundImageCache', false, true );\r
};\r
\r
-X.inObject = X.UA.IE && X.UA.IE < 5.5 ? // TODO JScript で判定\r
+X.inObject = X.UA.IE < 5.5 ? // TODO JScript で判定\r
(function( name, obj ){\r
var p;\r
if( obj[ name ] ) return true;\r
\r
X.Dom.BoxModel.vScrollbarSize = w;\r
X.Dom.BoxModel.hScrollbarSize = h;\r
- if( h < 0 ){\r
+ if( h <= 0 ){ // ie6, ie11, firefox で 負の値が返る\r
console.log( 'invalid hScrollbarSize: ' + h );\r
X.Dom.BoxModel.hScrollbarSize = w;\r
};\r
-PageRoot(\r
+root = PageRoot(\r
Box({\r
width : '10%',\r
height : '10%',\r
borderColor : 0x111111,\r
borderWidth : [ 0, 0, 0, 0 ],\r
borderStyle : 'solid dotted',\r
- padding : [ 2, 1.5 ],\r
+ padding : [ 4, 1 ],\r
sizing : 'border'\r
},\r
Box({\r
width : '50%',\r
height : 2,\r
- left : '30%',\r
+ left : '25%',\r
bgColor : 0x999999\r
}),\r
Text( 'Hello, world!', { width : '100%' } ),\r
Text( '----------------------------', { width : '100%' } ),\r
- txt = Text( 'PettanR-team. rrrrrrrrrr', { width : '100%' } )\r
+ text = Text( 'PettanR-team. rrrrrrrrrr', { width : '100%' } )\r
+ .listen( X.UI.Event.TAP, _onClick )\r
)\r
);\r
+_root = X.Class._getPrivate( root );\r
+_text = X.Class._getPrivate( text );\r
\r
-_text = X.Class._getPrivate( txt );\r
+function _onClick( e ){\r
+ alert( e.type );\r
+};\r
* init_only,\r
* always,\r
* \r
- * uinode によって指定可能な css は異なる\r
+ * uinode によって指定可能な attr は異なる\r
* + 直接 xnode.css() に渡す値\r
* + uinode 内で加工してから xnode.css() に渡す値\r
* ChromeBox での css3 の fallback\r
- * + layoutManager で使う値がある\r
+ * + layoutManager で使う値\r
* x, y, gap, childW, childH など\r
+ * + uinode で使う値\r
+ * mouseDisabled など\r
*/\r
\r
X.UI = {\r
ALIGN : X.UI.Util.createChecker( 'left,center,right,justify' ),\r
TEXT_DECORATION : X.UI.Util.createChecker( 'none,underline,overline,line-through,blink' ),\r
TEXT_TRANSFORM : X.UI.Util.createChecker( 'none,capitalize,lowercase,uppercase' ),\r
- BOX_SIZING : X.UI.Util.createChecker( 'content,padding,border' ), // ,margin-box\r
+ BOX_SIZING : X.UI.Util.createChecker( 'content,padding,border' ),\r
CURSOR : X.UI.Util.createChecker( 'pointer,wait' )\r
},\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
- deltaTime, deltaX, deltaY, velocity;\r
+ hammer, deltaTime, deltaX, deltaY, velocity;\r
\r
if( !type ) return;\r
\r
type |= POINTER;\r
switch( e.pointerType ){\r
case 'touch' :\r
- case e.MSPOINTER_TYPE_TOUCH :\r
+ case 2 : //e.MSPOINTER_TYPE_TOUCH :\r
type |= TOUCH; break;\r
case 'pen' :\r
- case e.MSPOINTER_TYPE_PEN :\r
+ case 3 : //e.MSPOINTER_TYPE_PEN :\r
type |= PEN; break;\r
case 'mouse' :\r
- case e.MSPOINTER_TYPE_MOUSE :\r
+ case 4 : //e.MSPOINTER_TYPE_MOUSE :\r
type |= MOUSE; break;\r
default :\r
return;\r
target : e.target\r
}];\r
};\r
-\r
// if we are in a end event, but when we remove one touch and\r
// we still have enough, set eventType to move\r
if( 0 < numTouches && type & END ){ // eventType === Hammer.EVENT_END ){\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 && ( function( ua, i ){\r
- if( ( i = ua.indexOf('android') ) === -1 ) return false;\r
- return ( parseFloat( ua.substr( i + 8 ) ) || 0 ) < 2.2;\r
- })( navigator.userAgent.toLowerCase() );\r
+ Hammer.DO_TOUCHES_FIX = Hammer.HAS_TOUCHEVENTS && X.UA.Android < 2.2;\r
\r
// detect touchevents\r
Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled;\r
* @events hold holdend\r
*/\r
Gestures.Hold = {\r
- name : 'hold',\r
- index : 10,\r
+ name : 'hold',\r
+ index : 10,\r
startID : X.UI.Event.HOLD,\r
endID : X.UI.Event.HOLD_END,\r
defaults : {\r
// do a single tap\r
if( hammer.options.tap_always ){\r
Detection.current.name = 'tap';\r
- return hammer.trigger( X.UI.Event.TAP, e );\r
+ return hammer.trigger( X.UI.Event.TAP, e );\r
};\r
};\r
}\r
* @events swipe, swipeleft, swiperight, swipeup, swipedown\r
*/\r
Gestures.Swipe = {\r
- name : 'swipe',\r
- index : 40,\r
+ name : 'swipe',\r
+ index : 40,\r
startID : X.UI.Event.SWIP,\r
endID : X.UI.Event.SWIP_DOWN,\r
defaults : {\r
// set 0 for unlimited, but this can conflict with transform\r
swipe_max_touches : 1,\r
- swipe_velocity : 0.7\r
+ swipe_velocity : 0.7\r
},\r
handler : function swipeGesture(e, hammer) {\r
if( e.eventType === END ){\r
* @events drag, dragstart, dragend, drapleft, dragright, dragup, dragdown\r
*/\r
Gestures.Drag = {\r
- name : 'drag',\r
- index : 50,\r
+ name : 'drag',\r
+ index : 50,\r
startID : X.UI.Event.DRAG,\r
endID : X.UI.Event.DRAG_DOWN,\r
defaults : {\r
* @events transform, transformstart, transformend, pinch, pinchin, pinchout, rotate\r
*/\r
Gestures.Transform = {\r
- name : 'transform',\r
- index : 45,\r
+ name : 'transform',\r
+ index : 45,\r
startID : X.UI.Event.TRANSFORM,\r
endID : X.UI.Event.ROTATE,\r
defaults : {\r
* @events touch\r
*/\r
Gestures.Touch = {\r
- name : 'touch',\r
- index : -Infinity,\r
+ name : 'touch',\r
+ index : -Infinity,\r
defaults : {\r
// call preventDefault at touchstart, and makes the element blocking by\r
// disabling the scrolling of the page, but it improves gestures like\r
* @events release\r
*/\r
Gestures.Release = {\r
- name : 'release',\r
- index : Infinity,\r
+ name : 'release',\r
+ index : Infinity,\r
handler : function releaseGesture( e, hammer ){\r
e.eventType === END && hammer.trigger( this.name, e );\r
}\r
// :hover, :focus, :disabled\r
\r
initialize : function( root, rootData, parent, parentData ){\r
- var events = this.reserveEvents,\r
- l, i; \r
- \r
this.root = root;\r
this.rootData = rootData;\r
this.parent = parent;\r
this.phase = 1;\r
\r
this.dispatch( { type : X.UI.Event.INIT } );\r
- \r
- // html 要素が親に追加されるまで控えていたイベントの登録\r
- if( events && ( l = events.length ) ){\r
- for( i = 0; i < l; ++i ){\r
- this.listen.apply( this, events[ i ] );\r
- };\r
- events.length = 0;\r
- delete this.reserveEvents;\r
- }; \r
},\r
\r
addToParent : function( parentElement ){\r
},\r
\r
creationComplete : function(){\r
+ var events = this.reserveEvents,\r
+ l, i;\r
+ \r
this.phase = 3;\r
this.User.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
+ \r
+ // html 要素が親に追加されるまで控えていたイベントの登録\r
+ if( events && ( l = events.length ) ){\r
+ for( i = 0; i < l; ++i ){\r
+ this.listen.apply( this, events[ i ] );\r
+ };\r
+ events.length = 0;\r
+ delete this.reserveEvents;\r
+ }; \r
},\r
\r
/*\r
* X.Dom.BoxModel の情報を引きながら top,left,width,height,padding,border の設定\r
*/\r
updateLayout : function( x, y ){\r
- x += this.boxX;\r
- y += this.boxY;\r
+ this.boxX = x;\r
+ this.boxY = y;\r
this.xnode\r
.css( 'left', x ? x + 'em' : 0 )\r
.css( 'top', y ? y + 'em' : 0 )\r
y -= this.boxY;\r
\r
if( 0 <= x && x < this.boxWidth && 0 <= y && y < this.boxHeight ){\r
+ \r
!this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
this.rootData.targetNodeData = this;\r
return true;\r
this.gesture.listen( type );\r
};\r
} else {\r
+ console.log( type )\r
root = this.rootData;\r
counter = root.eventCounter;\r
if( counter[ type ] ){\r
};\r
\r
data.postMesure();\r
- data.updateLayout( x, y );\r
+ data.updateLayout( x + data.boxX, y + data.boxY );\r
}\r
});\r
\r
pointerChildren : true,\r
through : false,\r
\r
+ scrollingX : 0,\r
+ scrollingY : 0,\r
+\r
Constructor : function( layout, args ){\r
var i = 0,\r
l = args.length,\r
}; \r
};\r
\r
- this.phase = 3;\r
- this.User.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
+ _AbstractUINode.prototype.creationComplete.apply( this, arguments );\r
},\r
\r
calculate : function( isNeedsDetection, x, y, w, h ){\r
_y = y - this.scrollingY;\r
for( ; i; ){\r
child = uinodes[ --i ];\r
- if( !child.pointerDisabled && child.boxX <= _x && _x < child.boxX + child.boxWidth && child.boxY <= _y && _y < child.boxY + child.boxHeight ){\r
- !child.hovering && ( child.rootData.hoverList[ child.rootData.hoverList.length ] = child );\r
- this.hitChildData = child.rootData.targetNodeData = child;\r
+ if( !child.pointerDisabled && child.boxX <= _x && _x < child.boxX + child.boxWidth && child.boxY <= _y && _y < child.boxY + child.boxHeight && child.capcher( _x, _y ) ){\r
+ //console.log( 'hit child ' + _x + ' ' + _y + ' boxX:' + child.boxX + ' boxY:' + child.boxY );\r
+ this.hitChildData = child;\r
break;\r
};\r
};\r
this.hitChildData && !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
return !!this.hitChildData;\r
};\r
- hit = 0 <= x && x < this.w && 0 <= y && y < this.h;\r
+ hit = 0 <= x && x < this.boxWidth && 0 <= y && y < this.boxHeight;\r
( this.hitChildData || hit ) && !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
if( hit && this.hitChildData === null ) this.rootData.targetNodeData = this;\r
return hit || !!this.hitChildData;\r
_p2 && data.addToParent( this.xnode );\r
uinodes[ uinodes.length ] = data; \r
};\r
- //p3 && data.phase < 3 && data.afterAddition();\r
- p3 && data.phase < 4 && data.creationComplete();\r
+ p3 && data.phase < 3 && data.creationComplete();\r
};\r
4 <= this.phase && this.rootData.reserveCalc();\r
},\r
//data.postMesure();\r
};\r
\r
- !isNeedsDetection && data.updateLayout( x, y );\r
+ !isNeedsDetection && data.updateLayout( x + data.boxX, y + data.boxY );\r
}\r
});\r
\r
//data.postMesure();\r
};\r
\r
- !isNeedsDetection && data.updateLayout( x, y );\r
+ !isNeedsDetection && data.updateLayout( x + data.boxX, y + data.boxY );\r
}\r
});\r
\r
};\r
\r
data.postMesure();\r
- data.updateLayout( x, y );\r
+ data.updateLayout( x + data.boxX, y + data.boxY );\r
}\r
});\r
\r
_scrollY : 0,\r
scrollXPercent : 0,\r
scrollYPercent : 0,\r
- scrollingX : 0,\r
- scrollingY : 0,\r
\r
_containerNode : null,\r
scrollManager : null,\r
};\r
this.xnode = X.Dom.Node.create( 'div' );\r
\r
- if( X.Type.isString( content ) ){\r
+ if( X.Type.isString( content ) && content ){\r
this.content = content;\r
+ this.xnode.text( this.content );\r
this.dirty = X.UI.Dirty.CONTENT;\r
};\r
- },\r
- creationComplete : function(){\r
- this.content && this.xnode.text( this.content );\r
- \r
- this.phase = 3;\r
- this.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
}\r
}\r
);\r
function eventRellay( e ){
- var x = e.clientX,
- y = e.clientY,
+ var x = e.clientX / X.Dom.baseFontSize,
+ y = e.clientY / X.Dom.baseFontSize,
type = X.UI.Event.NameToID[ e.type ],
i = 0,
data = X.UI.currentRootData,
sysOnly = false,
ret = X.Callback.NONE,
list, parent, _ret;
- if( type !== X.UI.Event._POINTER_MOVE && type !== X.UI.Event._MOUSE_MOVE ){
- //console.log( type + ' x:' + x + ', y:' + y )
- };
+ //if( type !== '' + X.UI.Event._POINTER_MOVE && type !== '' + X.UI.Event._TOUCH_MOVE && type !== '' + X.UI.Event._MOUSE_MOVE ){
+ //console.log( e.type + ' ' + type + ' x:' + x + ', y:' + y );
+ //};
e.type = type;
if( X.UI.currentRootData === null ) return ret;
list = X.UI.currentRootData.hoverList;
- data = X.UI.currentRootData.targetNodeData = X.UI.currentRootData;
- data.capcher( x, y );
+ ( X.UI.currentRootData.targetNodeData = X.UI.currentRootData ).capcher( x, y );
data = X.UI.currentRootData.targetNodeData;
+ //data !== X.UI.currentRootData && console.log( data.xnode.text() );
+
while( data ){
_ret = data.dispatch( e, sysOnly );
ret |= _ret;
X.Timer.once( 0, this, this.afterAddToView );
},
afterAddToView : function(){
- //this.afterAddition();
this.xnode.className( 'PageRoot' );
this.creationComplete();