diff --git a/oss/joomla/trunk/CHANGELOG.php b/oss/joomla/trunk/CHANGELOG.php index 42738aa4..cf430fc4 100644 --- a/oss/joomla/trunk/CHANGELOG.php +++ b/oss/joomla/trunk/CHANGELOG.php @@ -1,6 +1,6 @@ Language fix or change - -> Removed ! -> Note + +-------------------- 1.5.19 Stable Release [15-July-2010] ------------------ + +15-July-2010 Mark Dexter +# [#21419] Incorrect Joomla! Community Magazine address +^ [#21421] *Credits.php update for 1.5.19 + +14-July-2010 Ian MacLennan + + [#21404] New installation language bs-BA + + [#20984] New installation language ta-IN + +14-July-2010 Louis Landry + + [#21416] Mootools 1.2.4 Upgrade Plugin + +02-June-2010 Sam Moffat + ! Line ending fix for some XML/HTML files + -------------------- 1.5.18 Stable Release [27-May-2010] ------------------ 25-May-2010 Ian MacLennan diff --git a/oss/joomla/trunk/CREDITS.php b/oss/joomla/trunk/CREDITS.php index 398dd353..32e20630 100644 --- a/oss/joomla/trunk/CREDITS.php +++ b/oss/joomla/trunk/CREDITS.php @@ -1,6 +1,6 @@ ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 16 Jul 2010 15:38:57 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:36:"Joomla 1.6 Beta 5 现已提供下载";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1163";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:408:"据 Joomla! 官方网站 2010年0712的消息,Joomla 1.6 beta5版本于今天发布了。 + +下载地址 +http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&frs_package_id=5314[/url] + +这个版本修正了 beta4 中的65个问题。这个版本仍然是开发中的版本,不建议用于正 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 16 Jul 2010 15:23:47 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:2;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:17:"Joomla FTP 备份";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1045";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:451:"Joomla 有一个备份插件名为 JoomlaPack,目前这个插件已经被更名为 "Akeeba Backup"。 + +你可以用安装插件的方式给 Joomla 进行备份。 + +至于「是否可以用 FTP 将整个 程序文件夹夹全部备份下来?」答案是可以的。 + +需要注意的是,Joomla! 和所有的 PHP 程序是一样的,分为PHP ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 12 Jul 2010 04:28:50 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:3;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:58:"Joomla 构建的网站,常常遇到需要迁移的问题";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1044";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:453:"Joomla 网站迁移与 SEF + +Joomla 构建的网站,常常遇到需要迁移的问题。 + +有下面的问题,具体描述如下: + +最近因为旧站空间开始不够用,所以另外找了一个新的网站空间,需要进行网站的备份和迁移。 + +网站迁移的过程简单说明就是,利用FileZilla FTP 把joomla 根资料夹的档案全 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 12 Jul 2010 01:08:31 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:4;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:40:"Joomla 聚合新闻中不能显示中文";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1037";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:355:"在安装了 Joomla 的默认数据库后,不管怎么修改语言文件,聚合新闻那里还是显示为英文。 + +这是因为默认数据库的安装时,代码为英文。 + +需要在实际使用的时候将代码英文修改为中文。 + +1575[/attach] ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 11 Jul 2010 03:56:21 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:34:"Joomla 显示聚合新闻时出错";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1036";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:406:"Joomla 在聚合新闻显示的时候出现 【订阅数据加载错误】 的提示。 + +这是因为该聚合新闻的地址在后台显示不正确。 + +1572[/attach] + +可以登录后台,选择组件的聚合新闻。 + +1573[/attach] + +重新修改出现错误的聚合新闻地址就可以了。 + +1574[/attach] ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 11 Jul 2010 03:28:08 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:6;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:29:"Joomla! 具有的技术特性";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1035";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:461:"*开放源代码 + +*具有大型且健全的使用及开发社群 + +*有针对注册用户提供简单的文件审核等级 + +*线上说明文件 + +*网页快取机制,可以提升忙碌网站的效能 + +*资源管理功能 + +*广告管理(广告看板功能…其它) + +*媒体(图片、档桉)上传与管理功能 + +*内容显示排程功能 + +*内容联合供稿 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 11 Jul 2010 03:03:37 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:22:"Joomla 名称的由来";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1034";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:231:"这个名称来自非洲斯瓦希里语的方言"Jumla",意思是"一起"(All together)或"as a whole"。";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 11 Jul 2010 03:00:41 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:8;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:23:"Joomla! 的优秀特点";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1033";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:465:"当然每个知名的开源码程式都会有其吸引人的优点,反之当然会有缺点。以下整理出在网路上来自使用者对Joomla!程式的喜好重点: + +1. 先进的网站技术的运用: +Joomla!应用了非常多的网站进步的新技术,像是「网站快取技术」可以加速网站的反应与效能。「RSS新闻联播与新闻读取」 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 11 Jul 2010 02:58:57 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:9;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:74:"Joomla 扩展使用的社区组件 JomSocial 將有可能是用 GPL 授权";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1032";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:435:"JomSocial 官方网站2010年05月12日消息,JomSocial的下一个版本将会使用GPL的授权规定。 + +目前JomSocial的购买方式为订阅式购买,这个改变当然希望有更多人能来使用JomSocial,也加强JomSocial未来的发展。目前JomSocial的售价是从99元美金起。 + +在Facebook爆红后,社群相关 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 11 Jul 2010 02:53:21 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:10;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:31:"Joomla! 扩展项目突破 5000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://forums.hawebs.net/computer/viewthread.php?tid=1031";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:445:"根据 Joomla 官方博客的消息,2010年5月,JED(Joomla Extensions Directory,Joomla!扩展目录)网站是所有用Joomla!的人都一定会去找扩充网站突破5千项目关卡,是一个值得分享的时间点。 + +在数年前,JED中并不设定收录的相关套件的授权限制,有许多商业扩充套件的开发者,都 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 11 Jul 2010 02:42:00 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:11;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:36:"微软携 WinCache 助力 Joomla CMS";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=928";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:408:"2010年4月27日,Open Source Matters(OSM)宣布:微软公司(Microsoft)正式签署了 JCA (Joomla! Contributor Agreement)协议 , 成为 Joomla! CMS 的代码贡献者(contributor)之一。这个合作的直接结果是:用户将在 Joomla 1.5.16 版本中体验到与微软 Internet Information ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 06 Jul 2010 20:30:36 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:12;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:31:"Joomla weblinks 组件的使用";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=927";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:449:"Weblinks 主要在 Joomla 中用于管理扩展链接。 + +在后台的组件下,你可以找到友情链接,这个部分的内容就用于管理你系统中的链接的。 + +1515[/attach] + +通过上面的入口,可以看到网站现在正在使用的链接情况。 + +可以使用点击数来查看这个链接被点击的次数。 + +1516[/attach] + +如 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 06 Jul 2010 19:50:36 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:13;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:25:"为什么要选用 Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=904";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:451:"市场上有大量的 CMS 系统可以供大家选择,我们为什么要选用 Joomla 呢?同时,我们也注意到 Joomla 已经被大量的个人、企业、非营利组织、知名公司、政府机构所采用。 + +主要原因是 Joomla 非常易于使用,如果你有基本的 Web 知识或者其他 CMS 系统的知识,只要你用过 Joomla ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 05 Jul 2010 00:12:44 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:14;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:44:"Joomla 内容管理系统 (CMS)的弱点";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=903";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:472:"有这样一个问题,为什么不是所有的人都将应用部署到内容管理系统上来呢? + +其实有下面几个点是需要考虑的。 + +1.最主要的应该是使用习惯了。当人们已经习惯于一件事物的时候,是很难促使人们做出改变的。不管这几个事物是多么的古老,人们依然很难接受新的事物和挑战。尤其是 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 04 Jul 2010 23:45:04 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:15;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:31:"内容管理系统 (CMS) 简介";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=892";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:452:"当互联网技术第一次出现的时候,创建网站,甚至是最简单的网页都需要一些专业的计算机知识和学习 HTML 语言。从这时候开始各种各样的软件被开发出来而供计算机专业人员进行使用,像我们常用的 Adobe Dreamweaver 和 Microsofte FrontPage。这些工具的诞生是创建和维护网站变 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 04 Jul 2010 07:02:56 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:16;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:44:"Mambo 的历史与 Joomla 的简要介绍";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=891";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:423:"尽管 Joomla 于 2005 年首次发行了 1.0 版。但是,Joomla 的来源可以追溯到 2001 年一个名叫 Mambo 的开源内容管理系统 (CMS) 的首次发行。Mambo 是作为 Miro Corporation of Australia 内部的 CMS 产品而被开发出来的。在 2001 年的 4月 Mambo 被首次发布到开源社区。从这 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 04 Jul 2010 05:36:35 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:17;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:34:"Joomla 默认安装界面的截图";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=890";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:214:"下面的界面是 Joomla 默认模板的安装界面。 + +虽然有点简陋,但是也显得比较清爽。 + +1511[/attach]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:10:"honeymoose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 04 Jul 2010 05:34:54 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:18;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:36:"Joomla 1.6 Beta 4 现已提供下载";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=880";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:413:"Joomla 项目小组近期宣布, Joomla 1.6 beta 4 目前已经开始提供下载了。 + +下载链接如下: + +http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&frs_package_id=5300[/url] + +请注意: +Beta 版本不适用于任何生产系统,只供评估和测试使用。请不要在你当 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:9:"huyucheng";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 03 Jul 2010 02:47:59 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:19;a:6:{s:4:"data";s:47:" + + + + + + + ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:6:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:38:"新版的 Joomla 社区杂志已发布";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://forums.hawebs.net/computer/viewthread.php?tid=879";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:439:"在众多 Joomla 社区志愿者的数月艰苦劳动下,今天,我们自豪的宣布,新的 Joomla 社区杂志已经发布了。 + +你可以通过单击新杂志的链接来翻阅 JCM。 + +这个链接在 Joomla 社区上能找到,或者通过直接单击下面的链接 + +http://magazine.joomla.org[/url] + +Joomla 社区杂志将会每月 ...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:6:"Joomla";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"author";a:1:{i:0;a:5:{s:4:"data";s:9:"huyucheng";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 03 Jul 2010 02:37:06 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}s:27:"http://www.w3.org/2005/Atom";a:1:{s:4:"link";a:2:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:1:{s:0:"";a:3:{s:3:"rel";s:4:"self";s:4:"type";s:19:"application/rss+xml";s:4:"href";s:38:"http://feeds.feedburner.com/Oss-Joomla";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:1:{s:0:"";a:2:{s:3:"rel";s:3:"hub";s:4:"href";s:32:"http://pubsubhubbub.appspot.com/";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:42:"http://rssnamespace.org/feedburner/ext/1.0";a:1:{s:4:"info";a:1:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:1:{s:0:"";a:1:{s:3:"uri";s:10:"oss-joomla";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:10:{s:13:"last-modified";s:29:"Fri, 16 Jul 2010 18:51:02 GMT";s:4:"etag";s:27:"W7olqcjzUgBs7W2JJH304UT/+jo";s:12:"content-type";s:23:"text/xml; charset=UTF-8";s:4:"date";s:29:"Fri, 16 Jul 2010 18:51:02 GMT";s:7:"expires";s:29:"Fri, 16 Jul 2010 18:51:02 GMT";s:13:"cache-control";s:18:"private, max-age=0";s:22:"x-content-type-options";s:7:"nosniff";s:16:"x-xss-protection";s:13:"1; mode=block";s:6:"server";s:3:"GSE";s:17:"transfer-encoding";s:7:"chunked";}s:5:"build";s:14:"20090627192103";} \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_cpanel/admin.cpanel.php b/oss/joomla/trunk/administrator/components/com_cpanel/admin.cpanel.php index 2ea58144..a295866b 100644 --- a/oss/joomla/trunk/administrator/components/com_cpanel/admin.cpanel.php +++ b/oss/joomla/trunk/administrator/components/com_cpanel/admin.cpanel.php @@ -1,6 +1,6 @@ getUserState('com_cpanel.mtupgrade.checked')) { + + // If it is not enabled, let's check to see if it is even installed. + $db = &JFactory::getDBO(); + $db->setQuery( + 'SELECT id' . + ' FROM #__plugins' . + ' WHERE folder = "system"' . + ' AND element = "mtupgrade"' + ); + $exists = (bool) $db->loadResult(); + + // If it is not installed, install it as disabled and raise a notice. + if (!$exists) { + $plg = & JTable::getInstance('plugin'); + $plg->name = 'System - Mootools Upgrade'; + $plg->ordering = 0; + $plg->folder = 'system'; + $plg->iscore = 0; + $plg->access = 0; + $plg->client_id = 0; + $plg->element = 'mtupgrade'; + $plg->published = 0; + + // If unable to store the plugin, raise a notice. + if (!$plg->store()) { + JError::raiseNotice(500, $plg->getError() /*JText::sprintf('Unable to auto-install the Mootools Upgrade plugin.', $plg->getError())*/); + } + // Show a message stating that the plugin is now available. + else { + //$app->enqueueMessage(JText::_('Mootools Upgrade plugin available.')); + } + } + + // Set the mtupgrade plugin checked flag for the session. + $app->setUserState('com_cpanel.mtupgrade.checked', true); + } + + + } + //set the component specific template file in the request JRequest::setVar('tmpl', 'cpanel'); HTML_cpanel::display(); diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.banners.html b/oss/joomla/trunk/administrator/help/en-GB/screen.banners.html index c3e4452a..75e266bb 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.banners.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.banners.html @@ -1,14 +1,14 @@ - - - -Banner Manager - - - - - -

Banner Manager

+ + + +Banner Manager + + + + + +

Banner Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.categories.html b/oss/joomla/trunk/administrator/help/en-GB/screen.categories.html index e6e217be..bd5dfff7 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.categories.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.categories.html @@ -1,14 +1,14 @@ - - - -Category Manager - - - - - -

Category Manager

+ + + +Category Manager + + + + + +

Category Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.checkin.html b/oss/joomla/trunk/administrator/help/en-GB/screen.checkin.html index f4485218..56c9831b 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.checkin.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.checkin.html @@ -1,14 +1,14 @@ - - - -Global Check-in - - - - - -

Global Check-in

+ + + +Global Check-in + + + + + +

Global Check-in

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.config.html b/oss/joomla/trunk/administrator/help/en-GB/screen.config.html index 0be0217a..f0fdb876 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.config.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.config.html @@ -1,14 +1,14 @@ - - - -Global Configuration - - - - - -

Global Configuration

+ + + +Global Configuration + + + + + +

Global Configuration

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.contactmanager.html b/oss/joomla/trunk/administrator/help/en-GB/screen.contactmanager.html index 493ac339..c7f78198 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.contactmanager.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.contactmanager.html @@ -1,14 +1,14 @@ - - - -Contact Manager - - - - - -

Contact Manager

-

The local copy of this help file is no longer maintained. Please use the online version.

- + + + +Contact Manager + + + + + +

Contact Manager

+

The local copy of this help file is no longer maintained. Please use the online version.

+ diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.content.html b/oss/joomla/trunk/administrator/help/en-GB/screen.content.html index 002dfdf6..1889c364 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.content.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.content.html @@ -1,14 +1,14 @@ - - - -Article Manager - - - - - -

Article Manager

+ + + +Article Manager + + + + + +

Article Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.cpanel.html b/oss/joomla/trunk/administrator/help/en-GB/screen.cpanel.html index d6dd3e45..9bc4274f 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.cpanel.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.cpanel.html @@ -1,14 +1,14 @@ - - - -Control Panel - - - - - -

Control Panel

+ + + +Control Panel + + + + + +

Control Panel

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.frontpage.html b/oss/joomla/trunk/administrator/help/en-GB/screen.frontpage.html index ec5f5b31..d49186cd 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.frontpage.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.frontpage.html @@ -1,14 +1,14 @@ - - - -Frontpage Manager - - - - - -

Frontpage Manager

+ + + +Frontpage Manager + + + + + +

Frontpage Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.languages.html b/oss/joomla/trunk/administrator/help/en-GB/screen.languages.html index 2685b202..995715bd 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.languages.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.languages.html @@ -1,14 +1,14 @@ - - - -Language Manager - - - - - -

Language Manager

+ + + +Language Manager + + + + + +

Language Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.mediamanager.html b/oss/joomla/trunk/administrator/help/en-GB/screen.mediamanager.html index 928cfb16..5d25cf52 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.mediamanager.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.mediamanager.html @@ -1,14 +1,14 @@ - - - -Media Manager - - - - - -

Media Manager

+ + + +Media Manager + + + + + +

Media Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.menumanager.html b/oss/joomla/trunk/administrator/help/en-GB/screen.menumanager.html index b9534689..77bbf225 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.menumanager.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.menumanager.html @@ -1,14 +1,14 @@ - - - -Menu Manager - - - - - -

Menu Manager

+ + + +Menu Manager + + + + + +

Menu Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.modules.edit.html b/oss/joomla/trunk/administrator/help/en-GB/screen.modules.edit.html index 65d544b6..384f8af3 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.modules.edit.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.modules.edit.html @@ -1,14 +1,14 @@ - - - -Module - Edit - - - - - -

Module - Edit

-

The local copy of this help file is no longer maintained. Please use the online version.

- + + + +Module - Edit + + + + + +

Module - Edit

+

The local copy of this help file is no longer maintained. Please use the online version.

+ diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.modules.html b/oss/joomla/trunk/administrator/help/en-GB/screen.modules.html index 41046f80..ab4a09f2 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.modules.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.modules.html @@ -1,14 +1,14 @@ - - - -Module Manager - - - - - -

Module Manager

-

The local copy of this help file is no longer maintained. Please use the online version.

- + + + +Module Manager + + + + + +

Module Manager

+

The local copy of this help file is no longer maintained. Please use the online version.

+ diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.modules.new.html b/oss/joomla/trunk/administrator/help/en-GB/screen.modules.new.html index 49349c8c..fad3b881 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.modules.new.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.modules.new.html @@ -1,14 +1,14 @@ - - - -Module - New - - - - - -

Module - New

-

The local copy of this help file is no longer maintained. Please use the online version.

- + + + +Module - New + + + + + +

Module - New

+

The local copy of this help file is no longer maintained. Please use the online version.

+ diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.newsfeeds.html b/oss/joomla/trunk/administrator/help/en-GB/screen.newsfeeds.html index 0e8b5dc9..eb2a3b5b 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.newsfeeds.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.newsfeeds.html @@ -1,14 +1,14 @@ - - - -News Feeds Manager - - - - - -

News Feeds Manager

+ + + +News Feeds Manager + + + + + +

News Feeds Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.plugins.html b/oss/joomla/trunk/administrator/help/en-GB/screen.plugins.html index 1763e904..ef5c7f54 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.plugins.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.plugins.html @@ -1,14 +1,14 @@ - - - -Plugin Manager - - - - - -

Plugin Manager

-

The local copy of this help file is no longer maintained. Please use the online version.

- + + + +Plugin Manager + + + + + +

Plugin Manager

+

The local copy of this help file is no longer maintained. Please use the online version.

+ diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.polls.html b/oss/joomla/trunk/administrator/help/en-GB/screen.polls.html index d89712e3..bc5e7e30 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.polls.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.polls.html @@ -1,14 +1,14 @@ - - - -Poll Manager - - - - - -

Poll Manager

+ + + +Poll Manager + + + + + +

Poll Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.sections.html b/oss/joomla/trunk/administrator/help/en-GB/screen.sections.html index 9c1cfae6..8d45d5e7 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.sections.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.sections.html @@ -1,14 +1,14 @@ - - - -Section Manager - - - - - -

Section Manager

+ + + +Section Manager + + + + + +

Section Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.stats.searches.html b/oss/joomla/trunk/administrator/help/en-GB/screen.stats.searches.html index 2a846337..fb4c6fbb 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.stats.searches.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.stats.searches.html @@ -1,14 +1,14 @@ - - - -Search Statistics - - - - - -

Search Statistics

+ + + +Search Statistics + + + + + +

Search Statistics

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.system.info.html b/oss/joomla/trunk/administrator/help/en-GB/screen.system.info.html index bfc17c09..54abd984 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.system.info.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.system.info.html @@ -1,14 +1,14 @@ - - - -System Information - - - - - -

System Information

+ + + +System Information + + + + + +

System Information

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.templates.html b/oss/joomla/trunk/administrator/help/en-GB/screen.templates.html index e0b3f2cc..f7f52965 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.templates.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.templates.html @@ -1,14 +1,14 @@ - - - -Template Manager - - - - - -

Template Manager

+ + + +Template Manager + + + + + +

Template Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.trashmanager.html b/oss/joomla/trunk/administrator/help/en-GB/screen.trashmanager.html index 293e44f1..e9ab7cbf 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.trashmanager.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.trashmanager.html @@ -1,14 +1,14 @@ - - - -Trash Manager - - - - - -

Trash Manager

+ + + +Trash Manager + + + + + +

Trash Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.users.edit.html b/oss/joomla/trunk/administrator/help/en-GB/screen.users.edit.html index d1ee6fed..7bdecc09 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.users.edit.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.users.edit.html @@ -1,14 +1,14 @@ - - - -User Manager - Add or Edit Users - - - - - -

User Manager - Add or Edit Users

+ + + +User Manager - Add or Edit Users + + + + + +

User Manager - Add or Edit Users

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.users.massmail.html b/oss/joomla/trunk/administrator/help/en-GB/screen.users.massmail.html index 5a7e67d6..a025ef89 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.users.massmail.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.users.massmail.html @@ -1,14 +1,14 @@ - - - -Mass Mail Users - - - - - -

Mass Mail Users

+ + + +Mass Mail Users + + + + + +

Mass Mail Users

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.edit.html b/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.edit.html index 4383c274..4335ed29 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.edit.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.edit.html @@ -1,14 +1,14 @@ - - - -Web Link Manager : New / Edit - - - - - -

Web Link Manager : New / Edit

+ + + +Web Link Manager : New / Edit + + + + + +

Web Link Manager : New / Edit

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.html b/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.html index 1dab762e..3257c42c 100644 --- a/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.html +++ b/oss/joomla/trunk/administrator/help/en-GB/screen.weblink.html @@ -1,14 +1,14 @@ - - - -Web Link Manager - - - - - -

Web Link Manager

+ + + +Web Link Manager + + + + + +

Web Link Manager

The local copy of this help file is no longer maintained. Please use the online version.

