OSDN Git Service

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