16 if( !( 'console' in window ) ){
\r
17 window[ 'console' ] = { log : function(){} };
\r
20 var getFunctionName = function( f ){
\r
23 : (''+f).replace(/^\s*function\s*([^\(]*)[\S\s]+$/im, '$1');
\r
27 * http://d.hatena.ne.jp/hir90/20080620/1213987444
\r
29 String.prototype.repeat = function( num){
\r
30 var str = "" + this;
\r
32 if( num < 0) return 'error';
\r
34 if( num&1) ans += str;
\r
42 * http://pettanr.sourceforge.jp/test/type.html
\r
45 isObject : function(v) {
\r
46 return v !== null && typeof v === 'object';
\r
48 isFunction : function(v) {
\r
49 return typeof v === 'function';
\r
51 isArray : function(v) {
\r
52 return Object.prototype.toString.call(v) === '[object Array]';
\r
54 isBoolean : function(v) {
\r
55 return typeof v === 'boolean';
\r
57 isString : function(v) {
\r
58 return typeof v === 'string';
\r
60 isNumber : function(v) {
\r
61 return typeof v === 'number';
\r
63 isFinite : function(v){
\r
64 return Type.isNumber(v) === true && isFinite(v);
\r
66 isHTMLElement : function(v){
\r
67 if( 'HTMLElement' in window ){
\r
68 Type.isHTMLElement = function(v){
\r
69 return v instanceof HTMLElement;
\r
72 Type.isHTMLElement = function(v) {
\r
73 if( Type.isObject(v) === false ){
\r
77 if(v && v.nodeType === 1 ){
\r
79 r = v.cloneNode(false);
\r
83 if(r === v) return false;
\r
86 return r.nodeType === 1;
\r
93 return Type.isHTMLElement(v);
\r
96 isElementCollection : function(v) {
\r
97 return (Object.prototype.toString.call(v) === "[object HTMLCollection]");
\r
100 isNull : function(v) {
\r
103 isUndefined : function(v) {
\r
104 return typeof v === 'undefined';
\r
114 var UA = ( function(){
\r
115 var ua = (function(){
\r
119 var dua = n.userAgent;
\r
120 var dav = n.appVersion;
\r
121 var tv = parseFloat(dav);
\r
122 acme.isOpera = (dua.indexOf("Opera") >= 0) ? tv: undefined;
\r
123 acme.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : undefined;
\r
124 acme.isWebKit = parseFloat(dua.split("WebKit\/")[1]) || undefined;
\r
125 acme.isChrome = parseFloat(dua.split("Chrome\/")[1]) || undefined;
\r
126 acme.isGecko = (dua.indexOf("Gecko\/") >= 0) ? parseFloat(dua.split("rv:")[1].replace( /^(\d*\.\d*)\.(\d*)/, '$1$2' )) : undefined;
\r
127 var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
\r
128 if(index && !acme.isChrome){
\r
129 acme.isSafari = parseFloat(dav.split("Version/")[1]);
\r
130 if(!acme.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
\r
134 if(document.all && !acme.isOpera){
\r
135 acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
\r
140 isIE = navigator.userAgent.toLowerCase().indexOf( 'msie') !== -1,
\r
141 ieVersion = isIE === true ? parseInt( navigator.appVersion.toLowerCase().replace( /.*msie[ ]/, '').match( /^[0-9]+/)) : 0,
\r
142 ieRenderingVersion = ieVersion === 8 ? document.documentMode : ieVersion,
\r
143 isStanderdMode = document.compatMode === 'CSS1Compat',
\r
144 ActiveX = ( function(){
\r
145 if( isIE === false || ieVersion > 8 ) return false;
\r
146 var b = document.body,
\r
147 c = b.className || '',
\r
149 ret = undefined, //pettanr.URL_PARAMS.ActiveX,
\r
150 ns = 'pettanr-ActiveX-',
\r
151 enabled = 'enabled',
\r
152 disabled = 'disabled';
\r
153 if( ret !== true && ret !== false){
\r
154 if( b.className.indexOf( ns + enabled ) !== -1 ) return true;
\r
155 if( b.className.indexOf( ns + disabled ) !== -1 ) return false;
\r
156 x = document.createElement( 'div' );
\r
158 x.style.cssText = 'width:1px;height:1px;line-height:1px;filter:progid:DXImageTransform.Microsoft.Shadow()';
\r
159 ret = x.offsetHeight > 1;
\r
162 b.className += [ c !== '' ? ' ' : c, ns, ret === true ? enabled : disabled ].join( '');
\r
165 VML = ( function(){
\r
166 if( ActiveX === false || isIE === false || ieVersion > 8) return false;
\r
167 var globalObjectName = 'detect_activex',//Util.createGlobalUniqueName(),
\r
170 document.write( [ '<!--[if gte vml 1]><script id="', id, '">window', '.', globalObjectName, '=1;<\/script><![endif]-->'].join( ''));
\r
171 if( window[ globalObjectName ] === 1 ){
\r
172 script = document.getElementById( id );
\r
173 script.parentNode.removeChild( script );
\r
174 window[ globalObjectName ] = null;
\r
179 isStandAloneMode = ( function(){
\r
180 if( isIE === false) return false;
\r
181 if( VML === true) return false;
\r
182 var globalObjectName = 'detect_standalone', //Util.createGlobalUniqueName(),
\r
184 id = 'detectStandAlone';
\r
185 document.write( [ '<!--[if IE ', Math.floor( ieVersion ), ']><script id="', id, '">window', '.', globalObjectName, '=1;<\/script><![endif]-->'].join( '' ));
\r
186 if( window[globalObjectName] === 1 ){
\r
187 script = document.getElementById( id);
\r
188 script.parentNode.removeChild( script);
\r
189 window[globalObjectName] = null;
\r
199 WEBKIT: ua.isWebKit,
\r
200 CHROME: ua.isChrome,
\r
202 ieVersion: ieVersion,
\r
203 ieRenderingVersion: ieRenderingVersion,
\r
204 isStanderdMode: isStanderdMode,
\r
207 STANDALONE: isStandAloneMode,
\r
208 VENDER_PREFIX: ( function() {
\r
209 var ua = navigator.userAgent.toLowerCase();
\r
210 if ( ua.indexOf('opera') !== -1 ){
\r
212 } else if ( ua.indexOf('msie') !== -1 ){
\r
214 } else if ( ua.indexOf('webkit') !== -1 ){
\r
216 } else if ( navigator.product === 'Gecko' ){
\r
221 startVML: function(){
\r
222 delete UA.startVML;
\r
223 if( UA.VML !== true) return false;
\r
224 if (!document.namespaces["v"]) {
\r
225 document.namespaces.add("v", "urn:schemas-microsoft-com:vml", "#default#VML");
\r
227 document.createStyleSheet().cssText = "v\:shape,v\:image{behavior:url(#default#VML);display:block;};";
\r
233 /* ----------------------------------------------------
\r
236 * extend( baseInstance, extend)
\r
237 * cleanCommentNode()
\r
239 * getElementSize( _elm)
\r
241 * getAbsolutePath()
\r
242 * getGrobalObjectName()
\r
245 var Util = ( function( window, document, undefined ){
\r
246 var body = document.getElementsByTagName( 'body' )[ 0 ];
\r
248 var ELM_SIZE_GETTER = ( function(){
\r
249 var ret = document.createElement( 'div' );
\r
250 body.appendChild( ret );
\r
252 ret.id = 'elmSizeGetter';
\r
253 ret.style.cssText = 'position:absolute;left:0;top:-9999px;visibility:hidden';
\r
255 body.removeChild( ret );
\r
258 CLEAN_TARGET_ELEMENT = 'script,style,object,applet,embed,iframe,frame,base,bgsound,frameset,listing'.split( ',' );
\r
260 var UNIT_RATIO = ( function( elm ){
\r
263 units = 'cm,mm,in,pt,pc'.split( ',' ),
\r
266 body.appendChild( elm );
\r
269 unit = units[ --i ];
\r
270 elm.style.width = 1000 + unit;
\r
271 ret[ unit ] = elm.offsetWidth / 1000;
\r
273 elm.style.cssText = '';
\r
275 body.removeChild( elm );
\r
277 })( ELM_SIZE_GETTER );
\r
279 var FONT_SIZE_RATIO = ( function( elm ){
\r
282 list = 'xx-large,x-large,large,larger,medium,small,smaller,x-small,xx-small'.split( ',' ),
\r
285 body.appendChild( elm );
\r
286 elm.style.cssText = 'font-size:100px;line-height:1em;';
\r
287 elm.appendChild( document.createTextNode( 'X' ) );
\r
289 base = elm.offsetHeight;
\r
292 size = list[ --i ];
\r
293 elm.style.fontSize = size;
\r
294 ret[ size ] = base;
\r
297 elm.style.cssText = '';
\r
298 elm.removeChild( elm.firstChild );
\r
299 body.removeChild( elm );
\r
301 })( ELM_SIZE_GETTER );
\r
303 var REG_LARGE = /[A-Z]/g;
\r
305 /* clean comment node */
\r
306 window.setTimeout( function(){
\r
307 // Util.cleanCommentNode();
\r
309 /* clean noscript */
\r
311 var noscripts = Util.copyArray( document.getElementsByTagName( 'noscript' ) ),
\r
313 i = noscripts.length;
\r
315 ns = noscripts[ --i ];
\r
316 ns.parentNode && ns.parentNode.removeChild( ns );
\r
320 function clone( src ) {
\r
322 if( Type.isArray(src) === true ){
\r
325 if( Type.isObject(src) === true ){
\r
328 if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){
\r
333 for( var key in src ){
\r
334 ret[ key ] = clone( src[ key ]);
\r
340 parse: function( v ){
\r
341 if( Type.isString( v ) === true ){
\r
342 if( v === 'true' ) return true;
\r
343 if( v === 'false' ) return false;
\r
344 if( v === 'null' ) return null;
\r
345 if( v === 'undefined' ) return undefined;
\r
346 if( v === 'NaN' ) return NaN;
\r
347 if( v === '' ) return v;
\r
348 var _v = v.split( ' ' ).join( '' ),
\r
350 if( '' + n === _v || '' + n === '0' + _v ) return n - 0;
\r
354 extend: function( target, extend ){
\r
355 for( var key in extend ){
\r
356 if( Type.isUndefined( target[ key ] ) === true ){
\r
357 target[ key ] = extend[ key ];
\r
359 if( typeof target[ key ] === typeof extend[ key ] ){
\r
360 target[ key ] = extend[ key ];
\r
362 alert( 'extend error' );
\r
367 copy: function( objOrArray ){
\r
368 return clone( objOrArray );
\r
370 cleanCommentNode: function ( _targetElm ){
\r
371 search( _targetElm || body );
\r
373 function search( _elm ){
\r
374 if( !_elm ) return;
\r
375 if( _elm.nodeType === 8 ){
\r
376 _elm.parentNode.removeChild( _elm );
\r
379 if( _elm.nodeType === 1 ){
\r
380 var _array = Util.copyArray( _elm.childNodes ); // liveNode > array
\r
381 while( _array.length > 0 ) search( _array.shift() );
\r
385 cleanElement: function( _targetElm ){
\r
386 var _array, _elm, j, _css,
\r
387 i = CLEAN_TARGET_ELEMENT.length;
\r
389 _array = Util.copyArray( _targetElm.getElementsByTagName( CLEAN_TARGET_ELEMENT[ --i ] ) );
\r
390 for( j = _array.length; j; ){
\r
391 _elm = _nodes[ --j ];
\r
392 _elm.parentNode && _elm.parentNode.removeChild( _elm );
\r
395 Util.cleanCommentNode( _targetElm );
\r
397 if( UA.isIE === false ) return;
\r
398 _nodes = _targetElm.all || _targetElm.getElementsByTagName( '*' );
\r
399 for( i = _nodes.length; i; ){
\r
400 _elm = _nodes[ --i ];
\r
401 _css = Util.getInlineStyle( _elm );
\r
402 _css.filter = null;
\r
403 _css.behavior = null;
\r
404 _elm.style.cssText = Util.toCssText( _css );
\r
407 camelize: function( cssProp ){
\r
408 var parts = cssProp.split( ' ' ).join( '' ).split( '-' ),
\r
411 if( l === 1 ) return parts[ 0 ];
\r
413 camelized = cssProp.charAt(0) === '-'
\r
414 ? parts[ 0 ].charAt( 0 ).toUpperCase() + parts[ 0 ].substring( 1 )
\r
417 for( i = 1; i < l; ++i ){
\r
418 camelized += parts[ i ].charAt( 0 ).toUpperCase() + parts[ i ].substring( 1 );
\r
422 uncamelize: function( str ){
\r
423 return str.split( ' ' ).join( '' ).replace( REG_LARGE, '-$&' ).toLowerCase();
\r
425 pxTo: function( _px, _unit ){
\r
426 return _px / ( UNIT_RATIO[ _unit ] || 1 );
\r
428 toPx: function( x, _unit ){
\r
429 return x * ( UNIT_RATIO[ _unit ] || 1 );
\r
431 absoluteFontSizeToPx: function( fontsize ){
\r
432 return FONT_SIZE_RATIO[ fontsize ] || 0;
\r
434 getElementSize: function( _elm ){
\r
435 if( Type.isHTMLElement( _elm ) === false ){
\r
441 var parentElm = _elm.parentNode,
\r
442 prevElm = _elm.previousSibling,
\r
443 nextElm = _elm.nextSibling,
\r
444 displayNone = _elm.style.display === 'none';
\r
445 if( displayNone === true ) _elm.style.display = 'block';
\r
447 body.appendChild( ELM_SIZE_GETTER );
\r
448 ELM_SIZE_GETTER.appendChild( _elm );
\r
451 width: _elm.offsetWidth,
\r
452 height: _elm.offsetHeight
\r
454 if( displayNone === true ) _elm.style.display = 'none';
\r
456 parentElm.insertBefore( _elm, nextElm );
\r
458 if( prevElm && prevElm.nextSibling ){
\r
459 parentElm.insertBefore( _elm, prevElm.nextSibling );
\r
461 parentElm && parentElm.appendChild( _elm );
\r
463 body.removeChild( ELM_SIZE_GETTER );
\r
467 getImageSize: function( img ){
\r
468 var parentElm = img.parentNode,
\r
469 prevElm = img.previousSibling,
\r
470 nextElm = img.nextSibling,
\r
471 displayNone = img.style.display === 'none';
\r
472 if( displayNone === true ) img.style.display = '';
\r
474 body.appendChild( ELM_SIZE_GETTER );
\r
475 ELM_SIZE_GETTER.appendChild( img );
\r
477 var size = getActualDimension( img );
\r
479 if( displayNone === true ) img.style.display = 'none';
\r
481 parentElm.insertBefore( img, nextElm );
\r
483 if( prevElm && prevElm.nextSibling ){
\r
484 parentElm.insertBefore( img, prevElm.nextSibling );
\r
486 parentElm && parentElm.appendChild( img );
\r
488 body.removeChild( ELM_SIZE_GETTER );
\r
491 * AUTHOR: uupaa.js@gmail.com
\r
493 function getActualDimension(image) {
\r
494 var run, mem, w, h, key = "actual";
\r
496 // for Firefox, Safari, Google Chrome
\r
497 if( "naturalWidth" in image ){
\r
499 width: image.naturalWidth,
\r
500 height: image.naturalHeight
\r
504 if( "src" in image ){ // HTMLImageElement
\r
505 if (image[key] && image[key].src === image.src) {
\r
508 if( document.uniqueID ){ // for IE
\r
509 run = image.runtimeStyle;
\r
510 mem = { w: run.width, h: run.height }; // keep runtimeStyle
\r
511 run.width = "auto"; // override
\r
512 run.height = "auto";
\r
515 run.width = mem.w; // restore
\r
516 run.height = mem.h;
\r
517 } else { // for Opera and Other
\r
518 mem = { w: image.width, h: image.height }; // keep current style
\r
519 image.removeAttribute("width");
\r
520 image.removeAttribute("height");
\r
523 image.width = mem.w; // restore
\r
524 image.height = mem.h;
\r
526 return image[key] = { width: w, height: h, src: image.src }; // bond
\r
528 // HTMLCanvasElement
\r
529 return { width: image.width, height: image.height };
\r
534 getAbsolutePath: function( path ){
\r
535 var elm = document.createElement('div');
\r
536 body.appendChild( elm );
\r
537 elm.innerHTML = '<a href=\"' + path + '\" />';
\r
538 body.removeChild( elm );
\r
539 return elm.firstChild.href;
\r
541 getAbsolutePosition: function( _elm ){
\r
542 // Find the destination's position
\r
543 // need html, body { fontfamily: "MS PGothic", "MS Gothic" } for ie6.
\r
544 var destx = _elm.offsetLeft,
\r
545 desty = _elm.offsetTop,
\r
547 body = document.body;
\r
548 while( thisNode.offsetParent && thisNode !== body ){
\r
549 thisNode = thisNode.offsetParent;
\r
550 destx += thisNode.offsetLeft;
\r
551 desty += thisNode.offsetTop;
\r
558 contain: function( parent, child ){
\r
559 function find( node ){
\r
560 var children = node.childNodes,
\r
562 l = children.length,
\r
565 elm = children[ i ];
\r
566 if( elm === child ) return true;
\r
567 if( elm.nodeType === 1 && find( elm ) === true ) return true;
\r
571 return find( parent );
\r
573 pullHtmlAsTemplete: function( html ){
\r
574 var elm = document.createElement( 'div' );
\r
575 body.appendChild( elm );
\r
576 elm.innerHTML = html;
\r
577 body.removeChild( elm );
\r
578 return elm.firstChild;
\r
580 getElementsByClassName: function( _elm, _className, opt_tagName ){
\r
581 var _all = !opt_tagName || opt_tagName === '*',
\r
582 _livenodes = _all === true ? ( _elm.all || _elm.getElementsByTagName( '*' )) : _elm.getElementsByTagName( opt_tagName ),
\r
583 _nodes = Util.copyArray( _livenodes );
\r
584 for( var j = 0; j < _nodes.length; ){
\r
585 _node = _nodes[ j ];
\r
586 if( _node.nodeType !== 1 || Util.hasClassName( _node, _className ) === false ){
\r
587 _nodes.splice( j, 1 );
\r
594 getChildIndex: function( _parent, _child ){
\r
595 var _children = _parent.getElementsByTagName( _child.tagName );
\r
596 for( var i = _children.length; i; ){
\r
597 if( _children[ --i ] === _child ) return i;
\r
601 hasClassName: function( _elm, _className ){
\r
602 var cnames = ( _elm.className || '' ).split( ' ' ),
\r
603 _cnames = _className.split( ' ' ),
\r
605 i = _cnames.length;
\r
607 cname = _cnames[ --i ];
\r
608 if( cname === '' ) continue;
\r
609 if( Util.getIndex( cnames, cname ) === -1 ) return false;
\r
613 addClass: function( _elm, _className ){
\r
614 if( Util.hasClassName( _elm, _className ) === false ){
\r
616 var _array = ( _elm.className || '' ).replace( /\s+/g, sp ).split( sp );
\r
617 _array.push( _className );
\r
618 _elm.className = _array.join( sp );
\r
621 removeClass: function( _elm, _className ){
\r
623 _array = _elm.className.replace( /\s+/g, sp ).split( sp ),
\r
624 i = Util.getIndex( _array, _className );
\r
626 _array.splice( i, 1 );
\r
627 _elm.className = _array.join( sp );
\r
630 toggleClass: function( _elm, _className, _switch ){
\r
631 if( Type.isBoolean( _switch ) === true ){
\r
632 _switch === true ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );
\r
634 Util.hasClassName( _elm, _className ) === false ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );
\r
637 removeAllChildren: function ( _elm ){
\r
638 while( _elm.firstChild ){
\r
639 remove( _elm.firstChild );
\r
641 function remove( _node ){
\r
642 while( _node.firstChild){
\r
643 remove( _node.firstChild);
\r
645 _node.parentNode && _node.parentNode.removeChild( _node);
\r
648 getIndex: function( _array, _element ){
\r
649 if( Array.prototype.indexof ){
\r
650 Util.getIndex = function( _array, _element ){
\r
651 return _array.indexof( _element );
\r
654 Util.getIndex = function( _array, _element ){
\r
655 var i = _array.length;
\r
657 if( _array[ --i ] === _element ) return i;
\r
662 return Util.getIndex( _array, _element );
\r
664 copyArray: function( _array ){
\r
665 var l = _array.length,
\r
666 ret = new Array( l ),
\r
669 ret[ i ] = _array[ i ];
\r
676 createGlobalUniqueName: function(){
\r
677 var randomKey = null;
\r
679 randomKey = '_uniqueName'+(''+Math.random()).replace(/\./,'');
\r
680 if( typeof window[randomKey] === 'undefined'){
\r
686 createIframe: function( id, callback, hide ){
\r
688 var el = document.createElement( ua.isIE ? '<iframe name="' + id + '" frameborder="0" scrolling="no">' : 'iframe');
\r
691 el.onreadystatechange = function(){
\r
692 if( this.readyState === "complete" ){
\r
693 this.onreadystatechange = new Function();
\r
694 this.onreadystatechange = null;
\r
695 setTimeout( asynkCallback, 0 );
\r
699 // iron(chrome) の場合、append の前に onload を指定しないと onload が呼ばれない
\r
700 el.onload = function(){
\r
702 setTimeout( asynkCallback, 0 );
\r
706 document.body.appendChild( el );
\r
707 el.id = el.name = id;
\r
708 el.setAttribute( 'name', id );
\r
709 if( hide === true )el.style.cssText = 'width:1px;height:1px;visibility:hidden;position:absolute;top:1px;left:1px;';
\r
710 // http://d.hatena.ne.jp/onozaty/20070830/p1
\r
711 // [JavaScript]IE6ではJavaScriptで動的に作成したiframeに対してsubmitできない(IE7は未確認) ->解決
\r
712 el.contentWindow.name = id;
\r
716 function asynkCallback(){
\r
721 })( window, document );
\r
724 var CSS = ( function( window, documwnt, undefined ){
\r
728 UNITS = 'px,cm,mm,in,pt,pc,em,%'.split( ',' ),
\r
729 CLIP_SEPARATOR = UA.isIE === true && UA.ieVersion < 8 ? ' ' : ',';
\r
731 var SPECIAL = ( function(){
\r
733 if( UA.isIE === true && UA.ieVersion < 9 ){
\r
734 if( UA.ACTIVEX === true ){
\r
735 // _special.opacity = 'ActiveXOpacity';
\r
736 _special.setFilters = function( style ){
\r
737 var filters = ( style.filter || '' ).split( ') ' ),
\r
739 i = filters.length,
\r
740 filter, names, props, prop, j, l, key, v;
\r
742 filter = filters[ --i ].split( ' ' ).join( '' ).split( '(' );
\r
743 if( filter.length !== 2 ) continue;
\r
744 names = filter[ 0 ].split( '.' ); // progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=120,strength=9)
\r
745 props = filter[ 1 ].split( ',' ); //
\r
747 for( j = 0, l = props.length; j < l; ++j ){
\r
748 prop = props[ j ].split( '=' );
\r
749 key = prop[ 0 ].toLowerCase();
\r
751 filter[ key ] = v; //v.charAt( 0 ) === '#' ? v : parseInt( v );
\r
753 data[ names[ names.length - 1 ] ] = filter;
\r
756 style.filter = data;
\r
757 style.opacity = data.alpha && data.alpha.opacity ? data.alpha.opacity / 100 : 1;
\r
759 _special.hasLayout = function( elm ){
\r
760 return elm.currentStyle.hasLayout;
\r
763 _special.opacity = null;
\r
766 var style = document.documentElement.style;
\r
767 _special.opacity = style.opacity !== undefined ? 'opacity' :
\r
768 style.MozOpacity !== undefined ? 'MozOpacity' :
\r
769 style.KhtmlOpacity !== undefined ? 'KhtmlOpacity' :
\r
770 style[ '-khtml-opacity' ] !== undefined ? 'KhtmlOpacity' : null;
\r
772 // if( style.backgroundPositionX === undefined ){
\r
773 _special.setBackgroundPositionXY = function( style ){
\r
774 var bgp = ( style.backgroundPosition || '' ).split( ' ' );
\r
775 style.backgroundPositionX = bgp[ 0 ] || 0;
\r
776 style.backgroundPositionY = bgp[ 1 ] || 0;
\r
779 if( style.clipTop === undefined && style[ 'clip-top' ] === undefined ){
\r
780 _special.setClipTopRightBottomLeft = function( style ){
\r
781 var clip = style.clip || '';
\r
782 if( clip.indexOf( 'rect(' ) === -1 ){
\r
784 style.clipRight = 0;
\r
785 style.clipBottom = 0;
\r
786 style.clipLeft = 0;
\r
789 clip = clip.split( '(' )[ 1 ].split( ')' )[ 0 ].split( clip.indexOf( ',' ) !== -1 ? ',' : ' ' );
\r
790 ret.clipTop = clip[ 0 ];
\r
791 ret.clipRight = clip[ 1 ];
\r
792 ret.clipBottom = clip[ 2 ];
\r
793 ret.clipLeft = clip[ 3 ];
\r
801 function cssToObject( css ){
\r
802 var ret = {}, i, nv, n, v,
\r
803 parse = Util.parse,
\r
804 isNumber = Type.isNumber,
\r
805 camelize = Util.camelize;
\r
806 if( Type.isString( css ) === true ){
\r
807 css = css.split( ';' );
\r
808 for( i = css.length; i; ){
\r
809 nv = css[ --i ].split( ':' ); // filter の場合, progid: がくる
\r
811 if( isNumber( parse( n ) ) === true ) continue;
\r
813 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );
\r
814 ret[ camelize( n ) ] = parse( v );
\r
818 if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );
\r
822 if( SPECIAL.setFilters ){
\r
823 SPECIAL.setFilters( ret );
\r
825 ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;
\r
828 SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );
\r
829 SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );
\r
834 var COLOR = ( function(){
\r
835 var ret = {}, v, name,
\r
838 parseInt( 'FF0000', 16 ), 'RED',
\r
839 parseInt( '00FF00', 16 ), 'LIME',
\r
840 parseInt( '0000FF', 16 ), 'BLUE',
\r
841 parseInt( 'FFFF00', 16 ), 'YELLOW',
\r
842 parseInt( '00FFFF', 16 ), 'AQUA or CYAN',
\r
843 parseInt( 'FF00FF', 16 ), 'FUCHSIA or MAGENTA',
\r
844 parseInt( 'FFFFFF', 16 ), 'WHITE',
\r
845 parseInt( '008000', 16 ), 'GREEN',
\r
846 parseInt( '800080', 16 ), 'PURPLE',
\r
847 parseInt( '800000', 16 ), 'MAROON',
\r
848 parseInt( '000080', 16 ), 'NAVY',
\r
849 parseInt( '808000', 16 ), 'OLIVE',
\r
850 parseInt( '008080', 16 ), 'TEAL',
\r
851 parseInt( '808080', 16 ), 'GRAY',
\r
852 parseInt( 'C0C0C0', 16 ), 'SILVER',
\r
853 parseInt( '696969', 16 ), 'DIMGRAY',
\r
854 parseInt( '708090', 16 ), 'SLATEGRAY',
\r
855 parseInt( 'A9A9A9', 16 ), 'DARKGRAY',
\r
856 parseInt( 'DCDCDC', 16 ), 'GAINSBORO',
\r
857 parseInt( '191970', 16 ), 'MIDNIGHTBLUE',
\r
858 parseInt( '6A5ACD', 16 ), 'SLATEBLUE',
\r
859 parseInt( '0000CD', 16 ), 'MEDIUMBLUE',
\r
860 parseInt( '4169E1', 16 ), 'ROYALBLUE',
\r
861 parseInt( '1E90FF', 16 ), 'DODGERBLUE',
\r
862 parseInt( '87CEEB', 16 ), 'SKYBLUE',
\r
863 parseInt( '4682B4', 16 ), 'STEELBLUE',
\r
864 parseInt( 'ADD8E6', 16 ), 'LIGHTBLUE',
\r
865 parseInt( 'AFEEEE', 16 ), 'PALETURQUOISE',
\r
866 parseInt( '40E0D0', 16 ), 'TURQUOISE',
\r
867 parseInt( 'E0FFFF', 16 ), 'LIGHTCYAN',
\r
868 parseInt( '7FFFD4', 16 ), 'AQUAMARINE',
\r
869 parseInt( '006400', 16 ), 'DARKGREEN',
\r
870 parseInt( '2E8B57', 16 ), 'SEAGREEN',
\r
871 parseInt( '90EE90', 16 ), 'LIGHTGREEN',
\r
872 parseInt( '7FFF00', 16 ), 'CHARTREUSE',
\r
873 parseInt( 'ADFF2F', 16 ), 'GREENYELLOW',
\r
874 parseInt( '32CD32', 16 ), 'LIMEGREEN',
\r
875 parseInt( '9ACD32', 16 ), 'YELLOWGREEN',
\r
876 parseInt( '6B8E23', 16 ), 'OLIVEDRAB',
\r
877 parseInt( 'BCB76B', 16 ), 'DARKKHAKI',
\r
878 parseInt( 'EEE8AA', 16 ), 'PALEGOLDENROD',
\r
879 parseInt( 'FFFFE0', 16 ), 'LIGHTYELLOW',
\r
880 parseInt( 'FFD700', 16 ), 'GOLD',
\r
881 parseInt( 'DAA520', 16 ), 'GOLDENROD',
\r
882 parseInt( 'B8860B', 16 ), 'DARKGOLDENROD',
\r
883 parseInt( 'BC8F8F', 16 ), 'ROSYBROWN',
\r
884 parseInt( 'CD5C5C', 16 ), 'INDIANRED',
\r
885 parseInt( '8B4513', 16 ), 'SADDLEBROWN',
\r
886 parseInt( 'A0522D', 16 ), 'SIENNA',
\r
887 parseInt( 'CD853F', 16 ), 'PERU',
\r
888 parseInt( 'DEB887', 16 ), 'BURLYWOOD',
\r
889 parseInt( 'F5F5DC', 16 ), 'BEIGE',
\r
890 parseInt( 'F5DEB3', 16 ), 'WHEAT',
\r
891 parseInt( 'F4A460', 16 ), 'SANDYBROWN',
\r
892 parseInt( 'D2B48C', 16 ), 'TAN',
\r
893 parseInt( 'D2691E', 16 ), 'CHOCOLATE',
\r
894 parseInt( 'B22222', 16 ), 'FIREBRICK',
\r
895 parseInt( 'A52A2A', 16 ), 'BROWN',
\r
896 parseInt( 'FA8072', 16 ), 'SALMON',
\r
897 parseInt( 'FFA500', 16 ), 'ORANGE',
\r
898 parseInt( 'FF7F50', 16 ), 'CORAL',
\r
899 parseInt( 'FF6347', 16 ), 'TOMATO',
\r
900 parseInt( 'FF69B4', 16 ), 'HOTPINK',
\r
901 parseInt( 'FFC0CB', 16 ), 'PINK',
\r
902 parseInt( 'FF1493', 16 ), 'DEEPPINK',
\r
903 parseInt( 'DB7093', 16 ), 'PALEVIOLETRED',
\r
904 parseInt( 'EE82EE', 16 ), 'VIOLET',
\r
905 parseInt( 'DDA0DD', 16 ), 'PLUM',
\r
906 parseInt( 'DA70D6', 16 ), 'ORCHILD',
\r
907 parseInt( '9400D3', 16 ), 'DARKVIOLET',
\r
908 parseInt( '8A2BE2', 16 ), 'BLUEVIOLET',
\r
909 parseInt( '9370DB', 16 ), 'MEDIUMPURPLE',
\r
910 parseInt( 'D8BFD8', 16 ), 'THISTLE',
\r
911 parseInt( 'E6E6FA', 16 ), 'LAVENDER',
\r
912 parseInt( 'FFE4E1', 16 ), 'MISTYROSE',
\r
913 parseInt( 'FFFFF0', 16 ), 'IVORY',
\r
914 parseInt( 'FFFACD', 16 ), 'LEMONCHIFFON'
\r
916 for( i=list.length; i; ){
\r
918 name = list[ --i ];
\r
924 var PARAMS = ( function(){
\r
926 register( ret.percent = {},
\r
927 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom,paddingLeft,paddingRight,paddingTop,fontSize,textIndent'
\r
929 register( ret.offset = {},
\r
930 'height,width,bottom,left,right,top'
\r
932 register( ret.size = {},
\r
933 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth,letterSpacing'
\r
935 register( ret.color = {},
\r
936 'backgroundColor,borderBottomColor,borderLeftColor,borderRightColor,borderTopColor,color'
\r
938 register( ret.region = {},
\r
939 'margin,padding,borderWidth,borderColor'
\r
941 register( ret.special = {},
\r
942 'clip,backgroundPosition,opacity,lineHeight,zIndex'
\r
944 register( ret.unit = {}, 'px,cm,mm,in,pt,pc,em,%' );
\r
946 register( ret.margin = {}, 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom' );
\r
947 register( ret.padding = {}, 'paddingBottom,paddingLeft,paddingRight,paddingTop' );
\r
948 register( ret.borderWidth = {}, 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth' );
\r
949 register( ret.borderColor = {}, 'borderBottomColor,borderLeftColor,borderRightColor,borderTopColor' );
\r
951 function register( obj, params ){
\r
952 params = params.split( ',' );
\r
953 for( var i=params.length; i; ) obj[ params[ --i ] ] = true;
\r
961 var PropertyClass = function( name, value, unit, pxPerEm ){
\r
963 this.value = value;
\r
965 this.pxPerEm = pxPerEm; // XXpx = 1em;
\r
967 PropertyClass.prototype = {
\r
970 pxPerEm: 12, // 1em === ??px
\r
972 equal: function( prop ){
\r
973 if( this.unit === prop.unit ){
\r
974 return this.value === prop.value;
\r
976 return Math.abs( this.toPx() - prop.toPx() ) < 1;
\r
978 convert: function( prop ){
\r
979 var u = prop.unit, v;
\r
980 if( this.unit === u ) return;
\r
981 this.value = v = this.toPx();
\r
984 this.value = u === 'em' ? v / this.pxPerEm : Util.pxTo( v, u );
\r
987 setValue: function( v ){
\r
990 getValue: function(){
\r
993 getOffset: function( prop ){
\r
994 return prop.value - this.value;
\r
996 getUnit: function(){
\r
999 getValueText: function(){
\r
1000 return this.value === 0 ? '0' : this.value + this.unit;
\r
1002 clear: function(){
\r
1005 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
1010 var v = this.value, u = this.unit;
\r
1011 if( u === px ) return v;
\r
1012 if( u === 'em' ) return v * this.pxPerEm;
\r
1013 if( u === '' && this.name === 'lineHeight' ) return v * this.pxPerEm;
\r
1014 return Util.toPx( v, u );
\r
1016 isValid: function( t ){
\r
1021 z = u !== '' ? true : v === 0;
\r
1022 if( PARAMS.percent[ n ] === true ) return z;
\r
1023 if( PARAMS.offset[ n ] === true ) return z;
\r
1024 if( PARAMS.size[ n ] === true ) return z && u !== '%';
\r
1025 if( PARAMS.special[ n ] === true ){
\r
1026 if( n === 'lineHeight' ) return true;
\r
1027 if( n === 'opacity' ) return 0 <= v && v <= 1 && u === '';
\r
1028 if( n === 'zIndex' ) return u === '';
\r
1035 * backgroundPosition, clip
\r
1037 var PropertyGroupClass = function( name ){
\r
1040 for( var i = 1, l = arguments.length; i<l; ++i ){
\r
1041 this.props.push( arguments[ i ] );
\r
1046 * margin, padding, borderWidth, borderColor
\r
1048 var FrexiblePropertyClass = function( name ){
\r
1051 for( var i = 1, l = arguments.length; i<l; ++i ){
\r
1052 this.props.push( arguments[ i ] );
\r
1054 // top, bottom, left, right, topbottom, leftright, all
\r
1056 FrexiblePropertyClass.prototype = PropertyGroupClass.prototype = {
\r
1058 equal: function( prop ){
\r
1059 var ps = this.props, i = ps.length;
\r
1062 if( ps[ i ].equal( prop[ i ] ) === false ) return false;
\r
1066 convert: function( prop ){
\r
1067 var ps = this.props, i = ps.length;
\r
1070 ps[ i ].convert( prop[ i ] );
\r
1073 setValue: function( ary ){
\r
1074 var ps = this.props, i = 0, l = ps.length;
\r
1075 for( ; i<l; ++i ){
\r
1076 ps[ i ].setValue( ary[ i ] );
\r
1079 getValue: function(){
\r
1080 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1081 for( ; i<l; ++i ){
\r
1082 ret.push( ps[ i ].getValue() );
\r
1086 getOffset: function( prop ){
\r
1092 for( ; i<l; ++i ){
\r
1093 ret.push( ps[ i ].getOffset( _ps[ i ] ) );
\r
1097 getUnit: function(){
\r
1098 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1099 for( ; i<l; ++i ){
\r
1100 ret.push( ps[ i ].getUnit() );
\r
1104 getValueText: function(){
\r
1105 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1106 for( ; i<l; ++i ){
\r
1107 ret.push( ps[ i ].getValueText() );
\r
1109 if( this.name === 'clip' ){
\r
1110 return 'rect(' + ret.join( CLIP_SEPARATOR ) + ')';
\r
1112 return ret.join( ' ' );
\r
1114 clear: function(){
\r
1115 var ps = this.props, i = ps.length;
\r
1117 ps[ --i ].clear();
\r
1120 delete this.props;
\r
1122 isValid: function( t ){
\r
1124 var ps = t.props, i = ps.length;
\r
1127 if( ps[ i ].isValid() === false ) return false;
\r
1133 var ColorPropertyClass = function( name, r, g, b, pct ){
\r
1140 ColorPropertyClass.prototype = {
\r
1142 equal: function( prop ){
\r
1143 if( this.pct === prop.pct ){
\r
1144 return this.r === prop.r && this.g === prop.g && this.b === prop.b;
\r
1146 var rgb = this._toPct(),
\r
1147 _rgb = prop._toPct(),
\r
1151 if( Math.abs( rgb[ i ] - _rgb[ i ] ) > 1 ) return false;
\r
1155 convert: function( prop ){
\r
1157 if( this.pct === u ) return;
\r
1158 var x = u === true ? 100 / 255 : 2.55;
\r
1164 setValue: function( rgb ){
\r
1165 this.r = rgb[ 0 ];
\r
1166 this.g = rgb[ 1 ];
\r
1167 this.b = rgb[ 2 ];
\r
1169 getValue: function(){
\r
1170 return [ this.r, this.g, this.b ];
\r
1172 getOffset: function( prop ){
\r
1173 return [ prop.r - this.r, prop.g - this.g, prop.b - this.b ];
\r
1175 getUnit: function(){
\r
1176 return this.pct === true ? '%' : '';
\r
1178 getValueText: function(){
\r
1179 if( this.pct === true ){
\r
1180 return [ 'rgb(', this.r, '%,', this.g, '%,', this.b, '%)' ].join( '' );
\r
1182 var round = Math.round;
\r
1183 //return [ 'rgb(', round( this.r ), ',', round( this.g ), ',', round( this.b ), ')' ].join( '' );
\r
1185 var rgb = '00000' + ( ( round( this.r ) << 16 ) + ( round( this.g ) << 8 ) + round( this.b ) ).toString( 16 );
\r
1186 return '#' + rgb.substr( rgb.length - 6 );
\r
1188 clear: function(){
\r
1191 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
1195 _toPct: function(){
\r
1196 if( this.pct === true ) return [ this.r, this.g, this.b ];
\r
1197 return [ this.r / 2.55, this.g / 2.55, this.b / 2.55 ];
\r
1199 isValid: function( t ){
\r
1200 var isFinite = window.isFinite;
\r
1201 if( !isFinite( this.r ) || !isFinite( this.g ) || !isFinite( this.b ) ) return false;
\r
1202 if( 0 > this.r || 0 > this.g || 0 > this.b ) return false;
\r
1203 if( this.pct === true ){
\r
1204 return this.r <= 100 && this.g <= 100 && this.b <= 100;
\r
1206 return this.r <= 255 && this.g <= 255 && this.b <= 255;
\r
1210 var isString = Type.isString,
\r
1211 isNumber = Type.isNumber;
\r
1212 var REG_UINIT = /.*\d(\w{1,2})?/,
\r
1215 REG_XXXXXX = /^#[\da-fA-F]{6}?/,
\r
1216 REG_XXX = /^#[\da-fA-F]{3}?/;
\r
1218 var WrappedStyleClass = function( elm, style ){
\r
1220 this.style = style;
\r
1221 this.pxPerEm = this.get( 'fontSize' ).toPx();
\r
1224 WrappedStyleClass.prototype = {
\r
1225 get: function( p ){
\r
1226 if( PARAMS.special[ p ] === true || PARAMS.region[ p ] === true ){
\r
1227 if( p === 'clip' ) return this.getClip();
\r
1228 if( p === 'margin' ) return this.getMarginPaddingBorder( p );
\r
1229 if( p === 'padding' ) return this.getMarginPaddingBorder( p );
\r
1230 if( p === 'borderWidth' ) return this.getMarginPaddingBorder( 'border', 'Width' );
\r
1231 if( p === 'borderColor' ) return this.getBorderColor( 'borderColor' );
\r
1232 if( p === 'backgroundPosition' ) return this.getBackgroundPosition( p );
\r
1233 // opacity, zindex, lineHeight
\r
1234 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x ), this.pxPerEm );
\r
1236 var x = this.style[ p ], e, v, u;
\r
1237 if( PARAMS.offset[ p ] === true ){
\r
1238 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1241 if( p === 'width' ) v = e.offsetWidth;
\r
1242 if( p === 'height' ) v = e.offsetHeight;
\r
1243 if( p === 'top' ) v = e.offsetTop;
\r
1244 if( p === 'bottom' ) v = e.offsetBottom;
\r
1245 if( p === 'left' ) v = e.offsetLeft;
\r
1246 if( p === 'right' ) v = e.offsetRight;
\r
1247 u = this.getUnit( x, p );
\r
1248 // alert( p + this.pxTo( v, u ) + u )
\r
1249 return new PropertyClass( p, this.pxTo( v, u ), u, this.pxPerEm ); */
\r
1251 if( p === 'fontSize' ){ // xx-small 等
\r
1252 v = Util.absoluteFontSizeToPx( x );
\r
1254 return new PropertyClass( p, v, px, this.pxPerEm );
\r
1257 if( PARAMS.percent[ p ] === true ){
\r
1258 // alert( p + ' , ' + x + ' , ' + this.getUnit( x, p ) )
\r
1259 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1261 if( PARAMS.size[ p ] === true ){
\r
1262 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1264 if( PARAMS.color[ p ] === true ){
\r
1265 return this.getColor( x, p );
\r
1268 pxTo: function( px, unit ){
\r
1269 if( unit === 'em' ) return px / this.pxPerEm;
\r
1270 return Util.pxTo( px, unit );
\r
1272 getValue: function( x, p ){
\r
1273 if( isString( x ) === true ){
\r
1274 return parseInt( x );
\r
1276 if( isNumber( x ) === true ){
\r
1281 getUnit: function( x, p ){
\r
1283 if( isString( x ) === true ){
\r
1284 u = x.replace( REG_UINIT, $1 );
\r
1285 if( p === 'lineHeight' ) return u;
\r
1286 if( PARAMS.unit[ u ] !== true ) return px;
\r
1291 getColor: function( x, p ){
\r
1292 var rgb = COLOR[ x.toUpperCase() ],
\r
1297 if( isNumber( rgb ) === true ){
\r
1298 r = ( rgb & 0xff0000 ) >> 16;
\r
1299 g = ( rgb & 0xff00 ) >> 8;
\r
1300 b = ( rgb & 0xff );
\r
1302 if( x.match( REG_XXXXXX ) ){
\r
1303 r = parseInt( x.charAt( 1 ) + x.charAt( 2 ), 16 );
\r
1304 g = parseInt( x.charAt( 3 ) + x.charAt( 4 ), 16 );
\r
1305 b = parseInt( x.charAt( 5 ) + x.charAt( 6 ), 16 );
\r
1306 //alert( x + ' g: ' + g )
\r
1308 if( x.match( REG_XXX ) ){
\r
1309 r = parseInt( x.charAt( 1 ) + x.charAt( 1 ), 16 );
\r
1310 g = parseInt( x.charAt( 2 ) + x.charAt( 2 ), 16 );
\r
1311 b = parseInt( x.charAt( 3 ) + x.charAt( 3 ), 16 );
\r
1313 if( x.indexOf( 'rgb(' ) === 0 ){
\r
1314 rgb = x.substr( 4 ).split( ',' );
\r
1315 r = parseFloat( rgb[ 0 ] );
\r
1316 g = parseFloat( rgb[ 1 ] );
\r
1317 b = parseFloat( rgb[ 2 ] );
\r
1318 if( x.indexOf( '%' ) !== -1 ){
\r
1326 return new ColorPropertyClass( p, r, g, b, pct );
\r
1328 getClip: function( name ){
\r
1329 // rect(...) クリップします。<top>, <bottom> は上端からの、 <right>, <left> は左端からのオフセットで指定します。Internet Explorer 4~7 では、カンマの代わりにスペースで区切る必要があります。
\r
1330 // position:absolute または position:fixed を適用した要素に対してのみ有効です。
\r
1331 var top = this.get( name + 'Top' ),
\r
1332 right = this.get( name + 'Right' ),
\r
1333 bottom = this.get( name + 'Bottom' ),
\r
1334 left = this.get( name + 'Left' ),
\r
1335 ret = new PropertyGroupClass( name, top, right, bottom, left );
\r
1336 if( ret.isValid() === true ) return ret;
\r
1338 all = this.style[ name ].split( '(' )[ 1 ].split( ')' )[ 0 ].split( CLIP_SEPARATOR );
\r
1339 return new PropertyGroupClass( name,
\r
1340 new PropertyClass( name + 'Top', all[ 0 ], px, this.pxPerEm ),
\r
1341 new PropertyClass( name + 'Right', all[ 1 ], px, this.pxPerEm ),
\r
1342 new PropertyClass( name + 'Bottom', all[ 2 ], px, this.pxPerEm ),
\r
1343 new PropertyClass( name + 'Left', all[ 3 ], px, this.pxPerEm )
\r
1346 getBackgroundPosition: function( name ){
\r
1347 var x = this.get( name + 'X' ),
\r
1348 y = this.get( name + 'Y' ),
\r
1349 ret = new PropertyGroupClass( name, x, y ),
\r
1351 if( ret.isValid() === true ) return ret;
\r
1353 xy = this.style[ name ].split( ' ' );
\r
1354 return new PropertyGroupClass( name,
\r
1355 new PropertyClass( name + 'X', this.getValue( xy[ 0 ] ), this.getUnit( xy[ 0 ] ), this.pxPerEm ),
\r
1356 new PropertyClass( name + 'Y', this.getValue( xy[ 1 ] ), this.getUnit( xy[ 1 ] ), this.pxPerEm )
\r
1359 getMarginPaddingBorder: function( name, widthOrColor ){
\r
1360 widthOrColor = widthOrColor || '';
\r
1361 var _class = PropertyClass,
\r
1362 top = this.get( name + 'Top' + widthOrColor ),
\r
1363 right = this.get( name + 'Right' + widthOrColor ),
\r
1364 bottom = this.get( name + 'Bottom' + widthOrColor ),
\r
1365 left = this.get( name + 'Left' + widthOrColor ),
\r
1366 ret = new FrexiblePropertyClass( name, top, right, bottom, left ),
\r
1369 if( ret.isValid() === true ) return ret;
\r
1371 all = this.style[ name + widthOrColor ].split( ' ' );
\r
1373 for( i = 0, l=all.length; i<l; ++i ){
\r
1375 v = this.getValue( x );
\r
1376 u = this.getUnit( x );
\r
1378 if( i === 0 ) top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1379 if( i === 1 ) right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1380 if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1381 if( i === 3 ) left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1384 if( i === 0 ) top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1386 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1387 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1389 if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor , v, u, this.pxPerEm );
\r
1393 top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1394 bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1397 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1398 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1402 top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1403 bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1404 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1405 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1408 return new FrexiblePropertyClass( name, top, right, bottom, left );
\r
1410 getBorderColor: function( name ){
\r
1411 var getColor = this.getColor,
\r
1412 top = this.get( name + 'TopColor' ),
\r
1413 right = this.get( name + 'RightColor' ),
\r
1414 bottom = this.get( name + 'BottomColor' ),
\r
1415 left = this.get( name + 'LeftColor' ),
\r
1416 ret = new FrexiblePropertyClass( name, top, right, bottom, left ),
\r
1419 if( ret.isValid() === true ) return ret;
\r
1421 all = this.style[ name ].split( ' ' );
\r
1423 for( i = 0, l = all.length; i<l; ++i ){
\r
1426 if( i === 0 ) top = getColor( x, name + 'Top' );
\r
1427 if( i === 1 ) right = getColor( x, name + 'Right' );
\r
1428 if( i === 2 ) bottom = getColor( x, name + 'Bottom' );
\r
1429 if( i === 3 ) left = getColor( x, name + 'Left' );
\r
1432 if( i === 0 ) top = getColor( x, name + 'Top' );
\r
1434 right = getColor( x, name + 'Right' );
\r
1435 left = getColor( x, name + 'Left' );
\r
1437 if( i === 2 ) bottom = getColor( x, name + 'Bottom' );
\r
1441 top = getColor( x, name + 'Top' );
\r
1442 bottom = getColor( x, name + 'Bottom' );
\r
1445 right = getColor( x, name + 'Right' );
\r
1446 left = getColor( x, name + 'Left' );
\r
1450 top = getColor( x, name + 'Top' );
\r
1451 bottom = getColor( x, name + 'Bottom' );
\r
1452 right = getColor( x, name + 'Right' );
\r
1453 left = getColor( x, name + 'Left' );
\r
1456 return new FrexiblePropertyClass( name, top, right, bottom, left );
\r
1458 clear: function(){
\r
1461 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
1466 function camelizeHash( obj ){
\r
1469 _p = Util.camelize( p );
\r
1470 if( _p === p ) continue;
\r
1471 obj[ _p ] = obj[ _p ] || obj[ p ];
\r
1477 getWrappedStyle: function( elm, opt_css ){
\r
1478 opt_css && camelizeHash( opt_css );
\r
1479 return new WrappedStyleClass( elm, opt_css || CSS.getComputedStyle( elm ) );
\r
1481 getInlineStyle: function( _elm ){
\r
1482 return cssToObject( _elm.style.cssText );
\r
1484 getStyleProperty : function( elm, property ){
\r
1485 if( document.defaultView && document.defaultView.getComputedStyle ){
\r
1486 CSS.getStyleProperty = function( elm, property ){
\r
1487 var obj = document.defaultView.getComputedStyle( elm, '' ),
\r
1490 fontSize = 'fontSize',
\r
1491 number = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ],
\r
1494 if( obj.cssText ){
\r
1495 css = obj.cssText.split( ';' );
\r
1496 for( i = css.length; i; ){
\r
1497 nv = css[ --i ].split( ':' ); // filter の場合, progid: がくる
\r
1498 n = Util.camelize( nv.shift() );
\r
1499 if( n === property && number === false ) return nv.join( '' );
\r
1500 if( n === property || n === fontSize ){
\r
1501 v = nv.join( '' );
\r
1502 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );
\r
1504 if( style[ property ] && style[ fontSize ] ) break;
\r
1508 if( number === false ) return obj[ property ];
\r
1510 style[ property ] = obj[ property ];
\r
1511 if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];
\r
1512 style[ fontSize ] = obj[ fontSize ];
\r
1513 if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];
\r
1516 wrapped = CSS.getWrappedStyle( elm, style );
\r
1518 return wrapped.get( property );
\r
1521 CSS.getStyleProperty = function( elm, property ){
\r
1522 var obj = elm.currentStyle,
\r
1525 fontSize = 'fontSize',
\r
1526 number = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ];
\r
1527 if( number === false ) return obj[ property ];
\r
1529 style[ property ] = obj[ property ];
\r
1530 if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];
\r
1531 style[ fontSize ] = obj[ fontSize ];
\r
1532 if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];
\r
1534 wrapped = CSS.getWrappedStyle( elm, style );
\r
1536 return wrapped.get( property );
\r
1539 return CSS.getStyleProperty( elm, property );
\r
1541 getComputedStyle: function( elm ){
\r
1542 /* if( window.getComputedStyle ){
\r
1543 CSS.getComputedStyle = function( elm ){
\r
1544 return cssToObject( window.getComputedStyle( elm, '' ) );
\r
1547 if( document.defaultView && document.defaultView.getComputedStyle ){
\r
1548 CSS.getComputedStyle = function( elm ){
\r
1549 var obj = document.defaultView.getComputedStyle( elm, '' );
\r
1550 return cssToObject( obj.cssText || obj );
\r
1553 CSS.getComputedStyle = function( elm ){
\r
1554 return cssToObject( elm.currentStyle );
\r
1557 return CSS.getComputedStyle( elm );
\r
1559 toCssText: function( _css ){
\r
1561 for( var p in _css ){
\r
1562 if( PARAMS.margin[ p ] === true && _css.margin ) continue;
\r
1563 if( PARAMS.padding[ p ] === true && _css.padding ) continue;
\r
1564 if( PARAMS.borderWidth[ p ] === true && _css.borderWidth ) continue;
\r
1565 if( PARAMS.borderColor[ p ] === true && _css.borderColor ) continue;
\r
1567 v && ret.push( [ Util.uncamelize( p ), v ].join( ':' ) );
\r
1569 return ret.join( ';' );
\r
1573 })( window, document );
\r
1578 * susie-t, http://d.hatena.ne.jp/susie-t/20070218/1171760841
\r
1581 positionedOffset : function( element ){
\r
1584 include = Position.isIncludeBorder,
\r
1585 minus = Position.isMinusBodyBorder,
\r
1586 body = document.body,
\r
1587 parent, border, p;
\r
1589 valueT += element.offsetTop || 0;
\r
1590 valueL += element.offsetLeft || 0;
\r
1591 parent = element.offsetParent;
\r
1593 border = Position.getBorder( parent );
\r
1594 valueT += border[0];
\r
1595 valueL += border[1];
\r
1596 if( parent === body && minus ){
\r
1597 valueT += border[0];
\r
1598 valueL += border[1];
\r
1601 if( parent === body ) break;
\r
1603 p = CSS.getStyleProperty( parent, 'position' );
\r
1604 // p = CSS.getComputedStyle( parent ).position;
\r
1605 if( p === 'relative' || p === 'absolute' ) break;
\r
1607 } while( element = parent );
\r
1608 return [ valueL, valueT ];
\r
1610 page : function( forElement ){
\r
1613 include = Position.isIncludeBorder,
\r
1614 minus = Position.isMinusBodyBorder,
\r
1615 body = document.body,
\r
1616 element = forElement,
\r
1619 valueT += element.offsetTop || 0;
\r
1620 valueL += element.offsetLeft || 0;
\r
1621 parent = element.offsetParent;
\r
1623 border = Position.getBorder( parent );
\r
1624 valueT += border[1];
\r
1625 valueL += border[0];
\r
1626 if( parent === body && minus ){
\r
1627 valueT += border[0];
\r
1628 valueL += border[1];
\r
1632 if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){
\r
1635 } while( element = parent );
\r
1637 element = forElement;
\r
1639 valueT -= element.scrollTop || 0;
\r
1640 valueL -= element.scrollLeft || 0;
\r
1641 } while( element = element.parentNode );
\r
1643 return [ valueL, valueT ];
\r
1645 getBorder : function( element ){
\r
1646 if( element === null ){
\r
1652 dhtmlStyle = CSS.getWrappedStyle( element );
\r
1653 compStyle = CSS.getComputedStyle( element );
\r
1654 if( compStyle.borderTopStyle !== 'none' ){
\r
1655 top = dhtmlStyle.get( 'borderTopWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-top-width' ) );
\r
1657 if( compStyle.borderLeftStyle !== 'none' ){
\r
1658 left = dhtmlStyle.get( 'borderLeftWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-left-width' ) );
\r
1663 if( CSS.getStyleProperty( element, 'borderTopStyle' ) !== 'none' ){
\r
1664 top = CSS.getStyleProperty( element, 'borderTopWidth' ).toPx();
\r
1666 if( CSS.getStyleProperty( element, 'borderLeftStyle' ) !== 'none' ){
\r
1667 left = CSS.getStyleProperty( element, 'borderLeftWidth' ).toPx();
\r
1670 return [ left || 0, top || 0 ];
\r
1672 isIncludeBorder : ( function() {
\r
1673 var parent = document.createElement( 'div' );
\r
1674 document.body.appendChild( parent );
\r
1675 parent.style.cssText = 'border:solid blue 10px; padding:0px; position:absolute; visibility:hidden;';
\r
1677 var child = document.createElement( 'div' );
\r
1678 parent.appendChild( child );
\r
1679 var ret = child.offsetTop === 0 ? false : true;
\r
1681 document.body.removeChild( parent );
\r
1685 isMinusBodyBorder : ( function(){
\r
1686 return document.body.offsetTop < CSS.getWrappedStyle( document.body ).get( 'marginTop' ).toPx();
\r
1687 // return document.body.offsetTop < CSS.getStyleProperty( document.body, 'marginTop' ).toPx();
\r
1689 cumulativeOffset : function( element ){
\r
1690 if( /Konqueror|Safari|KHTML/.test( navigator.userAgent ) ){
\r
1691 Position.cumulativeOffset = function( element ){
\r
1694 include = Position.isIncludeBorder,
\r
1695 minus = Position.isMinusBodyBorder,
\r
1696 body = document.body,
\r
1699 valueT += element.offsetTop || 0;
\r
1700 valueL += element.offsetLeft || 0;
\r
1701 parent = element.offsetParent;
\r
1703 border = Position.getBorder( parent );
\r
1704 valueT += border[1];
\r
1705 valueL += border[0];
\r
1706 if( parent === body && minus ){
\r
1707 valueT += border[0];
\r
1708 valueL += border[1];
\r
1711 if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){
\r
1715 } while ( element );
\r
1717 return [ valueL, valueT ];
\r
1720 Position.cumulativeOffset = function( element ){
\r
1723 include = Position.isIncludeBorder,
\r
1724 minus = Position.isMinusBodyBorder,
\r
1725 body = document.body,
\r
1728 valueT += element.offsetTop || 0;
\r
1729 valueL += element.offsetLeft || 0;
\r
1730 parent = element.offsetParent;
\r
1732 border = Position.getBorder( parent );
\r
1733 valueT += border[1];
\r
1734 valueL += border[0];
\r
1735 if( parent === body && minus ){
\r
1736 valueT += border[0];
\r
1737 valueL += border[1];
\r
1741 } while( element );
\r
1742 return [ valueL, valueT ];
\r
1745 return Position.cumulativeOffset( element );
\r