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
597 for( var j = 0; j < _nodes.length; ){
\r
598 _node = _nodes[ j ];
\r
599 if( _node.nodeType !== 1 || Util.hasClassName( _node, _className ) === false ){
\r
600 _nodes.splice( j, 1 );
\r
607 getChildIndex: function( _parent, _child ){
\r
608 var _children = _parent.getElementsByTagName( _child.tagName );
\r
609 for( var i = _children.length; i; ){
\r
610 if( _children[ --i ] === _child ) return i;
\r
614 hasClassName: function( _elm, _className ){
\r
615 var cnames = ( _elm.className || '' ).split( ' ' ),
\r
616 _cnames = _className.split( ' ' ),
\r
618 i = _cnames.length;
\r
620 cname = _cnames[ --i ];
\r
621 if( cname === '' ) continue;
\r
622 if( Util.getIndex( cnames, cname ) === -1 ) return false;
\r
626 addClass: function( _elm, _className ){
\r
627 if( Util.hasClassName( _elm, _className ) === false ){
\r
629 var _array = ( _elm.className || '' ).replace( /\s+/g, sp ).split( sp );
\r
630 _array.push( _className );
\r
631 _elm.className = _array.join( sp );
\r
634 removeClass: function( _elm, _className ){
\r
636 _array = _elm.className.replace( /\s+/g, sp ).split( sp ),
\r
637 i = Util.getIndex( _array, _className );
\r
639 _array.splice( i, 1 );
\r
640 _elm.className = _array.join( sp );
\r
643 toggleClass: function( _elm, _className, _switch ){
\r
644 if( Type.isBoolean( _switch ) === true ){
\r
645 _switch === true ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );
\r
647 Util.hasClassName( _elm, _className ) === false ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );
\r
650 removeAllChildren: function ( _elm ){
\r
651 while( _elm.firstChild ){
\r
652 remove( _elm.firstChild );
\r
654 function remove( _node ){
\r
655 while( _node.firstChild){
\r
656 remove( _node.firstChild);
\r
658 _node.parentNode && _node.parentNode.removeChild( _node);
\r
661 getIndex: function( array, element ){
\r
662 if( Array.prototype.indexof ){
\r
663 Util.getIndex = function( array, element ){
\r
664 return array.indexof( element );
\r
667 Util.getIndex = function( array, element ){
\r
668 var i = array.length;
\r
670 if( array[ --i ] === element ) return i;
\r
675 return Util.getIndex( array, element );
\r
677 copyArray: function( _array ){
\r
678 var l = _array.length,
\r
679 ret = new Array( l ),
\r
682 ret[ i ] = _array[ i ];
\r
689 createGlobalUniqueName: function(){
\r
690 var randomKey = null;
\r
692 randomKey = '_uniqueName'+(''+Math.random()).replace(/\./,'');
\r
693 if( typeof window[randomKey] === 'undefined'){
\r
699 createIframe: function( id, callback, hide ){
\r
701 var el = document.createElement( ua.isIE ? '<iframe name="' + id + '" frameborder="0" scrolling="no">' : 'iframe');
\r
704 el.onreadystatechange = function(){
\r
705 if( this.readyState === "complete" ){
\r
706 this.onreadystatechange = new Function();
\r
707 this.onreadystatechange = null;
\r
708 setTimeout( asynkCallback, 0 );
\r
712 // iron(chrome) の場合、append の前に onload を指定しないと onload が呼ばれない
\r
713 el.onload = function(){
\r
715 setTimeout( asynkCallback, 0 );
\r
719 document.body.appendChild( el );
\r
720 el.id = el.name = id;
\r
721 el.setAttribute( 'name', id );
\r
722 if( hide === true )el.style.cssText = 'width:1px;height:1px;visibility:hidden;position:absolute;top:1px;left:1px;';
\r
723 // http://d.hatena.ne.jp/onozaty/20070830/p1
\r
724 // [JavaScript]IE6ではJavaScriptで動的に作成したiframeに対してsubmitできない(IE7は未確認) ->解決
\r
725 el.contentWindow.name = id;
\r
729 function asynkCallback(){
\r
734 })( window, document );
\r
737 var CSS = ( function( window, documwnt, undefined ){
\r
741 UNITS = 'px,cm,mm,in,pt,pc,em,%'.split( ',' ),
\r
742 CLIP_SEPARATOR = UA.isIE === true && UA.ieVersion < 8 ? ' ' : ',';
\r
744 var SPECIAL = ( function(){
\r
746 if( UA.isIE === true && UA.ieVersion < 9 ){
\r
747 if( UA.ACTIVEX === true ){
\r
748 // _special.opacity = 'ActiveXOpacity';
\r
749 _special.setFilters = function( style ){
\r
750 var filters = ( style.filter || '' ).split( ') ' ),
\r
752 i = filters.length,
\r
753 filter, names, props, prop, j, l, key, v;
\r
755 filter = filters[ --i ].split( ' ' ).join( '' ).split( '(' );
\r
756 if( filter.length !== 2 ) continue;
\r
757 names = filter[ 0 ].split( '.' ); // progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=120,strength=9)
\r
758 props = filter[ 1 ].split( ',' ); //
\r
760 for( j = 0, l = props.length; j < l; ++j ){
\r
761 prop = props[ j ].split( '=' );
\r
762 key = prop[ 0 ].toLowerCase();
\r
764 filter[ key ] = v; //v.charAt( 0 ) === '#' ? v : parseInt( v );
\r
766 data[ names[ names.length - 1 ] ] = filter;
\r
769 style.filter = data;
\r
770 style.opacity = data.alpha && data.alpha.opacity ? data.alpha.opacity / 100 : 1;
\r
772 _special.hasLayout = function( elm ){
\r
773 return elm.currentStyle.hasLayout;
\r
776 _special.opacity = null;
\r
779 var style = document.documentElement.style;
\r
780 _special.opacity = style.opacity !== undefined ? 'opacity' :
\r
781 style.MozOpacity !== undefined ? 'MozOpacity' :
\r
782 style.KhtmlOpacity !== undefined ? 'KhtmlOpacity' :
\r
783 style[ '-khtml-opacity' ] !== undefined ? 'KhtmlOpacity' : null;
\r
785 // if( style.backgroundPositionX === undefined ){
\r
786 _special.setBackgroundPositionXY = function( style ){
\r
787 var bgp = ( style.backgroundPosition || '' ).split( ' ' );
\r
788 style.backgroundPositionX = bgp[ 0 ] || 0;
\r
789 style.backgroundPositionY = bgp[ 1 ] || 0;
\r
792 if( style.clipTop === undefined && style[ 'clip-top' ] === undefined ){
\r
793 _special.setClipTopRightBottomLeft = function( style ){
\r
794 var clip = style.clip || '';
\r
795 if( clip.indexOf( 'rect(' ) === -1 ){
\r
797 style.clipRight = 0;
\r
798 style.clipBottom = 0;
\r
799 style.clipLeft = 0;
\r
802 clip = clip.split( '(' )[ 1 ].split( ')' )[ 0 ].split( clip.indexOf( ',' ) !== -1 ? ',' : ' ' );
\r
803 ret.clipTop = clip[ 0 ];
\r
804 ret.clipRight = clip[ 1 ];
\r
805 ret.clipBottom = clip[ 2 ];
\r
806 ret.clipLeft = clip[ 3 ];
\r
814 var COLOR = ( function(){
\r
815 var ret = {}, v, name,
\r
821 'FFFF00', 'YELLOW',
\r
824 'FF00FF', 'MAGENTA',
\r
825 'FF00FF', 'FUCHSIA',
\r
828 '800080', 'PURPLE',
\r
829 '800000', 'MAROON',
\r
834 'C0C0C0', 'SILVER',
\r
835 '696969', 'DIMGRAY',
\r
836 '708090', 'SLATEGRAY',
\r
837 'A9A9A9', 'DARKGRAY',
\r
838 'DCDCDC', 'GAINSBORO',
\r
839 '191970', 'MIDNIGHTBLUE',
\r
840 '6A5ACD', 'SLATEBLUE',
\r
841 '0000CD', 'MEDIUMBLUE',
\r
842 '4169E1', 'ROYALBLUE',
\r
843 '1E90FF', 'DODGERBLUE',
\r
844 '87CEEB', 'SKYBLUE',
\r
845 '4682B4', 'STEELBLUE',
\r
846 'ADD8E6', 'LIGHTBLUE',
\r
847 'AFEEEE', 'PALETURQUOISE',
\r
848 '40E0D0', 'TURQUOISE',
\r
849 'E0FFFF', 'LIGHTCYAN',
\r
850 '7FFFD4', 'AQUAMARINE',
\r
851 '006400', 'DARKGREEN',
\r
852 '2E8B57', 'SEAGREEN',
\r
853 '90EE90', 'LIGHTGREEN',
\r
854 '7FFF00', 'CHARTREUSE',
\r
855 'ADFF2F', 'GREENYELLOW',
\r
856 '32CD32', 'LIMEGREEN',
\r
857 '9ACD32', 'YELLOWGREEN',
\r
858 '6B8E23', 'OLIVEDRAB',
\r
859 'BCB76B', 'DARKKHAKI',
\r
860 'EEE8AA', 'PALEGOLDENROD',
\r
861 'FFFFE0', 'LIGHTYELLOW',
\r
863 'DAA520', 'GOLDENROD',
\r
864 'B8860B', 'DARKGOLDENROD',
\r
865 'BC8F8F', 'ROSYBROWN',
\r
866 'CD5C5C', 'INDIANRED',
\r
867 '8B4513', 'SADDLEBROWN',
\r
868 'A0522D', 'SIENNA',
\r
870 'DEB887', 'BURLYWOOD',
\r
873 'F4A460', 'SANDYBROWN',
\r
875 'D2691E', 'CHOCOLATE',
\r
876 'B22222', 'FIREBRICK',
\r
878 'FA8072', 'SALMON',
\r
879 'FFA500', 'ORANGE',
\r
881 'FF6347', 'TOMATO',
\r
882 'FF69B4', 'HOTPINK',
\r
884 'FF1493', 'DEEPPINK',
\r
885 'DB7093', 'PALEVIOLETRED',
\r
886 'EE82EE', 'VIOLET',
\r
888 'DA70D6', 'ORCHILD',
\r
889 '9400D3', 'DARKVIOLET',
\r
890 '8A2BE2', 'BLUEVIOLET',
\r
891 '9370DB', 'MEDIUMPURPLE',
\r
892 'D8BFD8', 'THISTLE',
\r
893 'E6E6FA', 'LAVENDER',
\r
894 'FFE4E1', 'MISTYROSE',
\r
896 'FFFACD', 'LEMONCHIFFON'
\r
898 for( i = list.length; i; ){
\r
900 name = list[ --i ];
\r
901 ret[ name ] = parseInt( v, 16 );
\r
906 var PARAMS = ( function(){
\r
908 register( ret.percent = {},
\r
909 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom,paddingLeft,paddingRight,paddingTop,fontSize,textIndent'
\r
911 register( ret.offset = {},
\r
912 'height,width,bottom,left,right,top'
\r
914 register( ret.size = {},
\r
915 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth,letterSpacing'
\r
917 register( ret.color = {},
\r
918 'backgroundColor,borderBottomColor,borderLeftColor,borderRightColor,borderTopColor,color'
\r
920 register( ret.region = {},
\r
921 'margin,padding,borderWidth,borderColor'
\r
923 register( ret.special = {},
\r
924 'clip,backgroundPosition,opacity,lineHeight,zIndex'
\r
926 register( ret.unit = {}, 'px,cm,mm,in,pt,pc,em,%' );
\r
928 register( ret.margin = {}, 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom' );
\r
929 register( ret.padding = {}, 'paddingBottom,paddingLeft,paddingRight,paddingTop' );
\r
930 register( ret.borderWidth = {}, 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth' );
\r
931 register( ret.borderColor = {}, 'borderBottomColor,borderLeftColor,borderRightColor,borderTopColor' );
\r
933 function register( obj, params ){
\r
934 params = params.split( ',' );
\r
935 for( var i=params.length; i; ) obj[ params[ --i ] ] = true;
\r
943 var PropertyClass = function( name, value, unit, pxPerEm ){
\r
945 this.value = value;
\r
947 this.pxPerEm = pxPerEm; // XXpx = 1em;
\r
949 PropertyClass.prototype = {
\r
952 pxPerEm: 12, // 1em === ??px
\r
954 equal: function( prop ){
\r
955 if( this.unit === prop.unit ){
\r
956 return this.value === prop.value;
\r
958 return Math.abs( this.toPx() - prop.toPx() ) < 1;
\r
960 convert: function( prop ){
\r
961 var u = prop.unit, v;
\r
962 if( this.unit === u ) return;
\r
963 this.value = v = this.toPx();
\r
966 this.value = u === 'em' ? v / this.pxPerEm : Util.pxTo( v, u );
\r
969 setValue: function( v ){
\r
972 getValue: function(){
\r
975 getOffset: function( prop ){
\r
976 return prop.value - this.value;
\r
978 getUnit: function(){
\r
981 getValueText: function(){
\r
982 return this.value === 0 ? '0' : this.value + this.unit;
\r
987 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
992 var v = this.value, u = this.unit;
\r
993 if( u === px ) return v;
\r
994 if( u === 'em' ) return v * this.pxPerEm;
\r
995 if( u === '' && this.name === 'lineHeight' ) return v * this.pxPerEm;
\r
996 return Util.toPx( v, u );
\r
998 isValid: function( t ){
\r
1003 z = u !== '' ? true : v === 0;
\r
1004 if( PARAMS.percent[ n ] === true ) return z;
\r
1005 if( PARAMS.offset[ n ] === true ) return z;
\r
1006 if( PARAMS.size[ n ] === true ) return z && u !== '%';
\r
1007 if( PARAMS.special[ n ] === true ){
\r
1008 if( n === 'lineHeight' ) return true;
\r
1009 if( n === 'opacity' ) return 0 <= v && v <= 1 && u === '';
\r
1010 if( n === 'zIndex' ) return u === '';
\r
1017 * backgroundPosition, clip
\r
1019 var PropertyGroupClass = function( name ){
\r
1022 for( var i = 1, l = arguments.length; i<l; ++i ){
\r
1023 this.props.push( arguments[ i ] );
\r
1028 * margin, padding, borderWidth, borderColor
\r
1030 var FrexiblePropertyClass = function( name ){
\r
1033 for( var i = 1, l = arguments.length; i<l; ++i ){
\r
1034 this.props.push( arguments[ i ] );
\r
1036 // top, bottom, left, right, topbottom, leftright, all
\r
1038 FrexiblePropertyClass.prototype = PropertyGroupClass.prototype = {
\r
1040 equal : function( prop ){
\r
1041 var ps = this.props, i = ps.length;
\r
1044 if( ps[ i ].equal( prop[ i ] ) === false ) return false;
\r
1048 convert : function( prop ){
\r
1049 var ps = this.props, i = ps.length;
\r
1052 ps[ i ].convert( prop[ i ] );
\r
1055 setValue : function( ary ){
\r
1056 var ps = this.props, i = 0, l = ps.length;
\r
1057 for( ; i<l; ++i ){
\r
1058 ps[ i ].setValue( ary[ i ] );
\r
1061 getValue : function(){
\r
1062 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1063 for( ; i<l; ++i ){
\r
1064 ret.push( ps[ i ].getValue() );
\r
1068 getOffset : function( prop ){
\r
1074 for( ; i<l; ++i ){
\r
1075 ret.push( ps[ i ].getOffset( _ps[ i ] ) );
\r
1079 getUnit : 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 ].getUnit() );
\r
1086 getValueText : function(){
\r
1087 var ret = [], ps = this.props, i = 0, l = ps.length;
\r
1088 for( ; i<l; ++i ){
\r
1089 ret.push( ps[ i ].getValueText() );
\r
1091 if( this.name === 'clip' ){
\r
1092 return 'rect(' + ret.join( CLIP_SEPARATOR ) + ')';
\r
1094 return ret.join( ' ' );
\r
1096 clear : function(){
\r
1097 var ps = this.props, i = ps.length;
\r
1099 ps[ --i ].clear();
\r
1102 delete this.props;
\r
1104 isValid : function( t ){
\r
1106 var ps = t.props, i = ps.length;
\r
1109 if( ps[ i ].isValid() === false ) return false;
\r
1115 var ColorPropertyClass = function( name, r, g, b, pct ){
\r
1122 ColorPropertyClass.prototype = {
\r
1124 equal : function( prop ){
\r
1125 if( this.pct === prop.pct ){
\r
1126 return this.r === prop.r && this.g === prop.g && this.b === prop.b;
\r
1128 var rgb = this._toPct(),
\r
1129 _rgb = prop._toPct(),
\r
1133 if( Math.abs( rgb[ i ] - _rgb[ i ] ) > 1 ) return false;
\r
1137 convert : function( prop ){
\r
1138 var u = prop.pct, x;
\r
1139 if( this.pct === u ) return;
\r
1140 x = u === true ? 100 / 255 : 2.55;
\r
1146 setValue : function( rgb ){
\r
1147 this.r = rgb[ 0 ];
\r
1148 this.g = rgb[ 1 ];
\r
1149 this.b = rgb[ 2 ];
\r
1151 getValue : function(){
\r
1152 return [ this.r, this.g, this.b ];
\r
1154 getOffset : function( prop ){
\r
1155 return [ prop.r - this.r, prop.g - this.g, prop.b - this.b ];
\r
1157 getUnit : function(){
\r
1158 return this.pct === true ? '%' : '';
\r
1160 getValueText : function(){
\r
1161 if( this.pct === true ){
\r
1162 return [ 'rgb(', this.r, '%,', this.g, '%,', this.b, '%)' ].join( '' );
\r
1164 var round = Math.round;
\r
1165 //return [ 'rgb(', round( this.r ), ',', round( this.g ), ',', round( this.b ), ')' ].join( '' );
\r
1167 var rgb = '00000' + ( ( round( this.r ) << 16 ) + ( round( this.g ) << 8 ) + round( this.b ) ).toString( 16 );
\r
1168 return '#' + rgb.substr( rgb.length - 6 );
\r
1170 clear : function(){
\r
1173 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
1177 _toPct : function(){
\r
1178 if( this.pct === true ) return [ this.r, this.g, this.b ];
\r
1179 return [ this.r / 2.55, this.g / 2.55, this.b / 2.55 ];
\r
1181 isValid : function( t ){
\r
1182 var isFinite = window.isFinite;
\r
1183 if( !isFinite( this.r ) || !isFinite( this.g ) || !isFinite( this.b ) ) return false;
\r
1184 if( 0 > this.r || 0 > this.g || 0 > this.b ) return false;
\r
1185 if( this.pct === true ){
\r
1186 return this.r <= 100 && this.g <= 100 && this.b <= 100;
\r
1188 return this.r <= 255 && this.g <= 255 && this.b <= 255;
\r
1192 var isString = Type.isString,
\r
1193 isNumber = Type.isNumber;
\r
1194 var REG_UINIT = /.*\d(\w{1,2})?/,
\r
1197 REG_XXXXXX = /^#[\da-fA-F]{6}?/,
\r
1198 REG_XXX = /^#[\da-fA-F]{3}?/;
\r
1200 var WrappedStyleClass = function( elm, style ){
\r
1202 this.style = style;
\r
1203 this.pxPerEm = this.get( 'fontSize' ).toPx();
\r
1206 WrappedStyleClass.prototype = {
\r
1207 get: function( p ){
\r
1208 if( PARAMS.special[ p ] === true || PARAMS.region[ p ] === true ){
\r
1209 if( p === 'clip' ) return this.getClip();
\r
1210 if( p === 'margin' ) return this.getMarginPaddingBorder( p );
\r
1211 if( p === 'padding' ) return this.getMarginPaddingBorder( p );
\r
1212 if( p === 'borderWidth' ) return this.getMarginPaddingBorder( 'border', 'Width' );
\r
1213 if( p === 'borderColor' ) return this.getBorderColor( 'borderColor' );
\r
1214 if( p === 'backgroundPosition' ) return this.getBackgroundPosition( p );
\r
1215 // opacity, zindex, lineHeight
\r
1216 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x ), this.pxPerEm );
\r
1218 var x = this.style[ p ], e, v, u;
\r
1219 if( PARAMS.offset[ p ] === true ){
\r
1220 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1223 if( p === 'width' ) v = e.offsetWidth;
\r
1224 if( p === 'height' ) v = e.offsetHeight;
\r
1225 if( p === 'top' ) v = e.offsetTop;
\r
1226 if( p === 'bottom' ) v = e.offsetBottom;
\r
1227 if( p === 'left' ) v = e.offsetLeft;
\r
1228 if( p === 'right' ) v = e.offsetRight;
\r
1229 u = this.getUnit( x, p );
\r
1230 // alert( p + this.pxTo( v, u ) + u )
\r
1231 return new PropertyClass( p, this.pxTo( v, u ), u, this.pxPerEm ); */
\r
1233 if( p === 'fontSize' ){ // xx-small 等
\r
1234 v = Util.absoluteFontSizeToPx( x );
\r
1236 return new PropertyClass( p, v, px, this.pxPerEm );
\r
1239 if( PARAMS.percent[ p ] === true ){
\r
1240 // alert( p + ' , ' + x + ' , ' + this.getUnit( x, p ) )
\r
1241 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1243 if( PARAMS.size[ p ] === true ){
\r
1244 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );
\r
1246 if( PARAMS.color[ p ] === true ){
\r
1247 return this.getColor( x, p );
\r
1250 pxTo: function( px, unit ){
\r
1251 if( unit === 'em' ) return px / this.pxPerEm;
\r
1252 return Util.pxTo( px, unit );
\r
1254 getValue: function( x, p ){
\r
1255 if( isString( x ) === true ){
\r
1256 return parseInt( x );
\r
1258 if( isNumber( x ) === true ){
\r
1263 getUnit: function( x, p ){
\r
1265 if( isString( x ) === true ){
\r
1266 u = x.replace( REG_UINIT, $1 );
\r
1267 if( p === 'lineHeight' ) return u;
\r
1268 if( PARAMS.unit[ u ] !== true ) return px;
\r
1273 getColor: function( x, p ){
\r
1274 var rgb = COLOR[ x.toUpperCase() ],
\r
1279 if( isNumber( rgb ) === true ){
\r
1280 r = ( rgb & 0xff0000 ) >> 16;
\r
1281 g = ( rgb & 0xff00 ) >> 8;
\r
1282 b = ( rgb & 0xff );
\r
1284 if( x.match( REG_XXXXXX ) ){
\r
1285 r = parseInt( x.charAt( 1 ) + x.charAt( 2 ), 16 );
\r
1286 g = parseInt( x.charAt( 3 ) + x.charAt( 4 ), 16 );
\r
1287 b = parseInt( x.charAt( 5 ) + x.charAt( 6 ), 16 );
\r
1288 //alert( x + ' g: ' + g )
\r
1290 if( x.match( REG_XXX ) ){
\r
1291 r = parseInt( x.charAt( 1 ) + x.charAt( 1 ), 16 );
\r
1292 g = parseInt( x.charAt( 2 ) + x.charAt( 2 ), 16 );
\r
1293 b = parseInt( x.charAt( 3 ) + x.charAt( 3 ), 16 );
\r
1295 if( x.indexOf( 'rgb(' ) === 0 ){
\r
1296 rgb = x.substr( 4 ).split( ',' );
\r
1297 r = parseFloat( rgb[ 0 ] );
\r
1298 g = parseFloat( rgb[ 1 ] );
\r
1299 b = parseFloat( rgb[ 2 ] );
\r
1300 if( x.indexOf( '%' ) !== -1 ){
\r
1308 return new ColorPropertyClass( p, r, g, b, pct );
\r
1310 getClip: function( name ){
\r
1311 // rect(...) クリップします。<top>, <bottom> は上端からの、 <right>, <left> は左端からのオフセットで指定します。Internet Explorer 4~7 では、カンマの代わりにスペースで区切る必要があります。
\r
1312 // position:absolute または position:fixed を適用した要素に対してのみ有効です。
\r
1313 var top = this.get( name + 'Top' ),
\r
1314 right = this.get( name + 'Right' ),
\r
1315 bottom = this.get( name + 'Bottom' ),
\r
1316 left = this.get( name + 'Left' ),
\r
1317 ret = new PropertyGroupClass( name, top, right, bottom, left );
\r
1318 if( ret.isValid() === true ) return ret;
\r
1320 all = this.style[ name ].split( '(' )[ 1 ].split( ')' )[ 0 ].split( CLIP_SEPARATOR );
\r
1321 return new PropertyGroupClass( name,
\r
1322 new PropertyClass( name + 'Top', all[ 0 ], px, this.pxPerEm ),
\r
1323 new PropertyClass( name + 'Right', all[ 1 ], px, this.pxPerEm ),
\r
1324 new PropertyClass( name + 'Bottom', all[ 2 ], px, this.pxPerEm ),
\r
1325 new PropertyClass( name + 'Left', all[ 3 ], px, this.pxPerEm )
\r
1328 getBackgroundPosition: function( name ){
\r
1329 var x = this.get( name + 'X' ),
\r
1330 y = this.get( name + 'Y' ),
\r
1331 ret = new PropertyGroupClass( name, x, y ),
\r
1333 if( ret.isValid() === true ) return ret;
\r
1335 xy = this.style[ name ].split( ' ' );
\r
1336 return new PropertyGroupClass( name,
\r
1337 new PropertyClass( name + 'X', this.getValue( xy[ 0 ] ), this.getUnit( xy[ 0 ] ), this.pxPerEm ),
\r
1338 new PropertyClass( name + 'Y', this.getValue( xy[ 1 ] ), this.getUnit( xy[ 1 ] ), this.pxPerEm )
\r
1341 getMarginPaddingBorder: function( name, widthOrColor ){
\r
1342 widthOrColor = widthOrColor || '';
\r
1343 var _class = PropertyClass,
\r
1344 top = this.get( name + 'Top' + widthOrColor ),
\r
1345 right = this.get( name + 'Right' + widthOrColor ),
\r
1346 bottom = this.get( name + 'Bottom' + widthOrColor ),
\r
1347 left = this.get( name + 'Left' + widthOrColor ),
\r
1348 ret = new FrexiblePropertyClass( name, top, right, bottom, left ),
\r
1351 if( ret.isValid() === true ) return ret;
\r
1353 all = this.style[ name + widthOrColor ].split( ' ' );
\r
1355 for( i = 0, l=all.length; i<l; ++i ){
\r
1357 v = this.getValue( x );
\r
1358 u = this.getUnit( x );
\r
1360 if( i === 0 ) top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1361 if( i === 1 ) right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1362 if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1363 if( i === 3 ) left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1366 if( i === 0 ) top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1368 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1369 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1371 if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor , v, u, this.pxPerEm );
\r
1375 top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1376 bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );
\r
1379 right = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );
\r
1380 left = new _class( name + 'Left' + widthOrColor, v, u, this.pxPerEm );
\r
1384 top = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );
\r
1385 bottom = new _class( name + 'Bottom' + 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
1390 return new FrexiblePropertyClass( name, top, right, bottom, left );
\r
1392 getBorderColor: function( name ){
\r
1393 var getColor = this.getColor,
\r
1394 top = this.get( name + 'TopColor' ),
\r
1395 right = this.get( name + 'RightColor' ),
\r
1396 bottom = this.get( name + 'BottomColor' ),
\r
1397 left = this.get( name + 'LeftColor' ),
\r
1398 ret = new FrexiblePropertyClass( name, top, right, bottom, left ),
\r
1401 if( ret.isValid() === true ) return ret;
\r
1403 all = this.style[ name ].split( ' ' );
\r
1405 for( i = 0, l = all.length; i<l; ++i ){
\r
1408 if( i === 0 ) top = getColor( x, name + 'Top' );
\r
1409 if( i === 1 ) right = getColor( x, name + 'Right' );
\r
1410 if( i === 2 ) bottom = getColor( x, name + 'Bottom' );
\r
1411 if( i === 3 ) left = getColor( x, name + 'Left' );
\r
1414 if( i === 0 ) top = getColor( x, name + 'Top' );
\r
1416 right = getColor( x, name + 'Right' );
\r
1417 left = getColor( x, name + 'Left' );
\r
1419 if( i === 2 ) bottom = getColor( x, name + 'Bottom' );
\r
1423 top = getColor( x, name + 'Top' );
\r
1424 bottom = getColor( x, name + 'Bottom' );
\r
1427 right = getColor( x, name + 'Right' );
\r
1428 left = getColor( x, name + 'Left' );
\r
1432 top = getColor( x, name + 'Top' );
\r
1433 bottom = getColor( x, name + 'Bottom' );
\r
1434 right = getColor( x, name + 'Right' );
\r
1435 left = getColor( x, name + 'Left' );
\r
1438 return new FrexiblePropertyClass( name, top, right, bottom, left );
\r
1440 clear: function(){
\r
1443 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;
\r
1448 function camelizeHash( obj ){
\r
1451 _p = Util.camelize( p );
\r
1452 if( _p === p ) continue;
\r
1453 obj[ _p ] = obj[ _p ] || obj[ p ];
\r
1458 function cssToObject( css ){
\r
1459 var ret = {}, i, nv, n, v,
\r
1460 parse = Util.parse,
\r
1461 isNumber = Type.isNumber,
\r
1462 camelize = Util.camelize;
\r
1463 if( Type.isString( css ) === true ){
\r
1464 css = css.split( ';' );
\r
1465 for( i = css.length; i; ){
\r
1466 nv = css[ --i ].split( ':' ); // filter の場合, progid: がくる
\r
1468 if( isNumber( parse( n ) ) === true ) continue;
\r
1469 v = nv.join( '' );
\r
1470 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );
\r
1471 ret[ camelize( n ) ] = parse( v );
\r
1475 if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );
\r
1479 if( SPECIAL.setFilters ){
\r
1480 SPECIAL.setFilters( ret );
\r
1482 ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;
\r
1485 SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );
\r
1486 SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );
\r
1491 getWrappedStyle: function( elm, opt_css ){
\r
1492 return new WrappedStyleClass( elm, opt_css ? camelizeHash( opt_css ) : CSS.getComputedStyle( elm ) );
\r
1494 getInlineStyle: function( _elm ){
\r
1495 return cssToObject( _elm.style.cssText );
\r
1497 getStyleProperty : function( elm, property ){
\r
1498 if( document.defaultView && document.defaultView.getComputedStyle ){
\r
1499 CSS.getStyleProperty = function( elm, property ){
\r
1500 var obj = document.defaultView.getComputedStyle( elm, '' ),
\r
1503 fontSize = 'fontSize',
\r
1504 number = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ],
\r
1507 if( obj.cssText ){
\r
1508 css = obj.cssText.split( ';' );
\r
1509 for( i = css.length; i; ){
\r
1510 nv = css[ --i ].split( ':' ); // filter の場合, progid: がくる
\r
1511 n = Util.camelize( nv.shift() );
\r
1512 if( n === property && number === false ) return nv.join( '' );
\r
1513 if( n === property || n === fontSize ){
\r
1514 v = nv.join( '' );
\r
1515 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );
\r
1517 if( style[ property ] && style[ fontSize ] ) break;
\r
1521 if( number === false ) return obj[ property ];
\r
1523 style[ property ] = obj[ property ];
\r
1524 if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];
\r
1525 style[ fontSize ] = obj[ fontSize ];
\r
1526 if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];
\r
1529 wrapped = CSS.getWrappedStyle( elm, style );
\r
1531 return wrapped.get( property );
\r
1534 CSS.getStyleProperty = function( elm, property ){
\r
1535 var obj = elm.currentStyle,
\r
1538 fontSize = 'fontSize',
\r
1539 number = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ];
\r
1540 if( number === false ) return obj[ property ];
\r
1542 style[ property ] = obj[ property ];
\r
1543 if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];
\r
1544 style[ fontSize ] = obj[ fontSize ];
\r
1545 if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];
\r
1547 wrapped = CSS.getWrappedStyle( elm, style );
\r
1549 return wrapped.get( property );
\r
1552 return CSS.getStyleProperty( elm, property );
\r
1554 getComputedStyle: function( elm ){
\r
1555 /* if( window.getComputedStyle ){
\r
1556 CSS.getComputedStyle = function( elm ){
\r
1557 return cssToObject( window.getComputedStyle( elm, '' ) );
\r
1560 if( document.defaultView && document.defaultView.getComputedStyle ){
\r
1561 CSS.getComputedStyle = function( elm ){
\r
1562 var obj = document.defaultView.getComputedStyle( elm, '' );
\r
1563 return cssToObject( obj.cssText || obj );
\r
1566 CSS.getComputedStyle = function( elm ){
\r
1567 return cssToObject( elm.currentStyle );
\r
1570 return CSS.getComputedStyle( elm );
\r
1572 toCssText: function( _css ){
\r
1574 for( var p in _css ){
\r
1575 if( PARAMS.margin[ p ] === true && _css.margin ) continue;
\r
1576 if( PARAMS.padding[ p ] === true && _css.padding ) continue;
\r
1577 if( PARAMS.borderWidth[ p ] === true && _css.borderWidth ) continue;
\r
1578 if( PARAMS.borderColor[ p ] === true && _css.borderColor ) continue;
\r
1580 v && ret.push( [ Util.uncamelize( p ), v ].join( ':' ) );
\r
1582 return ret.join( ';' );
\r
1586 })( window, document );
\r
1591 * susie-t, http://d.hatena.ne.jp/susie-t/20070218/1171760841
\r
1594 positionedOffset : function( element ){
\r
1597 include = Position.isIncludeBorder,
\r
1598 minus = Position.isMinusBodyBorder,
\r
1599 body = document.body,
\r
1600 parent, border, p;
\r
1602 valueT += element.offsetTop || 0;
\r
1603 valueL += element.offsetLeft || 0;
\r
1604 parent = element.offsetParent;
\r
1606 border = Position.getBorder( parent );
\r
1607 valueT += border[0];
\r
1608 valueL += border[1];
\r
1609 if( parent === body && minus ){
\r
1610 valueT += border[0];
\r
1611 valueL += border[1];
\r
1614 if( parent === body ) break;
\r
1616 p = CSS.getStyleProperty( parent, 'position' );
\r
1617 // p = CSS.getComputedStyle( parent ).position;
\r
1618 if( p === 'relative' || p === 'absolute' ) break;
\r
1620 } while( element = parent );
\r
1621 return [ valueL, valueT ];
\r
1623 page : function( forElement ){
\r
1626 include = Position.isIncludeBorder,
\r
1627 minus = Position.isMinusBodyBorder,
\r
1628 body = document.body,
\r
1629 element = forElement,
\r
1632 valueT += element.offsetTop || 0;
\r
1633 valueL += element.offsetLeft || 0;
\r
1634 parent = element.offsetParent;
\r
1636 border = Position.getBorder( parent );
\r
1637 valueT += border[1];
\r
1638 valueL += border[0];
\r
1639 if( parent === body && minus ){
\r
1640 valueT += border[0];
\r
1641 valueL += border[1];
\r
1645 if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){
\r
1648 } while( element = parent );
\r
1650 element = forElement;
\r
1652 valueT -= element.scrollTop || 0;
\r
1653 valueL -= element.scrollLeft || 0;
\r
1654 } while( element = element.parentNode );
\r
1656 return [ valueL, valueT ];
\r
1658 getBorder : function( element ){
\r
1659 if( element === null ){
\r
1665 dhtmlStyle = CSS.getWrappedStyle( element );
\r
1666 compStyle = CSS.getComputedStyle( element );
\r
1667 if( compStyle.borderTopStyle !== 'none' ){
\r
1668 top = dhtmlStyle.get( 'borderTopWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-top-width' ) );
\r
1670 if( compStyle.borderLeftStyle !== 'none' ){
\r
1671 left = dhtmlStyle.get( 'borderLeftWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-left-width' ) );
\r
1676 if( CSS.getStyleProperty( element, 'borderTopStyle' ) !== 'none' ){
\r
1677 top = CSS.getStyleProperty( element, 'borderTopWidth' ).toPx();
\r
1679 if( CSS.getStyleProperty( element, 'borderLeftStyle' ) !== 'none' ){
\r
1680 left = CSS.getStyleProperty( element, 'borderLeftWidth' ).toPx();
\r
1683 return [ left || 0, top || 0 ];
\r
1685 isIncludeBorder : ( function() {
\r
1686 var parent = document.createElement( 'div' );
\r
1687 document.body.appendChild( parent );
\r
1688 parent.style.cssText = 'border:solid blue 10px; padding:0px; position:absolute; visibility:hidden;';
\r
1690 var child = document.createElement( 'div' );
\r
1691 parent.appendChild( child );
\r
1692 var ret = child.offsetTop === 0 ? false : true;
\r
1694 document.body.removeChild( parent );
\r
1698 isMinusBodyBorder : ( function(){
\r
1699 return document.body.offsetTop < CSS.getWrappedStyle( document.body ).get( 'marginTop' ).toPx();
\r
1700 // return document.body.offsetTop < CSS.getStyleProperty( document.body, 'marginTop' ).toPx();
\r
1702 cumulativeOffset : function( element ){
\r
1703 if( /Konqueror|Safari|KHTML/.test( navigator.userAgent ) ){
\r
1704 Position.cumulativeOffset = function( element ){
\r
1707 include = Position.isIncludeBorder,
\r
1708 minus = Position.isMinusBodyBorder,
\r
1709 body = document.body,
\r
1712 valueT += element.offsetTop || 0;
\r
1713 valueL += element.offsetLeft || 0;
\r
1714 parent = element.offsetParent;
\r
1716 border = Position.getBorder( parent );
\r
1717 valueT += border[1];
\r
1718 valueL += border[0];
\r
1719 if( parent === body && minus ){
\r
1720 valueT += border[0];
\r
1721 valueL += border[1];
\r
1724 if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){
\r
1728 } while ( element );
\r
1730 return [ valueL, valueT ];
\r
1733 Position.cumulativeOffset = function( element ){
\r
1736 include = Position.isIncludeBorder,
\r
1737 minus = Position.isMinusBodyBorder,
\r
1738 body = document.body,
\r
1741 valueT += element.offsetTop || 0;
\r
1742 valueL += element.offsetLeft || 0;
\r
1743 parent = element.offsetParent;
\r
1745 border = Position.getBorder( parent );
\r
1746 valueT += border[1];
\r
1747 valueL += border[0];
\r
1748 if( parent === body && minus ){
\r
1749 valueT += border[0];
\r
1750 valueL += border[1];
\r
1754 } while( element );
\r
1755 return [ valueL, valueT ];
\r
1758 return Position.cumulativeOffset( element );
\r