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
323 function clone( src ){
\r
325 if( Type.isArray(src) === true ){
\r
326 i = getIndex( objSrc, src );
\r
327 if( i !== -1 ) return objCopy[ i ];
\r
329 objSrc[ objSrc.length ] = src;
\r
330 objCopy[ objCopy.length ] = ret;
\r
332 if( Type.isObject(src) === true ){
\r
333 i = getIndex( objSrc, src );
\r
334 if( i !== -1 ) return objCopy[ i ];
\r
336 objSrc[ objSrc.length ] = src;
\r
337 objCopy[ objCopy.length ] = ret;
\r
339 if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){
\r
345 ret[ key ] = clone( src[ key ] );
\r
351 parse: function( v ){
\r
352 if( Type.isString( v ) === true ){
\r
353 if( v === 'true' ) return true;
\r
354 if( v === 'false' ) return false;
\r
355 if( v === 'null' ) return null;
\r
356 if( v === 'undefined' ) return undefined;
\r
357 if( v === 'NaN' ) return NaN;
\r
358 if( v === '' ) return v;
\r
359 var _v = v.split( ' ' ).join( '' ),
\r
361 if( '' + n === _v || '' + n === '0' + _v ) return n - 0;
\r
365 extend: function( target, extend ){
\r
366 for( var key in extend ){
\r
367 if( Type.isUndefined( target[ key ] ) === true ){
\r
368 target[ key ] = extend[ key ];
\r
370 if( typeof target[ key ] === typeof extend[ key ] ){
\r
371 target[ key ] = extend[ key ];
\r
373 alert( 'extend error' );
\r
378 copy: function( objOrArray ){
\r
379 objSrc.length = objCopy.length = 0;
\r
380 getIndex = Util.getIndex;
\r
381 return clone( objOrArray );
\r
383 cleanCommentNode: function ( _targetElm ){
\r
384 search( _targetElm || body );
\r
386 function search( _elm ){
\r
387 if( !_elm ) return;
\r
388 if( _elm.nodeType === 8 ){
\r
389 _elm.parentNode.removeChild( _elm );
\r
392 if( _elm.nodeType === 1 ){
\r
393 var _array = Util.copyArray( _elm.childNodes ); // liveNode > array
\r
394 while( _array.length > 0 ) search( _array.shift() );
\r
398 cleanElement: function( _targetElm ){
\r
399 var _array, _elm, j, _css,
\r
400 i = CLEAN_TARGET_ELEMENT.length;
\r
402 _array = Util.copyArray( _targetElm.getElementsByTagName( CLEAN_TARGET_ELEMENT[ --i ] ) );
\r
403 for( j = _array.length; j; ){
\r
404 _elm = _nodes[ --j ];
\r
405 _elm.parentNode && _elm.parentNode.removeChild( _elm );
\r
408 Util.cleanCommentNode( _targetElm );
\r
410 if( UA.isIE === false ) return;
\r
411 _nodes = _targetElm.all || _targetElm.getElementsByTagName( '*' );
\r
412 for( i = _nodes.length; i; ){
\r
413 _elm = _nodes[ --i ];
\r
414 _css = Util.getInlineStyle( _elm );
\r
415 _css.filter = null;
\r
416 _css.behavior = null;
\r
417 _elm.style.cssText = Util.toCssText( _css );
\r
420 camelize: function( cssProp ){
\r
421 var parts = cssProp.split( ' ' ).join( '' ).split( '-' ),
\r
424 if( l === 1 ) return parts[ 0 ];
\r
426 camelized = cssProp.charAt(0) === '-'
\r
427 ? parts[ 0 ].charAt( 0 ).toUpperCase() + parts[ 0 ].substring( 1 )
\r
430 for( i = 1; i < l; ++i ){
\r
431 camelized += parts[ i ].charAt( 0 ).toUpperCase() + parts[ i ].substring( 1 );
\r
435 uncamelize: function( str ){
\r
436 return str.split( ' ' ).join( '' ).replace( REG_LARGE, '-$&' ).toLowerCase();
\r
438 pxTo: function( _px, _unit ){
\r
439 return _px / ( UNIT_RATIO[ _unit ] || 1 );
\r
441 toPx: function( x, _unit ){
\r
442 return x * ( UNIT_RATIO[ _unit ] || 1 );
\r
444 absoluteFontSizeToPx: function( fontsize ){
\r
445 return FONT_SIZE_RATIO[ fontsize ] || 0;
\r
447 getElementSize: function( _elm ){
\r
448 if( Type.isHTMLElement( _elm ) === false ){
\r
454 var parentElm = _elm.parentNode,
\r
455 prevElm = _elm.previousSibling,
\r
456 nextElm = _elm.nextSibling,
\r
457 displayNone = _elm.style.display === 'none';
\r
458 if( displayNone === true ) _elm.style.display = 'block';
\r
460 body.appendChild( ELM_SIZE_GETTER );
\r
461 ELM_SIZE_GETTER.appendChild( _elm );
\r
464 width: _elm.offsetWidth,
\r
465 height: _elm.offsetHeight
\r
467 if( displayNone === true ) _elm.style.display = 'none';
\r
469 parentElm.insertBefore( _elm, nextElm );
\r
471 if( prevElm && prevElm.nextSibling ){
\r
472 parentElm.insertBefore( _elm, prevElm.nextSibling );
\r
474 parentElm && parentElm.appendChild( _elm );
\r
476 body.removeChild( ELM_SIZE_GETTER );
\r
480 getImageSize: function( img ){
\r
481 var parentElm = img.parentNode,
\r
482 prevElm = img.previousSibling,
\r
483 nextElm = img.nextSibling,
\r
484 displayNone = img.style.display === 'none';
\r
485 if( displayNone === true ) img.style.display = '';
\r
487 body.appendChild( ELM_SIZE_GETTER );
\r
488 ELM_SIZE_GETTER.appendChild( img );
\r
490 var size = getActualDimension( img );
\r
492 if( displayNone === true ) img.style.display = 'none';
\r
494 parentElm.insertBefore( img, nextElm );
\r
496 if( prevElm && prevElm.nextSibling ){
\r
497 parentElm.insertBefore( img, prevElm.nextSibling );
\r
499 parentElm && parentElm.appendChild( img );
\r
501 body.removeChild( ELM_SIZE_GETTER );
\r
504 * AUTHOR: uupaa.js@gmail.com
\r
506 function getActualDimension(image) {
\r
507 var run, mem, w, h, key = "actual";
\r
509 // for Firefox, Safari, Google Chrome
\r
510 if( "naturalWidth" in image ){
\r
512 width: image.naturalWidth,
\r
513 height: image.naturalHeight
\r
517 if( "src" in image ){ // HTMLImageElement
\r
518 if (image[key] && image[key].src === image.src) {
\r
521 if( document.uniqueID ){ // for IE
\r
522 run = image.runtimeStyle;
\r
523 mem = { w: run.width, h: run.height }; // keep runtimeStyle
\r
524 run.width = "auto"; // override
\r
525 run.height = "auto";
\r
528 run.width = mem.w; // restore
\r
529 run.height = mem.h;
\r
530 } else { // for Opera and Other
\r
531 mem = { w: image.width, h: image.height }; // keep current style
\r
532 image.removeAttribute("width");
\r
533 image.removeAttribute("height");
\r
536 image.width = mem.w; // restore
\r
537 image.height = mem.h;
\r
539 return image[key] = { width: w, height: h, src: image.src }; // bond
\r
541 // HTMLCanvasElement
\r
542 return { width: image.width, height: image.height };
\r
547 getAbsolutePath: function( path ){
\r
548 var elm = document.createElement('div');
\r
549 body.appendChild( elm );
\r
550 elm.innerHTML = '<a href=\"' + path + '\" />';
\r
551 body.removeChild( elm );
\r
552 return elm.firstChild.href;
\r
554 getAbsolutePosition: function( _elm ){
\r
555 // Find the destination's position
\r
556 // need html, body { fontfamily: "MS PGothic", "MS Gothic" } for ie6.
\r
557 var destx = _elm.offsetLeft,
\r
558 desty = _elm.offsetTop,
\r
560 body = document.body;
\r
561 while( thisNode.offsetParent && thisNode !== body ){
\r
562 thisNode = thisNode.offsetParent;
\r
563 destx += thisNode.offsetLeft;
\r
564 desty += thisNode.offsetTop;
\r
571 contain: function( parent, child ){
\r
572 function find( node ){
\r
573 var children = node.childNodes,
\r
575 l = children.length,
\r
578 elm = children[ i ];
\r
579 if( elm === child ) return true;
\r
580 if( elm.nodeType === 1 && find( elm ) === true ) return true;
\r
584 return find( parent );
\r
586 pullHtmlAsTemplete: function( html ){
\r
587 var elm = document.createElement( 'div' );
\r
588 body.appendChild( elm );
\r
589 elm.innerHTML = html;
\r
590 body.removeChild( elm );
\r
591 return elm.firstChild;
\r
593 getElementsByClassName: function( _elm, _className, opt_tagName ){
\r
594 var _all = !opt_tagName || opt_tagName === '*',
\r
595 _livenodes = _all === true ? ( _elm.all || _elm.getElementsByTagName( '*' )) : _elm.getElementsByTagName( opt_tagName ),
\r
596 _nodes = Util.copyArray( _livenodes),
\r
598 for( var j = 0; j < _nodes.length; ){
\r
599 _node = _nodes[ j ];
\r
600 if( _node.nodeType !== 1 || Util.hasClassName( _node, _className ) === false ){
\r
601 _nodes.splice( j, 1 );
\r
608 getChildIndex: function( _parent, _child ){
\r
609 var _children = _parent.getElementsByTagName( _child.tagName );
\r
610 for( var i = _children.length; i; ){
\r
611 if( _children[ --i ] === _child ) return i;
\r
615 hasClassName: function( _elm, _className ){
\r
616 var cnames = ( _elm.className || '' ).split( ' ' ),
\r
617 _cnames = _className.split( ' ' ),
\r
619 i = _cnames.length;
\r
621 cname = _cnames[ --i ];
\r
622 if( cname === '' ) continue;
\r
623 if( Util.getIndex( cnames, cname ) === -1 ) return false;
\r
627 addClass: function( _elm, _className ){
\r
628 if( Util.hasClassName( _elm, _className ) === false ){
\r
630 var _array = ( _elm.className || '' ).replace( /\s+/g, sp ).split( sp );
\r
631 _array.push( _className );
\r
632 _elm.className = _array.join( sp );
\r
635 removeClass: function( _elm, _className ){
\r
637 _array = _elm.className.replace( /\s+/g, sp ).split( sp ),
\r
638 i = Util.getIndex( _array, _className );
\r
640 _array.splice( i, 1 );
\r
641 _elm.className = _array.join( sp );
\r
644 toggleClass: function( _elm, _className, _switch ){
\r
645 if( Type.isBoolean( _switch ) === true ){
\r
646 _switch === true ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );
\r
648 Util.hasClassName( _elm, _className ) === false ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );
\r
651 removeAllChildren: function ( _elm ){
\r
652 while( _elm.firstChild ){
\r
653 remove( _elm.firstChild );
\r
655 function remove( _node ){
\r
656 while( _node.firstChild){
\r
657 remove( _node.firstChild);
\r
659 _node.parentNode && _node.parentNode.removeChild( _node);
\r
662 getIndex: function( array, element ){
\r
663 if( Array.prototype.indexof ){
\r
664 Util.getIndex = function( array, element ){
\r
665 return array.indexof( element );
\r
668 Util.getIndex = function( array, element ){
\r
669 var i = array.length;
\r
671 if( array[ --i ] === element ) return i;
\r
676 return Util.getIndex( array, element );
\r
678 copyArray: function( _array ){
\r
679 var l = _array.length,
\r
680 ret = new Array( l ),
\r
683 ret[ i ] = _array[ i ];
\r
690 createGlobalUniqueName: function(){
\r
691 var randomKey = null;
\r
693 randomKey = '_uniqueName'+(''+Math.random()).replace(/\./,'');
\r
694 if( typeof window[randomKey] === 'undefined'){
\r
700 createIframe: function( id, callback, hide ){
\r
702 var el = document.createElement( ua.isIE ? '<iframe name="' + id + '" frameborder="0" scrolling="no">' : 'iframe');
\r
705 el.onreadystatechange = function(){
\r
706 if( this.readyState === "complete" ){
\r
707 this.onreadystatechange = new Function();
\r
708 this.onreadystatechange = null;
\r
709 setTimeout( asynkCallback, 0 );
\r
713 // iron(chrome) の場合、append の前に onload を指定しないと onload が呼ばれない
\r
714 el.onload = function(){
\r
716 setTimeout( asynkCallback, 0 );
\r
720 document.body.appendChild( el );
\r
721 el.id = el.name = id;
\r
722 el.setAttribute( 'name', id );
\r
723 if( hide === true )el.style.cssText = 'width:1px;height:1px;visibility:hidden;position:absolute;top:1px;left:1px;';
\r
724 // http://d.hatena.ne.jp/onozaty/20070830/p1
\r
725 // [JavaScript]IE6ではJavaScriptで動的に作成したiframeに対してsubmitできない(IE7は未確認) ->解決
\r
726 el.contentWindow.name = id;
\r
730 function asynkCallback(){
\r
735 })( window, document );
\r
738 var CSS = ( function( window, documwnt, undefined ){
\r
742 UNITS = 'px,cm,mm,in,pt,pc,em,%'.split( ',' ),
\r
743 CLIP_SEPARATOR = UA.isIE === true && UA.ieVersion < 8 ? ' ' : ',';
\r
745 var SPECIAL = ( function(){
\r
747 if( UA.isIE === true && UA.ieVersion < 9 ){
\r
748 if( UA.ACTIVEX === true ){
\r
749 // _special.opacity = 'ActiveXOpacity';
\r
750 _special.setFilters = function( style ){
\r
751 var filters = ( style.filter || '' ).split( ') ' ),
\r
753 i = filters.length,
\r
754 filter, names, props, prop, j, l, key, v;
\r
756 filter = filters[ --i ].split( ' ' ).join( '' ).split( '(' );
\r
757 if( filter.length !== 2 ) continue;
\r
758 names = filter[ 0 ].split( '.' ); // progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=120,strength=9)
\r
759 props = filter[ 1 ].split( ',' ); //
\r
761 for( j = 0, l = props.length; j < l; ++j ){
\r
762 prop = props[ j ].split( '=' );
\r
763 key = prop[ 0 ].toLowerCase();
\r
765 filter[ key ] = v; //v.charAt( 0 ) === '#' ? v : parseInt( v );
\r
767 data[ names[ names.length - 1 ] ] = filter;
\r
770 style.filter = data;
\r
771 style.opacity = data.alpha && data.alpha.opacity ? data.alpha.opacity / 100 : 1;
\r
773 _special.hasLayout = function( elm ){
\r
774 return elm.currentStyle.hasLayout;
\r
777 _special.opacity = null;
\r
780 var style = document.documentElement.style;
\r
781 _special.opacity = style.opacity !== undefined ? 'opacity' :
\r
782 style.MozOpacity !== undefined ? 'MozOpacity' :
\r
783 style.KhtmlOpacity !== undefined ? 'KhtmlOpacity' :
\r
784 style[ '-khtml-opacity' ] !== undefined ? 'KhtmlOpacity' : null;
\r
786 // if( style.backgroundPositionX === undefined ){
\r
787 _special.setBackgroundPositionXY = function( style ){
\r
788 var bgp = ( style.backgroundPosition || '' ).split( ' ' );
\r
789 style.backgroundPositionX = bgp[ 0 ] || 0;
\r
790 style.backgroundPositionY = bgp[ 1 ] || 0;
\r
793 if( style.clipTop === undefined && style[ 'clip-top' ] === undefined ){
\r
794 _special.setClipTopRightBottomLeft = function( style ){
\r
795 var clip = style.clip || '';
\r
796 if( clip.indexOf( 'rect(' ) === -1 ){
\r
798 style.clipRight = 0;
\r
799 style.clipBottom = 0;
\r
800 style.clipLeft = 0;
\r
803 clip = clip.split( '(' )[ 1 ].split( ')' )[ 0 ].split( clip.indexOf( ',' ) !== -1 ? ',' : ' ' );
\r
804 ret.clipTop = clip[ 0 ];
\r
805 ret.clipRight = clip[ 1 ];
\r
806 ret.clipBottom = clip[ 2 ];
\r
807 ret.clipLeft = clip[ 3 ];
\r
815 var COLOR = ( function(){
\r
816 var ret = {}, v, name, i,
\r
822 'FFFF00', 'YELLOW',
\r
825 'FF00FF', 'MAGENTA',
\r
826 'FF00FF', 'FUCHSIA',
\r
829 '800080', 'PURPLE',
\r
830 '800000', 'MAROON',
\r
835 'C0C0C0', 'SILVER',
\r
836 '696969', 'DIMGRAY',
\r
837 '708090', 'SLATEGRAY',
\r
838 'A9A9A9', 'DARKGRAY',
\r
839 'DCDCDC', 'GAINSBORO',
\r
840 '191970', 'MIDNIGHTBLUE',
\r
841 '6A5ACD', 'SLATEBLUE',
\r
842 '0000CD', 'MEDIUMBLUE',
\r
843 '4169E1', 'ROYALBLUE',
\r
844 '1E90FF', 'DODGERBLUE',
\r
845 '87CEEB', 'SKYBLUE',
\r
846 '4682B4', 'STEELBLUE',
\r
847 'ADD8E6', 'LIGHTBLUE',
\r
848 'AFEEEE', 'PALETURQUOISE',
\r
849 '40E0D0', 'TURQUOISE',
\r
850 'E0FFFF', 'LIGHTCYAN',
\r
851 '7FFFD4', 'AQUAMARINE',
\r
852 '006400', 'DARKGREEN',
\r
853 '2E8B57', 'SEAGREEN',
\r
854 '90EE90', 'LIGHTGREEN',
\r
855 '7FFF00', 'CHARTREUSE',
\r
856 'ADFF2F', 'GREENYELLOW',
\r
857 '32CD32', 'LIMEGREEN',
\r
858 '9ACD32', 'YELLOWGREEN',
\r
859 '6B8E23', 'OLIVEDRAB',
\r
860 'BCB76B', 'DARKKHAKI',
\r
861 'EEE8AA', 'PALEGOLDENROD',
\r
862 'FFFFE0', 'LIGHTYELLOW',
\r
864 'DAA520', 'GOLDENROD',
\r
865 'B8860B', 'DARKGOLDENROD',
\r
866 'BC8F8F', 'ROSYBROWN',
\r
867 'CD5C5C', 'INDIANRED',
\r
868 '8B4513', 'SADDLEBROWN',
\r
869 'A0522D', 'SIENNA',
\r
871 'DEB887', 'BURLYWOOD',
\r
874 'F4A460', 'SANDYBROWN',
\r
876 'D2691E', 'CHOCOLATE',
\r
877 'B22222', 'FIREBRICK',
\r
879 'FA8072', 'SALMON',
\r
880 'FFA500', 'ORANGE',
\r
882 'FF6347', 'TOMATO',
\r
883 'FF69B4', 'HOTPINK',
\r
885 'FF1493', 'DEEPPINK',
\r
886 'DB7093', 'PALEVIOLETRED',
\r
887 'EE82EE', 'VIOLET',
\r
889 'DA70D6', 'ORCHILD',
\r
890 '9400D3', 'DARKVIOLET',
\r
891 '8A2BE2', 'BLUEVIOLET',
\r
892 '9370DB', 'MEDIUMPURPLE',
\r
893 'D8BFD8', 'THISTLE',
\r
894 'E6E6FA', 'LAVENDER',
\r
895 'FFE4E1', 'MISTYROSE',
\r
897 'FFFACD', 'LEMONCHIFFON'
\r
899 for( i = list.length; i; ){
\r
901 name = list[ --i ];
\r
902 ret[ name ] = parseInt( v, 16 );
\r
907 var PARAMS = ( function(){
\r
909 register( ret.percent = {},
\r
910 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom,paddingLeft,paddingRight,paddingTop,fontSize,textIndent'
\r
912 register( ret.offset = {},
\r
913 'height,width,bottom,left,right,top'
\r
915 register( ret.size = {},
\r
916 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth,letterSpacing'
\r
918 register( ret.color = {},
\r
919 'backgroundColor,borderBottomColor,borderLeftColor,borderRightColor,borderTopColor,color'
\r
921 register( ret.region = {},
\r
922 'margin,padding,borderWidth,borderColor'
\r
924 register( ret.special = {},
\r
925 'clip,backgroundPosition,opacity,lineHeight,zIndex'
\r
927 register( ret.unit = {}, 'px,cm,mm,in,pt,pc,em,%' );
\r
929 register( ret.margin = {}, 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom' );
\r
930 register( ret.padding = {}, 'paddingBottom,paddingLeft,paddingRight,paddingTop' );
\r
931 register( ret.borderWidth = {}, 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth' );
\r
932 register( ret.borderColor = {}, 'borderBottomColor,borderLeftColor,borderRightColor,borderTopColor' );
\r
934 function register( obj, params ){
\r
935 params = params.split( ',' );
\r
936 for( var i=params.length; i; ) obj[ params[ --i ] ] = true;
\r
944 var PropertyClass = function( name, value, unit, pxPerEm ){
\r
946 this.value = value;
\r
948 this.pxPerEm = pxPerEm; // XXpx = 1em;
\r
950 PropertyClass.prototype = {
\r
953 pxPerEm: 12, // 1em === ??px
\r
955 equal: function( prop ){
\r
956 if( this.unit === prop.unit ){
\r
957 return this.value === prop.value;
\r
959 return Math.abs( this.toPx() - prop.toPx() ) < 1;
\r
961 convert: function( prop ){
\r
962 var u = prop.unit, v;
\r
963 if( this.unit === u ) return;
\r
964 this.value = v = this.toPx();
\r
967 this.value = u === 'em' ? v / this.pxPerEm : Util.pxTo( v, u );
\r
970 setValue: function( v ){
\r
973 getValue: function(){
\r
976 getOffset: function( prop ){
\r
977 return prop.value - this.value;
\r
979 getUnit: function(){
\r
982 getValueText: function(){
\r
983 return this.value === 0 ? '0' : this.value + this.unit;
\r
988 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
993 var v = this.value, u = this.unit;
\r
994 if( u === px ) return v;
\r
995 if( u === 'em' ) return v * this.pxPerEm;
\r
996 if( u === '' && this.name === 'lineHeight' ) return v * this.pxPerEm;
\r
997 return Util.toPx( v, u );
\r
999 isValid: function( t ){
\r
1004 z = u !== '' ? true : v === 0;
\r
1005 if( PARAMS.percent[ n ] === true ) return z;
\r
1006 if( PARAMS.offset[ n ] === true ) return z;
\r
1007 if( PARAMS.size[ n ] === true ) return z && u !== '%';
\r
1008 if( PARAMS.special[ n ] === true ){
\r
1009 if( n === 'lineHeight' ) return true;
\r
1010 if( n === 'opacity' ) return 0 <= v && v <= 1 && u === '';
\r
1011 if( n === 'zIndex' ) return u === '';
\r
1018 * backgroundPosition, clip
\r
1020 var PropertyGroupClass = function( name ){
\r
1023 for( var i = 1, l = arguments.length; i<l; ++i ){
\r
1024 this.props.push( arguments[ i ] );
\r
1029 * margin, padding, borderWidth, borderColor
\r
1031 var FrexiblePropertyClass = function( name ){
\r
1034 for( var i = 1, l = arguments.length; i<l; ++i ){
\r
1035 this.props.push( arguments[ i ] );
\r
1037 // top, bottom, left, right, topbottom, leftright, all
\r
1039 FrexiblePropertyClass.prototype = PropertyGroupClass.prototype = {
\r
1041 equal : function( prop ){
\r
1042 var ps = this.props, i = ps.length;
\r
1045 if( ps[ i ].equal( prop[ i ] ) === false ) return false;
\r
1049 convert : function( prop ){
\r
1050 var ps = this.props, i = ps.length;
\r
1053 ps[ i ].convert( prop[ i ] );
\r
1056 setValue : function( ary ){
\r
1057 var ps = this.props, i = 0, l = ps.length;
\r
1058 for( ; i<l; ++i ){
\r
1059 ps[ i ].setValue( ary[ i ] );
\r
1062 getValue : function(){
\r
1063 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1064 for( ; i<l; ++i ){
\r
1065 ret.push( ps[ i ].getValue() );
\r
1069 getOffset : function( prop ){
\r
1075 for( ; i<l; ++i ){
\r
1076 ret.push( ps[ i ].getOffset( _ps[ i ] ) );
\r
1080 getUnit : function(){
\r
1081 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1082 for( ; i<l; ++i ){
\r
1083 ret.push( ps[ i ].getUnit() );
\r
1087 getValueText : function(){
\r
1088 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1089 for( ; i<l; ++i ){
\r
1090 ret.push( ps[ i ].getValueText() );
\r
1092 if( this.name === 'clip' ){
\r
1093 return 'rect(' + ret.join( CLIP_SEPARATOR ) + ')';
\r
1095 return ret.join( ' ' );
\r
1097 clear : function(){
\r
1098 var ps = this.props, i = ps.length;
\r
1100 ps[ --i ].clear();
\r
1103 delete this.props;
\r
1105 isValid : function( t ){
\r
1107 var ps = t.props, i = ps.length;
\r
1110 if( ps[ i ].isValid() === false ) return false;
\r
1116 var ColorPropertyClass = function( name, r, g, b, pct ){
\r
1123 ColorPropertyClass.prototype = {
\r
1125 equal : function( prop ){
\r
1126 if( this.pct === prop.pct ){
\r
1127 return this.r === prop.r && this.g === prop.g && this.b === prop.b;
\r
1129 var rgb = this._toPct(),
\r
1130 _rgb = prop._toPct(),
\r
1134 if( Math.abs( rgb[ i ] - _rgb[ i ] ) > 1 ) return false;
\r
1138 convert : function( prop ){
\r
1139 var u = prop.pct, x;
\r
1140 if( this.pct === u ) return;
\r
1141 x = u === true ? 100 / 255 : 2.55;
\r
1147 setValue : function( rgb ){
\r
1148 this.r = rgb[ 0 ];
\r
1149 this.g = rgb[ 1 ];
\r
1150 this.b = rgb[ 2 ];
\r
1152 getValue : function(){
\r
1153 return [ this.r, this.g, this.b ];
\r
1155 getOffset : function( prop ){
\r
1156 return [ prop.r - this.r, prop.g - this.g, prop.b - this.b ];
\r
1158 getUnit : function(){
\r
1159 return this.pct === true ? '%' : '';
\r
1161 getValueText : function(){
\r
1162 if( this.pct === true ){
\r
1163 return [ 'rgb(', this.r, '%,', this.g, '%,', this.b, '%)' ].join( '' );
\r
1165 var round = Math.round;
\r
1166 //return [ 'rgb(', round( this.r ), ',', round( this.g ), ',', round( this.b ), ')' ].join( '' );
\r
1168 var rgb = '00000' + ( ( round( this.r ) << 16 ) + ( round( this.g ) << 8 ) + round( this.b ) ).toString( 16 );
\r
1169 return '#' + rgb.substr( rgb.length - 6 );
\r
1171 clear : function(){
\r
1174 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
1178 _toPct : function(){
\r
1179 if( this.pct === true ) return [ this.r, this.g, this.b ];
\r
1180 return [ this.r / 2.55, this.g / 2.55, this.b / 2.55 ];
\r
1182 isValid : function( t ){
\r
1183 var isFinite = window.isFinite;
\r
1184 if( !isFinite( this.r ) || !isFinite( this.g ) || !isFinite( this.b ) ) return false;
\r
1185 if( 0 > this.r || 0 > this.g || 0 > this.b ) return false;
\r
1186 if( this.pct === true ){
\r
1187 return this.r <= 100 && this.g <= 100 && this.b <= 100;
\r
1189 return this.r <= 255 && this.g <= 255 && this.b <= 255;
\r
1193 var isString = Type.isString,
\r
1194 isNumber = Type.isNumber;
\r
1195 var REG_UINIT = /.*\d(\w{1,2})?/,
\r
1198 REG_XXXXXX = /^#[\da-fA-F]{6}?/,
\r
1199 REG_XXX = /^#[\da-fA-F]{3}?/;
\r
1201 var WrappedStyleClass = function( elm, style ){
\r
1203 this.style = style;
\r
1204 this.pxPerEm = this.get( 'fontSize' ).toPx();
\r
1207 WrappedStyleClass.prototype = {
\r
1208 get: function( p ){
\r
1209 if( PARAMS.special[ p ] === true || PARAMS.region[ p ] === true ){
\r
1210 if( p === 'clip' ) return this.getClip();
\r
1211 if( p === 'margin' ) return this.getMarginPaddingBorder( p );
\r
1212 if( p === 'padding' ) return this.getMarginPaddingBorder( p );
\r
1213 if( p === 'borderWidth' ) return this.getMarginPaddingBorder( 'border', 'Width' );
\r
1214 if( p === 'borderColor' ) return this.getBorderColor( 'borderColor' );
\r
1215 if( p === 'backgroundPosition' ) return this.getBackgroundPosition( p );
\r
1216 // opacity, zindex, lineHeight
\r
1217 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x ), this.pxPerEm );
\r
1219 var x = this.style[ p ], e, v, u;
\r
1220 if( PARAMS.offset[ p ] === true ){
\r
1221 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1224 if( p === 'width' ) v = e.offsetWidth;
\r
1225 if( p === 'height' ) v = e.offsetHeight;
\r
1226 if( p === 'top' ) v = e.offsetTop;
\r
1227 if( p === 'bottom' ) v = e.offsetBottom;
\r
1228 if( p === 'left' ) v = e.offsetLeft;
\r
1229 if( p === 'right' ) v = e.offsetRight;
\r
1230 u = this.getUnit( x, p );
\r
1231 // alert( p + this.pxTo( v, u ) + u )
\r
1232 return new PropertyClass( p, this.pxTo( v, u ), u, this.pxPerEm ); */
\r
1234 if( p === 'fontSize' ){ // xx-small 等
\r
1235 v = Util.absoluteFontSizeToPx( x );
\r
1237 return new PropertyClass( p, v, px, this.pxPerEm );
\r
1240 if( PARAMS.percent[ p ] === true ){
\r
1241 // alert( p + ' , ' + x + ' , ' + this.getUnit( x, p ) )
\r
1242 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1244 if( PARAMS.size[ p ] === true ){
\r
1245 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1247 if( PARAMS.color[ p ] === true ){
\r
1248 return this.getColor( x, p );
\r
1251 pxTo: function( px, unit ){
\r
1252 if( unit === 'em' ) return px / this.pxPerEm;
\r
1253 return Util.pxTo( px, unit );
\r
1255 getValue: function( x, p ){
\r
1256 if( isString( x ) === true ){
\r
1257 return parseInt( x );
\r
1259 if( isNumber( x ) === true ){
\r
1264 getUnit: function( x, p ){
\r
1266 if( isString( x ) === true ){
\r
1267 u = x.replace( REG_UINIT, $1 );
\r
1268 if( p === 'lineHeight' ) return u;
\r
1269 if( PARAMS.unit[ u ] !== true ) return px;
\r
1274 getColor: function( x, p ){
\r
1275 var rgb = COLOR[ x.toUpperCase() ],
\r
1280 if( isNumber( rgb ) === true ){
\r
1281 r = ( rgb & 0xff0000 ) >> 16;
\r
1282 g = ( rgb & 0xff00 ) >> 8;
\r
1283 b = ( rgb & 0xff );
\r
1285 if( x.match( REG_XXXXXX ) ){
\r
1286 r = parseInt( x.charAt( 1 ) + x.charAt( 2 ), 16 );
\r
1287 g = parseInt( x.charAt( 3 ) + x.charAt( 4 ), 16 );
\r
1288 b = parseInt( x.charAt( 5 ) + x.charAt( 6 ), 16 );
\r
1289 //alert( x + ' g: ' + g )
\r
1291 if( x.match( REG_XXX ) ){
\r
1292 r = parseInt( x.charAt( 1 ) + x.charAt( 1 ), 16 );
\r
1293 g = parseInt( x.charAt( 2 ) + x.charAt( 2 ), 16 );
\r
1294 b = parseInt( x.charAt( 3 ) + x.charAt( 3 ), 16 );
\r
1296 if( x.indexOf( 'rgb(' ) === 0 ){
\r
1297 rgb = x.substr( 4 ).split( ',' );
\r
1298 r = parseFloat( rgb[ 0 ] );
\r
1299 g = parseFloat( rgb[ 1 ] );
\r
1300 b = parseFloat( rgb[ 2 ] );
\r
1301 if( x.indexOf( '%' ) !== -1 ){
\r
1309 return new ColorPropertyClass( p, r, g, b, pct );
\r
1311 getClip: function( name ){
\r
1312 // rect(...) クリップします。<top>, <bottom> は上端からの、 <right>, <left> は左端からのオフセットで指定します。Internet Explorer 4~7 では、カンマの代わりにスペースで区切る必要があります。
\r
1313 // position:absolute または position:fixed を適用した要素に対してのみ有効です。
\r
1314 var top = this.get( name + 'Top' ),
\r
1315 right = this.get( name + 'Right' ),
\r
1316 bottom = this.get( name + 'Bottom' ),
\r
1317 left = this.get( name + 'Left' ),
\r
1318 ret = new PropertyGroupClass( name, top, right, bottom, left),
\r
1320 if( ret.isValid() === true ) return ret;
\r
1322 all = this.style[ name ].split( '(' )[ 1 ].split( ')' )[ 0 ].split( CLIP_SEPARATOR );
\r
1323 return new PropertyGroupClass( name,
\r
1324 new PropertyClass( name + 'Top', all[ 0 ], px, this.pxPerEm ),
\r
1325 new PropertyClass( name + 'Right', all[ 1 ], px, this.pxPerEm ),
\r
1326 new PropertyClass( name + 'Bottom', all[ 2 ], px, this.pxPerEm ),
\r
1327 new PropertyClass( name + 'Left', all[ 3 ], px, this.pxPerEm )
\r
1330 getBackgroundPosition: function( name ){
\r
1331 var x = this.get( name + 'X' ),
\r
1332 y = this.get( name + 'Y' ),
\r
1333 ret = new PropertyGroupClass( name, x, y ),
\r
1335 if( ret.isValid() === true ) return ret;
\r
1337 xy = this.style[ name ].split( ' ' );
\r
1338 return new PropertyGroupClass( name,
\r
1339 new PropertyClass( name + 'X', this.getValue( xy[ 0 ] ), this.getUnit( xy[ 0 ] ), this.pxPerEm ),
\r
1340 new PropertyClass( name + 'Y', this.getValue( xy[ 1 ] ), this.getUnit( xy[ 1 ] ), this.pxPerEm )
\r
1343 getMarginPaddingBorder: function( name, widthOrColor ){
\r
1344 widthOrColor = widthOrColor || '';
\r
1345 var _class = PropertyClass,
\r
1346 top = this.get( name + 'Top' + widthOrColor ),
\r
1347 right = this.get( name + 'Right' + widthOrColor ),
\r
1348 bottom = this.get( name + 'Bottom' + widthOrColor ),
\r
1349 left = this.get( name + 'Left' + widthOrColor ),
\r
1350 ret = new FrexiblePropertyClass( name, top, right, bottom, left ),
\r
1351 all, x, v, u, i, l;
\r
1353 if( ret.isValid() === true ) return ret;
\r
1355 all = this.style[ name + widthOrColor ].split( ' ' );
\r
1357 for( i = 0, l=all.length; i<l; ++i ){
\r
1359 v = this.getValue( x );
\r
1360 u = this.getUnit( x );
\r
1362 if( i === 0 ) top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1363 if( i === 1 ) right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1364 if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1365 if( i === 3 ) left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1368 if( i === 0 ) top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1370 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1371 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1373 if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor , v, u, this.pxPerEm );
\r
1377 top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1378 bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1381 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1382 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1386 top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1387 bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1388 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1389 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1392 return new FrexiblePropertyClass( name, top, right, bottom, left );
\r
1394 getBorderColor: function( name ){
\r
1395 var getColor = this.getColor,
\r
1396 top = this.get( name + 'TopColor' ),
\r
1397 right = this.get( name + 'RightColor' ),
\r
1398 bottom = this.get( name + 'BottomColor' ),
\r
1399 left = this.get( name + 'LeftColor' ),
\r
1400 ret = new FrexiblePropertyClass( name, top, right, bottom, left ),
\r
1403 if( ret.isValid() === true ) return ret;
\r
1405 all = this.style[ name ].split( ' ' );
\r
1407 for( i = 0, l = all.length; i<l; ++i ){
\r
1410 if( i === 0 ) top = getColor( x, name + 'Top' );
\r
1411 if( i === 1 ) right = getColor( x, name + 'Right' );
\r
1412 if( i === 2 ) bottom = getColor( x, name + 'Bottom' );
\r
1413 if( i === 3 ) left = getColor( x, name + 'Left' );
\r
1416 if( i === 0 ) top = getColor( x, name + 'Top' );
\r
1418 right = getColor( x, name + 'Right' );
\r
1419 left = getColor( x, name + 'Left' );
\r
1421 if( i === 2 ) bottom = getColor( x, name + 'Bottom' );
\r
1425 top = getColor( x, name + 'Top' );
\r
1426 bottom = getColor( x, name + 'Bottom' );
\r
1429 right = getColor( x, name + 'Right' );
\r
1430 left = getColor( x, name + 'Left' );
\r
1434 top = getColor( x, name + 'Top' );
\r
1435 bottom = getColor( x, name + 'Bottom' );
\r
1436 right = getColor( x, name + 'Right' );
\r
1437 left = getColor( x, name + 'Left' );
\r
1440 return new FrexiblePropertyClass( name, top, right, bottom, left );
\r
1442 clear: function(){
\r
1445 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
1450 function camelizeHash( obj ){
\r
1453 _p = Util.camelize( p );
\r
1454 if( _p === p ) continue;
\r
1455 obj[ _p ] = obj[ _p ] || obj[ p ];
\r
1460 function cssToObject( css ){
\r
1461 var ret = {}, i, nv, n, v,
\r
1462 parse = Util.parse,
\r
1463 isNumber = Type.isNumber,
\r
1464 camelize = Util.camelize;
\r
1465 if( Type.isString( css ) === true ){
\r
1466 css = css.split( ';' );
\r
1467 for( i = css.length; i; ){
\r
1468 nv = css[ --i ].split( ':' ); // filter の場合, progid: がくる
\r
1470 if( isNumber( parse( n ) ) === true ) continue;
\r
1471 v = nv.join( '' );
\r
1472 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );
\r
1473 ret[ camelize( n ) ] = parse( v );
\r
1477 if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );
\r
1481 if( SPECIAL.setFilters ){
\r
1482 SPECIAL.setFilters( ret );
\r
1484 ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;
\r
1487 SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );
\r
1488 SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );
\r
1493 getWrappedStyle: function( elm, opt_css ){
\r
1494 return new WrappedStyleClass( elm, opt_css ? camelizeHash( opt_css ) : CSS.getComputedStyle( elm ) );
\r
1496 getInlineStyle: function( _elm ){
\r
1497 return cssToObject( _elm.style.cssText );
\r
1499 getStyleProperty : function( elm, property ){
\r
1500 if( document.defaultView && document.defaultView.getComputedStyle ){
\r
1501 CSS.getStyleProperty = function( elm, property ){
\r
1502 var obj = document.defaultView.getComputedStyle( elm, '' ),
\r
1505 fontSize = 'fontSize',
\r
1506 number = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ],
\r
1509 if( obj.cssText ){
\r
1510 css = obj.cssText.split( ';' );
\r
1511 for( i = css.length; i; ){
\r
1512 nv = css[ --i ].split( ':' ); // filter の場合, progid: がくる
\r
1513 n = Util.camelize( nv.shift() );
\r
1514 if( n === property && number === false ) return nv.join( '' );
\r
1515 if( n === property || n === fontSize ){
\r
1516 v = nv.join( '' );
\r
1517 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );
\r
1519 if( style[ property ] && style[ fontSize ] ) break;
\r
1523 if( number === false ) return obj[ property ];
\r
1525 style[ property ] = obj[ property ];
\r
1526 if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];
\r
1527 style[ fontSize ] = obj[ fontSize ];
\r
1528 if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];
\r
1531 wrapped = CSS.getWrappedStyle( elm, style );
\r
1533 return wrapped.get( property );
\r
1536 CSS.getStyleProperty = function( elm, property ){
\r
1537 var obj = elm.currentStyle,
\r
1540 fontSize = 'fontSize',
\r
1541 number = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ];
\r
1542 if( number === false ) return obj[ property ];
\r
1544 style[ property ] = obj[ property ];
\r
1545 if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];
\r
1546 style[ fontSize ] = obj[ fontSize ];
\r
1547 if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];
\r
1549 wrapped = CSS.getWrappedStyle( elm, style );
\r
1551 return wrapped.get( property );
\r
1554 return CSS.getStyleProperty( elm, property );
\r
1556 getComputedStyle: function( elm ){
\r
1557 /* if( window.getComputedStyle ){
\r
1558 CSS.getComputedStyle = function( elm ){
\r
1559 return cssToObject( window.getComputedStyle( elm, '' ) );
\r
1562 if( document.defaultView && document.defaultView.getComputedStyle ){
\r
1563 CSS.getComputedStyle = function( elm ){
\r
1564 var obj = document.defaultView.getComputedStyle( elm, '' );
\r
1565 return cssToObject( obj.cssText || obj );
\r
1568 CSS.getComputedStyle = function( elm ){
\r
1569 return cssToObject( elm.currentStyle );
\r
1572 return CSS.getComputedStyle( elm );
\r
1574 toCssText: function( _css ){
\r
1576 for( var p in _css ){
\r
1577 if( PARAMS.margin[ p ] === true && _css.margin ) continue;
\r
1578 if( PARAMS.padding[ p ] === true && _css.padding ) continue;
\r
1579 if( PARAMS.borderWidth[ p ] === true && _css.borderWidth ) continue;
\r
1580 if( PARAMS.borderColor[ p ] === true && _css.borderColor ) continue;
\r
1582 v && ret.push( [ Util.uncamelize( p ), v ].join( ':' ) );
\r
1584 return ret.join( ';' );
\r
1588 })( window, document );
\r
1593 * susie-t, http://d.hatena.ne.jp/susie-t/20070218/1171760841
\r
1596 positionedOffset : function( element ){
\r
1599 include = Position.isIncludeBorder,
\r
1600 minus = Position.isMinusBodyBorder,
\r
1601 body = document.body,
\r
1602 parent, border, p;
\r
1604 valueT += element.offsetTop || 0;
\r
1605 valueL += element.offsetLeft || 0;
\r
1606 parent = element.offsetParent;
\r
1608 border = Position.getBorder( parent );
\r
1609 valueT += border[0];
\r
1610 valueL += border[1];
\r
1611 if( parent === body && minus ){
\r
1612 valueT += border[0];
\r
1613 valueL += border[1];
\r
1616 if( parent === body ) break;
\r
1618 p = CSS.getStyleProperty( parent, 'position' );
\r
1619 // p = CSS.getComputedStyle( parent ).position;
\r
1620 if( p === 'relative' || p === 'absolute' ) break;
\r
1622 } while( element = parent );
\r
1623 return [ valueL, valueT ];
\r
1625 page : function( forElement ){
\r
1628 include = Position.isIncludeBorder,
\r
1629 minus = Position.isMinusBodyBorder,
\r
1630 body = document.body,
\r
1631 element = forElement,
\r
1634 valueT += element.offsetTop || 0;
\r
1635 valueL += element.offsetLeft || 0;
\r
1636 parent = element.offsetParent;
\r
1638 border = Position.getBorder( parent );
\r
1639 valueT += border[1];
\r
1640 valueL += border[0];
\r
1641 if( parent === body && minus ){
\r
1642 valueT += border[0];
\r
1643 valueL += border[1];
\r
1647 if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){
\r
1650 } while( element = parent );
\r
1652 element = forElement;
\r
1654 valueT -= element.scrollTop || 0;
\r
1655 valueL -= element.scrollLeft || 0;
\r
1656 } while( element = element.parentNode );
\r
1658 return [ valueL, valueT ];
\r
1660 getBorder : function( element ){
\r
1661 if( element === null ){
\r
1667 dhtmlStyle = CSS.getWrappedStyle( element );
\r
1668 compStyle = CSS.getComputedStyle( element );
\r
1669 if( compStyle.borderTopStyle !== 'none' ){
\r
1670 top = dhtmlStyle.get( 'borderTopWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-top-width' ) );
\r
1672 if( compStyle.borderLeftStyle !== 'none' ){
\r
1673 left = dhtmlStyle.get( 'borderLeftWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-left-width' ) );
\r
1678 if( CSS.getStyleProperty( element, 'borderTopStyle' ) !== 'none' ){
\r
1679 top = CSS.getStyleProperty( element, 'borderTopWidth' ).toPx();
\r
1681 if( CSS.getStyleProperty( element, 'borderLeftStyle' ) !== 'none' ){
\r
1682 left = CSS.getStyleProperty( element, 'borderLeftWidth' ).toPx();
\r
1685 return [ left || 0, top || 0 ];
\r
1687 isIncludeBorder : ( function() {
\r
1688 var parent = document.createElement( 'div' );
\r
1689 document.body.appendChild( parent );
\r
1690 parent.style.cssText = 'border:solid blue 10px; padding:0px; position:absolute; visibility:hidden;';
\r
1692 var child = document.createElement( 'div' );
\r
1693 parent.appendChild( child );
\r
1694 var ret = child.offsetTop === 0 ? false : true;
\r
1696 document.body.removeChild( parent );
\r
1700 isMinusBodyBorder : ( function(){
\r
1701 return document.body.offsetTop < CSS.getWrappedStyle( document.body ).get( 'marginTop' ).toPx();
\r
1702 // return document.body.offsetTop < CSS.getStyleProperty( document.body, 'marginTop' ).toPx();
\r
1704 cumulativeOffset : function( element ){
\r
1705 if( /Konqueror|Safari|KHTML/.test( navigator.userAgent ) ){
\r
1706 Position.cumulativeOffset = function( element ){
\r
1709 include = Position.isIncludeBorder,
\r
1710 minus = Position.isMinusBodyBorder,
\r
1711 body = document.body,
\r
1714 valueT += element.offsetTop || 0;
\r
1715 valueL += element.offsetLeft || 0;
\r
1716 parent = element.offsetParent;
\r
1718 border = Position.getBorder( parent );
\r
1719 valueT += border[1];
\r
1720 valueL += border[0];
\r
1721 if( parent === body && minus ){
\r
1722 valueT += border[0];
\r
1723 valueL += border[1];
\r
1726 if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){
\r
1730 } while ( element );
\r
1732 return [ valueL, valueT ];
\r
1735 Position.cumulativeOffset = function( element ){
\r
1738 include = Position.isIncludeBorder,
\r
1739 minus = Position.isMinusBodyBorder,
\r
1740 body = document.body,
\r
1743 valueT += element.offsetTop || 0;
\r
1744 valueL += element.offsetLeft || 0;
\r
1745 parent = element.offsetParent;
\r
1747 border = Position.getBorder( parent );
\r
1748 valueT += border[1];
\r
1749 valueL += border[0];
\r
1750 if( parent === body && minus ){
\r
1751 valueT += border[0];
\r
1752 valueL += border[1];
\r
1756 } while( element );
\r
1757 return [ valueL, valueT ];
\r
1760 return Position.cumulativeOffset( element );
\r