OSDN Git Service

Version 0.6.58, X.UI.HBox is working.
[pettanr/clientJs.git] / 0.5.x / javascripts / libs.js
1 /*\r
2  * pettanR libs.js\r
3  *   version 0.5.47\r
4  * \r
5  * \r
6  * Type\r
7  * \r
8  * UA\r
9  * \r
10  * Util\r
11  * \r
12  * CSS\r
13  * \r
14  */\r
15 \r
16 if( !( 'console' in window ) ){\r
17         window[ 'console' ] = { log : function(){} };\r
18 }\r
19 \r
20 var getFunctionName = function( f ){\r
21     return 'name' in f\r
22         ? f.name\r
23         : (''+f).replace(/^\s*function\s*([^\(]*)[\S\s]+$/im, '$1');\r
24 };\r
25 \r
26 /*\r
27  * http://d.hatena.ne.jp/hir90/20080620/1213987444\r
28  */\r
29         String.prototype.repeat = function( num){\r
30                 var str = "" + this;\r
31                 var ans = '';\r
32                 if( num < 0) return 'error';\r
33                 while( num){\r
34                         if( num&1) ans += str;\r
35                         num = num>>1;\r
36                         str += str;\r
37                 }\r
38                 return ans;\r
39         }\r
40 \r
41 /*\r
42  * http://pettanr.sourceforge.jp/test/type.html\r
43  */\r
44         var Type = {\r
45                 isObject : function(v) {\r
46                         return v !== null && typeof v === 'object';\r
47                 },\r
48                 isFunction : function(v) {\r
49                         return typeof v === 'function';\r
50                 },\r
51                 isArray : function(v) {\r
52                         return Object.prototype.toString.call(v) === '[object Array]';\r
53                 },\r
54                 isBoolean : function(v) {\r
55                         return typeof v === 'boolean';\r
56                 },\r
57                 isString : function(v) {\r
58                         return typeof v === 'string';\r
59                 },\r
60                 isNumber : function(v) {\r
61                         return typeof v === 'number';\r
62                 },\r
63                 isFinite : function(v){\r
64                         return Type.isNumber(v) === true && isFinite(v);\r
65                 },\r
66                 isHTMLElement : function(v){\r
67                         if( 'HTMLElement' in window ){\r
68                                 Type.isHTMLElement = function(v){\r
69                                         return v instanceof HTMLElement;\r
70                                 };\r
71                         } else {\r
72                                 Type.isHTMLElement = function(v) {\r
73                                         if( Type.isObject(v) === false ){\r
74                                                 return false;\r
75                                         };\r
76                                         var r;\r
77                                         if(v && v.nodeType === 1 ){\r
78                                                 try {\r
79                                                         r = v.cloneNode(false);\r
80                                                 } catch(n){\r
81                                                         return false;\r
82                                                 };\r
83                                                 if(r === v) return false;\r
84                                                 try{\r
85                                                         r.nodeType = 9;\r
86                                                         return r.nodeType === 1;\r
87                                                 } catch(n){};\r
88                                                 return true;\r
89                                         };\r
90                                         return false;\r
91                                 };\r
92                         };\r
93                         return Type.isHTMLElement(v);\r
94                 },\r
95                 /*\r
96                 isElementCollection : function(v) {\r
97                         return (Object.prototype.toString.call(v) === "[object HTMLCollection]");\r
98                 },\r
99                 */\r
100                 isNull : function(v) {\r
101                         return v === null;\r
102                 },\r
103                 isUndefined : function(v) {\r
104                         return typeof v === 'undefined';\r
105                 }\r
106         };\r
107 \r
108 /*\r
109  * UA\r
110  * \r
111  *   detect userAgent\r
112  *   detect plug in\r
113  */\r
114         var UA = ( function(){\r
115                 var ua = (function(){\r
116                                 var acme = {};\r
117                                 \r
118                                 var n    = navigator;\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
131                                                 acme.isSafari = 2;\r
132                                         };\r
133                                 };\r
134                                 if(document.all && !acme.isOpera){\r
135                                         acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;\r
136                                 };\r
137                                 \r
138                                 return acme;\r
139                         })(),\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
148                                         x,\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
157                                         b.appendChild(x);\r
158                                         x.style.cssText = 'width:1px;height:1px;line-height:1px;filter:progid:DXImageTransform.Microsoft.Shadow()';\r
159                                         ret = x.offsetHeight > 1;\r
160                                         b.removeChild(x);\r
161                                 };\r
162                                 b.className += [ c !== '' ? ' ' : c, ns, ret === true ? enabled : disabled ].join( '');\r
163                                 return ret;\r
164                         })(),\r
165                         VML = ( function(){\r
166                                 if( ActiveX === false || isIE === false || ieVersion > 8) return false;\r
167                                 var globalObjectName = 'detect_activex',//Util.createGlobalUniqueName(),\r
168                                         script,\r
169                                         id = 'detectVML';\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
175                                         return true;\r
176                                 };\r
177                                 return false;\r
178                         })(),\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
183                                         script,\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
190                                         return false;\r
191                                 };\r
192                                 return true;\r
193                         })();\r
194                 return {\r
195                         IE:                                     ua.isIE,\r
196                         GECKO:                          ua.isGecko,\r
197                         OPERA:                          ua.isOpera,\r
198                         KHTML:                          ua.isKhtml,\r
199                         WEBKIT:                         ua.isWebKit,\r
200                         CHROME:                         ua.isChrome,\r
201                         isIE:                           isIE,\r
202                         ieVersion:                      ieVersion,\r
203                         ieRenderingVersion:     ieRenderingVersion,\r
204                         isStanderdMode:         isStanderdMode,\r
205                         ACTIVEX:            ActiveX,\r
206                         VML:                VML,\r
207                         STANDALONE:         isStandAloneMode,\r
208                         VENDER_PREFIX: ( function() {\r
209                                 var ua = navigator.userAgent.toLowerCase();\r
210                                 if ( ua.indexOf('opera') !== -1 ){\r
211                                         return 'O';\r
212                                 } else if ( ua.indexOf('msie') !== -1 ){\r
213                                         return 'ms';\r
214                                 } else if ( ua.indexOf('webkit') !== -1 ){\r
215                                         return 'webkit';\r
216                                 } else if ( navigator.product === 'Gecko' ){\r
217                                         return 'Moz';\r
218                                 }\r
219                                 return '';\r
220                         })(),\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
226                                 };\r
227                             document.createStyleSheet().cssText = "v\:shape,v\:image{behavior:url(#default#VML);display:block;};";\r
228                         }\r
229                 };\r
230         })();\r
231 \r
232 \r
233 /* ----------------------------------------------------\r
234  * Util\r
235  * \r
236  *   extend( baseInstance, extend)\r
237  *   cleanCommentNode()\r
238  *   cleanElement()\r
239  *   getElementSize( _elm)\r
240  *   getImageSize()\r
241  *   getAbsolutePath()\r
242  *   getGrobalObjectName()\r
243  * \r
244  */\r
245         var Util = ( function( window, document, undefined ){\r
246                 var body = document.getElementsByTagName( 'body' )[ 0 ];\r
247                         \r
248                 var ELM_SIZE_GETTER = ( function(){\r
249                                 var ret = document.createElement( 'div' );\r
250                                 body.appendChild( ret );\r
251                                 \r
252                                 ret.id            = 'elmSizeGetter';\r
253                                 ret.style.cssText = 'position:absolute;left:0;top:-9999px;visibility:hidden';\r
254                                 \r
255                                 body.removeChild( ret );\r
256                                 return ret;\r
257                         })(),\r
258                         CLEAN_TARGET_ELEMENT = 'script,style,object,applet,embed,iframe,frame,base,bgsound,frameset,listing'.split( ',' );\r
259                 \r
260                 var UNIT_RATIO = ( function( elm ){\r
261                                 var ret = {},\r
262                                         unit,\r
263                                         units = 'cm,mm,in,pt,pc'.split( ',' ),\r
264                                         i     = units.length;\r
265                                 \r
266                                 body.appendChild( elm );\r
267                                 \r
268                                 for( ; i; ){\r
269                                         unit = units[ --i ];\r
270                                         elm.style.width = 1000 + unit;\r
271                                         ret[ unit ] = elm.offsetWidth / 1000;\r
272                                 };\r
273                                 elm.style.cssText = '';\r
274                                 \r
275                                 body.removeChild( elm );\r
276                                 return ret;\r
277                         })( ELM_SIZE_GETTER );\r
278                         \r
279                 var FONT_SIZE_RATIO = ( function( elm ){\r
280                                 var ret = {},\r
281                                         size, base,\r
282                                         list = 'xx-large,x-large,large,larger,medium,small,smaller,x-small,xx-small'.split( ',' ),\r
283                                         i = list.length;\r
284                                 \r
285                                 body.appendChild( elm );\r
286                                 elm.style.cssText = 'font-size:100px;line-height:1em;';\r
287                                 elm.appendChild( document.createTextNode( 'X' ) );\r
288                                 \r
289                                 base = elm.offsetHeight;\r
290                                 \r
291                                 for( ; i; ){\r
292                                         size = list[ --i ];\r
293                                         elm.style.fontSize = size;\r
294                                         ret[ size ] = base;\r
295                                 };\r
296                                 \r
297                                 elm.style.cssText = '';\r
298                                 elm.removeChild( elm.firstChild );\r
299                                 body.removeChild( elm );\r
300                                 return ret;\r
301                         })( ELM_SIZE_GETTER );\r
302                 \r
303                 var REG_LARGE = /[A-Z]/g;\r
304                 \r
305                 /* clean comment node */\r
306                 window.setTimeout( function(){\r
307                         // Util.cleanCommentNode();\r
308                         \r
309                         /* clean noscript */\r
310 \r
311                         var noscripts = Util.copyArray( document.getElementsByTagName( 'noscript' ) ),\r
312                                 ns,\r
313                                 i = noscripts.length;\r
314                         for( ; i; ){\r
315                                 ns = noscripts[ --i ];\r
316                                 ns.parentNode && ns.parentNode.removeChild( ns );\r
317                         };\r
318                 }, 0 );\r
319                 \r
320                 var objSrc   = [],\r
321                         objCopy  = [],\r
322                         getIndex;       \r
323                 function clone( src ){\r
324                         var ret, i, key;\r
325                         if( Type.isArray(src) === true ){\r
326                                 i = getIndex( objSrc, src );\r
327                                 if( i !== -1 ) return objCopy[ i ];\r
328                                 ret = [];\r
329                                 objSrc[ objSrc.length ]   = src;\r
330                                 objCopy[ objCopy.length ] = ret;\r
331                         } else\r
332                         if( Type.isObject(src) === true ){\r
333                                 i = getIndex( objSrc, src );\r
334                                 if( i !== -1 ) return objCopy[ i ];\r
335                                 ret = {};\r
336                                 objSrc[ objSrc.length ]   = src;\r
337                                 objCopy[ objCopy.length ] = ret;\r
338                         } else\r
339                         if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){\r
340                                 return src;\r
341                         } else {\r
342                                 return null;\r
343                         };\r
344                         for( key in src ){\r
345                                 ret[ key ] = clone( src[ key ] );\r
346                         };\r
347                         return ret;\r
348                 };\r
349                 \r
350                 return {\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
360                                                 n = _v - 0;\r
361                                         if( '' + n === _v || '' + n === '0' + _v  ) return n - 0;\r
362                                 };\r
363                                 return v;\r
364                         },\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
369                                         } else\r
370                                         if( typeof target[ key ] === typeof extend[ key ] ){\r
371                                                 target[ key ] = extend[ key ];\r
372                                         } else {\r
373                                                 alert( 'extend error' );\r
374                                         };\r
375                                 };\r
376                                 return target;\r
377                         },\r
378                         copy: function( objOrArray ){\r
379                                 objSrc.length = objCopy.length = 0;\r
380                                 getIndex = Util.getIndex;\r
381                                 return clone( objOrArray );\r
382                         },\r
383                         cleanCommentNode: function ( _targetElm ){\r
384                                 search( _targetElm || body );\r
385                                 \r
386                                 function search( _elm ){\r
387                                         if( !_elm ) return;\r
388                                         if( _elm.nodeType === 8 ){\r
389                                                 _elm.parentNode.removeChild( _elm );\r
390                                                 return;\r
391                                         };\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
395                                         };\r
396                                 };\r
397                         },\r
398                         cleanElement: function( _targetElm ){\r
399                                 var _array, _elm, j, _css,\r
400                                     i = CLEAN_TARGET_ELEMENT.length;\r
401                                 for( ; i; ){\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
406                                         };\r
407                                 };\r
408                                 Util.cleanCommentNode( _targetElm );\r
409                                 \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
418                                 };\r
419                         },\r
420                         camelize: function( cssProp ){\r
421                             var parts = cssProp.split( ' ' ).join( '' ).split( '-' ),\r
422                                 l     = parts.length,\r
423                                 i, camelized;\r
424                             if( l === 1 ) return parts[ 0 ];\r
425                         \r
426                             camelized = cssProp.charAt(0) === '-'\r
427                               ? parts[ 0 ].charAt( 0 ).toUpperCase() + parts[ 0 ].substring( 1 )\r
428                               : parts[ 0 ];\r
429                         \r
430                             for( i = 1; i < l; ++i ){\r
431                                 camelized += parts[ i ].charAt( 0 ).toUpperCase() + parts[ i ].substring( 1 );\r
432                             };\r
433                             return camelized;\r
434                         },\r
435                         uncamelize: function( str ){\r
436                                 return str.split( ' ' ).join( '' ).replace( REG_LARGE, '-$&' ).toLowerCase();\r
437                         },\r
438                         pxTo: function( _px, _unit ){\r
439                                 return _px / ( UNIT_RATIO[ _unit ] || 1 );\r
440                         },\r
441                         toPx: function( x, _unit ){\r
442                                 return x * ( UNIT_RATIO[ _unit ] || 1 );\r
443                         },\r
444                         absoluteFontSizeToPx: function( fontsize ){\r
445                                 return FONT_SIZE_RATIO[ fontsize ] || 0;\r
446                         },\r
447                         getElementSize: function( _elm ){\r
448                                 if( Type.isHTMLElement( _elm ) === false ){\r
449                                         return {\r
450                                                 width:  0,\r
451                                                 height: 0\r
452                                         };\r
453                                 };\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
459                                 \r
460                                 body.appendChild( ELM_SIZE_GETTER );\r
461                                 ELM_SIZE_GETTER.appendChild( _elm );\r
462                                 \r
463                                 var ret = {\r
464                                         width:          _elm.offsetWidth,\r
465                                         height:         _elm.offsetHeight\r
466                                 };\r
467                                 if( displayNone === true ) _elm.style.display = 'none';\r
468                                 if( nextElm ){\r
469                                         parentElm.insertBefore( _elm, nextElm );\r
470                                 } else          \r
471                                 if( prevElm && prevElm.nextSibling ){\r
472                                         parentElm.insertBefore( _elm, prevElm.nextSibling );\r
473                                 } else {\r
474                                         parentElm && parentElm.appendChild( _elm );\r
475                                 };\r
476                                 body.removeChild( ELM_SIZE_GETTER );\r
477                                 \r
478                                 return ret;\r
479                         },\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
486                                 \r
487                                 body.appendChild( ELM_SIZE_GETTER );\r
488                                 ELM_SIZE_GETTER.appendChild( img );\r
489                                 \r
490                                 var size = getActualDimension( img );\r
491                                 \r
492                                 if( displayNone === true ) img.style.display = 'none';\r
493                                 if( nextElm ){\r
494                                         parentElm.insertBefore( img, nextElm );\r
495                                 } else          \r
496                                 if( prevElm && prevElm.nextSibling ){\r
497                                         parentElm.insertBefore( img, prevElm.nextSibling );\r
498                                 } else {\r
499                                         parentElm && parentElm.appendChild( img );\r
500                                 }\r
501                                 body.removeChild( ELM_SIZE_GETTER );\r
502                                 \r
503                         /* LICENSE: MIT\r
504                          * AUTHOR: uupaa.js@gmail.com\r
505                          */\r
506                                 function getActualDimension(image) {\r
507                                         var run, mem, w, h, key = "actual";\r
508                                 \r
509                                 // for Firefox, Safari, Google Chrome\r
510                                         if( "naturalWidth" in image ){\r
511                                                 return {\r
512                                                         width:  image.naturalWidth,\r
513                                                         height: image.naturalHeight\r
514                                                 };\r
515                                         };\r
516                                 \r
517                                         if( "src" in image ){ // HTMLImageElement\r
518                                                 if (image[key] && image[key].src === image.src) {\r
519                                                         return image[key];\r
520                                                 };\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
526                                                         w = image.width;\r
527                                                         h = image.height;\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
534                                                         w = image.width;\r
535                                                         h = image.height;\r
536                                                         image.width  = mem.w; // restore\r
537                                                         image.height = mem.h;\r
538                                                 };\r
539                                                 return image[key] = { width: w, height: h, src: image.src }; // bond\r
540                                         };\r
541                                         // HTMLCanvasElement\r
542                                         return { width: image.width, height: image.height };\r
543                                 };\r
544                                 \r
545                                 return size;\r
546                         },\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
553                         },\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
559                                         thisNode = _elm,\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
565                                 };\r
566                                 return {\r
567                                         x:      destx,\r
568                                         y:      desty\r
569                                 };\r
570                         },\r
571                         contain: function( parent, child ){\r
572                                 function find( node ){\r
573                                         var children = node.childNodes,\r
574                                                 i = 0,\r
575                                                 l = children.length,\r
576                                                 elm;\r
577                                         for( ; i<l; ++i ){\r
578                                                 elm = children[ i ];\r
579                                                 if( elm === child ) return true;\r
580                                                 if( elm.nodeType === 1 && find( elm ) === true ) return true;\r
581                                         };\r
582                                         return false;\r
583                                 };\r
584                                 return find( parent );\r
585                         },\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
592                         },\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                     _node;\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
602                                         } else {\r
603                                                 ++j;\r
604                                         };\r
605                                 };\r
606                                 return _nodes;\r
607                         },\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
612                                 };\r
613                                 return -1;\r
614                         },\r
615                         hasClassName: function( _elm, _className ){\r
616                                 var cnames  = ( _elm.className || '' ).split( ' ' ),\r
617                                         _cnames = _className.split( ' ' ),\r
618                                         cname,\r
619                                         i = _cnames.length;\r
620                                 for( ; i; ){\r
621                                         cname = _cnames[ --i ];\r
622                                         if( cname === '' ) continue;\r
623                                         if( Util.getIndex( cnames, cname ) === -1 ) return false;\r
624                                 };\r
625                                 return true;\r
626                         },\r
627                         addClass: function( _elm, _className ){\r
628                                 if( Util.hasClassName( _elm, _className ) === false ){\r
629                                         var sp = ' ';\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
633                                 };\r
634                         },\r
635                         removeClass: function( _elm, _className ){\r
636                                 var sp     = ' ',\r
637                                         _array = _elm.className.replace( /\s+/g, sp ).split( sp ),\r
638                                         i      = Util.getIndex( _array, _className );\r
639                                 if( i !== -1 ){\r
640                                         _array.splice( i, 1 );\r
641                                         _elm.className = _array.join( sp );\r
642                                 };\r
643                         },\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
647                                 } else {\r
648                                         Util.hasClassName( _elm, _className ) === false ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );\r
649                                 };\r
650                         },\r
651                         removeAllChildren: function ( _elm ){\r
652                                 while( _elm.firstChild ){\r
653                                         remove( _elm.firstChild );\r
654                                 }\r
655                                 function remove( _node ){\r
656                                         while( _node.firstChild){\r
657                                                 remove( _node.firstChild);\r
658                                         }\r
659                                         _node.parentNode && _node.parentNode.removeChild( _node);\r
660                                 }\r
661                         },\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
666                                         };\r
667                                 } else {\r
668                                         Util.getIndex = function( array, element ){\r
669                                                 var i = array.length;\r
670                                                 for( ; i; ){\r
671                                                         if( array[ --i ] === element ) return i;\r
672                                                 };\r
673                                                 return -1;\r
674                                         };\r
675                                 };\r
676                                 return Util.getIndex( array, element );\r
677                         },\r
678                         copyArray: function( _array ){\r
679                                 var l = _array.length,\r
680                                         ret = new Array( l ),\r
681                                         i = 0;\r
682                                 for( ; i<l; ++i ){\r
683                                         ret[ i ] = _array[ i ];\r
684                                 };\r
685                                 return ret;\r
686                         },\r
687                         /*\r
688                          * \r
689                          */\r
690                         createGlobalUniqueName: function(){\r
691                                 var randomKey = null;\r
692                                 while( true ){\r
693                                         randomKey = '_uniqueName'+(''+Math.random()).replace(/\./,'');\r
694                                         if( typeof window[randomKey] === 'undefined'){\r
695                                                 break;\r
696                                         }\r
697                                 }\r
698                                 return randomKey;\r
699                         },\r
700                         createIframe: function( id, callback, hide ){\r
701                                 var ua = UA;\r
702                     var el = document.createElement( ua.isIE ? '<iframe name="' + id + '" frameborder="0" scrolling="no">' : 'iframe');\r
703         \r
704                     if( ua.isIE ){\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
710                                 };\r
711                            };\r
712                     } else {\r
713                         // iron(chrome) の場合、append の前に onload を指定しないと onload が呼ばれない\r
714                         el.onload = function(){\r
715                                                 el.onload = null;\r
716                                                 setTimeout( asynkCallback, 0 );\r
717                                         };\r
718                                 };\r
719         \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
727                     \r
728                     window[ id ] = el;\r
729 \r
730                                 function asynkCallback(){\r
731                                         callback( el );\r
732                                 };\r
733                         }\r
734                 };\r
735         })( window, document );\r
736 \r
737 \r
738 var CSS = ( function( window, documwnt, undefined ){\r
739         var     CORON                  = ':',\r
740                 EMPTY                  = '',\r
741                 SEMICORON              = ';',\r
742                 UNITS                  = 'px,cm,mm,in,pt,pc,em,%'.split( ',' ),\r
743                 CLIP_SEPARATOR         = UA.isIE === true && UA.ieVersion < 8 ? ' ' : ',';\r
744 \r
745         var SPECIAL = ( function(){\r
746                 var _special = {};\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
752                                                 data    = {},\r
753                                                 i       = filters.length,\r
754                                                 filter, names, props, prop, j, l, key, v;\r
755                                         for( ; i; ){\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
760                                                 filter   = {};\r
761                                                 for( j = 0, l = props.length; j < l; ++j ){\r
762                                                         prop = props[ j ].split( '=' );\r
763                                                         key  = prop[ 0 ].toLowerCase();\r
764                                                         v    = prop[ 1 ];\r
765                                                         filter[ key ] = v; //v.charAt( 0 ) === '#' ? v : parseInt( v );\r
766                                                 };\r
767                                                 data[ names[ names.length - 1 ] ] = filter;\r
768                                         };\r
769                                         \r
770                                         style.filter  = data;\r
771                                         style.opacity = data.alpha && data.alpha.opacity ? data.alpha.opacity / 100 : 1;\r
772                                 };\r
773                                 _special.hasLayout = function( elm ){\r
774                                         return elm.currentStyle.hasLayout;\r
775                                 };\r
776                         } else {\r
777                                 _special.opacity = null;\r
778                         };\r
779                 } else {\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
785 \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
791                                 };\r
792                         // };\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
797                                                 style.clipTop    = 0;\r
798                                                 style.clipRight  = 0;\r
799                                                 style.clipBottom = 0;\r
800                                                 style.clipLeft   = 0;\r
801                                                 return;\r
802                                         };\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
808                                 };\r
809                         };\r
810                 };\r
811                                 \r
812                 return _special;\r
813         })();\r
814 \r
815         var COLOR = ( function(){\r
816                 var ret = {}, v, name, i,\r
817                         list = [\r
818                                 '0', 'BLACK',\r
819                                 'FF0000', 'RED',\r
820                                 '00FF00', 'LIME',\r
821                                 '0000FF', 'BLUE',\r
822                                 'FFFF00', 'YELLOW',\r
823                                 '00FFFF', 'AQUA',\r
824                                 '00FFFF', 'CYAN',\r
825                                 'FF00FF', 'MAGENTA',\r
826                                 'FF00FF', 'FUCHSIA',\r
827                                 'FFFFFF', 'WHITE',\r
828                                 '008000', 'GREEN',\r
829                                 '800080', 'PURPLE',\r
830                                 '800000', 'MAROON',\r
831                                 '000080', 'NAVY',\r
832                                 '808000', 'OLIVE',\r
833                                 '008080', 'TEAL',\r
834                                 '808080', 'GRAY',\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
863                                 'FFD700', 'GOLD',\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
870                                 'CD853F', 'PERU',\r
871                                 'DEB887', 'BURLYWOOD',\r
872                                 'F5F5DC', 'BEIGE',\r
873                                 'F5DEB3', 'WHEAT',\r
874                                 'F4A460', 'SANDYBROWN',\r
875                                 'D2B48C', 'TAN',\r
876                                 'D2691E', 'CHOCOLATE',\r
877                                 'B22222', 'FIREBRICK',\r
878                                 'A52A2A', 'BROWN',\r
879                                 'FA8072', 'SALMON',\r
880                                 'FFA500', 'ORANGE',\r
881                                 'FF7F50', 'CORAL',\r
882                                 'FF6347', 'TOMATO',\r
883                                 'FF69B4', 'HOTPINK',\r
884                                 'FFC0CB', 'PINK',\r
885                                 'FF1493', 'DEEPPINK',\r
886                                 'DB7093', 'PALEVIOLETRED',\r
887                                 'EE82EE', 'VIOLET',\r
888                                 'DDA0DD', 'PLUM',\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
896                                 'FFFFF0', 'IVORY',\r
897                                 'FFFACD', 'LEMONCHIFFON'\r
898                         ];\r
899                 for( i = list.length; i; ){\r
900                         v    = list[ --i ];\r
901                         name = list[ --i ];\r
902                         ret[ name ] = parseInt( v, 16 );\r
903                 };\r
904                 return ret;\r
905         })();\r
906         \r
907         var PARAMS = ( function(){\r
908                 var ret = {};\r
909                 register( ret.percent = {},\r
910                         'marginBottom,marginLeft,marginRight,marginTop,paddingBottom,paddingLeft,paddingRight,paddingTop,fontSize,textIndent'\r
911                 );\r
912                 register( ret.offset = {},\r
913                         'height,width,bottom,left,right,top'\r
914                 );              \r
915                 register( ret.size = {},\r
916                         'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth,letterSpacing'\r
917                 );\r
918                 register( ret.color = {},\r
919                         'backgroundColor,borderBottomColor,borderLeftColor,borderRightColor,borderTopColor,color'\r
920                 );\r
921                 register( ret.region = {},\r
922                         'margin,padding,borderWidth,borderColor'\r
923                 );              \r
924                 register( ret.special = {},\r
925                         'clip,backgroundPosition,opacity,lineHeight,zIndex'\r
926                 );\r
927                 register( ret.unit = {}, 'px,cm,mm,in,pt,pc,em,%' );\r
928                 \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
933                 \r
934                 function register( obj, params ){\r
935                         params = params.split( ',' );\r
936                         for( var i=params.length; i; ) obj[ params[ --i ] ] = true;\r
937                 };\r
938                 return ret;\r
939         })();\r
940         \r
941         /*\r
942          * \r
943          */\r
944         var PropertyClass = function( name, value, unit, pxPerEm ){\r
945                 this.name    = name;\r
946                 this.value   = value;\r
947                 this.unit    = unit;\r
948                 this.pxPerEm = pxPerEm; // XXpx = 1em;\r
949         };\r
950         PropertyClass.prototype = {\r
951                 name:    '',\r
952                 value:   0,\r
953                 pxPerEm: 12, // 1em === ??px\r
954                 unit:    '',\r
955                 equal: function( prop ){\r
956                         if( this.unit === prop.unit ){\r
957                                 return this.value === prop.value;\r
958                         };\r
959                         return Math.abs( this.toPx() - prop.toPx() ) < 1;\r
960                 },\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
965                         this.unit  = u;\r
966                         if( u !== px ){\r
967                                 this.value = u === 'em' ? v / this.pxPerEm : Util.pxTo( v, u );\r
968                         };\r
969                 },\r
970                 setValue: function( v ){\r
971                         this.value = v;\r
972                 },\r
973                 getValue: function(){\r
974                         return this.value;\r
975                 },\r
976                 getOffset: function( prop ){\r
977                         return prop.value - this.value;\r
978                 },\r
979                 getUnit: function(){\r
980                         return this.unit;\r
981                 },\r
982                 getValueText: function(){\r
983                         return this.value === 0 ? '0' : this.value + this.unit;\r
984                 },\r
985                 clear: function(){\r
986                         var t = this, p;\r
987                         for( p in t ){\r
988                                 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;\r
989                                 delete t[ p ];\r
990                         };\r
991                 },\r
992                 toPx: function(){\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
998                 },\r
999                 isValid: function( t ){\r
1000                         t = t || this;\r
1001                         var n = t.name,\r
1002                                 v = t.value,\r
1003                                 u = t.unit,\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
1012                         };\r
1013                         return false;\r
1014                 }\r
1015         };\r
1016         \r
1017         /**\r
1018          * backgroundPosition, clip\r
1019          */\r
1020         var PropertyGroupClass = function( name ){\r
1021                 this.name  = name;\r
1022                 this.props = [];\r
1023                 for( var i = 1, l = arguments.length; i<l; ++i ){\r
1024                         this.props.push( arguments[ i ] );\r
1025                 };\r
1026         };\r
1027         \r
1028         /**\r
1029          * margin, padding, borderWidth, borderColor\r
1030          */\r
1031         var FrexiblePropertyClass = function( name ){\r
1032                 this.name  = name;\r
1033                 this.props = [];\r
1034                 for( var i = 1, l = arguments.length; i<l; ++i ){\r
1035                         this.props.push( arguments[ i ] );\r
1036                 };\r
1037                 // top, bottom, left, right, topbottom, leftright, all\r
1038         };\r
1039         FrexiblePropertyClass.prototype = PropertyGroupClass.prototype = {\r
1040                 name  : '',\r
1041                 equal : function( prop ){\r
1042                         var ps = this.props, i = ps.length;\r
1043                         for( ; i; ){\r
1044                                 --i;\r
1045                                 if( ps[ i ].equal( prop[ i ] ) === false ) return false;\r
1046                         };\r
1047                         return true;\r
1048                 },\r
1049                 convert : function( prop ){\r
1050                         var ps = this.props, i = ps.length;\r
1051                         for( ; i; ){\r
1052                                 --i;\r
1053                                 ps[ i ].convert( prop[ i ] );\r
1054                         };\r
1055                 },\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
1060                         };\r
1061                 },\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
1066                         };\r
1067                         return ret;\r
1068                 },\r
1069                 getOffset : function( prop ){\r
1070                         var ret = [],\r
1071                                 ps  = this.props,\r
1072                                 _ps = prop.props,\r
1073                                 i   = 0,\r
1074                                 l = ps.length;\r
1075                         for( ; i<l; ++i ){\r
1076                                 ret.push( ps[ i ].getOffset( _ps[ i ] ) );\r
1077                         };\r
1078                         return ret;\r
1079                 },\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
1084                         };\r
1085                         return ret;\r
1086                 },\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
1091                         };                      \r
1092                         if( this.name === 'clip' ){\r
1093                                 return 'rect(' + ret.join( CLIP_SEPARATOR ) + ')';\r
1094                         };\r
1095                         return ret.join( ' ' );\r
1096                 },\r
1097                 clear : function(){\r
1098                         var ps = this.props, i = ps.length;\r
1099                         for( ; i; ){\r
1100                                 ps[ --i ].clear();\r
1101                         };\r
1102                         delete this.name;\r
1103                         delete this.props;\r
1104                 },\r
1105                 isValid : function( t ){\r
1106                         t = t || this;\r
1107                         var ps = t.props, i = ps.length;\r
1108                         for( ; i; ){\r
1109                                 --i;\r
1110                                 if( ps[ i ].isValid() === false ) return false;\r
1111                         };\r
1112                         return true;\r
1113                 }\r
1114         };\r
1115 \r
1116         var ColorPropertyClass = function( name, r, g, b, pct ){\r
1117                 this.name = name;\r
1118                 this.r    = r;\r
1119                 this.g    = g;\r
1120                 this.b    = b;\r
1121                 this.pct  = pct;\r
1122         };\r
1123         ColorPropertyClass.prototype = {\r
1124                 name  : '',\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
1128                         };\r
1129                         var rgb  = this._toPct(),\r
1130                                 _rgb = prop._toPct(),\r
1131                                 i    = rgb.length;\r
1132                         for( ; i; ){\r
1133                                 --i;\r
1134                                 if( Math.abs( rgb[ i ] - _rgb[ i ] ) > 1 ) return false;\r
1135                         };\r
1136                         return true;\r
1137                 },\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
1142                         this.r  *= x;\r
1143                         this.g  *= x;\r
1144                         this.b  *= x;\r
1145                         this.pct = u;\r
1146                 },\r
1147                 setValue : function( rgb ){\r
1148                         this.r = rgb[ 0 ];\r
1149                         this.g = rgb[ 1 ];\r
1150                         this.b = rgb[ 2 ];\r
1151                 },\r
1152                 getValue : function(){\r
1153                         return [ this.r, this.g, this.b ];\r
1154                 },\r
1155                 getOffset : function( prop ){\r
1156                         return [ prop.r - this.r, prop.g - this.g, prop.b - this.b ];\r
1157                 },\r
1158                 getUnit : function(){\r
1159                         return this.pct === true ? '%' : '';\r
1160                 },\r
1161                 getValueText : function(){\r
1162                         if( this.pct === true ){\r
1163                                 return [ 'rgb(', this.r, '%,', this.g, '%,', this.b, '%)' ].join( '' );\r
1164                         };\r
1165                         var round = Math.round;\r
1166                         //return [ 'rgb(', round( this.r ), ',', round( this.g ), ',', round( this.b ), ')' ].join( '' );\r
1167                         \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
1170                 },\r
1171                 clear : function(){\r
1172                         var t = this, p;\r
1173                         for( p in t ){\r
1174                                 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;\r
1175                                 delete t[ p ];\r
1176                         };\r
1177                 },\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
1181                 },\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
1188                         };\r
1189                         return this.r <= 255 && this.g <= 255 && this.b <= 255;\r
1190                 }\r
1191         };\r
1192         \r
1193         var isString       = Type.isString,\r
1194                 isNumber       = Type.isNumber;\r
1195         var REG_UINIT      = /.*\d(\w{1,2})?/,\r
1196                 $1             = '$1',\r
1197                 px             = 'px',\r
1198                 REG_XXXXXX     = /^#[\da-fA-F]{6}?/,\r
1199                 REG_XXX        = /^#[\da-fA-F]{3}?/;\r
1200         \r
1201         var WrappedStyleClass = function( elm, style ){\r
1202                 this.elm     = elm;\r
1203                 this.style   = style;\r
1204                 this.pxPerEm = this.get( 'fontSize' ).toPx();\r
1205         };\r
1206 \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
1218                         };\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
1222                                 /*\r
1223                                 e = this.elm;\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
1233                         };\r
1234                         if( p === 'fontSize' ){ // xx-small 等\r
1235                                 v = Util.absoluteFontSizeToPx( x );\r
1236                                 if( v !== 0 ){\r
1237                                         return new PropertyClass( p, v, px, this.pxPerEm );\r
1238                                 };\r
1239                         };                      \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
1243                         };\r
1244                         if( PARAMS.size[ p ] === true ){\r
1245                                 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );\r
1246                         };\r
1247                         if( PARAMS.color[ p ] === true ){\r
1248                                 return this.getColor( x, p );\r
1249                         };\r
1250                 },\r
1251                 pxTo: function( px, unit ){\r
1252                         if( unit === 'em' ) return px / this.pxPerEm;\r
1253                         return Util.pxTo( px, unit );\r
1254                 },\r
1255                 getValue: function( x, p ){\r
1256                         if( isString( x ) === true ){\r
1257                                 return parseInt( x );\r
1258                         } else\r
1259                         if( isNumber( x ) === true ){\r
1260                                 return x;\r
1261                         };\r
1262                         return 0;\r
1263                 },\r
1264                 getUnit: function( x, p ){\r
1265                         var u;\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
1270                                 return u;\r
1271                         };\r
1272                         return px;\r
1273                 },\r
1274                 getColor: function( x, p ){\r
1275                         var rgb = COLOR[ x.toUpperCase() ],\r
1276                                 pct = false,\r
1277                                 r   = 0,\r
1278                                 g   = 0,\r
1279                                 b   = 0;\r
1280                         if( isNumber( rgb ) === true ){\r
1281                                 r = ( rgb & 0xff0000 ) >> 16;\r
1282                                 g = ( rgb & 0xff00 ) >> 8;\r
1283                                 b = ( rgb & 0xff );\r
1284                         } else\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
1290                         } else                  \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
1295                         } else\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
1302                                         pct = true;\r
1303                                 };\r
1304                         } else {\r
1305                                 r = 255;\r
1306                                 g = 255;\r
1307                                 b = 255;\r
1308                         };\r
1309                         return new ColorPropertyClass( p, r, g, b, pct );\r
1310                 },\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
1319                 all;\r
1320                         if( ret.isValid() === true ) return ret;\r
1321                         ret.clear();\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
1328                         );\r
1329                 },\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
1334                                 xy;\r
1335                         if( ret.isValid() === true ) return ret;\r
1336                         ret.clear();\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
1341                         );\r
1342                 },\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
1352                         \r
1353                         if( ret.isValid() === true ) return ret;\r
1354                         ret.clear();\r
1355                         all = this.style[ name + widthOrColor ].split( ' ' );\r
1356                         \r
1357                         for( i = 0, l=all.length; i<l; ++i ){\r
1358                                 x = all[ i ];\r
1359                                 v = this.getValue( x );\r
1360                                 u = this.getUnit( x );\r
1361                                 if( l === 4 ){\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
1366                                 } else\r
1367                                 if( l === 3 ){\r
1368                                         if( i === 0 ) top    = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );\r
1369                                         if( i === 1 ){\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
1372                                         } else\r
1373                                         if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor , v, u, this.pxPerEm );\r
1374                                 } else\r
1375                                 if( l === 2 ){\r
1376                                         if( i === 0 ){\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
1379                                         } else\r
1380                                         if( i === 1 ){\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
1383                                         };\r
1384                                 } else\r
1385                                 if( l === 1 ){\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
1390                                 };\r
1391                         };\r
1392                         return new FrexiblePropertyClass( name, top, right, bottom, left );\r
1393                 },\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
1401                                 all, x, i, l;\r
1402                         \r
1403                         if( ret.isValid() === true ) return ret;\r
1404                         ret.clear();\r
1405                         all = this.style[ name ].split( ' ' );\r
1406                         \r
1407                         for( i = 0, l = all.length; i<l; ++i ){\r
1408                                 x = all[ i ];\r
1409                                 if( l === 4 ){\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
1414                                 } else\r
1415                                 if( l === 3 ){\r
1416                                         if( i === 0 ) top    = getColor( x, name + 'Top' );\r
1417                                         if( i === 1 ){\r
1418                                                 right  = getColor( x, name + 'Right' );\r
1419                                                 left   = getColor( x, name + 'Left' );\r
1420                                         } else\r
1421                                         if( i === 2 ) bottom = getColor( x, name + 'Bottom' );\r
1422                                 } else\r
1423                                 if( l === 2 ){\r
1424                                         if( i === 0 ){\r
1425                                                 top    = getColor( x, name + 'Top' );\r
1426                                                 bottom = getColor( x, name + 'Bottom' );\r
1427                                         } else\r
1428                                         if( i === 1 ){\r
1429                                                 right  = getColor( x, name + 'Right' );\r
1430                                                 left   = getColor( x, name + 'Left' );\r
1431                                         };\r
1432                                 } else\r
1433                                 if( l === 1 ){\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
1438                                 };\r
1439                         };\r
1440                         return new FrexiblePropertyClass( name, top, right, bottom, left );\r
1441                 },\r
1442                 clear: function(){\r
1443                         var t = this, p;\r
1444                         for( p in t ){\r
1445                                 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;\r
1446                                 delete t[ p ];\r
1447                         };\r
1448                 }\r
1449         };\r
1450         function camelizeHash( obj ){\r
1451                 var p, _p;\r
1452                 for( p in obj ){\r
1453                         _p = Util.camelize( p );\r
1454                         if( _p === p ) continue;\r
1455                         obj[ _p ] = obj[ _p ] || obj[ p ];\r
1456                         delete obj[ p ];\r
1457                 };\r
1458                 return obj;\r
1459         };\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
1469                                 n     = nv.shift();\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
1474                         };\r
1475                 } else {\r
1476                         for( n in css ){\r
1477                                 if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );\r
1478                         };\r
1479                 };\r
1480 \r
1481                 if( SPECIAL.setFilters ){\r
1482                         SPECIAL.setFilters( ret );\r
1483                 } else {\r
1484                         ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;\r
1485                 };\r
1486                 \r
1487                 SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );\r
1488                 SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );\r
1489                 \r
1490                 return ret;\r
1491         };\r
1492         return {\r
1493                 getWrappedStyle: function( elm, opt_css ){\r
1494                         return new WrappedStyleClass( elm, opt_css ? camelizeHash( opt_css ) : CSS.getComputedStyle( elm ) );\r
1495                 },\r
1496                 getInlineStyle: function( _elm ){\r
1497                         return cssToObject( _elm.style.cssText );\r
1498                 },\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
1503                                         style    = {},\r
1504                                         wrapped,\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
1507                                         css, nv, n, v, i;\r
1508                                         \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
1518                                                                 style[ n ] = v;\r
1519                                                                 if( style[ property ] && style[ fontSize ] ) break;\r
1520                                                         };\r
1521                                                 };\r
1522                                 } else {\r
1523                                         if( number === false ) return obj[ property ];\r
1524                                         \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
1529                                 };\r
1530                                 \r
1531                                 wrapped = CSS.getWrappedStyle( elm, style );\r
1532                                 \r
1533                                 return wrapped.get( property );\r
1534                         };\r
1535                     } else {\r
1536                         CSS.getStyleProperty = function( elm, property ){\r
1537                                 var obj      = elm.currentStyle,\r
1538                                         style    = {},\r
1539                                         wrapped,\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
1543                                 \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
1548                                 \r
1549                                 wrapped = CSS.getWrappedStyle( elm, style );\r
1550                                 \r
1551                                 return wrapped.get( property );\r
1552                         };\r
1553                     };\r
1554                     return CSS.getStyleProperty( elm, property );\r
1555                 },\r
1556                 getComputedStyle: function( elm ){\r
1557                         /* if( window.getComputedStyle ){\r
1558                         CSS.getComputedStyle = function( elm ){\r
1559                                 return cssToObject( window.getComputedStyle( elm, '' ) );\r
1560                         };\r
1561                         } else */\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
1566                         };\r
1567                     } else {\r
1568                         CSS.getComputedStyle = function( elm ){\r
1569                                 return cssToObject( elm.currentStyle );\r
1570                         };\r
1571                     };\r
1572                     return CSS.getComputedStyle( elm );\r
1573                 },\r
1574                 toCssText: function( _css ){\r
1575                         var ret = [], v;\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
1581                                 v = _css[ p ];\r
1582                                 v && ret.push( [ Util.uncamelize( p ), v ].join( ':' ) );\r
1583                         };\r
1584                         return ret.join( ';' );\r
1585                 }\r
1586         };\r
1587         \r
1588 })( window, document );\r
1589 \r
1590 \r
1591 \r
1592 /* original:\r
1593  *   susie-t, http://d.hatena.ne.jp/susie-t/20070218/1171760841\r
1594  */\r
1595 var Position = {\r
1596         positionedOffset : function( element ){\r
1597                 var valueT  = 0,\r
1598                         valueL  = 0,\r
1599                         include = Position.isIncludeBorder,\r
1600                         minus   = Position.isMinusBodyBorder,\r
1601                         body    = document.body,\r
1602                         parent, border, p;\r
1603                 do {\r
1604                         valueT += element.offsetTop || 0;\r
1605                         valueL += element.offsetLeft || 0;\r
1606                         parent  = element.offsetParent;\r
1607                         if( !include ){\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
1614                                 };\r
1615                         };\r
1616                         if( parent === body ) break;\r
1617                         if( parent ){\r
1618                                 p = CSS.getStyleProperty( parent, 'position' );\r
1619                                 // p = CSS.getComputedStyle( parent ).position;\r
1620                                 if( p === 'relative' || p === 'absolute' ) break;\r
1621                         };\r
1622                 } while( element = parent );\r
1623                 return [ valueL, valueT ];\r
1624         },\r
1625         page : function( forElement ){\r
1626                 var valueT  = 0,\r
1627                         valueL  = 0,\r
1628                         include = Position.isIncludeBorder,\r
1629                         minus   = Position.isMinusBodyBorder,\r
1630                         body    = document.body,\r
1631                         element = forElement,\r
1632                         parent, border;\r
1633                 do {\r
1634                         valueT += element.offsetTop || 0;\r
1635                         valueL += element.offsetLeft || 0;\r
1636                         parent  = element.offsetParent;\r
1637                         if( !include ){\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
1644                                 };\r
1645                         };\r
1646                         // Safari fix\r
1647                         if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){\r
1648                                 break;  \r
1649                         };\r
1650                 } while( element = parent );\r
1651 \r
1652                 element = forElement;\r
1653                 do {\r
1654                         valueT -= element.scrollTop || 0;\r
1655                         valueL -= element.scrollLeft || 0;\r
1656                 } while( element = element.parentNode );\r
1657 \r
1658                 return [ valueL, valueT ];\r
1659         },\r
1660         getBorder : function( element ){\r
1661                 if( element === null ){\r
1662                         return [ 0, 0 ];\r
1663                 };\r
1664                 /**\r
1665                 var top        = 0,\r
1666                         left       = 0,\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
1671                 };\r
1672                 if( compStyle.borderLeftStyle !== 'none' ){\r
1673                         left = dhtmlStyle.get( 'borderLeftWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-left-width' ) );\r
1674                 };\r
1675                 */\r
1676                 var top        = 0,\r
1677                         left       = 0;\r
1678                 if( CSS.getStyleProperty( element, 'borderTopStyle' ) !== 'none' ){\r
1679                         top  = CSS.getStyleProperty( element, 'borderTopWidth' ).toPx();\r
1680                 };\r
1681                 if( CSS.getStyleProperty( element, 'borderLeftStyle' ) !== 'none' ){\r
1682                         left = CSS.getStyleProperty( element, 'borderLeftWidth' ).toPx();\r
1683                 };\r
1684                 \r
1685                 return [ left || 0, top || 0 ];\r
1686         },\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
1691                 \r
1692                 var child  = document.createElement( 'div' );\r
1693                 parent.appendChild( child );\r
1694                 var ret = child.offsetTop === 0 ? false : true;\r
1695 \r
1696                 document.body.removeChild( parent );\r
1697 \r
1698                 return ret;\r
1699         })(),\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
1703         })(),\r
1704         cumulativeOffset : function( element ){\r
1705                 if( /Konqueror|Safari|KHTML/.test( navigator.userAgent ) ){\r
1706                         Position.cumulativeOffset = function( element ){\r
1707                                 var valueT  = 0,\r
1708                                         valueL  = 0,\r
1709                                         include = Position.isIncludeBorder,\r
1710                                         minus   = Position.isMinusBodyBorder,\r
1711                                         body    = document.body,\r
1712                                         parent, border;\r
1713                                 do {\r
1714                                         valueT += element.offsetTop || 0;\r
1715                                         valueL += element.offsetLeft || 0;\r
1716                                         parent  = element.offsetParent;\r
1717                                         if( !include ){\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
1724                                                 };\r
1725                                         };\r
1726                                         if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){\r
1727                                                 break;  \r
1728                                         };\r
1729                                         element = parent;\r
1730                                 } while ( element );\r
1731                 \r
1732                                 return [ valueL, valueT ];\r
1733                         };\r
1734                 } else {\r
1735                         Position.cumulativeOffset = function( element ){\r
1736                                 var valueT  = 0,\r
1737                                         valueL  = 0,\r
1738                                         include = Position.isIncludeBorder,\r
1739                                         minus   = Position.isMinusBodyBorder,\r
1740                                         body    = document.body,\r
1741                                         parent, border;\r
1742                                 do {\r
1743                                         valueT += element.offsetTop || 0;\r
1744                                         valueL += element.offsetLeft || 0;\r
1745                                         parent  = element.offsetParent;\r
1746                                         if( !include ){\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
1753                                                 };\r
1754                                         };\r
1755                                         element = parent;\r
1756                                 } while( element );\r
1757                                 return [ valueL, valueT ];\r
1758                         };                      \r
1759                 };\r
1760                 return Position.cumulativeOffset( element );\r
1761         }\r
1762 };\r
1763 \r
1764 \r