- + diff --git a/oss/joomla/trunk/components/com_contact/metadata.xml b/oss/joomla/trunk/components/com_contact/metadata.xml index a88555c6..588de837 100644 --- a/oss/joomla/trunk/components/com_contact/metadata.xml +++ b/oss/joomla/trunk/components/com_contact/metadata.xml @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/oss/joomla/trunk/components/com_contact/views/contact/tmpl/default.xml b/oss/joomla/trunk/components/com_contact/views/contact/tmpl/default.xml index edc44511..247c887d 100644 --- a/oss/joomla/trunk/components/com_contact/views/contact/tmpl/default.xml +++ b/oss/joomla/trunk/components/com_contact/views/contact/tmpl/default.xml @@ -1,5 +1,5 @@ - + @@ -23,4 +23,4 @@ - \ No newline at end of file + diff --git a/oss/joomla/trunk/components/com_content/views/article/tmpl/default.xml b/oss/joomla/trunk/components/com_content/views/article/tmpl/default.xml index 668854f2..94886993 100644 --- a/oss/joomla/trunk/components/com_content/views/article/tmpl/default.xml +++ b/oss/joomla/trunk/components/com_content/views/article/tmpl/default.xml @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/oss/joomla/trunk/components/com_content/views/article/tmpl/form.xml b/oss/joomla/trunk/components/com_content/views/article/tmpl/form.xml index 1323ee29..522e0d97 100644 --- a/oss/joomla/trunk/components/com_content/views/article/tmpl/form.xml +++ b/oss/joomla/trunk/components/com_content/views/article/tmpl/form.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/oss/joomla/trunk/components/com_user/views/login/tmpl/default.xml b/oss/joomla/trunk/components/com_user/views/login/tmpl/default.xml index 4fe5dbb4..7c6c7539 100644 --- a/oss/joomla/trunk/components/com_user/views/login/tmpl/default.xml +++ b/oss/joomla/trunk/components/com_user/views/login/tmpl/default.xml @@ -52,4 +52,4 @@ - \ No newline at end of file + diff --git a/oss/joomla/trunk/components/com_weblinks/views/weblink/tmpl/form.xml b/oss/joomla/trunk/components/com_weblinks/views/weblink/tmpl/form.xml index 3708b9b2..95d319f4 100644 --- a/oss/joomla/trunk/components/com_weblinks/views/weblink/tmpl/form.xml +++ b/oss/joomla/trunk/components/com_weblinks/views/weblink/tmpl/form.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/oss/joomla/trunk/libraries/joomla/version.php b/oss/joomla/trunk/libraries/joomla/version.php index b10ed3bb..6c22bd3b 100644 --- a/oss/joomla/trunk/libraries/joomla/version.php +++ b/oss/joomla/trunk/libraries/joomla/version.php @@ -1,6 +1,6 @@ - * @copyright Author - */ -var SqueezeBox = { - - presets: { - size: {x: 600, y: 450}, - sizeLoading: {x: 200, y: 150}, - marginInner: {x: 20, y: 20}, - marginImage: {x: 150, y: 200}, - handler: false, - adopt: null, - closeWithOverlay: true, - zIndex: 65555, - overlayOpacity: 0.7, - classWindow: '', - classOverlay: '', - disableFx: false, - onOpen: Class.empty, - onClose: Class.empty, - onUpdate: Class.empty, - onResize: Class.empty, - onMove: Class.empty, - onShow: Class.empty, - onHide: Class.empty, - fxOverlayDuration: 250, - fxResizeDuration: 750, - fxContentDuration: 250, - ajaxOptions: {} - }, - - initialize: function(options) { - if (this.options) return this; - this.presets = $merge(this.presets, options) - this.setOptions(this.presets); - this.build(); - this.listeners = { - window: this.reposition.bind(this, [null]), - close: this.close.bind(this), - key: this.onkeypress.bind(this)}; - this.isOpen = this.isLoading = false; - this.window.close = this.listeners.close; - return this; - }, - - build: function() { - this.overlay = new Element('div', { - id: 'sbox-overlay', - styles: { - display: 'none', - zIndex: this.options.zIndex - } - }); - this.content = new Element('div', { - id: 'sbox-content' - }); - this.btnClose = new Element('a', { - id: 'sbox-btn-close', - href: '#' - }); - this.window = new Element('div', { - id: 'sbox-window', - styles: { - display: 'none', - zIndex: this.options.zIndex + 2 - } - }).adopt(this.btnClose, this.content); - - if (!window.ie6) { - this.overlay.setStyles({ - position: 'fixed', - top: 0, - left: 0 - }); - this.window.setStyles({ - position: 'fixed', - top: '50%', - left: '50%' - }); - } else { - this.overlay.style.setExpression('marginTop', 'document.documentElement.scrollTop + "px"'); - this.window.style.setExpression('marginTop', '0 - parseInt(this.offsetHeight / 2) + document.documentElement.scrollTop + "px"'); - - this.overlay.setStyles({ - position: 'absolute', - top: '0%', - left: '0%' - //,marginTop: "expression(document.documentElement.scrollTop + 'px')" - }); - - this.window.setStyles({ - position: 'absolute', - top: '0%', - left: '0%' - //,marginTop: "(expression(0 - parseInt(this.offsetHeight / 2) + document.documentElement.scrollTop + 'px')" - }); - } - - $(document.body).adopt(this.overlay, this.window); - - this.fx = { - overlay: this.overlay.effect('opacity', { - duration: this.options.fxOverlayDuration, - wait: false}).set(0), - window: this.window.effects({ - duration: this.options.fxResizeDuration, - wait: false}), - content: this.content.effect('opacity', { - duration: this.options.fxContentDuration, - wait: false}).set(0) - }; - }, - - addClick: function(el) { - return el.addEvent('click', function() { - if (this.fromElement(el)) return false; - }.bind(this)); - }, - - fromElement: function(el, options) { - this.initialize(); - this.element = $(el); - if (this.element && this.element.rel) options = $merge(options || {}, Json.evaluate(this.element.rel)); - this.setOptions(this.presets, options); - this.assignOptions(); - this.url = (this.element ? (this.options.url || this.element.href) : el) || ''; - - if (this.options.handler) { - var handler = this.options.handler; - return this.setContent(handler, this.parsers[handler].call(this, true)); - } - var res = false; - for (var key in this.parsers) { - if ((res = this.parsers[key].call(this))) return this.setContent(key, res); - } - return this; - }, - - assignOptions: function() { - this.overlay.setProperty('class', this.options.classOverlay); - this.window.setProperty('class', this.options.classWindow); - }, - - close: function(e) { - if (e) new Event(e).stop(); - if (!this.isOpen) return this; - this.fx.overlay.start(0).chain(this.toggleOverlay.bind(this)); - this.window.setStyle('display', 'none'); - this.trashImage(); - this.toggleListeners(); - this.isOpen = null; - this.fireEvent('onClose', [this.content]).removeEvents(); - this.options = {}; - this.setOptions(this.presets).callChain(); - return this; - }, - - onError: function() { - if (this.image) this.trashImage(); - this.setContent('Error during loading'); - }, - - trashImage: function() { - if (this.image) this.image = this.image.onload = this.image.onerror = this.image.onabort = null; - }, - - setContent: function(handler, content) { - this.content.setProperty('class', 'sbox-content-' + handler); - this.applyTimer = this.applyContent.delay(this.fx.overlay.options.duration, this, [this.handlers[handler].call(this, content)]); - if (this.overlay.opacity) return this; - this.toggleOverlay(true); - this.fx.overlay.start(this.options.overlayOpacity); - this.reposition(); - return this; - }, - - applyContent: function(content, size) { - this.applyTimer = $clear(this.applyTimer); - this.hideContent(); - if (!content) this.toggleLoading(true); - else { - if (this.isLoading) this.toggleLoading(false); - this.fireEvent('onUpdate', [this.content], 20); - } - this.content.empty()[['string', 'array', false].contains($type(content)) ? 'setHTML' : 'adopt'](content || ''); - this.callChain(); - if (!this.isOpen) { - this.toggleListeners(true); - this.resize(size, true); - this.isOpen = true; - this.fireEvent('onOpen', [this.content]); - } else this.resize(size); - }, - - resize: function(size, instantly) { - var sizes = window.getSize(); - this.size = $merge(this.isLoading ? this.options.sizeLoading : this.options.size, size); - var to = { - width: this.size.x, - height: this.size.y, - marginLeft: - this.size.x / 2, - marginTop: - this.size.y / 2 - //left: (sizes.scroll.x + (sizes.size.x - this.size.x - this.options.marginInner.x) / 2).toInt(), - //top: (sizes.scroll.y + (sizes.size.y - this.size.y - this.options.marginInner.y) / 2).toInt() - }; - $clear(this.showTimer || null); - this.hideContent(); - if (!instantly) this.fx.window.start(to).chain(this.showContent.bind(this)); - else { - this.window.setStyles(to).setStyle('display', ''); - this.showTimer = this.showContent.delay(50, this); - } - this.reposition(sizes); - }, - - toggleListeners: function(state) { - var task = state ? 'addEvent' : 'removeEvent'; - this.btnClose[task]('click', this.listeners.close); - if (this.options.closeWithOverlay) this.overlay[task]('click', this.listeners.close); - document[task]('keydown', this.listeners.key); - window[task]('resize', this.listeners.window); - window[task]('scroll', this.listeners.window); - }, - - toggleLoading: function(state) { - this.isLoading = state; - this.window[state ? 'addClass' : 'removeClass']('sbox-loading'); - if (state) this.fireEvent('onLoading', [this.window]); - }, - - toggleOverlay: function(state) { - this.overlay.setStyle('display', state ? '' : 'none'); - $(document.body)[state ? 'addClass' : 'removeClass']('body-overlayed'); - }, - - showContent: function() { - if (this.content.opacity) this.fireEvent('onShow', [this.window]); - this.fx.content.start(1); - }, - - hideContent: function() { - if (!this.content.opacity) this.fireEvent('onHide', [this.window]); - this.fx.content.stop().set(0); - }, - - onkeypress: function(e) { - switch (e.key) { - case 'esc': - case 'x': - this.close(); - break; - } - }, - - reposition: function(sizes) { - sizes = sizes || window.getSize(); - this.overlay.setStyles({ - //'left': sizes.scroll.x, 'top': sizes.scroll.y, - width: sizes.size.x, - height: sizes.size.y - }); - /* - this.window.setStyles({ - left: (sizes.scroll.x + (sizes.size.x - this.window.offsetWidth) / 2).toInt(), - top: (sizes.scroll.y + (sizes.size.y - this.window.offsetHeight) / 2).toInt() - }); - */ - this.fireEvent('onMove', [this.overlay, this.window, sizes]); - }, - - removeEvents: function(type){ - if (!this.$events) return this; - if (!type) this.$events = null; - else if (this.$events[type]) this.$events[type] = null; - return this; - }, - - parsers: { - 'image': function(preset) { - return (preset || this.url.test(/\.(jpg|jpeg|png|gif|bmp)$/i)) ? this.url : false; - }, - 'adopt': function(preset) { - if ($(this.options.adopt)) return $(this.options.adopt); - if (preset || ($(this.element) && !this.element.parentNode)) return $(this.element); - var bits = this.url.match(/#([\w-]+)$/); - return bits ? $(bits[1]) : false; - }, - 'url': function(preset) { - return (preset || (this.url && !this.url.test(/^javascript:/i))) ? this.url: false; - }, - 'iframe': function(preset) { - return (preset || this.url) ? this.url: false; - }, - 'string': function(preset) { - return true; - } - }, - - handlers: { - 'image': function(url) { - this.image = new Image(); - var events = { - loaded: function() { - var win = {x: window.getWidth() - this.options.marginImage.x, y: window.getHeight() - this.options.marginImage.y}; - var size = {x: this.image.width, y: this.image.height}; - for (var i = 0; i < 2; i++) - if (size.x > win.x) { - size.y *= win.x / size.x; - size.x = win.x; - } else if (size.y > win.y) { - size.x *= win.y / size.y; - size.y = win.y; - } - size = {x: parseInt(size.x), y: parseInt(size.y)}; - if (window.webkit419) this.image = new Element('img', {'src': this.image.src}); - else $(this.image); - this.image.setProperties({ - 'width': size.x, - 'height': size.y}); - this.applyContent(this.image, size); - }.bind(this), - failed: this.onError.bind(this) - }; - (function() { - this.src = url; - }).delay(10, this.image); - this.image.onload = events.loaded; - this.image.onerror = this.image.onabort = events.failed; - }, - 'adopt': function(el) { - return el.clone(); - }, - 'url': function(url) { - this.ajax = new Ajax(url, this.options.ajaxOptions); - this.ajax.addEvent('onSuccess', function(resp) { - this.applyContent(resp); - this.ajax = null; - }.bind(this)); - this.ajax.addEvent('onFailure', this.onError.bind(this)); - this.ajax.request.delay(10, this.ajax); - }, - 'iframe': function(url) { - return new Element('iframe', { - 'src': url, - 'frameBorder': 0, - 'width': this.options.size.x, - 'height': this.options.size.y - }); - }, - 'string': function(str) { - return str; - } - }, - - extend: $extend -}; - -SqueezeBox.extend(Events.prototype); -SqueezeBox.extend(Options.prototype); -SqueezeBox.extend(Chain.prototype); \ No newline at end of file +/** + * SqueezeBox - Expandable Lightbox + * + * Allows to open various content as modal, + * centered and animated box. + * + * Inspired by + * ... Lokesh Dhakar - The original Lightbox v2 + * ... Cody Lindley - ThickBox + * + * @version 1.0rc1 + * + * @license MIT-style license + * @author Harald Kirschner + * @copyright Author + */ +var SqueezeBox = { + + presets: { + size: {x: 600, y: 450}, + sizeLoading: {x: 200, y: 150}, + marginInner: {x: 20, y: 20}, + marginImage: {x: 150, y: 200}, + handler: false, + adopt: null, + closeWithOverlay: true, + zIndex: 65555, + overlayOpacity: 0.7, + classWindow: '', + classOverlay: '', + disableFx: false, + onOpen: Class.empty, + onClose: Class.empty, + onUpdate: Class.empty, + onResize: Class.empty, + onMove: Class.empty, + onShow: Class.empty, + onHide: Class.empty, + fxOverlayDuration: 250, + fxResizeDuration: 750, + fxContentDuration: 250, + ajaxOptions: {} + }, + + initialize: function(options) { + if (this.options) return this; + this.presets = $merge(this.presets, options) + this.setOptions(this.presets); + this.build(); + this.listeners = { + window: this.reposition.bind(this, [null]), + close: this.close.bind(this), + key: this.onkeypress.bind(this)}; + this.isOpen = this.isLoading = false; + this.window.close = this.listeners.close; + return this; + }, + + build: function() { + this.overlay = new Element('div', { + id: 'sbox-overlay', + styles: { + display: 'none', + zIndex: this.options.zIndex + } + }); + this.content = new Element('div', { + id: 'sbox-content' + }); + this.btnClose = new Element('a', { + id: 'sbox-btn-close', + href: '#' + }); + this.window = new Element('div', { + id: 'sbox-window', + styles: { + display: 'none', + zIndex: this.options.zIndex + 2 + } + }).adopt(this.btnClose, this.content); + + if (!window.ie6) { + this.overlay.setStyles({ + position: 'fixed', + top: 0, + left: 0 + }); + this.window.setStyles({ + position: 'fixed', + top: '50%', + left: '50%' + }); + } else { + this.overlay.style.setExpression('marginTop', 'document.documentElement.scrollTop + "px"'); + this.window.style.setExpression('marginTop', '0 - parseInt(this.offsetHeight / 2) + document.documentElement.scrollTop + "px"'); + + this.overlay.setStyles({ + position: 'absolute', + top: '0%', + left: '0%' + //,marginTop: "expression(document.documentElement.scrollTop + 'px')" + }); + + this.window.setStyles({ + position: 'absolute', + top: '0%', + left: '0%' + //,marginTop: "(expression(0 - parseInt(this.offsetHeight / 2) + document.documentElement.scrollTop + 'px')" + }); + } + + $(document.body).adopt(this.overlay, this.window); + + this.fx = { + overlay: this.overlay.effect('opacity', { + duration: this.options.fxOverlayDuration, + wait: false}).set(0), + window: this.window.effects({ + duration: this.options.fxResizeDuration, + wait: false}), + content: this.content.effect('opacity', { + duration: this.options.fxContentDuration, + wait: false}).set(0) + }; + }, + + addClick: function(el) { + return el.addEvent('click', function() { + if (this.fromElement(el)) return false; + }.bind(this)); + }, + + fromElement: function(el, options) { + this.initialize(); + this.element = $(el); + if (this.element && this.element.rel) options = $merge(options || {}, Json.evaluate(this.element.rel)); + this.setOptions(this.presets, options); + this.assignOptions(); + this.url = (this.element ? (this.options.url || this.element.href) : el) || ''; + + if (this.options.handler) { + var handler = this.options.handler; + return this.setContent(handler, this.parsers[handler].call(this, true)); + } + var res = false; + for (var key in this.parsers) { + if ((res = this.parsers[key].call(this))) return this.setContent(key, res); + } + return this; + }, + + assignOptions: function() { + this.overlay.setProperty('class', this.options.classOverlay); + this.window.setProperty('class', this.options.classWindow); + }, + + close: function(e) { + if (e) new Event(e).stop(); + if (!this.isOpen) return this; + this.fx.overlay.start(0).chain(this.toggleOverlay.bind(this)); + this.window.setStyle('display', 'none'); + this.trashImage(); + this.toggleListeners(); + this.isOpen = null; + this.fireEvent('onClose', [this.content]).removeEvents(); + this.options = {}; + this.setOptions(this.presets).callChain(); + return this; + }, + + onError: function() { + if (this.image) this.trashImage(); + this.setContent('Error during loading'); + }, + + trashImage: function() { + if (this.image) this.image = this.image.onload = this.image.onerror = this.image.onabort = null; + }, + + setContent: function(handler, content) { + this.content.setProperty('class', 'sbox-content-' + handler); + this.applyTimer = this.applyContent.delay(this.fx.overlay.options.duration, this, [this.handlers[handler].call(this, content)]); + if (this.overlay.opacity) return this; + this.toggleOverlay(true); + this.fx.overlay.start(this.options.overlayOpacity); + this.reposition(); + return this; + }, + + applyContent: function(content, size) { + this.applyTimer = $clear(this.applyTimer); + this.hideContent(); + if (!content) this.toggleLoading(true); + else { + if (this.isLoading) this.toggleLoading(false); + this.fireEvent('onUpdate', [this.content], 20); + } + this.content.empty()[['string', 'array', false].contains($type(content)) ? 'setHTML' : 'adopt'](content || ''); + this.callChain(); + if (!this.isOpen) { + this.toggleListeners(true); + this.resize(size, true); + this.isOpen = true; + this.fireEvent('onOpen', [this.content]); + } else this.resize(size); + }, + + resize: function(size, instantly) { + var sizes = window.getSize(); + this.size = $merge(this.isLoading ? this.options.sizeLoading : this.options.size, size); + var to = { + width: this.size.x, + height: this.size.y, + marginLeft: - this.size.x / 2, + marginTop: - this.size.y / 2 + //left: (sizes.scroll.x + (sizes.size.x - this.size.x - this.options.marginInner.x) / 2).toInt(), + //top: (sizes.scroll.y + (sizes.size.y - this.size.y - this.options.marginInner.y) / 2).toInt() + }; + $clear(this.showTimer || null); + this.hideContent(); + if (!instantly) this.fx.window.start(to).chain(this.showContent.bind(this)); + else { + this.window.setStyles(to).setStyle('display', ''); + this.showTimer = this.showContent.delay(50, this); + } + this.reposition(sizes); + }, + + toggleListeners: function(state) { + var task = state ? 'addEvent' : 'removeEvent'; + this.btnClose[task]('click', this.listeners.close); + if (this.options.closeWithOverlay) this.overlay[task]('click', this.listeners.close); + document[task]('keydown', this.listeners.key); + window[task]('resize', this.listeners.window); + window[task]('scroll', this.listeners.window); + }, + + toggleLoading: function(state) { + this.isLoading = state; + this.window[state ? 'addClass' : 'removeClass']('sbox-loading'); + if (state) this.fireEvent('onLoading', [this.window]); + }, + + toggleOverlay: function(state) { + this.overlay.setStyle('display', state ? '' : 'none'); + $(document.body)[state ? 'addClass' : 'removeClass']('body-overlayed'); + }, + + showContent: function() { + if (this.content.opacity) this.fireEvent('onShow', [this.window]); + this.fx.content.start(1); + }, + + hideContent: function() { + if (!this.content.opacity) this.fireEvent('onHide', [this.window]); + this.fx.content.stop().set(0); + }, + + onkeypress: function(e) { + switch (e.key) { + case 'esc': + case 'x': + this.close(); + break; + } + }, + + reposition: function(sizes) { + sizes = sizes || window.getSize(); + this.overlay.setStyles({ + //'left': sizes.scroll.x, 'top': sizes.scroll.y, + width: sizes.size.x, + height: sizes.size.y + }); + /* + this.window.setStyles({ + left: (sizes.scroll.x + (sizes.size.x - this.window.offsetWidth) / 2).toInt(), + top: (sizes.scroll.y + (sizes.size.y - this.window.offsetHeight) / 2).toInt() + }); + */ + this.fireEvent('onMove', [this.overlay, this.window, sizes]); + }, + + removeEvents: function(type){ + if (!this.$events) return this; + if (!type) this.$events = null; + else if (this.$events[type]) this.$events[type] = null; + return this; + }, + + parsers: { + 'image': function(preset) { + return (preset || this.url.test(/\.(jpg|jpeg|png|gif|bmp)$/i)) ? this.url : false; + }, + 'adopt': function(preset) { + if ($(this.options.adopt)) return $(this.options.adopt); + if (preset || ($(this.element) && !this.element.parentNode)) return $(this.element); + var bits = this.url.match(/#([\w-]+)$/); + return bits ? $(bits[1]) : false; + }, + 'url': function(preset) { + return (preset || (this.url && !this.url.test(/^javascript:/i))) ? this.url: false; + }, + 'iframe': function(preset) { + return (preset || this.url) ? this.url: false; + }, + 'string': function(preset) { + return true; + } + }, + + handlers: { + 'image': function(url) { + this.image = new Image(); + var events = { + loaded: function() { + var win = {x: window.getWidth() - this.options.marginImage.x, y: window.getHeight() - this.options.marginImage.y}; + var size = {x: this.image.width, y: this.image.height}; + for (var i = 0; i < 2; i++) + if (size.x > win.x) { + size.y *= win.x / size.x; + size.x = win.x; + } else if (size.y > win.y) { + size.x *= win.y / size.y; + size.y = win.y; + } + size = {x: parseInt(size.x), y: parseInt(size.y)}; + if (window.webkit419) this.image = new Element('img', {'src': this.image.src}); + else $(this.image); + this.image.setProperties({ + 'width': size.x, + 'height': size.y}); + this.applyContent(this.image, size); + }.bind(this), + failed: this.onError.bind(this) + }; + (function() { + this.src = url; + }).delay(10, this.image); + this.image.onload = events.loaded; + this.image.onerror = this.image.onabort = events.failed; + }, + 'adopt': function(el) { + return el.clone(); + }, + 'url': function(url) { + this.ajax = new Ajax(url, this.options.ajaxOptions); + this.ajax.addEvent('onSuccess', function(resp) { + this.applyContent(resp); + this.ajax = null; + }.bind(this)); + this.ajax.addEvent('onFailure', this.onError.bind(this)); + this.ajax.request.delay(10, this.ajax); + }, + 'iframe': function(url) { + return new Element('iframe', { + 'src': url, + 'frameBorder': 0, + 'width': this.options.size.x, + 'height': this.options.size.y + }); + }, + 'string': function(str) { + return str; + } + }, + + extend: $extend +}; + +SqueezeBox.extend(SqueezeBox, Events.prototype); +SqueezeBox.extend(SqueezeBox, Options.prototype); +SqueezeBox.extend(SqueezeBox, Chain.prototype); \ No newline at end of file diff --git a/oss/joomla/trunk/modules/mod_sections/mod_sections.xml b/oss/joomla/trunk/modules/mod_sections/mod_sections.xml index a77935de..fe39e9b9 100644 --- a/oss/joomla/trunk/modules/mod_sections/mod_sections.xml +++ b/oss/joomla/trunk/modules/mod_sections/mod_sections.xml @@ -1,27 +1,27 @@ - - - Sections - Joomla! Project - July 2006 - Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved. - http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL - admin@joomla.org - www.joomla.org - 1.5.0 - DESCSECTIONS - - mod_sections.php - - - - + + + Sections + Joomla! Project + July 2006 + Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved. + http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL + admin@joomla.org + www.joomla.org + 1.5.0 + DESCSECTIONS + + mod_sections.php + + + + - - - - - - - - - + + + + + + + + + diff --git a/oss/joomla/trunk/plugins/authentication/openid.xml b/oss/joomla/trunk/plugins/authentication/openid.xml index 6bbd7ed4..1a32a1f5 100644 --- a/oss/joomla/trunk/plugins/authentication/openid.xml +++ b/oss/joomla/trunk/plugins/authentication/openid.xml @@ -1,17 +1,17 @@ - - - Authentication - OpenID - Joomla! Project - February 2006 - Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved. - http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL - admin@joomla.org - www.joomla.org - 1.5 - Handles user authentication with an OpenID (Requires PHP5) - - openid.php - + + + Authentication - OpenID + Joomla! Project + February 2006 + Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved. + http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL + admin@joomla.org + www.joomla.org + 1.5 + Handles user authentication with an OpenID (Requires PHP5) + + openid.php + @@ -20,12 +20,12 @@ - - + + - + diff --git a/oss/joomla/trunk/plugins/system/mtupgrade.php b/oss/joomla/trunk/plugins/system/mtupgrade.php new file mode 100644 index 00000000..9cd80fb1 --- /dev/null +++ b/oss/joomla/trunk/plugins/system/mtupgrade.php @@ -0,0 +1,50 @@ + + + System - Mootools Upgrade + Joomla! Project + June 2010 + Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved. + http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL + admin@joomla.org + www.joomla.org + 1.5 + Mootools 1.2.4 + + mtupgrade.php + mtupgrade + + + + diff --git a/oss/joomla/trunk/plugins/system/mtupgrade/behavior.php b/oss/joomla/trunk/plugins/system/mtupgrade/behavior.php new file mode 100644 index 00000000..622d599b --- /dev/null +++ b/oss/joomla/trunk/plugins/system/mtupgrade/behavior.php @@ -0,0 +1,604 @@ +getValue('config.debug'); + } + + /* + * Note: Konqueror browser check. + * - If they fix thier issue with compressed javascript we can remove this. + */ + $kcheck = isset($_SERVER['HTTP_USER_AGENT']) ? strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'konqueror') : null; + + // If the debugging flag is set or the browser is Konqueror use the uncompressed file. + if ($debug || $kcheck) { + JHTML::script('mootools-uncompressed.js', 'plugins/system/mtupgrade/', false); + } + else { + JHTML::script('mootools.js', 'plugins/system/mtupgrade/', false); + } + + // Set the MooTools version string in the application object. + JFactory::getApplication()->set('MooToolsVersion', '1.2.4 +Compat'); + + // Ensure the files aren't loaded more than once. + $loaded = true; + } + + /** + * Method to load the system caption behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function caption() + { + JHTML::script('caption.js'); + } + + /** + * Method to load the system form validation behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function formvalidation() + { + JHTML::script('validate.js'); + } + + /** + * Method to load the system container switcher behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function switcher() + { + JHTML::script('switcher.js'); + } + + /** + * Method to load the system combobox behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function combobox() + { + JHTML::script('combobox.js'); + } + + /** + * Method to load the system tooltips behavior. Because the tooltips class and interface has + * changed between Mootools 1.2 and 1.1, we are including our 1.2 version and making it to work + * in the same way as the old one. + * + * @param string $selector The CSS selector for elements to apply the behavior. + * @param array $params The array of options to use for the behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function tooltip($selector='.hasTip', $params = array()) + { + // Setup the static array of tooltip instance options. + static $instances; + if (!isset($instances)) { + $instances = array(); + } + + // Generate the behavior/option signature and check to see if it has already been loaded. + $sig = md5(serialize(array($selector,$params))); + if (!empty($instances[$sig])) { + return; + } + + // Load the Mootools framework. + JHTMLBehavior::mootools(); + + // Setup the options object. + $opt['maxTitleChars'] = (isset($params['maxTitleChars']) && ($params['maxTitleChars'])) ? (int)$params['maxTitleChars'] : 50 ; + $opt['showDelay'] = (isset($params['showDelay'])) ? (int)$params['showDelay'] : null; + $opt['hideDelay'] = (isset($params['hideDelay'])) ? (int)$params['hideDelay'] : null; + $opt['className'] = (isset($params['className'])) ? $params['className'] : null; + $opt['fixed'] = (isset($params['fixed']) && ($params['fixed'])) ? '\\true' : '\\false'; + + // Optional event handler methods. + $opt['onShow'] = (isset($params['onShow'])) ? '\\'.$params['onShow'] : null; + $opt['onHide'] = (isset($params['onHide'])) ? '\\'.$params['onHide'] : null; + + // Offsets needs an array in the format: array('x'=>20, 'y'=>30). + $opt['offsets'] = (isset($params['offsets']) && (is_array($params['offsets']))) ? $params['offsets'] : null; + + // Build the script. + $script = array( + 'window.addEvent("domready", function() {', + ' var JTooltips = new Tips($$("'.$selector.'"), '.JHTMLBehavior::_getJSObject($opt).');', + '});' + ); + + // Load the script into the document head. + JFactory::getDocument()->addScriptDeclaration(implode("\n", $script)); + + // Ensure the same instance isn't loaded more than once. + $instances[$sig] = true; + } + + /** + * Method to load the system modal behavior. + * + * @param string $selector The CSS selector for elements to apply the behavior. + * @param array $params The array of options to use for the behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function modal($selector='a.modal', $params = array()) + { + // Setup the static array of modal instance options. + static $instances; + if (!isset($instances)) { + $instances = array(); + } + + // Generate the behavior/option signature and check to see if it has already been loaded. + $sig = md5(serialize(array($selector,$params))); + if (!empty($instances[$sig])) { + return; + } + + // Load the behavior and stylesheet files into the document head. + JHTML::script('modal.js'); + JHTML::stylesheet('modal.css'); + + // Setup the options object. + $opt['ajaxOptions'] = (isset($params['ajaxOptions']) && (is_array($params['ajaxOptions']))) ? $params['ajaxOptions'] : null; + $opt['size'] = (isset($params['size']) && (is_array($params['size']))) ? $params['size'] : null; + + // Optional event handler methods. + $opt['onOpen'] = (isset($params['onOpen'])) ? $params['onOpen'] : null; + $opt['onClose'] = (isset($params['onClose'])) ? $params['onClose'] : null; + $opt['onUpdate'] = (isset($params['onUpdate'])) ? $params['onUpdate'] : null; + $opt['onResize'] = (isset($params['onResize'])) ? $params['onResize'] : null; + $opt['onMove'] = (isset($params['onMove'])) ? $params['onMove'] : null; + $opt['onShow'] = (isset($params['onShow'])) ? $params['onShow'] : null; + $opt['onHide'] = (isset($params['onHide'])) ? $params['onHide'] : null; + + // Build the script. + $script = array( + 'window.addEvent("domready", function() {', + ' SqueezeBox.initialize('.JHTMLBehavior::_getJSObject($opt).');', + ' $$("'.$selector.'").each(function(el) {', + ' el.addEvent("click", function(e) {', + ' new Event(e).stop();', + ' SqueezeBox.fromElement(el);', + ' });', + ' });', + '});' + ); + + // Load the script into the document head. + JFactory::getDocument()->addScriptDeclaration(implode("\n", $script)); + + // Ensure the same instance isn't loaded more than once. + $instances[$sig] = true; + } + + /** + * Method to load the system file uploader behavior. + * + * @param string $id The DOM node id for the element to apply the behavior. + * @param array $params The array of options to use for the behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function uploader($id='file-upload', $params = array()) + { + // Setup the static array of behavior instances. + static $instances; + if (!isset($instances)) { + $instances = array(); + } + + // Check to see if it has already been loaded. + if (!empty($instances[$id])) { + return; + } + + // Load the behavior files into the document head. + JHTML::script('swf.js'); + JHTML::script('uploader.js'); + + // Setup the options object. + $opt['url'] = (isset($params['targetURL'])) ? $params['targetURL'] : null ; + $opt['swf'] = (isset($params['swf'])) ? $params['swf'] : JURI::root(true).'/media/system/swf/uploader.swf'; + $opt['multiple'] = (isset($params['multiple']) && !($params['multiple'])) ? '\\false' : '\\true'; + $opt['queued'] = (isset($params['queued']) && !($params['queued'])) ? '\\false' : '\\true'; + $opt['queueList'] = (isset($params['queueList'])) ? $params['queueList'] : 'upload-queue'; + $opt['instantStart'] = (isset($params['instantStart']) && ($params['instantStart'])) ? '\\true' : '\\false'; + $opt['allowDuplicates'] = (isset($params['allowDuplicates']) && !($params['allowDuplicates'])) ? '\\false' : '\\true'; + $opt['limitSize'] = (isset($params['limitSize']) && ($params['limitSize'])) ? (int)$params['limitSize'] : null; + $opt['limitFiles'] = (isset($params['limitFiles']) && ($params['limitFiles'])) ? (int)$params['limitFiles'] : null; + $opt['optionFxDuration'] = (isset($params['optionFxDuration'])) ? (int)$params['optionFxDuration'] : null; + $opt['container'] = (isset($params['container'])) ? '\\$('.$params['container'].')' : '\\$(\''.$id.'\').getParent()'; + + // JSON object with ('description': 'extension') pairs. eg. (default: Images (*.jpg; *.jpeg; *.gif; *.png)); + $opt['types'] = (isset($params['types'])) ?'\\'.$params['types'] : '\\{\'All Files (*.*)\': \'*.*\'}'; + + // Optional functions. + $opt['createReplacement'] = (isset($params['createReplacement'])) ? '\\'.$params['createReplacement'] : null; + $opt['onComplete'] = (isset($params['onComplete'])) ? '\\'.$params['onComplete'] : null; + $opt['onAllComplete'] = (isset($params['onAllComplete'])) ? '\\'.$params['onAllComplete'] : null; + + // Build the script. + $script = array( + 'sBrowseCaption="'.JText::_('Browse Files', true).'";', + 'sRemoveToolTip="'.JText::_('Remove from queue', true).'";', + '', + 'window.addEvent("load", function() {', + ' var Uploader = new FancyUpload($("'.$id.'"), '.JHTMLBehavior::_getJSObject($opt).');', + ' $("upload-clear").adopt(new Element("input", {type: "button", events: { click: Uploader.clearList.bind(Uploader, [false])}, value: "'.JText::_('Clear Completed').'" }));', + '});' + ); + + // Load the script into the document head. + JFactory::getDocument()->addScriptDeclaration(implode("\n", $script)); + + // Ensure the same instance isn't loaded more than once. + $instances[$id] = true; + } + + /** + * Method to load the system tree behavior. + * + * @param string $id The DOM node id for the element to apply the behavior. + * @param array $params The array of options to use for the behavior. + * @param array $root The array of root node options. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function tree($id, $params = array(), $root = array()) + { + // Setup the static array of behavior instances. + static $instances; + if (!isset($instances)) { + $instances = array(); + } + + // Check to see if it has already been loaded. + if (!empty($instances[$id])) { + return; + } + + // Load the behavior and stylesheet files into the document head. + JHTML::script('mootree.js'); + JHTML::stylesheet('mootree.css'); + + // Setup the options object. + $opt['div'] = (isset($params['div'])) ? $params['div'] : $id.'_tree'; + $opt['mode'] = (isset($params['mode'])) ? $params['mode'] : 'folders'; + $opt['grid'] = (isset($params['grid'])) ? '\\'.$params['grid'] : '\\true'; + $opt['theme'] = (isset($params['theme'])) ? $params['theme'] : JURI::root(true).'/media/system/images/mootree.gif'; + + // Optional event handler methods. + $opt['onExpand'] = (isset($params['onExpand'])) ? '\\'.$params['onExpand'] : null; + $opt['onSelect'] = (isset($params['onSelect'])) ? '\\'.$params['onSelect'] : null; + $opt['onClick'] = (isset($params['onClick'])) ? '\\'.$params['onClick'] : '\\function(node){ window.open(node.data.url, $chk(node.data.target) ? node.data.target : \'_self\'); }'; + + // Setup the root node options. + $rt['text'] = (isset($root['text'])) ? $root['text'] : 'Root'; + $rt['id'] = (isset($root['id'])) ? $root['id'] : null; + $rt['color'] = (isset($root['color'])) ? $root['color'] : null; + $rt['open'] = (isset($root['open'])) ? '\\'.$root['open'] : '\\true'; + $rt['icon'] = (isset($root['icon'])) ? $root['icon'] : null; + $rt['openicon'] = (isset($root['openicon'])) ? $root['openicon'] : null; + $rt['data'] = (isset($root['data'])) ? $root['data'] : null; + + // Get the optional name of the tree. + $name = (isset($params['treeName'])) ? $params['treeName'] : ''; + + // Build the script. + $script = array( + 'window.addEvent(\'domready\', function(){', + ' tree'.$name.' = new MooTreeControl('.JHTMLBehavior::_getJSObject($opt).','.JHTMLBehavior::_getJSObject($rt).');', + ' tree'.$name.'.adopt(\''.$id.'\');', + '})' + ); + + // Load the script into the document head. + JFactory::getDocument()->addScriptDeclaration(implode("\n", $script)); + + // Ensure the same instance isn't loaded more than once. + $instances[$id] = true; + } + + /** + * Method to load the system calendar behavior. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function calendar() + { + // Load the behavior and stylesheet files into the document head. + JHTML::stylesheet('calendar-jos.css', 'media/system/css/', array(' title' => JText::_('green') ,' media' => 'all')); + JHTML::script('calendar.js'); + JHTML::script('calendar-setup.js'); + + // Get and load the calendar translation string into the document head. + if ($translation = JHTMLBehavior::_calendartranslation()) { + JFactory::getDocument()->addScriptDeclaration($translation); + } + } + + /** + * Method to load the system keepalive behavior. This will send an ascynchronous request to the + * server via AJAX on an interval just under the session expiration lifetime so that the session + * does not expire. + * + * @return void + * + * @since 1.5.19 + * @static + */ + function keepalive() + { + // Load the behavior framework into the document head. + JHTMLBehavior::mootools(); + + // Get the session lifetime in microseconds. + $lifetime = (JFactory::getConfig()->getValue('lifetime', 900) * 60000); + + // Set the session refresh period to one minute less than the session lifetime. + $refreshTime = (int) ($lifetime <= 60000) ? 30000 : $lifetime - 60000; + + // Build the keepalive script. + $script = array( + 'function keepAlive() { new Ajax("index.php", {method: "get"}).request(); }', + 'window.addEvent("domready", function() { keepAlive.periodical('.$refreshTime.'); });' + ); + + // Load the keepalive script into the document head. + JFactory::getDocument()->addScriptDeclaration(implode("\n", $script)); + } + + /** + * Method to get a simple JavaScript Object Notation (JSON) representation of an input + * associative array. + * + * @param array $array The array to convert to JavaScript Object Notation. + * + * @return string JavaScript Object Notation representation of the array. + * + * @access protected + * @since 1.5.19 + * @static + */ + function _getJSObject($array = array()) + { + // Initialize variables + $json = '{'; + + // Iterate over array to build objects + foreach ((array)$array as $k => $v) + { + if (is_null($v)) { + continue; + } + + if (!is_array($v) && !is_object($v)) { + $json .= ' '.$k.': '; + $json .= (is_numeric($v) || strpos($v, '\\') === 0) ? (is_numeric($v)) ? $v : substr($v, 1) : "'".$v."'"; + $json .= ','; + } + else { + $json .= ' '.$k.': '.JHTMLBehavior::_getJSObject($v).','; + } + } + + if (substr($json, -1) == ',') { + $json = substr($json, 0, -1); + } + + $json .= '}'; + + return $json; + } + + /** + * Method to get the internationalisation script/settings for the JavaScript Calendar behavior. + * + * @return mixed JavaScript calendar internationalisation settings script or null if already loaded. + * + * @access protected + * @since 1.5.19 + * @static + */ + function _calendartranslation() + { + // Check to see if it has already been loaded. + static $loaded; + if (!empty($loaded)) { + return; + } + + // Build the day names array. + $dayNames = array( + '"'.JText::_('Sunday').'"', + '"'.JText::_('Monday').'"', + '"'.JText::_('Tuesday').'"', + '"'.JText::_('Wednesday').'"', + '"'.JText::_('Thursday').'"', + '"'.JText::_('Friday').'"', + '"'.JText::_('Saturday').'"', + '"'.JText::_('Sunday').'"' + ); + + // Build the short day names array. + $shortDayNames = array( + '"'.JText::_('Sun').'"', + '"'.JText::_('Mon').'"', + '"'.JText::_('Tue').'"', + '"'.JText::_('Wed').'"', + '"'.JText::_('Thu').'"', + '"'.JText::_('Fri').'"', + '"'.JText::_('Sat').'"', + '"'.JText::_('Sun').'"' + ); + + // Build the month names array. + $monthNames = array( + '"'.JText::_('January').'"', + '"'.JText::_('February').'"', + '"'.JText::_('March').'"', + '"'.JText::_('April').'"', + '"'.JText::_('May').'"', + '"'.JText::_('June').'"', + '"'.JText::_('July').'"', + '"'.JText::_('August').'"', + '"'.JText::_('September').'"', + '"'.JText::_('October').'"', + '"'.JText::_('November').'"', + '"'.JText::_('December').'"' + ); + + // Build the short month names array. + $shortMonthNames = array( + '"'.JText::_('January_short').'"', + '"'.JText::_('February_short').'"', + '"'.JText::_('March_short').'"', + '"'.JText::_('April_short').'"', + '"'.JText::_('May_short').'"', + '"'.JText::_('June_short').'"', + '"'.JText::_('July_short').'"', + '"'.JText::_('August_short').'"', + '"'.JText::_('September_short').'"', + '"'.JText::_('October_short').'"', + '"'.JText::_('November_short').'"', + '"'.JText::_('December_short').'"' + ); + + // Build the script. + $i18n = array( + '// Calendar i18n Setup.', + 'Calendar._FD = 0;', + 'Calendar._DN = new Array ('.implode(', ', $dayNames).');', + 'Calendar._SDN = new Array ('.implode(', ', $shortDayNames).');', + 'Calendar._MN = new Array ('.implode(', ', $monthNames).');', + 'Calendar._SMN = new Array ('.implode(', ', $shortMonthNames).');', + '', + 'Calendar._TT = {};', + 'Calendar._TT["INFO"] = "'.JText::_('About the calendar').'";', + 'Calendar._TT["PREV_YEAR"] = "'.JText::_('Prev. year (hold for menu)').'";', + 'Calendar._TT["PREV_MONTH"] = "'.JText::_('Prev. month (hold for menu)').'";', + 'Calendar._TT["GO_TODAY"] = "'.JText::_('Go Today').'";', + 'Calendar._TT["NEXT_MONTH"] = "'.JText::_('Next month (hold for menu)').'";', + 'Calendar._TT["NEXT_YEAR"] = "'.JText::_('Next year (hold for menu)').'";', + 'Calendar._TT["SEL_DATE"] = "'.JText::_('Select date').'";', + 'Calendar._TT["DRAG_TO_MOVE"] = "'.JText::_('Drag to move').'";', + 'Calendar._TT["PART_TODAY"] = "'.JText::_('(Today)').'";', + 'Calendar._TT["DAY_FIRST"] = "'.JText::_('Display %s first').'";', + 'Calendar._TT["WEEKEND"] = "0,6";', + 'Calendar._TT["CLOSE"] = "'.JText::_('Close').'";', + 'Calendar._TT["TODAY"] = "'.JText::_('Today').'";', + 'Calendar._TT["TIME_PART"] = "'.JText::_('(Shift-)Click or drag to change value').'";', + 'Calendar._TT["DEF_DATE_FORMAT"] = "'.JText::_('%Y-%m-%d').'";', + 'Calendar._TT["TT_DATE_FORMAT"] = "'.JText::_('%a, %b %e').'";', + 'Calendar._TT["WK"] = "'.JText::_('wk').'";', + 'Calendar._TT["TIME"] = "'.JText::_('Time:').'";', + '', + 'Calendar._TT["ABOUT"] =', + '"DHTML Date/Time Selector\n" +', + '"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" +', + '"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +', + '"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +', + '"\n\n" +', + '"Date selection:\n" +', + '"- Use the \xab, \xbb buttons to select year\n" +', + '"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +', + '"- Hold mouse button on any of the above buttons for faster selection.";', + '', + 'Calendar._TT["ABOUT_TIME"] = "\n\n" +', + '"Time selection:\n" +', + '"- Click on any of the time parts to increase it\n" +', + '"- or Shift-click to decrease it\n" +', + '"- or click and drag for faster selection.";', + '' + ); + + // Ensure the i18n data isn't loaded more than once. + $loaded = true; + + return implode("\n", $i18n); + } +} + diff --git a/oss/joomla/trunk/plugins/system/mtupgrade/index.html b/oss/joomla/trunk/plugins/system/mtupgrade/index.html new file mode 100644 index 00000000..fa6d84e8 --- /dev/null +++ b/oss/joomla/trunk/plugins/system/mtupgrade/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/oss/joomla/trunk/plugins/system/mtupgrade/mootools-uncompressed.js b/oss/joomla/trunk/plugins/system/mtupgrade/mootools-uncompressed.js new file mode 100644 index 00000000..a55dba18 --- /dev/null +++ b/oss/joomla/trunk/plugins/system/mtupgrade/mootools-uncompressed.js @@ -0,0 +1,7137 @@ +//MooTools, , My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, , MIT Style License. +//MooTools More, . Copyright (c) 2006-2009 Aaron Newton , Valerio Proietti & the MooTools team , MIT Style License. + +//Contents: Core, Browser, Array, Function, Number, String, Hash, Event, Class, Class.Extras, Element, Element.Event, Element.Style, Element.Dimensions, Selectors, DomReady, JSON, Cookie, Swiff, Fx, Fx.CSS, Fx.Tween, Fx.Morph, Fx.Transitions, Request, Request.HTML, Request.JSON, More, Fx.Elements, Fx.Accordion, Fx.Scroll, Fx.Slide, Fx.SmoothScroll, Drag, Drag.Move, Class.Binds, Element.Measure, Slider, Sortables, Color, Group, Hash.Cookie, Scroller, Tips + +/* +--- + +script: Core.js + +description: The core of MooTools, contains all the base functions and the Native and Hash implementations. Required by all the other scripts. + +license: MIT-style license. + +copyright: Copyright (c) 2006-2008 [Valerio Proietti](http://mad4milk.net/). + +authors: The MooTools production team (http://mootools.net/developers/) + +inspiration: +- Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) +- Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) + +provides: [Mootools, Native, Hash.base, Array.each, $util] + +... +*/ + +var MooTools = { + 'version': '1.2.4', + 'build': '0d9113241a90b9cd5643b926795852a2026710d4' +}; + +var Native = function(options){ + options = options || {}; + var name = options.name; + var legacy = options.legacy; + var protect = options.protect; + var methods = options.implement; + var generics = options.generics; + var initialize = options.initialize; + var afterImplement = options.afterImplement || function(){}; + var object = initialize || legacy; + generics = generics !== false; + + object.constructor = Native; + object.$family = {name: 'native'}; + if (legacy && initialize) object.prototype = legacy.prototype; + object.prototype.constructor = object; + + if (name){ + var family = name.toLowerCase(); + object.prototype.$family = {name: family}; + Native.typize(object, family); + } + + var add = function(obj, name, method, force){ + if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method; + if (generics) Native.genericize(obj, name, protect); + afterImplement.call(obj, name, method); + return obj; + }; + + object.alias = function(a1, a2, a3){ + if (typeof a1 == 'string'){ + var pa1 = this.prototype[a1]; + if ((a1 = pa1)) return add(this, a2, a1, a3); + } + for (var a in a1) this.alias(a, a1[a], a2); + return this; + }; + + object.implement = function(a1, a2, a3){ + if (typeof a1 == 'string') return add(this, a1, a2, a3); + for (var p in a1) add(this, p, a1[p], a2); + return this; + }; + + if (methods) object.implement(methods); + + return object; +}; + +Native.genericize = function(object, property, check){ + if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){ + var args = Array.prototype.slice.call(arguments); + return object.prototype[property].apply(args.shift(), args); + }; +}; + +Native.implement = function(objects, properties){ + for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties); +}; + +Native.typize = function(object, family){ + if (!object.type) object.type = function(item){ + return ($type(item) === family); + }; +}; + +(function(){ + var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String}; + for (var n in natives) new Native({name: n, initialize: natives[n], protect: true}); + + var types = {'boolean': Boolean, 'native': Native, 'object': Object}; + for (var t in types) Native.typize(types[t], t); + + var generics = { + 'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"], + 'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"] + }; + for (var g in generics){ + for (var i = generics[g].length; i--;) Native.genericize(natives[g], generics[g][i], true); + } +})(); + +var Hash = new Native({ + + name: 'Hash', + + initialize: function(object){ + if ($type(object) == 'hash') object = $unlink(object.getClean()); + for (var key in object) this[key] = object[key]; + return this; + } + +}); + +Hash.implement({ + + forEach: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this); + } + }, + + getClean: function(){ + var clean = {}; + for (var key in this){ + if (this.hasOwnProperty(key)) clean[key] = this[key]; + } + return clean; + }, + + getLength: function(){ + var length = 0; + for (var key in this){ + if (this.hasOwnProperty(key)) length++; + } + return length; + } + +}); + +Hash.alias('forEach', 'each'); + +Array.implement({ + + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this); + } + +}); + +Array.alias('forEach', 'each'); + +function $A(iterable){ + if (iterable.item){ + var l = iterable.length, array = new Array(l); + while (l--) array[l] = iterable[l]; + return array; + } + return Array.prototype.slice.call(iterable); +}; + +function $arguments(i){ + return function(){ + return arguments[i]; + }; +}; + +function $chk(obj){ + return !!(obj || obj === 0); +}; + +function $clear(timer){ + clearTimeout(timer); + clearInterval(timer); + return null; +}; + +function $defined(obj){ + return (obj != undefined); +}; + +function $each(iterable, fn, bind){ + var type = $type(iterable); + ((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind); +}; + +function $empty(){}; + +function $extend(original, extended){ + for (var key in (extended || {})) original[key] = extended[key]; + return original; +}; + +function $H(object){ + return new Hash(object); +}; + +function $lambda(value){ + return ($type(value) == 'function') ? value : function(){ + return value; + }; +}; + +function $merge(){ + var args = Array.slice(arguments); + args.unshift({}); + return $mixin.apply(null, args); +}; + +function $mixin(mix){ + for (var i = 1, l = arguments.length; i < l; i++){ + var object = arguments[i]; + if ($type(object) != 'object') continue; + for (var key in object){ + var op = object[key], mp = mix[key]; + mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $mixin(mp, op) : $unlink(op); + } + } + return mix; +}; + +function $pick(){ + for (var i = 0, l = arguments.length; i < l; i++){ + if (arguments[i] != undefined) return arguments[i]; + } + return null; +}; + +function $random(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}; + +function $splat(obj){ + var type = $type(obj); + return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : []; +}; + +var $time = Date.now || function(){ + return +new Date; +}; + +function $try(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch(e){} + } + return null; +}; + +function $type(obj){ + if (obj == undefined) return false; + if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name; + if (obj.nodeName){ + switch (obj.nodeType){ + case 1: return 'element'; + case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace'; + } + } else if (typeof obj.length == 'number'){ + if (obj.callee) return 'arguments'; + else if (obj.item) return 'collection'; + } + return typeof obj; +}; + +function $unlink(object){ + var unlinked; + switch ($type(object)){ + case 'object': + unlinked = {}; + for (var p in object) unlinked[p] = $unlink(object[p]); + break; + case 'hash': + unlinked = new Hash(object); + break; + case 'array': + unlinked = []; + for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]); + break; + default: return object; + } + return unlinked; +}; +/* +--- + +script: Browser.js + +description: The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash. + +license: MIT-style license. + +requires: +- /Native +- /$util + +provides: [Browser, Window, Document, $exec] + +... +*/ + +var Browser = $merge({ + + Engine: {name: 'unknown', version: 0}, + + Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()}, + + Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)}, + + Plugins: {}, + + Engines: { + + presto: function(){ + return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); + }, + + trident: function(){ + return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); + }, + + webkit: function(){ + return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419); + }, + + gecko: function(){ + return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18); + } + + } + +}, Browser || {}); + +Browser.Platform[Browser.Platform.name] = true; + +Browser.detect = function(){ + + for (var engine in this.Engines){ + var version = this.Engines[engine](); + if (version){ + this.Engine = {name: engine, version: version}; + this.Engine[engine] = this.Engine[engine + version] = true; + break; + } + } + + return {name: engine, version: version}; + +}; + +Browser.detect(); + +Browser.Request = function(){ + return $try(function(){ + return new XMLHttpRequest(); + }, function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }, function(){ + return new ActiveXObject('Microsoft.XMLHTTP'); + }); +}; + +Browser.Features.xhr = !!(Browser.Request()); + +Browser.Plugins.Flash = (function(){ + var version = ($try(function(){ + return navigator.plugins['Shockwave Flash'].description; + }, function(){ + return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); + }) || '0 r0').match(/\d+/g); + return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0}; +})(); + +function $exec(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +Native.UID = 1; + +var $uid = (Browser.Engine.trident) ? function(item){ + return (item.uid || (item.uid = [Native.UID++]))[0]; +} : function(item){ + return item.uid || (item.uid = Native.UID++); +}; + +var Window = new Native({ + + name: 'Window', + + legacy: (Browser.Engine.trident) ? null: window.Window, + + initialize: function(win){ + $uid(win); + if (!win.Element){ + win.Element = $empty; + if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2 + win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {}; + } + win.document.window = win; + return $extend(win, Window.Prototype); + }, + + afterImplement: function(property, value){ + window[property] = Window.Prototype[property] = value; + } + +}); + +Window.Prototype = {$family: {name: 'window'}}; + +new Window(window); + +var Document = new Native({ + + name: 'Document', + + legacy: (Browser.Engine.trident) ? null: window.Document, + + initialize: function(doc){ + $uid(doc); + doc.head = doc.getElementsByTagName('head')[0]; + doc.html = doc.getElementsByTagName('html')[0]; + if (Browser.Engine.trident && Browser.Engine.version <= 4) $try(function(){ + doc.execCommand("BackgroundImageCache", false, true); + }); + if (Browser.Engine.trident) doc.window.attachEvent('onunload', function(){ + doc.window.detachEvent('onunload', arguments.callee); + doc.head = doc.html = doc.window = null; + }); + return $extend(doc, Document.Prototype); + }, + + afterImplement: function(property, value){ + document[property] = Document.Prototype[property] = value; + } + +}); + +Document.Prototype = {$family: {name: 'document'}}; + +new Document(document); +/* +--- + +script: Array.js + +description: Contains Array Prototypes like each, contains, and erase. + +license: MIT-style license. + +requires: +- /$util +- /Array.each + +provides: [Array] + +... +*/ + +Array.implement({ + + every: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (!fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if (fn.call(bind, this[i], i, this)) results.push(this[i]); + } + return results; + }, + + clean: function(){ + return this.filter($defined); + }, + + indexOf: function(item, from){ + var len = this.length; + for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this); + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + extend: function(array){ + for (var i = 0, j = array.length; i < j; i++) this.push(array[i]); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[$random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--; i){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = $type(this[i]); + if (!type) continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return value.toInt(16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); +/* +--- + +script: Function.js + +description: Contains Function Prototypes like create, bind, pass, and delay. + +license: MIT-style license. + +requires: +- /Native +- /$util + +provides: [Function] + +... +*/ + +Function.implement({ + + extend: function(properties){ + for (var property in properties) this[property] = properties[property]; + return this; + }, + + create: function(options){ + var self = this; + options = options || {}; + return function(event){ + var args = options.arguments; + args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0); + if (options.event) args = [event || window.event].extend(args); + var returns = function(){ + return self.apply(options.bind || null, args); + }; + if (options.delay) return setTimeout(returns, options.delay); + if (options.periodical) return setInterval(returns, options.periodical); + if (options.attempt) return $try(returns); + return returns(); + }; + }, + + run: function(args, bind){ + return this.apply(bind, $splat(args)); + }, + + pass: function(args, bind){ + return this.create({bind: bind, arguments: args}); + }, + + bind: function(bind, args){ + return this.create({bind: bind, arguments: args}); + }, + + bindWithEvent: function(bind, args){ + return this.create({bind: bind, arguments: args, event: true}); + }, + + attempt: function(args, bind){ + return this.create({bind: bind, arguments: args, attempt: true})(); + }, + + delay: function(delay, bind, args){ + return this.create({bind: bind, arguments: args, delay: delay})(); + }, + + periodical: function(periodical, bind, args){ + return this.create({bind: bind, arguments: args, periodical: periodical})(); + } + +}); +/* +--- + +script: Number.js + +description: Contains Number Prototypes like limit, round, times, and ceil. + +license: MIT-style license. + +requires: +- /Native +- /$util + +provides: [Number] + +... +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('times', 'each'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat($A(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); +/* +--- + +script: String.js + +description: Contains String Prototypes like camelCase, capitalize, test, and toInt. + +license: MIT-style license. + +requires: +- /Native + +provides: [String] + +... +*/ + +String.implement({ + + test: function(regex, params){ + return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this); + }, + + contains: function(string, separator){ + return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1; + }, + + trim: function(){ + return this.replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return this.replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return this.replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return this.replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return this.replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + stripScripts: function(option){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(){ + scripts += arguments[1] + '\n'; + return ''; + }); + if (option === true) $exec(scripts); + else if ($type(option) == 'function') option(scripts, text); + return text; + }, + + substitute: function(object, regexp){ + return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != undefined) ? object[name] : ''; + }); + } + +}); +/* +--- + +script: Hash.js + +description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects. + +license: MIT-style license. + +requires: +- /Hash.base + +provides: [Hash] + +... +*/ + +Hash.implement({ + + has: Object.prototype.hasOwnProperty, + + keyOf: function(value){ + for (var key in this){ + if (this.hasOwnProperty(key) && this[key] === value) return key; + } + return null; + }, + + hasValue: function(value){ + return (Hash.keyOf(this, value) !== null); + }, + + extend: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.set(this, key, value); + }, this); + return this; + }, + + combine: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.include(this, key, value); + }, this); + return this; + }, + + erase: function(key){ + if (this.hasOwnProperty(key)) delete this[key]; + return this; + }, + + get: function(key){ + return (this.hasOwnProperty(key)) ? this[key] : null; + }, + + set: function(key, value){ + if (!this[key] || this.hasOwnProperty(key)) this[key] = value; + return this; + }, + + empty: function(){ + Hash.each(this, function(value, key){ + delete this[key]; + }, this); + return this; + }, + + include: function(key, value){ + if (this[key] == undefined) this[key] = value; + return this; + }, + + map: function(fn, bind){ + var results = new Hash; + Hash.each(this, function(value, key){ + results.set(key, fn.call(bind, value, key, this)); + }, this); + return results; + }, + + filter: function(fn, bind){ + var results = new Hash; + Hash.each(this, function(value, key){ + if (fn.call(bind, value, key, this)) results.set(key, value); + }, this); + return results; + }, + + every: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false; + } + return true; + }, + + some: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true; + } + return false; + }, + + getKeys: function(){ + var keys = []; + Hash.each(this, function(value, key){ + keys.push(key); + }); + return keys; + }, + + getValues: function(){ + var values = []; + Hash.each(this, function(value){ + values.push(value); + }); + return values; + }, + + toQueryString: function(base){ + var queryString = []; + Hash.each(this, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch ($type(value)){ + case 'object': result = Hash.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Hash.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != undefined) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + +Hash.alias({keyOf: 'indexOf', hasValue: 'contains'}); +/* +--- + +script: Event.js + +description: Contains the Event Class, to make the event object cross-browser. + +license: MIT-style license. + +requires: +- /Window +- /Document +- /Hash +- /Array +- /Function +- /String + +provides: [Event] + +... +*/ + +var Event = new Native({ + + name: 'Event', + + initialize: function(event, win){ + win = win || window; + var doc = win.document; + event = event || win.event; + if (event.$extended) return event; + this.$extended = true; + var type = event.type; + var target = event.target || event.srcElement; + while (target && target.nodeType == 3) target = target.parentNode; + + if (type.test(/key/)){ + var code = event.which || event.keyCode; + var key = Event.Keys.keyOf(code); + if (type == 'keydown'){ + var fKey = code - 111; + if (fKey > 0 && fKey < 13) key = 'f' + fKey; + } + key = key || String.fromCharCode(code).toLowerCase(); + } else if (type.match(/(click|mouse|menu)/i)){ + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + var page = { + x: event.pageX || event.clientX + doc.scrollLeft, + y: event.pageY || event.clientY + doc.scrollTop + }; + var client = { + x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY + }; + if (type.match(/DOMMouseScroll|mousewheel/)){ + var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + } + var rightClick = (event.which == 3) || (event.button == 2); + var related = null; + if (type.match(/over|out/)){ + switch (type){ + case 'mouseover': related = event.relatedTarget || event.fromElement; break; + case 'mouseout': related = event.relatedTarget || event.toElement; + } + if (!(function(){ + while (related && related.nodeType == 3) related = related.parentNode; + return true; + }).create({attempt: Browser.Engine.gecko})()) related = false; + } + } + + return $extend(this, { + event: event, + type: type, + + page: page, + client: client, + rightClick: rightClick, + + wheel: wheel, + + relatedTarget: related, + target: target, + + code: code, + key: key, + + shift: event.shiftKey, + control: event.ctrlKey, + alt: event.altKey, + meta: event.metaKey + }); + } + +}); + +Event.Keys = new Hash({ + 'enter': 13, + 'up': 38, + 'down': 40, + 'left': 37, + 'right': 39, + 'esc': 27, + 'space': 32, + 'backspace': 8, + 'tab': 9, + 'delete': 46 +}); + +Event.implement({ + + stop: function(){ + return this.stopPropagation().preventDefault(); + }, + + stopPropagation: function(){ + if (this.event.stopPropagation) this.event.stopPropagation(); + else this.event.cancelBubble = true; + return this; + }, + + preventDefault: function(){ + if (this.event.preventDefault) this.event.preventDefault(); + else this.event.returnValue = false; + return this; + } + +}); +/* +--- + +script: Class.js + +description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +license: MIT-style license. + +requires: +- /$util +- /Native +- /Array +- /String +- /Function +- /Number +- /Hash + +provides: [Class] + +... +*/ + +function Class(params){ + + if (params instanceof Function) params = {initialize: params}; + + var newClass = function(){ + Object.reset(this); + if (newClass._prototyping) return this; + this._current = $empty; + var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; + delete this._current; delete this.caller; + return value; + }.extend(this); + + newClass.implement(params); + + newClass.constructor = Class; + newClass.prototype.constructor = newClass; + + return newClass; + +}; + +Function.prototype.protect = function(){ + this._protected = true; + return this; +}; + +Object.reset = function(object, key){ + + if (key == null){ + for (var p in object) Object.reset(object, p); + return object; + } + + delete object[key]; + + switch ($type(object[key])){ + case 'object': + var F = function(){}; + F.prototype = object[key]; + var i = new F; + object[key] = Object.reset(i); + break; + case 'array': object[key] = $unlink(object[key]); break; + } + + return object; + +}; + +new Native({name: 'Class', initialize: Class}).extend({ + + instantiate: function(F){ + F._prototyping = true; + var proto = new F; + delete F._prototyping; + return proto; + }, + + wrap: function(self, key, method){ + if (method._origin) method = method._origin; + + return function(){ + if (method._protected && this._current == null) throw new Error('The method "' + key + '" cannot be called.'); + var caller = this.caller, current = this._current; + this.caller = current; this._current = arguments.callee; + var result = method.apply(this, arguments); + this._current = current; this.caller = caller; + return result; + }.extend({_owner: self, _origin: method, _name: key}); + + } + +}); + +Class.implement({ + + implement: function(key, value){ + + if ($type(key) == 'object'){ + for (var p in key) this.implement(p, key[p]); + return this; + } + + var mutator = Class.Mutators[key]; + + if (mutator){ + value = mutator.call(this, value); + if (value == null) return this; + } + + var proto = this.prototype; + + switch ($type(value)){ + + case 'function': + if (value._hidden) return this; + proto[key] = Class.wrap(this, key, value); + break; + + case 'object': + var previous = proto[key]; + if ($type(previous) == 'object') $mixin(previous, value); + else proto[key] = $unlink(value); + break; + + case 'array': + proto[key] = $unlink(value); + break; + + default: proto[key] = value; + + } + + return this; + + } + +}); + +Class.Mutators = { + + Extends: function(parent){ + + this.parent = parent; + this.prototype = Class.instantiate(parent); + + this.implement('parent', function(){ + var name = this.caller._name, previous = this.caller._owner.parent.prototype[name]; + if (!previous) throw new Error('The method "' + name + '" has no parent.'); + return previous.apply(this, arguments); + }.protect()); + + }, + + Implements: function(items){ + $splat(items).each(function(item){ + if (item instanceof Function) item = Class.instantiate(item); + this.implement(item); + }, this); + + } + +}; +/* +--- + +script: Class.Extras.js + +description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +license: MIT-style license. + +requires: +- /Class + +provides: [Chain, Events, Options] + +... +*/ + +var Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.extend(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = Events.removeOn(type); + if (fn != $empty){ + this.$events[type] = this.$events[type] || []; + this.$events[type].include(fn); + if (internal) fn.internal = true; + } + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = Events.removeOn(type); + if (!this.$events || !this.$events[type]) return this; + this.$events[type].each(function(fn){ + fn.create({'bind': this, 'delay': delay, 'arguments': args})(); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = Events.removeOn(type); + if (!this.$events[type]) return this; + if (!fn.internal) this.$events[type].erase(fn); + return this; + }, + + removeEvents: function(events){ + var type; + if ($type(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = Events.removeOn(events); + for (type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--; i) this.removeEvent(type, fns[i]); + } + return this; + } + +}); + +Events.removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first){ + return first.toLowerCase(); + }); +}; + +var Options = new Class({ + + setOptions: function(){ + this.options = $merge.run([this.options].extend(arguments)); + if (!this.addEvent) return this; + for (var option in this.options){ + if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, this.options[option]); + delete this.options[option]; + } + return this; + } + +}); +/* +--- + +script: Element.js + +description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements. + +license: MIT-style license. + +requires: +- /Window +- /Document +- /Array +- /String +- /Function +- /Number +- /Hash + +provides: [Element, Elements, $, $$, Iframe] + +... +*/ + +var Element = new Native({ + + name: 'Element', + + legacy: window.Element, + + initialize: function(tag, props){ + var konstructor = Element.Constructors.get(tag); + if (konstructor) return konstructor(props); + if (typeof tag == 'string') return document.newElement(tag, props); + return document.id(tag).set(props); + }, + + afterImplement: function(key, value){ + Element.Prototype[key] = value; + if (Array[key]) return; + Elements.implement(key, function(){ + var items = [], elements = true; + for (var i = 0, j = this.length; i < j; i++){ + var returns = this[i][key].apply(this[i], arguments); + items.push(returns); + if (elements) elements = ($type(returns) == 'element'); + } + return (elements) ? new Elements(items) : items; + }); + } + +}); + +Element.Prototype = {$family: {name: 'element'}}; + +Element.Constructors = new Hash; + +var IFrame = new Native({ + + name: 'IFrame', + + generics: false, + + initialize: function(){ + var params = Array.link(arguments, {properties: Object.type, iframe: $defined}); + var props = params.properties || {}; + var iframe = document.id(params.iframe); + var onload = props.onload || $empty; + delete props.onload; + props.id = props.name = $pick(props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + $time()); + iframe = new Element(iframe || 'iframe', props); + var onFrameLoad = function(){ + var host = $try(function(){ + return iframe.contentWindow.location.host; + }); + if (!host || host == window.location.host){ + var win = new Window(iframe.contentWindow); + new Document(iframe.contentWindow.document); + $extend(win.Element.prototype, Element.Prototype); + } + onload.call(iframe.contentWindow, iframe.contentWindow.document); + }; + var contentWindow = $try(function(){ + return iframe.contentWindow; + }); + ((contentWindow && contentWindow.document.body) || window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad); + return iframe; + } + +}); + +var Elements = new Native({ + + initialize: function(elements, options){ + options = $extend({ddup: true, cash: true}, options); + elements = elements || []; + if (options.ddup || options.cash){ + var uniques = {}, returned = []; + for (var i = 0, l = elements.length; i < l; i++){ + var el = document.id(elements[i], !options.cash); + if (options.ddup){ + if (uniques[el.uid]) continue; + uniques[el.uid] = true; + } + if (el) returned.push(el); + } + elements = returned; + } + return (options.cash) ? $extend(elements, this) : elements; + } + +}); + +Elements.implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + } + +}); + +Document.implement({ + + newElement: function(tag, props){ + if (Browser.Engine.trident && props){ + ['name', 'type', 'checked'].each(function(attribute){ + if (!props[attribute]) return; + tag += ' ' + attribute + '="' + props[attribute] + '"'; + if (attribute != 'checked') delete props[attribute]; + }); + tag = '<' + tag + '>'; + } + return document.id(this.createElement(tag)).set(props); + }, + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + }, + + id: (function(){ + + var types = { + + string: function(id, nocash, doc){ + id = doc.getElementById(id); + return (id) ? types.element(id, nocash) : null; + }, + + element: function(el, nocash){ + $uid(el); + if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){ + var proto = Element.Prototype; + for (var p in proto) el[p] = proto[p]; + }; + return el; + }, + + object: function(obj, nocash, doc){ + if (obj.toElement) return types.element(obj.toElement(doc), nocash); + return null; + } + + }; + + types.textnode = types.whitespace = types.window = types.document = $arguments(0); + + return function(el, nocash, doc){ + if (el && el.$family && el.uid) return el; + var type = $type(el); + return (types[type]) ? types[type](el, nocash, doc || document) : null; + }; + + })() + +}); + +if (window.$ == null) Window.implement({ + $: function(el, nc){ + return document.id(el, nc, this.document); + } +}); + +Window.implement({ + + $$: function(selector){ + if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector); + var elements = []; + var args = Array.flatten(arguments); + for (var i = 0, l = args.length; i < l; i++){ + var item = args[i]; + switch ($type(item)){ + case 'element': elements.push(item); break; + case 'string': elements.extend(this.document.getElements(item, true)); + } + } + return new Elements(elements); + }, + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +Native.implement([Element, Document], { + + getElement: function(selector, nocash){ + return document.id(this.getElements(selector, true)[0] || null, nocash); + }, + + getElements: function(tags, nocash){ + tags = tags.split(','); + var elements = []; + var ddup = (tags.length > 1); + tags.each(function(tag){ + var partial = this.getElementsByTagName(tag.trim()); + (ddup) ? elements.extend(partial) : elements = partial; + }, this); + return new Elements(elements, {ddup: ddup, cash: !nocash}); + } + +}); + +(function(){ + +var collected = {}, storage = {}; +var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item, retain){ + if (!item) return; + var uid = item.uid; + if (Browser.Engine.trident){ + if (item.clearAttributes){ + var clone = retain && item.cloneNode(false); + item.clearAttributes(); + if (clone) item.mergeAttributes(clone); + } else if (item.removeEvents){ + item.removeEvents(); + } + if ((/object/i).test(item.tagName)){ + for (var p in item){ + if (typeof item[p] == 'function') item[p] = $empty; + } + Element.dispose(item); + } + } + if (!uid) return; + collected[uid] = storage[uid] = null; +}; + +var purge = function(){ + Hash.each(collected, clean); + if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean); + if (window.CollectGarbage) CollectGarbage(); + collected = storage = null; +}; + +var walk = function(element, walk, start, match, all, nocash){ + var el = element[start || walk]; + var elements = []; + while (el){ + if (el.nodeType == 1 && (!match || Element.match(el, match))){ + if (!all) return document.id(el, nocash); + elements.push(el); + } + el = el[walk]; + } + return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null; +}; + +var attributes = { + 'html': 'innerHTML', + 'class': 'className', + 'for': 'htmlFor', + 'defaultValue': 'defaultValue', + 'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent' +}; +var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer']; +var camels = ['value', 'type', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap']; + +bools = bools.associate(bools); + +Hash.extend(attributes, bools); +Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase))); + +var inserters = { + + before: function(context, element){ + if (element.parentNode) element.parentNode.insertBefore(context, element); + }, + + after: function(context, element){ + if (!element.parentNode) return; + var next = element.nextSibling; + (next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + var first = element.firstChild; + (first) ? element.insertBefore(context, first) : element.appendChild(context); + } + +}; + +inserters.inside = inserters.bottom; + +Hash.each(inserters, function(inserter, where){ + + where = where.capitalize(); + + Element.implement('inject' + where, function(el){ + inserter(this, document.id(el, true)); + return this; + }); + + Element.implement('grab' + where, function(el){ + inserter(document.id(el, true), this); + return this; + }); + +}); + +Element.implement({ + + set: function(prop, value){ + switch ($type(prop)){ + case 'object': + for (var p in prop) this.set(p, prop[p]); + break; + case 'string': + var property = Element.Properties.get(prop); + (property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value); + } + return this; + }, + + get: function(prop){ + var property = Element.Properties.get(prop); + return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop); + }, + + erase: function(prop){ + var property = Element.Properties.get(prop); + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + setProperty: function(attribute, value){ + var key = attributes[attribute]; + if (value == undefined) return this.removeProperty(attribute); + if (key && bools[attribute]) value = !!value; + (key) ? this[key] = value : this.setAttribute(attribute, '' + value); + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(attribute){ + var key = attributes[attribute]; + var value = (key) ? this[key] : this.getAttribute(attribute, 2); + return (bools[attribute]) ? !!value : (key) ? value : value || null; + }, + + getProperties: function(){ + var args = $A(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(attribute){ + var key = attributes[attribute]; + (key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute); + return this; + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + hasClass: function(className){ + return this.className.contains(className, ' '); + }, + + addClass: function(className){ + if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean(); + return this; + }, + + removeClass: function(className){ + this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1'); + return this; + }, + + toggleClass: function(className){ + return this.hasClass(className) ? this.removeClass(className) : this.addClass(className); + }, + + adopt: function(){ + Array.flatten(arguments).each(function(element){ + element = document.id(element, true); + if (element) this.appendChild(element); + }, this); + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom'](document.id(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, document.id(el, true)); + return this; + }, + + replaces: function(el){ + el = document.id(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = document.id(el, true); + return this.replaces(el).grab(el, where); + }, + + getPrevious: function(match, nocash){ + return walk(this, 'previousSibling', null, match, false, nocash); + }, + + getAllPrevious: function(match, nocash){ + return walk(this, 'previousSibling', null, match, true, nocash); + }, + + getNext: function(match, nocash){ + return walk(this, 'nextSibling', null, match, false, nocash); + }, + + getAllNext: function(match, nocash){ + return walk(this, 'nextSibling', null, match, true, nocash); + }, + + getFirst: function(match, nocash){ + return walk(this, 'nextSibling', 'firstChild', match, false, nocash); + }, + + getLast: function(match, nocash){ + return walk(this, 'previousSibling', 'lastChild', match, false, nocash); + }, + + getParent: function(match, nocash){ + return walk(this, 'parentNode', null, match, false, nocash); + }, + + getParents: function(match, nocash){ + return walk(this, 'parentNode', null, match, true, nocash); + }, + + getSiblings: function(match, nocash){ + return this.getParent().getChildren(match, nocash).erase(this); + }, + + getChildren: function(match, nocash){ + return walk(this, 'nextSibling', 'firstChild', match, true, nocash); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id, nocash){ + var el = this.ownerDocument.getElementById(id); + if (!el) return null; + for (var parent = el.parentNode; parent != this; parent = parent.parentNode){ + if (!parent) return null; + } + return document.id(el, nocash); + }, + + getSelected: function(){ + return new Elements($A(this.options).filter(function(option){ + return option.selected; + })); + }, + + getComputedStyle: function(property){ + if (this.currentStyle) return this.currentStyle[property.camelCase()]; + var computed = this.getDocument().defaultView.getComputedStyle(this, null); + return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null; + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea', true).each(function(el){ + if (!el.name || el.disabled || el.type == 'submit' || el.type == 'reset' || el.type == 'file') return; + var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){ + return opt.value; + }) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value; + $splat(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + }, + + clone: function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents); + var clean = function(node, element){ + if (!keepid) node.removeAttribute('id'); + if (Browser.Engine.trident){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uid'); + if (node.options){ + var no = node.options, eo = element.options; + for (var j = no.length; j--;) no[j].selected = eo[j].selected; + } + } + var prop = props[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; + }; + + if (contents){ + var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*'); + for (var i = ce.length; i--;) clean(ce[i], te[i]); + } + + clean(clone, this); + return document.id(clone); + }, + + destroy: function(){ + Element.empty(this); + Element.dispose(this); + clean(this, true); + return null; + }, + + empty: function(){ + $A(this.childNodes).each(function(node){ + Element.destroy(node); + }); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + hasChild: function(el){ + el = document.id(el, true); + if (!el) return false; + if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el); + return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16); + }, + + match: function(tag){ + return (!tag || (tag == this) || (Element.get(this, 'tag') == tag)); + } + +}); + +Native.implement([Element, Window, Document], { + + addListener: function(type, fn){ + if (type == 'unload'){ + var old = fn, self = this; + fn = function(){ + self.removeListener('unload', fn); + old(); + }; + } else { + collected[this.uid] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, false); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, false); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get(this.uid), prop = storage[property]; + if (dflt != undefined && prop == undefined) prop = storage[property] = dflt; + return $pick(prop); + }, + + store: function(property, value){ + var storage = get(this.uid); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get(this.uid); + delete storage[property]; + return this; + } + +}); + +window.addListener('unload', purge); + +})(); + +Element.Properties = new Hash; + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +Element.Properties.html = (function(){ + var wrapper = document.createElement('div'); + + var translations = { + table: [1, '', '
'], + select: [1, ''], + tbody: [2, '', '
'], + tr: [3, '', '
'] + }; + translations.thead = translations.tfoot = translations.tbody; + + var html = { + set: function(){ + var html = Array.flatten(arguments).join(''); + var wrap = Browser.Engine.trident && translations[this.get('tag')]; + if (wrap){ + var first = wrapper; + first.innerHTML = wrap[1] + html + wrap[2]; + for (var i = wrap[0]; i--;) first = first.firstChild; + this.empty().adopt(first.childNodes); + } else { + this.innerHTML = html; + } + } + }; + + html.erase = html.set; + + return html; +})(); + +if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = { + get: function(){ + if (this.innerText) return this.innerText; + var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body); + var text = temp.innerText; + temp.destroy(); + return text; + } +}; +/* +--- + +script: Element.Event.js + +description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events. + +license: MIT-style license. + +requires: +- /Element +- /Event + +provides: [Element.Event] + +... +*/ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +Native.implement([Element, Window, Document], { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + events[type] = events[type] || {'keys': [], 'values': []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, custom = Element.Events.get(type), condition = fn, self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event)) return fn.call(this, event); + return true; + }; + } + realType = custom.base || realType; + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new Event(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var pos = events[type].keys.indexOf(fn); + if (pos == -1) return this; + events[type].keys.splice(pos, 1); + var value = events[type].values.splice(pos, 1)[0]; + var custom = Element.Events.get(type); + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn); + type = custom.base || type; + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + var type; + if ($type(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]); + attached[events] = null; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + events[type].keys.each(function(fn){ + fn.create({'bind': this, 'delay': delay, 'arguments': args})(); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = document.id(from); + var fevents = from.retrieve('events'); + if (!fevents) return this; + if (!type){ + for (var evType in fevents) this.cloneEvents(from, evType); + } else if (fevents[type]){ + fevents[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements + load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + error: 1, abort: 1, scroll: 1 //misc +}; + +(function(){ + +var $check = function(event){ + var related = event.relatedTarget; + if (related == undefined) return true; + if (related === false) return false; + return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related)); +}; + +Element.Events = new Hash({ + + mouseenter: { + base: 'mouseover', + condition: $check + }, + + mouseleave: { + base: 'mouseout', + condition: $check + }, + + mousewheel: { + base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel' + } + +}); + +})(); +/* +--- + +script: Element.Style.js + +description: Contains methods for interacting with the styles of Elements in a fashionable way. + +license: MIT-style license. + +requires: +- /Element + +provides: [Element.Style] + +... +*/ + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +Element.Properties.opacity = { + + set: function(opacity, novisibility){ + if (!novisibility){ + if (opacity == 0){ + if (this.style.visibility != 'hidden') this.style.visibility = 'hidden'; + } else { + if (this.style.visibility != 'visible') this.style.visibility = 'visible'; + } + } + if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1; + if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')'; + this.style.opacity = opacity; + this.store('opacity', opacity); + }, + + get: function(){ + return this.retrieve('opacity', 1); + } + +}; + +Element.implement({ + + setOpacity: function(value){ + return this.set('opacity', value, true); + }, + + getOpacity: function(){ + return this.get('opacity'); + }, + + setStyle: function(property, value){ + switch (property){ + case 'opacity': return this.set('opacity', parseFloat(value)); + case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat'; + } + property = property.camelCase(); + if ($type(value) != 'string'){ + var map = (Element.Styles.get(property) || '@').split(' '); + value = $splat(value).map(function(val, i){ + if (!map[i]) return ''; + return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + return this; + }, + + getStyle: function(property){ + switch (property){ + case 'opacity': return this.get('opacity'); + case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat'; + } + property = property.camelCase(); + var result = this.style[property]; + if (!$chk(result)){ + result = []; + for (var style in Element.ShortStyles){ + if (property != style) continue; + for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result, 10)))){ + if (property.test(/^(height|width)$/)){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if ((Browser.Engine.presto) && String(result).test('px')) return result; + if (property.test(/(border(.+)Width|margin|padding)/)) return '0px'; + } + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.flatten(arguments).each(function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = new Hash({ + left: '@px', top: '@px', bottom: '@px', right: '@px', + width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', + backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', + fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', + margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', + borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', + zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' +}); + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); +/* +--- + +script: Element.Dimensions.js + +description: Contains methods to work with size, scroll, or positioning of Elements and the window object. + +license: MIT-style license. + +credits: +- Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). +- Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). + +requires: +- /Element + +provides: [Element.Dimensions] + +... +*/ + +(function(){ + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: function(){ + var element = this; + if (isBody(element)) return null; + if (!Browser.Engine.trident) return element.offsetParent; + while ((element = element.parentNode) && !isBody(element)){ + if (styleString(element, 'position') != 'static') return element; + } + return null; + }, + + getOffsets: function(){ + if (this.getBoundingClientRect){ + var bound = this.getBoundingClientRect(), + html = document.id(this.getDocument().documentElement), + htmlScroll = html.getScroll(), + elemScrolls = this.getScrolls(), + elemScroll = this.getScroll(), + isFixed = (styleString(this, 'position') == 'fixed'); + + return { + x: bound.left.toInt() + elemScrolls.x - elemScroll.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, + y: bound.top.toInt() + elemScrolls.y - elemScroll.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + if (Browser.Engine.gecko){ + if (!borderBox(element)){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + var parent = element.parentNode; + if (parent && styleString(parent, 'overflow') != 'visible'){ + position.x += leftBorder(parent); + position.y += topBorder(parent); + } + } else if (element != this && Browser.Engine.webkit){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + + element = element.offsetParent; + } + if (Browser.Engine.gecko && !borderBox(this)){ + position.x -= leftBorder(this); + position.y -= topBorder(this); + } + return position; + }, + + getPosition: function(relative){ + if (isBody(this)) return {x: 0, y: 0}; + var offset = this.getOffsets(), + scroll = this.getScrolls(); + var position = { + x: offset.x - scroll.x, + y: offset.y - scroll.y + }; + var relativePosition = (relative && (relative = document.id(relative))) ? relative.getPosition() : {x: 0, y: 0}; + return {x: position.x - relativePosition.x, y: position.y - relativePosition.y}; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), + size = this.getSize(); + var obj = { + left: position.x, + top: position.y, + width: size.x, + height: size.y + }; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return { + left: obj.x - styleNumber(this, 'margin-left'), + top: obj.y - styleNumber(this, 'margin-top') + }; + }, + + setPosition: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + + +Native.implement([Document, Window], { + + getSize: function(){ + if (Browser.Engine.presto || Browser.Engine.webkit){ + var win = this.getWindow(); + return {x: win.innerWidth, y: win.innerHeight}; + } + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(), doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this), min = this.getSize(); + return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +}; + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +}; + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +}; + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +}; + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +}; + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +}; + +})(); + +//aliases +Element.alias('setPosition', 'position'); //compatability + +Native.implement([Window, Document, Element], { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); +/* +--- + +script: Selectors.js + +description: Adds advanced CSS-style querying capabilities for targeting HTML Elements. Includes pseudo selectors. + +license: MIT-style license. + +requires: +- /Element + +provides: [Selectors] + +... +*/ + +Native.implement([Document, Element], { + + getElements: function(expression, nocash){ + expression = expression.split(','); + var items, local = {}; + for (var i = 0, l = expression.length; i < l; i++){ + var selector = expression[i], elements = Selectors.Utils.search(this, selector, local); + if (i != 0 && elements.item) elements = $A(elements); + items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements); + } + return new Elements(items, {ddup: (expression.length > 1), cash: !nocash}); + } + +}); + +Element.implement({ + + match: function(selector){ + if (!selector || (selector == this)) return true; + var tagid = Selectors.Utils.parseTagAndID(selector); + var tag = tagid[0], id = tagid[1]; + if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false; + var parsed = Selectors.Utils.parseSelector(selector); + return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true; + } + +}); + +var Selectors = {Cache: {nth: {}, parsed: {}}}; + +Selectors.RegExps = { + id: (/#([\w-]+)/), + tag: (/^(\w+|\*)/), + quick: (/^(\w+|\*)$/), + splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g), + combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g) +}; + +Selectors.Utils = { + + chk: function(item, uniques){ + if (!uniques) return true; + var uid = $uid(item); + if (!uniques[uid]) return uniques[uid] = true; + return false; + }, + + parseNthArgument: function(argument){ + if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument]; + var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/); + if (!parsed) return false; + var inta = parseInt(parsed[1], 10); + var a = (inta || inta === 0) ? inta : 1; + var special = parsed[2] || false; + var b = parseInt(parsed[3], 10) || 0; + if (a != 0){ + b--; + while (b < 1) b += a; + while (b >= a) b -= a; + } else { + a = b; + special = 'index'; + } + switch (special){ + case 'n': parsed = {a: a, b: b, special: 'n'}; break; + case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break; + case 'even': parsed = {a: 2, b: 1, special: 'n'}; break; + case 'first': parsed = {a: 0, special: 'index'}; break; + case 'last': parsed = {special: 'last-child'}; break; + case 'only': parsed = {special: 'only-child'}; break; + default: parsed = {a: (a - 1), special: 'index'}; + } + + return Selectors.Cache.nth[argument] = parsed; + }, + + parseSelector: function(selector){ + if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector]; + var m, parsed = {classes: [], pseudos: [], attributes: []}; + while ((m = Selectors.RegExps.combined.exec(selector))){ + var cn = m[1], an = m[2], ao = m[3], av = m[5], pn = m[6], pa = m[7]; + if (cn){ + parsed.classes.push(cn); + } else if (pn){ + var parser = Selectors.Pseudo.get(pn); + if (parser) parsed.pseudos.push({parser: parser, argument: pa}); + else parsed.attributes.push({name: pn, operator: '=', value: pa}); + } else if (an){ + parsed.attributes.push({name: an, operator: ao, value: av}); + } + } + if (!parsed.classes.length) delete parsed.classes; + if (!parsed.attributes.length) delete parsed.attributes; + if (!parsed.pseudos.length) delete parsed.pseudos; + if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null; + return Selectors.Cache.parsed[selector] = parsed; + }, + + parseTagAndID: function(selector){ + var tag = selector.match(Selectors.RegExps.tag); + var id = selector.match(Selectors.RegExps.id); + return [(tag) ? tag[1] : '*', (id) ? id[1] : false]; + }, + + filter: function(item, parsed, local){ + var i; + if (parsed.classes){ + for (i = parsed.classes.length; i--; i){ + var cn = parsed.classes[i]; + if (!Selectors.Filters.byClass(item, cn)) return false; + } + } + if (parsed.attributes){ + for (i = parsed.attributes.length; i--; i){ + var att = parsed.attributes[i]; + if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false; + } + } + if (parsed.pseudos){ + for (i = parsed.pseudos.length; i--; i){ + var psd = parsed.pseudos[i]; + if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false; + } + } + return true; + }, + + getByTagAndID: function(ctx, tag, id){ + if (id){ + var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true); + return (item && Selectors.Filters.byTag(item, tag)) ? [item] : []; + } else { + return ctx.getElementsByTagName(tag); + } + }, + + search: function(self, expression, local){ + var splitters = []; + + var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){ + splitters.push(m1); + return ':)' + m2; + }).split(':)'); + + var items, filtered, item; + + for (var i = 0, l = selectors.length; i < l; i++){ + + var selector = selectors[i]; + + if (i == 0 && Selectors.RegExps.quick.test(selector)){ + items = self.getElementsByTagName(selector); + continue; + } + + var splitter = splitters[i - 1]; + + var tagid = Selectors.Utils.parseTagAndID(selector); + var tag = tagid[0], id = tagid[1]; + + if (i == 0){ + items = Selectors.Utils.getByTagAndID(self, tag, id); + } else { + var uniques = {}, found = []; + for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques); + items = found; + } + + var parsed = Selectors.Utils.parseSelector(selector); + + if (parsed){ + filtered = []; + for (var m = 0, n = items.length; m < n; m++){ + item = items[m]; + if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item); + } + items = filtered; + } + + } + + return items; + + } + +}; + +Selectors.Getters = { + + ' ': function(found, self, tag, id, uniques){ + var items = Selectors.Utils.getByTagAndID(self, tag, id); + for (var i = 0, l = items.length; i < l; i++){ + var item = items[i]; + if (Selectors.Utils.chk(item, uniques)) found.push(item); + } + return found; + }, + + '>': function(found, self, tag, id, uniques){ + var children = Selectors.Utils.getByTagAndID(self, tag, id); + for (var i = 0, l = children.length; i < l; i++){ + var child = children[i]; + if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child); + } + return found; + }, + + '+': function(found, self, tag, id, uniques){ + while ((self = self.nextSibling)){ + if (self.nodeType == 1){ + if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self); + break; + } + } + return found; + }, + + '~': function(found, self, tag, id, uniques){ + while ((self = self.nextSibling)){ + if (self.nodeType == 1){ + if (!Selectors.Utils.chk(self, uniques)) break; + if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self); + } + } + return found; + } + +}; + +Selectors.Filters = { + + byTag: function(self, tag){ + return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag)); + }, + + byID: function(self, id){ + return (!id || (self.id && self.id == id)); + }, + + byClass: function(self, klass){ + return (self.className && self.className.contains && self.className.contains(klass, ' ')); + }, + + byPseudo: function(self, parser, argument, local){ + return parser.call(self, argument, local); + }, + + byAttribute: function(self, name, operator, value){ + var result = Element.prototype.getProperty.call(self, name); + if (!result) return (operator == '!='); + if (!operator || value == undefined) return true; + switch (operator){ + case '=': return (result == value); + case '*=': return (result.contains(value)); + case '^=': return (result.substr(0, value.length) == value); + case '$=': return (result.substr(result.length - value.length) == value); + case '!=': return (result != value); + case '~=': return result.contains(value, ' '); + case '|=': return result.contains(value, '-'); + } + return false; + } + +}; + +Selectors.Pseudo = new Hash({ + + // w3c pseudo selectors + + checked: function(){ + return this.checked; + }, + + empty: function(){ + return !(this.innerText || this.textContent || '').length; + }, + + not: function(selector){ + return !Element.match(this, selector); + }, + + contains: function(text){ + return (this.innerText || this.textContent || '').contains(text); + }, + + 'first-child': function(){ + return Selectors.Pseudo.index.call(this, 0); + }, + + 'last-child': function(){ + var element = this; + while ((element = element.nextSibling)){ + if (element.nodeType == 1) return false; + } + return true; + }, + + 'only-child': function(){ + var prev = this; + while ((prev = prev.previousSibling)){ + if (prev.nodeType == 1) return false; + } + var next = this; + while ((next = next.nextSibling)){ + if (next.nodeType == 1) return false; + } + return true; + }, + + 'nth-child': function(argument, local){ + argument = (argument == undefined) ? 'n' : argument; + var parsed = Selectors.Utils.parseNthArgument(argument); + if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local); + var count = 0; + local.positions = local.positions || {}; + var uid = $uid(this); + if (!local.positions[uid]){ + var self = this; + while ((self = self.previousSibling)){ + if (self.nodeType != 1) continue; + count ++; + var position = local.positions[$uid(self)]; + if (position != undefined){ + count = position + count; + break; + } + } + local.positions[uid] = count; + } + return (local.positions[uid] % parsed.a == parsed.b); + }, + + // custom pseudo selectors + + index: function(index){ + var element = this, count = 0; + while ((element = element.previousSibling)){ + if (element.nodeType == 1 && ++count > index) return false; + } + return (count == index); + }, + + even: function(argument, local){ + return Selectors.Pseudo['nth-child'].call(this, '2n+1', local); + }, + + odd: function(argument, local){ + return Selectors.Pseudo['nth-child'].call(this, '2n', local); + }, + + selected: function(){ + return this.selected; + }, + + enabled: function(){ + return (this.disabled === false); + } + +}); +/* +--- + +script: DomReady.js + +description: Contains the custom event domready. + +license: MIT-style license. + +requires: +- /Element.Event + +provides: [DomReady] + +... +*/ + +Element.Events.domready = { + + onAdd: function(fn){ + if (Browser.loaded) fn.call(this); + } + +}; + +(function(){ + + var domready = function(){ + if (Browser.loaded) return; + Browser.loaded = true; + window.fireEvent('domready'); + document.fireEvent('domready'); + }; + + window.addEvent('load', domready); + + if (Browser.Engine.trident){ + var temp = document.createElement('div'); + (function(){ + ($try(function(){ + temp.doScroll(); // Technique by Diego Perini + return document.id(temp).inject(document.body).set('html', 'temp').dispose(); + })) ? domready() : arguments.callee.delay(50); + })(); + } else if (Browser.Engine.webkit && Browser.Engine.version < 525){ + (function(){ + (['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50); + })(); + } else { + document.addEvent('DOMContentLoaded', domready); + } + +})(); +/* +--- + +script: JSON.js + +description: JSON encoder and decoder. + +license: MIT-style license. + +See Also: + +requires: +- /Array +- /String +- /Number +- /Function +- /Hash + +provides: [JSON] + +... +*/ + +var JSON = new Hash(this.JSON && { + stringify: JSON.stringify, + parse: JSON.parse +}).extend({ + + $specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}, + + $replaceChars: function(chr){ + return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16); + }, + + encode: function(obj){ + switch ($type(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"'; + case 'array': + return '[' + String(obj.map(JSON.encode).clean()) + ']'; + case 'object': case 'hash': + var string = []; + Hash.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return String(obj); + case false: return 'null'; + } + return null; + }, + + decode: function(string, secure){ + if ($type(string) != 'string' || !string.length) return null; + if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null; + return eval('(' + string + ')'); + } + +}); + +Native.implement([Hash, Array, String, Number], { + + toJSON: function(){ + return JSON.encode(this); + } + +}); +/* +--- + +script: Cookie.js + +description: Class for creating, reading, and deleting browser Cookies. + +license: MIT-style license. + +credits: +- Based on the functions by Peter-Paul Koch (http://quirksmode.org). + +requires: +- /Options + +provides: [Cookie] + +... +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: false, + domain: false, + duration: false, + secure: false, + document: document + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, $merge(this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; +/* +--- + +script: Swiff.js + +description: Wrapper for embedding SWF movies. Supports External Interface Communication. + +license: MIT-style license. + +credits: +- Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject. + +requires: +- /Options +- /$util + +provides: [Swiff] + +... +*/ + +var Swiff = new Class({ + + Implements: [Options], + + options: { + id: null, + height: 1, + width: 1, + container: null, + properties: {}, + params: { + quality: 'high', + allowScriptAccess: 'always', + wMode: 'transparent', + swLiveConnect: true + }, + callBacks: {}, + vars: {} + }, + + toElement: function(){ + return this.object; + }, + + initialize: function(path, options){ + this.instance = 'Swiff_' + $time(); + + this.setOptions(options); + options = this.options; + var id = this.id = options.id || this.instance; + var container = document.id(options.container); + + Swiff.CallBacks[this.instance] = {}; + + var params = options.params, vars = options.vars, callBacks = options.callBacks; + var properties = $extend({height: options.height, width: options.width}, options.properties); + + var self = this; + + for (var callBack in callBacks){ + Swiff.CallBacks[this.instance][callBack] = (function(option){ + return function(){ + return option.apply(self.object, arguments); + }; + })(callBacks[callBack]); + vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack; + } + + params.flashVars = Hash.toQueryString(vars); + if (Browser.Engine.trident){ + properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + params.movie = path; + } else { + properties.type = 'application/x-shockwave-flash'; + properties.data = path; + } + var build = ''; + } + build += ''; + this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild; + }, + + replaces: function(element){ + element = document.id(element, true); + element.parentNode.replaceChild(this.toElement(), element); + return this; + }, + + inject: function(element){ + document.id(element, true).appendChild(this.toElement()); + return this; + }, + + remote: function(){ + return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments)); + } + +}); + +Swiff.CallBacks = {}; + +Swiff.remote = function(obj, fn){ + var rs = obj.CallFunction('' + __flash__argumentsToXML(arguments, 2) + ''); + return eval(rs); +}; +/* +--- + +script: Fx.js + +description: Contains the basic animation logic to be extended by all other Fx Classes. + +license: MIT-style license. + +requires: +- /Chain +- /Events +- /Options + +provides: [Fx] + +... +*/ + +var Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: $empty, + onCancel: $empty, + onComplete: $empty, + */ + fps: 50, + unit: false, + duration: 500, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt(); + var wait = this.options.wait; + if (wait === false) this.options.link = 'cancel'; + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(){ + var time = $time(); + if (time < this.time + this.options.duration){ + var delta = this.transition((time - this.time) / this.options.duration); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.set(this.compute(this.from, this.to, 1)); + this.complete(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(){ + if (!this.timer) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.bind(this, arguments)); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(from, to)) return this; + this.from = from; + this.to = to; + this.time = 0; + this.transition = this.getTransition(); + this.startTimer(); + this.onStart(); + return this; + }, + + complete: function(){ + if (this.stopTimer()) this.onComplete(); + return this; + }, + + cancel: function(){ + if (this.stopTimer()) this.onCancel(); + return this; + }, + + onStart: function(){ + this.fireEvent('start', this.subject); + }, + + onComplete: function(){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + }, + + onCancel: function(){ + this.fireEvent('cancel', this.subject).clearChain(); + }, + + pause: function(){ + this.stopTimer(); + return this; + }, + + resume: function(){ + this.startTimer(); + return this; + }, + + stopTimer: function(){ + if (!this.timer) return false; + this.time = $time() - this.time; + this.timer = $clear(this.timer); + return true; + }, + + startTimer: function(){ + if (this.timer) return false; + this.time = $time() - this.time; + this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this); + return true; + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; +/* +--- + +script: Fx.CSS.js + +description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +license: MIT-style license. + +requires: +- /Fx +- /Element.Style + +provides: [Fx.CSS] + +... +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = $splat(values); + var values1 = values[1]; + if (!$chk(values1)){ + values[1] = values[0]; + values[0] = element.getStyle(property); + } + var parsed = values.map(this.parse); + return {from: parsed[0], to: parsed[1]}; + }, + + //parses a value into an array + + parse: function(value){ + value = $lambda(value)(); + value = (typeof value == 'string') ? value.split(' ') : $splat(value); + return value.map(function(val){ + val = String(val); + var found = false; + Fx.CSS.Parsers.each(function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if ($chk(parsed)) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = {name: 'fx:css:value'}; + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if ($type(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}; + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.contains('://') && !href.contains(document.domain)) return; + var rules = sheet.rules || sheet.cssRules; + Array.each(rules, function(rule, i){ + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorText.test('^' + selector + '$')) return; + Element.Styles.each(function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value; + }); + }); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = new Hash({ + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: $lambda(false), + compute: $arguments(1), + serve: $arguments(0) + } + +}); +/* +--- + +script: Fx.Tween.js + +description: Formerly Fx.Style, effect to transition any CSS property for an element. + +license: MIT-style license. + +requires: +- /Fx.CSS + +provides: [Fx.Tween, Element.fade, Element.highlight] + +... +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + var tween = this.retrieve('tween'); + if (tween) tween.cancel(); + return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('tween')){ + if (options || !this.retrieve('tween:options')) this.set('tween', options); + this.store('tween', new Fx.Tween(this, this.retrieve('tween:options'))); + } + return this.retrieve('tween'); + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(arguments); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), o = 'opacity', toggle; + how = $pick(how, 'toggle'); + switch (how){ + case 'in': fade.start(o, 1); break; + case 'out': fade.start(o, 0); break; + case 'show': fade.set(o, 1); break; + case 'hide': fade.set(o, 0); break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.get('opacity') == 1); + fade.start(o, (flag) ? 0 : 1); + this.store('fade:flag', !flag); + toggle = true; + break; + default: fade.start(o, arguments); + } + if (!toggle) this.eliminate('fade:flag'); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); +/* +--- + +script: Fx.Morph.js + +description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. + +license: MIT-style license. + +requires: +- /Fx.CSS + +provides: [Fx.Morph] + +... +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + var morph = this.retrieve('morph'); + if (morph) morph.cancel(); + return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('morph')){ + if (options || !this.retrieve('morph:options')) this.set('morph', options); + this.store('morph', new Fx.Morph(this, this.retrieve('morph:options'))); + } + return this.retrieve('morph'); + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); +/* +--- + +script: Fx.Transitions.js + +description: Contains a set of advanced transitions to be used with any of the Fx Classes. + +license: MIT-style license. + +credits: +- Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. + +requires: +- /Fx + +provides: [Fx.Transitions] + +... +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = $splat(params); + return $extend(transition, { + easeIn: function(pos){ + return transition(pos, params); + }, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2; + } + }); +}; + +Fx.Transitions = new Hash({ + + linear: $arguments(0) + +}); + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.sin((1 - p) * Math.PI / 2); + }, + + Back: function(p, x){ + x = x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, [i + 2]); + }); +}); +/* +--- + +script: Request.js + +description: Powerful all purpose Request Class. Uses XMLHTTPRequest. + +license: MIT-style license. + +requires: +- /Element +- /Chain +- /Events +- /Options +- /Browser + +provides: [Request] + +... +*/ + +var Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: $empty, + onComplete: $empty, + onCancel: $empty, + onSuccess: $empty, + onFailure: $empty, + onException: $empty,*/ + url: '', + data: '', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }, + async: true, + format: false, + method: 'post', + link: 'ignore', + isSuccess: null, + emulation: true, + urlEncoded: true, + encoding: 'utf-8', + evalScripts: false, + evalResponse: false, + noCache: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.headers = new Hash(this.options.headers); + }, + + onStateChange: function(){ + if (this.xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + $try(function(){ + this.status = this.xhr.status; + }.bind(this)); + this.xhr.onreadystatechange = $empty; + if (this.options.isSuccess.call(this, this.status)){ + this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML}; + this.success(this.response.text, this.response.xml); + } else { + this.response = {text: null, xml: null}; + this.failure(); + } + }, + + isSuccess: function(){ + return ((this.status >= 200) && (this.status < 300)); + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + setHeader: function(name, value){ + this.headers.set(name, value); + return this; + }, + + getHeader: function(name){ + return $try(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.bind(this, arguments)); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(options)) return this; + this.running = true; + + var type = $type(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = $extend({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = String(options.url), method = options.method.toLowerCase(); + + switch ($type(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Hash.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && !['get', 'post'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && method == 'post'){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding); + } + + if (this.options.noCache){ + var noCache = 'noCache=' + new Date().getTime(); + data = (data) ? noCache + '&' + data : noCache; + } + + var trimPosition = url.lastIndexOf('/'); + if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); + + if (data && method == 'get'){ + url = url + (url.contains('?') ? '&' : '?') + data; + data = null; + } + + this.xhr.open(method.toUpperCase(), url, this.options.async); + + this.xhr.onreadystatechange = this.onStateChange.bind(this); + + this.headers.each(function(value, key){ + try { + this.xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + this.xhr.send(data); + if (!this.options.async) this.onStateChange(); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + this.xhr.abort(); + this.xhr.onreadystatechange = $empty; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +(function(){ + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(){ + var params = Array.link(arguments, {url: String.type, data: $defined}); + return this.send($extend(params, {method: method})); + }; +}); + +Request.implement(methods); + +})(); + +Element.Properties.send = { + + set: function(options){ + var send = this.retrieve('send'); + if (send) send.cancel(); + return this.eliminate('send').store('send:options', $extend({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }, options)); + }, + + get: function(options){ + if (options || !this.retrieve('send')){ + if (options || !this.retrieve('send:options')) this.set('send', options); + this.store('send', new Request(this.retrieve('send:options'))); + } + return this.retrieve('send'); + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); +/* +--- + +script: Request.HTML.js + +description: Extends the basic Request Class with additional methods for interacting with HTML responses. + +license: MIT-style license. + +requires: +- /Request +- /Element + +provides: [Request.HTML] + +... +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + append: false, + evalScripts: true, + filter: false + }, + + processHTML: function(text){ + var match = text.match(/]*>([\s\S]*?)<\/body>/i); + text = (match) ? match[1] : text; + + var container = new Element('div'); + + return $try(function(){ + var root = '' + text + '', doc; + if (Browser.Engine.trident){ + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = false; + doc.loadXML(root); + } else { + doc = new DOMParser().parseFromString(root, 'text/xml'); + } + root = doc.getElementsByTagName('root')[0]; + if (!root) return null; + for (var i = 0, k = root.childNodes.length; i < k; i++){ + var child = Element.clone(root.childNodes[i], true, true); + if (child) container.grab(child); + } + return container; + }) || container.set('html', text); + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var temp = this.processHTML(response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements('*'); + + if (options.filter) response.tree = response.elements.filter(options.filter); + if (options.update) document.id(options.update).empty().set('html', response.html); + else if (options.append) document.id(options.append).adopt(temp.getChildren()); + if (options.evalScripts) $exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.retrieve('load'); + if (load) load.cancel(); + return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options)); + }, + + get: function(options){ + if (options || ! this.retrieve('load')){ + if (options || !this.retrieve('load:options')) this.set('load', options); + this.store('load', new Request.HTML(this.retrieve('load:options'))); + } + return this.retrieve('load'); + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type})); + return this; + } + +}); +/* +--- + +script: Request.JSON.js + +description: Extends the basic Request Class with additional methods for sending and receiving JSON data. + +license: MIT-style license. + +requires: +- /Request JSON + +provides: [Request.HTML] + +... +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + secure: true + }, + + initialize: function(options){ + this.parent(options); + this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'}); + }, + + success: function(text){ + this.response.json = JSON.decode(text, this.options.secure); + this.onSuccess(this.response.json, text); + } + +}); +/* +--- + +script: More.js + +description: MooTools More + +license: MIT-style license + +authors: +- Guillermo Rauch +- Thomas Aylott +- Scott Kyle + +requires: +- core:1.2.4/MooTools + +provides: [MooTools.More] + +... +*/ + +MooTools.More = { + 'version': '1.2.4.2', + 'build': 'bd5a93c0913cce25917c48cbdacde568e15e02ef' +};/* +--- + +script: Fx.Elements.js + +description: Effect to change any number of CSS properties of any number of Elements. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Fx.CSS +- /MooTools.More + +provides: [Fx.Elements] + +... +*/ + +Fx.Elements = new Class({ + + Extends: Fx.CSS, + + initialize: function(elements, options){ + this.elements = this.subject = $$(elements); + this.parent(options); + }, + + compute: function(from, to, delta){ + var now = {}; + for (var i in from){ + var iFrom = from[i], iTo = to[i], iNow = now[i] = {}; + for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta); + } + return now; + }, + + set: function(now){ + for (var i in now){ + var iNow = now[i]; + for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit); + } + return this; + }, + + start: function(obj){ + if (!this.check(obj)) return this; + var from = {}, to = {}; + for (var i in obj){ + var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {}; + for (var p in iProps){ + var parsed = this.prepare(this.elements[i], p, iProps[p]); + iFrom[p] = parsed.from; + iTo[p] = parsed.to; + } + } + return this.parent(from, to); + } + +});/* +--- + +script: Fx.Accordion.js + +description: An Fx.Elements extension which allows you to easily create accordion type controls. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Element.Event +- /Fx.Elements + +provides: [Fx.Accordion] + +... +*/ + +var Accordion = Fx.Accordion = new Class({ + + Extends: Fx.Elements, + + options: {/* + onActive: $empty(toggler, section), + onBackground: $empty(toggler, section), + fixedHeight: false, + fixedWidth: false, + */ + display: 0, + show: false, + height: true, + width: false, + opacity: true, + alwaysHide: false, + trigger: 'click', + initialDisplayFx: true, + returnHeightToAuto: true + }, + + initialize: function(){ + var params = Array.link(arguments, {'container': Element.type, 'options': Object.type, 'togglers': $defined, 'elements': $defined}); + this.parent(params.elements, params.options); + this.togglers = $$(params.togglers); + this.container = document.id(params.container); + this.previous = -1; + this.internalChain = new Chain(); + if (this.options.alwaysHide) this.options.wait = true; + if ($chk(this.options.show)){ + this.options.display = false; + this.previous = this.options.show; + } + if (this.options.start){ + this.options.display = false; + this.options.show = false; + } + this.effects = {}; + if (this.options.opacity) this.effects.opacity = 'fullOpacity'; + if (this.options.width) this.effects.width = this.options.fixedWidth ? 'fullWidth' : 'offsetWidth'; + if (this.options.height) this.effects.height = this.options.fixedHeight ? 'fullHeight' : 'scrollHeight'; + for (var i = 0, l = this.togglers.length; i < l; i++) this.addSection(this.togglers[i], this.elements[i]); + this.elements.each(function(el, i){ + if (this.options.show === i){ + this.fireEvent('active', [this.togglers[i], el]); + } else { + for (var fx in this.effects) el.setStyle(fx, 0); + } + }, this); + if ($chk(this.options.display)) this.display(this.options.display, this.options.initialDisplayFx); + this.addEvent('complete', this.internalChain.callChain.bind(this.internalChain)); + }, + + addSection: function(toggler, element){ + toggler = document.id(toggler); + element = document.id(element); + var test = this.togglers.contains(toggler); + this.togglers.include(toggler); + this.elements.include(element); + var idx = this.togglers.indexOf(toggler); + var displayer = this.display.bind(this, idx); + toggler.store('accordion:display', displayer); + toggler.addEvent(this.options.trigger, displayer); + if (this.options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'}); + if (this.options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'}); + element.fullOpacity = 1; + if (this.options.fixedWidth) element.fullWidth = this.options.fixedWidth; + if (this.options.fixedHeight) element.fullHeight = this.options.fixedHeight; + element.setStyle('overflow', 'hidden'); + if (!test){ + for (var fx in this.effects) element.setStyle(fx, 0); + } + return this; + }, + + detach: function(){ + this.togglers.each(function(toggler) { + toggler.removeEvent(this.options.trigger, toggler.retrieve('accordion:display')); + }, this); + }, + + display: function(index, useFx){ + if (!this.check(index, useFx)) return this; + useFx = $pick(useFx, true); + if (this.options.returnHeightToAuto){ + var prev = this.elements[this.previous]; + if (prev && !this.selfHidden){ + for (var fx in this.effects){ + prev.setStyle(fx, prev[this.effects[fx]]); + } + } + } + index = ($type(index) == 'element') ? this.elements.indexOf(index) : index; + if ((this.timer && this.options.wait) || (index === this.previous && !this.options.alwaysHide)) return this; + this.previous = index; + var obj = {}; + this.elements.each(function(el, i){ + obj[i] = {}; + var hide; + if (i != index){ + hide = true; + } else if (this.options.alwaysHide && ((el.offsetHeight > 0 && this.options.height) || el.offsetWidth > 0 && this.options.width)){ + hide = true; + this.selfHidden = true; + } + this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]); + for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]]; + }, this); + this.internalChain.chain(function(){ + if (this.options.returnHeightToAuto && !this.selfHidden){ + var el = this.elements[index]; + if (el) el.setStyle('height', 'auto'); + }; + }.bind(this)); + return useFx ? this.start(obj) : this.set(obj); + } + +});/* +--- + +script: Fx.Scroll.js + +description: Effect to smoothly scroll any element, including the window. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Fx +- core:1.2.4/Element.Event +- core:1.2.4/Element.Dimensions +- /MooTools.More + +provides: [Fx.Scroll] + +... +*/ + +Fx.Scroll = new Class({ + + Extends: Fx, + + options: { + offset: {x: 0, y: 0}, + wheelStops: true + }, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + var cancel = this.cancel.bind(this, false); + + if ($type(this.element) != 'element') this.element = document.id(this.element.getDocument().body); + + var stopper = this.element; + + if (this.options.wheelStops){ + this.addEvent('start', function(){ + stopper.addEvent('mousewheel', cancel); + }, true); + this.addEvent('complete', function(){ + stopper.removeEvent('mousewheel', cancel); + }, true); + } + }, + + set: function(){ + var now = Array.flatten(arguments); + if (Browser.Engine.gecko) now = [Math.round(now[0]), Math.round(now[1])]; + this.element.scrollTo(now[0], now[1]); + }, + + compute: function(from, to, delta){ + return [0, 1].map(function(i){ + return Fx.compute(from[i], to[i], delta); + }); + }, + + start: function(x, y){ + if (!this.check(x, y)) return this; + var scrollSize = this.element.getScrollSize(), + scroll = this.element.getScroll(), + values = {x: x, y: y}; + for (var z in values){ + var max = scrollSize[z]; + if ($chk(values[z])) values[z] = ($type(values[z]) == 'number') ? values[z] : max; + else values[z] = scroll[z]; + values[z] += this.options.offset[z]; + } + return this.parent([scroll.x, scroll.y], [values.x, values.y]); + }, + + toTop: function(){ + return this.start(false, 0); + }, + + toLeft: function(){ + return this.start(0, false); + }, + + toRight: function(){ + return this.start('right', false); + }, + + toBottom: function(){ + return this.start(false, 'bottom'); + }, + + toElement: function(el){ + var position = document.id(el).getPosition(this.element); + return this.start(position.x, position.y); + }, + + scrollIntoView: function(el, axes, offset){ + axes = axes ? $splat(axes) : ['x','y']; + var to = {}; + el = document.id(el); + var pos = el.getPosition(this.element); + var size = el.getSize(); + var scroll = this.element.getScroll(); + var containerSize = this.element.getSize(); + var edge = { + x: pos.x + size.x, + y: pos.y + size.y + }; + ['x','y'].each(function(axis) { + if (axes.contains(axis)) { + if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis]; + if (pos[axis] < scroll[axis]) to[axis] = pos[axis]; + } + if (to[axis] == null) to[axis] = scroll[axis]; + if (offset && offset[axis]) to[axis] = to[axis] + offset[axis]; + }, this); + if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y); + return this; + }, + + scrollToCenter: function(el, axes, offset){ + axes = axes ? $splat(axes) : ['x', 'y']; + el = $(el); + var to = {}, + pos = el.getPosition(this.element), + size = el.getSize(), + scroll = this.element.getScroll(), + containerSize = this.element.getSize(), + edge = { + x: pos.x + size.x, + y: pos.y + size.y + }; + + ['x','y'].each(function(axis){ + if(axes.contains(axis)){ + to[axis] = pos[axis] - (containerSize[axis] - size[axis])/2; + } + if(to[axis] == null) to[axis] = scroll[axis]; + if(offset && offset[axis]) to[axis] = to[axis] + offset[axis]; + }, this); + if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y); + return this; + } + +}); +/* +--- + +script: Fx.Slide.js + +description: Effect to slide an element in and out of view. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Fx Element.Style +- /MooTools.More + +provides: [Fx.Slide] + +... +*/ + +Fx.Slide = new Class({ + + Extends: Fx, + + options: { + mode: 'vertical', + hideOverflow: true + }, + + initialize: function(element, options){ + this.addEvent('complete', function(){ + this.open = (this.wrapper['offset' + this.layout.capitalize()] != 0); + if (this.open && Browser.Engine.webkit419) this.element.dispose().inject(this.wrapper); + }, true); + this.element = this.subject = document.id(element); + this.parent(options); + var wrapper = this.element.retrieve('wrapper'); + var styles = this.element.getStyles('margin', 'position', 'overflow'); + if (this.options.hideOverflow) styles = $extend(styles, {overflow: 'hidden'}); + this.wrapper = wrapper || new Element('div', { + styles: styles + }).wraps(this.element); + this.element.store('wrapper', this.wrapper).setStyle('margin', 0); + this.now = []; + this.open = true; + }, + + vertical: function(){ + this.margin = 'margin-top'; + this.layout = 'height'; + this.offset = this.element.offsetHeight; + }, + + horizontal: function(){ + this.margin = 'margin-left'; + this.layout = 'width'; + this.offset = this.element.offsetWidth; + }, + + set: function(now){ + this.element.setStyle(this.margin, now[0]); + this.wrapper.setStyle(this.layout, now[1]); + return this; + }, + + compute: function(from, to, delta){ + return [0, 1].map(function(i){ + return Fx.compute(from[i], to[i], delta); + }); + }, + + start: function(how, mode){ + if (!this.check(how, mode)) return this; + this[mode || this.options.mode](); + var margin = this.element.getStyle(this.margin).toInt(); + var layout = this.wrapper.getStyle(this.layout).toInt(); + var caseIn = [[margin, layout], [0, this.offset]]; + var caseOut = [[margin, layout], [-this.offset, 0]]; + var start; + switch (how){ + case 'in': start = caseIn; break; + case 'out': start = caseOut; break; + case 'toggle': start = (layout == 0) ? caseIn : caseOut; + } + return this.parent(start[0], start[1]); + }, + + slideIn: function(mode){ + return this.start('in', mode); + }, + + slideOut: function(mode){ + return this.start('out', mode); + }, + + hide: function(mode){ + this[mode || this.options.mode](); + this.open = false; + return this.set([-this.offset, 0]); + }, + + show: function(mode){ + this[mode || this.options.mode](); + this.open = true; + return this.set([0, this.offset]); + }, + + toggle: function(mode){ + return this.start('toggle', mode); + } + +}); + +Element.Properties.slide = { + + set: function(options){ + var slide = this.retrieve('slide'); + if (slide) slide.cancel(); + return this.eliminate('slide').store('slide:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('slide')){ + if (options || !this.retrieve('slide:options')) this.set('slide', options); + this.store('slide', new Fx.Slide(this, this.retrieve('slide:options'))); + } + return this.retrieve('slide'); + } + +}; + +Element.implement({ + + slide: function(how, mode){ + how = how || 'toggle'; + var slide = this.get('slide'), toggle; + switch (how){ + case 'hide': slide.hide(mode); break; + case 'show': slide.show(mode); break; + case 'toggle': + var flag = this.retrieve('slide:flag', slide.open); + slide[flag ? 'slideOut' : 'slideIn'](mode); + this.store('slide:flag', !flag); + toggle = true; + break; + default: slide.start(how, mode); + } + if (!toggle) this.eliminate('slide:flag'); + return this; + } + +}); +/* +--- + +script: Fx.SmoothScroll.js + +description: Class for creating a smooth scrolling effect to all internal links on the page. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Selectors +- /Fx.Scroll + +provides: [Fx.SmoothScroll] + +... +*/ + +var SmoothScroll = Fx.SmoothScroll = new Class({ + + Extends: Fx.Scroll, + + initialize: function(options, context){ + context = context || document; + this.doc = context.getDocument(); + var win = context.getWindow(); + this.parent(this.doc, options); + this.links = $$(this.options.links || this.doc.links); + var location = win.location.href.match(/^[^#]*/)[0] + '#'; + this.links.each(function(link){ + if (link.href.indexOf(location) != 0) {return;} + var anchor = link.href.substr(location.length); + if (anchor) this.useLink(link, anchor); + }, this); + if (!Browser.Engine.webkit419) { + this.addEvent('complete', function(){ + win.location.hash = this.anchor; + }, true); + } + }, + + useLink: function(link, anchor){ + var el; + link.addEvent('click', function(event){ + if (el !== false && !el) el = document.id(anchor) || this.doc.getElement('a[name=' + anchor + ']'); + if (el) { + event.preventDefault(); + this.anchor = anchor; + this.toElement(el).chain(function(){ + this.fireEvent('scrolledTo', [link, el]); + }.bind(this)); + link.blur(); + } + }.bind(this)); + } +});/* +--- + +script: Drag.js + +description: The base Drag Class. Can be used to drag and resize Elements using mouse events. + +license: MIT-style license + +authors: +- Valerio Proietti +- Tom Occhinno +- Jan Kassens + +requires: +- core:1.2.4/Events +- core:1.2.4/Options +- core:1.2.4/Element.Event +- core:1.2.4/Element.Style +- /MooTools.More + +provides: [Drag] + +*/ + +var Drag = new Class({ + + Implements: [Events, Options], + + options: {/* + onBeforeStart: $empty(thisElement), + onStart: $empty(thisElement, event), + onSnap: $empty(thisElement) + onDrag: $empty(thisElement, event), + onCancel: $empty(thisElement), + onComplete: $empty(thisElement, event),*/ + snap: 6, + unit: 'px', + grid: false, + style: true, + limit: false, + handle: false, + invert: false, + preventDefault: false, + stopPropagation: false, + modifiers: {x: 'left', y: 'top'} + }, + + initialize: function(){ + var params = Array.link(arguments, {'options': Object.type, 'element': $defined}); + this.element = document.id(params.element); + this.document = this.element.getDocument(); + this.setOptions(params.options || {}); + var htype = $type(this.options.handle); + this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element; + this.mouse = {'now': {}, 'pos': {}}; + this.value = {'start': {}, 'now': {}}; + + this.selection = (Browser.Engine.trident) ? 'selectstart' : 'mousedown'; + + this.bound = { + start: this.start.bind(this), + check: this.check.bind(this), + drag: this.drag.bind(this), + stop: this.stop.bind(this), + cancel: this.cancel.bind(this), + eventStop: $lambda(false) + }; + this.attach(); + }, + + attach: function(){ + this.handles.addEvent('mousedown', this.bound.start); + return this; + }, + + detach: function(){ + this.handles.removeEvent('mousedown', this.bound.start); + return this; + }, + + start: function(event){ + if (event.rightClick) return; + if (this.options.preventDefault) event.preventDefault(); + if (this.options.stopPropagation) event.stopPropagation(); + this.mouse.start = event.page; + this.fireEvent('beforeStart', this.element); + var limit = this.options.limit; + this.limit = {x: [], y: []}; + for (var z in this.options.modifiers){ + if (!this.options.modifiers[z]) continue; + if (this.options.style) this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt(); + else this.value.now[z] = this.element[this.options.modifiers[z]]; + if (this.options.invert) this.value.now[z] *= -1; + this.mouse.pos[z] = event.page[z] - this.value.now[z]; + if (limit && limit[z]){ + for (var i = 2; i--; i){ + if ($chk(limit[z][i])) this.limit[z][i] = $lambda(limit[z][i])(); + } + } + } + if ($type(this.options.grid) == 'number') this.options.grid = {x: this.options.grid, y: this.options.grid}; + this.document.addEvents({mousemove: this.bound.check, mouseup: this.bound.cancel}); + this.document.addEvent(this.selection, this.bound.eventStop); + }, + + check: function(event){ + if (this.options.preventDefault) event.preventDefault(); + var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); + if (distance > this.options.snap){ + this.cancel(); + this.document.addEvents({ + mousemove: this.bound.drag, + mouseup: this.bound.stop + }); + this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element); + } + }, + + drag: function(event){ + if (this.options.preventDefault) event.preventDefault(); + this.mouse.now = event.page; + for (var z in this.options.modifiers){ + if (!this.options.modifiers[z]) continue; + this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z]; + if (this.options.invert) this.value.now[z] *= -1; + if (this.options.limit && this.limit[z]){ + if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){ + this.value.now[z] = this.limit[z][1]; + } else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){ + this.value.now[z] = this.limit[z][0]; + } + } + if (this.options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % this.options.grid[z]); + if (this.options.style) { + this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit); + } else { + this.element[this.options.modifiers[z]] = this.value.now[z]; + } + } + this.fireEvent('drag', [this.element, event]); + }, + + cancel: function(event){ + this.document.removeEvent('mousemove', this.bound.check); + this.document.removeEvent('mouseup', this.bound.cancel); + if (event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.fireEvent('cancel', this.element); + } + }, + + stop: function(event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.document.removeEvent('mousemove', this.bound.drag); + this.document.removeEvent('mouseup', this.bound.stop); + if (event) this.fireEvent('complete', [this.element, event]); + } + +}); + +Element.implement({ + + makeResizable: function(options){ + var drag = new Drag(this, $merge({modifiers: {x: 'width', y: 'height'}}, options)); + this.store('resizer', drag); + return drag.addEvent('drag', function(){ + this.fireEvent('resize', drag); + }.bind(this)); + } + +}); +/* +--- + +script: Drag.Move.js + +description: A Drag extension that provides support for the constraining of draggables to containers and droppables. + +license: MIT-style license + +authors: +- Valerio Proietti +- Tom Occhinno +- Jan Kassens +- Aaron Newton +- Scott Kyle + +requires: +- core:1.2.4/Element.Dimensions +- /Drag + +provides: [Drag.Move] + +... +*/ + +Drag.Move = new Class({ + + Extends: Drag, + + options: {/* + onEnter: $empty(thisElement, overed), + onLeave: $empty(thisElement, overed), + onDrop: $empty(thisElement, overed, event),*/ + droppables: [], + container: false, + precalculate: false, + includeMargins: true, + checkDroppables: true + }, + + initialize: function(element, options){ + this.parent(element, options); + element = this.element; + + this.droppables = $$(this.options.droppables); + this.container = document.id(this.options.container); + + if (this.container && $type(this.container) != 'element') + this.container = document.id(this.container.getDocument().body); + + var styles = element.getStyles('left', 'right', 'position'); + if (styles.left == 'auto' || styles.top == 'auto') + element.setPosition(element.getPosition(element.getOffsetParent())); + + if (styles.position == 'static') + element.setStyle('position', 'absolute'); + + this.addEvent('start', this.checkDroppables, true); + + this.overed = null; + }, + + start: function(event){ + if (this.container) this.options.limit = this.calculateLimit(); + + if (this.options.precalculate){ + this.positions = this.droppables.map(function(el){ + return el.getCoordinates(); + }); + } + + this.parent(event); + }, + + calculateLimit: function(){ + var offsetParent = this.element.getOffsetParent(), + containerCoordinates = this.container.getCoordinates(offsetParent), + containerBorder = {}, + elementMargin = {}, + elementBorder = {}, + containerMargin = {}, + offsetParentPadding = {}; + + ['top', 'right', 'bottom', 'left'].each(function(pad){ + containerBorder[pad] = this.container.getStyle('border-' + pad).toInt(); + elementBorder[pad] = this.element.getStyle('border-' + pad).toInt(); + elementMargin[pad] = this.element.getStyle('margin-' + pad).toInt(); + containerMargin[pad] = this.container.getStyle('margin-' + pad).toInt(); + offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt(); + }, this); + + var width = this.element.offsetWidth + elementMargin.left + elementMargin.right, + height = this.element.offsetHeight + elementMargin.top + elementMargin.bottom, + left = 0, + top = 0, + right = containerCoordinates.right - containerBorder.right - width, + bottom = containerCoordinates.bottom - containerBorder.bottom - height; + + if (this.options.includeMargins){ + left += elementMargin.left; + top += elementMargin.top; + } else { + right += elementMargin.right; + bottom += elementMargin.bottom; + } + + if (this.element.getStyle('position') == 'relative'){ + var coords = this.element.getCoordinates(offsetParent); + coords.left -= this.element.getStyle('left').toInt(); + coords.top -= this.element.getStyle('top').toInt(); + + left += containerBorder.left - coords.left; + top += containerBorder.top - coords.top; + right += elementMargin.left - coords.left; + bottom += elementMargin.top - coords.top; + + if (this.container != offsetParent){ + left += containerMargin.left + offsetParentPadding.left; + top += (Browser.Engine.trident4 ? 0 : containerMargin.top) + offsetParentPadding.top; + } + } else { + left -= elementMargin.left; + top -= elementMargin.top; + + if (this.container == offsetParent){ + right -= containerBorder.left; + bottom -= containerBorder.top; + } else { + left += containerCoordinates.left + containerBorder.left; + top += containerCoordinates.top + containerBorder.top; + } + } + + return { + x: [left, right], + y: [top, bottom] + }; + }, + + checkAgainst: function(el, i){ + el = (this.positions) ? this.positions[i] : el.getCoordinates(); + var now = this.mouse.now; + return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top); + }, + + checkDroppables: function(){ + var overed = this.droppables.filter(this.checkAgainst, this).getLast(); + if (this.overed != overed){ + if (this.overed) this.fireEvent('leave', [this.element, this.overed]); + if (overed) this.fireEvent('enter', [this.element, overed]); + this.overed = overed; + } + }, + + drag: function(event){ + this.parent(event); + if (this.options.checkDroppables && this.droppables.length) this.checkDroppables(); + }, + + stop: function(event){ + this.checkDroppables(); + this.fireEvent('drop', [this.element, this.overed, event]); + this.overed = null; + return this.parent(event); + } + +}); + +Element.implement({ + + makeDraggable: function(options){ + var drag = new Drag.Move(this, options); + this.store('dragger', drag); + return drag; + } + +}); +/* +--- + +script: Class.Binds.js + +description: Automagically binds specified methods in a class to the instance of the class. + +license: MIT-style license + +authors: +- Aaron Newton + +requires: +- core:1.2.4/Class +- /MooTools.More + +provides: [Class.Binds] + +... +*/ + +Class.Mutators.Binds = function(binds){ + return binds; +}; + +Class.Mutators.initialize = function(initialize){ + return function(){ + $splat(this.Binds).each(function(name){ + var original = this[name]; + if (original) this[name] = original.bind(this); + }, this); + return initialize.apply(this, arguments); + }; +}; +/* +--- + +script: Element.Measure.js + +description: Extends the Element native object to include methods useful in measuring dimensions. + +credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz" + +license: MIT-style license + +authors: +- Aaron Newton + +requires: +- core:1.2.4/Element.Style +- core:1.2.4/Element.Dimensions +- /MooTools.More + +provides: [Element.Measure] + +... +*/ + +Element.implement({ + + measure: function(fn){ + var vis = function(el) { + return !!(!el || el.offsetHeight || el.offsetWidth); + }; + if (vis(this)) return fn.apply(this); + var parent = this.getParent(), + restorers = [], + toMeasure = []; + while (!vis(parent) && parent != document.body) { + toMeasure.push(parent.expose()); + parent = parent.getParent(); + } + var restore = this.expose(); + var result = fn.apply(this); + restore(); + toMeasure.each(function(restore){ + restore(); + }); + return result; + }, + + expose: function(){ + if (this.getStyle('display') != 'none') return $empty; + var before = this.style.cssText; + this.setStyles({ + display: 'block', + position: 'absolute', + visibility: 'hidden' + }); + return function(){ + this.style.cssText = before; + }.bind(this); + }, + + getDimensions: function(options){ + options = $merge({computeSize: false},options); + var dim = {}; + var getSize = function(el, options){ + return (options.computeSize)?el.getComputedSize(options):el.getSize(); + }; + var parent = this.getParent('body'); + if (parent && this.getStyle('display') == 'none'){ + dim = this.measure(function(){ + return getSize(this, options); + }); + } else if (parent){ + try { //safari sometimes crashes here, so catch it + dim = getSize(this, options); + }catch(e){} + } else { + dim = {x: 0, y: 0}; + } + return $chk(dim.x) ? $extend(dim, {width: dim.x, height: dim.y}) : $extend(dim, {x: dim.width, y: dim.height}); + }, + + getComputedSize: function(options){ + options = $merge({ + styles: ['padding','border'], + plains: { + height: ['top','bottom'], + width: ['left','right'] + }, + mode: 'both' + }, options); + var size = {width: 0,height: 0}; + switch (options.mode){ + case 'vertical': + delete size.width; + delete options.plains.width; + break; + case 'horizontal': + delete size.height; + delete options.plains.height; + break; + } + var getStyles = []; + //this function might be useful in other places; perhaps it should be outside this function? + $each(options.plains, function(plain, key){ + plain.each(function(edge){ + options.styles.each(function(style){ + getStyles.push((style == 'border') ? style + '-' + edge + '-' + 'width' : style + '-' + edge); + }); + }); + }); + var styles = {}; + getStyles.each(function(style){ styles[style] = this.getComputedStyle(style); }, this); + var subtracted = []; + $each(options.plains, function(plain, key){ //keys: width, height, plains: ['left', 'right'], ['top','bottom'] + var capitalized = key.capitalize(); + size['total' + capitalized] = size['computed' + capitalized] = 0; + plain.each(function(edge){ //top, left, right, bottom + size['computed' + edge.capitalize()] = 0; + getStyles.each(function(style, i){ //padding, border, etc. + //'padding-left'.test('left') size['totalWidth'] = size['width'] + [padding-left] + if (style.test(edge)){ + styles[style] = styles[style].toInt() || 0; //styles['padding-left'] = 5; + size['total' + capitalized] = size['total' + capitalized] + styles[style]; + size['computed' + edge.capitalize()] = size['computed' + edge.capitalize()] + styles[style]; + } + //if width != width (so, padding-left, for instance), then subtract that from the total + if (style.test(edge) && key != style && + (style.test('border') || style.test('padding')) && !subtracted.contains(style)){ + subtracted.push(style); + size['computed' + capitalized] = size['computed' + capitalized]-styles[style]; + } + }); + }); + }); + + ['Width', 'Height'].each(function(value){ + var lower = value.toLowerCase(); + if(!$chk(size[lower])) return; + + size[lower] = size[lower] + this['offset' + value] + size['computed' + value]; + size['total' + value] = size[lower] + size['total' + value]; + delete size['computed' + value]; + }, this); + + return $extend(styles, size); + } + +});/* +--- + +script: Slider.js + +description: Class for creating horizontal and vertical slider controls. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Element.Dimensions +- /Class.Binds +- /Drag +- /Element.Dimensions +- /Element.Measure + +provides: [Slider] + +... +*/ + +var Slider = new Class({ + + Implements: [Events, Options], + + Binds: ['clickedElement', 'draggedKnob', 'scrolledElement'], + + options: {/* + onTick: $empty(intPosition), + onChange: $empty(intStep), + onComplete: $empty(strStep),*/ + onTick: function(position){ + if (this.options.snap) position = this.toPosition(this.step); + this.knob.setStyle(this.property, position); + }, + initialStep: 0, + snap: false, + offset: 0, + range: false, + wheel: false, + steps: 100, + mode: 'horizontal' + }, + + initialize: function(element, knob, options){ + this.setOptions(options); + this.element = document.id(element); + this.knob = document.id(knob); + this.previousChange = this.previousEnd = this.step = -1; + var offset, limit = {}, modifiers = {'x': false, 'y': false}; + switch (this.options.mode){ + case 'vertical': + this.axis = 'y'; + this.property = 'top'; + offset = 'offsetHeight'; + break; + case 'horizontal': + this.axis = 'x'; + this.property = 'left'; + offset = 'offsetWidth'; + } + + this.full = this.element.measure(function(){ + this.half = this.knob[offset] / 2; + return this.element[offset] - this.knob[offset] + (this.options.offset * 2); + }.bind(this)); + + this.min = $chk(this.options.range[0]) ? this.options.range[0] : 0; + this.max = $chk(this.options.range[1]) ? this.options.range[1] : this.options.steps; + this.range = this.max - this.min; + this.steps = this.options.steps || this.full; + this.stepSize = Math.abs(this.range) / this.steps; + this.stepWidth = this.stepSize * this.full / Math.abs(this.range) ; + + this.knob.setStyle('position', 'relative').setStyle(this.property, this.options.initialStep ? this.toPosition(this.options.initialStep) : - this.options.offset); + modifiers[this.axis] = this.property; + limit[this.axis] = [- this.options.offset, this.full - this.options.offset]; + + var dragOptions = { + snap: 0, + limit: limit, + modifiers: modifiers, + onDrag: this.draggedKnob, + onStart: this.draggedKnob, + onBeforeStart: (function(){ + this.isDragging = true; + }).bind(this), + onCancel: function() { + this.isDragging = false; + }.bind(this), + onComplete: function(){ + this.isDragging = false; + this.draggedKnob(); + this.end(); + }.bind(this) + }; + if (this.options.snap){ + dragOptions.grid = Math.ceil(this.stepWidth); + dragOptions.limit[this.axis][1] = this.full; + } + + this.drag = new Drag(this.knob, dragOptions); + this.attach(); + }, + + attach: function(){ + this.element.addEvent('mousedown', this.clickedElement); + if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement); + this.drag.attach(); + return this; + }, + + detach: function(){ + this.element.removeEvent('mousedown', this.clickedElement); + this.element.removeEvent('mousewheel', this.scrolledElement); + this.drag.detach(); + return this; + }, + + set: function(step){ + if (!((this.range > 0) ^ (step < this.min))) step = this.min; + if (!((this.range > 0) ^ (step > this.max))) step = this.max; + + this.step = Math.round(step); + this.checkStep(); + this.fireEvent('tick', this.toPosition(this.step)); + this.end(); + return this; + }, + + clickedElement: function(event){ + if (this.isDragging || event.target == this.knob) return; + + var dir = this.range < 0 ? -1 : 1; + var position = event.page[this.axis] - this.element.getPosition()[this.axis] - this.half; + position = position.limit(-this.options.offset, this.full -this.options.offset); + + this.step = Math.round(this.min + dir * this.toStep(position)); + this.checkStep(); + this.fireEvent('tick', position); + this.end(); + }, + + scrolledElement: function(event){ + var mode = (this.options.mode == 'horizontal') ? (event.wheel < 0) : (event.wheel > 0); + this.set(mode ? this.step - this.stepSize : this.step + this.stepSize); + event.stop(); + }, + + draggedKnob: function(){ + var dir = this.range < 0 ? -1 : 1; + var position = this.drag.value.now[this.axis]; + position = position.limit(-this.options.offset, this.full -this.options.offset); + this.step = Math.round(this.min + dir * this.toStep(position)); + this.checkStep(); + }, + + checkStep: function(){ + if (this.previousChange != this.step){ + this.previousChange = this.step; + this.fireEvent('change', this.step); + } + }, + + end: function(){ + if (this.previousEnd !== this.step){ + this.previousEnd = this.step; + this.fireEvent('complete', this.step + ''); + } + }, + + toStep: function(position){ + var step = (position + this.options.offset) * this.stepSize / this.full * this.steps; + return this.options.steps ? Math.round(step -= step % this.stepSize) : step; + }, + + toPosition: function(step){ + return (this.full * Math.abs(this.min - step)) / (this.steps * this.stepSize) - this.options.offset; + } + +});/* +--- + +script: Sortables.js + +description: Class for creating a drag and drop sorting interface for lists of items. + +license: MIT-style license + +authors: +- Tom Occhino + +requires: +- /Drag.Move + +provides: [Slider] + +... +*/ + +var Sortables = new Class({ + + Implements: [Events, Options], + + options: {/* + onSort: $empty(element, clone), + onStart: $empty(element, clone), + onComplete: $empty(element),*/ + snap: 4, + opacity: 1, + clone: false, + revert: false, + handle: false, + constrain: false + }, + + initialize: function(lists, options){ + this.setOptions(options); + this.elements = []; + this.lists = []; + this.idle = true; + + this.addLists($$(document.id(lists) || lists)); + if (!this.options.clone) this.options.revert = false; + if (this.options.revert) this.effect = new Fx.Morph(null, $merge({duration: 250, link: 'cancel'}, this.options.revert)); + }, + + attach: function(){ + this.addLists(this.lists); + return this; + }, + + detach: function(){ + this.lists = this.removeLists(this.lists); + return this; + }, + + addItems: function(){ + Array.flatten(arguments).each(function(element){ + this.elements.push(element); + var start = element.retrieve('sortables:start', this.start.bindWithEvent(this, element)); + (this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start); + }, this); + return this; + }, + + addLists: function(){ + Array.flatten(arguments).each(function(list){ + this.lists.push(list); + this.addItems(list.getChildren()); + }, this); + return this; + }, + + removeItems: function(){ + return $$(Array.flatten(arguments).map(function(element){ + this.elements.erase(element); + var start = element.retrieve('sortables:start'); + (this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start); + + return element; + }, this)); + }, + + removeLists: function(){ + return $$(Array.flatten(arguments).map(function(list){ + this.lists.erase(list); + this.removeItems(list.getChildren()); + + return list; + }, this)); + }, + + getClone: function(event, element){ + if (!this.options.clone) return new Element('div').inject(document.body); + if ($type(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list); + return element.clone(true).setStyles({ + margin: '0px', + position: 'absolute', + visibility: 'hidden', + 'width': element.getStyle('width') + }).inject(this.list).setPosition(element.getPosition(element.getOffsetParent())); + }, + + getDroppables: function(){ + var droppables = this.list.getChildren(); + if (!this.options.constrain) droppables = this.lists.concat(droppables).erase(this.list); + return droppables.erase(this.clone).erase(this.element); + }, + + insert: function(dragging, element){ + var where = 'inside'; + if (this.lists.contains(element)){ + this.list = element; + this.drag.droppables = this.getDroppables(); + } else { + where = this.element.getAllPrevious().contains(element) ? 'before' : 'after'; + } + this.element.inject(element, where); + this.fireEvent('sort', [this.element, this.clone]); + }, + + start: function(event, element){ + if (!this.idle) return; + this.idle = false; + this.element = element; + this.opacity = element.get('opacity'); + this.list = element.getParent(); + this.clone = this.getClone(event, element); + + this.drag = new Drag.Move(this.clone, { + snap: this.options.snap, + container: this.options.constrain && this.element.getParent(), + droppables: this.getDroppables(), + onSnap: function(){ + event.stop(); + this.clone.setStyle('visibility', 'visible'); + this.element.set('opacity', this.options.opacity || 0); + this.fireEvent('start', [this.element, this.clone]); + }.bind(this), + onEnter: this.insert.bind(this), + onCancel: this.reset.bind(this), + onComplete: this.end.bind(this) + }); + + this.clone.inject(this.element, 'before'); + this.drag.start(event); + }, + + end: function(){ + this.drag.detach(); + this.element.set('opacity', this.opacity); + if (this.effect){ + var dim = this.element.getStyles('width', 'height'); + var pos = this.clone.computePosition(this.element.getPosition(this.clone.offsetParent)); + this.effect.element = this.clone; + this.effect.start({ + top: pos.top, + left: pos.left, + width: dim.width, + height: dim.height, + opacity: 0.25 + }).chain(this.reset.bind(this)); + } else { + this.reset(); + } + }, + + reset: function(){ + this.idle = true; + this.clone.destroy(); + this.fireEvent('complete', this.element); + }, + + serialize: function(){ + var params = Array.link(arguments, {modifier: Function.type, index: $defined}); + var serial = this.lists.map(function(list){ + return list.getChildren().map(params.modifier || function(element){ + return element.get('id'); + }, this); + }, this); + + var index = params.index; + if (this.lists.length == 1) index = 0; + return $chk(index) && index >= 0 && index < this.lists.length ? serial[index] : serial; + } + +}); +/* +--- + +script: Color.js + +description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Array +- core:1.2.4/String +- core:1.2.4/Number +- core:1.2.4/Hash +- core:1.2.4/Function +- core:1.2.4/$util + +provides: [Color] + +... +*/ + +var Color = new Native({ + + initialize: function(color, type){ + if (arguments.length >= 3){ + type = 'rgb'; color = Array.slice(arguments, 0, 3); + } else if (typeof color == 'string'){ + if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true); + else if (color.match(/hsb/)) color = color.hsbToRgb(); + else color = color.hexToRgb(true); + } + type = type || 'rgb'; + switch (type){ + case 'hsb': + var old = color; + color = color.hsbToRgb(); + color.hsb = old; + break; + case 'hex': color = color.hexToRgb(true); break; + } + color.rgb = color.slice(0, 3); + color.hsb = color.hsb || color.rgbToHsb(); + color.hex = color.rgbToHex(); + return $extend(color, this); + } + +}); + +Color.implement({ + + mix: function(){ + var colors = Array.slice(arguments); + var alpha = ($type(colors.getLast()) == 'number') ? colors.pop() : 50; + var rgb = this.slice(); + colors.each(function(color){ + color = new Color(color); + for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha)); + }); + return new Color(rgb, 'rgb'); + }, + + invert: function(){ + return new Color(this.map(function(value){ + return 255 - value; + })); + }, + + setHue: function(value){ + return new Color([value, this.hsb[1], this.hsb[2]], 'hsb'); + }, + + setSaturation: function(percent){ + return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb'); + }, + + setBrightness: function(percent){ + return new Color([this.hsb[0], this.hsb[1], percent], 'hsb'); + } + +}); + +var $RGB = function(r, g, b){ + return new Color([r, g, b], 'rgb'); +}; + +var $HSB = function(h, s, b){ + return new Color([h, s, b], 'hsb'); +}; + +var $HEX = function(hex){ + return new Color(hex, 'hex'); +}; + +Array.implement({ + + rgbToHsb: function(){ + var red = this[0], + green = this[1], + blue = this[2], + hue = 0; + var max = Math.max(red, green, blue), + min = Math.min(red, green, blue); + var delta = max - min; + var brightness = max / 255, + saturation = (max != 0) ? delta / max : 0; + if(saturation != 0) { + var rr = (max - red) / delta; + var gr = (max - green) / delta; + var br = (max - blue) / delta; + if (red == max) hue = br - gr; + else if (green == max) hue = 2 + rr - br; + else hue = 4 + gr - rr; + hue /= 6; + if (hue < 0) hue++; + } + return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)]; + }, + + hsbToRgb: function(){ + var br = Math.round(this[2] / 100 * 255); + if (this[1] == 0){ + return [br, br, br]; + } else { + var hue = this[0] % 360; + var f = hue % 60; + var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255); + var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255); + var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255); + switch (Math.floor(hue / 60)){ + case 0: return [br, t, p]; + case 1: return [q, br, p]; + case 2: return [p, br, t]; + case 3: return [p, q, br]; + case 4: return [t, p, br]; + case 5: return [br, p, q]; + } + } + return false; + } + +}); + +String.implement({ + + rgbToHsb: function(){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHsb() : null; + }, + + hsbToRgb: function(){ + var hsb = this.match(/\d{1,3}/g); + return (hsb) ? hsb.hsbToRgb() : null; + } + +}); +/* +--- + +script: Group.js + +description: Class for monitoring collections of events + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Events +- /MooTools.More + +provides: [Group] + +... +*/ + +var Group = new Class({ + + initialize: function(){ + this.instances = Array.flatten(arguments); + this.events = {}; + this.checker = {}; + }, + + addEvent: function(type, fn){ + this.checker[type] = this.checker[type] || {}; + this.events[type] = this.events[type] || []; + if (this.events[type].contains(fn)) return false; + else this.events[type].push(fn); + this.instances.each(function(instance, i){ + instance.addEvent(type, this.check.bind(this, [type, instance, i])); + }, this); + return this; + }, + + check: function(type, instance, i){ + this.checker[type][i] = true; + var every = this.instances.every(function(current, j){ + return this.checker[type][j] || false; + }, this); + if (!every) return; + this.checker[type] = {}; + this.events[type].each(function(event){ + event.call(this, this.instances, instance); + }, this); + } + +}); +/* +--- + +script: Hash.Cookie.js + +description: Class for creating, reading, and deleting Cookies in JSON format. + +license: MIT-style license + +authors: +- Valerio Proietti +- Aaron Newton + +requires: +- core:1.2.4/Cookie +- core:1.2.4/JSON +- /MooTools.More + +provides: [Hash.Cookie] + +... +*/ + +Hash.Cookie = new Class({ + + Extends: Cookie, + + options: { + autoSave: true + }, + + initialize: function(name, options){ + this.parent(name, options); + this.load(); + }, + + save: function(){ + var value = JSON.encode(this.hash); + if (!value || value.length > 4096) return false; //cookie would be truncated! + if (value == '{}') this.dispose(); + else this.write(value); + return true; + }, + + load: function(){ + this.hash = new Hash(JSON.decode(this.read(), true)); + return this; + } + +}); + +Hash.each(Hash.prototype, function(method, name){ + if (typeof method == 'function') Hash.Cookie.implement(name, function(){ + var value = method.apply(this.hash, arguments); + if (this.options.autoSave) this.save(); + return value; + }); +});/* +--- + +script: Scroller.js + +description: Class which scrolls the contents of any Element (including the window) when the mouse reaches the Element's boundaries. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Events +- core:1.2.4/Options +- core:1.2.4/Element.Event +- core:1.2.4/Element.Dimensions + +provides: [Scroller] + +... +*/ + +var Scroller = new Class({ + + Implements: [Events, Options], + + options: { + area: 20, + velocity: 1, + onChange: function(x, y){ + this.element.scrollTo(x, y); + }, + fps: 50 + }, + + initialize: function(element, options){ + this.setOptions(options); + this.element = document.id(element); + this.listener = ($type(this.element) != 'element') ? document.id(this.element.getDocument().body) : this.element; + this.timer = null; + this.bound = { + attach: this.attach.bind(this), + detach: this.detach.bind(this), + getCoords: this.getCoords.bind(this) + }; + }, + + start: function(){ + this.listener.addEvents({ + mouseover: this.bound.attach, + mouseout: this.bound.detach + }); + }, + + stop: function(){ + this.listener.removeEvents({ + mouseover: this.bound.attach, + mouseout: this.bound.detach + }); + this.detach(); + this.timer = $clear(this.timer); + }, + + attach: function(){ + this.listener.addEvent('mousemove', this.bound.getCoords); + }, + + detach: function(){ + this.listener.removeEvent('mousemove', this.bound.getCoords); + this.timer = $clear(this.timer); + }, + + getCoords: function(event){ + this.page = (this.listener.get('tag') == 'body') ? event.client : event.page; + if (!this.timer) this.timer = this.scroll.periodical(Math.round(1000 / this.options.fps), this); + }, + + scroll: function(){ + var size = this.element.getSize(), + scroll = this.element.getScroll(), + pos = this.element.getOffsets(), + scrollSize = this.element.getScrollSize(), + change = {x: 0, y: 0}; + for (var z in this.page){ + if (this.page[z] < (this.options.area + pos[z]) && scroll[z] != 0) + change[z] = (this.page[z] - this.options.area - pos[z]) * this.options.velocity; + else if (this.page[z] + this.options.area > (size[z] + pos[z]) && scroll[z] + size[z] != scrollSize[z]) + change[z] = (this.page[z] - size[z] + this.options.area - pos[z]) * this.options.velocity; + } + if (change.y || change.x) this.fireEvent('change', [scroll.x + change.x, scroll.y + change.y]); + } + +});/* +--- + +script: Tips.js + +name: Tips + +description: Class for creating nice tips that follow the mouse cursor when hovering an element. + +license: MIT-style license + +authors: + - Valerio Proietti + - Christoph Pojer + +requires: + - Core:1.2.4/Options + - Core:1.2.4/Events + - Core:1.2.4/Element.Event + - Core:1.2.4/Element.Style + - Core:1.2.4/Element.Dimensions + - /MooTools.More + +provides: [Tips] + +... +*/ + +(function(){ + +var read = function(option, element){ + return (option) ? ($type(option) == 'function' ? option(element) : element.get(option)) : ''; +}; + +this.Tips = new Class({ + + Implements: [Events, Options], + + options: { + /* + onAttach: $empty(element), + onDetach: $empty(element), + */ + onShow: function(){ + this.tip.setStyle('display', 'block'); + }, + onHide: function(){ + this.tip.setStyle('display', 'none'); + }, + title: 'title', + text: function(element){ + return element.get('rel') || element.get('href'); + }, + showDelay: 100, + hideDelay: 100, + className: 'tip-wrap', + offset: {x: 16, y: 16}, + windowPadding: {x:0, y:0}, + fixed: false + }, + + initialize: function(){ + var params = Array.link(arguments, {options: Object.type, elements: $defined}); + this.setOptions(params.options); + if (params.elements) this.attach(params.elements); + this.container = new Element('div', {'class': 'tip'}); + }, + + toElement: function(){ + if (this.tip) return this.tip; + + this.container = new Element('div', {'class': 'tip'}); + return this.tip = new Element('div', { + 'class': this.options.className, + styles: { + position: 'absolute', + top: 0, + left: 0 + } + }).adopt( + new Element('div', {'class': 'tip-top'}), + this.container, + new Element('div', {'class': 'tip-bottom'}) + ).inject(document.body); + }, + + attach: function(elements){ + $$(elements).each(function(element){ + var title = read(this.options.title, element), + text = read(this.options.text, element); + + element.erase('title').store('tip:native', title).retrieve('tip:title', title); + element.retrieve('tip:text', text); + this.fireEvent('attach', [element]); + + var events = ['enter', 'leave']; + if (!this.options.fixed) events.push('move'); + + events.each(function(value){ + var event = element.retrieve('tip:' + value); + if (!event) event = this['element' + value.capitalize()].bindWithEvent(this, element); + + element.store('tip:' + value, event).addEvent('mouse' + value, event); + }, this); + }, this); + + return this; + }, + + detach: function(elements){ + $$(elements).each(function(element){ + ['enter', 'leave', 'move'].each(function(value){ + element.removeEvent('mouse' + value, element.retrieve('tip:' + value)).eliminate('tip:' + value); + }); + + this.fireEvent('detach', [element]); + + if (this.options.title == 'title'){ // This is necessary to check if we can revert the title + var original = element.retrieve('tip:native'); + if (original) element.set('title', original); + } + }, this); + + return this; + }, + + elementEnter: function(event, element){ + this.container.empty(); + + ['title', 'text'].each(function(value){ + var content = element.retrieve('tip:' + value); + if (content) this.fill(new Element('div', {'class': 'tip-' + value}).inject(this.container), content); + }, this); + + $clear(this.timer); + this.timer = (function(){ + this.show(element); + this.position((this.options.fixed) ? {page: element.getPosition()} : event); + }).delay(this.options.showDelay, this); + }, + + elementLeave: function(event, element){ + $clear(this.timer); + this.timer = this.hide.delay(this.options.hideDelay, this, element); + this.fireForParent(event, element); + }, + + fireForParent: function(event, element){ + element = element.getParent(); + if (!element || element == document.body) return; + if (element.retrieve('tip:enter')) element.fireEvent('mouseenter', event); + else this.fireForParent(event, element); + }, + + elementMove: function(event, element){ + this.position(event); + }, + + position: function(event){ + if (!this.tip) document.id(this); + + var size = window.getSize(), scroll = window.getScroll(), + tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight}, + props = {x: 'left', y: 'top'}, + obj = {}; + + for (var z in props){ + obj[props[z]] = event.page[z] + this.options.offset[z]; + if ((obj[props[z]] + tip[z] - scroll[z]) > size[z] - this.options.windowPadding[z]) obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z]; + } + + this.tip.setStyles(obj); + }, + + fill: function(element, contents){ + if(typeof contents == 'string') element.set('html', contents); + else element.adopt(contents); + }, + + show: function(element){ + if (!this.tip) document.id(this); + this.fireEvent('show', [this.tip, element]); + }, + + hide: function(element){ + if (!this.tip) document.id(this); + this.fireEvent('hide', [this.tip, element]); + } + +}); + +})(); + +/* +--- + +script: Assets.js + +description: Provides methods to dynamically load JavaScript, CSS, and Image files into the document. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Element.Event +- /MooTools.More + +provides: [Assets] + +... +*/ + +var Asset = { + + javascript: function(source, properties){ + properties = $extend({ + onload: $empty, + document: document, + check: $lambda(true) + }, properties); + + var script = new Element('script', {src: source, type: 'text/javascript'}); + + var load = properties.onload.bind(script), + check = properties.check, + doc = properties.document; + delete properties.onload; + delete properties.check; + delete properties.document; + + script.addEvents({ + load: load, + readystatechange: function(){ + if (['loaded', 'complete'].contains(this.readyState)) load(); + } + }).set(properties); + + if (Browser.Engine.webkit419) var checker = (function(){ + if (!$try(check)) return; + $clear(checker); + load(); + }).periodical(50); + + return script.inject(doc.head); + }, + + css: function(source, properties){ + return new Element('link', $merge({ + rel: 'stylesheet', + media: 'screen', + type: 'text/css', + href: source + }, properties)).inject(document.head); + }, + + image: function(source, properties){ + properties = $merge({ + onload: $empty, + onabort: $empty, + onerror: $empty + }, properties); + var image = new Image(); + var element = document.id(image) || new Element('img'); + ['load', 'abort', 'error'].each(function(name){ + var type = 'on' + name; + var event = properties[type]; + delete properties[type]; + image[type] = function(){ + if (!image) return; + if (!element.parentNode){ + element.width = image.width; + element.height = image.height; + } + image = image.onload = image.onabort = image.onerror = null; + event.delay(1, element, element); + element.fireEvent(name, element, 1); + }; + }); + image.src = element.src = source; + if (image && image.complete) image.onload.delay(1); + return element.set(properties); + }, + + images: function(sources, options){ + options = $merge({ + onComplete: $empty, + onProgress: $empty, + onError: $empty, + properties: {} + }, options); + sources = $splat(sources); + var images = []; + var counter = 0; + return new Elements(sources.map(function(source){ + return Asset.image(source, $extend(options.properties, { + onload: function(){ + options.onProgress.call(this, counter, sources.indexOf(source)); + counter++; + if (counter == sources.length) options.onComplete(); + }, + onerror: function(){ + options.onError.call(this, counter, sources.indexOf(source)); + counter++; + if (counter == sources.length) options.onComplete(); + } + })); + })); + } + +}; + +/* +--- + +script: mootools-1.1-to-1.2-upgrade-helper.js + +description: Provides legacy API for Mootools 1.2 + +license: MIT-style license + +authors: +- Aaron Newton + +... +*/ + +if(!window.console) var console = {}; +if(!console.log) console.log = function(){}; +if(!console.warn) console.warn = console.log; +if(!console.error) console.error = console.warn; + +MooTools.upgradeLog = function() { + if (console[this.upgradeLogLevel]) console[this.upgradeLogLevel].apply(console, arguments); +}; + +(function(){ + oldA = $A; + window.$A = function(iterable, start, length){ + if (start != undefined && length != undefined) { + MooTools.upgradeLog('1.1 > 1.2: $A no longer takes start and length arguments.'); + if (Browser.Engine.trident && $type(iterable) == 'collection'){ + start = start || 0; + if (start < 0) start = iterable.length + start; + length = length || (iterable.length - start); + var array = []; + for (var i = 0; i < length; i++) array[i] = iterable[start++]; + return array; + } + start = (start || 0) + ((start < 0) ? iterable.length : 0); + var end = ((!$chk(length)) ? iterable.length : length) + start; + return Array.prototype.slice.call(iterable, start, end); + } + return oldA(iterable); + }; + + + var strs = ['Array', 'Function', 'String', 'RegExp', 'Number', 'Window', 'Document', 'Element', 'Elements']; + for (var i = 0, l = strs.length; i < l; i++) { + var type = strs[i]; + var natv = window[type]; + if (natv) { + var extend = natv.extend; + natv.extend = function(props){ + MooTools.upgradeLog('1.1 > 1.2: native types no longer use .extend to add methods to prototypes but instead use .implement. NOTE: YOUR METHODS WERE NOT IMPLEMENTED ON THE NATIVE ' + type.toUpperCase() + ' PROTOTYPE.'); + return extend.apply(this, arguments); + }; + } + } +})(); + +window.onDomReady = Window.onDomReady = function(fn){ + MooTools.upgradeLog('1.1 > 1.2: window.onDomReady is no longer supported. Use window.addEvent("domready") instead'); + return window.addEvent('domready', fn); +};if (Browser.__defineGetter__) { + Browser.__defineGetter__('hasGetter',function(){ + return true; + }); +} + +if(Browser.hasGetter){ // webkit, gecko, opera support + + window.__defineGetter__('ie',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.ie is deprecated. Use Browser.Engine.trident'); + return (Browser.Engine.name == 'trident') ? true : false; + }); + window.__defineGetter__('ie6',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.ie6 is deprecated. Use Browser.Engine.trident and Browser.Engine.version'); + return (Browser.Engine.name == 'trident' && Browser.Engine.version == 4) ? true : false; + }); + window.__defineGetter__('ie7',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.ie7 is deprecated. Use Browser.Engine.trident and Browser.Engine.version'); + return (Browser.Engine.name == 'trident' && Browser.Engine.version == 5) ? true : false; + }); + window.__defineGetter__('gecko',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.gecko is deprecated. Use Browser.Engine.gecko'); + return (Browser.Engine.name == 'gecko') ? true : false; + }); + window.__defineGetter__('webkit',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit'); + return (Browser.Engine.name == 'webkit') ? true : false; + }); + window.__defineGetter__('webkit419',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version'); + return (Browser.Engine.name == 'webkit' && Browser.Engine.version == 419) ? true : false; + }); + window.__defineGetter__('webkit420',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version'); + return (Browser.Engine.name == 'webkit' && Browser.Engine.version == 420) ? true : false; + }); + window.__defineGetter__('opera',function(){ + MooTools.upgradeLog('1.1 > 1.2: window.opera is deprecated. Use Browser.Engine.presto'); + return (Browser.Engine.name == 'presto') ? true : false; + }); +} else { + window[Browser.Engine.name] = window[Browser.Engine.name + Browser.Engine.version] = true; + window.ie = window.trident; + window.ie6 = window.trident4; + window.ie7 = window.trident5; +} +Array.implement({ + + copy: function(start, length){ + MooTools.upgradeLog('1.1 > 1.2: Array.copy is deprecated. Use Array.splice'); + return $A(this, start, length); + }, + + remove : function(item){ + MooTools.upgradeLog('1.1 > 1.2: Array.remove is deprecated. Use Array.erase'); + return this.erase(item); + }, + + merge : function(array){ + MooTools.upgradeLog('1.1 > 1.2: Array.merge is deprecated. Use Array.combine'); + return this.combine(array); + } + +}); +Function.implement({ + + bindAsEventListener: function(bind, args){ + MooTools.upgradeLog('1.1 > 1.2: Function.bindAsEventListener is deprecated. Use bindWithEvent.'); + return this.bindWithEvent.call(this, bind, args); + } + +}); + +Function.empty = function(){ + MooTools.upgradeLog('1.1 > 1.2: Function.empty is now just $empty.'); +};Hash.implement({ + + keys : function(){ + MooTools.upgradeLog('1.1 > 1.2: Hash.keys is deprecated. Use Hash.getKeys'); + return this.getKeys(); + }, + + values : function(){ + MooTools.upgradeLog('1.1 > 1.2: Hash.values is deprecated. Use Hash.getValues'); + return this.getValues(); + }, + + hasKey : function(item){ + MooTools.upgradeLog('1.1 > 1.2: Hash.hasKey is deprecated. Use Hash.has'); + return this.has(item); + }, + + merge : function(properties){ + MooTools.upgradeLog('1.1 > 1.2: Hash.merge is deprecated. Use Hash.combine'); + return this.extend(properties); + }, + + remove: function(key){ + MooTools.upgradeLog('1.1 > 1.2: Hash.remove is deprecated. use Hash.erase'); + return this.erase(key); + } + +}); + +Object.toQueryString = function(obj){ + MooTools.upgradeLog('1.1 > 1.2: Object.toQueryString() is deprecated. use Hash.toQueryString() instead'); + $H(obj).each(function(item, key){ + if ($type(item) == 'object' || $type(item) == 'array'){ + obj[key] = item.toString(); + } + }); + return Hash.toQueryString(obj); +}; + +var Abstract = function(obj){ + MooTools.upgradeLog('1.1 > 1.2: Abstract is deprecated. Use Hash'); + return new Hash(obj); +};Class.empty = function(){ + MooTools.upgradeLog('1.1 > 1.2: replace Class.empty with $empty'); + return $empty; +}; + +//legacy .extend support + +(function(){ + var proto = function(obj) { + var f = function(){ + return this; + }; + f.prototype = obj; + return f; + }; + + Class.prototype.extend = function(properties){ + MooTools.upgradeLog('1.1 > 1.2: Class.extend is deprecated. See the class Extend mutator.'); + var maker = proto(properties); + var made = new maker(); + made.Extends = this; + return new Class(made); + }; + + var __implement = Class.prototype.implement; + Class.prototype.implement = function(){ + if (arguments.length > 1 && Array.every(arguments, Object.type)){ + MooTools.upgradeLog('1.1 > 1.2: Class.implement no longer takes more than one thing at a time, either MyClass.implement(key, value) or MyClass.implement(object) but NOT MyClass.implement(new Foo, new Bar, new Baz). See also: the class Implements mutator.'); + Array.each(arguments, function(argument){ + __implement.call(this, argument); + }, this); + return this; + } + return __implement.apply(this, arguments); + }; +})();(function(){ + + var getPosition = Element.prototype.getPosition; + var getCoordinates = Element.prototype.getCoordinates; + + function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); + }; + + var getSize = Element.prototype.getSize; + + Element.implement({ + + getSize: function(){ + MooTools.upgradeLog('1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.'); + var size = getSize.apply(this, arguments); + return $merge(size, { + size: size, + scroll: this.getScroll(), + scrollSize: this.getScrollSize() + }); + }, + + getPosition: function(relative){ + if (relative && $type(relative) == "array") { + MooTools.upgradeLog('1.1 > 1.2: Element.getPosition no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.'); + relative = null; + } + return getPosition.apply(this, [relative]); + }, + + getCoordinates: function(relative){ + if (relative && $type(relative) == "array") { + MooTools.upgradeLog('1.1 > 1.2: Element.getCoordinates no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.'); + relative = null; + } + return getCoordinates.apply(this, [relative]); + } + + }); + + Native.implement([Document, Window], { + + getSize: function(){ + MooTools.upgradeLog('1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.'); + var size; + var win = this.getWindow(); + var doc = this.getDocument(); + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + if (Browser.Engine.presto || Browser.Engine.webkit){ + size = {x: win.innerWidth, y: win.innerHeight}; + } else { + size = {x: doc.clientWidth, y: doc.clientHeight}; + } + return $extend(size, { + size: size, + scroll: {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}, + scrollSize: {x: Math.max(doc.scrollWidth, size.x), y: Math.max(doc.scrollHeight, size.y)} + }); + } + + }); + +})();Event.keys = Event.Keys; // TODO +(function(){ + + var toQueryString = Element.prototype.toQueryString; + + Element.implement({ + + getFormElements: function(){ + MooTools.upgradeLog('1.1 > 1.2: Element.getFormElements is deprecated, use Element.getElements("input, textarea, select");'); + return this.getElements('input, textarea, select'); + }, + + replaceWith: function(el){ + MooTools.upgradeLog('1.1 > 1.2: Element.replaceWith is deprecated, use Element.replaces instead.'); + el = $(el); + this.parentNode.replaceChild(el, this); + return el; + }, + + remove: function() { + MooTools.upgradeLog('1.1 > 1.2: Element.remove is deprecated - use Element.dispose.'); + return this.dispose.apply(this, arguments); + }, + + getText: function(){ + MooTools.upgradeLog('1.1 > 1.2: Element.getText is deprecated - use Element.get("text").'); + return this.get('text'); + }, + + setText: function(text){ + MooTools.upgradeLog('1.1 > 1.2: Element.setText is deprecated - use Element.set("text", text).'); + return this.set('text', text); + }, + + setHTML: function(){ + MooTools.upgradeLog('1.1 > 1.2: Element.setHTML is deprecated - use Element.set("html", HTML).'); + return this.set('html', arguments); + }, + + getHTML: function(){ + MooTools.upgradeLog('1.1 > 1.2: Element.getHTML is deprecated - use Element.get("html").'); + return this.get('html'); + }, + + getTag: function(){ + MooTools.upgradeLog('1.1 > 1.2: Element.getTag is deprecated - use Element.get("tag").'); + return this.get('tag'); + }, + + getValue: function(){ + MooTools.upgradeLog('1.1 > 1.2: Element.getValue is deprecated - use Element.get("value").'); + switch(this.getTag()){ + case 'select': + var values = []; + $each(this.options, function(option){ + if (option.selected) values.push($pick(option.value, option.text)); + }); + return (this.multiple) ? values : values[0]; + case 'input': if (!(this.checked && ['checkbox', 'radio'].contains(this.type)) && !['hidden', 'text', 'password'].contains(this.type)) break; + case 'textarea': return this.value; + } + return false; + }, + + toQueryString: function(){ + MooTools.upgradeLog('1.1 > 1.2: warning Element.toQueryString is slightly different; inputs without names are excluded, inputs with type == submit, reset, and file are excluded, and inputs with undefined values are excluded.'); + return toQueryString.apply(this, arguments); + } + }); +})(); + +Element.Properties.properties = { + + set: function(props){ + MooTools.upgradeLog('1.1 > 1.2: Element.set({properties: {}}) is deprecated; instead of properties, just name the values at the root of the object (Element.set({src: url})).'); + $H(props).each(function(value, property){ + this.set(property, value); + }, this); + } + +}; +Element.implement({ + + setOpacity: function(op){ + MooTools.upgradeLog('1.1 > 1.2: Element.setOpacity is deprecated; use Element.setStyle("opacity", value).'); + return this.setStyle('opacity', op); + } + +}); + +Element.Properties.styles = { + + set: function(styles){ + MooTools.upgradeLog('1.1 > 1.2: Element.set("styles") no longer accepts a string as an argument. Pass an object instead.'); + if ($type(styles) == 'string'){ + styles.split(";").each(function(style){ + this.setStyle(style.split(":")[0], style.split(":")[1]); + }, this); + } else { + this.setStyles(styles); + } + } + +};Fx.implement({ + + custom: function(from, to){ + MooTools.upgradeLog('1.1 > 1.2: Fx.custom is deprecated. use Fx.start.'); + return this.start(from, to); + }, + + clearTimer: function(){ + MooTools.upgradeLog('1.1 > 1.2: Fx.clearTimer is deprecated. use Fx.cancel.'); + return this.cancel(); + }, + + stop: function(){ + MooTools.upgradeLog('1.1 > 1.2: Fx.stop is deprecated. use Fx.cancel.'); + return this.cancel(); + } + +}); + +Fx.Base = new Class({ + Extends: Fx, + initialize: function(){ + MooTools.upgradeLog('1.1 > 1.2: Fx.Base is deprecated. use Fx.'); + this.parent.apply(this, arguments); + } +}); +Fx.Style = new Class({ + Extends: Fx.Tween, + initialize: function(element, property, options){ + MooTools.upgradeLog('1.1 > 1.2: Fx.Style is deprecated. use Fx.Tween.'); + this.property = property; + this.parent(element, options); + }, + + start: function(from, to) { + return this.parent(this.property, from, to); + }, + + set: function(to) { + return this.parent(this.property, to); + }, + + hide: function(){ + MooTools.upgradeLog('1.1 > 1.2: Fx.Style .hide() is deprecated; use Fx.Tween .set(0) instead'); + return this.set(0); + } + +}); + +Element.implement({ + + effect: function(property, options){ + MooTools.upgradeLog('1.1 > 1.2: Element.effect is deprecated; use Fx.Tween or Element.tween.'); + return new Fx.Style(this, property, options); + } + +}); +Fx.Styles = new Class({ + Extends: Fx.Morph, + initialize: function(){ + MooTools.upgradeLog('1.1 > 1.2: Fx.Styles is deprecated. use Fx.Morph.'); + this.parent.apply(this, arguments); + } +}); + +Element.implement({ + + effects: function(options){ + MooTools.upgradeLog('1.1 > 1.2: Element.effects is deprecated; use Fx.Morph or Element.morph.'); + return new Fx.Morph(this, options); + } + +});Fx.Scroll.implement({ + + scrollTo: function(y, x){ + MooTools.upgradeLog('1.1 > 1.2: Fx.Scroll\'s .scrollTo is deprecated; use .start.'); + return this.start(y, x); + } + +});Request.implement({ + //1.11 passed along the response text and xml to onComplete + onStateChange: function(){ + if (this.xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + $try(function(){ + this.status = this.xhr.status; + }.bind(this)); + this.xhr.onreadystatechange = $empty; + this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML}; + if (this.options.isSuccess.call(this, this.status)) this.success(this.response.text, this.response.xml); + else this.failure(this.response.text, this.response.xml); + }, + + failure: function(){ + this.onFailure.apply(this, arguments); + }, + + onFailure: function(){ + MooTools.upgradeLog('1.1 > 1.2: Note that onComplete does not receive arguments in 1.2. Also note that onComplete is invoked on BOTH success and failure (while in 1.1 it was only invoked on success). Use the onSuccess event instead if you wish to limit this invocation to success.'); + this.fireEvent('complete', arguments).fireEvent('failure', this.xhr); + } + +}); + +var XHR = new Class({ + + Extends: Request, + + options: { + update: false + }, + + initialize: function(options){ + MooTools.upgradeLog('1.1 > 1.2: XHR is deprecated. Use Request.'); + this.parent(options); + this.transport = this.xhr; + }, + + request: function(data){ + MooTools.upgradeLog('1.1 > 1.2: XHR.request() is deprecated. Use Request.send() instead.'); + return this.send(this.url, data || this.options.data); + }, + + send: function(url, data){ + if (!this.check(arguments.callee, url, data)) return this; + return this.parent({url: url, data: data}); + }, + + success: function(text, xml){ + text = this.processScripts(text); + if (this.options.update) $(this.options.update).empty().set('html', text); + this.onSuccess(text, xml); + }, + + failure: function(){ + this.fireEvent('failure', this.xhr); + } + +}); + + +var Ajax = new Class({ + + Extends: XHR, + + initialize: function(url, options){ + MooTools.upgradeLog('1.1 > 1.2: Ajax is deprecated. Use Request.'); + this.url = url; + this.parent(options); + }, + + success: function(text, xml){ + // This version processes scripts *after* the update element is updated, like Mootools 1.1's Ajax class + // Partially from Remote.Ajax.success + this.processScripts(text); + response = this.response; + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + if (this.options.update) $(this.options.update).empty().set('html', response.html); + if (this.options.evalScripts) $exec(response.javascript); + this.onSuccess(text, xml); + } + +}); + +(function(){ + var send = Element.prototype.send; + Element.implement({ + send: function(url) { + if ($type(url) == "string") return send.apply(this, arguments); + if ($type(url) == "object") { + MooTools.upgradeLog('1.1 > 1.2: Element.send no longer takes an options argument as its object but rather a url. See docs.'); + this.set('send', url); + send.call(this); + } + return this; + } + }); +})();JSON.Remote = new Class({ + + options: { + key: 'json' + }, + + Extends: Request.JSON, + + initialize: function(url, options){ + MooTools.upgradeLog('JSON.Remote is deprecated. Use Request.JSON'); + this.parent(options); + this.onComplete = $empty; + this.url = url; + }, + + send: function(data){ + if (!this.check(arguments.callee, data)) return this; + return this.parent({url: this.url, data: {json: Json.encode(data)}}); + }, + + failure: function(){ + this.fireEvent('failure', this.xhr); + } + +}); + +Cookie.set = function(key, value, options){ + MooTools.upgradeLog('1.1 > 1.2: Cookie.set is deprecated. Use Cookie.write'); + return new Cookie(key, options).write(value); +}; + +Cookie.get = function(key){ + MooTools.upgradeLog('1.1 > 1.2: Cookie.get is deprecated. Use Cookie.read'); + return new Cookie(key).read(); +}; + +Cookie.remove = function(key, options){ + MooTools.upgradeLog('1.1 > 1.2: Cookie.remove is deprecated. Use Cookie.dispose'); + return new Cookie(key, options).dispose(); +}; +JSON.toString = function(obj){ + MooTools.upgradeLog('1.1 > 1.2: JSON.toString is deprecated. Use JSON.encode'); + return JSON.encode(obj); +}; +JSON.evaluate = function(str){ + MooTools.upgradeLog('1.1 > 1.2: JSON.evaluate is deprecated. Use JSON.decode'); + return JSON.decode(str); +}; +var Json = JSON; + +Native.implement([Element, Document], { + + getElementsByClassName: function(className){ + MooTools.upgradeLog('1.1 > 1.2: Element.filterByTag is deprecated.'); + + return this.getElements('.' + className); + }, + + getElementsBySelector: function(selector){ + MooTools.upgradeLog('1.1 > 1.2: Element.getElementsBySelector is deprecated. Use getElements()'); + return this.getElements(selector); + } + +}); + +Elements.implement({ + + filterByTag: function(tag){ + MooTools.upgradeLog('1.1 > 1.2: Elements.filterByTag is deprecated. Use Elements.filter.'); + return this.filter(tag); + }, + + filterByClass: function(className){ + MooTools.upgradeLog('1.1 > 1.2: Elements.filterByClass is deprecated. Use Elements.filter.'); + return this.filter('.' + className); + }, + + filterById: function(id){ + MooTools.upgradeLog('1.1 > 1.2: Elements.filterById is deprecated. Use Elements.filter.'); + return this.filter('#' + id); + }, + + filterByAttribute: function(name, operator, value){ + MooTools.upgradeLog('1.1 > 1.2: Elements.filterByAttribute is deprecated. Use Elements.filter.'); + var filtered = this.filter('[' + name + (operator || '') + (value || '') + ']'); + if (value) filtered = filtered.filter('[' + name + ']'); + return filtered; + } + +}); + +var $E = function(selector, filter){ + MooTools.upgradeLog('1.1 > 1.2: $E is deprecated, use document.getElement.'); + return ($(filter) || document).getElement(selector); +}; + +var $ES = function(selector, filter){ + MooTools.upgradeLog('1.1 > 1.2: $ES is deprecated. Use $$.'); + return ($(filter) || document).getElements(selector); +};(function(){ + if (!window.Tips) return; + + Tips.implement({ + + initialize: function(){ + MooTools.upgradeLog('1.1 > 1.2: Tips DOM element layout has changed and your CSS classes may need to change.'); + var params = Array.link(arguments, {options: Object.type, elements: $defined}); + this.setOptions(params.options); + if (this.options.offsets) { + MooTools.upgradeLog('1.1 > 1.2: Tips no longer have an "offsets" option; use "offset".'); + this.options.offset = this.options.offsets; + } + document.id(this); + this.addEvent('show', function(){ + this.tip.addClass('tool-tip'); + this.tip.getElement('.tip-title').addClass('tool-title'); + this.tip.getElement('.tip-text').addClass('tool-text'); + }); + this.parseTitle(params.elements); + if (params.elements) this.attach(params.elements); + }, + + parseTitle: function(elements){ + elements.each(function(element){ + var title = element.get('title'); + if (title.test('::')) { + MooTools.upgradeLog('1.1 > 1.2: Tips no longer parse the title attribute for "::" for title/caption; use title and rel attributes instead.'); + element.store('tip:title', title.split('::')[0]); + element.store('tip:text', title.split('::')[1]); + element.set('title', ''); + } + }); + } + + }); + +})(); \ No newline at end of file diff --git a/oss/joomla/trunk/plugins/system/mtupgrade/mootools.js b/oss/joomla/trunk/plugins/system/mtupgrade/mootools.js new file mode 100644 index 00000000..a809ef53 --- /dev/null +++ b/oss/joomla/trunk/plugins/system/mtupgrade/mootools.js @@ -0,0 +1 @@ +var MooTools={version:"1.2.4",build:"0d9113241a90b9cd5643b926795852a2026710d4"};var Native=function(k){k=k||{};var a=k.name;var i=k.legacy;var b=k.protect;var c=k.implement;var h=k.generics;var f=k.initialize;var g=k.afterImplement||function(){};var d=f||i;h=h!==false;d.constructor=Native;d.$family={name:"native"};if(i&&f){d.prototype=i.prototype}d.prototype.constructor=d;if(a){var e=a.toLowerCase();d.prototype.$family={name:e};Native.typize(d,e)}var j=function(n,l,o,m){if(!b||m||!n.prototype[l]){n.prototype[l]=o}if(h){Native.genericize(n,l,b)}g.call(n,l,o);return n};d.alias=function(n,l,p){if(typeof n=="string"){var o=this.prototype[n];if((n=o)){return j(this,l,n,p)}}for(var m in n){this.alias(m,n[m],l)}return this};d.implement=function(m,l,o){if(typeof m=="string"){return j(this,m,l,o)}for(var n in m){j(this,n,m[n],l)}return this};if(c){d.implement(c)}return d};Native.genericize=function(b,c,a){if((!a||!b[c])&&typeof b.prototype[c]=="function"){b[c]=function(){var d=Array.prototype.slice.call(arguments);return b.prototype[c].apply(d.shift(),d)}}};Native.implement=function(d,c){for(var b=0,a=d.length;b-1:this.indexOf(a)>-1},trim:function(){return this.replace(/^\s+|\s+$/g,"")},clean:function(){return this.replace(/\s+/g," ").trim()},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase()})},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase())})},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase()})},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1")},toInt:function(a){return parseInt(this,a||10)},toFloat:function(){return parseFloat(this)},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null},stripScripts:function(b){var a="";var c=this.replace(/]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return""});if(b===true){$exec(a)}else{if($type(b)=="function"){b(a,c)}}return c},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1)}return(a[c]!=undefined)?a[c]:""})}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){for(var a in this){if(this.hasOwnProperty(a)&&this[a]===b){return a}}return null},hasValue:function(a){return(Hash.keyOf(this,a)!==null)},extend:function(a){Hash.each(a||{},function(c,b){Hash.set(this,b,c)},this);return this},combine:function(a){Hash.each(a||{},function(c,b){Hash.include(this,b,c)},this);return this},erase:function(a){if(this.hasOwnProperty(a)){delete this[a]}return this},get:function(a){return(this.hasOwnProperty(a))?this[a]:null},set:function(a,b){if(!this[a]||this.hasOwnProperty(a)){this[a]=b}return this},empty:function(){Hash.each(this,function(b,a){delete this[a]},this);return this},include:function(a,b){if(this[a]==undefined){this[a]=b}return this},map:function(b,c){var a=new Hash;Hash.each(this,function(e,d){a.set(d,b.call(c,e,d,this))},this);return a},filter:function(b,c){var a=new Hash;Hash.each(this,function(e,d){if(b.call(c,e,d,this)){a.set(d,e)}},this);return a},every:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&!b.call(c,this[a],a)){return false}}return true},some:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&b.call(c,this[a],a)){return true}}return false},getKeys:function(){var a=[];Hash.each(this,function(c,b){a.push(b)});return a},getValues:function(){var a=[];Hash.each(this,function(b){a.push(b)});return a},toQueryString:function(a){var b=[];Hash.each(this,function(f,e){if(a){e=a+"["+e+"]"}var d;switch($type(f)){case"object":d=Hash.toQueryString(f,e);break;case"array":var c={};f.each(function(h,g){c[g]=h});d=Hash.toQueryString(c,e);break;default:d=e+"="+encodeURIComponent(f)}if(f!=undefined){b.push(d)}});return b.join("&")}});Hash.alias({keyOf:"indexOf",hasValue:"contains"});var Event=new Native({name:"Event",initialize:function(a,f){f=f||window;var k=f.document;a=a||f.event;if(a.$extended){return a}this.$extended=true;var j=a.type;var g=a.target||a.srcElement;while(g&&g.nodeType==3){g=g.parentNode}if(j.test(/key/)){var b=a.which||a.keyCode;var m=Event.Keys.keyOf(b);if(j=="keydown"){var d=b-111;if(d>0&&d<13){m="f"+d}}m=m||String.fromCharCode(b).toLowerCase()}else{if(j.match(/(click|mouse|menu)/i)){k=(!k.compatMode||k.compatMode=="CSS1Compat")?k.html:k.body;var i={x:a.pageX||a.clientX+k.scrollLeft,y:a.pageY||a.clientY+k.scrollTop};var c={x:(a.pageX)?a.pageX-f.pageXOffset:a.clientX,y:(a.pageY)?a.pageY-f.pageYOffset:a.clientY};if(j.match(/DOMMouseScroll|mousewheel/)){var h=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3}var e=(a.which==3)||(a.button==2);var l=null;if(j.match(/over|out/)){switch(j){case"mouseover":l=a.relatedTarget||a.fromElement;break;case"mouseout":l=a.relatedTarget||a.toElement}if(!(function(){while(l&&l.nodeType==3){l=l.parentNode}return true}).create({attempt:Browser.Engine.gecko})()){l=false}}}}return $extend(this,{event:a,type:j,page:i,client:c,rightClick:e,wheel:h,relatedTarget:l,target:g,code:b,key:m,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey})}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault()},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation()}else{this.event.cancelBubble=true}return this},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault()}else{this.event.returnValue=false}return this}});function Class(b){if(b instanceof Function){b={initialize:b}}var a=function(){Object.reset(this);if(a._prototyping){return this}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c}.extend(this);a.implement(b);a.constructor=Class;a.prototype.constructor=a;return a}Function.prototype.protect=function(){this._protected=true;return this};Object.reset=function(a,c){if(c==null){for(var e in a){Object.reset(a,e)}return a}delete a[c];switch($type(a[c])){case"object":var d=function(){};d.prototype=a[c];var b=new d;a[c]=Object.reset(b);break;case"array":a[c]=$unlink(a[c]);break}return a};new Native({name:"Class",initialize:Class}).extend({instantiate:function(b){b._prototyping=true;var a=new b;delete b._prototyping;return a},wrap:function(a,b,c){if(c._origin){c=c._origin}return function(){if(c._protected&&this._current==null){throw new Error('The method "'+b+'" cannot be called.')}var e=this.caller,f=this._current;this.caller=f;this._current=arguments.callee;var d=c.apply(this,arguments);this._current=f;this.caller=e;return d}.extend({_owner:a,_origin:c,_name:b})}});Class.implement({implement:function(a,d){if($type(a)=="object"){for(var e in a){this.implement(e,a[e])}return this}var f=Class.Mutators[a];if(f){d=f.call(this,d);if(d==null){return this}}var c=this.prototype;switch($type(d)){case"function":if(d._hidden){return this}c[a]=Class.wrap(this,a,d);break;case"object":var b=c[a];if($type(b)=="object"){$mixin(b,d)}else{c[a]=$unlink(d)}break;case"array":c[a]=$unlink(d);break;default:c[a]=d}return this}});Class.Mutators={Extends:function(a){this.parent=a;this.prototype=Class.instantiate(a);this.implement("parent",function(){var b=this.caller._name,c=this.caller._owner.parent.prototype[b];if(!c){throw new Error('The method "'+b+'" has no parent.')}return c.apply(this,arguments)}.protect())},Implements:function(a){$splat(a).each(function(b){if(b instanceof Function){b=Class.instantiate(b)}this.implement(b)},this)}};var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false},clearChain:function(){this.$chain.empty();return this}});var Events=new Class({$events:{},addEvent:function(c,b,a){c=Events.removeOn(c);if(b!=$empty){this.$events[c]=this.$events[c]||[];this.$events[c].include(b);if(a){b.internal=true}}return this},addEvents:function(a){for(var b in a){this.addEvent(b,a[b])}return this},fireEvent:function(c,b,a){c=Events.removeOn(c);if(!this.$events||!this.$events[c]){return this}this.$events[c].each(function(d){d.create({bind:this,delay:a,"arguments":b})()},this);return this},removeEvent:function(b,a){b=Events.removeOn(b);if(!this.$events[b]){return this}if(!a.internal){this.$events[b].erase(a)}return this},removeEvents:function(c){var d;if($type(c)=="object"){for(d in c){this.removeEvent(d,c[d])}return this}if(c){c=Events.removeOn(c)}for(d in this.$events){if(c&&c!=d){continue}var b=this.$events[d];for(var a=b.length;a--;a){this.removeEvent(d,b[a])}}return this}});Events.removeOn=function(a){return a.replace(/^on([A-Z])/,function(b,c){return c.toLowerCase()})};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));if(!this.addEvent){return this}for(var a in this.options){if($type(this.options[a])!="function"||!(/^on[A-Z]/).test(a)){continue}this.addEvent(a,this.options[a]);delete this.options[a]}return this}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(a,b){var c=Element.Constructors.get(a);if(c){return c(b)}if(typeof a=="string"){return document.newElement(a,b)}return document.id(a).set(b)},afterImplement:function(a,b){Element.Prototype[a]=b;if(Array[a]){return}Elements.implement(a,function(){var c=[],g=true;for(var e=0,d=this.length;e"}return document.id(this.createElement(a)).set(b)},newTextNode:function(a){return this.createTextNode(a)},getDocument:function(){return this},getWindow:function(){return this.window},id:(function(){var a={string:function(d,c,b){d=b.getElementById(d);return(d)?a.element(d,c):null},element:function(b,e){$uid(b);if(!e&&!b.$family&&!(/^object|embed$/i).test(b.tagName)){var c=Element.Prototype;for(var d in c){b[d]=c[d]}}return b},object:function(c,d,b){if(c.toElement){return a.element(c.toElement(b),d)}return null}};a.textnode=a.whitespace=a.window=a.document=$arguments(0);return function(c,e,d){if(c&&c.$family&&c.uid){return c}var b=$type(c);return(a[b])?a[b](c,e,d||document):null}})()});if(window.$==null){Window.implement({$:function(a,b){return document.id(a,b,this.document)}})}Window.implement({$$:function(a){if(arguments.length==1&&typeof a=="string"){return this.document.getElements(a)}var f=[];var c=Array.flatten(arguments);for(var d=0,b=c.length;d1);a.each(function(e){var f=this.getElementsByTagName(e.trim());(b)?c.extend(f):c=f},this);return new Elements(c,{ddup:b,cash:!d})}});(function(){var h={},f={};var i={input:"checked",option:"selected",textarea:(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerHTML":"value"};var c=function(l){return(f[l]||(f[l]={}))};var g=function(n,l){if(!n){return}var m=n.uid;if(Browser.Engine.trident){if(n.clearAttributes){var q=l&&n.cloneNode(false);n.clearAttributes();if(q){n.mergeAttributes(q)}}else{if(n.removeEvents){n.removeEvents()}}if((/object/i).test(n.tagName)){for(var o in n){if(typeof n[o]=="function"){n[o]=$empty}}Element.dispose(n)}}if(!m){return}h[m]=f[m]=null};var d=function(){Hash.each(h,g);if(Browser.Engine.trident){$A(document.getElementsByTagName("object")).each(g)}if(window.CollectGarbage){CollectGarbage()}h=f=null};var j=function(n,l,s,m,p,r){var o=n[s||l];var q=[];while(o){if(o.nodeType==1&&(!m||Element.match(o,m))){if(!p){return document.id(o,r)}q.push(o)}o=o[l]}return(p)?new Elements(q,{ddup:false,cash:!r}):null};var e={html:"innerHTML","class":"className","for":"htmlFor",defaultValue:"defaultValue",text:(Browser.Engine.trident||(Browser.Engine.webkit&&Browser.Engine.version<420))?"innerText":"textContent"};var b=["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];var k=["value","type","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];b=b.associate(b);Hash.extend(e,b);Hash.extend(e,k.associate(k.map(String.toLowerCase)));var a={before:function(m,l){if(l.parentNode){l.parentNode.insertBefore(m,l)}},after:function(m,l){if(!l.parentNode){return}var n=l.nextSibling;(n)?l.parentNode.insertBefore(m,n):l.parentNode.appendChild(m)},bottom:function(m,l){l.appendChild(m)},top:function(m,l){var n=l.firstChild;(n)?l.insertBefore(m,n):l.appendChild(m)}};a.inside=a.bottom;Hash.each(a,function(l,m){m=m.capitalize();Element.implement("inject"+m,function(n){l(this,document.id(n,true));return this});Element.implement("grab"+m,function(n){l(document.id(n,true),this);return this})});Element.implement({set:function(o,m){switch($type(o)){case"object":for(var n in o){this.set(n,o[n])}break;case"string":var l=Element.Properties.get(o);(l&&l.set)?l.set.apply(this,Array.slice(arguments,1)):this.setProperty(o,m)}return this},get:function(m){var l=Element.Properties.get(m);return(l&&l.get)?l.get.apply(this,Array.slice(arguments,1)):this.getProperty(m)},erase:function(m){var l=Element.Properties.get(m);(l&&l.erase)?l.erase.apply(this):this.removeProperty(m);return this},setProperty:function(m,n){var l=e[m];if(n==undefined){return this.removeProperty(m)}if(l&&b[m]){n=!!n}(l)?this[l]=n:this.setAttribute(m,""+n);return this},setProperties:function(l){for(var m in l){this.setProperty(m,l[m])}return this},getProperty:function(m){var l=e[m];var n=(l)?this[l]:this.getAttribute(m,2);return(b[m])?!!n:(l)?n:n||null},getProperties:function(){var l=$A(arguments);return l.map(this.getProperty,this).associate(l)},removeProperty:function(m){var l=e[m];(l)?this[l]=(l&&b[m])?false:"":this.removeAttribute(m);return this},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this},hasClass:function(l){return this.className.contains(l," ")},addClass:function(l){if(!this.hasClass(l)){this.className=(this.className+" "+l).clean()}return this},removeClass:function(l){this.className=this.className.replace(new RegExp("(^|\\s)"+l+"(?:\\s|$)"),"$1");return this},toggleClass:function(l){return this.hasClass(l)?this.removeClass(l):this.addClass(l)},adopt:function(){Array.flatten(arguments).each(function(l){l=document.id(l,true);if(l){this.appendChild(l)}},this);return this},appendText:function(m,l){return this.grab(this.getDocument().newTextNode(m),l)},grab:function(m,l){a[l||"bottom"](document.id(m,true),this);return this},inject:function(m,l){a[l||"bottom"](this,document.id(m,true));return this},replaces:function(l){l=document.id(l,true);l.parentNode.replaceChild(this,l);return this},wraps:function(m,l){m=document.id(m,true);return this.replaces(m).grab(m,l)},getPrevious:function(l,m){return j(this,"previousSibling",null,l,false,m)},getAllPrevious:function(l,m){return j(this,"previousSibling",null,l,true,m)},getNext:function(l,m){return j(this,"nextSibling",null,l,false,m)},getAllNext:function(l,m){return j(this,"nextSibling",null,l,true,m)},getFirst:function(l,m){return j(this,"nextSibling","firstChild",l,false,m)},getLast:function(l,m){return j(this,"previousSibling","lastChild",l,false,m)},getParent:function(l,m){return j(this,"parentNode",null,l,false,m)},getParents:function(l,m){return j(this,"parentNode",null,l,true,m)},getSiblings:function(l,m){return this.getParent().getChildren(l,m).erase(this)},getChildren:function(l,m){return j(this,"nextSibling","firstChild",l,true,m)},getWindow:function(){return this.ownerDocument.window},getDocument:function(){return this.ownerDocument},getElementById:function(o,n){var m=this.ownerDocument.getElementById(o);if(!m){return null}for(var l=m.parentNode;l!=this;l=l.parentNode){if(!l){return null}}return document.id(m,n)},getSelected:function(){return new Elements($A(this.options).filter(function(l){return l.selected}))},getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()]}var l=this.getDocument().defaultView.getComputedStyle(this,null);return(l)?l.getPropertyValue([m.hyphenate()]):null},toQueryString:function(){var l=[];this.getElements("input, select, textarea",true).each(function(m){if(!m.name||m.disabled||m.type=="submit"||m.type=="reset"||m.type=="file"){return}var n=(m.tagName.toLowerCase()=="select")?Element.getSelected(m).map(function(o){return o.value}):((m.type=="radio"||m.type=="checkbox")&&!m.checked)?null:m.value;$splat(n).each(function(o){if(typeof o!="undefined"){l.push(m.name+"="+encodeURIComponent(o))}})});return l.join("&")},clone:function(o,l){o=o!==false;var r=this.cloneNode(o);var n=function(v,u){if(!l){v.removeAttribute("id")}if(Browser.Engine.trident){v.clearAttributes();v.mergeAttributes(u);v.removeAttribute("uid");if(v.options){var w=v.options,s=u.options;for(var t=w.length;t--;){w[t].selected=s[t].selected}}}var x=i[u.tagName.toLowerCase()];if(x&&u[x]){v[x]=u[x]}};if(o){var p=r.getElementsByTagName("*"),q=this.getElementsByTagName("*");for(var m=p.length;m--;){n(p[m],q[m])}}n(r,this);return document.id(r)},destroy:function(){Element.empty(this);Element.dispose(this);g(this,true);return null},empty:function(){$A(this.childNodes).each(function(l){Element.destroy(l)});return this},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this},hasChild:function(l){l=document.id(l,true);if(!l){return false}if(Browser.Engine.webkit&&Browser.Engine.version<420){return $A(this.getElementsByTagName(l.tagName)).contains(l)}return(this.contains)?(this!=l&&this.contains(l)):!!(this.compareDocumentPosition(l)&16)},match:function(l){return(!l||(l==this)||(Element.get(this,"tag")==l))}});Native.implement([Element,Window,Document],{addListener:function(o,n){if(o=="unload"){var l=n,m=this;n=function(){m.removeListener("unload",n);l()}}else{h[this.uid]=this}if(this.addEventListener){this.addEventListener(o,n,false)}else{this.attachEvent("on"+o,n)}return this},removeListener:function(m,l){if(this.removeEventListener){this.removeEventListener(m,l,false)}else{this.detachEvent("on"+m,l)}return this},retrieve:function(m,l){var o=c(this.uid),n=o[m];if(l!=undefined&&n==undefined){n=o[m]=l}return $pick(n)},store:function(m,l){var n=c(this.uid);n[m]=l;return this},eliminate:function(l){var m=c(this.uid);delete m[l];return this}});window.addListener("unload",d)})();Element.Properties=new Hash;Element.Properties.style={set:function(a){this.style.cssText=a},get:function(){return this.style.cssText},erase:function(){this.style.cssText=""}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase()}};Element.Properties.html=(function(){var c=document.createElement("div");var a={table:[1,"","
"],select:[1,""],tbody:[2,"","
"],tr:[3,"","
"]};a.thead=a.tfoot=a.tbody;var b={set:function(){var e=Array.flatten(arguments).join("");var f=Browser.Engine.trident&&a[this.get("tag")];if(f){var g=c;g.innerHTML=f[1]+e+f[2];for(var d=f[0];d--;){g=g.firstChild}this.empty().adopt(g.childNodes)}else{this.innerHTML=e}}};b.erase=b.set;return b})();if(Browser.Engine.webkit&&Browser.Engine.version<420){Element.Properties.text={get:function(){if(this.innerText){return this.innerText}var a=this.ownerDocument.newElement("div",{html:this.innerHTML}).inject(this.ownerDocument.body);var b=a.innerText;a.destroy();return b}}}Element.Properties.events={set:function(a){this.addEvents(a)}};Native.implement([Element,Window,Document],{addEvent:function(e,g){var h=this.retrieve("events",{});h[e]=h[e]||{keys:[],values:[]};if(h[e].keys.contains(g)){return this}h[e].keys.push(g);var f=e,a=Element.Events.get(e),c=g,i=this;if(a){if(a.onAdd){a.onAdd.call(this,g)}if(a.condition){c=function(j){if(a.condition.call(this,j)){return g.call(this,j)}return true}}f=a.base||f}var d=function(){return g.call(i)};var b=Element.NativeEvents[f];if(b){if(b==2){d=function(j){j=new Event(j,i.getWindow());if(c.call(i,j)===false){j.stop()}}}this.addListener(f,d)}h[e].values.push(d);return this},removeEvent:function(c,b){var a=this.retrieve("events");if(!a||!a[c]){return this}var f=a[c].keys.indexOf(b);if(f==-1){return this}a[c].keys.splice(f,1);var e=a[c].values.splice(f,1)[0];var d=Element.Events.get(c);if(d){if(d.onRemove){d.onRemove.call(this,b)}c=d.base||c}return(Element.NativeEvents[c])?this.removeListener(c,e):this},addEvents:function(a){for(var b in a){this.addEvent(b,a[b])}return this},removeEvents:function(a){var c;if($type(a)=="object"){for(c in a){this.removeEvent(c,a[c])}return this}var b=this.retrieve("events");if(!b){return this}if(!a){for(c in b){this.removeEvents(c)}this.eliminate("events")}else{if(b[a]){while(b[a].keys[0]){this.removeEvent(a,b[a].keys[0])}b[a]=null}}return this},fireEvent:function(d,b,a){var c=this.retrieve("events");if(!c||!c[d]){return this}c[d].keys.each(function(e){e.create({bind:this,delay:a,"arguments":b})()},this);return this},cloneEvents:function(d,a){d=document.id(d);var c=d.retrieve("events");if(!c){return this}if(!a){for(var b in c){this.cloneEvents(d,b)}}else{if(c[a]){c[a].keys.each(function(e){this.addEvent(a,e)},this)}}return this}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};(function(){var a=function(b){var c=b.relatedTarget;if(c==undefined){return true}if(c===false){return false}return($type(this)!="document"&&c!=this&&c.prefix!="xul"&&!this.hasChild(c))};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}})})();Element.Properties.styles={set:function(a){this.setStyles(a)}};Element.Properties.opacity={set:function(a,b){if(!b){if(a==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden"}}else{if(this.style.visibility!="visible"){this.style.visibility="visible"}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1}if(Browser.Engine.trident){this.style.filter=(a==1)?"":"alpha(opacity="+a*100+")"}this.style.opacity=a;this.store("opacity",a)},get:function(){return this.retrieve("opacity",1)}};Element.implement({setOpacity:function(a){return this.set("opacity",a,true)},getOpacity:function(){return this.get("opacity")},setStyle:function(b,a){switch(b){case"opacity":return this.set("opacity",parseFloat(a));case"float":b=(Browser.Engine.trident)?"styleFloat":"cssFloat"}b=b.camelCase();if($type(a)!="string"){var c=(Element.Styles.get(b)||"@").split(" ");a=$splat(a).map(function(e,d){if(!c[d]){return""}return($type(e)=="number")?c[d].replace("@",Math.round(e)):e}).join(" ")}else{if(a==String(Number(a))){a=Math.round(a)}}this.style[b]=a;return this},getStyle:function(g){switch(g){case"opacity":return this.get("opacity");case"float":g=(Browser.Engine.trident)?"styleFloat":"cssFloat"}g=g.camelCase();var a=this.style[g];if(!$chk(a)){a=[];for(var f in Element.ShortStyles){if(g!=f){continue}for(var e in Element.ShortStyles[f]){a.push(this.getStyle(e))}return a.join(" ")}a=this.getComputedStyle(g)}if(a){a=String(a);var c=a.match(/rgba?\([\d\s,]+\)/);if(c){a=a.replace(c[0],c[0].rgbToHex())}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(a,10)))){if(g.test(/^(height|width)$/)){var b=(g=="width")?["left","right"]:["top","bottom"],d=0;b.each(function(h){d+=this.getStyle("border-"+h+"-width").toInt()+this.getStyle("padding-"+h).toInt()},this);return this["offset"+g.capitalize()]-d+"px"}if((Browser.Engine.presto)&&String(a).test("px")){return a}if(g.test(/(border(.+)Width|margin|padding)/)){return"0px"}}return a},setStyles:function(b){for(var a in b){this.setStyle(a,b[a])}return this},getStyles:function(){var a={};Array.flatten(arguments).each(function(b){a[b]=this.getStyle(b)},this);return a}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"});Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(g){var f=Element.ShortStyles;var b=Element.Styles;["margin","padding"].each(function(h){var i=h+g;f[h][i]=b[i]="@px"});var e="border"+g;f.border[e]=b[e]="@px @ rgb(@, @, @)";var d=e+"Width",a=e+"Style",c=e+"Color";f[e]={};f.borderWidth[d]=f[e][d]=b[d]="@px";f.borderStyle[a]=f[e][a]=b[a]="@";f.borderColor[c]=f[e][c]=b[c]="rgb(@, @, @)"});(function(){Element.implement({scrollTo:function(h,i){if(b(this)){this.getWindow().scrollTo(h,i)}else{this.scrollLeft=h;this.scrollTop=i}return this},getSize:function(){if(b(this)){return this.getWindow().getSize()}return{x:this.offsetWidth,y:this.offsetHeight}},getScrollSize:function(){if(b(this)){return this.getWindow().getScrollSize()}return{x:this.scrollWidth,y:this.scrollHeight}},getScroll:function(){if(b(this)){return this.getWindow().getScroll()}return{x:this.scrollLeft,y:this.scrollTop}},getScrolls:function(){var i=this,h={x:0,y:0};while(i&&!b(i)){h.x+=i.scrollLeft;h.y+=i.scrollTop;i=i.parentNode}return h},getOffsetParent:function(){var h=this;if(b(h)){return null}if(!Browser.Engine.trident){return h.offsetParent}while((h=h.parentNode)&&!b(h)){if(d(h,"position")!="static"){return h}}return null},getOffsets:function(){if(this.getBoundingClientRect){var j=this.getBoundingClientRect(),m=document.id(this.getDocument().documentElement),p=m.getScroll(),k=this.getScrolls(),i=this.getScroll(),h=(d(this,"position")=="fixed");return{x:j.left.toInt()+k.x-i.x+((h)?0:p.x)-m.clientLeft,y:j.top.toInt()+k.y-i.y+((h)?0:p.y)-m.clientTop}}var l=this,n={x:0,y:0};if(b(this)){return n}while(l&&!b(l)){n.x+=l.offsetLeft;n.y+=l.offsetTop;if(Browser.Engine.gecko){if(!f(l)){n.x+=c(l);n.y+=g(l)}var o=l.parentNode;if(o&&d(o,"overflow")!="visible"){n.x+=c(o);n.y+=g(o)}}else{if(l!=this&&Browser.Engine.webkit){n.x+=c(l);n.y+=g(l)}}l=l.offsetParent}if(Browser.Engine.gecko&&!f(this)){n.x-=c(this);n.y-=g(this)}return n},getPosition:function(k){if(b(this)){return{x:0,y:0}}var l=this.getOffsets(),i=this.getScrolls();var h={x:l.x-i.x,y:l.y-i.y};var j=(k&&(k=document.id(k)))?k.getPosition():{x:0,y:0};return{x:h.x-j.x,y:h.y-j.y}},getCoordinates:function(j){if(b(this)){return this.getWindow().getCoordinates()}var h=this.getPosition(j),i=this.getSize();var k={left:h.x,top:h.y,width:i.x,height:i.y};k.right=k.left+k.width;k.bottom=k.top+k.height;return k},computePosition:function(h){return{left:h.x-e(this,"margin-left"),top:h.y-e(this,"margin-top")}},setPosition:function(h){return this.setStyles(this.computePosition(h))}});Native.implement([Document,Window],{getSize:function(){if(Browser.Engine.presto||Browser.Engine.webkit){var i=this.getWindow();return{x:i.innerWidth,y:i.innerHeight}}var h=a(this);return{x:h.clientWidth,y:h.clientHeight}},getScroll:function(){var i=this.getWindow(),h=a(this);return{x:i.pageXOffset||h.scrollLeft,y:i.pageYOffset||h.scrollTop}},getScrollSize:function(){var i=a(this),h=this.getSize();return{x:Math.max(i.scrollWidth,h.x),y:Math.max(i.scrollHeight,h.y)}},getPosition:function(){return{x:0,y:0}},getCoordinates:function(){var h=this.getSize();return{top:0,left:0,bottom:h.y,right:h.x,height:h.y,width:h.x}}});var d=Element.getComputedStyle;function e(h,i){return d(h,i).toInt()||0}function f(h){return d(h,"-moz-box-sizing")=="border-box"}function g(h){return e(h,"border-top-width")}function c(h){return e(h,"border-left-width")}function b(h){return(/^(?:body|html)$/i).test(h.tagName)}function a(h){var i=h.getDocument();return(!i.compatMode||i.compatMode=="CSS1Compat")?i.html:i.body}})();Element.alias("setPosition","position");Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y},getWidth:function(){return this.getSize().x},getScrollTop:function(){return this.getScroll().y},getScrollLeft:function(){return this.getScroll().x},getScrollHeight:function(){return this.getScrollSize().y},getScrollWidth:function(){return this.getScrollSize().x},getTop:function(){return this.getPosition().y},getLeft:function(){return this.getPosition().x}});Native.implement([Document,Element],{getElements:function(h,g){h=h.split(",");var c,e={};for(var d=0,b=h.length;d1),cash:!g})}});Element.implement({match:function(b){if(!b||(b==this)){return true}var d=Selectors.Utils.parseTagAndID(b);var a=d[0],e=d[1];if(!Selectors.Filters.byID(this,e)||!Selectors.Filters.byTag(this,a)){return false}var c=Selectors.Utils.parseSelector(b);return(c)?Selectors.Utils.filter(this,c,{}):true}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};Selectors.Utils={chk:function(b,c){if(!c){return true}var a=$uid(b);if(!c[a]){return c[a]=true}return false},parseNthArgument:function(h){if(Selectors.Cache.nth[h]){return Selectors.Cache.nth[h]}var e=h.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!e){return false}var g=parseInt(e[1],10);var d=(g||g===0)?g:1;var f=e[2]||false;var c=parseInt(e[3],10)||0;if(d!=0){c--;while(c<1){c+=d}while(c>=d){c-=d}}else{d=c;f="index"}switch(f){case"n":e={a:d,b:c,special:"n"};break;case"odd":e={a:2,b:0,special:"n"};break;case"even":e={a:2,b:1,special:"n"};break;case"first":e={a:0,special:"index"};break;case"last":e={special:"last-child"};break;case"only":e={special:"only-child"};break;default:e={a:(d-1),special:"index"}}return Selectors.Cache.nth[h]=e},parseSelector:function(e){if(Selectors.Cache.parsed[e]){return Selectors.Cache.parsed[e]}var d,h={classes:[],pseudos:[],attributes:[]};while((d=Selectors.RegExps.combined.exec(e))){var i=d[1],g=d[2],f=d[3],b=d[5],c=d[6],j=d[7];if(i){h.classes.push(i)}else{if(c){var a=Selectors.Pseudo.get(c);if(a){h.pseudos.push({parser:a,argument:j})}else{h.attributes.push({name:c,operator:"=",value:j})}}else{if(g){h.attributes.push({name:g,operator:f,value:b})}}}}if(!h.classes.length){delete h.classes}if(!h.attributes.length){delete h.attributes}if(!h.pseudos.length){delete h.pseudos}if(!h.classes&&!h.attributes&&!h.pseudos){h=null}return Selectors.Cache.parsed[e]=h},parseTagAndID:function(b){var a=b.match(Selectors.RegExps.tag);var c=b.match(Selectors.RegExps.id);return[(a)?a[1]:"*",(c)?c[1]:false]},filter:function(f,c,e){var d;if(c.classes){for(d=c.classes.length;d--;d){var g=c.classes[d];if(!Selectors.Filters.byClass(f,g)){return false}}}if(c.attributes){for(d=c.attributes.length;d--;d){var b=c.attributes[d];if(!Selectors.Filters.byAttribute(f,b.name,b.operator,b.value)){return false}}}if(c.pseudos){for(d=c.pseudos.length;d--;d){var a=c.pseudos[d];if(!Selectors.Filters.byPseudo(f,a.parser,a.argument,e)){return false}}}return true},getByTagAndID:function(b,a,d){if(d){var c=(b.getElementById)?b.getElementById(d,true):Element.getElementById(b,d,true);return(c&&Selectors.Filters.byTag(c,a))?[c]:[]}else{return b.getElementsByTagName(a)}},search:function(o,h,t){var b=[];var c=h.trim().replace(Selectors.RegExps.splitter,function(k,j,i){b.push(j);return":)"+i}).split(":)");var p,e,A;for(var z=0,v=c.length;z":function(h,g,j,a,f){var c=Selectors.Utils.getByTagAndID(g,j,a);for(var e=0,d=c.length;ea){return false}}return(c==a)},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a)},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a)},selected:function(){return this.selected},enabled:function(){return(this.disabled===false)}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this)}}};(function(){var b=function(){if(Browser.loaded){return}Browser.loaded=true;window.fireEvent("domready");document.fireEvent("domready")};window.addEvent("load",b);if(Browser.Engine.trident){var a=document.createElement("div");(function(){($try(function(){a.doScroll();return document.id(a).inject(document.body).set("html","temp").dispose()}))?b():arguments.callee.delay(50)})()}else{if(Browser.Engine.webkit&&Browser.Engine.version<525){(function(){(["loaded","complete"].contains(document.readyState))?b():arguments.callee.delay(50)})()}else{document.addEvent("DOMContentLoaded",b)}}})();var JSON=new Hash(this.JSON&&{stringify:JSON.stringify,parse:JSON.parse}).extend({$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(a){return JSON.$specialChars[a]||"\\u00"+Math.floor(a.charCodeAt()/16).toString(16)+(a.charCodeAt()%16).toString(16)},encode:function(b){switch($type(b)){case"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(b.map(JSON.encode).clean())+"]";case"object":case"hash":var a=[];Hash.each(b,function(e,d){var c=JSON.encode(e);if(c){a.push(JSON.encode(d)+":"+c)}});return"{"+a+"}";case"number":case"boolean":return String(b);case false:return"null"}return null},decode:function(string,secure){if($type(string)!="string"||!string.length){return null}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null}return eval("("+string+")")}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this)}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(b,a){this.key=b;this.setOptions(a)},write:function(b){b=encodeURIComponent(b);if(this.options.domain){b+="; domain="+this.options.domain}if(this.options.path){b+="; path="+this.options.path}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString()}if(this.options.secure){b+="; secure"}this.options.document.cookie=this.key+"="+b;return this},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");return(a)?decodeURIComponent(a[1]):null},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this}});Cookie.write=function(b,c,a){return new Cookie(b,a).write(c)};Cookie.read=function(a){return new Cookie(a).read()};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose()};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object},initialize:function(l,m){this.instance="Swiff_"+$time();this.setOptions(m);m=this.options;var b=this.id=m.id||this.instance;var a=document.id(m.container);Swiff.CallBacks[this.instance]={};var e=m.params,g=m.vars,f=m.callBacks;var h=$extend({height:m.height,width:m.width},m.properties);var k=this;for(var d in f){Swiff.CallBacks[this.instance][d]=(function(n){return function(){return n.apply(k.object,arguments)}})(f[d]);g[d]="Swiff.CallBacks."+this.instance+"."+d}e.flashVars=Hash.toQueryString(g);if(Browser.Engine.trident){h.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";e.movie=l}else{h.type="application/x-shockwave-flash";h.data=l}var j=''}}j+="";this.object=((a)?a.empty():new Element("div")).set("html",j).firstChild},replaces:function(a){a=document.id(a,true);a.parentNode.replaceChild(this.toElement(),a);return this},inject:function(a){document.id(a,true).appendChild(this.toElement());return this},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments))}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+"");return eval(rs)};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(a){this.subject=this.subject||this;this.setOptions(a);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var b=this.options.wait;if(b===false){this.options.link="cancel"}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2}},step:function(){var a=$time();if(a=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break}}return e},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a[0]||1)/3)}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,[a+2])})});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,noCache:false},initialize:function(a){this.xhr=new Browser.Request();this.setOptions(a);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers)},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status}.bind(this));this.xhr.onreadystatechange=$empty;if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};this.success(this.response.text,this.response.xml)}else{this.response={text:null,xml:null};this.failure()}},isSuccess:function(){return((this.status>=200)&&(this.status<300))},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a)}return a.stripScripts(this.options.evalScripts)},success:function(b,a){this.onSuccess(this.processScripts(b),a)},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain()},failure:function(){this.onFailure()},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr)},setHeader:function(a,b){this.headers.set(a,b);return this},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a)}.bind(this))},check:function(){if(!this.running){return true}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));return false}return false},send:function(k){if(!this.check(k)){return this}this.running=true;var i=$type(k);if(i=="string"||i=="element"){k={data:k}}var d=this.options;k=$extend({data:d.data,url:d.url,method:d.method},k);var g=k.data,b=String(k.url),a=k.method.toLowerCase();switch($type(g)){case"element":g=document.id(g).toQueryString();break;case"object":case"hash":g=Hash.toQueryString(g)}if(this.options.format){var j="format="+this.options.format;g=(g)?j+"&"+g:j}if(this.options.emulation&&!["get","post"].contains(a)){var h="_method="+a;g=(g)?h+"&"+g:h;a="post"}if(this.options.urlEncoded&&a=="post"){var c=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers.set("Content-type","application/x-www-form-urlencoded"+c)}if(this.options.noCache){var f="noCache="+new Date().getTime();g=(g)?f+"&"+g:f}var e=b.lastIndexOf("/");if(e>-1&&(e=b.indexOf("#"))>-1){b=b.substr(0,e)}if(g&&a=="get"){b=b+(b.contains("?")?"&":"?")+g;g=null}this.xhr.open(a.toUpperCase(),b,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this);this.headers.each(function(m,l){try{this.xhr.setRequestHeader(l,m)}catch(n){this.fireEvent("exception",[l,m])}},this);this.fireEvent("request");this.xhr.send(g);if(!this.options.async){this.onStateChange()}return this},cancel:function(){if(!this.running){return this}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this}});(function(){var a={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined});return this.send($extend(c,{method:b}))}});Request.implement(a)})();Element.Properties.send={set:function(a){var b=this.retrieve("send");if(b){b.cancel()}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},a))},get:function(a){if(a||!this.retrieve("send")){if(a||!this.retrieve("send:options")){this.set("send",a)}this.store("send",new Request(this.retrieve("send:options")))}return this.retrieve("send")}};Element.implement({send:function(a){var b=this.get("send");b.send({data:this,url:a||b.options.url});return this}});Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false},processHTML:function(c){var b=c.match(/]*>([\s\S]*?)<\/body>/i);c=(b)?b[1]:c;var a=new Element("div");return $try(function(){var d=""+c+"",g;if(Browser.Engine.trident){g=new ActiveXObject("Microsoft.XMLDOM");g.async=false;g.loadXML(d)}else{g=new DOMParser().parseFromString(d,"text/xml")}d=g.getElementsByTagName("root")[0];if(!d){return null}for(var f=0,e=d.childNodes.length;f0&&this.options.height)||h.offsetWidth>0&&this.options.width)){f=true;this.selfHidden=true}}this.fireEvent(f?"background":"active",[this.togglers[g],h]);for(var j in this.effects){e[g][j]=f?0:h[this.effects[j]]}},this);this.internalChain.chain(function(){if(this.options.returnHeightToAuto&&!this.selfHidden){var f=this.elements[a];if(f){f.setStyle("height","auto")}}}.bind(this));return b?this.start(e):this.set(e)}});Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);var d=this.cancel.bind(this,false);if($type(this.element)!="element"){this.element=document.id(this.element.getDocument().body)}var c=this.element;if(this.options.wheelStops){this.addEvent("start",function(){c.addEvent("mousewheel",d)},true);this.addEvent("complete",function(){c.removeEvent("mousewheel",d)},true)}},set:function(){var a=Array.flatten(arguments);if(Browser.Engine.gecko){a=[Math.round(a[0]),Math.round(a[1])]}this.element.scrollTo(a[0],a[1])},compute:function(c,b,a){return[0,1].map(function(d){return Fx.compute(c[d],b[d],a)})},start:function(c,g){if(!this.check(c,g)){return this}var e=this.element.getScrollSize(),b=this.element.getScroll(),d={x:c,y:g};for(var f in d){var a=e[f];if($chk(d[f])){d[f]=($type(d[f])=="number")?d[f]:a}else{d[f]=b[f]}d[f]+=this.options.offset[f]}return this.parent([b.x,b.y],[d.x,d.y])},toTop:function(){return this.start(false,0)},toLeft:function(){return this.start(0,false)},toRight:function(){return this.start("right",false)},toBottom:function(){return this.start(false,"bottom")},toElement:function(b){var a=document.id(b).getPosition(this.element);return this.start(a.x,a.y)},scrollIntoView:function(c,e,d){e=e?$splat(e):["x","y"];var h={};c=document.id(c);var f=c.getPosition(this.element);var i=c.getSize();var g=this.element.getScroll();var a=this.element.getSize();var b={x:f.x+i.x,y:f.y+i.y};["x","y"].each(function(j){if(e.contains(j)){if(b[j]>g[j]+a[j]){h[j]=b[j]-a[j]}if(f[j]this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element)}},drag:function(a){if(this.options.preventDefault){a.preventDefault()}this.mouse.now=a.page;for(var b in this.options.modifiers){if(!this.options.modifiers[b]){continue}this.value.now[b]=this.mouse.now[b]-this.mouse.pos[b];if(this.options.invert){this.value.now[b]*=-1}if(this.options.limit&&this.limit[b]){if($chk(this.limit[b][1])&&(this.value.now[b]>this.limit[b][1])){this.value.now[b]=this.limit[b][1]}else{if($chk(this.limit[b][0])&&(this.value.now[b]c.left&&a.xc.top)},checkDroppables:function(){var a=this.droppables.filter(this.checkAgainst,this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed])}if(a){this.fireEvent("enter",[this.element,a])}this.overed=a}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables()}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a)}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a);this.store("dragger",b);return b}});Class.Mutators.Binds=function(a){return a};Class.Mutators.initialize=function(a){return function(){$splat(this.Binds).each(function(b){var c=this[b];if(c){this[b]=c.bind(this)}},this);return a.apply(this,arguments)}};Element.implement({measure:function(e){var g=function(h){return !!(!h||h.offsetHeight||h.offsetWidth)};if(g(this)){return e.apply(this)}var d=this.getParent(),f=[],b=[];while(!g(d)&&d!=document.body){b.push(d.expose());d=d.getParent()}var c=this.expose();var a=e.apply(this);c();b.each(function(h){h()});return a},expose:function(){if(this.getStyle("display")!="none"){return $empty}var a=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=a}.bind(this)},getDimensions:function(a){a=$merge({computeSize:false},a);var f={};var d=function(g,e){return(e.computeSize)?g.getComputedSize(e):g.getSize()};var b=this.getParent("body");if(b&&this.getStyle("display")=="none"){f=this.measure(function(){return d(this,a)})}else{if(b){try{f=d(this,a)}catch(c){}}else{f={x:0,y:0}}}return $chk(f.x)?$extend(f,{width:f.x,height:f.y}):$extend(f,{x:f.width,y:f.height})},getComputedSize:function(a){a=$merge({styles:["padding","border"],plains:{height:["top","bottom"],width:["left","right"]},mode:"both"},a);var c={width:0,height:0};switch(a.mode){case"vertical":delete c.width;delete a.plains.width;break;case"horizontal":delete c.height;delete a.plains.height;break}var b=[];$each(a.plains,function(g,f){g.each(function(h){a.styles.each(function(i){b.push((i=="border")?i+"-"+h+"-width":i+"-"+h)})})});var e={};b.each(function(f){e[f]=this.getComputedStyle(f)},this);var d=[];$each(a.plains,function(g,f){var h=f.capitalize();c["total"+h]=c["computed"+h]=0;g.each(function(i){c["computed"+i.capitalize()]=0;b.each(function(k,j){if(k.test(i)){e[k]=e[k].toInt()||0;c["total"+h]=c["total"+h]+e[k];c["computed"+i.capitalize()]=c["computed"+i.capitalize()]+e[k]}if(k.test(i)&&f!=k&&(k.test("border")||k.test("padding"))&&!d.contains(k)){d.push(k);c["computed"+h]=c["computed"+h]-e[k]}})})});["Width","Height"].each(function(g){var f=g.toLowerCase();if(!$chk(c[f])){return}c[f]=c[f]+this["offset"+g]+c["computed"+g];c["total"+g]=c[f]+c["total"+g];delete c["computed"+g]},this);return $extend(e,c)}});var Slider=new Class({Implements:[Events,Options],Binds:["clickedElement","draggedKnob","scrolledElement"],options:{onTick:function(a){if(this.options.snap){a=this.toPosition(this.step)}this.knob.setStyle(this.property,a)},initialStep:0,snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(f,a,e){this.setOptions(e);this.element=document.id(f);this.knob=document.id(a);this.previousChange=this.previousEnd=this.step=-1;var g,b={},d={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";this.property="top";g="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";g="offsetWidth"}this.full=this.element.measure(function(){this.half=this.knob[g]/2;return this.element[g]-this.knob[g]+(this.options.offset*2)}.bind(this));this.min=$chk(this.options.range[0])?this.options.range[0]:0;this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;this.stepWidth=this.stepSize*this.full/Math.abs(this.range);this.knob.setStyle("position","relative").setStyle(this.property,this.options.initialStep?this.toPosition(this.options.initialStep):-this.options.offset);d[this.axis]=this.property;b[this.axis]=[-this.options.offset,this.full-this.options.offset];var c={snap:0,limit:b,modifiers:d,onDrag:this.draggedKnob,onStart:this.draggedKnob,onBeforeStart:(function(){this.isDragging=true}).bind(this),onCancel:function(){this.isDragging=false}.bind(this),onComplete:function(){this.isDragging=false;this.draggedKnob();this.end()}.bind(this)};if(this.options.snap){c.grid=Math.ceil(this.stepWidth);c.limit[this.axis][1]=this.full}this.drag=new Drag(this.knob,c);this.attach()},attach:function(){this.element.addEvent("mousedown",this.clickedElement);if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement)}this.drag.attach();return this},detach:function(){this.element.removeEvent("mousedown",this.clickedElement);this.element.removeEvent("mousewheel",this.scrolledElement);this.drag.detach();return this},set:function(a){if(!((this.range>0)^(a0)^(a>this.max))){a=this.max}this.step=Math.round(a);this.checkStep();this.fireEvent("tick",this.toPosition(this.step));this.end();return this},clickedElement:function(c){if(this.isDragging||c.target==this.knob){return}var b=this.range<0?-1:1;var a=c.page[this.axis]-this.element.getPosition()[this.axis]-this.half;a=a.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();this.fireEvent("tick",a);this.end()},scrolledElement:function(a){var b=(this.options.mode=="horizontal")?(a.wheel<0):(a.wheel>0);this.set(b?this.step-this.stepSize:this.step+this.stepSize);a.stop()},draggedKnob:function(){var b=this.range<0?-1:1;var a=this.drag.value.now[this.axis];a=a.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+b*this.toStep(a));this.checkStep()},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;this.fireEvent("change",this.step)}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+"")}},toStep:function(a){var b=(a+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(b-=b%this.stepSize):b},toPosition:function(a){return(this.full*Math.abs(this.min-a))/(this.steps*this.stepSize)-this.options.offset}});var Sortables=new Class({Implements:[Events,Options],options:{snap:4,opacity:1,clone:false,revert:false,handle:false,constrain:false},initialize:function(a,b){this.setOptions(b);this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false}if(this.options.revert){this.effect=new Fx.Morph(null,$merge({duration:250,link:"cancel"},this.options.revert))}},attach:function(){this.addLists(this.lists);return this},detach:function(){this.lists=this.removeLists(this.lists);return this},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a);var b=a.retrieve("sortables:start",this.start.bindWithEvent(this,a));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b)},this);return this},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.push(a);this.addItems(a.getChildren())},this);return this},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b);return a},this))},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a},this))},getClone:function(b,a){if(!this.options.clone){return new Element("div").inject(document.body)}if($type(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list)}return a.clone(true).setStyles({margin:"0px",position:"absolute",visibility:"hidden",width:a.getStyle("width")}).inject(this.list).setPosition(a.getPosition(a.getOffsetParent()))},getDroppables:function(){var a=this.list.getChildren();if(!this.options.constrain){a=this.lists.concat(a).erase(this.list)}return a.erase(this.clone).erase(this.element)},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b;this.drag.droppables=this.getDroppables()}else{a=this.element.getAllPrevious().contains(b)?"before":"after"}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone])},start:function(b,a){if(!this.idle){return}this.idle=false;this.element=a;this.opacity=a.get("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,{snap:this.options.snap,container:this.options.constrain&&this.element.getParent(),droppables:this.getDroppables(),onSnap:function(){b.stop();this.clone.setStyle("visibility","visible");this.element.set("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone])}.bind(this),onEnter:this.insert.bind(this),onCancel:this.reset.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b)},end:function(){this.drag.detach();this.element.set("opacity",this.opacity);if(this.effect){var a=this.element.getStyles("width","height");var b=this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));this.effect.element=this.clone;this.effect.start({top:b.top,left:b.left,width:a.width,height:a.height,opacity:0.25}).chain(this.reset.bind(this))}else{this.reset()}},reset:function(){this.idle=true;this.clone.destroy();this.fireEvent("complete",this.element)},serialize:function(){var c=Array.link(arguments,{modifier:Function.type,index:$defined});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id")},this)},this);var a=c.index;if(this.lists.length==1){a=0}return $chk(a)&&a>=0&&a=3){c="rgb";b=Array.slice(arguments,0,3)}else{if(typeof b=="string"){if(b.match(/rgb/)){b=b.rgbToHex().hexToRgb(true)}else{if(b.match(/hsb/)){b=b.hsbToRgb()}else{b=b.hexToRgb(true)}}}}c=c||"rgb";switch(c){case"hsb":var a=b;b=b.hsbToRgb();b.hsb=a;break;case"hex":b=b.hexToRgb(true);break}b.rgb=b.slice(0,3);b.hsb=b.hsb||b.rgbToHsb();b.hex=b.rgbToHex();return $extend(b,this)}});Color.implement({mix:function(){var a=Array.slice(arguments);var c=($type(a.getLast())=="number")?a.pop():50;var b=this.slice();a.each(function(d){d=new Color(d);for(var e=0;e<3;e++){b[e]=Math.round((b[e]/100*(100-c))+(d[e]/100*c))}});return new Color(b,"rgb")},invert:function(){return new Color(this.map(function(a){return 255-a}))},setHue:function(a){return new Color([a,this.hsb[1],this.hsb[2]],"hsb")},setSaturation:function(a){return new Color([this.hsb[0],a,this.hsb[2]],"hsb")},setBrightness:function(a){return new Color([this.hsb[0],this.hsb[1],a],"hsb")}});var $RGB=function(d,c,a){return new Color([d,c,a],"rgb")};var $HSB=function(d,c,a){return new Color([d,c,a],"hsb")};var $HEX=function(a){return new Color(a,"hex")};Array.implement({rgbToHsb:function(){var b=this[0],c=this[1],j=this[2],g=0;var i=Math.max(b,c,j),e=Math.min(b,c,j);var k=i-e;var h=i/255,f=(i!=0)?k/i:0;if(f!=0){var d=(i-b)/k;var a=(i-c)/k;var l=(i-j)/k;if(b==i){g=l-a}else{if(c==i){g=2+d-l}else{g=4+a-d}}g/=6;if(g<0){g++}}return[Math.round(g*360),Math.round(f*100),Math.round(h*100)]},hsbToRgb:function(){var c=Math.round(this[2]/100*255);if(this[1]==0){return[c,c,c]}else{var a=this[0]%360;var e=a%60;var g=Math.round((this[2]*(100-this[1]))/10000*255);var d=Math.round((this[2]*(6000-this[1]*e))/600000*255);var b=Math.round((this[2]*(6000-this[1]*(60-e)))/600000*255);switch(Math.floor(a/60)){case 0:return[c,b,g];case 1:return[d,c,g];case 2:return[g,c,b];case 3:return[g,d,c];case 4:return[b,g,c];case 5:return[c,g,d]}}return false}});String.implement({rgbToHsb:function(){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHsb():null},hsbToRgb:function(){var a=this.match(/\d{1,3}/g);return(a)?a.hsbToRgb():null}});var Group=new Class({initialize:function(){this.instances=Array.flatten(arguments);this.events={};this.checker={}},addEvent:function(b,a){this.checker[b]=this.checker[b]||{};this.events[b]=this.events[b]||[];if(this.events[b].contains(a)){return false}else{this.events[b].push(a)}this.instances.each(function(c,d){c.addEvent(b,this.check.bind(this,[b,c,d]))},this);return this},check:function(c,a,b){this.checker[c][b]=true;var d=this.instances.every(function(f,e){return this.checker[c][e]||false},this);if(!d){return}this.checker[c]={};this.events[c].each(function(e){e.call(this,this.instances,a)},this)}});Hash.Cookie=new Class({Extends:Cookie,options:{autoSave:true},initialize:function(b,a){this.parent(b,a);this.load()},save:function(){var a=JSON.encode(this.hash);if(!a||a.length>4096){return false}if(a=="{}"){this.dispose()}else{this.write(a)}return true},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return this}});Hash.each(Hash.prototype,function(b,a){if(typeof b=="function"){Hash.Cookie.implement(a,function(){var c=b.apply(this.hash,arguments);if(this.options.autoSave){this.save()}return c})}});var Scroller=new Class({Implements:[Events,Options],options:{area:20,velocity:1,onChange:function(a,b){this.element.scrollTo(a,b)},fps:50},initialize:function(b,a){this.setOptions(a);this.element=document.id(b);this.listener=($type(this.element)!="element")?document.id(this.element.getDocument().body):this.element;this.timer=null;this.bound={attach:this.attach.bind(this),detach:this.detach.bind(this),getCoords:this.getCoords.bind(this)}},start:function(){this.listener.addEvents({mouseover:this.bound.attach,mouseout:this.bound.detach})},stop:function(){this.listener.removeEvents({mouseover:this.bound.attach,mouseout:this.bound.detach});this.detach();this.timer=$clear(this.timer)},attach:function(){this.listener.addEvent("mousemove",this.bound.getCoords)},detach:function(){this.listener.removeEvent("mousemove",this.bound.getCoords);this.timer=$clear(this.timer)},getCoords:function(a){this.page=(this.listener.get("tag")=="body")?a.client:a.page;if(!this.timer){this.timer=this.scroll.periodical(Math.round(1000/this.options.fps),this)}},scroll:function(){var b=this.element.getSize(),a=this.element.getScroll(),f=this.element.getOffsets(),c=this.element.getScrollSize(),e={x:0,y:0};for(var d in this.page){if(this.page[d]<(this.options.area+f[d])&&a[d]!=0){e[d]=(this.page[d]-this.options.area-f[d])*this.options.velocity}else{if(this.page[d]+this.options.area>(b[d]+f[d])&&a[d]+b[d]!=c[d]){e[d]=(this.page[d]-b[d]+this.options.area-f[d])*this.options.velocity}}}if(e.y||e.x){this.fireEvent("change",[a.x+e.x,a.y+e.y])}}});(function(){var a=function(c,b){return(c)?($type(c)=="function"?c(b):b.get(c)):""};this.Tips=new Class({Implements:[Events,Options],options:{onShow:function(){this.tip.setStyle("display","block")},onHide:function(){this.tip.setStyle("display","none")},title:"title",text:function(b){return b.get("rel")||b.get("href")},showDelay:100,hideDelay:100,className:"tip-wrap",offset:{x:16,y:16},windowPadding:{x:0,y:0},fixed:false},initialize:function(){var b=Array.link(arguments,{options:Object.type,elements:$defined});this.setOptions(b.options);if(b.elements){this.attach(b.elements)}this.container=new Element("div",{"class":"tip"})},toElement:function(){if(this.tip){return this.tip}this.container=new Element("div",{"class":"tip"});return this.tip=new Element("div",{"class":this.options.className,styles:{position:"absolute",top:0,left:0}}).adopt(new Element("div",{"class":"tip-top"}),this.container,new Element("div",{"class":"tip-bottom"})).inject(document.body)},attach:function(b){$$(b).each(function(d){var f=a(this.options.title,d),e=a(this.options.text,d);d.erase("title").store("tip:native",f).retrieve("tip:title",f);d.retrieve("tip:text",e);this.fireEvent("attach",[d]);var c=["enter","leave"];if(!this.options.fixed){c.push("move")}c.each(function(h){var g=d.retrieve("tip:"+h);if(!g){g=this["element"+h.capitalize()].bindWithEvent(this,d)}d.store("tip:"+h,g).addEvent("mouse"+h,g)},this)},this);return this},detach:function(b){$$(b).each(function(d){["enter","leave","move"].each(function(e){d.removeEvent("mouse"+e,d.retrieve("tip:"+e)).eliminate("tip:"+e)});this.fireEvent("detach",[d]);if(this.options.title=="title"){var c=d.retrieve("tip:native");if(c){d.set("title",c)}}},this);return this},elementEnter:function(c,b){this.container.empty();["title","text"].each(function(e){var d=b.retrieve("tip:"+e);if(d){this.fill(new Element("div",{"class":"tip-"+e}).inject(this.container),d)}},this);$clear(this.timer);this.timer=(function(){this.show(b);this.position((this.options.fixed)?{page:b.getPosition()}:c)}).delay(this.options.showDelay,this)},elementLeave:function(c,b){$clear(this.timer);this.timer=this.hide.delay(this.options.hideDelay,this,b);this.fireForParent(c,b)},fireForParent:function(c,b){b=b.getParent();if(!b||b==document.body){return}if(b.retrieve("tip:enter")){b.fireEvent("mouseenter",c)}else{this.fireForParent(c,b)}},elementMove:function(c,b){this.position(c)},position:function(e){if(!this.tip){document.id(this)}var c=window.getSize(),b=window.getScroll(),f={x:this.tip.offsetWidth,y:this.tip.offsetHeight},d={x:"left",y:"top"},g={};for(var h in d){g[d[h]]=e.page[h]+this.options.offset[h];if((g[d[h]]+f[h]-b[h])>c[h]-this.options.windowPadding[h]){g[d[h]]=e.page[h]-this.options.offset[h]-f[h]}}this.tip.setStyles(g)},fill:function(b,c){if(typeof c=="string"){b.set("html",c)}else{b.adopt(c)}},show:function(b){if(!this.tip){document.id(this)}this.fireEvent("show",[this.tip,b])},hide:function(b){if(!this.tip){document.id(this)}this.fireEvent("hide",[this.tip,b])}})})();var Asset={javascript:function(f,d){d=$extend({onload:$empty,document:document,check:$lambda(true)},d);var b=new Element("script",{src:f,type:"text/javascript"});var e=d.onload.bind(b),a=d.check,g=d.document;delete d.onload;delete d.check;delete d.document;b.addEvents({load:e,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){e()}}}).set(d);if(Browser.Engine.webkit419){var c=(function(){if(!$try(a)){return}$clear(c);e()}).periodical(50)}return b.inject(g.head)},css:function(b,a){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:b},a)).inject(document.head)},image:function(c,b){b=$merge({onload:$empty,onabort:$empty,onerror:$empty},b);var d=new Image();var a=document.id(d)||new Element("img");["load","abort","error"].each(function(e){var f="on"+e;var g=b[f];delete b[f];d[f]=function(){if(!d){return}if(!a.parentNode){a.width=d.width;a.height=d.height}d=d.onload=d.onabort=d.onerror=null;g.delay(1,a,a);a.fireEvent(e,a,1)}});d.src=a.src=c;if(d&&d.complete){d.onload.delay(1)}return a.set(b)},images:function(d,c){c=$merge({onComplete:$empty,onProgress:$empty,onError:$empty,properties:{}},c);d=$splat(d);var a=[];var b=0;return new Elements(d.map(function(e){return Asset.image(e,$extend(c.properties,{onload:function(){c.onProgress.call(this,b,d.indexOf(e));b++;if(b==d.length){c.onComplete()}},onerror:function(){c.onError.call(this,b,d.indexOf(e));b++;if(b==d.length){c.onComplete()}}}))}))}};if(!window.console){var console={}}if(!console.log){console.log=function(){}}if(!console.warn){console.warn=console.log}if(!console.error){console.error=console.warn}MooTools.upgradeLog=function(){if(console[this.upgradeLogLevel]){console[this.upgradeLogLevel].apply(console,arguments)}};(function(){oldA=$A;window.$A=function(k,m,j){if(m!=undefined&&j!=undefined){MooTools.upgradeLog("1.1 > 1.2: $A no longer takes start and length arguments.");if(Browser.Engine.trident&&$type(k)=="collection"){m=m||0;if(m<0){m=k.length+m}j=j||(k.length-m);var l=[];for(var h=0;h 1.2: native types no longer use .extend to add methods to prototypes but instead use .implement. NOTE: YOUR METHODS WERE NOT IMPLEMENTED ON THE NATIVE "+d.toUpperCase()+" PROTOTYPE.");return f.apply(this,arguments)}}}})();window.onDomReady=Window.onDomReady=function(a){MooTools.upgradeLog('1.1 > 1.2: window.onDomReady is no longer supported. Use window.addEvent("domready") instead');return window.addEvent("domready",a)};if(Browser.__defineGetter__){Browser.__defineGetter__("hasGetter",function(){return true})}if(Browser.hasGetter){window.__defineGetter__("ie",function(){MooTools.upgradeLog("1.1 > 1.2: window.ie is deprecated. Use Browser.Engine.trident");return(Browser.Engine.name=="trident")?true:false});window.__defineGetter__("ie6",function(){MooTools.upgradeLog("1.1 > 1.2: window.ie6 is deprecated. Use Browser.Engine.trident and Browser.Engine.version");return(Browser.Engine.name=="trident"&&Browser.Engine.version==4)?true:false});window.__defineGetter__("ie7",function(){MooTools.upgradeLog("1.1 > 1.2: window.ie7 is deprecated. Use Browser.Engine.trident and Browser.Engine.version");return(Browser.Engine.name=="trident"&&Browser.Engine.version==5)?true:false});window.__defineGetter__("gecko",function(){MooTools.upgradeLog("1.1 > 1.2: window.gecko is deprecated. Use Browser.Engine.gecko");return(Browser.Engine.name=="gecko")?true:false});window.__defineGetter__("webkit",function(){MooTools.upgradeLog("1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit");return(Browser.Engine.name=="webkit")?true:false});window.__defineGetter__("webkit419",function(){MooTools.upgradeLog("1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version");return(Browser.Engine.name=="webkit"&&Browser.Engine.version==419)?true:false});window.__defineGetter__("webkit420",function(){MooTools.upgradeLog("1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version");return(Browser.Engine.name=="webkit"&&Browser.Engine.version==420)?true:false});window.__defineGetter__("opera",function(){MooTools.upgradeLog("1.1 > 1.2: window.opera is deprecated. Use Browser.Engine.presto");return(Browser.Engine.name=="presto")?true:false})}else{window[Browser.Engine.name]=window[Browser.Engine.name+Browser.Engine.version]=true;window.ie=window.trident;window.ie6=window.trident4;window.ie7=window.trident5}Array.implement({copy:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Array.copy is deprecated. Use Array.splice");return $A(this,b,a)},remove:function(a){MooTools.upgradeLog("1.1 > 1.2: Array.remove is deprecated. Use Array.erase");return this.erase(a)},merge:function(a){MooTools.upgradeLog("1.1 > 1.2: Array.merge is deprecated. Use Array.combine");return this.combine(a)}});Function.implement({bindAsEventListener:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Function.bindAsEventListener is deprecated. Use bindWithEvent.");return this.bindWithEvent.call(this,b,a)}});Function.empty=function(){MooTools.upgradeLog("1.1 > 1.2: Function.empty is now just $empty.")};Hash.implement({keys:function(){MooTools.upgradeLog("1.1 > 1.2: Hash.keys is deprecated. Use Hash.getKeys");return this.getKeys()},values:function(){MooTools.upgradeLog("1.1 > 1.2: Hash.values is deprecated. Use Hash.getValues");return this.getValues()},hasKey:function(a){MooTools.upgradeLog("1.1 > 1.2: Hash.hasKey is deprecated. Use Hash.has");return this.has(a)},merge:function(a){MooTools.upgradeLog("1.1 > 1.2: Hash.merge is deprecated. Use Hash.combine");return this.extend(a)},remove:function(a){MooTools.upgradeLog("1.1 > 1.2: Hash.remove is deprecated. use Hash.erase");return this.erase(a)}});Object.toQueryString=function(a){MooTools.upgradeLog("1.1 > 1.2: Object.toQueryString() is deprecated. use Hash.toQueryString() instead");$H(a).each(function(c,b){if($type(c)=="object"||$type(c)=="array"){a[b]=c.toString()}});return Hash.toQueryString(a)};var Abstract=function(a){MooTools.upgradeLog("1.1 > 1.2: Abstract is deprecated. Use Hash");return new Hash(a)};Class.empty=function(){MooTools.upgradeLog("1.1 > 1.2: replace Class.empty with $empty");return $empty};(function(){var a=function(d){var c=function(){return this};c.prototype=d;return c};Class.prototype.extend=function(d){MooTools.upgradeLog("1.1 > 1.2: Class.extend is deprecated. See the class Extend mutator.");var c=a(d);var e=new c();e.Extends=this;return new Class(e)};var b=Class.prototype.implement;Class.prototype.implement=function(){if(arguments.length>1&&Array.every(arguments,Object.type)){MooTools.upgradeLog("1.1 > 1.2: Class.implement no longer takes more than one thing at a time, either MyClass.implement(key, value) or MyClass.implement(object) but NOT MyClass.implement(new Foo, new Bar, new Baz). See also: the class Implements mutator.");Array.each(arguments,function(c){b.call(this,c)},this);return this}return b.apply(this,arguments)}})();(function(){var c=Element.prototype.getPosition;var a=Element.prototype.getCoordinates;function b(e){return(/^(?:body|html)$/i).test(e.tagName)}var d=Element.prototype.getSize;Element.implement({getSize:function(){MooTools.upgradeLog("1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.");var e=d.apply(this,arguments);return $merge(e,{size:e,scroll:this.getScroll(),scrollSize:this.getScrollSize()})},getPosition:function(e){if(e&&$type(e)=="array"){MooTools.upgradeLog("1.1 > 1.2: Element.getPosition no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.");e=null}return c.apply(this,[e])},getCoordinates:function(e){if(e&&$type(e)=="array"){MooTools.upgradeLog("1.1 > 1.2: Element.getCoordinates no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.");e=null}return a.apply(this,[e])}});Native.implement([Document,Window],{getSize:function(){MooTools.upgradeLog("1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.");var e;var g=this.getWindow();var f=this.getDocument();f=(!f.compatMode||f.compatMode=="CSS1Compat")?f.html:f.body;if(Browser.Engine.presto||Browser.Engine.webkit){e={x:g.innerWidth,y:g.innerHeight}}else{e={x:f.clientWidth,y:f.clientHeight}}return $extend(e,{size:e,scroll:{x:g.pageXOffset||f.scrollLeft,y:g.pageYOffset||f.scrollTop},scrollSize:{x:Math.max(f.scrollWidth,e.x),y:Math.max(f.scrollHeight,e.y)}})}})})();Event.keys=Event.Keys;(function(){var a=Element.prototype.toQueryString;Element.implement({getFormElements:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getFormElements is deprecated, use Element.getElements("input, textarea, select");');return this.getElements("input, textarea, select")},replaceWith:function(b){MooTools.upgradeLog("1.1 > 1.2: Element.replaceWith is deprecated, use Element.replaces instead.");b=$(b);this.parentNode.replaceChild(b,this);return b},remove:function(){MooTools.upgradeLog("1.1 > 1.2: Element.remove is deprecated - use Element.dispose.");return this.dispose.apply(this,arguments)},getText:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getText is deprecated - use Element.get("text").');return this.get("text")},setText:function(b){MooTools.upgradeLog('1.1 > 1.2: Element.setText is deprecated - use Element.set("text", text).');return this.set("text",b)},setHTML:function(){MooTools.upgradeLog('1.1 > 1.2: Element.setHTML is deprecated - use Element.set("html", HTML).');return this.set("html",arguments)},getHTML:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getHTML is deprecated - use Element.get("html").');return this.get("html")},getTag:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getTag is deprecated - use Element.get("tag").');return this.get("tag")},getValue:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getValue is deprecated - use Element.get("value").');switch(this.getTag()){case"select":var b=[];$each(this.options,function(c){if(c.selected){b.push($pick(c.value,c.text))}});return(this.multiple)?b:b[0];case"input":if(!(this.checked&&["checkbox","radio"].contains(this.type))&&!["hidden","text","password"].contains(this.type)){break}case"textarea":return this.value}return false},toQueryString:function(){MooTools.upgradeLog("1.1 > 1.2: warning Element.toQueryString is slightly different; inputs without names are excluded, inputs with type == submit, reset, and file are excluded, and inputs with undefined values are excluded.");return a.apply(this,arguments)}})})();Element.Properties.properties={set:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.set({properties: {}}) is deprecated; instead of properties, just name the values at the root of the object (Element.set({src: url})).");$H(a).each(function(c,b){this.set(b,c)},this)}};Element.implement({setOpacity:function(a){MooTools.upgradeLog('1.1 > 1.2: Element.setOpacity is deprecated; use Element.setStyle("opacity", value).');return this.setStyle("opacity",a)}});Element.Properties.styles={set:function(a){MooTools.upgradeLog('1.1 > 1.2: Element.set("styles") no longer accepts a string as an argument. Pass an object instead.');if($type(a)=="string"){a.split(";").each(function(b){this.setStyle(b.split(":")[0],b.split(":")[1])},this)}else{this.setStyles(a)}}};Fx.implement({custom:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Fx.custom is deprecated. use Fx.start.");return this.start(b,a)},clearTimer:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.clearTimer is deprecated. use Fx.cancel.");return this.cancel()},stop:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.stop is deprecated. use Fx.cancel.");return this.cancel()}});Fx.Base=new Class({Extends:Fx,initialize:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.Base is deprecated. use Fx.");this.parent.apply(this,arguments)}});Fx.Style=new Class({Extends:Fx.Tween,initialize:function(b,c,a){MooTools.upgradeLog("1.1 > 1.2: Fx.Style is deprecated. use Fx.Tween.");this.property=c;this.parent(b,a)},start:function(b,a){return this.parent(this.property,b,a)},set:function(a){return this.parent(this.property,a)},hide:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.Style .hide() is deprecated; use Fx.Tween .set(0) instead");return this.set(0)}});Element.implement({effect:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Element.effect is deprecated; use Fx.Tween or Element.tween.");return new Fx.Style(this,b,a)}});Fx.Styles=new Class({Extends:Fx.Morph,initialize:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.Styles is deprecated. use Fx.Morph.");this.parent.apply(this,arguments)}});Element.implement({effects:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.effects is deprecated; use Fx.Morph or Element.morph.");return new Fx.Morph(this,a)}});Fx.Scroll.implement({scrollTo:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Fx.Scroll's .scrollTo is deprecated; use .start.");return this.start(b,a)}});Request.implement({onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status}.bind(this));this.xhr.onreadystatechange=$empty;this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml)}else{this.failure(this.response.text,this.response.xml)}},failure:function(){this.onFailure.apply(this,arguments)},onFailure:function(){MooTools.upgradeLog("1.1 > 1.2: Note that onComplete does not receive arguments in 1.2. Also note that onComplete is invoked on BOTH success and failure (while in 1.1 it was only invoked on success). Use the onSuccess event instead if you wish to limit this invocation to success.");this.fireEvent("complete",arguments).fireEvent("failure",this.xhr)}});var XHR=new Class({Extends:Request,options:{update:false},initialize:function(a){MooTools.upgradeLog("1.1 > 1.2: XHR is deprecated. Use Request.");this.parent(a);this.transport=this.xhr},request:function(a){MooTools.upgradeLog("1.1 > 1.2: XHR.request() is deprecated. Use Request.send() instead.");return this.send(this.url,a||this.options.data)},send:function(a,b){if(!this.check(arguments.callee,a,b)){return this}return this.parent({url:a,data:b})},success:function(b,a){b=this.processScripts(b);if(this.options.update){$(this.options.update).empty().set("html",b)}this.onSuccess(b,a)},failure:function(){this.fireEvent("failure",this.xhr)}});var Ajax=new Class({Extends:XHR,initialize:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Ajax is deprecated. Use Request.");this.url=b;this.parent(a)},success:function(b,a){this.processScripts(b);response=this.response;response.html=b.stripScripts(function(c){response.javascript=c});if(this.options.update){$(this.options.update).empty().set("html",response.html)}if(this.options.evalScripts){$exec(response.javascript)}this.onSuccess(b,a)}});(function(){var a=Element.prototype.send;Element.implement({send:function(b){if($type(b)=="string"){return a.apply(this,arguments)}if($type(b)=="object"){MooTools.upgradeLog("1.1 > 1.2: Element.send no longer takes an options argument as its object but rather a url. See docs.");this.set("send",b);a.call(this)}return this}})})();JSON.Remote=new Class({options:{key:"json"},Extends:Request.JSON,initialize:function(b,a){MooTools.upgradeLog("JSON.Remote is deprecated. Use Request.JSON");this.parent(a);this.onComplete=$empty;this.url=b},send:function(a){if(!this.check(arguments.callee,a)){return this}return this.parent({url:this.url,data:{json:Json.encode(a)}})},failure:function(){this.fireEvent("failure",this.xhr)}});Cookie.set=function(b,c,a){MooTools.upgradeLog("1.1 > 1.2: Cookie.set is deprecated. Use Cookie.write");return new Cookie(b,a).write(c)};Cookie.get=function(a){MooTools.upgradeLog("1.1 > 1.2: Cookie.get is deprecated. Use Cookie.read");return new Cookie(a).read()};Cookie.remove=function(b,a){MooTools.upgradeLog("1.1 > 1.2: Cookie.remove is deprecated. Use Cookie.dispose");return new Cookie(b,a).dispose()};JSON.toString=function(a){MooTools.upgradeLog("1.1 > 1.2: JSON.toString is deprecated. Use JSON.encode");return JSON.encode(a)};JSON.evaluate=function(a){MooTools.upgradeLog("1.1 > 1.2: JSON.evaluate is deprecated. Use JSON.decode");return JSON.decode(a)};var Json=JSON;Native.implement([Element,Document],{getElementsByClassName:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.filterByTag is deprecated.");return this.getElements("."+a)},getElementsBySelector:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.getElementsBySelector is deprecated. Use getElements()");return this.getElements(a)}});Elements.implement({filterByTag:function(a){MooTools.upgradeLog("1.1 > 1.2: Elements.filterByTag is deprecated. Use Elements.filter.");return this.filter(a)},filterByClass:function(a){MooTools.upgradeLog("1.1 > 1.2: Elements.filterByClass is deprecated. Use Elements.filter.");return this.filter("."+a)},filterById:function(a){MooTools.upgradeLog("1.1 > 1.2: Elements.filterById is deprecated. Use Elements.filter.");return this.filter("#"+a)},filterByAttribute:function(c,a,d){MooTools.upgradeLog("1.1 > 1.2: Elements.filterByAttribute is deprecated. Use Elements.filter.");var b=this.filter("["+c+(a||"")+(d||"")+"]");if(d){b=b.filter("["+c+"]")}return b}});var $E=function(a,b){MooTools.upgradeLog("1.1 > 1.2: $E is deprecated, use document.getElement.");return($(b)||document).getElement(a)};var $ES=function(a,b){MooTools.upgradeLog("1.1 > 1.2: $ES is deprecated. Use $$.");return($(b)||document).getElements(a)};(function(){if(!window.Tips){return}Tips.implement({initialize:function(){MooTools.upgradeLog("1.1 > 1.2: Tips DOM element layout has changed and your CSS classes may need to change.");var a=Array.link(arguments,{options:Object.type,elements:$defined});this.setOptions(a.options);if(this.options.offsets){MooTools.upgradeLog('1.1 > 1.2: Tips no longer have an "offsets" option; use "offset".');this.options.offset=this.options.offsets}document.id(this);this.addEvent("show",function(){this.tip.addClass("tool-tip");this.tip.getElement(".tip-title").addClass("tool-title");this.tip.getElement(".tip-text").addClass("tool-text")});this.parseTitle(a.elements);if(a.elements){this.attach(a.elements)}},parseTitle:function(a){a.each(function(b){var c=b.get("title");if(c.test("::")){MooTools.upgradeLog('1.1 > 1.2: Tips no longer parse the title attribute for "::" for title/caption; use title and rel attributes instead.');b.store("tip:title",c.split("::")[0]);b.store("tip:text",c.split("::")[1]);b.set("title","")}})}})})(); \ No newline at end of file