OSDN Git Service

aee98fec410dc9d45ce6a3115f77e6c16d6ad7fd
[pettanr/clientJs.git] / 0.5.x / javascripts / libs.js
1 /*\r
2  * pettanR libs.js\r
3  *   version 0.5.44\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                                 for( var j = 0; j < _nodes.length; ){\r
598                                         _node = _nodes[ j ];\r
599                                         if( _node.nodeType !== 1 || Util.hasClassName( _node, _className ) === false ){\r
600                                                 _nodes.splice( j, 1 );\r
601                                         } else {\r
602                                                 ++j;\r
603                                         };\r
604                                 };\r
605                                 return _nodes;\r
606                         },\r
607                         getChildIndex: function( _parent, _child ){\r
608                                 var _children = _parent.getElementsByTagName( _child.tagName );\r
609                                 for( var i = _children.length; i; ){\r
610                                         if( _children[ --i ] === _child ) return i;\r
611                                 };\r
612                                 return -1;\r
613                         },\r
614                         hasClassName: function( _elm, _className ){\r
615                                 var cnames  = ( _elm.className || '' ).split( ' ' ),\r
616                                         _cnames = _className.split( ' ' ),\r
617                                         cname,\r
618                                         i = _cnames.length;\r
619                                 for( ; i; ){\r
620                                         cname = _cnames[ --i ];\r
621                                         if( cname === '' ) continue;\r
622                                         if( Util.getIndex( cnames, cname ) === -1 ) return false;\r
623                                 };\r
624                                 return true;\r
625                         },\r
626                         addClass: function( _elm, _className ){\r
627                                 if( Util.hasClassName( _elm, _className ) === false ){\r
628                                         var sp = ' ';\r
629                                         var _array = ( _elm.className || '' ).replace( /\s+/g, sp ).split( sp );\r
630                                         _array.push( _className );\r
631                                         _elm.className = _array.join( sp );\r
632                                 };\r
633                         },\r
634                         removeClass: function( _elm, _className ){\r
635                                 var sp     = ' ',\r
636                                         _array = _elm.className.replace( /\s+/g, sp ).split( sp ),\r
637                                         i      = Util.getIndex( _array, _className );\r
638                                 if( i !== -1 ){\r
639                                         _array.splice( i, 1 );\r
640                                         _elm.className = _array.join( sp );\r
641                                 };\r
642                         },\r
643                         toggleClass: function( _elm, _className, _switch ){\r
644                                 if( Type.isBoolean( _switch ) === true ){\r
645                                         _switch === true ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );\r
646                                 } else {\r
647                                         Util.hasClassName( _elm, _className ) === false ? Util.addClass( _elm, _className ) : Util.removeClass( _elm, _className );\r
648                                 };\r
649                         },\r
650                         removeAllChildren: function ( _elm ){\r
651                                 while( _elm.firstChild ){\r
652                                         remove( _elm.firstChild );\r
653                                 }\r
654                                 function remove( _node ){\r
655                                         while( _node.firstChild){\r
656                                                 remove( _node.firstChild);\r
657                                         }\r
658                                         _node.parentNode && _node.parentNode.removeChild( _node);\r
659                                 }\r
660                         },\r
661                         getIndex: function( array, element ){\r
662                                 if( Array.prototype.indexof ){\r
663                                         Util.getIndex = function( array, element ){\r
664                                                 return array.indexof( element );\r
665                                         };\r
666                                 } else {\r
667                                         Util.getIndex = function( array, element ){\r
668                                                 var i = array.length;\r
669                                                 for( ; i; ){\r
670                                                         if( array[ --i ] === element ) return i;\r
671                                                 };\r
672                                                 return -1;\r
673                                         };\r
674                                 };\r
675                                 return Util.getIndex( array, element );\r
676                         },\r
677                         copyArray: function( _array ){\r
678                                 var l = _array.length,\r
679                                         ret = new Array( l ),\r
680                                         i = 0;\r
681                                 for( ; i<l; ++i ){\r
682                                         ret[ i ] = _array[ i ];\r
683                                 };\r
684                                 return ret;\r
685                         },\r
686                         /*\r
687                          * \r
688                          */\r
689                         createGlobalUniqueName: function(){\r
690                                 var randomKey = null;\r
691                                 while( true ){\r
692                                         randomKey = '_uniqueName'+(''+Math.random()).replace(/\./,'');\r
693                                         if( typeof window[randomKey] === 'undefined'){\r
694                                                 break;\r
695                                         }\r
696                                 }\r
697                                 return randomKey;\r
698                         },\r
699                         createIframe: function( id, callback, hide ){\r
700                                 var ua = UA;\r
701                     var el = document.createElement( ua.isIE ? '<iframe name="' + id + '" frameborder="0" scrolling="no">' : 'iframe');\r
702         \r
703                     if( ua.isIE ){\r
704                                         el.onreadystatechange = function(){\r
705                                 if( this.readyState === "complete" ){\r
706                                     this.onreadystatechange = new Function();\r
707                                     this.onreadystatechange = null;\r
708                                     setTimeout( asynkCallback, 0 );\r
709                                 };\r
710                            };\r
711                     } else {\r
712                         // iron(chrome) の場合、append の前に onload を指定しないと onload が呼ばれない\r
713                         el.onload = function(){\r
714                                                 el.onload = null;\r
715                                                 setTimeout( asynkCallback, 0 );\r
716                                         };\r
717                                 };\r
718         \r
719                                 document.body.appendChild( el );\r
720                     el.id = el.name = id;\r
721                     el.setAttribute( 'name', id );\r
722                     if( hide === true )el.style.cssText = 'width:1px;height:1px;visibility:hidden;position:absolute;top:1px;left:1px;';\r
723                                 // http://d.hatena.ne.jp/onozaty/20070830/p1\r
724                                 // [JavaScript]IE6ではJavaScriptで動的に作成したiframeに対してsubmitできない(IE7は未確認) ->解決\r
725                                 el.contentWindow.name = id;                                     \r
726                     \r
727                     window[ id ] = el;\r
728 \r
729                                 function asynkCallback(){\r
730                                         callback( el );\r
731                                 };\r
732                         }\r
733                 };\r
734         })( window, document );\r
735 \r
736 \r
737 var CSS = ( function( window, documwnt, undefined ){\r
738         var     CORON                  = ':',\r
739                 EMPTY                  = '',\r
740                 SEMICORON              = ';',\r
741                 UNITS                  = 'px,cm,mm,in,pt,pc,em,%'.split( ',' ),\r
742                 CLIP_SEPARATOR         = UA.isIE === true && UA.ieVersion < 8 ? ' ' : ',';\r
743 \r
744         var SPECIAL = ( function(){\r
745                 var _special = {};\r
746                 if( UA.isIE === true && UA.ieVersion < 9 ){\r
747                         if( UA.ACTIVEX === true ){\r
748                                 // _special.opacity    = 'ActiveXOpacity';\r
749                                 _special.setFilters = function( style ){\r
750                                         var filters = ( style.filter || '' ).split( ') ' ),\r
751                                                 data    = {},\r
752                                                 i       = filters.length,\r
753                                                 filter, names, props, prop, j, l, key, v;\r
754                                         for( ; i; ){\r
755                                                 filter   = filters[ --i ].split( ' ' ).join( '' ).split( '(' );\r
756                                                 if( filter.length !== 2 ) continue;\r
757                                                 names    = filter[ 0 ].split( '.' ); // progid:DXImageTransform.Microsoft.Shadow(color=#666666,direction=120,strength=9)\r
758                                                 props    = filter[ 1 ].split( ',' ); // \r
759                                                 filter   = {};\r
760                                                 for( j = 0, l = props.length; j < l; ++j ){\r
761                                                         prop = props[ j ].split( '=' );\r
762                                                         key  = prop[ 0 ].toLowerCase();\r
763                                                         v    = prop[ 1 ];\r
764                                                         filter[ key ] = v; //v.charAt( 0 ) === '#' ? v : parseInt( v );\r
765                                                 };\r
766                                                 data[ names[ names.length - 1 ] ] = filter;\r
767                                         };\r
768                                         \r
769                                         style.filter  = data;\r
770                                         style.opacity = data.alpha && data.alpha.opacity ? data.alpha.opacity / 100 : 1;\r
771                                 };\r
772                                 _special.hasLayout = function( elm ){\r
773                                         return elm.currentStyle.hasLayout;\r
774                                 };\r
775                         } else {\r
776                                 _special.opacity = null;\r
777                         };\r
778                 } else {\r
779                         var style = document.documentElement.style;\r
780                         _special.opacity = style.opacity          !== undefined ? 'opacity' : \r
781                                                         style.MozOpacity          !== undefined ? 'MozOpacity' :\r
782                                                         style.KhtmlOpacity        !== undefined ? 'KhtmlOpacity' :\r
783                                                         style[ '-khtml-opacity' ] !== undefined ? 'KhtmlOpacity' : null;\r
784 \r
785                         // if( style.backgroundPositionX === undefined ){\r
786                                 _special.setBackgroundPositionXY = function( style ){\r
787                                         var bgp = ( style.backgroundPosition || '' ).split( ' ' );\r
788                                         style.backgroundPositionX = bgp[ 0 ] || 0;\r
789                                         style.backgroundPositionY = bgp[ 1 ] || 0;\r
790                                 };\r
791                         // };\r
792                         if( style.clipTop === undefined && style[ 'clip-top' ] === undefined ){\r
793                                 _special.setClipTopRightBottomLeft = function( style ){\r
794                                         var clip = style.clip || '';\r
795                                         if( clip.indexOf( 'rect(' ) === -1 ){\r
796                                                 style.clipTop    = 0;\r
797                                                 style.clipRight  = 0;\r
798                                                 style.clipBottom = 0;\r
799                                                 style.clipLeft   = 0;\r
800                                                 return;\r
801                                         };\r
802                                         clip = clip.split( '(' )[ 1 ].split( ')' )[ 0 ].split( clip.indexOf( ',' ) !== -1 ? ',' : ' ' );\r
803                                         ret.clipTop    = clip[ 0 ];\r
804                                         ret.clipRight  = clip[ 1 ];\r
805                                         ret.clipBottom = clip[ 2 ];\r
806                                         ret.clipLeft   = clip[ 3 ];\r
807                                 };\r
808                         };\r
809                 };\r
810                                 \r
811                 return _special;\r
812         })();\r
813 \r
814         var COLOR = ( function(){\r
815                 var ret = {}, v, name,\r
816                         list = [\r
817                                 '0', 'BLACK',\r
818                                 'FF0000', 'RED',\r
819                                 '00FF00', 'LIME',\r
820                                 '0000FF', 'BLUE',\r
821                                 'FFFF00', 'YELLOW',\r
822                                 '00FFFF', 'AQUA',\r
823                                 '00FFFF', 'CYAN',\r
824                                 'FF00FF', 'MAGENTA',\r
825                                 'FF00FF', 'FUCHSIA',\r
826                                 'FFFFFF', 'WHITE',\r
827                                 '008000', 'GREEN',\r
828                                 '800080', 'PURPLE',\r
829                                 '800000', 'MAROON',\r
830                                 '000080', 'NAVY',\r
831                                 '808000', 'OLIVE',\r
832                                 '008080', 'TEAL',\r
833                                 '808080', 'GRAY',\r
834                                 'C0C0C0', 'SILVER',\r
835                                 '696969', 'DIMGRAY',\r
836                                 '708090', 'SLATEGRAY',\r
837                                 'A9A9A9', 'DARKGRAY',\r
838                                 'DCDCDC', 'GAINSBORO',\r
839                                 '191970', 'MIDNIGHTBLUE',\r
840                                 '6A5ACD', 'SLATEBLUE',\r
841                                 '0000CD', 'MEDIUMBLUE',\r
842                                 '4169E1', 'ROYALBLUE',\r
843                                 '1E90FF', 'DODGERBLUE',\r
844                                 '87CEEB', 'SKYBLUE',\r
845                                 '4682B4', 'STEELBLUE',\r
846                                 'ADD8E6', 'LIGHTBLUE',\r
847                                 'AFEEEE', 'PALETURQUOISE',\r
848                                 '40E0D0', 'TURQUOISE',\r
849                                 'E0FFFF', 'LIGHTCYAN',\r
850                                 '7FFFD4', 'AQUAMARINE',\r
851                                 '006400', 'DARKGREEN',\r
852                                 '2E8B57', 'SEAGREEN',\r
853                                 '90EE90', 'LIGHTGREEN',\r
854                                 '7FFF00', 'CHARTREUSE',\r
855                                 'ADFF2F', 'GREENYELLOW',\r
856                                 '32CD32', 'LIMEGREEN',\r
857                                 '9ACD32', 'YELLOWGREEN',\r
858                                 '6B8E23', 'OLIVEDRAB',\r
859                                 'BCB76B', 'DARKKHAKI',\r
860                                 'EEE8AA', 'PALEGOLDENROD',\r
861                                 'FFFFE0', 'LIGHTYELLOW',\r
862                                 'FFD700', 'GOLD',\r
863                                 'DAA520', 'GOLDENROD',\r
864                                 'B8860B', 'DARKGOLDENROD',\r
865                                 'BC8F8F', 'ROSYBROWN',\r
866                                 'CD5C5C', 'INDIANRED',\r
867                                 '8B4513', 'SADDLEBROWN',\r
868                                 'A0522D', 'SIENNA',\r
869                                 'CD853F', 'PERU',\r
870                                 'DEB887', 'BURLYWOOD',\r
871                                 'F5F5DC', 'BEIGE',\r
872                                 'F5DEB3', 'WHEAT',\r
873                                 'F4A460', 'SANDYBROWN',\r
874                                 'D2B48C', 'TAN',\r
875                                 'D2691E', 'CHOCOLATE',\r
876                                 'B22222', 'FIREBRICK',\r
877                                 'A52A2A', 'BROWN',\r
878                                 'FA8072', 'SALMON',\r
879                                 'FFA500', 'ORANGE',\r
880                                 'FF7F50', 'CORAL',\r
881                                 'FF6347', 'TOMATO',\r
882                                 'FF69B4', 'HOTPINK',\r
883                                 'FFC0CB', 'PINK',\r
884                                 'FF1493', 'DEEPPINK',\r
885                                 'DB7093', 'PALEVIOLETRED',\r
886                                 'EE82EE', 'VIOLET',\r
887                                 'DDA0DD', 'PLUM',\r
888                                 'DA70D6', 'ORCHILD',\r
889                                 '9400D3', 'DARKVIOLET',\r
890                                 '8A2BE2', 'BLUEVIOLET',\r
891                                 '9370DB', 'MEDIUMPURPLE',\r
892                                 'D8BFD8', 'THISTLE',\r
893                                 'E6E6FA', 'LAVENDER',\r
894                                 'FFE4E1', 'MISTYROSE',\r
895                                 'FFFFF0', 'IVORY',\r
896                                 'FFFACD', 'LEMONCHIFFON'\r
897                         ];\r
898                 for( i = list.length; i; ){\r
899                         v    = list[ --i ];\r
900                         name = list[ --i ];\r
901                         ret[ name ] = parseInt( v, 16 );\r
902                 };\r
903                 return ret;\r
904         })();\r
905         \r
906         var PARAMS = ( function(){\r
907                 var ret = {};\r
908                 register( ret.percent = {},\r
909                         'marginBottom,marginLeft,marginRight,marginTop,paddingBottom,paddingLeft,paddingRight,paddingTop,fontSize,textIndent'\r
910                 );\r
911                 register( ret.offset = {},\r
912                         'height,width,bottom,left,right,top'\r
913                 );              \r
914                 register( ret.size = {},\r
915                         'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth,letterSpacing'\r
916                 );\r
917                 register( ret.color = {},\r
918                         'backgroundColor,borderBottomColor,borderLeftColor,borderRightColor,borderTopColor,color'\r
919                 );\r
920                 register( ret.region = {},\r
921                         'margin,padding,borderWidth,borderColor'\r
922                 );              \r
923                 register( ret.special = {},\r
924                         'clip,backgroundPosition,opacity,lineHeight,zIndex'\r
925                 );\r
926                 register( ret.unit = {}, 'px,cm,mm,in,pt,pc,em,%' );\r
927                 \r
928                 register( ret.margin = {}, 'marginBottom,marginLeft,marginRight,marginTop,paddingBottom' );\r
929                 register( ret.padding = {}, 'paddingBottom,paddingLeft,paddingRight,paddingTop' );\r
930                 register( ret.borderWidth = {}, 'borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth' );\r
931                 register( ret.borderColor = {}, 'borderBottomColor,borderLeftColor,borderRightColor,borderTopColor' );\r
932                 \r
933                 function register( obj, params ){\r
934                         params = params.split( ',' );\r
935                         for( var i=params.length; i; ) obj[ params[ --i ] ] = true;\r
936                 };\r
937                 return ret;\r
938         })();\r
939         \r
940         /*\r
941          * \r
942          */\r
943         var PropertyClass = function( name, value, unit, pxPerEm ){\r
944                 this.name    = name;\r
945                 this.value   = value;\r
946                 this.unit    = unit;\r
947                 this.pxPerEm = pxPerEm; // XXpx = 1em;\r
948         };\r
949         PropertyClass.prototype = {\r
950                 name:    '',\r
951                 value:   0,\r
952                 pxPerEm: 12, // 1em === ??px\r
953                 unit:    '',\r
954                 equal: function( prop ){\r
955                         if( this.unit === prop.unit ){\r
956                                 return this.value === prop.value;\r
957                         };\r
958                         return Math.abs( this.toPx() - prop.toPx() ) < 1;\r
959                 },\r
960                 convert: function( prop ){\r
961                         var u = prop.unit, v;\r
962                         if( this.unit === u ) return;\r
963                         this.value = v = this.toPx();\r
964                         this.unit  = u;\r
965                         if( u !== px ){\r
966                                 this.value = u === 'em' ? v / this.pxPerEm : Util.pxTo( v, u );\r
967                         };\r
968                 },\r
969                 setValue: function( v ){\r
970                         this.value = v;\r
971                 },\r
972                 getValue: function(){\r
973                         return this.value;\r
974                 },\r
975                 getOffset: function( prop ){\r
976                         return prop.value - this.value;\r
977                 },\r
978                 getUnit: function(){\r
979                         return this.unit;\r
980                 },\r
981                 getValueText: function(){\r
982                         return this.value === 0 ? '0' : this.value + this.unit;\r
983                 },\r
984                 clear: function(){\r
985                         var t = this, p;\r
986                         for( p in t ){\r
987                                 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;\r
988                                 delete t[ p ];\r
989                         };\r
990                 },\r
991                 toPx: function(){\r
992                         var v = this.value, u = this.unit;\r
993                         if( u === px )   return v;\r
994                         if( u === 'em' ) return v * this.pxPerEm;\r
995                         if( u === '' && this.name === 'lineHeight' ) return v * this.pxPerEm;\r
996                         return Util.toPx( v, u );\r
997                 },\r
998                 isValid: function( t ){\r
999                         t = t || this;\r
1000                         var n = t.name,\r
1001                                 v = t.value,\r
1002                                 u = t.unit,\r
1003                                 z = u !== '' ? true : v === 0;\r
1004                         if( PARAMS.percent[ n ] === true ) return z;\r
1005                         if( PARAMS.offset[ n ] === true  ) return z;\r
1006                         if( PARAMS.size[ n ] === true  )   return z && u !== '%';\r
1007                         if( PARAMS.special[ n ] === true  ){\r
1008                                 if( n === 'lineHeight' ) return true;\r
1009                                 if( n === 'opacity' )    return 0 <= v && v <= 1 && u === '';\r
1010                                 if( n === 'zIndex'  )    return u === '';\r
1011                         };\r
1012                         return false;\r
1013                 }\r
1014         };\r
1015         \r
1016         /**\r
1017          * backgroundPosition, clip\r
1018          */\r
1019         var PropertyGroupClass = function( name ){\r
1020                 this.name  = name;\r
1021                 this.props = [];\r
1022                 for( var i = 1, l = arguments.length; i<l; ++i ){\r
1023                         this.props.push( arguments[ i ] );\r
1024                 };\r
1025         };\r
1026         \r
1027         /**\r
1028          * margin, padding, borderWidth, borderColor\r
1029          */\r
1030         var FrexiblePropertyClass = function( name ){\r
1031                 this.name  = name;\r
1032                 this.props = [];\r
1033                 for( var i = 1, l = arguments.length; i<l; ++i ){\r
1034                         this.props.push( arguments[ i ] );\r
1035                 };\r
1036                 // top, bottom, left, right, topbottom, leftright, all\r
1037         };\r
1038         FrexiblePropertyClass.prototype = PropertyGroupClass.prototype = {\r
1039                 name  : '',\r
1040                 equal : function( prop ){\r
1041                         var ps = this.props, i = ps.length;\r
1042                         for( ; i; ){\r
1043                                 --i;\r
1044                                 if( ps[ i ].equal( prop[ i ] ) === false ) return false;\r
1045                         };\r
1046                         return true;\r
1047                 },\r
1048                 convert : function( prop ){\r
1049                         var ps = this.props, i = ps.length;\r
1050                         for( ; i; ){\r
1051                                 --i;\r
1052                                 ps[ i ].convert( prop[ i ] );\r
1053                         };\r
1054                 },\r
1055                 setValue : function( ary ){\r
1056                         var ps = this.props, i = 0, l = ps.length;\r
1057                         for( ; i<l; ++i ){\r
1058                                 ps[ i ].setValue( ary[ i ] );\r
1059                         };\r
1060                 },\r
1061                 getValue : function(){\r
1062                         var ret = [], ps = this.props, i = 0, l = ps.length;\r
1063                         for( ; i<l; ++i ){\r
1064                                 ret.push( ps[ i ].getValue() );\r
1065                         };\r
1066                         return ret;\r
1067                 },\r
1068                 getOffset : function( prop ){\r
1069                         var ret = [],\r
1070                                 ps  = this.props,\r
1071                                 _ps = prop.props,\r
1072                                 i   = 0,\r
1073                                 l = ps.length;\r
1074                         for( ; i<l; ++i ){\r
1075                                 ret.push( ps[ i ].getOffset( _ps[ i ] ) );\r
1076                         };\r
1077                         return ret;\r
1078                 },\r
1079                 getUnit : function(){\r
1080                         var ret = [], ps = this.props, i = 0, l = ps.length;\r
1081                         for( ; i<l; ++i ){\r
1082                                 ret.push( ps[ i ].getUnit() );\r
1083                         };\r
1084                         return ret;\r
1085                 },\r
1086                 getValueText : function(){\r
1087                         var ret = [], ps = this.props, i = 0, l = ps.length;\r
1088                         for( ; i<l; ++i ){\r
1089                                 ret.push( ps[ i ].getValueText() );\r
1090                         };                      \r
1091                         if( this.name === 'clip' ){\r
1092                                 return 'rect(' + ret.join( CLIP_SEPARATOR ) + ')';\r
1093                         };\r
1094                         return ret.join( ' ' );\r
1095                 },\r
1096                 clear : function(){\r
1097                         var ps = this.props, i = ps.length;\r
1098                         for( ; i; ){\r
1099                                 ps[ --i ].clear();\r
1100                         };\r
1101                         delete this.name;\r
1102                         delete this.props;\r
1103                 },\r
1104                 isValid : function( t ){\r
1105                         t = t || this;\r
1106                         var ps = t.props, i = ps.length;\r
1107                         for( ; i; ){\r
1108                                 --i;\r
1109                                 if( ps[ i ].isValid() === false ) return false;\r
1110                         };\r
1111                         return true;\r
1112                 }\r
1113         };\r
1114 \r
1115         var ColorPropertyClass = function( name, r, g, b, pct ){\r
1116                 this.name = name;\r
1117                 this.r    = r;\r
1118                 this.g    = g;\r
1119                 this.b    = b;\r
1120                 this.pct  = pct;\r
1121         };\r
1122         ColorPropertyClass.prototype = {\r
1123                 name  : '',\r
1124                 equal : function( prop ){\r
1125                         if( this.pct === prop.pct ){\r
1126                                 return this.r === prop.r && this.g === prop.g && this.b === prop.b;\r
1127                         };\r
1128                         var rgb  = this._toPct(),\r
1129                                 _rgb = prop._toPct(),\r
1130                                 i    = rgb.length;\r
1131                         for( ; i; ){\r
1132                                 --i;\r
1133                                 if( Math.abs( rgb[ i ] - _rgb[ i ] ) > 1 ) return false;\r
1134                         };\r
1135                         return true;\r
1136                 },\r
1137                 convert : function( prop ){\r
1138                         var u = prop.pct, x;\r
1139                         if( this.pct === u ) return;\r
1140                         x = u === true ? 100 / 255 : 2.55;\r
1141                         this.r  *= x;\r
1142                         this.g  *= x;\r
1143                         this.b  *= x;\r
1144                         this.pct = u;\r
1145                 },\r
1146                 setValue : function( rgb ){\r
1147                         this.r = rgb[ 0 ];\r
1148                         this.g = rgb[ 1 ];\r
1149                         this.b = rgb[ 2 ];\r
1150                 },\r
1151                 getValue : function(){\r
1152                         return [ this.r, this.g, this.b ];\r
1153                 },\r
1154                 getOffset : function( prop ){\r
1155                         return [ prop.r - this.r, prop.g - this.g, prop.b - this.b ];\r
1156                 },\r
1157                 getUnit : function(){\r
1158                         return this.pct === true ? '%' : '';\r
1159                 },\r
1160                 getValueText : function(){\r
1161                         if( this.pct === true ){\r
1162                                 return [ 'rgb(', this.r, '%,', this.g, '%,', this.b, '%)' ].join( '' );\r
1163                         };\r
1164                         var round = Math.round;\r
1165                         //return [ 'rgb(', round( this.r ), ',', round( this.g ), ',', round( this.b ), ')' ].join( '' );\r
1166                         \r
1167                         var rgb   = '00000' + ( ( round( this.r ) << 16 ) + ( round( this.g ) << 8 ) + round( this.b ) ).toString( 16 );\r
1168                         return '#' + rgb.substr( rgb.length - 6 );\r
1169                 },\r
1170                 clear : function(){\r
1171                         var t = this, p;\r
1172                         for( p in t ){\r
1173                                 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;\r
1174                                 delete t[ p ];\r
1175                         };\r
1176                 },\r
1177                 _toPct : function(){\r
1178                         if( this.pct === true ) return [ this.r, this.g, this.b ];\r
1179                         return [ this.r / 2.55, this.g / 2.55, this.b / 2.55 ];\r
1180                 },\r
1181                 isValid : function( t ){\r
1182                         var isFinite = window.isFinite;\r
1183                         if( !isFinite( this.r ) || !isFinite( this.g ) || !isFinite( this.b ) ) return false;\r
1184                         if( 0 > this.r || 0 > this.g || 0 > this.b ) return false;\r
1185                         if( this.pct === true ){\r
1186                                 return this.r <= 100 && this.g <= 100 && this.b <= 100;\r
1187                         };\r
1188                         return this.r <= 255 && this.g <= 255 && this.b <= 255;\r
1189                 }\r
1190         };\r
1191         \r
1192         var isString       = Type.isString,\r
1193                 isNumber       = Type.isNumber;\r
1194         var REG_UINIT      = /.*\d(\w{1,2})?/,\r
1195                 $1             = '$1',\r
1196                 px             = 'px',\r
1197                 REG_XXXXXX     = /^#[\da-fA-F]{6}?/,\r
1198                 REG_XXX        = /^#[\da-fA-F]{3}?/;\r
1199         \r
1200         var WrappedStyleClass = function( elm, style ){\r
1201                 this.elm     = elm;\r
1202                 this.style   = style;\r
1203                 this.pxPerEm = this.get( 'fontSize' ).toPx();\r
1204         };\r
1205 \r
1206         WrappedStyleClass.prototype = {\r
1207                 get: function( p ){\r
1208                         if( PARAMS.special[ p ] === true || PARAMS.region[ p ] === true ){\r
1209                                 if( p === 'clip' )        return this.getClip();\r
1210                                 if( p === 'margin' )      return this.getMarginPaddingBorder( p );\r
1211                                 if( p === 'padding' )     return this.getMarginPaddingBorder( p );\r
1212                                 if( p === 'borderWidth' ) return this.getMarginPaddingBorder( 'border', 'Width' );\r
1213                                 if( p === 'borderColor' ) return this.getBorderColor( 'borderColor' );\r
1214                                 if( p === 'backgroundPosition' ) return this.getBackgroundPosition( p );\r
1215                                 // opacity, zindex, lineHeight\r
1216                                 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x ), this.pxPerEm );\r
1217                         };\r
1218                         var x = this.style[ p ], e, v, u;\r
1219                         if( PARAMS.offset[ p ] === true ){\r
1220                                 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );\r
1221                                 /*\r
1222                                 e = this.elm;\r
1223                                 if( p === 'width'  ) v = e.offsetWidth;\r
1224                                 if( p === 'height' ) v = e.offsetHeight;\r
1225                                 if( p === 'top'    ) v = e.offsetTop;\r
1226                                 if( p === 'bottom' ) v = e.offsetBottom;\r
1227                                 if( p === 'left'   ) v = e.offsetLeft;\r
1228                                 if( p === 'right'  ) v = e.offsetRight;\r
1229                                 u = this.getUnit( x, p );\r
1230                                 // alert( p + this.pxTo( v, u ) + u )\r
1231                                 return new PropertyClass( p, this.pxTo( v, u ), u, this.pxPerEm ); */\r
1232                         };\r
1233                         if( p === 'fontSize' ){ // xx-small 等\r
1234                                 v = Util.absoluteFontSizeToPx( x );\r
1235                                 if( v !== 0 ){\r
1236                                         return new PropertyClass( p, v, px, this.pxPerEm );\r
1237                                 };\r
1238                         };                      \r
1239                         if( PARAMS.percent[ p ] === true ){\r
1240                                 // alert( p + ' , ' + x + ' , ' + this.getUnit( x, p ) )\r
1241                                 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );\r
1242                         };\r
1243                         if( PARAMS.size[ p ] === true ){\r
1244                                 return new PropertyClass( p, this.getValue( x, p ), this.getUnit( x, p ), this.pxPerEm );\r
1245                         };\r
1246                         if( PARAMS.color[ p ] === true ){\r
1247                                 return this.getColor( x, p );\r
1248                         };\r
1249                 },\r
1250                 pxTo: function( px, unit ){\r
1251                         if( unit === 'em' ) return px / this.pxPerEm;\r
1252                         return Util.pxTo( px, unit );\r
1253                 },\r
1254                 getValue: function( x, p ){\r
1255                         if( isString( x ) === true ){\r
1256                                 return parseInt( x );\r
1257                         } else\r
1258                         if( isNumber( x ) === true ){\r
1259                                 return x;\r
1260                         };\r
1261                         return 0;\r
1262                 },\r
1263                 getUnit: function( x, p ){\r
1264                         var u;\r
1265                         if( isString( x ) === true ){\r
1266                                 u = x.replace( REG_UINIT, $1 );\r
1267                                 if( p === 'lineHeight' ) return u;\r
1268                                 if( PARAMS.unit[ u ] !== true ) return px;\r
1269                                 return u;\r
1270                         };\r
1271                         return px;\r
1272                 },\r
1273                 getColor: function( x, p ){\r
1274                         var rgb = COLOR[ x.toUpperCase() ],\r
1275                                 pct = false,\r
1276                                 r   = 0,\r
1277                                 g   = 0,\r
1278                                 b   = 0;\r
1279                         if( isNumber( rgb ) === true ){\r
1280                                 r = ( rgb & 0xff0000 ) >> 16;\r
1281                                 g = ( rgb & 0xff00 ) >> 8;\r
1282                                 b = ( rgb & 0xff );\r
1283                         } else\r
1284                         if( x.match( REG_XXXXXX ) ){\r
1285                                 r = parseInt( x.charAt( 1 ) + x.charAt( 2 ), 16 );\r
1286                                 g = parseInt( x.charAt( 3 ) + x.charAt( 4 ), 16 );\r
1287                                 b = parseInt( x.charAt( 5 ) + x.charAt( 6 ), 16 );\r
1288                                 //alert( x + ' g: ' + g )\r
1289                         } else                  \r
1290                         if( x.match( REG_XXX ) ){\r
1291                                 r = parseInt( x.charAt( 1 ) + x.charAt( 1 ), 16 );\r
1292                                 g = parseInt( x.charAt( 2 ) + x.charAt( 2 ), 16 );\r
1293                                 b = parseInt( x.charAt( 3 ) + x.charAt( 3 ), 16 );\r
1294                         } else\r
1295                         if( x.indexOf( 'rgb(' ) === 0 ){\r
1296                                 rgb = x.substr( 4 ).split( ',' );\r
1297                                 r = parseFloat( rgb[ 0 ] );\r
1298                                 g = parseFloat( rgb[ 1 ] );\r
1299                                 b = parseFloat( rgb[ 2 ] );\r
1300                                 if( x.indexOf( '%' ) !== -1 ){\r
1301                                         pct = true;\r
1302                                 };\r
1303                         } else {\r
1304                                 r = 255;\r
1305                                 g = 255;\r
1306                                 b = 255;\r
1307                         };\r
1308                         return new ColorPropertyClass( p, r, g, b, pct );\r
1309                 },\r
1310                 getClip: function( name ){\r
1311                         // rect(...)    クリップします。<top>, <bottom> は上端からの、 <right>, <left> は左端からのオフセットで指定します。Internet Explorer 4~7 では、カンマの代わりにスペースで区切る必要があります。\r
1312                         // position:absolute または position:fixed を適用した要素に対してのみ有効です。\r
1313                         var top    = this.get( name + 'Top' ),\r
1314                                 right  = this.get( name + 'Right' ),\r
1315                                 bottom = this.get( name + 'Bottom' ),\r
1316                                 left   = this.get( name + 'Left' ),\r
1317                                 ret    = new PropertyGroupClass( name, top, right, bottom, left );\r
1318                         if( ret.isValid() === true ) return ret;\r
1319                         ret.clear();\r
1320                         all    = this.style[ name ].split( '(' )[ 1 ].split( ')' )[ 0 ].split( CLIP_SEPARATOR );\r
1321                         return new PropertyGroupClass( name,\r
1322                                 new PropertyClass( name + 'Top',    all[ 0 ], px, this.pxPerEm ),\r
1323                                 new PropertyClass( name + 'Right',  all[ 1 ], px, this.pxPerEm ),\r
1324                                 new PropertyClass( name + 'Bottom', all[ 2 ], px, this.pxPerEm ),\r
1325                                 new PropertyClass( name + 'Left',   all[ 3 ], px, this.pxPerEm )\r
1326                         );\r
1327                 },\r
1328                 getBackgroundPosition: function( name ){\r
1329                         var x   = this.get( name + 'X' ),\r
1330                                 y   = this.get( name + 'Y' ),\r
1331                                 ret = new PropertyGroupClass( name, x, y ),\r
1332                                 xy;\r
1333                         if( ret.isValid() === true ) return ret;\r
1334                         ret.clear();\r
1335                         xy  = this.style[ name ].split( ' ' );\r
1336                         return new PropertyGroupClass( name,\r
1337                                 new PropertyClass( name + 'X', this.getValue( xy[ 0 ] ), this.getUnit( xy[ 0 ] ), this.pxPerEm ),\r
1338                                 new PropertyClass( name + 'Y', this.getValue( xy[ 1 ] ), this.getUnit( xy[ 1 ] ), this.pxPerEm )\r
1339                         );\r
1340                 },\r
1341                 getMarginPaddingBorder: function( name, widthOrColor ){\r
1342                         widthOrColor = widthOrColor || '';\r
1343                         var _class = PropertyClass,\r
1344                                 top    = this.get( name + 'Top' + widthOrColor ),\r
1345                                 right  = this.get( name + 'Right' + widthOrColor ),\r
1346                                 bottom = this.get( name + 'Bottom' + widthOrColor ),\r
1347                                 left   = this.get( name + 'Left' + widthOrColor ),\r
1348                                 ret    = new FrexiblePropertyClass( name, top, right, bottom, left ),\r
1349                                 all, x, v, u, i;\r
1350                         \r
1351                         if( ret.isValid() === true ) return ret;\r
1352                         ret.clear();\r
1353                         all = this.style[ name + widthOrColor ].split( ' ' );\r
1354                         \r
1355                         for( i = 0, l=all.length; i<l; ++i ){\r
1356                                 x = all[ i ];\r
1357                                 v = this.getValue( x );\r
1358                                 u = this.getUnit( x );\r
1359                                 if( l === 4 ){\r
1360                                         if( i === 0 ) top    = new _class( name + 'Top' +    widthOrColor, v, u, this.pxPerEm );\r
1361                                         if( i === 1 ) right  = new _class( name + 'Right' +  widthOrColor, v, u, this.pxPerEm );\r
1362                                         if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );\r
1363                                         if( i === 3 ) left   = new _class( name + 'Left' +   widthOrColor, v, u, this.pxPerEm );\r
1364                                 } else\r
1365                                 if( l === 3 ){\r
1366                                         if( i === 0 ) top    = new _class( name + 'Top' + widthOrColor, v, u, this.pxPerEm );\r
1367                                         if( i === 1 ){\r
1368                                                 right  = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );\r
1369                                                 left   = new _class( name + 'Left'  + widthOrColor, v, u, this.pxPerEm );\r
1370                                         } else\r
1371                                         if( i === 2 ) bottom = new _class( name + 'Bottom' + widthOrColor , v, u, this.pxPerEm );\r
1372                                 } else\r
1373                                 if( l === 2 ){\r
1374                                         if( i === 0 ){\r
1375                                                 top    = new _class( name + 'Top'    + widthOrColor, v, u, this.pxPerEm );\r
1376                                                 bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );\r
1377                                         } else\r
1378                                         if( i === 1 ){\r
1379                                                 right  = new _class( name + 'Right' + widthOrColor, v, u, this.pxPerEm );\r
1380                                                 left   = new _class( name + 'Left'  + widthOrColor, v, u, this.pxPerEm );\r
1381                                         };\r
1382                                 } else\r
1383                                 if( l === 1 ){\r
1384                                         top    = new _class( name + 'Top'    + widthOrColor, v, u, this.pxPerEm );\r
1385                                         bottom = new _class( name + 'Bottom' + widthOrColor, v, u, this.pxPerEm );\r
1386                                         right  = new _class( name + 'Right'  + widthOrColor, v, u, this.pxPerEm );\r
1387                                         left   = new _class( name + 'Left'   + widthOrColor, v, u, this.pxPerEm );\r
1388                                 };\r
1389                         };\r
1390                         return new FrexiblePropertyClass( name, top, right, bottom, left );\r
1391                 },\r
1392                 getBorderColor: function( name ){\r
1393                         var getColor = this.getColor,\r
1394                                 top      = this.get( name + 'TopColor' ),\r
1395                                 right    = this.get( name + 'RightColor' ),\r
1396                                 bottom   = this.get( name + 'BottomColor' ),\r
1397                                 left     = this.get( name + 'LeftColor' ),\r
1398                                 ret      = new FrexiblePropertyClass( name, top, right, bottom, left ),\r
1399                                 all, x, i, l;\r
1400                         \r
1401                         if( ret.isValid() === true ) return ret;\r
1402                         ret.clear();\r
1403                         all = this.style[ name ].split( ' ' );\r
1404                         \r
1405                         for( i = 0, l = all.length; i<l; ++i ){\r
1406                                 x = all[ i ];\r
1407                                 if( l === 4 ){\r
1408                                         if( i === 0 ) top    = getColor( x, name + 'Top' );\r
1409                                         if( i === 1 ) right  = getColor( x, name + 'Right' );\r
1410                                         if( i === 2 ) bottom = getColor( x, name + 'Bottom' );\r
1411                                         if( i === 3 ) left   = getColor( x, name + 'Left' );\r
1412                                 } else\r
1413                                 if( l === 3 ){\r
1414                                         if( i === 0 ) top    = getColor( x, name + 'Top' );\r
1415                                         if( i === 1 ){\r
1416                                                 right  = getColor( x, name + 'Right' );\r
1417                                                 left   = getColor( x, name + 'Left' );\r
1418                                         } else\r
1419                                         if( i === 2 ) bottom = getColor( x, name + 'Bottom' );\r
1420                                 } else\r
1421                                 if( l === 2 ){\r
1422                                         if( i === 0 ){\r
1423                                                 top    = getColor( x, name + 'Top' );\r
1424                                                 bottom = getColor( x, name + 'Bottom' );\r
1425                                         } else\r
1426                                         if( i === 1 ){\r
1427                                                 right  = getColor( x, name + 'Right' );\r
1428                                                 left   = getColor( x, name + 'Left' );\r
1429                                         };\r
1430                                 } else\r
1431                                 if( l === 1 ){\r
1432                                         top    = getColor( x, name + 'Top' );\r
1433                                         bottom = getColor( x, name + 'Bottom' );\r
1434                                         right  = getColor( x, name + 'Right' );\r
1435                                         left   = getColor( x, name + 'Left' );\r
1436                                 };\r
1437                         };\r
1438                         return new FrexiblePropertyClass( name, top, right, bottom, left );\r
1439                 },\r
1440                 clear: function(){\r
1441                         var t = this, p;\r
1442                         for( p in t ){\r
1443                                 if( t.hasOwnProperty && !t.hasOwnProperty( p ) ) continue;\r
1444                                 delete t[ p ];\r
1445                         };\r
1446                 }\r
1447         };\r
1448         function camelizeHash( obj ){\r
1449                 var p, _p;\r
1450                 for( p in obj ){\r
1451                         _p = Util.camelize( p );\r
1452                         if( _p === p ) continue;\r
1453                         obj[ _p ] = obj[ _p ] || obj[ p ];\r
1454                         delete obj[ p ];\r
1455                 };\r
1456                 return obj;\r
1457         };\r
1458         function cssToObject( css ){\r
1459                 var ret      = {}, i, nv, n, v,\r
1460                         parse    = Util.parse,\r
1461                         isNumber = Type.isNumber,\r
1462                         camelize = Util.camelize;\r
1463                 if( Type.isString( css ) === true ){\r
1464                         css = css.split( ';' );\r
1465                         for( i = css.length; i; ){\r
1466                                 nv    = css[ --i ].split( ':' ); // filter の場合, progid: がくる\r
1467                                 n     = nv.shift();\r
1468                                 if( isNumber( parse( n ) ) === true ) continue;\r
1469                                 v     = nv.join( '' );\r
1470                                 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );\r
1471                                 ret[ camelize( n ) ] = parse( v );\r
1472                         };\r
1473                 } else {\r
1474                         for( n in css ){\r
1475                                 if( Type.isNumber( parse( n ) ) === false ) ret[ n ] = parse( css[ n ] );\r
1476                         };\r
1477                 };\r
1478 \r
1479                 if( SPECIAL.setFilters ){\r
1480                         SPECIAL.setFilters( ret );\r
1481                 } else {\r
1482                         ret.opacity = SPECIAL.opacity !== null ? ret[ SPECIAL.opacity ] : 1;\r
1483                 };\r
1484                 \r
1485                 SPECIAL.setBackgroundPositionXY && SPECIAL.setBackgroundPositionXY( ret );\r
1486                 SPECIAL.setClipTopRightBottomLeft && SPECIAL.setClipTopRightBottomLeft( ret );\r
1487                 \r
1488                 return ret;\r
1489         };\r
1490         return {\r
1491                 getWrappedStyle: function( elm, opt_css ){\r
1492                         return new WrappedStyleClass( elm, opt_css ? camelizeHash( opt_css ) : CSS.getComputedStyle( elm ) );\r
1493                 },\r
1494                 getInlineStyle: function( _elm ){\r
1495                         return cssToObject( _elm.style.cssText );\r
1496                 },\r
1497                 getStyleProperty : function( elm, property ){\r
1498                     if( document.defaultView && document.defaultView.getComputedStyle ){\r
1499                         CSS.getStyleProperty = function( elm, property ){\r
1500                                 var obj      = document.defaultView.getComputedStyle( elm, '' ),\r
1501                                         style    = {},\r
1502                                         wrapped,\r
1503                                         fontSize = 'fontSize',\r
1504                                         number   = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ],\r
1505                                         css, nv, n, v, i;\r
1506                                         \r
1507                                 if( obj.cssText ){\r
1508                                                 css = obj.cssText.split( ';' );\r
1509                                                 for( i = css.length; i; ){\r
1510                                                         nv = css[ --i ].split( ':' ); // filter の場合, progid: がくる\r
1511                                                         n  = Util.camelize( nv.shift() );\r
1512                                                         if( n === property && number === false ) return nv.join( '' );\r
1513                                                         if( n === property || n === fontSize ){\r
1514                                                                 v = nv.join( '' );\r
1515                                                                 while( v.charAt( 0 ) === ' ' ) v = v.substr( 1 );\r
1516                                                                 style[ n ] = v;\r
1517                                                                 if( style[ property ] && style[ fontSize ] ) break;\r
1518                                                         };\r
1519                                                 };\r
1520                                 } else {\r
1521                                         if( number === false ) return obj[ property ];\r
1522                                         \r
1523                                         style[ property ] = obj[ property ];\r
1524                                         if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];\r
1525                                         style[ fontSize ] = obj[ fontSize ];\r
1526                                         if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];\r
1527                                 };\r
1528                                 \r
1529                                 wrapped = CSS.getWrappedStyle( elm, style );\r
1530                                 \r
1531                                 return wrapped.get( property );\r
1532                         };\r
1533                     } else {\r
1534                         CSS.getStyleProperty = function( elm, property ){\r
1535                                 var obj      = elm.currentStyle,\r
1536                                         style    = {},\r
1537                                         wrapped,\r
1538                                         fontSize = 'fontSize',\r
1539                                         number   = PARAMS.percent[ property ] || PARAMS.offset[ property ] || PARAMS.size[ property ] || PARAMS.color[ property ] || PARAMS.region[ property ] || PARAMS.special[ property ];\r
1540                                 if( number === false ) return obj[ property ];\r
1541                                 \r
1542                                 style[ property ] = obj[ property ];\r
1543                                 if( !style[ property ] ) style[ property ] = obj[ Util.uncamelize( property ) ];\r
1544                                 style[ fontSize ] = obj[ fontSize ];\r
1545                                 if( !style[ fontSize ] ) style[ fontSize ] = obj[ Util.uncamelize( fontSize ) ];\r
1546                                 \r
1547                                 wrapped = CSS.getWrappedStyle( elm, style );\r
1548                                 \r
1549                                 return wrapped.get( property );\r
1550                         };\r
1551                     };\r
1552                     return CSS.getStyleProperty( elm, property );\r
1553                 },\r
1554                 getComputedStyle: function( elm ){\r
1555                         /* if( window.getComputedStyle ){\r
1556                         CSS.getComputedStyle = function( elm ){\r
1557                                 return cssToObject( window.getComputedStyle( elm, '' ) );\r
1558                         };\r
1559                         } else */\r
1560                     if( document.defaultView && document.defaultView.getComputedStyle ){\r
1561                         CSS.getComputedStyle = function( elm ){\r
1562                                 var obj = document.defaultView.getComputedStyle( elm, '' );\r
1563                                 return cssToObject( obj.cssText || obj );\r
1564                         };\r
1565                     } else {\r
1566                         CSS.getComputedStyle = function( elm ){\r
1567                                 return cssToObject( elm.currentStyle );\r
1568                         };\r
1569                     };\r
1570                     return CSS.getComputedStyle( elm );\r
1571                 },\r
1572                 toCssText: function( _css ){\r
1573                         var ret = [], v;\r
1574                         for( var p in _css ){\r
1575                                 if( PARAMS.margin[ p ] === true && _css.margin ) continue;\r
1576                                 if( PARAMS.padding[ p ] === true && _css.padding ) continue;\r
1577                                 if( PARAMS.borderWidth[ p ] === true && _css.borderWidth ) continue;\r
1578                                 if( PARAMS.borderColor[ p ] === true && _css.borderColor ) continue;\r
1579                                 v = _css[ p ];\r
1580                                 v && ret.push( [ Util.uncamelize( p ), v ].join( ':' ) );\r
1581                         };\r
1582                         return ret.join( ';' );\r
1583                 }\r
1584         };\r
1585         \r
1586 })( window, document );\r
1587 \r
1588 \r
1589 \r
1590 /* original:\r
1591  *   susie-t, http://d.hatena.ne.jp/susie-t/20070218/1171760841\r
1592  */\r
1593 var Position = {\r
1594         positionedOffset : function( element ){\r
1595                 var valueT  = 0,\r
1596                         valueL  = 0,\r
1597                         include = Position.isIncludeBorder,\r
1598                         minus   = Position.isMinusBodyBorder,\r
1599                         body    = document.body,\r
1600                         parent, border, p;\r
1601                 do {\r
1602                         valueT += element.offsetTop || 0;\r
1603                         valueL += element.offsetLeft || 0;\r
1604                         parent  = element.offsetParent;\r
1605                         if( !include ){\r
1606                                 border  = Position.getBorder( parent );\r
1607                                 valueT += border[0];\r
1608                                 valueL += border[1];\r
1609                                 if( parent === body && minus ){\r
1610                                         valueT += border[0];\r
1611                                         valueL += border[1];\r
1612                                 };\r
1613                         };\r
1614                         if( parent === body ) break;\r
1615                         if( parent ){\r
1616                                 p = CSS.getStyleProperty( parent, 'position' );\r
1617                                 // p = CSS.getComputedStyle( parent ).position;\r
1618                                 if( p === 'relative' || p === 'absolute' ) break;\r
1619                         };\r
1620                 } while( element = parent );\r
1621                 return [ valueL, valueT ];\r
1622         },\r
1623         page : function( forElement ){\r
1624                 var valueT  = 0,\r
1625                         valueL  = 0,\r
1626                         include = Position.isIncludeBorder,\r
1627                         minus   = Position.isMinusBodyBorder,\r
1628                         body    = document.body,\r
1629                         element = forElement,\r
1630                         parent;\r
1631                 do {\r
1632                         valueT += element.offsetTop || 0;\r
1633                         valueL += element.offsetLeft || 0;\r
1634                         parent  = element.offsetParent;\r
1635                         if( !include ){\r
1636                                 border  = Position.getBorder( parent );\r
1637                                 valueT += border[1];\r
1638                                 valueL += border[0];\r
1639                                 if( parent === body && minus ){\r
1640                                         valueT += border[0];\r
1641                                         valueL += border[1];\r
1642                                 };\r
1643                         };\r
1644                         // Safari fix\r
1645                         if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){\r
1646                                 break;  \r
1647                         };\r
1648                 } while( element = parent );\r
1649 \r
1650                 element = forElement;\r
1651                 do {\r
1652                         valueT -= element.scrollTop || 0;\r
1653                         valueL -= element.scrollLeft || 0;\r
1654                 } while( element = element.parentNode );\r
1655 \r
1656                 return [ valueL, valueT ];\r
1657         },\r
1658         getBorder : function( element ){\r
1659                 if( element === null ){\r
1660                         return [ 0, 0 ];\r
1661                 };\r
1662                 /**\r
1663                 var top        = 0,\r
1664                         left       = 0,\r
1665                         dhtmlStyle = CSS.getWrappedStyle( element );\r
1666                         compStyle  = CSS.getComputedStyle( element );\r
1667                 if( compStyle.borderTopStyle !== 'none' ){\r
1668                         top = dhtmlStyle.get( 'borderTopWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-top-width' ) );\r
1669                 };\r
1670                 if( compStyle.borderLeftStyle !== 'none' ){\r
1671                         left = dhtmlStyle.get( 'borderLeftWidth' ).toPx();//parseInt( Element.getStyle( element, 'border-left-width' ) );\r
1672                 };\r
1673                 */\r
1674                 var top        = 0,\r
1675                         left       = 0;\r
1676                 if( CSS.getStyleProperty( element, 'borderTopStyle' ) !== 'none' ){\r
1677                         top  = CSS.getStyleProperty( element, 'borderTopWidth' ).toPx();\r
1678                 };\r
1679                 if( CSS.getStyleProperty( element, 'borderLeftStyle' ) !== 'none' ){\r
1680                         left = CSS.getStyleProperty( element, 'borderLeftWidth' ).toPx();\r
1681                 };\r
1682                 \r
1683                 return [ left || 0, top || 0 ];\r
1684         },\r
1685         isIncludeBorder : ( function() {\r
1686                 var parent = document.createElement( 'div' );\r
1687                 document.body.appendChild( parent );\r
1688                 parent.style.cssText = 'border:solid blue 10px; padding:0px; position:absolute; visibility:hidden;';\r
1689                 \r
1690                 var child  = document.createElement( 'div' );\r
1691                 parent.appendChild( child );\r
1692                 var ret = child.offsetTop === 0 ? false : true;\r
1693 \r
1694                 document.body.removeChild( parent );\r
1695 \r
1696                 return ret;\r
1697         })(),\r
1698         isMinusBodyBorder : ( function(){\r
1699                 return document.body.offsetTop < CSS.getWrappedStyle( document.body ).get( 'marginTop' ).toPx();\r
1700                 // return document.body.offsetTop < CSS.getStyleProperty( document.body, 'marginTop' ).toPx();  \r
1701         })(),\r
1702         cumulativeOffset : function( element ){\r
1703                 if( /Konqueror|Safari|KHTML/.test( navigator.userAgent ) ){\r
1704                         Position.cumulativeOffset = function( element ){\r
1705                                 var valueT  = 0,\r
1706                                         valueL  = 0,\r
1707                                         include = Position.isIncludeBorder,\r
1708                                         minus   = Position.isMinusBodyBorder,\r
1709                                         body    = document.body,\r
1710                                         parent, border;\r
1711                                 do {\r
1712                                         valueT += element.offsetTop || 0;\r
1713                                         valueL += element.offsetLeft || 0;\r
1714                                         parent  = element.offsetParent;\r
1715                                         if( !include ){\r
1716                                                 border = Position.getBorder( parent );\r
1717                                                 valueT += border[1];\r
1718                                                 valueL += border[0];\r
1719                                                 if( parent === body && minus ){\r
1720                                                         valueT += border[0];\r
1721                                                         valueL += border[1];\r
1722                                                 };\r
1723                                         };\r
1724                                         if( parent === body && CSS.getStyleProperty( element, 'position' ) === 'absolute' ){\r
1725                                                 break;  \r
1726                                         };\r
1727                                         element = parent;\r
1728                                 } while ( element );\r
1729                 \r
1730                                 return [ valueL, valueT ];\r
1731                         };\r
1732                 } else {\r
1733                         Position.cumulativeOffset = function( element ){\r
1734                                 var valueT  = 0,\r
1735                                         valueL  = 0,\r
1736                                         include = Position.isIncludeBorder,\r
1737                                         minus   = Position.isMinusBodyBorder,\r
1738                                         body    = document.body,\r
1739                                         parent, border;\r
1740                                 do {\r
1741                                         valueT += element.offsetTop || 0;\r
1742                                         valueL += element.offsetLeft || 0;\r
1743                                         parent  = element.offsetParent;\r
1744                                         if( !include ){\r
1745                                                 border  = Position.getBorder( parent );\r
1746                                                 valueT += border[1];\r
1747                                                 valueL += border[0];\r
1748                                                 if( parent === body && minus ){\r
1749                                                         valueT += border[0];\r
1750                                                         valueL += border[1];\r
1751                                                 };\r
1752                                         };\r
1753                                         element = parent;\r
1754                                 } while( element );\r
1755                                 return [ valueL, valueT ];\r
1756                         };                      \r
1757                 };\r
1758                 return Position.cumulativeOffset( element );\r
1759         }\r
1760 };\r
1761 \r
1762 \r