exec_SELECTquery
caller t3lib_DB::exec_SELECTquery
ERROR Expression #78 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'julisf_db1.tx_cal_event_category_mm.uid_foreign' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
lastBuiltQuery SELECT tx_cal_calendar.uid AS calendar_uid, tx_cal_calendar.owner AS calendar_owner, tx_cal_calendar.headerstyle AS calendar_headerstyle, tx_cal_calendar.bodystyle AS calendar_bodystyle, tx_cal_event.*, tx_cal_event_category_mm.uid_foreign AS category_uid FROM tx_cal_event LEFT JOIN tx_cal_calendar ON tx_cal_calendar.uid = tx_cal_event.calendar_id LEFT JOIN tx_cal_event_category_mm ON tx_cal_event_category_mm.uid_local = tx_cal_event.uid WHERE 1=1 AND tx_cal_calendar.uid IN (3) AND tx_cal_event.pid IN (10322,1294) AND tx_cal_event.deleted=0 AND tx_cal_event.t3ver_state<=0 AND tx_cal_event.pid<>-1 AND tx_cal_event.hidden=0 AND tx_cal_event.starttime<=1472454060 AND (tx_cal_event.endtime=0 OR tx_cal_event.endtime>1472454060) AND ((tx_cal_event.start_date>=20160829 AND tx_cal_event.start_date<=20160929) OR (tx_cal_event.end_date<=20160929 AND tx_cal_event.end_date>=20160829) OR (tx_cal_event.end_date>=20160929 AND tx_cal_event.start_date<=20160829) OR (tx_cal_event.start_date<=20160929 AND (tx_cal_event.freq IN ("day","week","month","year") AND (tx_cal_event.until>=20160829 OR tx_cal_event.until=0))) OR (tx_cal_event.rdate AND tx_cal_event.rdate_type IN ("date_time","date","period")) ) AND tx_cal_event.type IN (0,1,2,3) AND tx_cal_event_category_mm.uid_foreign IN (60,16,10,99) AND tx_cal_event.sys_language_uid IN (0,-1) AND 1=2 GROUP BY tx_cal_event.uid ORDER BY tx_cal_event.start_date ASC, tx_cal_event.start_time ASC, tx_cal_event.uid,tx_cal_event_category_mm.sorting
debug_backtrace require(ypo3/sysext/cms/tslib/index_ts.php),ndex.php#83 // include(ypo3/sysext/cms/tslib/pagegen.php),ypo3/sysext/cms/tslib/index_ts.php#451 // TSpagegen::renderContent#76 // tslib_cObj->cObjGet#319 // tslib_cObj->cObjGetSingle#717 // tslib_content_Template->render#770 // tslib_cObj->cObjGetSingle#190 // tslib_content_User->render#770 // tslib_cObj->callUserFunction#56 // call_user_func_array#6404 // tx_cal_controller->main# // tx_cal_controller->getContent#107 // tx_cal_controller->listview#155 // tx_cal_modelcontroller->findEventsForList#1350 // tx_cal_modelcontroller->findAllWithin#351 // tx_cal_event_service->findAllWithin#467 // tx_cal_event_service->getEventsFromTable#151 // t3lib_DB->exec_SELECTquery#236 // t3lib_DB->debug#247
exec_SELECTquery
caller t3lib_DB::exec_SELECTquery
ERROR Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'julisf_db1.tx_cal_event_category_mm.uid_foreign' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
lastBuiltQuery SELECT tx_cal_event_category_mm.*, tx_cal_event.pid, tx_cal_event.uid FROM tx_cal_event_category_mm LEFT JOIN tx_cal_event ON tx_cal_event.uid = tx_cal_event_category_mm.uid_local WHERE tx_cal_event.pid IN (10322,1294) GROUP BY tx_cal_event_category_mm.uid_local
debug_backtrace require(ypo3/sysext/cms/tslib/index_ts.php),ndex.php#83 // include(ypo3/sysext/cms/tslib/pagegen.php),ypo3/sysext/cms/tslib/index_ts.php#451 // TSpagegen::renderContent#76 // tslib_cObj->cObjGet#319 // tslib_cObj->cObjGetSingle#717 // tslib_content_Template->render#770 // tslib_cObj->cObjGetSingle#190 // tslib_content_User->render#770 // tslib_cObj->callUserFunction#56 // call_user_func_array#6404 // tx_cal_controller->main# // tx_cal_controller->getContent#107 // tx_cal_controller->listview#155 // tx_cal_modelcontroller->findEventsForList#1350 // tx_cal_modelcontroller->findAllWithin#351 // tx_cal_event_service->findAllWithin#467 // tx_cal_event_service->getEventsFromTable#151 // t3lib_DB->exec_SELECTquery#481 // t3lib_DB->debug#247
exec_SELECTquery
caller t3lib_DB::exec_SELECTquery
ERROR Expression #78 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'julisf_db1.tx_cal_event_category_mm.uid_foreign' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
lastBuiltQuery SELECT tx_cal_calendar.uid AS calendar_uid, tx_cal_calendar.owner AS calendar_owner, tx_cal_calendar.headerstyle AS calendar_headerstyle, tx_cal_calendar.bodystyle AS calendar_bodystyle, tx_cal_event.*, tx_cal_event_category_mm.uid_foreign AS category_uid FROM tx_cal_event LEFT JOIN tx_cal_calendar ON tx_cal_calendar.uid = tx_cal_event.calendar_id LEFT JOIN tx_cal_event_category_mm ON tx_cal_event_category_mm.uid_local = tx_cal_event.uid WHERE 1=1 AND tx_cal_calendar.uid IN (3) AND tx_cal_event.pid IN (10322,1294) AND tx_cal_event.deleted=0 AND tx_cal_event.t3ver_state<=0 AND tx_cal_event.pid<>-1 AND tx_cal_event.hidden=0 AND tx_cal_event.starttime<=1472454060 AND (tx_cal_event.endtime=0 OR tx_cal_event.endtime>1472454060) AND ((tx_cal_event.start_date>=20160829 AND tx_cal_event.start_date<=20160929) OR (tx_cal_event.end_date<=20160929 AND tx_cal_event.end_date>=20160829) OR (tx_cal_event.end_date>=20160929 AND tx_cal_event.start_date<=20160829) OR (tx_cal_event.start_date<=20160929 AND (tx_cal_event.freq IN ("day","week","month","year") AND (tx_cal_event.until>=20160829 OR tx_cal_event.until=0))) OR (tx_cal_event.rdate AND tx_cal_event.rdate_type IN ("date_time","date","period")) ) AND tx_cal_event.type IN (0,1,2,3) AND tx_cal_event_category_mm.uid_foreign IN (60,16,10,99) AND tx_cal_event.sys_language_uid IN (0,-1) AND tx_cal_calendar.nearby = 0 GROUP BY tx_cal_event.uid ORDER BY tx_cal_event.start_date ASC, tx_cal_event.start_time ASC, tx_cal_event.uid,tx_cal_event_category_mm.sorting
debug_backtrace require(ypo3/sysext/cms/tslib/index_ts.php),ndex.php#83 // include(ypo3/sysext/cms/tslib/pagegen.php),ypo3/sysext/cms/tslib/index_ts.php#451 // TSpagegen::renderContent#76 // tslib_cObj->cObjGet#319 // tslib_cObj->cObjGetSingle#717 // tslib_content_Template->render#770 // tslib_cObj->cObjGetSingle#190 // tslib_content_User->render#770 // tslib_cObj->callUserFunction#56 // call_user_func_array#6404 // tx_cal_controller->main# // tx_cal_controller->getContent#107 // tx_cal_controller->listview#155 // tx_cal_modelcontroller->findEventsForList#1350 // tx_cal_modelcontroller->findAllWithin#351 // tx_cal_event_service->findAllWithin#467 // tx_cal_event_service->getEventsFromTable#151 // t3lib_DB->exec_SELECTquery#236 // t3lib_DB->debug#247
exec_SELECTquery
caller t3lib_DB::exec_SELECTquery
ERROR Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'julisf_db1.tx_cal_event_category_mm.uid_foreign' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
lastBuiltQuery SELECT tx_cal_event_category_mm.*, tx_cal_event.pid, tx_cal_event.uid FROM tx_cal_event_category_mm LEFT JOIN tx_cal_event ON tx_cal_event.uid = tx_cal_event_category_mm.uid_local WHERE tx_cal_event.pid IN (10322,1294) GROUP BY tx_cal_event_category_mm.uid_local
debug_backtrace require(ypo3/sysext/cms/tslib/index_ts.php),ndex.php#83 // include(ypo3/sysext/cms/tslib/pagegen.php),ypo3/sysext/cms/tslib/index_ts.php#451 // TSpagegen::renderContent#76 // tslib_cObj->cObjGet#319 // tslib_cObj->cObjGetSingle#717 // tslib_content_Template->render#770 // tslib_cObj->cObjGetSingle#190 // tslib_content_User->render#770 // tslib_cObj->callUserFunction#56 // call_user_func_array#6404 // tx_cal_controller->main# // tx_cal_controller->getContent#107 // tx_cal_controller->listview#155 // tx_cal_modelcontroller->findEventsForList#1350 // tx_cal_modelcontroller->findAllWithin#351 // tx_cal_event_service->findAllWithin#467 // tx_cal_event_service->getEventsFromTable#151 // t3lib_DB->exec_SELECTquery#481 // t3lib_DB->debug#247
exec_SELECTquery
caller t3lib_DB::exec_SELECTquery
ERROR Expression #78 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'julisf_db1.tx_cal_event_category_mm.uid_foreign' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
lastBuiltQuery SELECT tx_cal_calendar.uid AS calendar_uid, tx_cal_calendar.owner AS calendar_owner, tx_cal_calendar.headerstyle AS calendar_headerstyle, tx_cal_calendar.bodystyle AS calendar_bodystyle, tx_cal_event.*, tx_cal_event_category_mm.uid_foreign AS category_uid FROM tx_cal_event LEFT JOIN tx_cal_calendar ON tx_cal_calendar.uid = tx_cal_event.calendar_id LEFT JOIN tx_cal_event_category_mm ON tx_cal_event_category_mm.uid_local = tx_cal_event.uid WHERE 1=1 AND tx_cal_calendar.activate_fnb = 1 AND tx_cal_calendar.uid IN (3) AND tx_cal_event.pid IN (10322,1294) AND tx_cal_event.deleted=0 AND tx_cal_event.t3ver_state<=0 AND tx_cal_event.pid<>-1 AND tx_cal_event.hidden=0 AND tx_cal_event.starttime<=1472454060 AND (tx_cal_event.endtime=0 OR tx_cal_event.endtime>1472454060) AND ((tx_cal_event.start_date>=20160829 AND tx_cal_event.start_date<=20160929) OR (tx_cal_event.end_date<=20160929 AND tx_cal_event.end_date>=20160829) OR (tx_cal_event.end_date>=20160929 AND tx_cal_event.start_date<=20160829) OR (tx_cal_event.start_date<=20160929 AND (tx_cal_event.freq IN ("day","week","month","year") AND (tx_cal_event.until>=20160829 OR tx_cal_event.until=0))) OR (tx_cal_event.rdate AND tx_cal_event.rdate_type IN ("date_time","date","period")) ) AND tx_cal_event.type IN (0,1,2,3) AND tx_cal_event_category_mm.uid_foreign IN (60,16,10,99) AND tx_cal_event.sys_language_uid IN (0,-1) AND tx_cal_calendar.nearby = 0 GROUP BY tx_cal_event.uid ORDER BY tx_cal_event.start_date ASC, tx_cal_event.start_time ASC, tx_cal_event.uid,tx_cal_event_category_mm.sorting
debug_backtrace require(ypo3/sysext/cms/tslib/index_ts.php),ndex.php#83 // include(ypo3/sysext/cms/tslib/pagegen.php),ypo3/sysext/cms/tslib/index_ts.php#451 // TSpagegen::renderContent#76 // tslib_cObj->cObjGet#319 // tslib_cObj->cObjGetSingle#717 // tslib_content_Template->render#770 // tslib_cObj->cObjGetSingle#190 // tslib_content_User->render#770 // tslib_cObj->callUserFunction#56 // call_user_func_array#6404 // tx_cal_controller->main# // tx_cal_controller->getContent#107 // tx_cal_controller->listview#155 // tx_cal_modelcontroller->findEventsForList#1350 // tx_cal_modelcontroller->findAllWithin#351 // tx_cal_fnbevent_service->findAllWithin#467 // tx_cal_event_service->getEventsFromTable#125 // t3lib_DB->exec_SELECTquery#236 // t3lib_DB->debug#247
exec_SELECTquery
caller t3lib_DB::exec_SELECTquery
ERROR Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'julisf_db1.tx_cal_event_category_mm.uid_foreign' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
lastBuiltQuery SELECT tx_cal_event_category_mm.*, tx_cal_event.pid, tx_cal_event.uid FROM tx_cal_event_category_mm LEFT JOIN tx_cal_event ON tx_cal_event.uid = tx_cal_event_category_mm.uid_local WHERE tx_cal_event.pid IN (10322,1294) GROUP BY tx_cal_event_category_mm.uid_local
debug_backtrace require(ypo3/sysext/cms/tslib/index_ts.php),ndex.php#83 // include(ypo3/sysext/cms/tslib/pagegen.php),ypo3/sysext/cms/tslib/index_ts.php#451 // TSpagegen::renderContent#76 // tslib_cObj->cObjGet#319 // tslib_cObj->cObjGetSingle#717 // tslib_content_Template->render#770 // tslib_cObj->cObjGetSingle#190 // tslib_content_User->render#770 // tslib_cObj->callUserFunction#56 // call_user_func_array#6404 // tx_cal_controller->main# // tx_cal_controller->getContent#107 // tx_cal_controller->listview#155 // tx_cal_modelcontroller->findEventsForList#1350 // tx_cal_modelcontroller->findAllWithin#351 // tx_cal_fnbevent_service->findAllWithin#467 // tx_cal_event_service->getEventsFromTable#125 // t3lib_DB->exec_SELECTquery#481 // t3lib_DB->debug#247
exec_INSERTquery
caller t3lib_DB::exec_INSERTquery
ERROR Incorrect integer value: '' for column 'temp_content' at row 1
lastBuiltQuery INSERT INTO cache_pages (hash,page_id,HTML,temp_content,cache_data,expires,tstamp) VALUES ('dd8e7310b0e1315eebaea7656a727313','1304','<!DOCTYPE html\n PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xml:lang=\"en\" lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />\n<!-- \n This website is powered by TYPO3 - inspiring people to share!\n TYPO3 is a free open source Content Management Framework initially created by Kasper Skaarhoj and licensed under GNU/GPL.\n TYPO3 is copyright 1998-2012 of Kasper Skaarhoj. Extensions are copyright of their respective owners.\n Information and contribution at http://typo3.org/\n-->\n\n\n\n<title>JuLis Rhein-Sieg: Home</title>\n<meta name=\"generator\" content=\"TYPO3 4.5 CMS\" />\n\n<link rel=\"stylesheet\" type=\"text/css\" href=\"typo3temp/stylesheet_829b18ae69.css?1365779609\" media=\"all\" />\n\n\n\n<script src=\"typo3temp/javascript_0b12553063.js?1365779609\" type=\"text/javascript\"></script>\n\n\n<link rel=\"SHORTCUT ICON\" href=\"/fileadmin/templatev2/v2/img/favicon.ico\" /> <link rel=\"stylesheet\" type=\"text/css\" href=\"/fileadmin/templatev2/v2/css/template.css\" /><script type=\"text/javascript\" src=\"/fileadmin/templatev2/v2/topnav/js/menu.js\"></script> <script type=\"text/javascript\" src=\"typo3conf/ext/kj_imagelightbox2/res/lightbox2.04/js/prototype.js\"></script>\n <script type=\"text/javascript\" src=\"typo3conf/ext/kj_imagelightbox2/res/lightbox2.04/js/scriptaculous.js?load=effects,builder\"></script> <link rel=\"stylesheet\" href=\"typo3conf/ext/kj_imagelightbox2/res/lightbox2.04/css/lightbox.css\" type=\"text/css\" media=\"screen\" />\n <script type=\"text/javascript\">\n // Configurationl\n LightboxOptions = Object.extend({\n fileLoadingImage: \'typo3conf/ext/kj_imagelightbox2/res/lightbox2.04/images/loading.gif\',\n fileBottomNavCloseImage: \'typo3conf/ext/kj_imagelightbox2/res/icons/cross.png\',\n overlayOpacity: 0.8,\n animate: true,\n resizeSpeed: 13,\n borderSize: 10,\n labelImage: \"Bild\",\n labelOf: \"von\",\n\n // add kjLightbox var for kj_imagelightbox2\n presentation_showLabelImage:1,\n presentation_showImageCaption:1,\n saveMode: 1,\n printMode: 1,\n fileSaveModeImage: \'typo3conf/ext/kj_imagelightbox2/res/icons/bullet_disk.png\',\n fileSavePrintImage: \'typo3conf/ext/kj_imagelightbox2/res/icons/printer.png\',\n\n printPage: \'typo3conf/ext/kj_imagelightbox2/lib/class.tx_kjimagelightbox2_print.php\'\n\n }, window.LightboxOptions || {});\n </script>\n <script type=\"text/javascript\" src=\"typo3conf/ext/kj_imagelightbox2/res/lightbox2.04/js/lightbox.js\"></script>\n\n\n\n\n <!-- mouseover effect -->\n <style type=\"text/css\">\n <!--\n /* Image library */\n .lightboxSpan { position:relative; display:block; }\n\n .lightboxSpan img.preview { display: none; border: 1px solid #000; position: absolute; top: -10px; left: -30px; z-index: 999; }\n .lightboxSpan a.preview { display: none; }\n\n .lightboxSpan a:hover .preview,\n .lightboxSpan a:focus .preview,\n .lightboxSpan a:active .preview { display: block; }\n \n \n \n DIV.csc-textpic DIV.csc-textpic-imagewrap DL.csc-textpic-image { float: left; width: auto !important;}\n -->\n </style>\n\n\n\n <link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS - JuLis Rhein-Sieg - Presse\" href=\"?type=100\" />\n <script type=\"text/javascript\" src=\"/fileadmin/templatev2/v2/js/php.js\"></script>\n\n <link rel=\"stylesheet\" type=\"text/css\" href=\"/fileadmin/templatev2/v2/topnav/css/menu.css\" />\n \n <!--[if IE]>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"/fileadmin/templatev2/v2/css/ie.css\" /> \n <![endif]-->\n\n <!--[if lte IE 6]>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"/fileadmin/templatev2/v2/css/ie6.css\" /> \n <![endif]-->\n<!--HD_8b5e037c0066ee2628e5171bcf2231c6-->\n</head>\n<body>\n<!--TDS_8b5e037c0066ee2628e5171bcf2231c6-->\n\r\n<a name=\"oben\"></a>\r\n<div id=\"hBG\">\r\n <div id=\"header\">\r\n <div id=\"ff_logo\"><a href=\"/\"><img src=\"fileadmin/templatev2/v2/img/ff_logo.gif\" alt=\"Logo Junge Liberale\" border=\"0\" /></a></div>\r\n <div id=\"slogan\"><img src=\"typo3temp/GB/f50f1cc5e8.png\" width=\"500\" height=\"50\" border=\"0\" alt=\"\" /></div>\r\n </div>\r\n</div>\r\n\r\n<div id=\"cL\">\r\n <div id=\"bgLW\">\r\n <div id=\"hSub\">\r\n <div id=\"breadcrumb\">\r\n &raquo; Home \r\n </div>\r\n \r\n <div class=\"clr\"></div>\r\n </div>\r\n \r\n \r\n <div id=\"mainMenu\">\r\n <div id=\"menu\">\r\n <div class=\"menu-zoa-horizontal\">\r\n <ul id=\"menulist_root-zoa-horizontal\" class=\"mainlevel-zoa-horizontal\"><li onmouseover=\" \"><a href=\"index.php?id=home\" onfocus=\"blurLink(this);\" class=\"mainlevel_current-zoa-horizontal\" id=\"active_menu-zoa-horizontal\">Home</a><ul id=\"menulist_2-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=mitglied_werden\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Mitglied werden</a></li><li><a href=\"index.php?id=suche\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Suche</a></li><li><a href=\"index.php?id=links\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Links</a></li><li><a href=\"index.php?id=spenden\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Spenden</a></li><li><a href=\"index.php?id=impressum0\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Impressum</a></li></ul></li><li onmouseover=\" \"><a href=\"index.php?id=wir_julis\" onfocus=\"blurLink(this);\" class=\"mainlevel-zoa-horizontal\"><span class=\"expanded\">Wir JuLis</span></a><ul id=\"menulist_2-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=unser_vorstand\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">Unser Vorstand</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=5338\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2011/2012</a></li></ul></li><li><a href=\"index.php?id=delegierte\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Delegierte</a></li><li><a href=\"index.php?id=delegierte0\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Bezirksverband</a></li><li><a href=\"index.php?id=rhein-sieg-kreis\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Rhein-Sieg-Kreis</a></li><li><a href=\"index.php?id=vor_ort\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Vor Ort</a></li><li><a href=\"index.php?id=aktionen_k&amp;no_cache=1\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">Aktionen des KV</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=aktionen_kreis_200800\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2011</a></li><li><a href=\"index.php?id=aktionen_kreis_20080\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2010</a></li><li><a href=\"index.php?id=aktionen_kreis_200900\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2009</a></li><li><a href=\"index.php?id=aktionen_kreis_2008\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2008</a></li><li><a href=\"index.php?id=aktionen_kreis_2007\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2007</a></li></ul></li><li><a href=\"index.php?id=aktionen_o&amp;no_cache=1\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">Aktionen des OV / SV</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=aktionen_orst_2009\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2009</a></li><li><a href=\"index.php?id=aktionen_orst_2008\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2008</a></li><li><a href=\"index.php?id=aktionen_orst_2007\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2007</a></li></ul></li><li><a href=\"index.php?id=presse_ueber_uns&amp;no_cache=1\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">Presse über uns</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=3604&amp;no_cache=1\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2008</a></li><li><a href=\"index.php?id=3603\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2007</a></li></ul></li><li><a href=\"index.php?id=satzung\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Satzung</a></li></ul></li><li onmouseover=\" \"><a href=\"index.php?id=programmatik\" onfocus=\"blurLink(this);\" class=\"mainlevel-zoa-horizontal\"><span class=\"expanded\">Programmatik</span></a><ul id=\"menulist_2-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=3836\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Blog</a></li><li><a href=\"index.php?id=antraege&amp;no_cache=1\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">Anträge</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=9578\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2011</a></li><li><a href=\"index.php?id=9245\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2010</a></li><li><a href=\"index.php?id=3952\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2008</a></li></ul></li><li><a href=\"index.php?id=themen&amp;no_cache=1\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">Themen</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=themen_2008\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2008</a></li><li><a href=\"index.php?id=themen_2007\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2007</a></li></ul></li><li><a href=\"index.php?id=pressemitteilungen_o&amp;no_cache=1\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">Orts-/Stadtverbände</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=p_orst_2009\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2009</a></li><li><a href=\"index.php?id=p_orst_2008\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2008</a></li><li><a href=\"index.php?id=p_orst_2007\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">2007</a></li></ul></li><li><a href=\"index.php?id=grundsatzprogramm_bu\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Grundsatzprogramm BV</a></li><li><a href=\"index.php?id=grundsatzprogramm_nr\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Grundsatzprogramm JuLis NRW</a></li><li><a href=\"index.php?id=juli-lexikon\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\"><span class=\"expanded\">JuLi-Lexikon</span></a><ul id=\"menulist_3-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=a-ber\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">A-Ber</a></li><li><a href=\"index.php?id=bes-dop\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Bes-Dop</a></li><li><a href=\"index.php?id=dr-foe\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Dr-Fö</a></li><li><a href=\"index.php?id=fr-kon\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Fr-Kon</a></li><li><a href=\"index.php?id=lan-si\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Lan-Si</a></li><li><a href=\"index.php?id=st-z\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">St-Z</a></li></ul></li></ul></li><li onmouseover=\" \"><a href=\"index.php?id=mediathek\" onfocus=\"blurLink(this);\" class=\"mainlevel-zoa-horizontal\"><span class=\"expanded\">Mediathek</span></a><ul id=\"menulist_2-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=newsletter\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Newsletter</a></li><li><a href=\"index.php?id=juli_aktiv\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">JuLi Aktiv</a></li><li><a href=\"index.php?id=juli_magazin\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">JuLi Magazin</a></li><li><a href=\"index.php?id=jung_und_liberal\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Jung &amp; Liberal</a></li><li><a href=\"index.php?id=werbemittel\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Werbemittel</a></li><li><a href=\"index.php?id=videos\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">Videos</a></li></ul></li><li onmouseover=\" \"><a href=\"index.php?id=neuigkeiten\" onfocus=\"blurLink(this);\" class=\"mainlevel-zoa-horizontal\"><span class=\"expanded\">Neuigkeiten</span></a><ul id=\"menulist_2-zoa-horizontal\" class=\"subLevelMenu\"><li><a href=\"index.php?id=neuigkeitennews004\" onfocus=\"blurLink(this);\" class=\"sublevel-zoa-horizontal\">News</a></li></ul></li><li onmouseover=\" \"><a href=\"index.php?id=terminkalender\" onfocus=\"blurLink(this);\" class=\"mainlevel-zoa-horizontal\">Termine</a></li><li onmouseover=\" \"><a href=\"index.php?id=kontaktformular\" onfocus=\"blurLink(this);\" class=\"mainlevel-zoa-horizontal\">Kontakt</a></li></ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"bgL\">\r\n <div id=\"container\">\r\n\r\n <div id=\"content\">\r\n <div id=\"topContentHead\"></div>\r\n <!--INT_SCRIPT.5755f648d9f1ea19a20d1a6fc11881c2-->\r\n <div class=\"title\">Home</div>\r\n <div id=\"coInner\">\n <!-- CONTENT ELEMENT, uid:21380/textpic [begin] -->\n <div id=\"c21380\" class=\"csc-default\">\n <!-- Header: [begin] -->\n <div class=\"csc-header csc-header-n1\"><h1 class=\"csc-firstHeader\">Die Zukunft im Blick</h1></div>\n <!-- Header: [end] -->\n \n <!-- Image block: [begin] -->\n <div class=\"csc-textpic csc-textpic-left csc-textpic-below\"><div class=\"csc-textpic-text\">\n <!-- Text: [begin] -->\n <p class=\"bodytext\">Seltene Erden – Restriktionen im Handel mit China\r</p>\n<p class=\"bodytext\">Seltene Erden&nbsp;und Metalle, die man in ihnen findet, spielen vor allem in der heutigen Mikroelektronik eine Schlüsselrolle. In andere Metalle wie etwa Silizium integriert erhält man hochwertige Halbleiter. Halbleiterbauteile findet man heute in so gut wie jedem komplexeren elektronischen Produkt, etwa in jedem Computer und in jedem Smartphone.\r</p>\n<p class=\"bodytext\">Doch die Lagerstätten, in denen man Erze findet, die diese seltenen Metalle enthalten, sind meist klein und man findet sie nur selten. Größere Lagerstätten vermutet man heute in China.\r</p>\n<p class=\"bodytext\">Da der weltweite Bedarf an seltenen Erden wird in den nächsten Jahren weiter steigen. So sind die Befürchtungen groß, dass China diese Kapazitäten dazu nutzen könnte, poitischen Druck auf andere Staaten und ihre Technologiewirtschaft auszuüben.\r</p>\n<p class=\"bodytext\">Zu diesem Thema führten die JuLis Rhein-Sieg eine Bildungsveranstaltung in Kalkar durch. Die rege Beteiligung zeigte das große Interesse an dem Thema und spiegelt seine hohe Relevanz wieder.</p>\n <!-- Text: [end] -->\n </div><div class=\"csc-textpic-imagewrap\" style=\"width:450px;\"><div class=\"csc-textpic-imagerow\" style=\"width:450px;\"><ul><li class=\"csc-textpic-image csc-textpic-firstcol csc-textpic-lastcol\" style=\"width:450px;\"><img src=\"typo3temp/pics/9ced80f057.jpg\" width=\"450\" height=\"338\" border=\"0\" alt=\"\" /></li></ul></div><div class=\"csc-textpic-imagerow csc-textpic-imagerow-last\" style=\"width:450px;\"><ul><li class=\"csc-textpic-image csc-textpic-firstcol csc-textpic-lastcol\" style=\"width:450px;\"><img src=\"typo3temp/pics/90c99a55f7.jpg\" width=\"450\" height=\"338\" border=\"0\" alt=\"\" /></li></ul></div></div></div><div class=\"csc-textpic-clear\"><!-- --></div>\n <!-- Image block: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:21380/textpic [end] -->\n \n <!-- CONTENT ELEMENT, uid:21150/textpic [begin] -->\n <div id=\"c21150\" class=\"csc-default\">\n <!-- Header: [begin] -->\n <div class=\"csc-header csc-header-n2\"><h1>Neu aufgestellt für den Wahlkampf</h1></div>\n <!-- Header: [end] -->\n \n <!-- Image block: [begin] -->\n <div class=\"csc-textpic csc-textpic-left csc-textpic-below\"><div class=\"csc-textpic-text\">\n <!-- Text: [begin] -->\n <p class=\"bodytext\">Anfang Juni fanden sich die Jungen Liberalen Rhein-Sieg zum jährlichen Kreiskongress zusammen, um einen neuen Vorstand zu wählen. Hierbei wurde Dr. Christina Trück, molekulare Medizinerin, in ihrem Amt als Vorsitzende bestätigt, ebenso wie Kassenwart Markus Linnartz, Germanist, sowie der für das Internet zuständige Informatiker Christoph Briese und Sebastian Siegel als Schriftführer. Als neue Mitglieder wurden der 15 jährige Schüler Moritz Gillmair als stellv. Vorsitzender für Organisation und Tobias Köhler, Abiturient aus Meckenheim, als stellv. Vorsitzender für Presse und Programmatik in den Vorstand gewählt. Gemeinsam hoffen sie, die Arbeit des letzten Jahres, die mit vielen Infoständen und einer Bildungsfahrt nach Kalkar äußerst erfolgreich verlief, genau so produktiv fortzusetzen. Der FDP Kreisvorsitzende Jürgen Peter freute sich über die gute Stimmung und wünscht dem neu gewählten Vorstand alles Gute für die kommenden Aufgaben. &quot;Nun sind wir gut aufgestellt für den Wahlkampf, in dem wir uns nach Kräften für unsere FDP ins Zeug legen werden&quot; , freut sich Dr. Trück, die nun ihre dritte Amtszeit als Vorsitzende antritt. Mit dieser Erfahrung und dem Elan der neuen Vorstandsmitglieder hoffen die JuLis Rhein-Sieg auf ein weiteres Jahr voller Einsatz und Spaß am politischen Engagement</p>\n <!-- Text: [end] -->\n </div><div class=\"csc-textpic-imagewrap csc-textpic-single-image\"><a href=\"index.php?eID=tx_cms_showpic&amp;file=uploads%2Fpics%2FFoto_05.JPG&amp;md5=533788e85c8606cd7e011ffc44adf545a128763a&amp;parameters[0]=YTo0OntzOjU6IndpZHRoIjtzOjQ6IjgwMG0iO3M6NjoiaGVpZ2h0IjtzOjQ6IjYw&amp;parameters[1]=MG0iO3M6NzoiYm9keVRhZyI7czo0MToiPGJvZHkgc3R5bGU9Im1hcmdpbjowOyBi&amp;parameters[2]=YWNrZ3JvdW5kOiNmZmY7Ij4iO3M6NDoid3JhcCI7czozNzoiPGEgaHJlZj0iamF2&amp;parameters[3]=YXNjcmlwdDpjbG9zZSgpOyI%2BIHwgPC9hPiI7fQ%3D%3D\" onclick=\"openPic(\'index.php?eID=tx_cms_showpic&amp;file=uploads%2Fpics%2FFoto_05.JPG&amp;md5=533788e85c8606cd7e011ffc44adf545a128763a&amp;parameters[0]=YTo0OntzOjU6IndpZHRoIjtzOjQ6IjgwMG0iO3M6NjoiaGVpZ2h0IjtzOjQ6IjYw&amp;parameters[1]=MG0iO3M6NzoiYm9keVRhZyI7czo0MToiPGJvZHkgc3R5bGU9Im1hcmdpbjowOyBi&amp;parameters[2]=YWNrZ3JvdW5kOiNmZmY7Ij4iO3M6NDoid3JhcCI7czozNzoiPGEgaHJlZj0iamF2&amp;parameters[3]=YXNjcmlwdDpjbG9zZSgpOyI%2BIHwgPC9hPiI7fQ%3D%3D\',\'thePicture\',\'width=800,height=600,status=0,menubar=0\'); return false;\" target=\"thePicture\"><img src=\"typo3temp/pics/dae65a8bc4.jpg\" width=\"450\" height=\"338\" border=\"0\" alt=\"\" /></a></div></div><div class=\"csc-textpic-clear\"><!-- --></div>\n <!-- Image block: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:21150/textpic [end] -->\n \n <!-- CONTENT ELEMENT, uid:18704/html [begin] -->\n <div id=\"c18704\" class=\"csc-default\">\n <!-- Raw HTML content: [begin] -->\n <!-- Piwik -->\r\n<script type=\"text/javascript\">\r\nvar pkBaseURL = ((\"https:\" == document.location.protocol) ? \"https://julis-rhein-sieg.de/piwik/\" : \"http://julis-rhein-sieg.de/piwik/\");\r\ndocument.write(unescape(\"%3Cscript src=\'\" + pkBaseURL + \"piwik.js\' type=\'text/javascript\'%3E%3C/script%3E\"));\r\n</script><script type=\"text/javascript\">\r\ntry {\r\nvar piwikTracker = Piwik.getTracker(pkBaseURL + \"piwik.php\", 1);\r\npiwikTracker.trackPageView();\r\npiwikTracker.enableLinkTracking();\r\n} catch( err ) {}\r\n</script><noscript><p><img src=\"http://julis-rhein-sieg.de/piwik/piwik.php?idsite=1\" style=\"border:0\" alt=\"\" /></p></noscript>\r\n<!-- End Piwik Tracking Code -->\n <!-- Raw HTML content: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:18704/html [end] -->\n \n <!-- CONTENT ELEMENT, uid:5475/html [begin] -->\n <div id=\"c5475\" class=\"csc-default\">\n <!-- Raw HTML content: [begin] -->\n <!--\r\nHINWEIS: Der folgende Javascript-Code sorgt dafür, dass sich der \r\nInhalt der Website veraendert\r\n-->\r\n<script type=\"text/javascript\">\r\n<!--\r\nvar logo = new Image();\r\nlogo.src = \'fileadmin/freesite/groups/114/Sonstiges/Logo.png\';\r\n\r\nvar elemente = document.getElementsByTagName(\"img\");\r\n\r\nfor(var i = 0; i < elemente.length; i++) {\r\n if(elemente[i].src.search(/ff_logo.gif$/) != -1)\r\n elemente[i].src = logo.src;\r\n}\r\n\r\nelemente = document.getElementsByTagName(\"div\");\r\n\r\nfor(i = 0; i < elemente.length; i++) {\r\n if(elemente[i].className == \'rightbox\' && elemente[i].getElementsByTagName(\"h1\")[0].innerHTML == \'Presse\')\r\n elemente[i].getElementsByTagName(\"h1\")[0].innerHTML = \'Neuigkeiten\';\r\n else if(elemente[i].className == \'tx-cal-controller\' && elemente[i].getElementsByTagName(\"div\").length == 0)\r\n elemente[i].innerHTML = \'<div class=\"tx-jwcalendar-pi1\"><p class=\"date\" style=\"margin-bottom: 5px\">Es sind keine Termine vorhanden</p></div>\';\r\n}\r\n\r\nelemente = document.getElementById(\"header_datum\");\r\n\r\nelemente.innerHTML = \'<br /><a class=internal-link href=\"index.php?id=newsletter\">NEWSLETTER ABONNIEREN</a><br /><a class=internal-link href=\"http://www.julis.de/service/aufnahmeantrag/\" target=\"_blank\">MITGLIED WERDEN</a><br /><a class=internal-link href=\"index.php?id=spenden\">SPENDEN</a>\';\r\nelemente.style.lineHeight = \'1.5\';\r\nelemente.style.paddingTop = \'0px\';\r\n\r\n/*elemente = document.getElementById(\"spalte_rechts\");\r\nelemente.innerHTML = \'<div class=\"rightbox\"><img src=\"fileadmin/freesite/groups/114/Sonstiges/Newsletter.png\" /><h1 class=\"rightboxhead\">Newsletter</h1><p class=\"date\" style=\"margin-bottom: 5px\"><a href=\"index.php?id=newsletter\">Abonniere den Newsletter der JuLis Rhein-Sieg</a></p></div>\' + elemente.innerHTML;\r\n*/\r\nelemente = document.getElementsByTagName(\"td\");\r\n\r\nfor(var i = 0; i < elemente.length; i++) {\r\n if(elemente[i].style.maxWidth == \'410px\') {\r\n elemente[i].style.Width = \'500px\';\r\n elemente[i].style.maxWidth = \'500px\';\r\n elemente[i].style.minWidth = \'500px\';\r\n }\r\n}\r\n//-->\r\n</script>\n <!-- Raw HTML content: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:5475/html [end] -->\n \n <!-- CONTENT ELEMENT, uid:6291/html [begin] -->\n <div id=\"c6291\" class=\"csc-default\">\n <!-- Raw HTML content: [begin] -->\n <!--\r\nHINWEIS: Der folgende Code wird fuer die Lightbox JS v2.0 benoetigt\r\n-->\r\n<script type=\"text/javascript\">\r\n<!--\r\n\r\n\r\n/* Prototype JavaScript framework, version 1.5.0\r\n * (c) 2005-2007 Sam Stephenson\r\n *\r\n * Prototype is freely distributable under the terms of an MIT-style license.\r\n * For details, see the Prototype web site: http://prototype.conio.net/\r\n *\r\n/*--------------------------------------------------------------------------*/\r\n\r\nvar Prototype = {\r\n Version: \'1.5.0\',\r\n BrowserFeatures: {\r\n XPath: !!document.evaluate\r\n },\r\n\r\n ScriptFragment: \'(?:<script.*?>)((\\n|\\r|.)*?)(?:<\\/script>)\',\r\n emptyFunction: function() {},\r\n K: function(x) { return x }\r\n}\r\n\r\nvar Class = {\r\n create: function() {\r\n return function() {\r\n this.initialize.apply(this, arguments);\r\n }\r\n }\r\n}\r\n\r\nvar Abstract = new Object();\r\n\r\nObject.extend = function(destination, source) {\r\n for (var property in source) {\r\n destination[property] = source[property];\r\n }\r\n return destination;\r\n}\r\n\r\nObject.extend(Object, {\r\n inspect: function(object) {\r\n try {\r\n if (object === undefined) return \'undefined\';\r\n if (object === null) return \'null\';\r\n return object.inspect ? object.inspect() : object.toString();\r\n } catch (e) {\r\n if (e instanceof RangeError) return \'...\';\r\n throw e;\r\n }\r\n },\r\n\r\n keys: function(object) {\r\n var keys = [];\r\n for (var property in object)\r\n keys.push(property);\r\n return keys;\r\n },\r\n\r\n values: function(object) {\r\n var values = [];\r\n for (var property in object)\r\n values.push(object[property]);\r\n return values;\r\n },\r\n\r\n clone: function(object) {\r\n return Object.extend({}, object);\r\n }\r\n});\r\n\r\nFunction.prototype.bind = function() {\r\n var __method = this, args = $A(arguments), object = args.shift();\r\n return function() {\r\n return __method.apply(object, args.concat($A(arguments)));\r\n }\r\n}\r\n\r\nFunction.prototype.bindAsEventListener = function(object) {\r\n var __method = this, args = $A(arguments), object = args.shift();\r\n return function(event) {\r\n return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));\r\n }\r\n}\r\n\r\nObject.extend(Number.prototype, {\r\n toColorPart: function() {\r\n var digits = this.toString(16);\r\n if (this < 16) return \'0\' + digits;\r\n return digits;\r\n },\r\n\r\n succ: function() {\r\n return this + 1;\r\n },\r\n\r\n times: function(iterator) {\r\n $R(0, this, true).each(iterator);\r\n return this;\r\n }\r\n});\r\n\r\nvar Try = {\r\n these: function() {\r\n var returnValue;\r\n\r\n for (var i = 0, length = arguments.length; i < length; i++) {\r\n var lambda = arguments[i];\r\n try {\r\n returnValue = lambda();\r\n break;\r\n } catch (e) {}\r\n }\r\n\r\n return returnValue;\r\n }\r\n}\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nvar PeriodicalExecuter = Class.create();\r\nPeriodicalExecuter.prototype = {\r\n initialize: function(callback, frequency) {\r\n this.callback = callback;\r\n this.frequency = frequency;\r\n this.currentlyExecuting = false;\r\n\r\n this.registerCallback();\r\n },\r\n\r\n registerCallback: function() {\r\n this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r\n },\r\n\r\n stop: function() {\r\n if (!this.timer) return;\r\n clearInterval(this.timer);\r\n this.timer = null;\r\n },\r\n\r\n onTimerEvent: function() {\r\n if (!this.currentlyExecuting) {\r\n try {\r\n this.currentlyExecuting = true;\r\n this.callback(this);\r\n } finally {\r\n this.currentlyExecuting = false;\r\n }\r\n }\r\n }\r\n}\r\nString.interpret = function(value){\r\n return value == null ? \'\' : String(value);\r\n}\r\n\r\nObject.extend(String.prototype, {\r\n gsub: function(pattern, replacement) {\r\n var result = \'\', source = this, match;\r\n replacement = arguments.callee.prepareReplacement(replacement);\r\n\r\n while (source.length > 0) {\r\n if (match = source.match(pattern)) {\r\n result += source.slice(0, match.index);\r\n result += String.interpret(replacement(match));\r\n source = source.slice(match.index + match[0].length);\r\n } else {\r\n result += source, source = \'\';\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n sub: function(pattern, replacement, count) {\r\n replacement = this.gsub.prepareReplacement(replacement);\r\n count = count === undefined ? 1 : count;\r\n\r\n return this.gsub(pattern, function(match) {\r\n if (--count < 0) return match[0];\r\n return replacement(match);\r\n });\r\n },\r\n\r\n scan: function(pattern, iterator) {\r\n this.gsub(pattern, iterator);\r\n return this;\r\n },\r\n\r\n truncate: function(length, truncation) {\r\n length = length || 30;\r\n truncation = truncation === undefined ? \'...\' : truncation;\r\n return this.length > length ?\r\n this.slice(0, length - truncation.length) + truncation : this;\r\n },\r\n\r\n strip: function() {\r\n return this.replace(/^\\s+/, \'\').replace(/\\s+$/, \'\');\r\n },\r\n\r\n stripTags: function() {\r\n return this.replace(/<\\/?[^>]+>/gi, \'\');\r\n },\r\n\r\n stripScripts: function() {\r\n return this.replace(new RegExp(Prototype.ScriptFragment, \'img\'), \'\');\r\n },\r\n\r\n extractScripts: function() {\r\n var matchAll = new RegExp(Prototype.ScriptFragment, \'img\');\r\n var matchOne = new RegExp(Prototype.ScriptFragment, \'im\');\r\n return (this.match(matchAll) || []).map(function(scriptTag) {\r\n return (scriptTag.match(matchOne) || [\'\', \'\'])[1];\r\n });\r\n },\r\n\r\n evalScripts: function() {\r\n return this.extractScripts().map(function(script) { return eval(script) });\r\n },\r\n\r\n escapeHTML: function() {\r\n var div = document.createElement(\'div\');\r\n var text = document.createTextNode(this);\r\n div.appendChild(text);\r\n return div.innerHTML;\r\n },\r\n\r\n unescapeHTML: function() {\r\n var div = document.createElement(\'div\');\r\n div.innerHTML = this.stripTags();\r\n return div.childNodes[0] ? (div.childNodes.length > 1 ?\r\n $A(div.childNodes).inject(\'\',function(memo,node){ return memo+node.nodeValue }) :\r\n div.childNodes[0].nodeValue) : \'\';\r\n },\r\n\r\n toQueryParams: function(separator) {\r\n var match = this.strip().match(/([^?#]*)(#.*)?$/);\r\n if (!match) return {};\r\n\r\n return match[1].split(separator || \'&\').inject({}, function(hash, pair) {\r\n if ((pair = pair.split(\'=\'))[0]) {\r\n var name = decodeURIComponent(pair[0]);\r\n var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;\r\n\r\n if (hash[name] !== undefined) {\r\n if (hash[name].constructor != Array)\r\n hash[name] = [hash[name]];\r\n if (value) hash[name].push(value);\r\n }\r\n else hash[name] = value;\r\n }\r\n return hash;\r\n });\r\n },\r\n\r\n toArray: function() {\r\n return this.split(\'\');\r\n },\r\n\r\n succ: function() {\r\n return this.slice(0, this.length - 1) +\r\n String.fromCharCode(this.charCodeAt(this.length - 1) + 1);\r\n },\r\n\r\n camelize: function() {\r\n var parts = this.split(\'-\'), len = parts.length;\r\n if (len == 1) return parts[0];\r\n\r\n var camelized = this.charAt(0) == \'-\'\r\n ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)\r\n : parts[0];\r\n\r\n for (var i = 1; i < len; i++)\r\n camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);\r\n\r\n return camelized;\r\n },\r\n\r\n capitalize: function(){\r\n return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();\r\n },\r\n\r\n underscore: function() {\r\n return this.gsub(/::/, \'/\').gsub(/([A-Z]+)([A-Z][a-z])/,\'#{1}_#{2}\').gsub(/([a-z\\d])([A-Z])/,\'#{1}_#{2}\').gsub(/-/,\'_\').toLowerCase();\r\n },\r\n\r\n dasherize: function() {\r\n return this.gsub(/_/,\'-\');\r\n },\r\n\r\n inspect: function(useDoubleQuotes) {\r\n var escapedString = this.replace(/\\\\/g, \'\\\\\\\\\');\r\n if (useDoubleQuotes)\r\n return \'\"\' + escapedString.replace(/\"/g, \'\\\\\"\') + \'\"\';\r\n else\r\n return \"\'\" + escapedString.replace(/\'/g, \'\\\\\\\'\') + \"\'\";\r\n }\r\n});\r\n\r\nString.prototype.gsub.prepareReplacement = function(replacement) {\r\n if (typeof replacement == \'function\') return replacement;\r\n var template = new Template(replacement);\r\n return function(match) { return template.evaluate(match) };\r\n}\r\n\r\nString.prototype.parseQuery = String.prototype.toQueryParams;\r\n\r\nvar Template = Class.create();\r\nTemplate.Pattern = /(^|.|\\r|\\n)(#\\{(.*?)\\})/;\r\nTemplate.prototype = {\r\n initialize: function(template, pattern) {\r\n this.template = template.toString();\r\n this.pattern = pattern || Template.Pattern;\r\n },\r\n\r\n evaluate: function(object) {\r\n return this.template.gsub(this.pattern, function(match) {\r\n var before = match[1];\r\n if (before == \'\\\\\') return match[2];\r\n return before + String.interpret(object[match[3]]);\r\n });\r\n }\r\n}\r\n\r\nvar $break = new Object();\r\nvar $continue = new Object();\r\n\r\nvar Enumerable = {\r\n each: function(iterator) {\r\n var index = 0;\r\n try {\r\n this._each(function(value) {\r\n try {\r\n iterator(value, index++);\r\n } catch (e) {\r\n if (e != $continue) throw e;\r\n }\r\n });\r\n } catch (e) {\r\n if (e != $break) throw e;\r\n }\r\n return this;\r\n },\r\n\r\n eachSlice: function(number, iterator) {\r\n var index = -number, slices = [], array = this.toArray();\r\n while ((index += number) < array.length)\r\n slices.push(array.slice(index, index+number));\r\n return slices.map(iterator);\r\n },\r\n\r\n all: function(iterator) {\r\n var result = true;\r\n this.each(function(value, index) {\r\n result = result && !!(iterator || Prototype.K)(value, index);\r\n if (!result) throw $break;\r\n });\r\n return result;\r\n },\r\n\r\n any: function(iterator) {\r\n var result = false;\r\n this.each(function(value, index) {\r\n if (result = !!(iterator || Prototype.K)(value, index))\r\n throw $break;\r\n });\r\n return result;\r\n },\r\n\r\n collect: function(iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n results.push((iterator || Prototype.K)(value, index));\r\n });\r\n return results;\r\n },\r\n\r\n detect: function(iterator) {\r\n var result;\r\n this.each(function(value, index) {\r\n if (iterator(value, index)) {\r\n result = value;\r\n throw $break;\r\n }\r\n });\r\n return result;\r\n },\r\n\r\n findAll: function(iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n if (iterator(value, index))\r\n results.push(value);\r\n });\r\n return results;\r\n },\r\n\r\n grep: function(pattern, iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n var stringValue = value.toString();\r\n if (stringValue.match(pattern))\r\n results.push((iterator || Prototype.K)(value, index));\r\n })\r\n return results;\r\n },\r\n\r\n include: function(object) {\r\n var found = false;\r\n this.each(function(value) {\r\n if (value == object) {\r\n found = true;\r\n throw $break;\r\n }\r\n });\r\n return found;\r\n },\r\n\r\n inGroupsOf: function(number, fillWith) {\r\n fillWith = fillWith === undefined ? null : fillWith;\r\n return this.eachSlice(number, function(slice) {\r\n while(slice.length < number) slice.push(fillWith);\r\n return slice;\r\n });\r\n },\r\n\r\n inject: function(memo, iterator) {\r\n this.each(function(value, index) {\r\n memo = iterator(memo, value, index);\r\n });\r\n return memo;\r\n },\r\n\r\n invoke: function(method) {\r\n var args = $A(arguments).slice(1);\r\n return this.map(function(value) {\r\n return value[method].apply(value, args);\r\n });\r\n },\r\n\r\n max: function(iterator) {\r\n var result;\r\n this.each(function(value, index) {\r\n value = (iterator || Prototype.K)(value, index);\r\n if (result == undefined || value >= result)\r\n result = value;\r\n });\r\n return result;\r\n },\r\n\r\n min: function(iterator) {\r\n var result;\r\n this.each(function(value, index) {\r\n value = (iterator || Prototype.K)(value, index);\r\n if (result == undefined || value < result)\r\n result = value;\r\n });\r\n return result;\r\n },\r\n\r\n partition: function(iterator) {\r\n var trues = [], falses = [];\r\n this.each(function(value, index) {\r\n ((iterator || Prototype.K)(value, index) ?\r\n trues : falses).push(value);\r\n });\r\n return [trues, falses];\r\n },\r\n\r\n pluck: function(property) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n results.push(value[property]);\r\n });\r\n return results;\r\n },\r\n\r\n reject: function(iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n if (!iterator(value, index))\r\n results.push(value);\r\n });\r\n return results;\r\n },\r\n\r\n sortBy: function(iterator) {\r\n return this.map(function(value, index) {\r\n return {value: value, criteria: iterator(value, index)};\r\n }).sort(function(left, right) {\r\n var a = left.criteria, b = right.criteria;\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n }).pluck(\'value\');\r\n },\r\n\r\n toArray: function() {\r\n return this.map();\r\n },\r\n\r\n zip: function() {\r\n var iterator = Prototype.K, args = $A(arguments);\r\n if (typeof args.last() == \'function\')\r\n iterator = args.pop();\r\n\r\n var collections = [this].concat(args).map($A);\r\n return this.map(function(value, index) {\r\n return iterator(collections.pluck(index));\r\n });\r\n },\r\n\r\n size: function() {\r\n return this.toArray().length;\r\n },\r\n\r\n inspect: function() {\r\n return \'#<Enumerable:\' + this.toArray().inspect() + \'>\';\r\n }\r\n}\r\n\r\nObject.extend(Enumerable, {\r\n map: Enumerable.collect,\r\n find: Enumerable.detect,\r\n select: Enumerable.findAll,\r\n member: Enumerable.include,\r\n entries: Enumerable.toArray\r\n});\r\nvar $A = Array.from = function(iterable) {\r\n if (!iterable) return [];\r\n if (iterable.toArray) {\r\n return iterable.toArray();\r\n } else {\r\n var results = [];\r\n for (var i = 0, length = iterable.length; i < length; i++)\r\n results.push(iterable[i]);\r\n return results;\r\n }\r\n}\r\n\r\nObject.extend(Array.prototype, Enumerable);\r\n\r\nif (!Array.prototype._reverse)\r\n Array.prototype._reverse = Array.prototype.reverse;\r\n\r\nObject.extend(Array.prototype, {\r\n _each: function(iterator) {\r\n for (var i = 0, length = this.length; i < length; i++)\r\n iterator(this[i]);\r\n },\r\n\r\n clear: function() {\r\n this.length = 0;\r\n return this;\r\n },\r\n\r\n first: function() {\r\n return this[0];\r\n },\r\n\r\n last: function() {\r\n return this[this.length - 1];\r\n },\r\n\r\n compact: function() {\r\n return this.select(function(value) {\r\n return value != null;\r\n });\r\n },\r\n\r\n flatten: function() {\r\n return this.inject([], function(array, value) {\r\n return array.concat(value && value.constructor == Array ?\r\n value.flatten() : [value]);\r\n });\r\n },\r\n\r\n without: function() {\r\n var values = $A(arguments);\r\n return this.select(function(value) {\r\n return !values.include(value);\r\n });\r\n },\r\n\r\n indexOf: function(object) {\r\n for (var i = 0, length = this.length; i < length; i++)\r\n if (this[i] == object) return i;\r\n return -1;\r\n },\r\n\r\n reverse: function(inline) {\r\n return (inline !== false ? this : this.toArray())._reverse();\r\n },\r\n\r\n reduce: function() {\r\n return this.length > 1 ? this : this[0];\r\n },\r\n\r\n uniq: function() {\r\n return this.inject([], function(array, value) {\r\n return array.include(value) ? array : array.concat([value]);\r\n });\r\n },\r\n\r\n clone: function() {\r\n return [].concat(this);\r\n },\r\n\r\n size: function() {\r\n return this.length;\r\n },\r\n\r\n inspect: function() {\r\n return \'[\' + this.map(Object.inspect).join(\', \') + \']\';\r\n }\r\n});\r\n\r\nArray.prototype.toArray = Array.prototype.clone;\r\n\r\nfunction $w(string){\r\n string = string.strip();\r\n return string ? string.split(/\\s+/) : [];\r\n}\r\n\r\nif(window.opera){\r\n Array.prototype.concat = function(){\r\n var array = [];\r\n for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);\r\n for(var i = 0, length = arguments.length; i < length; i++) {\r\n if(arguments[i].constructor == Array) {\r\n for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)\r\n array.push(arguments[i][j]);\r\n } else {\r\n array.push(arguments[i]);\r\n }\r\n }\r\n return array;\r\n }\r\n}\r\nvar Hash = function(obj) {\r\n Object.extend(this, obj || {});\r\n};\r\n\r\nObject.extend(Hash, {\r\n toQueryString: function(obj) {\r\n var parts = [];\r\n\r\n this.prototype._each.call(obj, function(pair) {\r\n if (!pair.key) return;\r\n\r\n if (pair.value && pair.value.constructor == Array) {\r\n var values = pair.value.compact();\r\n if (values.length < 2) pair.value = values.reduce();\r\n else {\r\n key = encodeURIComponent(pair.key);\r\n values.each(function(value) {\r\n value = value != undefined ? encodeURIComponent(value) : \'\';\r\n parts.push(key + \'=\' + encodeURIComponent(value));\r\n });\r\n return;\r\n }\r\n }\r\n if (pair.value == undefined) pair[1] = \'\';\r\n parts.push(pair.map(encodeURIComponent).join(\'=\'));\r\n });\r\n\r\n return parts.join(\'&\');\r\n }\r\n});\r\n\r\nObject.extend(Hash.prototype, Enumerable);\r\nObject.extend(Hash.prototype, {\r\n _each: function(iterator) {\r\n for (var key in this) {\r\n var value = this[key];\r\n if (value && value == Hash.prototype[key]) continue;\r\n\r\n var pair = [key, value];\r\n pair.key = key;\r\n pair.value = value;\r\n iterator(pair);\r\n }\r\n },\r\n\r\n keys: function() {\r\n return this.pluck(\'key\');\r\n },\r\n\r\n values: function() {\r\n return this.pluck(\'value\');\r\n },\r\n\r\n merge: function(hash) {\r\n return $H(hash).inject(this, function(mergedHash, pair) {\r\n mergedHash[pair.key] = pair.value;\r\n return mergedHash;\r\n });\r\n },\r\n\r\n remove: function() {\r\n var result;\r\n for(var i = 0, length = arguments.length; i < length; i++) {\r\n var value = this[arguments[i]];\r\n if (value !== undefined){\r\n if (result === undefined) result = value;\r\n else {\r\n if (result.constructor != Array) result = [result];\r\n result.push(value)\r\n }\r\n }\r\n delete this[arguments[i]];\r\n }\r\n return result;\r\n },\r\n\r\n toQueryString: function() {\r\n return Hash.toQueryString(this);\r\n },\r\n\r\n inspect: function() {\r\n return \'#<Hash:{\' + this.map(function(pair) {\r\n return pair.map(Object.inspect).join(\': \');\r\n }).join(\', \') + \'}>\';\r\n }\r\n});\r\n\r\nfunction $H(object) {\r\n if (object && object.constructor == Hash) return object;\r\n return new Hash(object);\r\n};\r\nObjectRange = Class.create();\r\nObject.extend(ObjectRange.prototype, Enumerable);\r\nObject.extend(ObjectRange.prototype, {\r\n initialize: function(start, end, exclusive) {\r\n this.start = start;\r\n this.end = end;\r\n this.exclusive = exclusive;\r\n },\r\n\r\n _each: function(iterator) {\r\n var value = this.start;\r\n while (this.include(value)) {\r\n iterator(value);\r\n value = value.succ();\r\n }\r\n },\r\n\r\n include: function(value) {\r\n if (value < this.start)\r\n return false;\r\n if (this.exclusive)\r\n return value < this.end;\r\n return value <= this.end;\r\n }\r\n});\r\n\r\nvar $R = function(start, end, exclusive) {\r\n return new ObjectRange(start, end, exclusive);\r\n}\r\n\r\nvar Ajax = {\r\n getTransport: function() {\r\n return Try.these(\r\n function() {return new XMLHttpRequest()},\r\n function() {return new ActiveXObject(\'Msxml2.XMLHTTP\')},\r\n function() {return new ActiveXObject(\'Microsoft.XMLHTTP\')}\r\n ) || false;\r\n },\r\n\r\n activeRequestCount: 0\r\n}\r\n\r\nAjax.Responders = {\r\n responders: [],\r\n\r\n _each: function(iterator) {\r\n this.responders._each(iterator);\r\n },\r\n\r\n register: function(responder) {\r\n if (!this.include(responder))\r\n this.responders.push(responder);\r\n },\r\n\r\n unregister: function(responder) {\r\n this.responders = this.responders.without(responder);\r\n },\r\n\r\n dispatch: function(callback, request, transport, json) {\r\n this.each(function(responder) {\r\n if (typeof responder[callback] == \'function\') {\r\n try {\r\n responder[callback].apply(responder, [request, transport, json]);\r\n } catch (e) {}\r\n }\r\n });\r\n }\r\n};\r\n\r\nObject.extend(Ajax.Responders, Enumerable);\r\n\r\nAjax.Responders.register({\r\n onCreate: function() {\r\n Ajax.activeRequestCount++;\r\n },\r\n onComplete: function() {\r\n Ajax.activeRequestCount--;\r\n }\r\n});\r\n\r\nAjax.Base = function() {};\r\nAjax.Base.prototype = {\r\n setOptions: function(options) {\r\n this.options = {\r\n method: \'post\',\r\n asynchronous: true,\r\n contentType: \'application/x-www-form-urlencoded\',\r\n encoding: \'UTF-8\',\r\n parameters: \'\'\r\n }\r\n Object.extend(this.options, options || {});\r\n\r\n this.options.method = this.options.method.toLowerCase();\r\n if (typeof this.options.parameters == \'string\')\r\n this.options.parameters = this.options.parameters.toQueryParams();\r\n }\r\n}\r\n\r\nAjax.Request = Class.create();\r\nAjax.Request.Events =\r\n [\'Uninitialized\', \'Loading\', \'Loaded\', \'Interactive\', \'Complete\'];\r\n\r\nAjax.Request.prototype = Object.extend(new Ajax.Base(), {\r\n _complete: false,\r\n\r\n initialize: function(url, options) {\r\n this.transport = Ajax.getTransport();\r\n this.setOptions(options);\r\n this.request(url);\r\n },\r\n\r\n request: function(url) {\r\n this.url = url;\r\n this.method = this.options.method;\r\n var params = this.options.parameters;\r\n\r\n if (![\'get\', \'post\'].include(this.method)) {\r\n // simulate other verbs over post\r\n params[\'_method\'] = this.method;\r\n this.method = \'post\';\r\n }\r\n\r\n params = Hash.toQueryString(params);\r\n if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += \'&_=\'\r\n\r\n // when GET, append parameters to URL\r\n if (this.method == \'get\' && params)\r\n this.url += (this.url.indexOf(\'?\') > -1 ? \'&\' : \'?\') + params;\r\n\r\n try {\r\n Ajax.Responders.dispatch(\'onCreate\', this, this.transport);\r\n\r\n this.transport.open(this.method.toUpperCase(), this.url,\r\n this.options.asynchronous);\r\n\r\n if (this.options.asynchronous)\r\n setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);\r\n\r\n this.transport.onreadystatechange = this.onStateChange.bind(this);\r\n this.setRequestHeaders();\r\n\r\n var body = this.method == \'post\' ? (this.options.postBody || params) : null;\r\n\r\n this.transport.send(body);\r\n\r\n /* Force Firefox to handle ready state 4 for synchronous requests */\r\n if (!this.options.asynchronous && this.transport.overrideMimeType)\r\n this.onStateChange();\r\n\r\n }\r\n catch (e) {\r\n this.dispatchException(e);\r\n }\r\n },\r\n\r\n onStateChange: function() {\r\n var readyState = this.transport.readyState;\r\n if (readyState > 1 && !((readyState == 4) && this._complete))\r\n this.respondToReadyState(this.transport.readyState);\r\n },\r\n\r\n setRequestHeaders: function() {\r\n var headers = {\r\n \'X-Requested-With\': \'XMLHttpRequest\',\r\n \'X-Prototype-Version\': Prototype.Version,\r\n \'Accept\': \'text/javascript, text/html, application/xml, text/xml, */*\'\r\n };\r\n\r\n if (this.method == \'post\') {\r\n headers[\'Content-type\'] = this.options.contentType +\r\n (this.options.encoding ? \'; charset=\' + this.options.encoding : \'\');\r\n\r\n /* Force \"Connection: close\" for older Mozilla browsers to work\r\n * around a bug where XMLHttpRequest sends an incorrect\r\n * Content-length header. See Mozilla Bugzilla #246651.\r\n */\r\n if (this.transport.overrideMimeType &&\r\n (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005)\r\n headers[\'Connection\'] = \'close\';\r\n }\r\n\r\n // user-defined headers\r\n if (typeof this.options.requestHeaders == \'object\') {\r\n var extras = this.options.requestHeaders;\r\n\r\n if (typeof extras.push == \'function\')\r\n for (var i = 0, length = extras.length; i < length; i += 2)\r\n headers[extras[i]] = extras[i+1];\r\n else\r\n $H(extras).each(function(pair) { headers[pair.key] = pair.value });\r\n }\r\n\r\n for (var name in headers)\r\n this.transport.setRequestHeader(name, headers[name]);\r\n },\r\n\r\n success: function() {\r\n return !this.transport.status\r\n || (this.transport.status >= 200 && this.transport.status < 300);\r\n },\r\n\r\n respondToReadyState: function(readyState) {\r\n var state = Ajax.Request.Events[readyState];\r\n var transport = this.transport, json = this.evalJSON();\r\n\r\n if (state == \'Complete\') {\r\n try {\r\n this._complete = true;\r\n (this.options[\'on\' + this.transport.status]\r\n || this.options[\'on\' + (this.success() ? \'Success\' : \'Failure\')]\r\n || Prototype.emptyFunction)(transport, json);\r\n } catch (e) {\r\n this.dispatchException(e);\r\n }\r\n\r\n if ((this.getHeader(\'Content-type\') || \'text/javascript\').strip().\r\n match(/^(text|application)\\/(x-)?(java|ecma)script(;.*)?$/i))\r\n this.evalResponse();\r\n }\r\n\r\n try {\r\n (this.options[\'on\' + state] || Prototype.emptyFunction)(transport, json);\r\n Ajax.Responders.dispatch(\'on\' + state, this, transport, json);\r\n } catch (e) {\r\n this.dispatchException(e);\r\n }\r\n\r\n if (state == \'Complete\') {\r\n // avoid memory leak in MSIE: clean up\r\n this.transport.onreadystatechange = Prototype.emptyFunction;\r\n }\r\n },\r\n\r\n getHeader: function(name) {\r\n try {\r\n return this.transport.getResponseHeader(name);\r\n } catch (e) { return null }\r\n },\r\n\r\n evalJSON: function() {\r\n try {\r\n var json = this.getHeader(\'X-JSON\');\r\n return json ? eval(\'(\' + json + \')\') : null;\r\n } catch (e) { return null }\r\n },\r\n\r\n evalResponse: function() {\r\n try {\r\n return eval(this.transport.responseText);\r\n } catch (e) {\r\n this.dispatchException(e);\r\n }\r\n },\r\n\r\n dispatchException: function(exception) {\r\n (this.options.onException || Prototype.emptyFunction)(this, exception);\r\n Ajax.Responders.dispatch(\'onException\', this, exception);\r\n }\r\n});\r\n\r\nAjax.Updater = Class.create();\r\n\r\nObject.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {\r\n initialize: function(container, url, options) {\r\n this.container = {\r\n success: (container.success || container),\r\n failure: (container.failure || (container.success ? null : container))\r\n }\r\n\r\n this.transport = Ajax.getTransport();\r\n this.setOptions(options);\r\n\r\n var onComplete = this.options.onComplete || Prototype.emptyFunction;\r\n this.options.onComplete = (function(transport, param) {\r\n this.updateContent();\r\n onComplete(transport, param);\r\n }).bind(this);\r\n\r\n this.request(url);\r\n },\r\n\r\n updateContent: function() {\r\n var receiver = this.container[this.success() ? \'success\' : \'failure\'];\r\n var response = this.transport.responseText;\r\n\r\n if (!this.options.evalScripts) response = response.stripScripts();\r\n\r\n if (receiver = $(receiver)) {\r\n if (this.options.insertion)\r\n new this.options.insertion(receiver, response);\r\n else\r\n receiver.update(response);\r\n }\r\n\r\n if (this.success()) {\r\n if (this.onComplete)\r\n setTimeout(this.onComplete.bind(this), 10);\r\n }\r\n }\r\n});\r\n\r\nAjax.PeriodicalUpdater = Class.create();\r\nAjax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {\r\n initialize: function(container, url, options) {\r\n this.setOptions(options);\r\n this.onComplete = this.options.onComplete;\r\n\r\n this.frequency = (this.options.frequency || 2);\r\n this.decay = (this.options.decay || 1);\r\n\r\n this.updater = {};\r\n this.container = container;\r\n this.url = url;\r\n\r\n this.start();\r\n },\r\n\r\n start: function() {\r\n this.options.onComplete = this.updateComplete.bind(this);\r\n this.onTimerEvent();\r\n },\r\n\r\n stop: function() {\r\n this.updater.options.onComplete = undefined;\r\n clearTimeout(this.timer);\r\n (this.onComplete || Prototype.emptyFunction).apply(this, arguments);\r\n },\r\n\r\n updateComplete: function(request) {\r\n if (this.options.decay) {\r\n this.decay = (request.responseText == this.lastText ?\r\n this.decay * this.options.decay : 1);\r\n\r\n this.lastText = request.responseText;\r\n }\r\n this.timer = setTimeout(this.onTimerEvent.bind(this),\r\n this.decay * this.frequency * 1000);\r\n },\r\n\r\n onTimerEvent: function() {\r\n this.updater = new Ajax.Updater(this.container, this.url, this.options);\r\n }\r\n});\r\nfunction $(element) {\r\n if (arguments.length > 1) {\r\n for (var i = 0, elements = [], length = arguments.length; i < length; i++)\r\n elements.push($(arguments[i]));\r\n return elements;\r\n }\r\n if (typeof element == \'string\')\r\n element = document.getElementById(element);\r\n return Element.extend(element);\r\n}\r\n\r\nif (Prototype.BrowserFeatures.XPath) {\r\n document._getElementsByXPath = function(expression, parentElement) {\r\n var results = [];\r\n var query = document.evaluate(expression, $(parentElement) || document,\r\n null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\r\n for (var i = 0, length = query.snapshotLength; i < length; i++)\r\n results.push(query.snapshotItem(i));\r\n return results;\r\n };\r\n}\r\n\r\ndocument.getElementsByClassName = function(className, parentElement) {\r\n if (Prototype.BrowserFeatures.XPath) {\r\n var q = \".//*[contains(concat(\' \', @class, \' \'), \' \" + className + \" \')]\";\r\n return document._getElementsByXPath(q, parentElement);\r\n } else {\r\n var children = ($(parentElement) || document.body).getElementsByTagName(\'*\');\r\n var elements = [], child;\r\n for (var i = 0, length = children.length; i < length; i++) {\r\n child = children[i];\r\n if (Element.hasClassName(child, className))\r\n elements.push(Element.extend(child));\r\n }\r\n return elements;\r\n }\r\n};\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nif (!window.Element)\r\n var Element = new Object();\r\n\r\nElement.extend = function(element) {\r\n if (!element || _nativeExtensions || element.nodeType == 3) return element;\r\n\r\n if (!element._extended && element.tagName && element != window) {\r\n var methods = Object.clone(Element.Methods), cache = Element.extend.cache;\r\n\r\n if (element.tagName == \'FORM\')\r\n Object.extend(methods, Form.Methods);\r\n if ([\'INPUT\', \'TEXTAREA\', \'SELECT\'].include(element.tagName))\r\n Object.extend(methods, Form.Element.Methods);\r\n\r\n Object.extend(methods, Element.Methods.Simulated);\r\n\r\n for (var property in methods) {\r\n var value = methods[property];\r\n if (typeof value == \'function\' && !(property in element))\r\n element[property] = cache.findOrStore(value);\r\n }\r\n }\r\n\r\n element._extended = true;\r\n return element;\r\n};\r\n\r\nElement.extend.cache = {\r\n findOrStore: function(value) {\r\n return this[value] = this[value] || function() {\r\n return value.apply(null, [this].concat($A(arguments)));\r\n }\r\n }\r\n};\r\n\r\nElement.Methods = {\r\n visible: function(element) {\r\n return $(element).style.display != \'none\';\r\n },\r\n\r\n toggle: function(element) {\r\n element = $(element);\r\n Element[Element.visible(element) ? \'hide\' : \'show\'](element);\r\n return element;\r\n },\r\n\r\n hide: function(element) {\r\n $(element).style.display = \'none\';\r\n return element;\r\n },\r\n\r\n show: function(element) {\r\n $(element).style.display = \'\';\r\n return element;\r\n },\r\n\r\n remove: function(element) {\r\n element = $(element);\r\n element.parentNode.removeChild(element);\r\n return element;\r\n },\r\n\r\n update: function(element, html) {\r\n html = typeof html == \'undefined\' ? \'\' : html.toString();\r\n $(element).innerHTML = html.stripScripts();\r\n setTimeout(function() {html.evalScripts()}, 10);\r\n return element;\r\n },\r\n\r\n replace: function(element, html) {\r\n element = $(element);\r\n html = typeof html == \'undefined\' ? \'\' : html.toString();\r\n if (element.outerHTML) {\r\n element.outerHTML = html.stripScripts();\r\n } else {\r\n var range = element.ownerDocument.createRange();\r\n range.selectNodeContents(element);\r\n element.parentNode.replaceChild(\r\n range.createContextualFragment(html.stripScripts()), element);\r\n }\r\n setTimeout(function() {html.evalScripts()}, 10);\r\n return element;\r\n },\r\n\r\n inspect: function(element) {\r\n element = $(element);\r\n var result = \'<\' + element.tagName.toLowerCase();\r\n $H({\'id\': \'id\', \'className\': \'class\'}).each(function(pair) {\r\n var property = pair.first(), attribute = pair.last();\r\n var value = (element[property] || \'\').toString();\r\n if (value) result += \' \' + attribute + \'=\' + value.inspect(true);\r\n });\r\n return result + \'>\';\r\n },\r\n\r\n recursivelyCollect: function(element, property) {\r\n element = $(element);\r\n var elements = [];\r\n while (element = element[property])\r\n if (element.nodeType == 1)\r\n elements.push(Element.extend(element));\r\n return elements;\r\n },\r\n\r\n ancestors: function(element) {\r\n return $(element).recursivelyCollect(\'parentNode\');\r\n },\r\n\r\n descendants: function(element) {\r\n return $A($(element).getElementsByTagName(\'*\'));\r\n },\r\n\r\n immediateDescendants: function(element) {\r\n if (!(element = $(element).firstChild)) return [];\r\n while (element && element.nodeType != 1) element = element.nextSibling;\r\n if (element) return [element].concat($(element).nextSiblings());\r\n return [];\r\n },\r\n\r\n previousSiblings: function(element) {\r\n return $(element).recursivelyCollect(\'previousSibling\');\r\n },\r\n\r\n nextSiblings: function(element) {\r\n return $(element).recursivelyCollect(\'nextSibling\');\r\n },\r\n\r\n siblings: function(element) {\r\n element = $(element);\r\n return element.previousSiblings().reverse().concat(element.nextSiblings());\r\n },\r\n\r\n match: function(element, selector) {\r\n if (typeof selector == \'string\')\r\n selector = new Selector(selector);\r\n return selector.match($(element));\r\n },\r\n\r\n up: function(element, expression, index) {\r\n return Selector.findElement($(element).ancestors(), expression, index);\r\n },\r\n\r\n down: function(element, expression, index) {\r\n return Selector.findElement($(element).descendants(), expression, index);\r\n },\r\n\r\n previous: function(element, expression, index) {\r\n return Selector.findElement($(element).previousSiblings(), expression, index);\r\n },\r\n\r\n next: function(element, expression, index) {\r\n return Selector.findElement($(element).nextSiblings(), expression, index);\r\n },\r\n\r\n getElementsBySelector: function() {\r\n var args = $A(arguments), element = $(args.shift());\r\n return Selector.findChildElements(element, args);\r\n },\r\n\r\n getElementsByClassName: function(element, className) {\r\n return document.getElementsByClassName(className, element);\r\n },\r\n\r\n readAttribute: function(element, name) {\r\n element = $(element);\r\n if (document.all && !window.opera) {\r\n var t = Element._attributeTranslations;\r\n if (t.values[name]) return t.values[name](element, name);\r\n if (t.names[name]) name = t.names[name];\r\n var attribute = element.attributes[name];\r\n if(attribute) return attribute.nodeValue;\r\n }\r\n return element.getAttribute(name);\r\n },\r\n\r\n getHeight: function(element) {\r\n return $(element).getDimensions().height;\r\n },\r\n\r\n getWidth: function(element) {\r\n return $(element).getDimensions().width;\r\n },\r\n\r\n classNames: function(element) {\r\n return new Element.ClassNames(element);\r\n },\r\n\r\n hasClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n var elementClassName = element.className;\r\n if (elementClassName.length == 0) return false;\r\n if (elementClassName == className ||\r\n elementClassName.match(new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\")))\r\n return true;\r\n return false;\r\n },\r\n\r\n addClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n Element.classNames(element).add(className);\r\n return element;\r\n },\r\n\r\n removeClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n Element.classNames(element).remove(className);\r\n return element;\r\n },\r\n\r\n toggleClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n Element.classNames(element)[element.hasClassName(className) ? \'remove\' : \'add\'](className);\r\n return element;\r\n },\r\n\r\n observe: function() {\r\n Event.observe.apply(Event, arguments);\r\n return $A(arguments).first();\r\n },\r\n\r\n stopObserving: function() {\r\n Event.stopObserving.apply(Event, arguments);\r\n return $A(arguments).first();\r\n },\r\n\r\n // removes whitespace-only text node children\r\n cleanWhitespace: function(element) {\r\n element = $(element);\r\n var node = element.firstChild;\r\n while (node) {\r\n var nextNode = node.nextSibling;\r\n if (node.nodeType == 3 && !/\\S/.test(node.nodeValue))\r\n element.removeChild(node);\r\n node = nextNode;\r\n }\r\n return element;\r\n },\r\n\r\n empty: function(element) {\r\n return $(element).innerHTML.match(/^\\s*$/);\r\n },\r\n\r\n descendantOf: function(element, ancestor) {\r\n element = $(element), ancestor = $(ancestor);\r\n while (element = element.parentNode)\r\n if (element == ancestor) return true;\r\n return false;\r\n },\r\n\r\n scrollTo: function(element) {\r\n element = $(element);\r\n var pos = Position.cumulativeOffset(element);\r\n window.scrollTo(pos[0], pos[1]);\r\n return element;\r\n },\r\n\r\n getStyle: function(element, style) {\r\n element = $(element);\r\n if ([\'float\',\'cssFloat\'].include(style))\r\n style = (typeof element.style.styleFloat != \'undefined\' ? \'styleFloat\' : \'cssFloat\');\r\n style = style.camelize();\r\n var value = element.style[style];\r\n if (!value) {\r\n if (document.defaultView && document.defaultView.getComputedStyle) {\r\n var css = document.defaultView.getComputedStyle(element, null);\r\n value = css ? css[style] : null;\r\n } else if (element.currentStyle) {\r\n value = element.currentStyle[style];\r\n }\r\n }\r\n\r\n if((value == \'auto\') && [\'width\',\'height\'].include(style) && (element.getStyle(\'display\') != \'none\'))\r\n value = element[\'offset\'+style.capitalize()] + \'px\';\r\n\r\n if (window.opera && [\'left\', \'top\', \'right\', \'bottom\'].include(style))\r\n if (Element.getStyle(element, \'position\') == \'static\') value = \'auto\';\r\n if(style == \'opacity\') {\r\n if(value) return parseFloat(value);\r\n if(value = (element.getStyle(\'filter\') || \'\').match(/alpha\\(opacity=(.*)\\)/))\r\n if(value[1]) return parseFloat(value[1]) / 100;\r\n return 1.0;\r\n }\r\n return value == \'auto\' ? null : value;\r\n },\r\n\r\n setStyle: function(element, style) {\r\n element = $(element);\r\n for (var name in style) {\r\n var value = style[name];\r\n if(name == \'opacity\') {\r\n if (value == 1) {\r\n value = (/Gecko/.test(navigator.userAgent) &&\r\n !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera)\r\n element.style.filter = element.getStyle(\'filter\').replace(/alpha\\([^\\)]*\\)/gi,\'\');\r\n } else if(value === \'\') {\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera)\r\n element.style.filter = element.getStyle(\'filter\').replace(/alpha\\([^\\)]*\\)/gi,\'\');\r\n } else {\r\n if(value < 0.00001) value = 0;\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera)\r\n element.style.filter = element.getStyle(\'filter\').replace(/alpha\\([^\\)]*\\)/gi,\'\') +\r\n \'alpha(opacity=\'+value*100+\')\';\r\n }\r\n } else if([\'float\',\'cssFloat\'].include(name)) name = (typeof element.style.styleFloat != \'undefined\') ? \'styleFloat\' : \'cssFloat\';\r\n element.style[name.camelize()] = value;\r\n }\r\n return element;\r\n },\r\n\r\n getDimensions: function(element) {\r\n element = $(element);\r\n var display = $(element).getStyle(\'display\');\r\n if (display != \'none\' && display != null) // Safari bug\r\n return {width: element.offsetWidth, height: element.offsetHeight};\r\n\r\n // All *Width and *Height properties give 0 on elements with display none,\r\n // so enable the element temporarily\r\n var els = element.style;\r\n var originalVisibility = els.visibility;\r\n var originalPosition = els.position;\r\n var originalDisplay = els.display;\r\n els.visibility = \'hidden\';\r\n els.position = \'absolute\';\r\n els.display = \'block\';\r\n var originalWidth = element.clientWidth;\r\n var originalHeight = element.clientHeight;\r\n els.display = originalDisplay;\r\n els.position = originalPosition;\r\n els.visibility = originalVisibility;\r\n return {width: originalWidth, height: originalHeight};\r\n },\r\n\r\n makePositioned: function(element) {\r\n element = $(element);\r\n var pos = Element.getStyle(element, \'position\');\r\n if (pos == \'static\' || !pos) {\r\n element._madePositioned = true;\r\n element.style.position = \'relative\';\r\n // Opera returns the offset relative to the positioning context, when an\r\n // element is position relative but top and left have not been defined\r\n if (window.opera) {\r\n element.style.top = 0;\r\n element.style.left = 0;\r\n }\r\n }\r\n return element;\r\n },\r\n\r\n undoPositioned: function(element) {\r\n element = $(element);\r\n if (element._madePositioned) {\r\n element._madePositioned = undefined;\r\n element.style.position =\r\n element.style.top =\r\n element.style.left =\r\n element.style.bottom =\r\n element.style.right = \'\';\r\n }\r\n return element;\r\n },\r\n\r\n makeClipping: function(element) {\r\n element = $(element);\r\n if (element._overflow) return element;\r\n element._overflow = element.style.overflow || \'auto\';\r\n if ((Element.getStyle(element, \'overflow\') || \'visible\') != \'hidden\')\r\n element.style.overflow = \'hidden\';\r\n return element;\r\n },\r\n\r\n undoClipping: function(element) {\r\n element = $(element);\r\n if (!element._overflow) return element;\r\n element.style.overflow = element._overflow == \'auto\' ? \'\' : element._overflow;\r\n element._overflow = null;\r\n return element;\r\n }\r\n};\r\n\r\nObject.extend(Element.Methods, {childOf: Element.Methods.descendantOf});\r\n\r\nElement._attributeTranslations = {};\r\n\r\nElement._attributeTranslations.names = {\r\n colspan: \"colSpan\",\r\n rowspan: \"rowSpan\",\r\n valign: \"vAlign\",\r\n datetime: \"dateTime\",\r\n accesskey: \"accessKey\",\r\n tabindex: \"tabIndex\",\r\n enctype: \"encType\",\r\n maxlength: \"maxLength\",\r\n readonly: \"readOnly\",\r\n longdesc: \"longDesc\"\r\n};\r\n\r\nElement._attributeTranslations.values = {\r\n _getAttr: function(element, attribute) {\r\n return element.getAttribute(attribute, 2);\r\n },\r\n\r\n _flag: function(element, attribute) {\r\n return $(element).hasAttribute(attribute) ? attribute : null;\r\n },\r\n\r\n style: function(element) {\r\n return element.style.cssText.toLowerCase();\r\n },\r\n\r\n title: function(element) {\r\n var node = element.getAttributeNode(\'title\');\r\n return node.specified ? node.nodeValue : null;\r\n }\r\n};\r\n\r\nObject.extend(Element._attributeTranslations.values, {\r\n href: Element._attributeTranslations.values._getAttr,\r\n src: Element._attributeTranslations.values._getAttr,\r\n disabled: Element._attributeTranslations.values._flag,\r\n checked: Element._attributeTranslations.values._flag,\r\n readonly: Element._attributeTranslations.values._flag,\r\n multiple: Element._attributeTranslations.values._flag\r\n});\r\n\r\nElement.Methods.Simulated = {\r\n hasAttribute: function(element, attribute) {\r\n var t = Element._attributeTranslations;\r\n attribute = t.names[attribute] || attribute;\r\n return $(element).getAttributeNode(attribute).specified;\r\n }\r\n};\r\n\r\n// IE is missing .innerHTML support for TABLE-related elements\r\nif (document.all && !window.opera){\r\n Element.Methods.update = function(element, html) {\r\n element = $(element);\r\n html = typeof html == \'undefined\' ? \'\' : html.toString();\r\n var tagName = element.tagName.toUpperCase();\r\n if ([\'THEAD\',\'TBODY\',\'TR\',\'TD\'].include(tagName)) {\r\n var div = document.createElement(\'div\');\r\n switch (tagName) {\r\n case \'THEAD\':\r\n case \'TBODY\':\r\n div.innerHTML = \'<table><tbody>\' + html.stripScripts() + \'</tbody></table>\';\r\n depth = 2;\r\n break;\r\n case \'TR\':\r\n div.innerHTML = \'<table><tbody><tr>\' + html.stripScripts() + \'</tr></tbody></table>\';\r\n depth = 3;\r\n break;\r\n case \'TD\':\r\n div.innerHTML = \'<table><tbody><tr><td>\' + html.stripScripts() + \'</td></tr></tbody></table>\';\r\n depth = 4;\r\n }\r\n $A(element.childNodes).each(function(node){\r\n element.removeChild(node)\r\n });\r\n depth.times(function(){ div = div.firstChild });\r\n\r\n $A(div.childNodes).each(\r\n function(node){ element.appendChild(node) });\r\n } else {\r\n element.innerHTML = html.stripScripts();\r\n }\r\n setTimeout(function() {html.evalScripts()}, 10);\r\n return element;\r\n }\r\n};\r\n\r\nObject.extend(Element, Element.Methods);\r\n\r\nvar _nativeExtensions = false;\r\n\r\nif(/Konqueror|Safari|KHTML/.test(navigator.userAgent))\r\n [\'\', \'Form\', \'Input\', \'TextArea\', \'Select\'].each(function(tag) {\r\n var className = \'HTML\' + tag + \'Element\';\r\n if(window[className]) return;\r\n var klass = window[className] = {};\r\n klass.prototype = document.createElement(tag ? tag.toLowerCase() : \'div\').__proto__;\r\n });\r\n\r\nElement.addMethods = function(methods) {\r\n Object.extend(Element.Methods, methods || {});\r\n\r\n function copy(methods, destination, onlyIfAbsent) {\r\n onlyIfAbsent = onlyIfAbsent || false;\r\n var cache = Element.extend.cache;\r\n for (var property in methods) {\r\n var value = methods[property];\r\n if (!onlyIfAbsent || !(property in destination))\r\n destination[property] = cache.findOrStore(value);\r\n }\r\n }\r\n\r\n if (typeof HTMLElement != \'undefined\') {\r\n copy(Element.Methods, HTMLElement.prototype);\r\n copy(Element.Methods.Simulated, HTMLElement.prototype, true);\r\n copy(Form.Methods, HTMLFormElement.prototype);\r\n [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {\r\n copy(Form.Element.Methods, klass.prototype);\r\n });\r\n _nativeExtensions = true;\r\n }\r\n}\r\n\r\nvar Toggle = new Object();\r\nToggle.display = Element.toggle;\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nAbstract.Insertion = function(adjacency) {\r\n this.adjacency = adjacency;\r\n}\r\n\r\nAbstract.Insertion.prototype = {\r\n initialize: function(element, content) {\r\n this.element = $(element);\r\n this.content = content.stripScripts();\r\n\r\n if (this.adjacency && this.element.insertAdjacentHTML) {\r\n try {\r\n this.element.insertAdjacentHTML(this.adjacency, this.content);\r\n } catch (e) {\r\n var tagName = this.element.tagName.toUpperCase();\r\n if ([\'TBODY\', \'TR\'].include(tagName)) {\r\n this.insertContent(this.contentFromAnonymousTable());\r\n } else {\r\n throw e;\r\n }\r\n }\r\n } else {\r\n this.range = this.element.ownerDocument.createRange();\r\n if (this.initializeRange) this.initializeRange();\r\n this.insertContent([this.range.createContextualFragment(this.content)]);\r\n }\r\n\r\n setTimeout(function() {content.evalScripts()}, 10);\r\n },\r\n\r\n contentFromAnonymousTable: function() {\r\n var div = document.createElement(\'div\');\r\n div.innerHTML = \'<table><tbody>\' + this.content + \'</tbody></table>\';\r\n return $A(div.childNodes[0].childNodes[0].childNodes);\r\n }\r\n}\r\n\r\nvar Insertion = new Object();\r\n\r\nInsertion.Before = Class.create();\r\nInsertion.Before.prototype = Object.extend(new Abstract.Insertion(\'beforeBegin\'), {\r\n initializeRange: function() {\r\n this.range.setStartBefore(this.element);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.each((function(fragment) {\r\n this.element.parentNode.insertBefore(fragment, this.element);\r\n }).bind(this));\r\n }\r\n});\r\n\r\nInsertion.Top = Class.create();\r\nInsertion.Top.prototype = Object.extend(new Abstract.Insertion(\'afterBegin\'), {\r\n initializeRange: function() {\r\n this.range.selectNodeContents(this.element);\r\n this.range.collapse(true);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.reverse(false).each((function(fragment) {\r\n this.element.insertBefore(fragment, this.element.firstChild);\r\n }).bind(this));\r\n }\r\n});\r\n\r\nInsertion.Bottom = Class.create();\r\nInsertion.Bottom.prototype = Object.extend(new Abstract.Insertion(\'beforeEnd\'), {\r\n initializeRange: function() {\r\n this.range.selectNodeContents(this.element);\r\n this.range.collapse(this.element);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.each((function(fragment) {\r\n this.element.appendChild(fragment);\r\n }).bind(this));\r\n }\r\n});\r\n\r\nInsertion.After = Class.create();\r\nInsertion.After.prototype = Object.extend(new Abstract.Insertion(\'afterEnd\'), {\r\n initializeRange: function() {\r\n this.range.setStartAfter(this.element);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.each((function(fragment) {\r\n this.element.parentNode.insertBefore(fragment,\r\n this.element.nextSibling);\r\n }).bind(this));\r\n }\r\n});\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nElement.ClassNames = Class.create();\r\nElement.ClassNames.prototype = {\r\n initialize: function(element) {\r\n this.element = $(element);\r\n },\r\n\r\n _each: function(iterator) {\r\n this.element.className.split(/\\s+/).select(function(name) {\r\n return name.length > 0;\r\n })._each(iterator);\r\n },\r\n\r\n set: function(className) {\r\n this.element.className = className;\r\n },\r\n\r\n add: function(classNameToAdd) {\r\n if (this.include(classNameToAdd)) return;\r\n this.set($A(this).concat(classNameToAdd).join(\' \'));\r\n },\r\n\r\n remove: function(classNameToRemove) {\r\n if (!this.include(classNameToRemove)) return;\r\n this.set($A(this).without(classNameToRemove).join(\' \'));\r\n },\r\n\r\n toString: function() {\r\n return $A(this).join(\' \');\r\n }\r\n};\r\n\r\nObject.extend(Element.ClassNames.prototype, Enumerable);\r\nvar Selector = Class.create();\r\nSelector.prototype = {\r\n initialize: function(expression) {\r\n this.params = {classNames: []};\r\n this.expression = expression.toString().strip();\r\n this.parseExpression();\r\n this.compileMatcher();\r\n },\r\n\r\n parseExpression: function() {\r\n function abort(message) { throw \'Parse error in selector: \' + message; }\r\n\r\n if (this.expression == \'\') abort(\'empty expression\');\r\n\r\n var params = this.params, expr = this.expression, match, modifier, clause, rest;\r\n while (match = expr.match(/^(.*)\\[([a-z0-9_:-]+?)(?:([~\\|!]?=)(?:\"([^\"]*)\"|([^\\]\\s]*)))?\\]$/i)) {\r\n params.attributes = params.attributes || [];\r\n params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || \'\'});\r\n expr = match[1];\r\n }\r\n\r\n if (expr == \'*\') return this.params.wildcard = true;\r\n\r\n while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {\r\n modifier = match[1], clause = match[2], rest = match[3];\r\n switch (modifier) {\r\n case \'#\': params.id = clause; break;\r\n case \'.\': params.classNames.push(clause); break;\r\n case \'\':\r\n case undefined: params.tagName = clause.toUpperCase(); break;\r\n default: abort(expr.inspect());\r\n }\r\n expr = rest;\r\n }\r\n\r\n if (expr.length > 0) abort(expr.inspect());\r\n },\r\n\r\n buildMatchExpression: function() {\r\n var params = this.params, conditions = [], clause;\r\n\r\n if (params.wildcard)\r\n conditions.push(\'true\');\r\n if (clause = params.id)\r\n conditions.push(\'element.readAttribute(\"id\") == \' + clause.inspect());\r\n if (clause = params.tagName)\r\n conditions.push(\'element.tagName.toUpperCase() == \' + clause.inspect());\r\n if ((clause = params.classNames).length > 0)\r\n for (var i = 0, length = clause.length; i < length; i++)\r\n conditions.push(\'element.hasClassName(\' + clause[i].inspect() + \')\');\r\n if (clause = params.attributes) {\r\n clause.each(function(attribute) {\r\n var value = \'element.readAttribute(\' + attribute.name.inspect() + \')\';\r\n var splitValueBy = function(delimiter) {\r\n return value + \' && \' + value + \'.split(\' + delimiter.inspect() + \')\';\r\n }\r\n\r\n switch (attribute.operator) {\r\n case \'=\': conditions.push(value + \' == \' + attribute.value.inspect()); break;\r\n case \'~=\': conditions.push(splitValueBy(\' \') + \'.include(\' + attribute.value.inspect() + \')\'); break;\r\n case \'|=\': conditions.push(\r\n splitValueBy(\'-\') + \'.first().toUpperCase() == \' + attribute.value.toUpperCase().inspect()\r\n ); break;\r\n case \'!=\': conditions.push(value + \' != \' + attribute.value.inspect()); break;\r\n case \'\':\r\n case undefined: conditions.push(\'element.hasAttribute(\' + attribute.name.inspect() + \')\'); break;\r\n default: throw \'Unknown operator \' + attribute.operator + \' in selector\';\r\n }\r\n });\r\n }\r\n\r\n return conditions.join(\' && \');\r\n },\r\n\r\n compileMatcher: function() {\r\n this.match = new Function(\'element\', \'if (!element.tagName) return false; \\\r\n element = $(element); \\\r\n return \' + this.buildMatchExpression());\r\n },\r\n\r\n findElements: function(scope) {\r\n var element;\r\n\r\n if (element = $(this.params.id))\r\n if (this.match(element))\r\n if (!scope || Element.childOf(element, scope))\r\n return [element];\r\n\r\n scope = (scope || document).getElementsByTagName(this.params.tagName || \'*\');\r\n\r\n var results = [];\r\n for (var i = 0, length = scope.length; i < length; i++)\r\n if (this.match(element = scope[i]))\r\n results.push(Element.extend(element));\r\n\r\n return results;\r\n },\r\n\r\n toString: function() {\r\n return this.expression;\r\n }\r\n}\r\n\r\nObject.extend(Selector, {\r\n matchElements: function(elements, expression) {\r\n var selector = new Selector(expression);\r\n return elements.select(selector.match.bind(selector)).map(Element.extend);\r\n },\r\n\r\n findElement: function(elements, expression, index) {\r\n if (typeof expression == \'number\') index = expression, expression = false;\r\n return Selector.matchElements(elements, expression || \'*\')[index || 0];\r\n },\r\n\r\n findChildElements: function(element, expressions) {\r\n return expressions.map(function(expression) {\r\n return expression.match(/[^\\s\"]+(?:\"[^\"]*\"[^\\s\"]+)*/g).inject([null], function(results, expr) {\r\n var selector = new Selector(expr);\r\n return results.inject([], function(elements, result) {\r\n return elements.concat(selector.findElements(result || element));\r\n });\r\n });\r\n }).flatten();\r\n }\r\n});\r\n\r\nfunction $$() {\r\n return Selector.findChildElements(document, $A(arguments));\r\n}\r\nvar Form = {\r\n reset: function(form) {\r\n $(form).reset();\r\n return form;\r\n },\r\n\r\n serializeElements: function(elements, getHash) {\r\n var data = elements.inject({}, function(result, element) {\r\n if (!element.disabled && element.name) {\r\n var key = element.name, value = $(element).getValue();\r\n if (value != undefined) {\r\n if (result[key]) {\r\n if (result[key].constructor != Array) result[key] = [result[key]];\r\n result[key].push(value);\r\n }\r\n else result[key] = value;\r\n }\r\n }\r\n return result;\r\n });\r\n\r\n return getHash ? data : Hash.toQueryString(data);\r\n }\r\n};\r\n\r\nForm.Methods = {\r\n serialize: function(form, getHash) {\r\n return Form.serializeElements(Form.getElements(form), getHash);\r\n },\r\n\r\n getElements: function(form) {\r\n return $A($(form).getElementsByTagName(\'*\')).inject([],\r\n function(elements, child) {\r\n if (Form.Element.Serializers[child.tagName.toLowerCase()])\r\n elements.push(Element.extend(child));\r\n return elements;\r\n }\r\n );\r\n },\r\n\r\n getInputs: function(form, typeName, name) {\r\n form = $(form);\r\n var inputs = form.getElementsByTagName(\'input\');\r\n\r\n if (!typeName && !name) return $A(inputs).map(Element.extend);\r\n\r\n for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {\r\n var input = inputs[i];\r\n if ((typeName && input.type != typeName) || (name && input.name != name))\r\n continue;\r\n matchingInputs.push(Element.extend(input));\r\n }\r\n\r\n return matchingInputs;\r\n },\r\n\r\n disable: function(form) {\r\n form = $(form);\r\n form.getElements().each(function(element) {\r\n element.blur();\r\n element.disabled = \'true\';\r\n });\r\n return form;\r\n },\r\n\r\n enable: function(form) {\r\n form = $(form);\r\n form.getElements().each(function(element) {\r\n element.disabled = \'\';\r\n });\r\n return form;\r\n },\r\n\r\n findFirstElement: function(form) {\r\n return $(form).getElements().find(function(element) {\r\n return element.type != \'hidden\' && !element.disabled &&\r\n [\'input\', \'select\', \'textarea\'].include(element.tagName.toLowerCase());\r\n });\r\n },\r\n\r\n focusFirstElement: function(form) {\r\n form = $(form);\r\n form.findFirstElement().activate();\r\n return form;\r\n }\r\n}\r\n\r\nObject.extend(Form, Form.Methods);\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nForm.Element = {\r\n focus: function(element) {\r\n $(element).focus();\r\n return element;\r\n },\r\n\r\n select: function(element) {\r\n $(element).select();\r\n return element;\r\n }\r\n}\r\n\r\nForm.Element.Methods = {\r\n serialize: function(element) {\r\n element = $(element);\r\n if (!element.disabled && element.name) {\r\n var value = element.getValue();\r\n if (value != undefined) {\r\n var pair = {};\r\n pair[element.name] = value;\r\n return Hash.toQueryString(pair);\r\n }\r\n }\r\n return \'\';\r\n },\r\n\r\n getValue: function(element) {\r\n element = $(element);\r\n var method = element.tagName.toLowerCase();\r\n return Form.Element.Serializers[method](element);\r\n },\r\n\r\n clear: function(element) {\r\n $(element).value = \'\';\r\n return element;\r\n },\r\n\r\n present: function(element) {\r\n return $(element).value != \'\';\r\n },\r\n\r\n activate: function(element) {\r\n element = $(element);\r\n element.focus();\r\n if (element.select && ( element.tagName.toLowerCase() != \'input\' ||\r\n ![\'button\', \'reset\', \'submit\'].include(element.type) ) )\r\n element.select();\r\n return element;\r\n },\r\n\r\n disable: function(element) {\r\n element = $(element);\r\n element.disabled = true;\r\n return element;\r\n },\r\n\r\n enable: function(element) {\r\n element = $(element);\r\n element.blur();\r\n element.disabled = false;\r\n return element;\r\n }\r\n}\r\n\r\nObject.extend(Form.Element, Form.Element.Methods);\r\nvar Field = Form.Element;\r\nvar $F = Form.Element.getValue;\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nForm.Element.Serializers = {\r\n input: function(element) {\r\n switch (element.type.toLowerCase()) {\r\n case \'checkbox\':\r\n case \'radio\':\r\n return Form.Element.Serializers.inputSelector(element);\r\n default:\r\n return Form.Element.Serializers.textarea(element);\r\n }\r\n },\r\n\r\n inputSelector: function(element) {\r\n return element.checked ? element.value : null;\r\n },\r\n\r\n textarea: function(element) {\r\n return element.value;\r\n },\r\n\r\n select: function(element) {\r\n return this[element.type == \'select-one\' ?\r\n \'selectOne\' : \'selectMany\'](element);\r\n },\r\n\r\n selectOne: function(element) {\r\n var index = element.selectedIndex;\r\n return index >= 0 ? this.optionValue(element.options[index]) : null;\r\n },\r\n\r\n selectMany: function(element) {\r\n var values, length = element.length;\r\n if (!length) return null;\r\n\r\n for (var i = 0, values = []; i < length; i++) {\r\n var opt = element.options[i];\r\n if (opt.selected) values.push(this.optionValue(opt));\r\n }\r\n return values;\r\n },\r\n\r\n optionValue: function(opt) {\r\n // extend element because hasAttribute may not be native\r\n return Element.extend(opt).hasAttribute(\'value\') ? opt.value : opt.text;\r\n }\r\n}\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nAbstract.TimedObserver = function() {}\r\nAbstract.TimedObserver.prototype = {\r\n initialize: function(element, frequency, callback) {\r\n this.frequency = frequency;\r\n this.element = $(element);\r\n this.callback = callback;\r\n\r\n this.lastValue = this.getValue();\r\n this.registerCallback();\r\n },\r\n\r\n registerCallback: function() {\r\n setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r\n },\r\n\r\n onTimerEvent: function() {\r\n var value = this.getValue();\r\n var changed = (\'string\' == typeof this.lastValue && \'string\' == typeof value\r\n ? this.lastValue != value : String(this.lastValue) != String(value));\r\n if (changed) {\r\n this.callback(this.element, value);\r\n this.lastValue = value;\r\n }\r\n }\r\n}\r\n\r\nForm.Element.Observer = Class.create();\r\nForm.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r\n getValue: function() {\r\n return Form.Element.getValue(this.element);\r\n }\r\n});\r\n\r\nForm.Observer = Class.create();\r\nForm.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r\n getValue: function() {\r\n return Form.serialize(this.element);\r\n }\r\n});\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nAbstract.EventObserver = function() {}\r\nAbstract.EventObserver.prototype = {\r\n initialize: function(element, callback) {\r\n this.element = $(element);\r\n this.callback = callback;\r\n\r\n this.lastValue = this.getValue();\r\n if (this.element.tagName.toLowerCase() == \'form\')\r\n this.registerFormCallbacks();\r\n else\r\n this.registerCallback(this.element);\r\n },\r\n\r\n onElementEvent: function() {\r\n var value = this.getValue();\r\n if (this.lastValue != value) {\r\n this.callback(this.element, value);\r\n this.lastValue = value;\r\n }\r\n },\r\n\r\n registerFormCallbacks: function() {\r\n Form.getElements(this.element).each(this.registerCallback.bind(this));\r\n },\r\n\r\n registerCallback: function(element) {\r\n if (element.type) {\r\n switch (element.type.toLowerCase()) {\r\n case \'checkbox\':\r\n case \'radio\':\r\n Event.observe(element, \'click\', this.onElementEvent.bind(this));\r\n break;\r\n default:\r\n Event.observe(element, \'change\', this.onElementEvent.bind(this));\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nForm.Element.EventObserver = Class.create();\r\nForm.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r\n getValue: function() {\r\n return Form.Element.getValue(this.element);\r\n }\r\n});\r\n\r\nForm.EventObserver = Class.create();\r\nForm.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r\n getValue: function() {\r\n return Form.serialize(this.element);\r\n }\r\n});\r\nif (!window.Event) {\r\n var Event = new Object();\r\n}\r\n\r\nObject.extend(Event, {\r\n KEY_BACKSPACE: 8,\r\n KEY_TAB: 9,\r\n KEY_RETURN: 13,\r\n KEY_ESC: 27,\r\n KEY_LEFT: 37,\r\n KEY_UP: 38,\r\n KEY_RIGHT: 39,\r\n KEY_DOWN: 40,\r\n KEY_DELETE: 46,\r\n KEY_HOME: 36,\r\n KEY_END: 35,\r\n KEY_PAGEUP: 33,\r\n KEY_PAGEDOWN: 34,\r\n\r\n element: function(event) {\r\n return event.target || event.srcElement;\r\n },\r\n\r\n isLeftClick: function(event) {\r\n return (((event.which) && (event.which == 1)) ||\r\n ((event.button) && (event.button == 1)));\r\n },\r\n\r\n pointerX: function(event) {\r\n return event.pageX || (event.clientX +\r\n (document.documentElement.scrollLeft || document.body.scrollLeft));\r\n },\r\n\r\n pointerY: function(event) {\r\n return event.pageY || (event.clientY +\r\n (document.documentElement.scrollTop || document.body.scrollTop));\r\n },\r\n\r\n stop: function(event) {\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n } else {\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n }\r\n },\r\n\r\n // find the first node with the given tagName, starting from the\r\n // node the event was triggered on; traverses the DOM upwards\r\n findElement: function(event, tagName) {\r\n var element = Event.element(event);\r\n while (element.parentNode && (!element.tagName ||\r\n (element.tagName.toUpperCase() != tagName.toUpperCase())))\r\n element = element.parentNode;\r\n return element;\r\n },\r\n\r\n observers: false,\r\n\r\n _observeAndCache: function(element, name, observer, useCapture) {\r\n if (!this.observers) this.observers = [];\r\n if (element.addEventListener) {\r\n this.observers.push([element, name, observer, useCapture]);\r\n element.addEventListener(name, observer, useCapture);\r\n } else if (element.attachEvent) {\r\n this.observers.push([element, name, observer, useCapture]);\r\n element.attachEvent(\'on\' + name, observer);\r\n }\r\n },\r\n\r\n unloadCache: function() {\r\n if (!Event.observers) return;\r\n for (var i = 0, length = Event.observers.length; i < length; i++) {\r\n Event.stopObserving.apply(this, Event.observers[i]);\r\n Event.observers[i][0] = null;\r\n }\r\n Event.observers = false;\r\n },\r\n\r\n observe: function(element, name, observer, useCapture) {\r\n element = $(element);\r\n useCapture = useCapture || false;\r\n\r\n if (name == \'keypress\' &&\r\n (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r\n || element.attachEvent))\r\n name = \'keydown\';\r\n\r\n Event._observeAndCache(element, name, observer, useCapture);\r\n },\r\n\r\n stopObserving: function(element, name, observer, useCapture) {\r\n element = $(element);\r\n useCapture = useCapture || false;\r\n\r\n if (name == \'keypress\' &&\r\n (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r\n || element.detachEvent))\r\n name = \'keydown\';\r\n\r\n if (element.removeEventListener) {\r\n element.removeEventListener(name, observer, useCapture);\r\n } else if (element.detachEvent) {\r\n try {\r\n element.detachEvent(\'on\' + name, observer);\r\n } catch (e) {}\r\n }\r\n }\r\n});\r\n\r\n/* prevent memory leaks in IE */\r\nif (navigator.appVersion.match(/\\bMSIE\\b/))\r\n Event.observe(window, \'unload\', Event.unloadCache, false);\r\nvar Position = {\r\n // set to true if needed, warning: firefox performance problems\r\n // NOT neeeded for page scrolling, only if draggable contained in\r\n // scrollable elements\r\n includeScrollOffsets: false,\r\n\r\n // must be called before calling withinIncludingScrolloffset, every time the\r\n // page is scrolled\r\n prepare: function() {\r\n this.deltaX = window.pageXOffset\r\n || document.documentElement.scrollLeft\r\n || document.body.scrollLeft\r\n || 0;\r\n this.deltaY = window.pageYOffset\r\n || document.documentElement.scrollTop\r\n || document.body.scrollTop\r\n || 0;\r\n },\r\n\r\n realOffset: function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.scrollTop || 0;\r\n valueL += element.scrollLeft || 0;\r\n element = element.parentNode;\r\n } while (element);\r\n return [valueL, valueT];\r\n },\r\n\r\n cumulativeOffset: function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n element = element.offsetParent;\r\n } while (element);\r\n return [valueL, valueT];\r\n },\r\n\r\n positionedOffset: function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n element = element.offsetParent;\r\n if (element) {\r\n if(element.tagName==\'BODY\') break;\r\n var p = Element.getStyle(element, \'position\');\r\n if (p == \'relative\' || p == \'absolute\') break;\r\n }\r\n } while (element);\r\n return [valueL, valueT];\r\n },\r\n\r\n offsetParent: function(element) {\r\n if (element.offsetParent) return element.offsetParent;\r\n if (element == document.body) return element;\r\n\r\n while ((element = element.parentNode) && element != document.body)\r\n if (Element.getStyle(element, \'position\') != \'static\')\r\n return element;\r\n\r\n return document.body;\r\n },\r\n\r\n // caches x/y coordinate pair to use with overlap\r\n within: function(element, x, y) {\r\n if (this.includeScrollOffsets)\r\n return this.withinIncludingScrolloffsets(element, x, y);\r\n this.xcomp = x;\r\n this.ycomp = y;\r\n this.offset = this.cumulativeOffset(element);\r\n\r\n return (y >= this.offset[1] &&\r\n y < this.offset[1] + element.offsetHeight &&\r\n x >= this.offset[0] &&\r\n x < this.offset[0] + element.offsetWidth);\r\n },\r\n\r\n withinIncludingScrolloffsets: function(element, x, y) {\r\n var offsetcache = this.realOffset(element);\r\n\r\n this.xcomp = x + offsetcache[0] - this.deltaX;\r\n this.ycomp = y + offsetcache[1] - this.deltaY;\r\n this.offset = this.cumulativeOffset(element);\r\n\r\n return (this.ycomp >= this.offset[1] &&\r\n this.ycomp < this.offset[1] + element.offsetHeight &&\r\n this.xcomp >= this.offset[0] &&\r\n this.xcomp < this.offset[0] + element.offsetWidth);\r\n },\r\n\r\n // within must be called directly before\r\n overlap: function(mode, element) {\r\n if (!mode) return 0;\r\n if (mode == \'vertical\')\r\n return ((this.offset[1] + element.offsetHeight) - this.ycomp) /\r\n element.offsetHeight;\r\n if (mode == \'horizontal\')\r\n return ((this.offset[0] + element.offsetWidth) - this.xcomp) /\r\n element.offsetWidth;\r\n },\r\n\r\n page: function(forElement) {\r\n var valueT = 0, valueL = 0;\r\n\r\n var element = forElement;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n\r\n // Safari fix\r\n if (element.offsetParent==document.body)\r\n if (Element.getStyle(element,\'position\')==\'absolute\') break;\r\n\r\n } while (element = element.offsetParent);\r\n\r\n element = forElement;\r\n do {\r\n if (!window.opera || element.tagName==\'BODY\') {\r\n valueT -= element.scrollTop || 0;\r\n valueL -= element.scrollLeft || 0;\r\n }\r\n } while (element = element.parentNode);\r\n\r\n return [valueL, valueT];\r\n },\r\n\r\n clone: function(source, target) {\r\n var options = Object.extend({\r\n setLeft: true,\r\n setTop: true,\r\n setWidth: true,\r\n setHeight: true,\r\n offsetTop: 0,\r\n offsetLeft: 0\r\n }, arguments[2] || {})\r\n\r\n // find page position of source\r\n source = $(source);\r\n var p = Position.page(source);\r\n\r\n // find coordinate system to use\r\n target = $(target);\r\n var delta = [0, 0];\r\n var parent = null;\r\n // delta [0,0] will do fine with position: fixed elements,\r\n // position:absolute needs offsetParent deltas\r\n if (Element.getStyle(target,\'position\') == \'absolute\') {\r\n parent = Position.offsetParent(target);\r\n delta = Position.page(parent);\r\n }\r\n\r\n // correct by body offsets (fixes Safari)\r\n if (parent == document.body) {\r\n delta[0] -= document.body.offsetLeft;\r\n delta[1] -= document.body.offsetTop;\r\n }\r\n\r\n // set position\r\n if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + \'px\';\r\n if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + \'px\';\r\n if(options.setWidth) target.style.width = source.offsetWidth + \'px\';\r\n if(options.setHeight) target.style.height = source.offsetHeight + \'px\';\r\n },\r\n\r\n absolutize: function(element) {\r\n element = $(element);\r\n if (element.style.position == \'absolute\') return;\r\n Position.prepare();\r\n\r\n var offsets = Position.positionedOffset(element);\r\n var top = offsets[1];\r\n var left = offsets[0];\r\n var width = element.clientWidth;\r\n var height = element.clientHeight;\r\n\r\n element._originalLeft = left - parseFloat(element.style.left || 0);\r\n element._originalTop = top - parseFloat(element.style.top || 0);\r\n element._originalWidth = element.style.width;\r\n element._originalHeight = element.style.height;\r\n\r\n element.style.position = \'absolute\';\r\n element.style.top = top + \'px\';\r\n element.style.left = left + \'px\';\r\n element.style.width = width + \'px\';\r\n element.style.height = height + \'px\';\r\n },\r\n\r\n relativize: function(element) {\r\n element = $(element);\r\n if (element.style.position == \'relative\') return;\r\n Position.prepare();\r\n\r\n element.style.position = \'relative\';\r\n var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);\r\n var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);\r\n\r\n element.style.top = top + \'px\';\r\n element.style.left = left + \'px\';\r\n element.style.height = element._originalHeight;\r\n element.style.width = element._originalWidth;\r\n }\r\n}\r\n\r\n// Safari returns margins on body which is incorrect if the child is absolutely\r\n// positioned. For performance reasons, redefine Position.cumulativeOffset for\r\n// KHTML/WebKit only.\r\nif (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {\r\n Position.cumulativeOffset = function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n if (element.offsetParent == document.body)\r\n if (Element.getStyle(element, \'position\') == \'absolute\') break;\r\n\r\n element = element.offsetParent;\r\n } while (element);\r\n\r\n return [valueL, valueT];\r\n }\r\n}\r\n\r\nElement.addMethods();\r\n\r\n\r\n/* Prototype JavaScript framework, version 1.5.0\r\n * (c) 2005-2007 Sam Stephenson\r\n *\r\n * Prototype is freely distributable under the terms of an MIT-style license.\r\n * For details, see the Prototype web site: http://prototype.conio.net/\r\n *\r\n/*--------------------------------------------------------------------------*/\r\n\r\nvar Prototype = {\r\n Version: \'1.5.0\',\r\n BrowserFeatures: {\r\n XPath: !!document.evaluate\r\n },\r\n\r\n ScriptFragment: \'(?:<script.*?>)((\\n|\\r|.)*?)(?:<\\/script>)\',\r\n emptyFunction: function() {},\r\n K: function(x) { return x }\r\n}\r\n\r\nvar Class = {\r\n create: function() {\r\n return function() {\r\n this.initialize.apply(this, arguments);\r\n }\r\n }\r\n}\r\n\r\nvar Abstract = new Object();\r\n\r\nObject.extend = function(destination, source) {\r\n for (var property in source) {\r\n destination[property] = source[property];\r\n }\r\n return destination;\r\n}\r\n\r\nObject.extend(Object, {\r\n inspect: function(object) {\r\n try {\r\n if (object === undefined) return \'undefined\';\r\n if (object === null) return \'null\';\r\n return object.inspect ? object.inspect() : object.toString();\r\n } catch (e) {\r\n if (e instanceof RangeError) return \'...\';\r\n throw e;\r\n }\r\n },\r\n\r\n keys: function(object) {\r\n var keys = [];\r\n for (var property in object)\r\n keys.push(property);\r\n return keys;\r\n },\r\n\r\n values: function(object) {\r\n var values = [];\r\n for (var property in object)\r\n values.push(object[property]);\r\n return values;\r\n },\r\n\r\n clone: function(object) {\r\n return Object.extend({}, object);\r\n }\r\n});\r\n\r\nFunction.prototype.bind = function() {\r\n var __method = this, args = $A(arguments), object = args.shift();\r\n return function() {\r\n return __method.apply(object, args.concat($A(arguments)));\r\n }\r\n}\r\n\r\nFunction.prototype.bindAsEventListener = function(object) {\r\n var __method = this, args = $A(arguments), object = args.shift();\r\n return function(event) {\r\n return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));\r\n }\r\n}\r\n\r\nObject.extend(Number.prototype, {\r\n toColorPart: function() {\r\n var digits = this.toString(16);\r\n if (this < 16) return \'0\' + digits;\r\n return digits;\r\n },\r\n\r\n succ: function() {\r\n return this + 1;\r\n },\r\n\r\n times: function(iterator) {\r\n $R(0, this, true).each(iterator);\r\n return this;\r\n }\r\n});\r\n\r\nvar Try = {\r\n these: function() {\r\n var returnValue;\r\n\r\n for (var i = 0, length = arguments.length; i < length; i++) {\r\n var lambda = arguments[i];\r\n try {\r\n returnValue = lambda();\r\n break;\r\n } catch (e) {}\r\n }\r\n\r\n return returnValue;\r\n }\r\n}\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nvar PeriodicalExecuter = Class.create();\r\nPeriodicalExecuter.prototype = {\r\n initialize: function(callback, frequency) {\r\n this.callback = callback;\r\n this.frequency = frequency;\r\n this.currentlyExecuting = false;\r\n\r\n this.registerCallback();\r\n },\r\n\r\n registerCallback: function() {\r\n this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r\n },\r\n\r\n stop: function() {\r\n if (!this.timer) return;\r\n clearInterval(this.timer);\r\n this.timer = null;\r\n },\r\n\r\n onTimerEvent: function() {\r\n if (!this.currentlyExecuting) {\r\n try {\r\n this.currentlyExecuting = true;\r\n this.callback(this);\r\n } finally {\r\n this.currentlyExecuting = false;\r\n }\r\n }\r\n }\r\n}\r\nString.interpret = function(value){\r\n return value == null ? \'\' : String(value);\r\n}\r\n\r\nObject.extend(String.prototype, {\r\n gsub: function(pattern, replacement) {\r\n var result = \'\', source = this, match;\r\n replacement = arguments.callee.prepareReplacement(replacement);\r\n\r\n while (source.length > 0) {\r\n if (match = source.match(pattern)) {\r\n result += source.slice(0, match.index);\r\n result += String.interpret(replacement(match));\r\n source = source.slice(match.index + match[0].length);\r\n } else {\r\n result += source, source = \'\';\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n sub: function(pattern, replacement, count) {\r\n replacement = this.gsub.prepareReplacement(replacement);\r\n count = count === undefined ? 1 : count;\r\n\r\n return this.gsub(pattern, function(match) {\r\n if (--count < 0) return match[0];\r\n return replacement(match);\r\n });\r\n },\r\n\r\n scan: function(pattern, iterator) {\r\n this.gsub(pattern, iterator);\r\n return this;\r\n },\r\n\r\n truncate: function(length, truncation) {\r\n length = length || 30;\r\n truncation = truncation === undefined ? \'...\' : truncation;\r\n return this.length > length ?\r\n this.slice(0, length - truncation.length) + truncation : this;\r\n },\r\n\r\n strip: function() {\r\n return this.replace(/^\\s+/, \'\').replace(/\\s+$/, \'\');\r\n },\r\n\r\n stripTags: function() {\r\n return this.replace(/<\\/?[^>]+>/gi, \'\');\r\n },\r\n\r\n stripScripts: function() {\r\n return this.replace(new RegExp(Prototype.ScriptFragment, \'img\'), \'\');\r\n },\r\n\r\n extractScripts: function() {\r\n var matchAll = new RegExp(Prototype.ScriptFragment, \'img\');\r\n var matchOne = new RegExp(Prototype.ScriptFragment, \'im\');\r\n return (this.match(matchAll) || []).map(function(scriptTag) {\r\n return (scriptTag.match(matchOne) || [\'\', \'\'])[1];\r\n });\r\n },\r\n\r\n evalScripts: function() {\r\n return this.extractScripts().map(function(script) { return eval(script) });\r\n },\r\n\r\n escapeHTML: function() {\r\n var div = document.createElement(\'div\');\r\n var text = document.createTextNode(this);\r\n div.appendChild(text);\r\n return div.innerHTML;\r\n },\r\n\r\n unescapeHTML: function() {\r\n var div = document.createElement(\'div\');\r\n div.innerHTML = this.stripTags();\r\n return div.childNodes[0] ? (div.childNodes.length > 1 ?\r\n $A(div.childNodes).inject(\'\',function(memo,node){ return memo+node.nodeValue }) :\r\n div.childNodes[0].nodeValue) : \'\';\r\n },\r\n\r\n toQueryParams: function(separator) {\r\n var match = this.strip().match(/([^?#]*)(#.*)?$/);\r\n if (!match) return {};\r\n\r\n return match[1].split(separator || \'&\').inject({}, function(hash, pair) {\r\n if ((pair = pair.split(\'=\'))[0]) {\r\n var name = decodeURIComponent(pair[0]);\r\n var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;\r\n\r\n if (hash[name] !== undefined) {\r\n if (hash[name].constructor != Array)\r\n hash[name] = [hash[name]];\r\n if (value) hash[name].push(value);\r\n }\r\n else hash[name] = value;\r\n }\r\n return hash;\r\n });\r\n },\r\n\r\n toArray: function() {\r\n return this.split(\'\');\r\n },\r\n\r\n succ: function() {\r\n return this.slice(0, this.length - 1) +\r\n String.fromCharCode(this.charCodeAt(this.length - 1) + 1);\r\n },\r\n\r\n camelize: function() {\r\n var parts = this.split(\'-\'), len = parts.length;\r\n if (len == 1) return parts[0];\r\n\r\n var camelized = this.charAt(0) == \'-\'\r\n ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)\r\n : parts[0];\r\n\r\n for (var i = 1; i < len; i++)\r\n camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);\r\n\r\n return camelized;\r\n },\r\n\r\n capitalize: function(){\r\n return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();\r\n },\r\n\r\n underscore: function() {\r\n return this.gsub(/::/, \'/\').gsub(/([A-Z]+)([A-Z][a-z])/,\'#{1}_#{2}\').gsub(/([a-z\\d])([A-Z])/,\'#{1}_#{2}\').gsub(/-/,\'_\').toLowerCase();\r\n },\r\n\r\n dasherize: function() {\r\n return this.gsub(/_/,\'-\');\r\n },\r\n\r\n inspect: function(useDoubleQuotes) {\r\n var escapedString = this.replace(/\\\\/g, \'\\\\\\\\\');\r\n if (useDoubleQuotes)\r\n return \'\"\' + escapedString.replace(/\"/g, \'\\\\\"\') + \'\"\';\r\n else\r\n return \"\'\" + escapedString.replace(/\'/g, \'\\\\\\\'\') + \"\'\";\r\n }\r\n});\r\n\r\nString.prototype.gsub.prepareReplacement = function(replacement) {\r\n if (typeof replacement == \'function\') return replacement;\r\n var template = new Template(replacement);\r\n return function(match) { return template.evaluate(match) };\r\n}\r\n\r\nString.prototype.parseQuery = String.prototype.toQueryParams;\r\n\r\nvar Template = Class.create();\r\nTemplate.Pattern = /(^|.|\\r|\\n)(#\\{(.*?)\\})/;\r\nTemplate.prototype = {\r\n initialize: function(template, pattern) {\r\n this.template = template.toString();\r\n this.pattern = pattern || Template.Pattern;\r\n },\r\n\r\n evaluate: function(object) {\r\n return this.template.gsub(this.pattern, function(match) {\r\n var before = match[1];\r\n if (before == \'\\\\\') return match[2];\r\n return before + String.interpret(object[match[3]]);\r\n });\r\n }\r\n}\r\n\r\nvar $break = new Object();\r\nvar $continue = new Object();\r\n\r\nvar Enumerable = {\r\n each: function(iterator) {\r\n var index = 0;\r\n try {\r\n this._each(function(value) {\r\n try {\r\n iterator(value, index++);\r\n } catch (e) {\r\n if (e != $continue) throw e;\r\n }\r\n });\r\n } catch (e) {\r\n if (e != $break) throw e;\r\n }\r\n return this;\r\n },\r\n\r\n eachSlice: function(number, iterator) {\r\n var index = -number, slices = [], array = this.toArray();\r\n while ((index += number) < array.length)\r\n slices.push(array.slice(index, index+number));\r\n return slices.map(iterator);\r\n },\r\n\r\n all: function(iterator) {\r\n var result = true;\r\n this.each(function(value, index) {\r\n result = result && !!(iterator || Prototype.K)(value, index);\r\n if (!result) throw $break;\r\n });\r\n return result;\r\n },\r\n\r\n any: function(iterator) {\r\n var result = false;\r\n this.each(function(value, index) {\r\n if (result = !!(iterator || Prototype.K)(value, index))\r\n throw $break;\r\n });\r\n return result;\r\n },\r\n\r\n collect: function(iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n results.push((iterator || Prototype.K)(value, index));\r\n });\r\n return results;\r\n },\r\n\r\n detect: function(iterator) {\r\n var result;\r\n this.each(function(value, index) {\r\n if (iterator(value, index)) {\r\n result = value;\r\n throw $break;\r\n }\r\n });\r\n return result;\r\n },\r\n\r\n findAll: function(iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n if (iterator(value, index))\r\n results.push(value);\r\n });\r\n return results;\r\n },\r\n\r\n grep: function(pattern, iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n var stringValue = value.toString();\r\n if (stringValue.match(pattern))\r\n results.push((iterator || Prototype.K)(value, index));\r\n })\r\n return results;\r\n },\r\n\r\n include: function(object) {\r\n var found = false;\r\n this.each(function(value) {\r\n if (value == object) {\r\n found = true;\r\n throw $break;\r\n }\r\n });\r\n return found;\r\n },\r\n\r\n inGroupsOf: function(number, fillWith) {\r\n fillWith = fillWith === undefined ? null : fillWith;\r\n return this.eachSlice(number, function(slice) {\r\n while(slice.length < number) slice.push(fillWith);\r\n return slice;\r\n });\r\n },\r\n\r\n inject: function(memo, iterator) {\r\n this.each(function(value, index) {\r\n memo = iterator(memo, value, index);\r\n });\r\n return memo;\r\n },\r\n\r\n invoke: function(method) {\r\n var args = $A(arguments).slice(1);\r\n return this.map(function(value) {\r\n return value[method].apply(value, args);\r\n });\r\n },\r\n\r\n max: function(iterator) {\r\n var result;\r\n this.each(function(value, index) {\r\n value = (iterator || Prototype.K)(value, index);\r\n if (result == undefined || value >= result)\r\n result = value;\r\n });\r\n return result;\r\n },\r\n\r\n min: function(iterator) {\r\n var result;\r\n this.each(function(value, index) {\r\n value = (iterator || Prototype.K)(value, index);\r\n if (result == undefined || value < result)\r\n result = value;\r\n });\r\n return result;\r\n },\r\n\r\n partition: function(iterator) {\r\n var trues = [], falses = [];\r\n this.each(function(value, index) {\r\n ((iterator || Prototype.K)(value, index) ?\r\n trues : falses).push(value);\r\n });\r\n return [trues, falses];\r\n },\r\n\r\n pluck: function(property) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n results.push(value[property]);\r\n });\r\n return results;\r\n },\r\n\r\n reject: function(iterator) {\r\n var results = [];\r\n this.each(function(value, index) {\r\n if (!iterator(value, index))\r\n results.push(value);\r\n });\r\n return results;\r\n },\r\n\r\n sortBy: function(iterator) {\r\n return this.map(function(value, index) {\r\n return {value: value, criteria: iterator(value, index)};\r\n }).sort(function(left, right) {\r\n var a = left.criteria, b = right.criteria;\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n }).pluck(\'value\');\r\n },\r\n\r\n toArray: function() {\r\n return this.map();\r\n },\r\n\r\n zip: function() {\r\n var iterator = Prototype.K, args = $A(arguments);\r\n if (typeof args.last() == \'function\')\r\n iterator = args.pop();\r\n\r\n var collections = [this].concat(args).map($A);\r\n return this.map(function(value, index) {\r\n return iterator(collections.pluck(index));\r\n });\r\n },\r\n\r\n size: function() {\r\n return this.toArray().length;\r\n },\r\n\r\n inspect: function() {\r\n return \'#<Enumerable:\' + this.toArray().inspect() + \'>\';\r\n }\r\n}\r\n\r\nObject.extend(Enumerable, {\r\n map: Enumerable.collect,\r\n find: Enumerable.detect,\r\n select: Enumerable.findAll,\r\n member: Enumerable.include,\r\n entries: Enumerable.toArray\r\n});\r\nvar $A = Array.from = function(iterable) {\r\n if (!iterable) return [];\r\n if (iterable.toArray) {\r\n return iterable.toArray();\r\n } else {\r\n var results = [];\r\n for (var i = 0, length = iterable.length; i < length; i++)\r\n results.push(iterable[i]);\r\n return results;\r\n }\r\n}\r\n\r\nObject.extend(Array.prototype, Enumerable);\r\n\r\nif (!Array.prototype._reverse)\r\n Array.prototype._reverse = Array.prototype.reverse;\r\n\r\nObject.extend(Array.prototype, {\r\n _each: function(iterator) {\r\n for (var i = 0, length = this.length; i < length; i++)\r\n iterator(this[i]);\r\n },\r\n\r\n clear: function() {\r\n this.length = 0;\r\n return this;\r\n },\r\n\r\n first: function() {\r\n return this[0];\r\n },\r\n\r\n last: function() {\r\n return this[this.length - 1];\r\n },\r\n\r\n compact: function() {\r\n return this.select(function(value) {\r\n return value != null;\r\n });\r\n },\r\n\r\n flatten: function() {\r\n return this.inject([], function(array, value) {\r\n return array.concat(value && value.constructor == Array ?\r\n value.flatten() : [value]);\r\n });\r\n },\r\n\r\n without: function() {\r\n var values = $A(arguments);\r\n return this.select(function(value) {\r\n return !values.include(value);\r\n });\r\n },\r\n\r\n indexOf: function(object) {\r\n for (var i = 0, length = this.length; i < length; i++)\r\n if (this[i] == object) return i;\r\n return -1;\r\n },\r\n\r\n reverse: function(inline) {\r\n return (inline !== false ? this : this.toArray())._reverse();\r\n },\r\n\r\n reduce: function() {\r\n return this.length > 1 ? this : this[0];\r\n },\r\n\r\n uniq: function() {\r\n return this.inject([], function(array, value) {\r\n return array.include(value) ? array : array.concat([value]);\r\n });\r\n },\r\n\r\n clone: function() {\r\n return [].concat(this);\r\n },\r\n\r\n size: function() {\r\n return this.length;\r\n },\r\n\r\n inspect: function() {\r\n return \'[\' + this.map(Object.inspect).join(\', \') + \']\';\r\n }\r\n});\r\n\r\nArray.prototype.toArray = Array.prototype.clone;\r\n\r\nfunction $w(string){\r\n string = string.strip();\r\n return string ? string.split(/\\s+/) : [];\r\n}\r\n\r\nif(window.opera){\r\n Array.prototype.concat = function(){\r\n var array = [];\r\n for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);\r\n for(var i = 0, length = arguments.length; i < length; i++) {\r\n if(arguments[i].constructor == Array) {\r\n for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)\r\n array.push(arguments[i][j]);\r\n } else {\r\n array.push(arguments[i]);\r\n }\r\n }\r\n return array;\r\n }\r\n}\r\nvar Hash = function(obj) {\r\n Object.extend(this, obj || {});\r\n};\r\n\r\nObject.extend(Hash, {\r\n toQueryString: function(obj) {\r\n var parts = [];\r\n\r\n this.prototype._each.call(obj, function(pair) {\r\n if (!pair.key) return;\r\n\r\n if (pair.value && pair.value.constructor == Array) {\r\n var values = pair.value.compact();\r\n if (values.length < 2) pair.value = values.reduce();\r\n else {\r\n key = encodeURIComponent(pair.key);\r\n values.each(function(value) {\r\n value = value != undefined ? encodeURIComponent(value) : \'\';\r\n parts.push(key + \'=\' + encodeURIComponent(value));\r\n });\r\n return;\r\n }\r\n }\r\n if (pair.value == undefined) pair[1] = \'\';\r\n parts.push(pair.map(encodeURIComponent).join(\'=\'));\r\n });\r\n\r\n return parts.join(\'&\');\r\n }\r\n});\r\n\r\nObject.extend(Hash.prototype, Enumerable);\r\nObject.extend(Hash.prototype, {\r\n _each: function(iterator) {\r\n for (var key in this) {\r\n var value = this[key];\r\n if (value && value == Hash.prototype[key]) continue;\r\n\r\n var pair = [key, value];\r\n pair.key = key;\r\n pair.value = value;\r\n iterator(pair);\r\n }\r\n },\r\n\r\n keys: function() {\r\n return this.pluck(\'key\');\r\n },\r\n\r\n values: function() {\r\n return this.pluck(\'value\');\r\n },\r\n\r\n merge: function(hash) {\r\n return $H(hash).inject(this, function(mergedHash, pair) {\r\n mergedHash[pair.key] = pair.value;\r\n return mergedHash;\r\n });\r\n },\r\n\r\n remove: function() {\r\n var result;\r\n for(var i = 0, length = arguments.length; i < length; i++) {\r\n var value = this[arguments[i]];\r\n if (value !== undefined){\r\n if (result === undefined) result = value;\r\n else {\r\n if (result.constructor != Array) result = [result];\r\n result.push(value)\r\n }\r\n }\r\n delete this[arguments[i]];\r\n }\r\n return result;\r\n },\r\n\r\n toQueryString: function() {\r\n return Hash.toQueryString(this);\r\n },\r\n\r\n inspect: function() {\r\n return \'#<Hash:{\' + this.map(function(pair) {\r\n return pair.map(Object.inspect).join(\': \');\r\n }).join(\', \') + \'}>\';\r\n }\r\n});\r\n\r\nfunction $H(object) {\r\n if (object && object.constructor == Hash) return object;\r\n return new Hash(object);\r\n};\r\nObjectRange = Class.create();\r\nObject.extend(ObjectRange.prototype, Enumerable);\r\nObject.extend(ObjectRange.prototype, {\r\n initialize: function(start, end, exclusive) {\r\n this.start = start;\r\n this.end = end;\r\n this.exclusive = exclusive;\r\n },\r\n\r\n _each: function(iterator) {\r\n var value = this.start;\r\n while (this.include(value)) {\r\n iterator(value);\r\n value = value.succ();\r\n }\r\n },\r\n\r\n include: function(value) {\r\n if (value < this.start)\r\n return false;\r\n if (this.exclusive)\r\n return value < this.end;\r\n return value <= this.end;\r\n }\r\n});\r\n\r\nvar $R = function(start, end, exclusive) {\r\n return new ObjectRange(start, end, exclusive);\r\n}\r\n\r\nvar Ajax = {\r\n getTransport: function() {\r\n return Try.these(\r\n function() {return new XMLHttpRequest()},\r\n function() {return new ActiveXObject(\'Msxml2.XMLHTTP\')},\r\n function() {return new ActiveXObject(\'Microsoft.XMLHTTP\')}\r\n ) || false;\r\n },\r\n\r\n activeRequestCount: 0\r\n}\r\n\r\nAjax.Responders = {\r\n responders: [],\r\n\r\n _each: function(iterator) {\r\n this.responders._each(iterator);\r\n },\r\n\r\n register: function(responder) {\r\n if (!this.include(responder))\r\n this.responders.push(responder);\r\n },\r\n\r\n unregister: function(responder) {\r\n this.responders = this.responders.without(responder);\r\n },\r\n\r\n dispatch: function(callback, request, transport, json) {\r\n this.each(function(responder) {\r\n if (typeof responder[callback] == \'function\') {\r\n try {\r\n responder[callback].apply(responder, [request, transport, json]);\r\n } catch (e) {}\r\n }\r\n });\r\n }\r\n};\r\n\r\nObject.extend(Ajax.Responders, Enumerable);\r\n\r\nAjax.Responders.register({\r\n onCreate: function() {\r\n Ajax.activeRequestCount++;\r\n },\r\n onComplete: function() {\r\n Ajax.activeRequestCount--;\r\n }\r\n});\r\n\r\nAjax.Base = function() {};\r\nAjax.Base.prototype = {\r\n setOptions: function(options) {\r\n this.options = {\r\n method: \'post\',\r\n asynchronous: true,\r\n contentType: \'application/x-www-form-urlencoded\',\r\n encoding: \'UTF-8\',\r\n parameters: \'\'\r\n }\r\n Object.extend(this.options, options || {});\r\n\r\n this.options.method = this.options.method.toLowerCase();\r\n if (typeof this.options.parameters == \'string\')\r\n this.options.parameters = this.options.parameters.toQueryParams();\r\n }\r\n}\r\n\r\nAjax.Request = Class.create();\r\nAjax.Request.Events =\r\n [\'Uninitialized\', \'Loading\', \'Loaded\', \'Interactive\', \'Complete\'];\r\n\r\nAjax.Request.prototype = Object.extend(new Ajax.Base(), {\r\n _complete: false,\r\n\r\n initialize: function(url, options) {\r\n this.transport = Ajax.getTransport();\r\n this.setOptions(options);\r\n this.request(url);\r\n },\r\n\r\n request: function(url) {\r\n this.url = url;\r\n this.method = this.options.method;\r\n var params = this.options.parameters;\r\n\r\n if (![\'get\', \'post\'].include(this.method)) {\r\n // simulate other verbs over post\r\n params[\'_method\'] = this.method;\r\n this.method = \'post\';\r\n }\r\n\r\n params = Hash.toQueryString(params);\r\n if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += \'&_=\'\r\n\r\n // when GET, append parameters to URL\r\n if (this.method == \'get\' && params)\r\n this.url += (this.url.indexOf(\'?\') > -1 ? \'&\' : \'?\') + params;\r\n\r\n try {\r\n Ajax.Responders.dispatch(\'onCreate\', this, this.transport);\r\n\r\n this.transport.open(this.method.toUpperCase(), this.url,\r\n this.options.asynchronous);\r\n\r\n if (this.options.asynchronous)\r\n setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);\r\n\r\n this.transport.onreadystatechange = this.onStateChange.bind(this);\r\n this.setRequestHeaders();\r\n\r\n var body = this.method == \'post\' ? (this.options.postBody || params) : null;\r\n\r\n this.transport.send(body);\r\n\r\n /* Force Firefox to handle ready state 4 for synchronous requests */\r\n if (!this.options.asynchronous && this.transport.overrideMimeType)\r\n this.onStateChange();\r\n\r\n }\r\n catch (e) {\r\n this.dispatchException(e);\r\n }\r\n },\r\n\r\n onStateChange: function() {\r\n var readyState = this.transport.readyState;\r\n if (readyState > 1 && !((readyState == 4) && this._complete))\r\n this.respondToReadyState(this.transport.readyState);\r\n },\r\n\r\n setRequestHeaders: function() {\r\n var headers = {\r\n \'X-Requested-With\': \'XMLHttpRequest\',\r\n \'X-Prototype-Version\': Prototype.Version,\r\n \'Accept\': \'text/javascript, text/html, application/xml, text/xml, */*\'\r\n };\r\n\r\n if (this.method == \'post\') {\r\n headers[\'Content-type\'] = this.options.contentType +\r\n (this.options.encoding ? \'; charset=\' + this.options.encoding : \'\');\r\n\r\n /* Force \"Connection: close\" for older Mozilla browsers to work\r\n * around a bug where XMLHttpRequest sends an incorrect\r\n * Content-length header. See Mozilla Bugzilla #246651.\r\n */\r\n if (this.transport.overrideMimeType &&\r\n (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005)\r\n headers[\'Connection\'] = \'close\';\r\n }\r\n\r\n // user-defined headers\r\n if (typeof this.options.requestHeaders == \'object\') {\r\n var extras = this.options.requestHeaders;\r\n\r\n if (typeof extras.push == \'function\')\r\n for (var i = 0, length = extras.length; i < length; i += 2)\r\n headers[extras[i]] = extras[i+1];\r\n else\r\n $H(extras).each(function(pair) { headers[pair.key] = pair.value });\r\n }\r\n\r\n for (var name in headers)\r\n this.transport.setRequestHeader(name, headers[name]);\r\n },\r\n\r\n success: function() {\r\n return !this.transport.status\r\n || (this.transport.status >= 200 && this.transport.status < 300);\r\n },\r\n\r\n respondToReadyState: function(readyState) {\r\n var state = Ajax.Request.Events[readyState];\r\n var transport = this.transport, json = this.evalJSON();\r\n\r\n if (state == \'Complete\') {\r\n try {\r\n this._complete = true;\r\n (this.options[\'on\' + this.transport.status]\r\n || this.options[\'on\' + (this.success() ? \'Success\' : \'Failure\')]\r\n || Prototype.emptyFunction)(transport, json);\r\n } catch (e) {\r\n this.dispatchException(e);\r\n }\r\n\r\n if ((this.getHeader(\'Content-type\') || \'text/javascript\').strip().\r\n match(/^(text|application)\\/(x-)?(java|ecma)script(;.*)?$/i))\r\n this.evalResponse();\r\n }\r\n\r\n try {\r\n (this.options[\'on\' + state] || Prototype.emptyFunction)(transport, json);\r\n Ajax.Responders.dispatch(\'on\' + state, this, transport, json);\r\n } catch (e) {\r\n this.dispatchException(e);\r\n }\r\n\r\n if (state == \'Complete\') {\r\n // avoid memory leak in MSIE: clean up\r\n this.transport.onreadystatechange = Prototype.emptyFunction;\r\n }\r\n },\r\n\r\n getHeader: function(name) {\r\n try {\r\n return this.transport.getResponseHeader(name);\r\n } catch (e) { return null }\r\n },\r\n\r\n evalJSON: function() {\r\n try {\r\n var json = this.getHeader(\'X-JSON\');\r\n return json ? eval(\'(\' + json + \')\') : null;\r\n } catch (e) { return null }\r\n },\r\n\r\n evalResponse: function() {\r\n try {\r\n return eval(this.transport.responseText);\r\n } catch (e) {\r\n this.dispatchException(e);\r\n }\r\n },\r\n\r\n dispatchException: function(exception) {\r\n (this.options.onException || Prototype.emptyFunction)(this, exception);\r\n Ajax.Responders.dispatch(\'onException\', this, exception);\r\n }\r\n});\r\n\r\nAjax.Updater = Class.create();\r\n\r\nObject.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {\r\n initialize: function(container, url, options) {\r\n this.container = {\r\n success: (container.success || container),\r\n failure: (container.failure || (container.success ? null : container))\r\n }\r\n\r\n this.transport = Ajax.getTransport();\r\n this.setOptions(options);\r\n\r\n var onComplete = this.options.onComplete || Prototype.emptyFunction;\r\n this.options.onComplete = (function(transport, param) {\r\n this.updateContent();\r\n onComplete(transport, param);\r\n }).bind(this);\r\n\r\n this.request(url);\r\n },\r\n\r\n updateContent: function() {\r\n var receiver = this.container[this.success() ? \'success\' : \'failure\'];\r\n var response = this.transport.responseText;\r\n\r\n if (!this.options.evalScripts) response = response.stripScripts();\r\n\r\n if (receiver = $(receiver)) {\r\n if (this.options.insertion)\r\n new this.options.insertion(receiver, response);\r\n else\r\n receiver.update(response);\r\n }\r\n\r\n if (this.success()) {\r\n if (this.onComplete)\r\n setTimeout(this.onComplete.bind(this), 10);\r\n }\r\n }\r\n});\r\n\r\nAjax.PeriodicalUpdater = Class.create();\r\nAjax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {\r\n initialize: function(container, url, options) {\r\n this.setOptions(options);\r\n this.onComplete = this.options.onComplete;\r\n\r\n this.frequency = (this.options.frequency || 2);\r\n this.decay = (this.options.decay || 1);\r\n\r\n this.updater = {};\r\n this.container = container;\r\n this.url = url;\r\n\r\n this.start();\r\n },\r\n\r\n start: function() {\r\n this.options.onComplete = this.updateComplete.bind(this);\r\n this.onTimerEvent();\r\n },\r\n\r\n stop: function() {\r\n this.updater.options.onComplete = undefined;\r\n clearTimeout(this.timer);\r\n (this.onComplete || Prototype.emptyFunction).apply(this, arguments);\r\n },\r\n\r\n updateComplete: function(request) {\r\n if (this.options.decay) {\r\n this.decay = (request.responseText == this.lastText ?\r\n this.decay * this.options.decay : 1);\r\n\r\n this.lastText = request.responseText;\r\n }\r\n this.timer = setTimeout(this.onTimerEvent.bind(this),\r\n this.decay * this.frequency * 1000);\r\n },\r\n\r\n onTimerEvent: function() {\r\n this.updater = new Ajax.Updater(this.container, this.url, this.options);\r\n }\r\n});\r\nfunction $(element) {\r\n if (arguments.length > 1) {\r\n for (var i = 0, elements = [], length = arguments.length; i < length; i++)\r\n elements.push($(arguments[i]));\r\n return elements;\r\n }\r\n if (typeof element == \'string\')\r\n element = document.getElementById(element);\r\n return Element.extend(element);\r\n}\r\n\r\nif (Prototype.BrowserFeatures.XPath) {\r\n document._getElementsByXPath = function(expression, parentElement) {\r\n var results = [];\r\n var query = document.evaluate(expression, $(parentElement) || document,\r\n null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\r\n for (var i = 0, length = query.snapshotLength; i < length; i++)\r\n results.push(query.snapshotItem(i));\r\n return results;\r\n };\r\n}\r\n\r\ndocument.getElementsByClassName = function(className, parentElement) {\r\n if (Prototype.BrowserFeatures.XPath) {\r\n var q = \".//*[contains(concat(\' \', @class, \' \'), \' \" + className + \" \')]\";\r\n return document._getElementsByXPath(q, parentElement);\r\n } else {\r\n var children = ($(parentElement) || document.body).getElementsByTagName(\'*\');\r\n var elements = [], child;\r\n for (var i = 0, length = children.length; i < length; i++) {\r\n child = children[i];\r\n if (Element.hasClassName(child, className))\r\n elements.push(Element.extend(child));\r\n }\r\n return elements;\r\n }\r\n};\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nif (!window.Element)\r\n var Element = new Object();\r\n\r\nElement.extend = function(element) {\r\n if (!element || _nativeExtensions || element.nodeType == 3) return element;\r\n\r\n if (!element._extended && element.tagName && element != window) {\r\n var methods = Object.clone(Element.Methods), cache = Element.extend.cache;\r\n\r\n if (element.tagName == \'FORM\')\r\n Object.extend(methods, Form.Methods);\r\n if ([\'INPUT\', \'TEXTAREA\', \'SELECT\'].include(element.tagName))\r\n Object.extend(methods, Form.Element.Methods);\r\n\r\n Object.extend(methods, Element.Methods.Simulated);\r\n\r\n for (var property in methods) {\r\n var value = methods[property];\r\n if (typeof value == \'function\' && !(property in element))\r\n element[property] = cache.findOrStore(value);\r\n }\r\n }\r\n\r\n element._extended = true;\r\n return element;\r\n};\r\n\r\nElement.extend.cache = {\r\n findOrStore: function(value) {\r\n return this[value] = this[value] || function() {\r\n return value.apply(null, [this].concat($A(arguments)));\r\n }\r\n }\r\n};\r\n\r\nElement.Methods = {\r\n visible: function(element) {\r\n return $(element).style.display != \'none\';\r\n },\r\n\r\n toggle: function(element) {\r\n element = $(element);\r\n Element[Element.visible(element) ? \'hide\' : \'show\'](element);\r\n return element;\r\n },\r\n\r\n hide: function(element) {\r\n $(element).style.display = \'none\';\r\n return element;\r\n },\r\n\r\n show: function(element) {\r\n $(element).style.display = \'\';\r\n return element;\r\n },\r\n\r\n remove: function(element) {\r\n element = $(element);\r\n element.parentNode.removeChild(element);\r\n return element;\r\n },\r\n\r\n update: function(element, html) {\r\n html = typeof html == \'undefined\' ? \'\' : html.toString();\r\n $(element).innerHTML = html.stripScripts();\r\n setTimeout(function() {html.evalScripts()}, 10);\r\n return element;\r\n },\r\n\r\n replace: function(element, html) {\r\n element = $(element);\r\n html = typeof html == \'undefined\' ? \'\' : html.toString();\r\n if (element.outerHTML) {\r\n element.outerHTML = html.stripScripts();\r\n } else {\r\n var range = element.ownerDocument.createRange();\r\n range.selectNodeContents(element);\r\n element.parentNode.replaceChild(\r\n range.createContextualFragment(html.stripScripts()), element);\r\n }\r\n setTimeout(function() {html.evalScripts()}, 10);\r\n return element;\r\n },\r\n\r\n inspect: function(element) {\r\n element = $(element);\r\n var result = \'<\' + element.tagName.toLowerCase();\r\n $H({\'id\': \'id\', \'className\': \'class\'}).each(function(pair) {\r\n var property = pair.first(), attribute = pair.last();\r\n var value = (element[property] || \'\').toString();\r\n if (value) result += \' \' + attribute + \'=\' + value.inspect(true);\r\n });\r\n return result + \'>\';\r\n },\r\n\r\n recursivelyCollect: function(element, property) {\r\n element = $(element);\r\n var elements = [];\r\n while (element = element[property])\r\n if (element.nodeType == 1)\r\n elements.push(Element.extend(element));\r\n return elements;\r\n },\r\n\r\n ancestors: function(element) {\r\n return $(element).recursivelyCollect(\'parentNode\');\r\n },\r\n\r\n descendants: function(element) {\r\n return $A($(element).getElementsByTagName(\'*\'));\r\n },\r\n\r\n immediateDescendants: function(element) {\r\n if (!(element = $(element).firstChild)) return [];\r\n while (element && element.nodeType != 1) element = element.nextSibling;\r\n if (element) return [element].concat($(element).nextSiblings());\r\n return [];\r\n },\r\n\r\n previousSiblings: function(element) {\r\n return $(element).recursivelyCollect(\'previousSibling\');\r\n },\r\n\r\n nextSiblings: function(element) {\r\n return $(element).recursivelyCollect(\'nextSibling\');\r\n },\r\n\r\n siblings: function(element) {\r\n element = $(element);\r\n return element.previousSiblings().reverse().concat(element.nextSiblings());\r\n },\r\n\r\n match: function(element, selector) {\r\n if (typeof selector == \'string\')\r\n selector = new Selector(selector);\r\n return selector.match($(element));\r\n },\r\n\r\n up: function(element, expression, index) {\r\n return Selector.findElement($(element).ancestors(), expression, index);\r\n },\r\n\r\n down: function(element, expression, index) {\r\n return Selector.findElement($(element).descendants(), expression, index);\r\n },\r\n\r\n previous: function(element, expression, index) {\r\n return Selector.findElement($(element).previousSiblings(), expression, index);\r\n },\r\n\r\n next: function(element, expression, index) {\r\n return Selector.findElement($(element).nextSiblings(), expression, index);\r\n },\r\n\r\n getElementsBySelector: function() {\r\n var args = $A(arguments), element = $(args.shift());\r\n return Selector.findChildElements(element, args);\r\n },\r\n\r\n getElementsByClassName: function(element, className) {\r\n return document.getElementsByClassName(className, element);\r\n },\r\n\r\n readAttribute: function(element, name) {\r\n element = $(element);\r\n if (document.all && !window.opera) {\r\n var t = Element._attributeTranslations;\r\n if (t.values[name]) return t.values[name](element, name);\r\n if (t.names[name]) name = t.names[name];\r\n var attribute = element.attributes[name];\r\n if(attribute) return attribute.nodeValue;\r\n }\r\n return element.getAttribute(name);\r\n },\r\n\r\n getHeight: function(element) {\r\n return $(element).getDimensions().height;\r\n },\r\n\r\n getWidth: function(element) {\r\n return $(element).getDimensions().width;\r\n },\r\n\r\n classNames: function(element) {\r\n return new Element.ClassNames(element);\r\n },\r\n\r\n hasClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n var elementClassName = element.className;\r\n if (elementClassName.length == 0) return false;\r\n if (elementClassName == className ||\r\n elementClassName.match(new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\")))\r\n return true;\r\n return false;\r\n },\r\n\r\n addClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n Element.classNames(element).add(className);\r\n return element;\r\n },\r\n\r\n removeClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n Element.classNames(element).remove(className);\r\n return element;\r\n },\r\n\r\n toggleClassName: function(element, className) {\r\n if (!(element = $(element))) return;\r\n Element.classNames(element)[element.hasClassName(className) ? \'remove\' : \'add\'](className);\r\n return element;\r\n },\r\n\r\n observe: function() {\r\n Event.observe.apply(Event, arguments);\r\n return $A(arguments).first();\r\n },\r\n\r\n stopObserving: function() {\r\n Event.stopObserving.apply(Event, arguments);\r\n return $A(arguments).first();\r\n },\r\n\r\n // removes whitespace-only text node children\r\n cleanWhitespace: function(element) {\r\n element = $(element);\r\n var node = element.firstChild;\r\n while (node) {\r\n var nextNode = node.nextSibling;\r\n if (node.nodeType == 3 && !/\\S/.test(node.nodeValue))\r\n element.removeChild(node);\r\n node = nextNode;\r\n }\r\n return element;\r\n },\r\n\r\n empty: function(element) {\r\n return $(element).innerHTML.match(/^\\s*$/);\r\n },\r\n\r\n descendantOf: function(element, ancestor) {\r\n element = $(element), ancestor = $(ancestor);\r\n while (element = element.parentNode)\r\n if (element == ancestor) return true;\r\n return false;\r\n },\r\n\r\n scrollTo: function(element) {\r\n element = $(element);\r\n var pos = Position.cumulativeOffset(element);\r\n window.scrollTo(pos[0], pos[1]);\r\n return element;\r\n },\r\n\r\n getStyle: function(element, style) {\r\n element = $(element);\r\n if ([\'float\',\'cssFloat\'].include(style))\r\n style = (typeof element.style.styleFloat != \'undefined\' ? \'styleFloat\' : \'cssFloat\');\r\n style = style.camelize();\r\n var value = element.style[style];\r\n if (!value) {\r\n if (document.defaultView && document.defaultView.getComputedStyle) {\r\n var css = document.defaultView.getComputedStyle(element, null);\r\n value = css ? css[style] : null;\r\n } else if (element.currentStyle) {\r\n value = element.currentStyle[style];\r\n }\r\n }\r\n\r\n if((value == \'auto\') && [\'width\',\'height\'].include(style) && (element.getStyle(\'display\') != \'none\'))\r\n value = element[\'offset\'+style.capitalize()] + \'px\';\r\n\r\n if (window.opera && [\'left\', \'top\', \'right\', \'bottom\'].include(style))\r\n if (Element.getStyle(element, \'position\') == \'static\') value = \'auto\';\r\n if(style == \'opacity\') {\r\n if(value) return parseFloat(value);\r\n if(value = (element.getStyle(\'filter\') || \'\').match(/alpha\\(opacity=(.*)\\)/))\r\n if(value[1]) return parseFloat(value[1]) / 100;\r\n return 1.0;\r\n }\r\n return value == \'auto\' ? null : value;\r\n },\r\n\r\n setStyle: function(element, style) {\r\n element = $(element);\r\n for (var name in style) {\r\n var value = style[name];\r\n if(name == \'opacity\') {\r\n if (value == 1) {\r\n value = (/Gecko/.test(navigator.userAgent) &&\r\n !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera)\r\n element.style.filter = element.getStyle(\'filter\').replace(/alpha\\([^\\)]*\\)/gi,\'\');\r\n } else if(value === \'\') {\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera)\r\n element.style.filter = element.getStyle(\'filter\').replace(/alpha\\([^\\)]*\\)/gi,\'\');\r\n } else {\r\n if(value < 0.00001) value = 0;\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera)\r\n element.style.filter = element.getStyle(\'filter\').replace(/alpha\\([^\\)]*\\)/gi,\'\') +\r\n \'alpha(opacity=\'+value*100+\')\';\r\n }\r\n } else if([\'float\',\'cssFloat\'].include(name)) name = (typeof element.style.styleFloat != \'undefined\') ? \'styleFloat\' : \'cssFloat\';\r\n element.style[name.camelize()] = value;\r\n }\r\n return element;\r\n },\r\n\r\n getDimensions: function(element) {\r\n element = $(element);\r\n var display = $(element).getStyle(\'display\');\r\n if (display != \'none\' && display != null) // Safari bug\r\n return {width: element.offsetWidth, height: element.offsetHeight};\r\n\r\n // All *Width and *Height properties give 0 on elements with display none,\r\n // so enable the element temporarily\r\n var els = element.style;\r\n var originalVisibility = els.visibility;\r\n var originalPosition = els.position;\r\n var originalDisplay = els.display;\r\n els.visibility = \'hidden\';\r\n els.position = \'absolute\';\r\n els.display = \'block\';\r\n var originalWidth = element.clientWidth;\r\n var originalHeight = element.clientHeight;\r\n els.display = originalDisplay;\r\n els.position = originalPosition;\r\n els.visibility = originalVisibility;\r\n return {width: originalWidth, height: originalHeight};\r\n },\r\n\r\n makePositioned: function(element) {\r\n element = $(element);\r\n var pos = Element.getStyle(element, \'position\');\r\n if (pos == \'static\' || !pos) {\r\n element._madePositioned = true;\r\n element.style.position = \'relative\';\r\n // Opera returns the offset relative to the positioning context, when an\r\n // element is position relative but top and left have not been defined\r\n if (window.opera) {\r\n element.style.top = 0;\r\n element.style.left = 0;\r\n }\r\n }\r\n return element;\r\n },\r\n\r\n undoPositioned: function(element) {\r\n element = $(element);\r\n if (element._madePositioned) {\r\n element._madePositioned = undefined;\r\n element.style.position =\r\n element.style.top =\r\n element.style.left =\r\n element.style.bottom =\r\n element.style.right = \'\';\r\n }\r\n return element;\r\n },\r\n\r\n makeClipping: function(element) {\r\n element = $(element);\r\n if (element._overflow) return element;\r\n element._overflow = element.style.overflow || \'auto\';\r\n if ((Element.getStyle(element, \'overflow\') || \'visible\') != \'hidden\')\r\n element.style.overflow = \'hidden\';\r\n return element;\r\n },\r\n\r\n undoClipping: function(element) {\r\n element = $(element);\r\n if (!element._overflow) return element;\r\n element.style.overflow = element._overflow == \'auto\' ? \'\' : element._overflow;\r\n element._overflow = null;\r\n return element;\r\n }\r\n};\r\n\r\nObject.extend(Element.Methods, {childOf: Element.Methods.descendantOf});\r\n\r\nElement._attributeTranslations = {};\r\n\r\nElement._attributeTranslations.names = {\r\n colspan: \"colSpan\",\r\n rowspan: \"rowSpan\",\r\n valign: \"vAlign\",\r\n datetime: \"dateTime\",\r\n accesskey: \"accessKey\",\r\n tabindex: \"tabIndex\",\r\n enctype: \"encType\",\r\n maxlength: \"maxLength\",\r\n readonly: \"readOnly\",\r\n longdesc: \"longDesc\"\r\n};\r\n\r\nElement._attributeTranslations.values = {\r\n _getAttr: function(element, attribute) {\r\n return element.getAttribute(attribute, 2);\r\n },\r\n\r\n _flag: function(element, attribute) {\r\n return $(element).hasAttribute(attribute) ? attribute : null;\r\n },\r\n\r\n style: function(element) {\r\n return element.style.cssText.toLowerCase();\r\n },\r\n\r\n title: function(element) {\r\n var node = element.getAttributeNode(\'title\');\r\n return node.specified ? node.nodeValue : null;\r\n }\r\n};\r\n\r\nObject.extend(Element._attributeTranslations.values, {\r\n href: Element._attributeTranslations.values._getAttr,\r\n src: Element._attributeTranslations.values._getAttr,\r\n disabled: Element._attributeTranslations.values._flag,\r\n checked: Element._attributeTranslations.values._flag,\r\n readonly: Element._attributeTranslations.values._flag,\r\n multiple: Element._attributeTranslations.values._flag\r\n});\r\n\r\nElement.Methods.Simulated = {\r\n hasAttribute: function(element, attribute) {\r\n var t = Element._attributeTranslations;\r\n attribute = t.names[attribute] || attribute;\r\n return $(element).getAttributeNode(attribute).specified;\r\n }\r\n};\r\n\r\n// IE is missing .innerHTML support for TABLE-related elements\r\nif (document.all && !window.opera){\r\n Element.Methods.update = function(element, html) {\r\n element = $(element);\r\n html = typeof html == \'undefined\' ? \'\' : html.toString();\r\n var tagName = element.tagName.toUpperCase();\r\n if ([\'THEAD\',\'TBODY\',\'TR\',\'TD\'].include(tagName)) {\r\n var div = document.createElement(\'div\');\r\n switch (tagName) {\r\n case \'THEAD\':\r\n case \'TBODY\':\r\n div.innerHTML = \'<table><tbody>\' + html.stripScripts() + \'</tbody></table>\';\r\n depth = 2;\r\n break;\r\n case \'TR\':\r\n div.innerHTML = \'<table><tbody><tr>\' + html.stripScripts() + \'</tr></tbody></table>\';\r\n depth = 3;\r\n break;\r\n case \'TD\':\r\n div.innerHTML = \'<table><tbody><tr><td>\' + html.stripScripts() + \'</td></tr></tbody></table>\';\r\n depth = 4;\r\n }\r\n $A(element.childNodes).each(function(node){\r\n element.removeChild(node)\r\n });\r\n depth.times(function(){ div = div.firstChild });\r\n\r\n $A(div.childNodes).each(\r\n function(node){ element.appendChild(node) });\r\n } else {\r\n element.innerHTML = html.stripScripts();\r\n }\r\n setTimeout(function() {html.evalScripts()}, 10);\r\n return element;\r\n }\r\n};\r\n\r\nObject.extend(Element, Element.Methods);\r\n\r\nvar _nativeExtensions = false;\r\n\r\nif(/Konqueror|Safari|KHTML/.test(navigator.userAgent))\r\n [\'\', \'Form\', \'Input\', \'TextArea\', \'Select\'].each(function(tag) {\r\n var className = \'HTML\' + tag + \'Element\';\r\n if(window[className]) return;\r\n var klass = window[className] = {};\r\n klass.prototype = document.createElement(tag ? tag.toLowerCase() : \'div\').__proto__;\r\n });\r\n\r\nElement.addMethods = function(methods) {\r\n Object.extend(Element.Methods, methods || {});\r\n\r\n function copy(methods, destination, onlyIfAbsent) {\r\n onlyIfAbsent = onlyIfAbsent || false;\r\n var cache = Element.extend.cache;\r\n for (var property in methods) {\r\n var value = methods[property];\r\n if (!onlyIfAbsent || !(property in destination))\r\n destination[property] = cache.findOrStore(value);\r\n }\r\n }\r\n\r\n if (typeof HTMLElement != \'undefined\') {\r\n copy(Element.Methods, HTMLElement.prototype);\r\n copy(Element.Methods.Simulated, HTMLElement.prototype, true);\r\n copy(Form.Methods, HTMLFormElement.prototype);\r\n [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {\r\n copy(Form.Element.Methods, klass.prototype);\r\n });\r\n _nativeExtensions = true;\r\n }\r\n}\r\n\r\nvar Toggle = new Object();\r\nToggle.display = Element.toggle;\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nAbstract.Insertion = function(adjacency) {\r\n this.adjacency = adjacency;\r\n}\r\n\r\nAbstract.Insertion.prototype = {\r\n initialize: function(element, content) {\r\n this.element = $(element);\r\n this.content = content.stripScripts();\r\n\r\n if (this.adjacency && this.element.insertAdjacentHTML) {\r\n try {\r\n this.element.insertAdjacentHTML(this.adjacency, this.content);\r\n } catch (e) {\r\n var tagName = this.element.tagName.toUpperCase();\r\n if ([\'TBODY\', \'TR\'].include(tagName)) {\r\n this.insertContent(this.contentFromAnonymousTable());\r\n } else {\r\n throw e;\r\n }\r\n }\r\n } else {\r\n this.range = this.element.ownerDocument.createRange();\r\n if (this.initializeRange) this.initializeRange();\r\n this.insertContent([this.range.createContextualFragment(this.content)]);\r\n }\r\n\r\n setTimeout(function() {content.evalScripts()}, 10);\r\n },\r\n\r\n contentFromAnonymousTable: function() {\r\n var div = document.createElement(\'div\');\r\n div.innerHTML = \'<table><tbody>\' + this.content + \'</tbody></table>\';\r\n return $A(div.childNodes[0].childNodes[0].childNodes);\r\n }\r\n}\r\n\r\nvar Insertion = new Object();\r\n\r\nInsertion.Before = Class.create();\r\nInsertion.Before.prototype = Object.extend(new Abstract.Insertion(\'beforeBegin\'), {\r\n initializeRange: function() {\r\n this.range.setStartBefore(this.element);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.each((function(fragment) {\r\n this.element.parentNode.insertBefore(fragment, this.element);\r\n }).bind(this));\r\n }\r\n});\r\n\r\nInsertion.Top = Class.create();\r\nInsertion.Top.prototype = Object.extend(new Abstract.Insertion(\'afterBegin\'), {\r\n initializeRange: function() {\r\n this.range.selectNodeContents(this.element);\r\n this.range.collapse(true);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.reverse(false).each((function(fragment) {\r\n this.element.insertBefore(fragment, this.element.firstChild);\r\n }).bind(this));\r\n }\r\n});\r\n\r\nInsertion.Bottom = Class.create();\r\nInsertion.Bottom.prototype = Object.extend(new Abstract.Insertion(\'beforeEnd\'), {\r\n initializeRange: function() {\r\n this.range.selectNodeContents(this.element);\r\n this.range.collapse(this.element);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.each((function(fragment) {\r\n this.element.appendChild(fragment);\r\n }).bind(this));\r\n }\r\n});\r\n\r\nInsertion.After = Class.create();\r\nInsertion.After.prototype = Object.extend(new Abstract.Insertion(\'afterEnd\'), {\r\n initializeRange: function() {\r\n this.range.setStartAfter(this.element);\r\n },\r\n\r\n insertContent: function(fragments) {\r\n fragments.each((function(fragment) {\r\n this.element.parentNode.insertBefore(fragment,\r\n this.element.nextSibling);\r\n }).bind(this));\r\n }\r\n});\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nElement.ClassNames = Class.create();\r\nElement.ClassNames.prototype = {\r\n initialize: function(element) {\r\n this.element = $(element);\r\n },\r\n\r\n _each: function(iterator) {\r\n this.element.className.split(/\\s+/).select(function(name) {\r\n return name.length > 0;\r\n })._each(iterator);\r\n },\r\n\r\n set: function(className) {\r\n this.element.className = className;\r\n },\r\n\r\n add: function(classNameToAdd) {\r\n if (this.include(classNameToAdd)) return;\r\n this.set($A(this).concat(classNameToAdd).join(\' \'));\r\n },\r\n\r\n remove: function(classNameToRemove) {\r\n if (!this.include(classNameToRemove)) return;\r\n this.set($A(this).without(classNameToRemove).join(\' \'));\r\n },\r\n\r\n toString: function() {\r\n return $A(this).join(\' \');\r\n }\r\n};\r\n\r\nObject.extend(Element.ClassNames.prototype, Enumerable);\r\nvar Selector = Class.create();\r\nSelector.prototype = {\r\n initialize: function(expression) {\r\n this.params = {classNames: []};\r\n this.expression = expression.toString().strip();\r\n this.parseExpression();\r\n this.compileMatcher();\r\n },\r\n\r\n parseExpression: function() {\r\n function abort(message) { throw \'Parse error in selector: \' + message; }\r\n\r\n if (this.expression == \'\') abort(\'empty expression\');\r\n\r\n var params = this.params, expr = this.expression, match, modifier, clause, rest;\r\n while (match = expr.match(/^(.*)\\[([a-z0-9_:-]+?)(?:([~\\|!]?=)(?:\"([^\"]*)\"|([^\\]\\s]*)))?\\]$/i)) {\r\n params.attributes = params.attributes || [];\r\n params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || \'\'});\r\n expr = match[1];\r\n }\r\n\r\n if (expr == \'*\') return this.params.wildcard = true;\r\n\r\n while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {\r\n modifier = match[1], clause = match[2], rest = match[3];\r\n switch (modifier) {\r\n case \'#\': params.id = clause; break;\r\n case \'.\': params.classNames.push(clause); break;\r\n case \'\':\r\n case undefined: params.tagName = clause.toUpperCase(); break;\r\n default: abort(expr.inspect());\r\n }\r\n expr = rest;\r\n }\r\n\r\n if (expr.length > 0) abort(expr.inspect());\r\n },\r\n\r\n buildMatchExpression: function() {\r\n var params = this.params, conditions = [], clause;\r\n\r\n if (params.wildcard)\r\n conditions.push(\'true\');\r\n if (clause = params.id)\r\n conditions.push(\'element.readAttribute(\"id\") == \' + clause.inspect());\r\n if (clause = params.tagName)\r\n conditions.push(\'element.tagName.toUpperCase() == \' + clause.inspect());\r\n if ((clause = params.classNames).length > 0)\r\n for (var i = 0, length = clause.length; i < length; i++)\r\n conditions.push(\'element.hasClassName(\' + clause[i].inspect() + \')\');\r\n if (clause = params.attributes) {\r\n clause.each(function(attribute) {\r\n var value = \'element.readAttribute(\' + attribute.name.inspect() + \')\';\r\n var splitValueBy = function(delimiter) {\r\n return value + \' && \' + value + \'.split(\' + delimiter.inspect() + \')\';\r\n }\r\n\r\n switch (attribute.operator) {\r\n case \'=\': conditions.push(value + \' == \' + attribute.value.inspect()); break;\r\n case \'~=\': conditions.push(splitValueBy(\' \') + \'.include(\' + attribute.value.inspect() + \')\'); break;\r\n case \'|=\': conditions.push(\r\n splitValueBy(\'-\') + \'.first().toUpperCase() == \' + attribute.value.toUpperCase().inspect()\r\n ); break;\r\n case \'!=\': conditions.push(value + \' != \' + attribute.value.inspect()); break;\r\n case \'\':\r\n case undefined: conditions.push(\'element.hasAttribute(\' + attribute.name.inspect() + \')\'); break;\r\n default: throw \'Unknown operator \' + attribute.operator + \' in selector\';\r\n }\r\n });\r\n }\r\n\r\n return conditions.join(\' && \');\r\n },\r\n\r\n compileMatcher: function() {\r\n this.match = new Function(\'element\', \'if (!element.tagName) return false; \\\r\n element = $(element); \\\r\n return \' + this.buildMatchExpression());\r\n },\r\n\r\n findElements: function(scope) {\r\n var element;\r\n\r\n if (element = $(this.params.id))\r\n if (this.match(element))\r\n if (!scope || Element.childOf(element, scope))\r\n return [element];\r\n\r\n scope = (scope || document).getElementsByTagName(this.params.tagName || \'*\');\r\n\r\n var results = [];\r\n for (var i = 0, length = scope.length; i < length; i++)\r\n if (this.match(element = scope[i]))\r\n results.push(Element.extend(element));\r\n\r\n return results;\r\n },\r\n\r\n toString: function() {\r\n return this.expression;\r\n }\r\n}\r\n\r\nObject.extend(Selector, {\r\n matchElements: function(elements, expression) {\r\n var selector = new Selector(expression);\r\n return elements.select(selector.match.bind(selector)).map(Element.extend);\r\n },\r\n\r\n findElement: function(elements, expression, index) {\r\n if (typeof expression == \'number\') index = expression, expression = false;\r\n return Selector.matchElements(elements, expression || \'*\')[index || 0];\r\n },\r\n\r\n findChildElements: function(element, expressions) {\r\n return expressions.map(function(expression) {\r\n return expression.match(/[^\\s\"]+(?:\"[^\"]*\"[^\\s\"]+)*/g).inject([null], function(results, expr) {\r\n var selector = new Selector(expr);\r\n return results.inject([], function(elements, result) {\r\n return elements.concat(selector.findElements(result || element));\r\n });\r\n });\r\n }).flatten();\r\n }\r\n});\r\n\r\nfunction $$() {\r\n return Selector.findChildElements(document, $A(arguments));\r\n}\r\nvar Form = {\r\n reset: function(form) {\r\n $(form).reset();\r\n return form;\r\n },\r\n\r\n serializeElements: function(elements, getHash) {\r\n var data = elements.inject({}, function(result, element) {\r\n if (!element.disabled && element.name) {\r\n var key = element.name, value = $(element).getValue();\r\n if (value != undefined) {\r\n if (result[key]) {\r\n if (result[key].constructor != Array) result[key] = [result[key]];\r\n result[key].push(value);\r\n }\r\n else result[key] = value;\r\n }\r\n }\r\n return result;\r\n });\r\n\r\n return getHash ? data : Hash.toQueryString(data);\r\n }\r\n};\r\n\r\nForm.Methods = {\r\n serialize: function(form, getHash) {\r\n return Form.serializeElements(Form.getElements(form), getHash);\r\n },\r\n\r\n getElements: function(form) {\r\n return $A($(form).getElementsByTagName(\'*\')).inject([],\r\n function(elements, child) {\r\n if (Form.Element.Serializers[child.tagName.toLowerCase()])\r\n elements.push(Element.extend(child));\r\n return elements;\r\n }\r\n );\r\n },\r\n\r\n getInputs: function(form, typeName, name) {\r\n form = $(form);\r\n var inputs = form.getElementsByTagName(\'input\');\r\n\r\n if (!typeName && !name) return $A(inputs).map(Element.extend);\r\n\r\n for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {\r\n var input = inputs[i];\r\n if ((typeName && input.type != typeName) || (name && input.name != name))\r\n continue;\r\n matchingInputs.push(Element.extend(input));\r\n }\r\n\r\n return matchingInputs;\r\n },\r\n\r\n disable: function(form) {\r\n form = $(form);\r\n form.getElements().each(function(element) {\r\n element.blur();\r\n element.disabled = \'true\';\r\n });\r\n return form;\r\n },\r\n\r\n enable: function(form) {\r\n form = $(form);\r\n form.getElements().each(function(element) {\r\n element.disabled = \'\';\r\n });\r\n return form;\r\n },\r\n\r\n findFirstElement: function(form) {\r\n return $(form).getElements().find(function(element) {\r\n return element.type != \'hidden\' && !element.disabled &&\r\n [\'input\', \'select\', \'textarea\'].include(element.tagName.toLowerCase());\r\n });\r\n },\r\n\r\n focusFirstElement: function(form) {\r\n form = $(form);\r\n form.findFirstElement().activate();\r\n return form;\r\n }\r\n}\r\n\r\nObject.extend(Form, Form.Methods);\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nForm.Element = {\r\n focus: function(element) {\r\n $(element).focus();\r\n return element;\r\n },\r\n\r\n select: function(element) {\r\n $(element).select();\r\n return element;\r\n }\r\n}\r\n\r\nForm.Element.Methods = {\r\n serialize: function(element) {\r\n element = $(element);\r\n if (!element.disabled && element.name) {\r\n var value = element.getValue();\r\n if (value != undefined) {\r\n var pair = {};\r\n pair[element.name] = value;\r\n return Hash.toQueryString(pair);\r\n }\r\n }\r\n return \'\';\r\n },\r\n\r\n getValue: function(element) {\r\n element = $(element);\r\n var method = element.tagName.toLowerCase();\r\n return Form.Element.Serializers[method](element);\r\n },\r\n\r\n clear: function(element) {\r\n $(element).value = \'\';\r\n return element;\r\n },\r\n\r\n present: function(element) {\r\n return $(element).value != \'\';\r\n },\r\n\r\n activate: function(element) {\r\n element = $(element);\r\n element.focus();\r\n if (element.select && ( element.tagName.toLowerCase() != \'input\' ||\r\n ![\'button\', \'reset\', \'submit\'].include(element.type) ) )\r\n element.select();\r\n return element;\r\n },\r\n\r\n disable: function(element) {\r\n element = $(element);\r\n element.disabled = true;\r\n return element;\r\n },\r\n\r\n enable: function(element) {\r\n element = $(element);\r\n element.blur();\r\n element.disabled = false;\r\n return element;\r\n }\r\n}\r\n\r\nObject.extend(Form.Element, Form.Element.Methods);\r\nvar Field = Form.Element;\r\nvar $F = Form.Element.getValue;\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nForm.Element.Serializers = {\r\n input: function(element) {\r\n switch (element.type.toLowerCase()) {\r\n case \'checkbox\':\r\n case \'radio\':\r\n return Form.Element.Serializers.inputSelector(element);\r\n default:\r\n return Form.Element.Serializers.textarea(element);\r\n }\r\n },\r\n\r\n inputSelector: function(element) {\r\n return element.checked ? element.value : null;\r\n },\r\n\r\n textarea: function(element) {\r\n return element.value;\r\n },\r\n\r\n select: function(element) {\r\n return this[element.type == \'select-one\' ?\r\n \'selectOne\' : \'selectMany\'](element);\r\n },\r\n\r\n selectOne: function(element) {\r\n var index = element.selectedIndex;\r\n return index >= 0 ? this.optionValue(element.options[index]) : null;\r\n },\r\n\r\n selectMany: function(element) {\r\n var values, length = element.length;\r\n if (!length) return null;\r\n\r\n for (var i = 0, values = []; i < length; i++) {\r\n var opt = element.options[i];\r\n if (opt.selected) values.push(this.optionValue(opt));\r\n }\r\n return values;\r\n },\r\n\r\n optionValue: function(opt) {\r\n // extend element because hasAttribute may not be native\r\n return Element.extend(opt).hasAttribute(\'value\') ? opt.value : opt.text;\r\n }\r\n}\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nAbstract.TimedObserver = function() {}\r\nAbstract.TimedObserver.prototype = {\r\n initialize: function(element, frequency, callback) {\r\n this.frequency = frequency;\r\n this.element = $(element);\r\n this.callback = callback;\r\n\r\n this.lastValue = this.getValue();\r\n this.registerCallback();\r\n },\r\n\r\n registerCallback: function() {\r\n setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\r\n },\r\n\r\n onTimerEvent: function() {\r\n var value = this.getValue();\r\n var changed = (\'string\' == typeof this.lastValue && \'string\' == typeof value\r\n ? this.lastValue != value : String(this.lastValue) != String(value));\r\n if (changed) {\r\n this.callback(this.element, value);\r\n this.lastValue = value;\r\n }\r\n }\r\n}\r\n\r\nForm.Element.Observer = Class.create();\r\nForm.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r\n getValue: function() {\r\n return Form.Element.getValue(this.element);\r\n }\r\n});\r\n\r\nForm.Observer = Class.create();\r\nForm.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\r\n getValue: function() {\r\n return Form.serialize(this.element);\r\n }\r\n});\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nAbstract.EventObserver = function() {}\r\nAbstract.EventObserver.prototype = {\r\n initialize: function(element, callback) {\r\n this.element = $(element);\r\n this.callback = callback;\r\n\r\n this.lastValue = this.getValue();\r\n if (this.element.tagName.toLowerCase() == \'form\')\r\n this.registerFormCallbacks();\r\n else\r\n this.registerCallback(this.element);\r\n },\r\n\r\n onElementEvent: function() {\r\n var value = this.getValue();\r\n if (this.lastValue != value) {\r\n this.callback(this.element, value);\r\n this.lastValue = value;\r\n }\r\n },\r\n\r\n registerFormCallbacks: function() {\r\n Form.getElements(this.element).each(this.registerCallback.bind(this));\r\n },\r\n\r\n registerCallback: function(element) {\r\n if (element.type) {\r\n switch (element.type.toLowerCase()) {\r\n case \'checkbox\':\r\n case \'radio\':\r\n Event.observe(element, \'click\', this.onElementEvent.bind(this));\r\n break;\r\n default:\r\n Event.observe(element, \'change\', this.onElementEvent.bind(this));\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nForm.Element.EventObserver = Class.create();\r\nForm.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r\n getValue: function() {\r\n return Form.Element.getValue(this.element);\r\n }\r\n});\r\n\r\nForm.EventObserver = Class.create();\r\nForm.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\r\n getValue: function() {\r\n return Form.serialize(this.element);\r\n }\r\n});\r\nif (!window.Event) {\r\n var Event = new Object();\r\n}\r\n\r\nObject.extend(Event, {\r\n KEY_BACKSPACE: 8,\r\n KEY_TAB: 9,\r\n KEY_RETURN: 13,\r\n KEY_ESC: 27,\r\n KEY_LEFT: 37,\r\n KEY_UP: 38,\r\n KEY_RIGHT: 39,\r\n KEY_DOWN: 40,\r\n KEY_DELETE: 46,\r\n KEY_HOME: 36,\r\n KEY_END: 35,\r\n KEY_PAGEUP: 33,\r\n KEY_PAGEDOWN: 34,\r\n\r\n element: function(event) {\r\n return event.target || event.srcElement;\r\n },\r\n\r\n isLeftClick: function(event) {\r\n return (((event.which) && (event.which == 1)) ||\r\n ((event.button) && (event.button == 1)));\r\n },\r\n\r\n pointerX: function(event) {\r\n return event.pageX || (event.clientX +\r\n (document.documentElement.scrollLeft || document.body.scrollLeft));\r\n },\r\n\r\n pointerY: function(event) {\r\n return event.pageY || (event.clientY +\r\n (document.documentElement.scrollTop || document.body.scrollTop));\r\n },\r\n\r\n stop: function(event) {\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n } else {\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n }\r\n },\r\n\r\n // find the first node with the given tagName, starting from the\r\n // node the event was triggered on; traverses the DOM upwards\r\n findElement: function(event, tagName) {\r\n var element = Event.element(event);\r\n while (element.parentNode && (!element.tagName ||\r\n (element.tagName.toUpperCase() != tagName.toUpperCase())))\r\n element = element.parentNode;\r\n return element;\r\n },\r\n\r\n observers: false,\r\n\r\n _observeAndCache: function(element, name, observer, useCapture) {\r\n if (!this.observers) this.observers = [];\r\n if (element.addEventListener) {\r\n this.observers.push([element, name, observer, useCapture]);\r\n element.addEventListener(name, observer, useCapture);\r\n } else if (element.attachEvent) {\r\n this.observers.push([element, name, observer, useCapture]);\r\n element.attachEvent(\'on\' + name, observer);\r\n }\r\n },\r\n\r\n unloadCache: function() {\r\n if (!Event.observers) return;\r\n for (var i = 0, length = Event.observers.length; i < length; i++) {\r\n Event.stopObserving.apply(this, Event.observers[i]);\r\n Event.observers[i][0] = null;\r\n }\r\n Event.observers = false;\r\n },\r\n\r\n observe: function(element, name, observer, useCapture) {\r\n element = $(element);\r\n useCapture = useCapture || false;\r\n\r\n if (name == \'keypress\' &&\r\n (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r\n || element.attachEvent))\r\n name = \'keydown\';\r\n\r\n Event._observeAndCache(element, name, observer, useCapture);\r\n },\r\n\r\n stopObserving: function(element, name, observer, useCapture) {\r\n element = $(element);\r\n useCapture = useCapture || false;\r\n\r\n if (name == \'keypress\' &&\r\n (navigator.appVersion.match(/Konqueror|Safari|KHTML/)\r\n || element.detachEvent))\r\n name = \'keydown\';\r\n\r\n if (element.removeEventListener) {\r\n element.removeEventListener(name, observer, useCapture);\r\n } else if (element.detachEvent) {\r\n try {\r\n element.detachEvent(\'on\' + name, observer);\r\n } catch (e) {}\r\n }\r\n }\r\n});\r\n\r\n/* prevent memory leaks in IE */\r\nif (navigator.appVersion.match(/\\bMSIE\\b/))\r\n Event.observe(window, \'unload\', Event.unloadCache, false);\r\nvar Position = {\r\n // set to true if needed, warning: firefox performance problems\r\n // NOT neeeded for page scrolling, only if draggable contained in\r\n // scrollable elements\r\n includeScrollOffsets: false,\r\n\r\n // must be called before calling withinIncludingScrolloffset, every time the\r\n // page is scrolled\r\n prepare: function() {\r\n this.deltaX = window.pageXOffset\r\n || document.documentElement.scrollLeft\r\n || document.body.scrollLeft\r\n || 0;\r\n this.deltaY = window.pageYOffset\r\n || document.documentElement.scrollTop\r\n || document.body.scrollTop\r\n || 0;\r\n },\r\n\r\n realOffset: function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.scrollTop || 0;\r\n valueL += element.scrollLeft || 0;\r\n element = element.parentNode;\r\n } while (element);\r\n return [valueL, valueT];\r\n },\r\n\r\n cumulativeOffset: function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n element = element.offsetParent;\r\n } while (element);\r\n return [valueL, valueT];\r\n },\r\n\r\n positionedOffset: function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n element = element.offsetParent;\r\n if (element) {\r\n if(element.tagName==\'BODY\') break;\r\n var p = Element.getStyle(element, \'position\');\r\n if (p == \'relative\' || p == \'absolute\') break;\r\n }\r\n } while (element);\r\n return [valueL, valueT];\r\n },\r\n\r\n offsetParent: function(element) {\r\n if (element.offsetParent) return element.offsetParent;\r\n if (element == document.body) return element;\r\n\r\n while ((element = element.parentNode) && element != document.body)\r\n if (Element.getStyle(element, \'position\') != \'static\')\r\n return element;\r\n\r\n return document.body;\r\n },\r\n\r\n // caches x/y coordinate pair to use with overlap\r\n within: function(element, x, y) {\r\n if (this.includeScrollOffsets)\r\n return this.withinIncludingScrolloffsets(element, x, y);\r\n this.xcomp = x;\r\n this.ycomp = y;\r\n this.offset = this.cumulativeOffset(element);\r\n\r\n return (y >= this.offset[1] &&\r\n y < this.offset[1] + element.offsetHeight &&\r\n x >= this.offset[0] &&\r\n x < this.offset[0] + element.offsetWidth);\r\n },\r\n\r\n withinIncludingScrolloffsets: function(element, x, y) {\r\n var offsetcache = this.realOffset(element);\r\n\r\n this.xcomp = x + offsetcache[0] - this.deltaX;\r\n this.ycomp = y + offsetcache[1] - this.deltaY;\r\n this.offset = this.cumulativeOffset(element);\r\n\r\n return (this.ycomp >= this.offset[1] &&\r\n this.ycomp < this.offset[1] + element.offsetHeight &&\r\n this.xcomp >= this.offset[0] &&\r\n this.xcomp < this.offset[0] + element.offsetWidth);\r\n },\r\n\r\n // within must be called directly before\r\n overlap: function(mode, element) {\r\n if (!mode) return 0;\r\n if (mode == \'vertical\')\r\n return ((this.offset[1] + element.offsetHeight) - this.ycomp) /\r\n element.offsetHeight;\r\n if (mode == \'horizontal\')\r\n return ((this.offset[0] + element.offsetWidth) - this.xcomp) /\r\n element.offsetWidth;\r\n },\r\n\r\n page: function(forElement) {\r\n var valueT = 0, valueL = 0;\r\n\r\n var element = forElement;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n\r\n // Safari fix\r\n if (element.offsetParent==document.body)\r\n if (Element.getStyle(element,\'position\')==\'absolute\') break;\r\n\r\n } while (element = element.offsetParent);\r\n\r\n element = forElement;\r\n do {\r\n if (!window.opera || element.tagName==\'BODY\') {\r\n valueT -= element.scrollTop || 0;\r\n valueL -= element.scrollLeft || 0;\r\n }\r\n } while (element = element.parentNode);\r\n\r\n return [valueL, valueT];\r\n },\r\n\r\n clone: function(source, target) {\r\n var options = Object.extend({\r\n setLeft: true,\r\n setTop: true,\r\n setWidth: true,\r\n setHeight: true,\r\n offsetTop: 0,\r\n offsetLeft: 0\r\n }, arguments[2] || {})\r\n\r\n // find page position of source\r\n source = $(source);\r\n var p = Position.page(source);\r\n\r\n // find coordinate system to use\r\n target = $(target);\r\n var delta = [0, 0];\r\n var parent = null;\r\n // delta [0,0] will do fine with position: fixed elements,\r\n // position:absolute needs offsetParent deltas\r\n if (Element.getStyle(target,\'position\') == \'absolute\') {\r\n parent = Position.offsetParent(target);\r\n delta = Position.page(parent);\r\n }\r\n\r\n // correct by body offsets (fixes Safari)\r\n if (parent == document.body) {\r\n delta[0] -= document.body.offsetLeft;\r\n delta[1] -= document.body.offsetTop;\r\n }\r\n\r\n // set position\r\n if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + \'px\';\r\n if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + \'px\';\r\n if(options.setWidth) target.style.width = source.offsetWidth + \'px\';\r\n if(options.setHeight) target.style.height = source.offsetHeight + \'px\';\r\n },\r\n\r\n absolutize: function(element) {\r\n element = $(element);\r\n if (element.style.position == \'absolute\') return;\r\n Position.prepare();\r\n\r\n var offsets = Position.positionedOffset(element);\r\n var top = offsets[1];\r\n var left = offsets[0];\r\n var width = element.clientWidth;\r\n var height = element.clientHeight;\r\n\r\n element._originalLeft = left - parseFloat(element.style.left || 0);\r\n element._originalTop = top - parseFloat(element.style.top || 0);\r\n element._originalWidth = element.style.width;\r\n element._originalHeight = element.style.height;\r\n\r\n element.style.position = \'absolute\';\r\n element.style.top = top + \'px\';\r\n element.style.left = left + \'px\';\r\n element.style.width = width + \'px\';\r\n element.style.height = height + \'px\';\r\n },\r\n\r\n relativize: function(element) {\r\n element = $(element);\r\n if (element.style.position == \'relative\') return;\r\n Position.prepare();\r\n\r\n element.style.position = \'relative\';\r\n var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);\r\n var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);\r\n\r\n element.style.top = top + \'px\';\r\n element.style.left = left + \'px\';\r\n element.style.height = element._originalHeight;\r\n element.style.width = element._originalWidth;\r\n }\r\n}\r\n\r\n// Safari returns margins on body which is incorrect if the child is absolutely\r\n// positioned. For performance reasons, redefine Position.cumulativeOffset for\r\n// KHTML/WebKit only.\r\nif (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {\r\n Position.cumulativeOffset = function(element) {\r\n var valueT = 0, valueL = 0;\r\n do {\r\n valueT += element.offsetTop || 0;\r\n valueL += element.offsetLeft || 0;\r\n if (element.offsetParent == document.body)\r\n if (Element.getStyle(element, \'position\') == \'absolute\') break;\r\n\r\n element = element.offsetParent;\r\n } while (element);\r\n\r\n return [valueL, valueT];\r\n }\r\n}\r\n\r\nElement.addMethods();\r\n\r\n\r\n// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007\r\n\r\n// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\r\n// Contributors:\r\n// Justin Palmer (http://encytemedia.com/)\r\n// Mark Pilgrim (http://diveintomark.org/)\r\n// Martin Bialasinki\r\n// \r\n// script.aculo.us is freely distributable under the terms of an MIT-style license.\r\n// For details, see the script.aculo.us web site: http://script.aculo.us/ \r\n\r\n// converts rgb() and #xxx to #xxxxxx format, \r\n// returns self (or first argument) if not convertable \r\nString.prototype.parseColor = function() { \r\n var color = \'#\';\r\n if(this.slice(0,4) == \'rgb(\') { \r\n var cols = this.slice(4,this.length-1).split(\',\'); \r\n var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); \r\n } else { \r\n if(this.slice(0,1) == \'#\') { \r\n if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); \r\n if(this.length==7) color = this.toLowerCase(); \r\n } \r\n } \r\n return(color.length==7 ? color : (arguments[0] || this)); \r\n}\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nElement.collectTextNodes = function(element) { \r\n return $A($(element).childNodes).collect( function(node) {\r\n return (node.nodeType==3 ? node.nodeValue : \r\n (node.hasChildNodes() ? Element.collectTextNodes(node) : \'\'));\r\n }).flatten().join(\'\');\r\n}\r\n\r\nElement.collectTextNodesIgnoreClass = function(element, className) { \r\n return $A($(element).childNodes).collect( function(node) {\r\n return (node.nodeType==3 ? node.nodeValue : \r\n ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? \r\n Element.collectTextNodesIgnoreClass(node, className) : \'\'));\r\n }).flatten().join(\'\');\r\n}\r\n\r\nElement.setContentZoom = function(element, percent) {\r\n element = $(element); \r\n element.setStyle({fontSize: (percent/100) + \'em\'}); \r\n if(navigator.appVersion.indexOf(\'AppleWebKit\')>0) window.scrollBy(0,0);\r\n return element;\r\n}\r\n\r\nElement.getOpacity = function(element){\r\n return $(element).getStyle(\'opacity\');\r\n}\r\n\r\nElement.setOpacity = function(element, value){\r\n return $(element).setStyle({opacity:value});\r\n}\r\n\r\nElement.getInlineOpacity = function(element){\r\n return $(element).style.opacity || \'\';\r\n}\r\n\r\nElement.forceRerendering = function(element) {\r\n try {\r\n element = $(element);\r\n var n = document.createTextNode(\' \');\r\n element.appendChild(n);\r\n element.removeChild(n);\r\n } catch(e) { }\r\n};\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nArray.prototype.call = function() {\r\n var args = arguments;\r\n this.each(function(f){ f.apply(this, args) });\r\n}\r\n\r\n/*--------------------------------------------------------------------------*/\r\n\r\nvar Effect = {\r\n _elementDoesNotExistError: {\r\n name: \'ElementDoesNotExistError\',\r\n message: \'The specified DOM element does not exist, but is required for this effect to operate\'\r\n },\r\n tagifyText: function(element) {\r\n if(typeof Builder == \'undefined\')\r\n throw(\"Effect.tagifyText requires including script.aculo.us\' builder.js library\");\r\n \r\n var tagifyStyle = \'position:relative\';\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += \';zoom:1\';\r\n \r\n element = $(element);\r\n $A(element.childNodes).each( function(child) {\r\n if(child.nodeType==3) {\r\n child.nodeValue.toArray().each( function(character) {\r\n element.insertBefore(\r\n Builder.node(\'span\',{style: tagifyStyle},\r\n character == \' \' ? String.fromCharCode(160) : character), \r\n child);\r\n });\r\n Element.remove(child);\r\n }\r\n });\r\n },\r\n multiple: function(element, effect) {\r\n var elements;\r\n if(((typeof element == \'object\') || \r\n (typeof element == \'function\')) && \r\n (element.length))\r\n elements = element;\r\n else\r\n elements = $(element).childNodes;\r\n \r\n var options = Object.extend({\r\n speed: 0.1,\r\n delay: 0.0\r\n }, arguments[2] || {});\r\n var masterDelay = options.delay;\r\n\r\n $A(elements).each( function(element, index) {\r\n new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));\r\n });\r\n },\r\n PAIRS: {\r\n \'slide\': [\'SlideDown\',\'SlideUp\'],\r\n \'blind\': [\'BlindDown\',\'BlindUp\'],\r\n \'appear\': [\'Appear\',\'Fade\']\r\n },\r\n toggle: function(element, effect) {\r\n element = $(element);\r\n effect = (effect || \'appear\').toLowerCase();\r\n var options = Object.extend({\r\n queue: { position:\'end\', scope:(element.id || \'global\'), limit: 1 }\r\n }, arguments[2] || {});\r\n Effect[element.visible() ? \r\n Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);\r\n }\r\n};\r\n\r\nvar Effect2 = Effect; // deprecated\r\n\r\n/* ------------- transitions ------------- */\r\n\r\nEffect.Transitions = {\r\n linear: Prototype.K,\r\n sinoidal: function(pos) {\r\n return (-Math.cos(pos*Math.PI)/2) + 0.5;\r\n },\r\n reverse: function(pos) {\r\n return 1-pos;\r\n },\r\n flicker: function(pos) {\r\n return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;\r\n },\r\n wobble: function(pos) {\r\n return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;\r\n },\r\n pulse: function(pos, pulses) { \r\n pulses = pulses || 5; \r\n return (\r\n Math.round((pos % (1/pulses)) * pulses) == 0 ? \r\n ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : \r\n 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))\r\n );\r\n },\r\n none: function(pos) {\r\n return 0;\r\n },\r\n full: function(pos) {\r\n return 1;\r\n }\r\n};\r\n\r\n/* ------------- core effects ------------- */\r\n\r\nEffect.ScopedQueue = Class.create();\r\nObject.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {\r\n initialize: function() {\r\n this.effects = [];\r\n this.interval = null;\r\n },\r\n _each: function(iterator) {\r\n this.effects._each(iterator);\r\n },\r\n add: function(effect) {\r\n var timestamp = new Date().getTime();\r\n \r\n var position = (typeof effect.options.queue == \'string\') ? \r\n effect.options.queue : effect.options.queue.position;\r\n \r\n switch(position) {\r\n case \'front\':\r\n // move unstarted effects after this effect \r\n this.effects.findAll(function(e){ return e.state==\'idle\' }).each( function(e) {\r\n e.startOn += effect.finishOn;\r\n e.finishOn += effect.finishOn;\r\n });\r\n break;\r\n case \'with-last\':\r\n timestamp = this.effects.pluck(\'startOn\').max() || timestamp;\r\n break;\r\n case \'end\':\r\n // start effect after last queued effect has finished\r\n timestamp = this.effects.pluck(\'finishOn\').max() || timestamp;\r\n break;\r\n }\r\n \r\n effect.startOn += timestamp;\r\n effect.finishOn += timestamp;\r\n\r\n if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))\r\n this.effects.push(effect);\r\n \r\n if(!this.interval) \r\n this.interval = setInterval(this.loop.bind(this), 15);\r\n },\r\n remove: function(effect) {\r\n this.effects = this.effects.reject(function(e) { return e==effect });\r\n if(this.effects.length == 0) {\r\n clearInterval(this.interval);\r\n this.interval = null;\r\n }\r\n },\r\n loop: function() {\r\n var timePos = new Date().getTime();\r\n for(var i=0, len=this.effects.length;i<len;i++) \r\n if(this.effects[i]) this.effects[i].loop(timePos);\r\n }\r\n});\r\n\r\nEffect.Queues = {\r\n instances: $H(),\r\n get: function(queueName) {\r\n if(typeof queueName != \'string\') return queueName;\r\n \r\n if(!this.instances[queueName])\r\n this.instances[queueName] = new Effect.ScopedQueue();\r\n \r\n return this.instances[queueName];\r\n }\r\n}\r\nEffect.Queue = Effect.Queues.get(\'global\');\r\n\r\nEffect.DefaultOptions = {\r\n transition: Effect.Transitions.sinoidal,\r\n duration: 1.0, // seconds\r\n fps: 60.0, // max. 60fps due to Effect.Queue implementation\r\n sync: false, // true for combining\r\n from: 0.0,\r\n to: 1.0,\r\n delay: 0.0,\r\n queue: \'parallel\'\r\n}\r\n\r\nEffect.Base = function() {};\r\nEffect.Base.prototype = {\r\n position: null,\r\n start: function(options) {\r\n this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});\r\n this.currentFrame = 0;\r\n this.state = \'idle\';\r\n this.startOn = this.options.delay*1000;\r\n this.finishOn = this.startOn + (this.options.duration*1000);\r\n this.event(\'beforeStart\');\r\n if(!this.options.sync)\r\n Effect.Queues.get(typeof this.options.queue == \'string\' ? \r\n \'global\' : this.options.queue.scope).add(this);\r\n },\r\n loop: function(timePos) {\r\n if(timePos >= this.startOn) {\r\n if(timePos >= this.finishOn) {\r\n this.render(1.0);\r\n this.cancel();\r\n this.event(\'beforeFinish\');\r\n if(this.finish) this.finish(); \r\n this.event(\'afterFinish\');\r\n return; \r\n }\r\n var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);\r\n var frame = Math.round(pos * this.options.fps * this.options.duration);\r\n if(frame > this.currentFrame) {\r\n this.render(pos);\r\n this.currentFrame = frame;\r\n }\r\n }\r\n },\r\n render: function(pos) {\r\n if(this.state == \'idle\') {\r\n this.state = \'running\';\r\n this.event(\'beforeSetup\');\r\n if(this.setup) this.setup();\r\n this.event(\'afterSetup\');\r\n }\r\n if(this.state == \'running\') {\r\n if(this.options.transition) pos = this.options.transition(pos);\r\n pos *= (this.options.to-this.options.from);\r\n pos += this.options.from;\r\n this.position = pos;\r\n this.event(\'beforeUpdate\');\r\n if(this.update) this.update(pos);\r\n this.event(\'afterUpdate\');\r\n }\r\n },\r\n cancel: function() {\r\n if(!this.options.sync)\r\n Effect.Queues.get(typeof this.options.queue == \'string\' ? \r\n \'global\' : this.options.queue.scope).remove(this);\r\n this.state = \'finished\';\r\n },\r\n event: function(eventName) {\r\n if(this.options[eventName + \'Internal\']) this.options[eventName + \'Internal\'](this);\r\n if(this.options[eventName]) this.options[eventName](this);\r\n },\r\n inspect: function() {\r\n var data = $H();\r\n for(property in this)\r\n if(typeof this[property] != \'function\') data[property] = this[property];\r\n return \'#<Effect:\' + data.inspect() + \',options:\' + $H(this.options).inspect() + \'>\';\r\n }\r\n}\r\n\r\nEffect.Parallel = Class.create();\r\nObject.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {\r\n initialize: function(effects) {\r\n this.effects = effects || [];\r\n this.start(arguments[1]);\r\n },\r\n update: function(position) {\r\n this.effects.invoke(\'render\', position);\r\n },\r\n finish: function(position) {\r\n this.effects.each( function(effect) {\r\n effect.render(1.0);\r\n effect.cancel();\r\n effect.event(\'beforeFinish\');\r\n if(effect.finish) effect.finish(position);\r\n effect.event(\'afterFinish\');\r\n });\r\n }\r\n});\r\n\r\nEffect.Event = Class.create();\r\nObject.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {\r\n initialize: function() {\r\n var options = Object.extend({\r\n duration: 0\r\n }, arguments[0] || {});\r\n this.start(options);\r\n },\r\n update: Prototype.emptyFunction\r\n});\r\n\r\nEffect.Opacity = Class.create();\r\nObject.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {\r\n initialize: function(element) {\r\n this.element = $(element);\r\n if(!this.element) throw(Effect._elementDoesNotExistError);\r\n // make this work on IE on elements without \'layout\'\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))\r\n this.element.setStyle({zoom: 1});\r\n var options = Object.extend({\r\n from: this.element.getOpacity() || 0.0,\r\n to: 1.0\r\n }, arguments[1] || {});\r\n this.start(options);\r\n },\r\n update: function(position) {\r\n this.element.setOpacity(position);\r\n }\r\n});\r\n\r\nEffect.Move = Class.create();\r\nObject.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {\r\n initialize: function(element) {\r\n this.element = $(element);\r\n if(!this.element) throw(Effect._elementDoesNotExistError);\r\n var options = Object.extend({\r\n x: 0,\r\n y: 0,\r\n mode: \'relative\'\r\n }, arguments[1] || {});\r\n this.start(options);\r\n },\r\n setup: function() {\r\n // Bug in Opera: Opera returns the \"real\" position of a static element or\r\n // relative element that does not have top/left explicitly set.\r\n // ==> Always set top and left for position relative elements in your stylesheets \r\n // (to 0 if you do not need them) \r\n this.element.makePositioned();\r\n this.originalLeft = parseFloat(this.element.getStyle(\'left\') || \'0\');\r\n this.originalTop = parseFloat(this.element.getStyle(\'top\') || \'0\');\r\n if(this.options.mode == \'absolute\') {\r\n // absolute movement, so we need to calc deltaX and deltaY\r\n this.options.x = this.options.x - this.originalLeft;\r\n this.options.y = this.options.y - this.originalTop;\r\n }\r\n },\r\n update: function(position) {\r\n this.element.setStyle({\r\n left: Math.round(this.options.x * position + this.originalLeft) + \'px\',\r\n top: Math.round(this.options.y * position + this.originalTop) + \'px\'\r\n });\r\n }\r\n});\r\n\r\n// for backwards compatibility\r\nEffect.MoveBy = function(element, toTop, toLeft) {\r\n return new Effect.Move(element, \r\n Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));\r\n};\r\n\r\nEffect.Scale = Class.create();\r\nObject.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {\r\n initialize: function(element, percent) {\r\n this.element = $(element);\r\n if(!this.element) throw(Effect._elementDoesNotExistError);\r\n var options = Object.extend({\r\n scaleX: true,\r\n scaleY: true,\r\n scaleContent: true,\r\n scaleFromCenter: false,\r\n scaleMode: \'box\', // \'box\' or \'contents\' or {} with provided values\r\n scaleFrom: 100.0,\r\n scaleTo: percent\r\n }, arguments[2] || {});\r\n this.start(options);\r\n },\r\n setup: function() {\r\n this.restoreAfterFinish = this.options.restoreAfterFinish || false;\r\n this.elementPositioning = this.element.getStyle(\'position\');\r\n \r\n this.originalStyle = {};\r\n [\'top\',\'left\',\'width\',\'height\',\'fontSize\'].each( function(k) {\r\n this.originalStyle[k] = this.element.style[k];\r\n }.bind(this));\r\n \r\n this.originalTop = this.element.offsetTop;\r\n this.originalLeft = this.element.offsetLeft;\r\n \r\n var fontSize = this.element.getStyle(\'font-size\') || \'100%\';\r\n [\'em\',\'px\',\'%\',\'pt\'].each( function(fontSizeType) {\r\n if(fontSize.indexOf(fontSizeType)>0) {\r\n this.fontSize = parseFloat(fontSize);\r\n this.fontSizeType = fontSizeType;\r\n }\r\n }.bind(this));\r\n \r\n this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;\r\n \r\n this.dims = null;\r\n if(this.options.scaleMode==\'box\')\r\n this.dims = [this.element.offsetHeight, this.element.offsetWidth];\r\n if(/^content/.test(this.options.scaleMode))\r\n this.dims = [this.element.scrollHeight, this.element.scrollWidth];\r\n if(!this.dims)\r\n this.dims = [this.options.scaleMode.originalHeight,\r\n this.options.scaleMode.originalWidth];\r\n },\r\n update: function(position) {\r\n var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);\r\n if(this.options.scaleContent && this.fontSize)\r\n this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });\r\n this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);\r\n },\r\n finish: function(position) {\r\n if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);\r\n },\r\n setDimensions: function(height, width) {\r\n var d = {};\r\n if(this.options.scaleX) d.width = Math.round(width) + \'px\';\r\n if(this.options.scaleY) d.height = Math.round(height) + \'px\';\r\n if(this.options.scaleFromCenter) {\r\n var topd = (height - this.dims[0])/2;\r\n var leftd = (width - this.dims[1])/2;\r\n if(this.elementPositioning == \'absolute\') {\r\n if(this.options.scaleY) d.top = this.originalTop-topd + \'px\';\r\n if(this.options.scaleX) d.left = this.originalLeft-leftd + \'px\';\r\n } else {\r\n if(this.options.scaleY) d.top = -topd + \'px\';\r\n if(this.options.scaleX) d.left = -leftd + \'px\';\r\n }\r\n }\r\n this.element.setStyle(d);\r\n }\r\n});\r\n\r\nEffect.Highlight = Class.create();\r\nObject.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {\r\n initialize: function(element) {\r\n this.element = $(element);\r\n if(!this.element) throw(Effect._elementDoesNotExistError);\r\n var options = Object.extend({ startcolor: \'#ffff99\' }, arguments[1] || {});\r\n this.start(options);\r\n },\r\n setup: function() {\r\n // Prevent executing on elements not in the layout flow\r\n if(this.element.getStyle(\'display\')==\'none\') { this.cancel(); return; }\r\n // Disable background image during the effect\r\n this.oldStyle = {};\r\n if (!this.options.keepBackgroundImage) {\r\n this.oldStyle.backgroundImage = this.element.getStyle(\'background-image\');\r\n this.element.setStyle({backgroundImage: \'none\'});\r\n }\r\n if(!this.options.endcolor)\r\n this.options.endcolor = this.element.getStyle(\'background-color\').parseColor(\'#ffffff\');\r\n if(!this.options.restorecolor)\r\n this.options.restorecolor = this.element.getStyle(\'background-color\');\r\n // init color calculations\r\n this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));\r\n this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));\r\n },\r\n update: function(position) {\r\n this.element.setStyle({backgroundColor: $R(0,2).inject(\'#\',function(m,v,i){\r\n return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });\r\n },\r\n finish: function() {\r\n this.element.setStyle(Object.extend(this.oldStyle, {\r\n backgroundColor: this.options.restorecolor\r\n }));\r\n }\r\n});\r\n\r\nEffect.ScrollTo = Class.create();\r\nObject.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {\r\n initialize: function(element) {\r\n this.element = $(element);\r\n this.start(arguments[1] || {});\r\n },\r\n setup: function() {\r\n Position.prepare();\r\n var offsets = Position.cumulativeOffset(this.element);\r\n if(this.options.offset) offsets[1] += this.options.offset;\r\n var max = window.innerHeight ? \r\n window.height - window.innerHeight :\r\n document.body.scrollHeight - \r\n (document.documentElement.clientHeight ? \r\n document.documentElement.clientHeight : document.body.clientHeight);\r\n this.scrollStart = Position.deltaY;\r\n this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;\r\n },\r\n update: function(position) {\r\n Position.prepare();\r\n window.scrollTo(Position.deltaX, \r\n this.scrollStart + (position*this.delta));\r\n }\r\n});\r\n\r\n/* ------------- combination effects ------------- */\r\n\r\nEffect.Fade = function(element) {\r\n element = $(element);\r\n var oldOpacity = element.getInlineOpacity();\r\n var options = Object.extend({\r\n from: element.getOpacity() || 1.0,\r\n to: 0.0,\r\n afterFinishInternal: function(effect) { \r\n if(effect.options.to!=0) return;\r\n effect.element.hide().setStyle({opacity: oldOpacity}); \r\n }}, arguments[1] || {});\r\n return new Effect.Opacity(element,options);\r\n}\r\n\r\nEffect.Appear = function(element) {\r\n element = $(element);\r\n var options = Object.extend({\r\n from: (element.getStyle(\'display\') == \'none\' ? 0.0 : element.getOpacity() || 0.0),\r\n to: 1.0,\r\n // force Safari to render floated elements properly\r\n afterFinishInternal: function(effect) {\r\n effect.element.forceRerendering();\r\n },\r\n beforeSetup: function(effect) {\r\n effect.element.setOpacity(effect.options.from).show(); \r\n }}, arguments[1] || {});\r\n return new Effect.Opacity(element,options);\r\n}\r\n\r\nEffect.Puff = function(element) {\r\n element = $(element);\r\n var oldStyle = { \r\n opacity: element.getInlineOpacity(), \r\n position: element.getStyle(\'position\'),\r\n top: element.style.top,\r\n left: element.style.left,\r\n width: element.style.width,\r\n height: element.style.height\r\n };\r\n return new Effect.Parallel(\r\n [ new Effect.Scale(element, 200, \r\n { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), \r\n new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], \r\n Object.extend({ duration: 1.0, \r\n beforeSetupInternal: function(effect) {\r\n Position.absolutize(effect.effects[0].element)\r\n },\r\n afterFinishInternal: function(effect) {\r\n effect.effects[0].element.hide().setStyle(oldStyle); }\r\n }, arguments[1] || {})\r\n );\r\n}\r\n\r\nEffect.BlindUp = function(element) {\r\n element = $(element);\r\n element.makeClipping();\r\n return new Effect.Scale(element, 0,\r\n Object.extend({ scaleContent: false, \r\n scaleX: false, \r\n restoreAfterFinish: true,\r\n afterFinishInternal: function(effect) {\r\n effect.element.hide().undoClipping();\r\n } \r\n }, arguments[1] || {})\r\n );\r\n}\r\n\r\nEffect.BlindDown = function(element) {\r\n element = $(element);\r\n var elementDimensions = element.getDimensions();\r\n return new Effect.Scale(element, 100, Object.extend({ \r\n scaleContent: false, \r\n scaleX: false,\r\n scaleFrom: 0,\r\n scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\r\n restoreAfterFinish: true,\r\n afterSetup: function(effect) {\r\n effect.element.makeClipping().setStyle({height: \'0px\'}).show(); \r\n }, \r\n afterFinishInternal: function(effect) {\r\n effect.element.undoClipping();\r\n }\r\n }, arguments[1] || {}));\r\n}\r\n\r\nEffect.SwitchOff = function(element) {\r\n element = $(element);\r\n var oldOpacity = element.getInlineOpacity();\r\n return new Effect.Appear(element, Object.extend({\r\n duration: 0.4,\r\n from: 0,\r\n transition: Effect.Transitions.flicker,\r\n afterFinishInternal: function(effect) {\r\n new Effect.Scale(effect.element, 1, { \r\n duration: 0.3, scaleFromCenter: true,\r\n scaleX: false, scaleContent: false, restoreAfterFinish: true,\r\n beforeSetup: function(effect) { \r\n effect.element.makePositioned().makeClipping();\r\n },\r\n afterFinishInternal: function(effect) {\r\n effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});\r\n }\r\n })\r\n }\r\n }, arguments[1] || {}));\r\n}\r\n\r\nEffect.DropOut = function(element) {\r\n element = $(element);\r\n var oldStyle = {\r\n top: element.getStyle(\'top\'),\r\n left: element.getStyle(\'left\'),\r\n opacity: element.getInlineOpacity() };\r\n return new Effect.Parallel(\r\n [ new Effect.Move(element, {x: 0, y: 100, sync: true }), \r\n new Effect.Opacity(element, { sync: true, to: 0.0 }) ],\r\n Object.extend(\r\n { duration: 0.5,\r\n beforeSetup: function(effect) {\r\n effect.effects[0].element.makePositioned(); \r\n },\r\n afterFinishInternal: function(effect) {\r\n effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);\r\n } \r\n }, arguments[1] || {}));\r\n}\r\n\r\nEffect.Shake = function(element) {\r\n element = $(element);\r\n var oldStyle = {\r\n top: element.getStyle(\'top\'),\r\n left: element.getStyle(\'left\') };\r\n return new Effect.Move(element, \r\n { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\r\n new Effect.Move(effect.element,\r\n { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r\n new Effect.Move(effect.element,\r\n { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r\n new Effect.Move(effect.element,\r\n { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r\n new Effect.Move(effect.element,\r\n { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {\r\n new Effect.Move(effect.element,\r\n { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\r\n effect.element.undoPositioned().setStyle(oldStyle);\r\n }}) }}) }}) }}) }}) }});\r\n}\r\n\r\nEffect.SlideDown = function(element) {\r\n element = $(element).cleanWhitespace();\r\n // SlideDown need to have the content of the element wrapped in a container element with fixed height!\r\n var oldInnerBottom = element.down().getStyle(\'bottom\');\r\n var elementDimensions = element.getDimensions();\r\n return new Effect.Scale(element, 100, Object.extend({ \r\n scaleContent: false, \r\n scaleX: false, \r\n scaleFrom: window.opera ? 0 : 1,\r\n scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\r\n restoreAfterFinish: true,\r\n afterSetup: function(effect) {\r\n effect.element.makePositioned();\r\n effect.element.down().makePositioned();\r\n if(window.opera) effect.element.setStyle({top: \'\'});\r\n effect.element.makeClipping().setStyle({height: \'0px\'}).show(); \r\n },\r\n afterUpdateInternal: function(effect) {\r\n effect.element.down().setStyle({bottom:\r\n (effect.dims[0] - effect.element.clientHeight) + \'px\' }); \r\n },\r\n afterFinishInternal: function(effect) {\r\n effect.element.undoClipping().undoPositioned();\r\n effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }\r\n }, arguments[1] || {})\r\n );\r\n}\r\n\r\nEffect.SlideUp = function(element) {\r\n element = $(element).cleanWhitespace();\r\n var oldInnerBottom = element.down().getStyle(\'bottom\');\r\n return new Effect.Scale(element, window.opera ? 0 : 1,\r\n Object.extend({ scaleContent: false, \r\n scaleX: false, \r\n scaleMode: \'box\',\r\n scaleFrom: 100,\r\n restoreAfterFinish: true,\r\n beforeStartInternal: function(effect) {\r\n effect.element.makePositioned();\r\n effect.element.down().makePositioned();\r\n if(window.opera) effect.element.setStyle({top: \'\'});\r\n effect.element.makeClipping().show();\r\n }, \r\n afterUpdateInternal: function(effect) {\r\n effect.element.down().setStyle({bottom:\r\n (effect.dims[0] - effect.element.clientHeight) + \'px\' });\r\n },\r\n afterFinishInternal: function(effect) {\r\n effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});\r\n effect.element.down().undoPositioned();\r\n }\r\n }, arguments[1] || {})\r\n );\r\n}\r\n\r\n// Bug in opera makes the TD containing this element expand for a instance after finish \r\nEffect.Squish = function(element) {\r\n return new Effect.Scale(element, window.opera ? 1 : 0, { \r\n restoreAfterFinish: true,\r\n beforeSetup: function(effect) {\r\n effect.element.makeClipping(); \r\n }, \r\n afterFinishInternal: function(effect) {\r\n effect.element.hide().undoClipping(); \r\n }\r\n });\r\n}\r\n\r\nEffect.Grow = function(element) {\r\n element = $(element);\r\n var options = Object.extend({\r\n direction: \'center\',\r\n moveTransition: Effect.Transitions.sinoidal,\r\n scaleTransition: Effect.Transitions.sinoidal,\r\n opacityTransition: Effect.Transitions.full\r\n }, arguments[1] || {});\r\n var oldStyle = {\r\n top: element.style.top,\r\n left: element.style.left,\r\n height: element.style.height,\r\n width: element.style.width,\r\n opacity: element.getInlineOpacity() };\r\n\r\n var dims = element.getDimensions(); \r\n var initialMoveX, initialMoveY;\r\n var moveX, moveY;\r\n \r\n switch (options.direction) {\r\n case \'top-left\':\r\n initialMoveX = initialMoveY = moveX = moveY = 0; \r\n break;\r\n case \'top-right\':\r\n initialMoveX = dims.width;\r\n initialMoveY = moveY = 0;\r\n moveX = -dims.width;\r\n break;\r\n case \'bottom-left\':\r\n initialMoveX = moveX = 0;\r\n initialMoveY = dims.height;\r\n moveY = -dims.height;\r\n break;\r\n case \'bottom-right\':\r\n initialMoveX = dims.width;\r\n initialMoveY = dims.height;\r\n moveX = -dims.width;\r\n moveY = -dims.height;\r\n break;\r\n case \'center\':\r\n initialMoveX = dims.width / 2;\r\n initialMoveY = dims.height / 2;\r\n moveX = -dims.width / 2;\r\n moveY = -dims.height / 2;\r\n break;\r\n }\r\n \r\n return new Effect.Move(element, {\r\n x: initialMoveX,\r\n y: initialMoveY,\r\n duration: 0.01, \r\n beforeSetup: function(effect) {\r\n effect.element.hide().makeClipping().makePositioned();\r\n },\r\n afterFinishInternal: function(effect) {\r\n new Effect.Parallel(\r\n [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),\r\n new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),\r\n new Effect.Scale(effect.element, 100, {\r\n scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, \r\n sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})\r\n ], Object.extend({\r\n beforeSetup: function(effect) {\r\n effect.effects[0].element.setStyle({height: \'0px\'}).show(); \r\n },\r\n afterFinishInternal: function(effect) {\r\n effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); \r\n }\r\n }, options)\r\n )\r\n }\r\n });\r\n}\r\n\r\nEffect.Shrink = function(element) {\r\n element = $(element);\r\n var options = Object.extend({\r\n direction: \'center\',\r\n moveTransition: Effect.Transitions.sinoidal,\r\n scaleTransition: Effect.Transitions.sinoidal,\r\n opacityTransition: Effect.Transitions.none\r\n }, arguments[1] || {});\r\n var oldStyle = {\r\n top: element.style.top,\r\n left: element.style.left,\r\n height: element.style.height,\r\n width: element.style.width,\r\n opacity: element.getInlineOpacity() };\r\n\r\n var dims = element.getDimensions();\r\n var moveX, moveY;\r\n \r\n switch (options.direction) {\r\n case \'top-left\':\r\n moveX = moveY = 0;\r\n break;\r\n case \'top-right\':\r\n moveX = dims.width;\r\n moveY = 0;\r\n break;\r\n case \'bottom-left\':\r\n moveX = 0;\r\n moveY = dims.height;\r\n break;\r\n case \'bottom-right\':\r\n moveX = dims.width;\r\n moveY = dims.height;\r\n break;\r\n case \'center\': \r\n moveX = dims.width / 2;\r\n moveY = dims.height / 2;\r\n break;\r\n }\r\n \r\n return new Effect.Parallel(\r\n [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),\r\n new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),\r\n new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })\r\n ], Object.extend({ \r\n beforeStartInternal: function(effect) {\r\n effect.effects[0].element.makePositioned().makeClipping(); \r\n },\r\n afterFinishInternal: function(effect) {\r\n effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }\r\n }, options)\r\n );\r\n}\r\n\r\nEffect.Pulsate = function(element) {\r\n element = $(element);\r\n var options = arguments[1] || {};\r\n var oldOpacity = element.getInlineOpacity();\r\n var transition = options.transition || Effect.Transitions.sinoidal;\r\n var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };\r\n reverser.bind(transition);\r\n return new Effect.Opacity(element, \r\n Object.extend(Object.extend({ duration: 2.0, from: 0,\r\n afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }\r\n }, options), {transition: reverser}));\r\n}\r\n\r\nEffect.Fold = function(element) {\r\n element = $(element);\r\n var oldStyle = {\r\n top: element.style.top,\r\n left: element.style.left,\r\n width: element.style.width,\r\n height: element.style.height };\r\n element.makeClipping();\r\n return new Effect.Scale(element, 5, Object.extend({ \r\n scaleContent: false,\r\n scaleX: false,\r\n afterFinishInternal: function(effect) {\r\n new Effect.Scale(element, 1, { \r\n scaleContent: false, \r\n scaleY: false,\r\n afterFinishInternal: function(effect) {\r\n effect.element.hide().undoClipping().setStyle(oldStyle);\r\n } });\r\n }}, arguments[1] || {}));\r\n};\r\n\r\nEffect.Morph = Class.create();\r\nObject.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {\r\n initialize: function(element) {\r\n this.element = $(element);\r\n if(!this.element) throw(Effect._elementDoesNotExistError);\r\n var options = Object.extend({\r\n style: {}\r\n }, arguments[1] || {});\r\n if (typeof options.style == \'string\') {\r\n if(options.style.indexOf(\':\') == -1) {\r\n var cssText = \'\', selector = \'.\' + options.style;\r\n $A(document.styleSheets).reverse().each(function(styleSheet) {\r\n if (styleSheet.cssRules) cssRules = styleSheet.cssRules;\r\n else if (styleSheet.rules) cssRules = styleSheet.rules;\r\n $A(cssRules).reverse().each(function(rule) {\r\n if (selector == rule.selectorText) {\r\n cssText = rule.style.cssText;\r\n throw $break;\r\n }\r\n });\r\n if (cssText) throw $break;\r\n });\r\n this.style = cssText.parseStyle();\r\n options.afterFinishInternal = function(effect){\r\n effect.element.addClassName(effect.options.style);\r\n effect.transforms.each(function(transform) {\r\n if(transform.style != \'opacity\')\r\n effect.element.style[transform.style.camelize()] = \'\';\r\n });\r\n }\r\n } else this.style = options.style.parseStyle();\r\n } else this.style = $H(options.style)\r\n this.start(options);\r\n },\r\n setup: function(){\r\n function parseColor(color){\r\n if(!color || [\'rgba(0, 0, 0, 0)\',\'transparent\'].include(color)) color = \'#ffffff\';\r\n color = color.parseColor();\r\n return $R(0,2).map(function(i){\r\n return parseInt( color.slice(i*2+1,i*2+3), 16 ) \r\n });\r\n }\r\n this.transforms = this.style.map(function(pair){\r\n var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;\r\n\r\n if(value.parseColor(\'#zzzzzz\') != \'#zzzzzz\') {\r\n value = value.parseColor();\r\n unit = \'color\';\r\n } else if(property == \'opacity\') {\r\n value = parseFloat(value);\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))\r\n this.element.setStyle({zoom: 1});\r\n } else if(Element.CSS_LENGTH.test(value)) \r\n var components = value.match(/^([\\+\\-]?[0-9\\.]+)(.*)$/),\r\n value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;\r\n\r\n var originalValue = this.element.getStyle(property);\r\n return $H({ \r\n style: property, \r\n originalValue: unit==\'color\' ? parseColor(originalValue) : parseFloat(originalValue || 0), \r\n targetValue: unit==\'color\' ? parseColor(value) : value,\r\n unit: unit\r\n });\r\n }.bind(this)).reject(function(transform){\r\n return (\r\n (transform.originalValue == transform.targetValue) ||\r\n (\r\n transform.unit != \'color\' &&\r\n (isNaN(transform.originalValue) || isNaN(transform.targetValue))\r\n )\r\n )\r\n });\r\n },\r\n update: function(position) {\r\n var style = $H(), value = null;\r\n this.transforms.each(function(transform){\r\n value = transform.unit==\'color\' ?\r\n $R(0,2).inject(\'#\',function(m,v,i){\r\n return m+(Math.round(transform.originalValue[i]+\r\n (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : \r\n transform.originalValue + Math.round(\r\n ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;\r\n style[transform.style] = value;\r\n });\r\n this.element.setStyle(style);\r\n }\r\n});\r\n\r\nEffect.Transform = Class.create();\r\nObject.extend(Effect.Transform.prototype, {\r\n initialize: function(tracks){\r\n this.tracks = [];\r\n this.options = arguments[1] || {};\r\n this.addTracks(tracks);\r\n },\r\n addTracks: function(tracks){\r\n tracks.each(function(track){\r\n var data = $H(track).values().first();\r\n this.tracks.push($H({\r\n ids: $H(track).keys().first(),\r\n effect: Effect.Morph,\r\n options: { style: data }\r\n }));\r\n }.bind(this));\r\n return this;\r\n },\r\n play: function(){\r\n return new Effect.Parallel(\r\n this.tracks.map(function(track){\r\n var elements = [$(track.ids) || $$(track.ids)].flatten();\r\n return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });\r\n }).flatten(),\r\n this.options\r\n );\r\n }\r\n});\r\n\r\nElement.CSS_PROPERTIES = $w(\r\n \'backgroundColor backgroundPosition borderBottomColor borderBottomStyle \' + \r\n \'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth \' +\r\n \'borderRightColor borderRightStyle borderRightWidth borderSpacing \' +\r\n \'borderTopColor borderTopStyle borderTopWidth bottom clip color \' +\r\n \'fontSize fontWeight height left letterSpacing lineHeight \' +\r\n \'marginBottom marginLeft marginRight marginTop markerOffset maxHeight \'+\r\n \'maxWidth minHeight minWidth opacity outlineColor outlineOffset \' +\r\n \'outlineWidth paddingBottom paddingLeft paddingRight paddingTop \' +\r\n \'right textIndent top width wordSpacing zIndex\');\r\n \r\nElement.CSS_LENGTH = /^(([\\+\\-]?[0-9\\.]+)(em|ex|px|in|cm|mm|pt|pc|\\%))|0$/;\r\n\r\nString.prototype.parseStyle = function(){\r\n var element = Element.extend(document.createElement(\'div\'));\r\n element.innerHTML = \'<div style=\"\' + this + \'\"></div>\';\r\n var style = element.down().style, styleRules = $H();\r\n \r\n Element.CSS_PROPERTIES.each(function(property){\r\n if(style[property]) styleRules[property] = style[property]; \r\n });\r\n if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf(\'opacity\') > -1) {\r\n styleRules.opacity = this.match(/opacity:\\s*((?:0|1)?(?:\\.\\d*)?)/)[1];\r\n }\r\n return styleRules;\r\n};\r\n\r\nElement.morph = function(element, style) {\r\n new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));\r\n return element;\r\n};\r\n\r\n[\'setOpacity\',\'getOpacity\',\'getInlineOpacity\',\'forceRerendering\',\'setContentZoom\',\r\n \'collectTextNodes\',\'collectTextNodesIgnoreClass\',\'morph\'].each( \r\n function(f) { Element.Methods[f] = Element[f]; }\r\n);\r\n\r\nElement.Methods.visualEffect = function(element, effect, options) {\r\n s = effect.gsub(/_/, \'-\').camelize();\r\n effect_class = s.charAt(0).toUpperCase() + s.substring(1);\r\n new Effect[effect_class](element, options);\r\n return $(element);\r\n};\r\n\r\nElement.addMethods();\r\n\r\n\r\n// -----------------------------------------------------------------------------------\r\n//\r\n// Lightbox v2.03.3\r\n// by Lokesh Dhakar - http://www.huddletogether.com\r\n// 5/21/06\r\n//\r\n// For more information on this script, visit:\r\n// http://huddletogether.com/projects/lightbox2/\r\n//\r\n// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/\r\n// \r\n// Credit also due to those who have helped, inspired, and made their code available to the public.\r\n// Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), Thomas Fuchs(mir.aculo.us), and others.\r\n//\r\n//\r\n// -----------------------------------------------------------------------------------\r\n/*\r\n\r\n Table of Contents\r\n -----------------\r\n Configuration\r\n Global Variables\r\n\r\n Extending Built-in Objects \r\n - Object.extend(Element)\r\n - Array.prototype.removeDuplicates()\r\n - Array.prototype.empty()\r\n\r\n Lightbox Class Declaration\r\n - initialize()\r\n - updateImageList()\r\n - start()\r\n - changeImage()\r\n - resizeImageContainer()\r\n - showImage()\r\n - updateDetails()\r\n - updateNav()\r\n - enableKeyboardNav()\r\n - disableKeyboardNav()\r\n - keyboardAction()\r\n - preloadNeighborImages()\r\n - end()\r\n \r\n Miscellaneous Functions\r\n - getPageScroll()\r\n - getPageSize()\r\n - getKey()\r\n - listenKey()\r\n - showSelectBoxes()\r\n - hideSelectBoxes()\r\n - showFlash()\r\n - hideFlash()\r\n - pause()\r\n - initLightbox()\r\n \r\n Function Calls\r\n - addLoadEvent(initLightbox)\r\n \r\n*/\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// Configuration\r\n//\r\nvar fileLoadingImage = \"http://www.rhein-sieg.julis.de/fileadmin/freesite/groups/114/Lightbox/loading.gif\"; \r\nvar fileBottomNavCloseImage = \"http://www.rhein-sieg.julis.de/fileadmin/freesite/groups/114/Lightbox/closelabel.gif\";\r\n\r\nvar overlayOpacity = 0.8; // controls transparency of shadow overlay\r\n\r\nvar animate = true; // toggles resizing animations\r\nvar resizeSpeed = 7; // controls the speed of the image resizing animations (1=slowest and 10=fastest)\r\n\r\nvar borderSize = 10; //if you adjust the padding in the CSS, you will need to update this variable\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// Global Variables\r\n//\r\nvar imageArray = new Array;\r\nvar activeImage;\r\n\r\nif(animate == true){\r\n overlayDuration = 0.2; // shadow fade in/out duration\r\n if(resizeSpeed > 10){ resizeSpeed = 10;}\r\n if(resizeSpeed < 1){ resizeSpeed = 1;}\r\n resizeDuration = (11 - resizeSpeed) * 0.15;\r\n} else { \r\n overlayDuration = 0;\r\n resizeDuration = 0;\r\n}\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// Additional methods for Element added by SU, Couloir\r\n// - further additions by Lokesh Dhakar (huddletogether.com)\r\n//\r\nObject.extend(Element, {\r\n getWidth: function(element) {\r\n element = $(element);\r\n return element.offsetWidth; \r\n },\r\n setWidth: function(element,w) {\r\n element = $(element);\r\n element.style.width = w +\"px\";\r\n },\r\n setHeight: function(element,h) {\r\n element = $(element);\r\n element.style.height = h +\"px\";\r\n },\r\n setTop: function(element,t) {\r\n element = $(element);\r\n element.style.top = t +\"px\";\r\n },\r\n setLeft: function(element,l) {\r\n element = $(element);\r\n element.style.left = l +\"px\";\r\n },\r\n setSrc: function(element,src) {\r\n element = $(element);\r\n element.src = src; \r\n },\r\n setHref: function(element,href) {\r\n element = $(element);\r\n element.href = href; \r\n },\r\n setInnerHTML: function(element,content) {\r\n element = $(element);\r\n element.innerHTML = content;\r\n }\r\n});\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// Extending built-in Array object\r\n// - array.removeDuplicates()\r\n// - array.empty()\r\n//\r\nArray.prototype.removeDuplicates = function () {\r\n for(i = 0; i < this.length; i++){\r\n for(j = this.length-1; j>i; j--){ \r\n if(this[i][0] == this[j][0]){\r\n this.splice(j,1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\nArray.prototype.empty = function () {\r\n for(i = 0; i <= this.length; i++){\r\n this.shift();\r\n }\r\n}\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// Lightbox Class Declaration\r\n// - initialize()\r\n// - start()\r\n// - changeImage()\r\n// - resizeImageContainer()\r\n// - showImage()\r\n// - updateDetails()\r\n// - updateNav()\r\n// - enableKeyboardNav()\r\n// - disableKeyboardNav()\r\n// - keyboardNavAction()\r\n// - preloadNeighborImages()\r\n// - end()\r\n//\r\n// Structuring of code inspired by Scott Upton (http://www.uptonic.com/)\r\n//\r\nvar Lightbox = Class.create();\r\n\r\nLightbox.prototype = {\r\n \r\n // initialize()\r\n // Constructor runs on completion of the DOM loading. Calls updateImageList and then\r\n // the function inserts html at the bottom of the page which is used to display the shadow \r\n // overlay and the image container.\r\n //\r\n initialize: function() { \r\n \r\n this.updateImageList();\r\n\r\n // Code inserts html at the bottom of the page that looks similar to this:\r\n //\r\n // <div id=\"overlay\"></div>\r\n // <div id=\"lightbox\">\r\n // <div id=\"outerImageContainer\">\r\n // <div id=\"imageContainer\">\r\n // <img id=\"lightboxImage\">\r\n // <div style=\"\" id=\"hoverNav\">\r\n // <a href=\"#\" id=\"prevLink\"></a>\r\n // <a href=\"#\" id=\"nextLink\"></a>\r\n // </div>\r\n // <div id=\"loading\">\r\n // <a href=\"#\" id=\"loadingLink\">\r\n // <img src=\"http://www.rhein-sieg.julis.de/fileadmin/freesite/groups/114/Lightbox/loading.gif\">\r\n // </a>\r\n // </div>\r\n // </div>\r\n // </div>\r\n // <div id=\"imageDataContainer\">\r\n // <div id=\"imageData\">\r\n // <div id=\"imageDetails\">\r\n // <span id=\"caption\"></span>\r\n // <span id=\"numberDisplay\"></span>\r\n // </div>\r\n // <div id=\"bottomNav\">\r\n // <a href=\"#\" id=\"bottomNavClose\">\r\n // <img src=\"http://www.rhein-sieg.julis.de/fileadmin/freesite/groups/114/Lightbox/close.gif\">\r\n // </a>\r\n // </div>\r\n // </div>\r\n // </div>\r\n // </div>\r\n\r\n\r\n var objBody = document.getElementsByTagName(\"body\").item(0);\r\n \r\n var objOverlay = document.createElement(\"div\");\r\n objOverlay.setAttribute(\'id\',\'overlay\');\r\n objOverlay.style.display = \'none\';\r\n objOverlay.onclick = function() { myLightbox.end(); }\r\n objBody.appendChild(objOverlay);\r\n \r\n var objLightbox = document.createElement(\"div\");\r\n objLightbox.setAttribute(\'id\',\'lightbox\');\r\n objLightbox.style.display = \'none\';\r\n objLightbox.onclick = function(e) { // close Lightbox is user clicks shadow overlay\r\n if (!e) var e = window.event;\r\n var clickObj = Event.element(e).id;\r\n if ( clickObj == \'lightbox\') {\r\n myLightbox.end();\r\n }\r\n };\r\n objBody.appendChild(objLightbox);\r\n \r\n var objOuterImageContainer = document.createElement(\"div\");\r\n objOuterImageContainer.setAttribute(\'id\',\'outerImageContainer\');\r\n objLightbox.appendChild(objOuterImageContainer);\r\n\r\n // When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.\r\n // If animations are turned off, it will be hidden as to prevent a flicker of a\r\n // white 250 by 250 box.\r\n if(animate){\r\n Element.setWidth(\'outerImageContainer\', 250);\r\n Element.setHeight(\'outerImageContainer\', 250); \r\n } else {\r\n Element.setWidth(\'outerImageContainer\', 1);\r\n Element.setHeight(\'outerImageContainer\', 1); \r\n }\r\n\r\n var objImageContainer = document.createElement(\"div\");\r\n objImageContainer.setAttribute(\'id\',\'imageContainer\');\r\n objOuterImageContainer.appendChild(objImageContainer);\r\n \r\n var objLightboxImage = document.createElement(\"img\");\r\n objLightboxImage.setAttribute(\'id\',\'lightboxImage\');\r\n objImageContainer.appendChild(objLightboxImage);\r\n \r\n var objHoverNav = document.createElement(\"div\");\r\n objHoverNav.setAttribute(\'id\',\'hoverNav\');\r\n objImageContainer.appendChild(objHoverNav);\r\n \r\n var objPrevLink = document.createElement(\"a\");\r\n objPrevLink.setAttribute(\'id\',\'prevLink\');\r\n objPrevLink.setAttribute(\'href\',\'#\');\r\n objHoverNav.appendChild(objPrevLink);\r\n \r\n var objNextLink = document.createElement(\"a\");\r\n objNextLink.setAttribute(\'id\',\'nextLink\');\r\n objNextLink.setAttribute(\'href\',\'#\');\r\n objHoverNav.appendChild(objNextLink);\r\n \r\n var objLoading = document.createElement(\"div\");\r\n objLoading.setAttribute(\'id\',\'loading\');\r\n objImageContainer.appendChild(objLoading);\r\n \r\n var objLoadingLink = document.createElement(\"a\");\r\n objLoadingLink.setAttribute(\'id\',\'loadingLink\');\r\n objLoadingLink.setAttribute(\'href\',\'#\');\r\n objLoadingLink.onclick = function() { myLightbox.end(); return false; }\r\n objLoading.appendChild(objLoadingLink);\r\n \r\n var objLoadingImage = document.createElement(\"img\");\r\n objLoadingImage.setAttribute(\'src\', fileLoadingImage);\r\n objLoadingLink.appendChild(objLoadingImage);\r\n\r\n var objImageDataContainer = document.createElement(\"div\");\r\n objImageDataContainer.setAttribute(\'id\',\'imageDataContainer\');\r\n objLightbox.appendChild(objImageDataContainer);\r\n\r\n var objImageData = document.createElement(\"div\");\r\n objImageData.setAttribute(\'id\',\'imageData\');\r\n objImageDataContainer.appendChild(objImageData);\r\n \r\n var objImageDetails = document.createElement(\"div\");\r\n objImageDetails.setAttribute(\'id\',\'imageDetails\');\r\n objImageData.appendChild(objImageDetails);\r\n \r\n var objCaption = document.createElement(\"span\");\r\n objCaption.setAttribute(\'id\',\'caption\');\r\n objImageDetails.appendChild(objCaption);\r\n \r\n var objNumberDisplay = document.createElement(\"span\");\r\n objNumberDisplay.setAttribute(\'id\',\'numberDisplay\');\r\n objImageDetails.appendChild(objNumberDisplay);\r\n \r\n var objBottomNav = document.createElement(\"div\");\r\n objBottomNav.setAttribute(\'id\',\'bottomNav\');\r\n objImageData.appendChild(objBottomNav);\r\n \r\n var objBottomNavCloseLink = document.createElement(\"a\");\r\n objBottomNavCloseLink.setAttribute(\'id\',\'bottomNavClose\');\r\n objBottomNavCloseLink.setAttribute(\'href\',\'#\');\r\n objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; }\r\n objBottomNav.appendChild(objBottomNavCloseLink);\r\n \r\n var objBottomNavCloseImage = document.createElement(\"img\");\r\n objBottomNavCloseImage.setAttribute(\'src\', fileBottomNavCloseImage);\r\n objBottomNavCloseLink.appendChild(objBottomNavCloseImage);\r\n },\r\n\r\n\r\n //\r\n // updateImageList()\r\n // Loops through anchor tags looking for \'lightbox\' references and applies onclick\r\n // events to appropriate links. You can rerun after dynamically adding images w/ajax.\r\n //\r\n updateImageList: function() { \r\n if (!document.getElementsByTagName){ return; }\r\n var anchors = document.getElementsByTagName(\'a\');\r\n var areas = document.getElementsByTagName(\'area\');\r\n\r\n // loop through all anchor tags\r\n for (var i=0; i<anchors.length; i++){\r\n var anchor = anchors[i];\r\n \r\n var relAttribute = String(anchor.getAttribute(\'rel\'));\r\n \r\n // use the string.match() method to catch \'lightbox\' references in the rel attribute\r\n if (anchor.getAttribute(\'href\') && (relAttribute.toLowerCase().match(\'lightbox\'))){\r\n anchor.onclick = function () {myLightbox.start(this); return false;}\r\n }\r\n }\r\n\r\n // loop through all area tags\r\n // todo: combine anchor & area tag loops\r\n for (var i=0; i< areas.length; i++){\r\n var area = areas[i];\r\n \r\n var relAttribute = String(area.getAttribute(\'rel\'));\r\n \r\n // use the string.match() method to catch \'lightbox\' references in the rel attribute\r\n if (area.getAttribute(\'href\') && (relAttribute.toLowerCase().match(\'lightbox\'))){\r\n area.onclick = function () {myLightbox.start(this); return false;}\r\n }\r\n }\r\n },\r\n \r\n \r\n //\r\n // start()\r\n // Display overlay and lightbox. If image is part of a set, add siblings to imageArray.\r\n //\r\n start: function(imageLink) { \r\n\r\n hideSelectBoxes();\r\n hideFlash();\r\n\r\n // stretch overlay to fill page and fade in\r\n var arrayPageSize = getPageSize();\r\n Element.setWidth(\'overlay\', arrayPageSize[0]);\r\n Element.setHeight(\'overlay\', arrayPageSize[1]);\r\n\r\n new Effect.Appear(\'overlay\', { duration: overlayDuration, from: 0.0, to: overlayOpacity });\r\n\r\n imageArray = [];\r\n imageNum = 0; \r\n\r\n if (!document.getElementsByTagName){ return; }\r\n var anchors = document.getElementsByTagName( imageLink.tagName);\r\n\r\n // if image is NOT part of a set..\r\n if((imageLink.getAttribute(\'rel\') == \'lightbox\')){\r\n // add single image to imageArray\r\n imageArray.push(new Array(imageLink.getAttribute(\'href\'), imageLink.getAttribute(\'title\'))); \r\n } else {\r\n // if image is part of a set..\r\n\r\n // loop through anchors, find other images in set, and add them to imageArray\r\n for (var i=0; i<anchors.length; i++){\r\n var anchor = anchors[i];\r\n if (anchor.getAttribute(\'href\') && (anchor.getAttribute(\'rel\') == imageLink.getAttribute(\'rel\'))){\r\n imageArray.push(new Array(anchor.getAttribute(\'href\'), anchor.getAttribute(\'title\')));\r\n }\r\n }\r\n imageArray.removeDuplicates();\r\n while(imageArray[imageNum][0] != imageLink.getAttribute(\'href\')) { imageNum++;}\r\n }\r\n\r\n // calculate top and left offset for the lightbox \r\n var arrayPageScroll = getPageScroll();\r\n var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 10);\r\n var lightboxLeft = arrayPageScroll[0];\r\n Element.setTop(\'lightbox\', lightboxTop);\r\n Element.setLeft(\'lightbox\', lightboxLeft);\r\n \r\n Element.show(\'lightbox\');\r\n \r\n this.changeImage(imageNum);\r\n },\r\n\r\n //\r\n // changeImage()\r\n // Hide most elements and preload image in preparation for resizing image container.\r\n //\r\n changeImage: function(imageNum) { \r\n \r\n activeImage = imageNum; // update global var\r\n\r\n // hide elements during transition\r\n if(animate){ Element.show(\'loading\');}\r\n Element.hide(\'lightboxImage\');\r\n Element.hide(\'hoverNav\');\r\n Element.hide(\'prevLink\');\r\n Element.hide(\'nextLink\');\r\n Element.hide(\'imageDataContainer\');\r\n Element.hide(\'numberDisplay\'); \r\n \r\n imgPreloader = new Image();\r\n \r\n // once image is preloaded, resize image container\r\n imgPreloader.onload=function(){\r\n Element.setSrc(\'lightboxImage\', imageArray[activeImage][0]);\r\n myLightbox.resizeImageContainer(imgPreloader.width, imgPreloader.height);\r\n \r\n imgPreloader.onload=function(){}; // clear onLoad, IE behaves irratically with animated gifs otherwise \r\n }\r\n imgPreloader.src = imageArray[activeImage][0];\r\n },\r\n\r\n //\r\n // resizeImageContainer()\r\n //\r\n resizeImageContainer: function( imgWidth, imgHeight) {\r\n\r\n // get curren width and height\r\n this.widthCurrent = Element.getWidth(\'outerImageContainer\');\r\n this.heightCurrent = Element.getHeight(\'outerImageContainer\');\r\n\r\n // get new width and height\r\n var widthNew = (imgWidth + (borderSize * 2));\r\n var heightNew = (imgHeight + (borderSize * 2));\r\n\r\n // scalars based on change from old to new\r\n this.xScale = ( widthNew / this.widthCurrent) * 100;\r\n this.yScale = ( heightNew / this.heightCurrent) * 100;\r\n\r\n // calculate size difference between new and old image, and resize if necessary\r\n wDiff = this.widthCurrent - widthNew;\r\n hDiff = this.heightCurrent - heightNew;\r\n\r\n if(!( hDiff == 0)){ new Effect.Scale(\'outerImageContainer\', this.yScale, {scaleX: false, duration: resizeDuration, queue: \'front\'}); }\r\n if(!( wDiff == 0)){ new Effect.Scale(\'outerImageContainer\', this.xScale, {scaleY: false, delay: resizeDuration, duration: resizeDuration}); }\r\n\r\n // if new and old image are same size and no scaling transition is necessary, \r\n // do a quick pause to prevent image flicker.\r\n if((hDiff == 0) && (wDiff == 0)){\r\n if (navigator.appVersion.indexOf(\"MSIE\")!=-1){ pause(250); } else { pause(100);} \r\n }\r\n\r\n Element.setHeight(\'prevLink\', imgHeight);\r\n Element.setHeight(\'nextLink\', imgHeight);\r\n Element.setWidth( \'imageDataContainer\', widthNew);\r\n\r\n this.showImage();\r\n },\r\n \r\n //\r\n // showImage()\r\n // Display image and begin preloading neighbors.\r\n //\r\n showImage: function(){\r\n Element.hide(\'loading\');\r\n new Effect.Appear(\'lightboxImage\', { duration: resizeDuration, queue: \'end\', afterFinish: function(){ myLightbox.updateDetails(); } });\r\n this.preloadNeighborImages();\r\n },\r\n\r\n //\r\n // updateDetails()\r\n // Display caption, image number, and bottom nav.\r\n //\r\n updateDetails: function() {\r\n \r\n // if caption is not null\r\n if(imageArray[activeImage][1]){\r\n Element.show(\'caption\');\r\n Element.setInnerHTML( \'caption\', imageArray[activeImage][1]);\r\n }\r\n \r\n // if image is part of set display \'Image x of x\' \r\n if(imageArray.length > 1){\r\n Element.show(\'numberDisplay\');\r\n Element.setInnerHTML( \'numberDisplay\', \"Image \" + eval(activeImage + 1) + \" of \" + imageArray.length);\r\n }\r\n\r\n new Effect.Parallel(\r\n [ new Effect.SlideDown( \'imageDataContainer\', { sync: true, duration: resizeDuration, from: 0.0, to: 1.0 }), \r\n new Effect.Appear(\'imageDataContainer\', { sync: true, duration: resizeDuration }) ], \r\n { duration: resizeDuration, afterFinish: function() {\r\n // update overlay size and update nav\r\n var arrayPageSize = getPageSize();\r\n Element.setHeight(\'overlay\', arrayPageSize[1]);\r\n myLightbox.updateNav();\r\n }\r\n } \r\n );\r\n },\r\n\r\n //\r\n // updateNav()\r\n // Display appropriate previous and next hover navigation.\r\n //\r\n updateNav: function() {\r\n\r\n Element.show(\'hoverNav\'); \r\n\r\n // if not first image in set, display prev image button\r\n if(activeImage != 0){\r\n Element.show(\'prevLink\');\r\n document.getElementById(\'prevLink\').onclick = function() {\r\n myLightbox.changeImage(activeImage - 1); return false;\r\n }\r\n }\r\n\r\n // if not last image in set, display next image button\r\n if(activeImage != (imageArray.length - 1)){\r\n Element.show(\'nextLink\');\r\n document.getElementById(\'nextLink\').onclick = function() {\r\n myLightbox.changeImage(activeImage + 1); return false;\r\n }\r\n }\r\n \r\n this.enableKeyboardNav();\r\n },\r\n\r\n //\r\n // enableKeyboardNav()\r\n //\r\n enableKeyboardNav: function() {\r\n document.onkeydown = this.keyboardAction; \r\n },\r\n\r\n //\r\n // disableKeyboardNav()\r\n //\r\n disableKeyboardNav: function() {\r\n document.onkeydown = \'\';\r\n },\r\n\r\n //\r\n // keyboardAction()\r\n //\r\n keyboardAction: function(e) {\r\n if (e == null) { // ie\r\n keycode = event.keyCode;\r\n escapeKey = 27;\r\n } else { // mozilla\r\n keycode = e.keyCode;\r\n escapeKey = e.DOM_VK_ESCAPE;\r\n }\r\n\r\n key = String.fromCharCode(keycode).toLowerCase();\r\n \r\n if((key == \'x\') || (key == \'o\') || (key == \'c\') || (keycode == escapeKey)){ // close lightbox\r\n myLightbox.end();\r\n } else if((key == \'p\') || (keycode == 37)){ // display previous image\r\n if(activeImage != 0){\r\n myLightbox.disableKeyboardNav();\r\n myLightbox.changeImage(activeImage - 1);\r\n }\r\n } else if((key == \'n\') || (keycode == 39)){ // display next image\r\n if(activeImage != (imageArray.length - 1)){\r\n myLightbox.disableKeyboardNav();\r\n myLightbox.changeImage(activeImage + 1);\r\n }\r\n }\r\n\r\n },\r\n\r\n //\r\n // preloadNeighborImages()\r\n // Preload previous and next images.\r\n //\r\n preloadNeighborImages: function(){\r\n\r\n if((imageArray.length - 1) > activeImage){\r\n preloadNextImage = new Image();\r\n preloadNextImage.src = imageArray[activeImage + 1][0];\r\n }\r\n if(activeImage > 0){\r\n preloadPrevImage = new Image();\r\n preloadPrevImage.src = imageArray[activeImage - 1][0];\r\n }\r\n \r\n },\r\n\r\n //\r\n // end()\r\n //\r\n end: function() {\r\n this.disableKeyboardNav();\r\n Element.hide(\'lightbox\');\r\n new Effect.Fade(\'overlay\', { duration: overlayDuration});\r\n showSelectBoxes();\r\n showFlash();\r\n }\r\n}\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// getPageScroll()\r\n// Returns array with x,y page scroll values.\r\n// Core code from - quirksmode.com\r\n//\r\nfunction getPageScroll(){\r\n\r\n var xScroll, yScroll;\r\n\r\n if (self.pageYOffset) {\r\n yScroll = self.pageYOffset;\r\n xScroll = self.pageXOffset;\r\n } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict\r\n yScroll = document.documentElement.scrollTop;\r\n xScroll = document.documentElement.scrollLeft;\r\n } else if (document.body) {// all other Explorers\r\n yScroll = document.body.scrollTop;\r\n xScroll = document.body.scrollLeft; \r\n }\r\n\r\n arrayPageScroll = new Array(xScroll,yScroll) \r\n return arrayPageScroll;\r\n}\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// getPageSize()\r\n// Returns array with page width, height and window width, height\r\n// Core code from - quirksmode.com\r\n// Edit for Firefox by pHaez\r\n//\r\nfunction getPageSize(){\r\n \r\n var xScroll, yScroll;\r\n \r\n if (window.innerHeight && window.scrollMaxY) { \r\n xScroll = window.innerWidth + window.scrollMaxX;\r\n yScroll = window.innerHeight + window.scrollMaxY;\r\n } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac\r\n xScroll = document.body.scrollWidth;\r\n yScroll = document.body.scrollHeight;\r\n } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari\r\n xScroll = document.body.offsetWidth;\r\n yScroll = document.body.offsetHeight;\r\n }\r\n \r\n var windowWidth, windowHeight;\r\n \r\n// console.log(self.innerWidth);\r\n// console.log(document.documentElement.clientWidth);\r\n\r\n if (self.innerHeight) { // all except Explorer\r\n if(document.documentElement.clientWidth){\r\n windowWidth = document.documentElement.clientWidth; \r\n } else {\r\n windowWidth = self.innerWidth;\r\n }\r\n windowHeight = self.innerHeight;\r\n } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode\r\n windowWidth = document.documentElement.clientWidth;\r\n windowHeight = document.documentElement.clientHeight;\r\n } else if (document.body) { // other Explorers\r\n windowWidth = document.body.clientWidth;\r\n windowHeight = document.body.clientHeight;\r\n } \r\n \r\n // for small pages with total height less then height of the viewport\r\n if(yScroll < windowHeight){\r\n pageHeight = windowHeight;\r\n } else { \r\n pageHeight = yScroll;\r\n }\r\n\r\n// console.log(\"xScroll \" + xScroll)\r\n// console.log(\"windowWidth \" + windowWidth)\r\n\r\n // for small pages with total width less then width of the viewport\r\n if(xScroll < windowWidth){ \r\n pageWidth = xScroll; \r\n } else {\r\n pageWidth = windowWidth;\r\n }\r\n// console.log(\"pageWidth \" + pageWidth)\r\n\r\n arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) \r\n return arrayPageSize;\r\n}\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// getKey(key)\r\n// Gets keycode. If \'x\' is pressed then it hides the lightbox.\r\n//\r\nfunction getKey(e){\r\n if (e == null) { // ie\r\n keycode = event.keyCode;\r\n } else { // mozilla\r\n keycode = e.which;\r\n }\r\n key = String.fromCharCode(keycode).toLowerCase();\r\n \r\n if(key == \'x\'){\r\n }\r\n}\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n//\r\n// listenKey()\r\n//\r\nfunction listenKey () { document.onkeypress = getKey; }\r\n \r\n// ---------------------------------------------------\r\n\r\nfunction showSelectBoxes(){\r\n var selects = document.getElementsByTagName(\"select\");\r\n for (i = 0; i != selects.length; i++) {\r\n selects[i].style.visibility = \"visible\";\r\n }\r\n}\r\n\r\n// ---------------------------------------------------\r\n\r\nfunction hideSelectBoxes(){\r\n var selects = document.getElementsByTagName(\"select\");\r\n for (i = 0; i != selects.length; i++) {\r\n selects[i].style.visibility = \"hidden\";\r\n }\r\n}\r\n\r\n// ---------------------------------------------------\r\n\r\nfunction showFlash(){\r\n var flashObjects = document.getElementsByTagName(\"object\");\r\n for (i = 0; i < flashObjects.length; i++) {\r\n flashObjects[i].style.visibility = \"visible\";\r\n }\r\n\r\n var flashEmbeds = document.getElementsByTagName(\"embed\");\r\n for (i = 0; i < flashEmbeds.length; i++) {\r\n flashEmbeds[i].style.visibility = \"visible\";\r\n }\r\n}\r\n\r\n// ---------------------------------------------------\r\n\r\nfunction hideFlash(){\r\n var flashObjects = document.getElementsByTagName(\"object\");\r\n for (i = 0; i < flashObjects.length; i++) {\r\n flashObjects[i].style.visibility = \"hidden\";\r\n }\r\n\r\n var flashEmbeds = document.getElementsByTagName(\"embed\");\r\n for (i = 0; i < flashEmbeds.length; i++) {\r\n flashEmbeds[i].style.visibility = \"hidden\";\r\n }\r\n\r\n}\r\n\r\n\r\n// ---------------------------------------------------\r\n\r\n//\r\n// pause(numberMillis)\r\n// Pauses code execution for specified time. Uses busy code, not good.\r\n// Help from Ran Bar-On [ran2103@gmail.com]\r\n//\r\n\r\nfunction pause(ms){\r\n var date = new Date();\r\n curDate = null;\r\n\r\n do{var curDate = new Date();}\r\n while( curDate - date < ms);\r\n}\r\n/*\r\nfunction pause(numberMillis) {\r\n var curently = new Date().getTime() + sender;\r\n while (new Date().getTime(); \r\n}\r\n*/\r\n// ---------------------------------------------------\r\n\r\n\r\n\r\nfunction initLightbox() { myLightbox = new Lightbox(); }\r\nEvent.observe(window, \'load\', initLightbox, false);\r\n\r\n\r\n\r\n//-->\r\n</script>\r\n<style type=\"text/css\">\r\n<!--\r\n\r\n\r\n#lightbox{\r\n position: absolute;\r\n left: 0;\r\n width: 100%;\r\n z-index: 100;\r\n text-align: center;\r\n line-height: 0;\r\n }\r\n\r\n#lightbox a img{ border: none; }\r\n\r\n#outerImageContainer{\r\n position: relative;\r\n background-color: #fff;\r\n width: 250px;\r\n height: 250px;\r\n margin: 0 auto;\r\n }\r\n\r\n#imageContainer{\r\n padding: 10px;\r\n }\r\n\r\n#loading{\r\n position: absolute;\r\n top: 40%;\r\n left: 0%;\r\n height: 25%;\r\n width: 100%;\r\n text-align: center;\r\n line-height: 0;\r\n }\r\n#hoverNav{\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n width: 100%;\r\n z-index: 10;\r\n }\r\n#imageContainer>#hoverNav{ left: 0;}\r\n#hoverNav a{ outline: none;}\r\n\r\n#prevLink, #nextLink{\r\n width: 49%;\r\n height: 100%;\r\n background: transparent url(http://www.rhein-sieg.julis.de/fileadmin/freesite/groups/114/Lightbox/blank.gif) no-repeat; /* Trick IE into showing hover */\r\n display: block;\r\n }\r\n#prevLink { left: 0; float: left;}\r\n#nextLink { right: 0; float: right;}\r\n#prevLink:hover, #prevLink:visited:hover { background: url(http://www.rhein-sieg.julis.de/fileadmin/freesite/groups/114/Lightbox/prevlabel.gif) left 15% no-repeat; }\r\n#nextLink:hover, #nextLink:visited:hover { background: url(http://www.rhein-sieg.julis.de/fileadmin/freesite/groups/114/Lightbox/nextlabel.gif) right 15% no-repeat; }\r\n\r\n\r\n#imageDataContainer{\r\n font: 10px Verdana, Helvetica, sans-serif;\r\n background-color: #fff;\r\n margin: 0 auto;\r\n line-height: 1.4em;\r\n overflow: auto;\r\n width: 100% \r\n }\r\n\r\n#imageData{ padding:0 10px; color: #666; }\r\n#imageData #imageDetails{ width: 70%; float: left; text-align: left; } \r\n#imageData #caption{ font-weight: bold; }\r\n#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; } \r\n#imageData #bottomNavClose{ width: 66px; float: right; padding-bottom: 0.7em; } \r\n \r\n#overlay{\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 90;\r\n width: 100%;\r\n height: 500px;\r\n background-color: #000;\r\n }\r\n \r\n \r\n\r\n//-->\r\n</style>\n <!-- Raw HTML content: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:6291/html [end] -->\n \n <!-- CONTENT ELEMENT, uid:5880/html [begin] -->\n <div id=\"c5880\" class=\"csc-default\">\n <!-- Raw HTML content: [begin] -->\n <noscript>\r\n <p style=\"border: 2px solid red; color: red; margin-bottom: 15px; padding-top: 8px; padding-bottom: 8px; font-weight: bold\">Damit der komplette Inhalt der Website richtig angezeigt wird und der volle Funktionsumfang nutzbar ist, musst Du Javascript aktivieren.</p>\r\n</noscript>\n <!-- Raw HTML content: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:5880/html [end] -->\n \n <!-- CONTENT ELEMENT, uid:5055/html [begin] -->\n <div id=\"c5055\" class=\"csc-default\">\n <!-- Raw HTML content: [begin] -->\n <div style=\"margin-top:50px\"><p style=\"color:gray; margin-bottom: 20px\" valign=\"bottom\" align=\"right\">© Junge Liberale Rhein-Sieg 2006 - 2008 | <a class=\"internal-link\" href=\"http://www.rhein-sieg.julis.de/index.php?id=impressum0\" target=\"_top\">Impressum</a></p></div>\n <!-- Raw HTML content: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:5055/html [end] -->\n \n <!-- CONTENT ELEMENT, uid:6567/html [begin] -->\n <div id=\"c6567\" class=\"csc-default\">\n <!-- Raw HTML content: [begin] -->\n <!--\r\nHINWEIS: Der folgende Javascript-Code sorgt dafür, dass julis-rhein-sieg.de\r\nangesteuert wird\r\n-->\r\n<script type=\"text/javascript\">\r\n<!--\r\n/*elemente = document.getElementsByTagName(\"a\");\r\n\r\nfor(i = 0; i < elemente.length; i++) { \r\n var href = elemente[i].href;\r\n var ergebnis = href.match(/id=(.+)(#?.*)$/);\r\n \r\n if(ergebnis) {\r\n elemente[i].target = \'_top\';\r\n elemente[i].href = \'http://julis-rhein-sieg.de.dd18120.kasserver.com/main/\'+ergebnis[1]+\'.html\'+ergebnis[2];\r\n }\r\n}*/\r\n\r\nelemente = document.getElementsByTagName(\"form\");\r\n\r\nfor(i = 0; i < elemente.length; i++) \r\n elemente[i].target = \'_self\';\r\n\r\nvar gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\r\ndocument.write(unescape(\"%3Cscript src=\'\" + gaJsHost + \"google-analytics.com/ga.js\' type=\'text/javascript\'%3E%3C/script%3E\"));\r\nvar pageTracker = _gat._getTracker(\"UA-4706188-2\");\r\npageTracker._initData();\r\npageTracker._trackPageview();\r\n//-->\r\n</script>\n <!-- Raw HTML content: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:6567/html [end] -->\n </div>\r\n <div id=\"coRight\"></div> \r\n </div>\r\n\r\n <div id=\"right\">\r\n <div id=\"moduleWrapper\">\r\n\r\n <div id=\"btMenuRechts\" style=\"margin-top: 2px; padding-top: 2px; padding-bottom: 2px;\" class=\"btMenuRechtsPresse\">\r\n <h1 class=\"btMenuRechtsH1\">Presse</h1>\r\n <p>Keine Artikel in dieser Ansicht.</p>\r\n </div>\r\n \r\n <div id=\"btMenuRechts\" style=\"margin-top: 2px; padding-top: 2px; padding-bottom: 2px;\" class=\"btMenuRechtsTermine\">\r\n <h1 class=\"btMenuRechtsH1\">Termine</h1>\r\n \n <!--\n\n BEGIN: Content of extension \"cal\", plugin \"tx_cal_controller\"\n\n -->\n <div class=\"tx-cal-controller \">\n \r\n\r\n<!-- begin -->\r\n<div class=\"tx-jwcalendar-pi1\"> \r\n <div id=\"list\">\r\n\r\n<!-- end -->\r\n <p>Keine Termine gefunden</p>\r\n<!-- begin -->\r\n</div></div>\r\n<!-- end -->\r\n\r\n\r\n\r\n</div>\n \n <!-- END: Content of extension \"cal\", plugin \"tx_cal_controller\" -->\n\n \r\n </div>\r\n \r\n \r\n \r\n <div id=\"btMenuRechts\"><h1 class=\"btMenuRechtsH1\">Mitmachen!?</h1><a href=\"index.php?id=7313\" onfocus=\"blurLink(this);\" onmouseover=\"over(\'img7313_cdf5_0\');\" onmouseout=\"out(\'img7313_cdf5_0\');\"><img src=\"typo3temp/menu/deb80aea7b.png\" width=\"280\" height=\"33\" border=\"0\" alt=\"Informationen bekommen\" name=\"img7313_cdf5_0\" /></a><a href=\"index.php?id=7312\" onfocus=\"blurLink(this);\" onmouseover=\"over(\'img7312_cdf5_1\');\" onmouseout=\"out(\'img7312_cdf5_1\');\"><img src=\"typo3temp/menu/4076cc8746.png\" width=\"280\" height=\"33\" border=\"0\" alt=\"Event finden\" name=\"img7312_cdf5_1\" /></a><a href=\"index.php?id=7311\" onfocus=\"blurLink(this);\" onmouseover=\"over(\'img7311_cdf5_2\');\" onmouseout=\"out(\'img7311_cdf5_2\');\"><img src=\"typo3temp/menu/ce327e1db0.png\" width=\"280\" height=\"33\" border=\"0\" alt=\"Wahlkampf machen\" name=\"img7311_cdf5_2\" /></a><a href=\"index.php?id=7310\" onfocus=\"blurLink(this);\" onmouseover=\"over(\'img7310_cdf5_3\');\" onmouseout=\"out(\'img7310_cdf5_3\');\"><img src=\"typo3temp/menu/0f80955e7a.png\" width=\"280\" height=\"33\" border=\"0\" alt=\"Mitglied werden\" name=\"img7310_cdf5_3\" /></a></div>\r\n <div id=\"juliTV\">\n <!-- CONTENT ELEMENT, uid:12868/list [begin] -->\n <div id=\"c12868\" class=\"csc-default\">\n <!-- Header: [begin] -->\n <div class=\"csc-header csc-header-n1\"><h1 class=\"csc-firstHeader\">JuLiTV</h1></div>\n <!-- Header: [end] -->\n \n <!-- Plugin inserted: [begin] -->\n \n\n\n <!--\n\n BEGIN: Content of extension \"itaw_youtoubeembed\", plugin \"tx_itawyoutoubeembed_pi1\"\n\n -->\n <div class=\"tx-itawyoutoubeembed-pi1\">\n \r\n <object width=\"280\" height=\"232\">\r\n <param name=\"movie\" value=\"http://www.youtube.com/v/O2C89MmEmeo\" /> </param>\r\n <embed src=\"http://www.youtube.com/v/O2C89MmEmeo\" type=\"application/x-shockwave-flash\" width=\"280\" height=\"232\"> </embed>\r\n </object>\r\n \n </div>\n \n <!-- END: Content of extension \"itaw_youtoubeembed\", plugin \"tx_itawyoutoubeembed_pi1\" -->\n\n \n <!-- Plugin inserted: [end] -->\n </div>\n <!-- CONTENT ELEMENT, uid:12868/list [end] -->\n </div>\r\n <div id=\"w20MenuRechts\"><div id=\"w20CO\"><h1 class=\"w20MenuRechtsH1\">JuLis<i>2.0</i></h1><a href=\"index.php?id=7308\" target=\"_blank\" onfocus=\"blurLink(this);\"><img src=\"typo3temp/menu/1cf854c5f4.png\" width=\"155\" height=\"45\" border=\"0\" alt=\"Twitter.com\" /></a><a href=\"index.php?id=7307\" target=\"_blank\" onfocus=\"blurLink(this);\"><img src=\"typo3temp/menu/16428ce3c6.png\" width=\"75\" height=\"79\" border=\"0\" alt=\"Faceboook.com\" /></a><a href=\"index.php?id=7306\" target=\"_blank\" onfocus=\"blurLink(this);\"><img src=\"typo3temp/menu/6f4dd73829.png\" width=\"115\" height=\"54\" border=\"0\" alt=\"YouTube.com\" /></a><a href=\"index.php?id=7305\" target=\"_blank\" onfocus=\"blurLink(this);\"><img src=\"typo3temp/menu/a13a44e1ac.png\" width=\"77\" height=\"71\" border=\"0\" alt=\"MySpace.com\" /></a><a href=\"index.php?id=7304\" onfocus=\"blurLink(this);\"><img src=\"typo3temp/menu/43163b494d.png\" width=\"118\" height=\"40\" border=\"0\" alt=\"Flickr.com\" /></a><a href=\"index.php?id=7303\" target=\"_blank\" onfocus=\"blurLink(this);\"><img src=\"typo3temp/menu/cb339a606f.png\" width=\"120\" height=\"54\" border=\"0\" alt=\"StudiVZ.net\" /></a></div></div>\r\n \r\n </div>\r\n </div>\r\n\r\n </div>\r\n \r\n <div id=\"copyright\">\r\n <br /><br /><br />\n &copy;2012 JuLis Rhein-Sieg\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>\n\n\n\n<!--FD_8b5e037c0066ee2628e5171bcf2231c6-->\n</body>\n</html>','','a:8:{s:6:\"config\";a:28:{s:9:\"extTarget\";s:4:\"_top\";s:4:\"stat\";i:1;s:16:\"stat_typeNumList\";s:3:\"0,1\";s:14:\"uniqueLinkVars\";s:1:\"1\";s:21:\"cache_clearAtMidnight\";s:1:\"1\";s:11:\"tx_extbase.\";a:3:{s:8:\"objects.\";a:2:{s:48:\"Tx_Extbase_Persistence_Storage_BackendInterface.\";a:1:{s:9:\"className\";s:45:\"Tx_Extbase_Persistence_Storage_Typo3DbBackend\";}s:46:\"Tx_Extbase_Persistence_QuerySettingsInterface.\";a:1:{s:9:\"className\";s:41:\"Tx_Extbase_Persistence_Typo3QuerySettings\";}}s:4:\"mvc.\";a:1:{s:16:\"requestHandlers.\";a:3:{s:41:\"Tx_Extbase_MVC_Web_FrontendRequestHandler\";s:41:\"Tx_Extbase_MVC_Web_FrontendRequestHandler\";s:40:\"Tx_Extbase_MVC_Web_BackendRequestHandler\";s:40:\"Tx_Extbase_MVC_Web_BackendRequestHandler\";s:41:\"Tx_Fluid_Core_Widget_WidgetRequestHandler\";s:41:\"Tx_Fluid_Core_Widget_WidgetRequestHandler\";}}s:12:\"persistence.\";a:3:{s:28:\"enableAutomaticCacheClearing\";s:1:\"1\";s:20:\"updateReferenceIndex\";s:1:\"0\";s:8:\"classes.\";a:2:{s:37:\"Tx_Extbase_Domain_Model_FrontendUser.\";a:1:{s:8:\"mapping.\";a:3:{s:9:\"tableName\";s:8:\"fe_users\";s:10:\"recordType\";s:36:\"Tx_Extbase_Domain_Model_FrontendUser\";s:8:\"columns.\";a:1:{s:13:\"lockToDomain.\";a:1:{s:13:\"mapOnProperty\";s:12:\"lockToDomain\";}}}}s:42:\"Tx_Extbase_Domain_Model_FrontendUserGroup.\";a:1:{s:8:\"mapping.\";a:3:{s:9:\"tableName\";s:9:\"fe_groups\";s:10:\"recordType\";s:41:\"Tx_Extbase_Domain_Model_FrontendUserGroup\";s:8:\"columns.\";a:1:{s:13:\"lockToDomain.\";a:1:{s:13:\"mapOnProperty\";s:12:\"lockToDomain\";}}}}}}}s:14:\"pdf_generator.\";a:35:{s:8:\"no_links\";s:1:\"0\";s:8:\"bodyfont\";s:0:\"\";s:5:\"right\";s:0:\"\";s:4:\"left\";s:0:\"\";s:8:\"fontsize\";s:0:\"\";s:12:\"headfootfont\";s:0:\"\";s:9:\"logoimage\";s:0:\"\";s:12:\"headfootsize\";s:0:\"\";s:6:\"bottom\";s:0:\"\";s:3:\"top\";s:0:\"\";s:12:\"browserwidth\";s:0:\"\";s:4:\"size\";s:0:\"\";s:11:\"header_left\";s:0:\"\";s:13:\"header_center\";s:6:\"$TITLE\";s:12:\"header_right\";s:0:\"\";s:11:\"footer_left\";s:0:\"\";s:13:\"footer_center\";s:0:\"\";s:12:\"footer_right\";s:5:\"$PAGE\";s:17:\"additional_params\";s:0:\"\";s:14:\"string_search1\";s:0:\"\";s:15:\"string_replace1\";s:0:\"\";s:14:\"string_search2\";s:0:\"\";s:15:\"string_replace2\";s:0:\"\";s:14:\"string_search3\";s:0:\"\";s:15:\"string_replace3\";s:0:\"\";s:14:\"string_search4\";s:0:\"\";s:15:\"string_replace4\";s:0:\"\";s:14:\"regexp_search1\";s:0:\"\";s:15:\"regexp_replace1\";s:0:\"\";s:14:\"regexp_search2\";s:0:\"\";s:15:\"regexp_replace2\";s:0:\"\";s:14:\"regexp_search3\";s:0:\"\";s:15:\"regexp_replace3\";s:0:\"\";s:14:\"regexp_search4\";s:0:\"\";s:15:\"regexp_replace4\";s:0:\"\";}s:12:\"index_enable\";s:1:\"1\";s:15:\"index_externals\";s:1:\"1\";s:14:\"index_metatags\";s:1:\"1\";s:10:\"locale_all\";s:5:\"de_DE\";s:8:\"language\";s:2:\"de\";s:8:\"linkVars\";s:1:\"L\";s:16:\"sys_language_uid\";s:1:\"0\";s:25:\"spamProtectEmailAddresses\";s:1:\"1\";s:33:\"spamProtectEmailAddresses_atSubst\";s:1:\"@\";s:10:\"dateFormat\";s:12:\"%A %e. %B %Y\";s:10:\"timeFormat\";s:16:\"Uhr %H:%M Sek %S\";s:12:\"cache_period\";s:5:\"21600\";s:7:\"doctype\";s:11:\"xhtml_trans\";s:12:\"xhtmlDoctype\";s:11:\"xhtml_trans\";s:11:\"xmlprologue\";s:4:\"none\";s:14:\"xhtml_cleaning\";s:3:\"all\";s:23:\"simulateStaticDocuments\";s:1:\"0\";s:17:\"tx_realurl_enable\";s:1:\"0\";s:20:\"inlineStyle2TempFile\";s:1:\"1\";s:15:\"removeDefaultJS\";s:8:\"external\";s:8:\"minifyJS\";i:1;}s:8:\"rootLine\";a:2:{i:0;a:26:{s:3:\"pid\";s:3:\"128\";s:3:\"uid\";s:4:\"1292\";s:9:\"t3ver_oid\";s:1:\"0\";s:10:\"t3ver_wsid\";s:1:\"0\";s:11:\"t3ver_state\";s:1:\"0\";s:14:\"t3ver_swapmode\";s:1:\"0\";s:5:\"title\";s:16:\"JuLis Rhein-Sieg\";s:5:\"alias\";s:13:\"jkvrhein-sieg\";s:9:\"nav_title\";s:0:\"\";s:5:\"media\";s:0:\"\";s:6:\"layout\";s:1:\"0\";s:6:\"hidden\";s:1:\"0\";s:9:\"starttime\";s:1:\"0\";s:7:\"endtime\";s:1:\"0\";s:8:\"fe_group\";s:1:\"0\";s:16:\"extendToSubpages\";s:1:\"0\";s:7:\"doktype\";s:1:\"4\";s:8:\"TSconfig\";s:0:\"\";s:11:\"storage_pid\";s:1:\"0\";s:11:\"is_siteroot\";s:1:\"0\";s:9:\"mount_pid\";s:1:\"0\";s:12:\"mount_pid_ol\";s:1:\"0\";s:13:\"fe_login_mode\";s:1:\"0\";s:25:\"backend_layout_next_level\";s:1:\"0\";s:22:\"tx_realurl_pathsegment\";s:0:\"\";s:18:\"tx_realurl_exclude\";s:1:\"0\";}i:1;a:26:{s:3:\"pid\";s:4:\"1292\";s:3:\"uid\";s:4:\"1304\";s:9:\"t3ver_oid\";s:1:\"0\";s:10:\"t3ver_wsid\";s:1:\"0\";s:11:\"t3ver_state\";s:1:\"0\";s:14:\"t3ver_swapmode\";s:1:\"0\";s:5:\"title\";s:4:\"Home\";s:5:\"alias\";s:4:\"home\";s:9:\"nav_title\";s:0:\"\";s:5:\"media\";s:0:\"\";s:6:\"layout\";s:1:\"0\";s:6:\"hidden\";s:1:\"0\";s:9:\"starttime\";s:1:\"0\";s:7:\"endtime\";s:1:\"0\";s:8:\"fe_group\";s:1:\"0\";s:16:\"extendToSubpages\";s:1:\"0\";s:7:\"doktype\";s:1:\"1\";s:8:\"TSconfig\";s:0:\"\";s:11:\"storage_pid\";s:1:\"0\";s:11:\"is_siteroot\";s:1:\"0\";s:9:\"mount_pid\";s:1:\"0\";s:12:\"mount_pid_ol\";s:1:\"0\";s:13:\"fe_login_mode\";s:1:\"0\";s:25:\"backend_layout_next_level\";s:1:\"0\";s:22:\"tx_realurl_pathsegment\";s:0:\"\";s:18:\"tx_realurl_exclude\";s:1:\"0\";}}s:10:\"mainScript\";s:9:\"index.php\";s:6:\"FEData\";N;s:7:\"FEData.\";N;s:9:\"hash_base\";s:8217:\"a:7:{s:3:\"all\";a:4:{s:3:\"all\";a:6:{s:32:\"79b6457aa39018ced6c408d837617a4a\";s:391:\"[GLOBAL]\'.chr(10).\'extension.fe_mp3player.typeNum = 9000\'.chr(10).\'[GLOBAL]\'.chr(10).\'extension.pdf_generator.typeNum = 123\'.chr(10).\'[GLOBAL]\'.chr(10).\'extension.fe_mp3player.typeNum = 9000\'.chr(10).\'[GLOBAL]\'.chr(10).\'extension.pdf_generator.typeNum = 123\'.chr(10).\'[GLOBAL]\'.chr(10).\'extension.fe_mp3player.typeNum = 9000\'.chr(10).\'[GLOBAL]\'.chr(10).\'extension.pdf_generator.typeNum = 123\";s:32:\"41428859d35690400a615c4ebfa39dc3\";s:15:\"[loginUser = *]\";s:32:\"7dd00f70f2cb64dbc051994145662edd\";s:45:\"[userFunc = user_isCalNotAllowedToBeCached()]\";s:32:\"6fe49417c9f21ccdcad21bd948218fad\";s:21:\"[compatVersion = 4.3]\";s:32:\"010966dc7d2c314f2db05fdd3c3b5194\";s:23:\"[globalVar = LIT:1 = 1]\";s:32:\"188104a9af772515f12e480f8924b2a2\";s:24:\"[globalVar = TSFE:id=36]\";}s:5:\"match\";a:2:{s:32:\"6fe49417c9f21ccdcad21bd948218fad\";s:21:\"[compatVersion = 4.3]\";s:32:\"010966dc7d2c314f2db05fdd3c3b5194\";s:23:\"[globalVar = LIT:1 = 1]\";}s:8:\"rootLine\";a:2:{i:0;a:26:{s:3:\"pid\";s:3:\"128\";s:3:\"uid\";s:4:\"1292\";s:9:\"t3ver_oid\";s:1:\"0\";s:10:\"t3ver_wsid\";s:1:\"0\";s:11:\"t3ver_state\";s:1:\"0\";s:14:\"t3ver_swapmode\";s:1:\"0\";s:5:\"title\";s:16:\"JuLis Rhein-Sieg\";s:5:\"alias\";s:13:\"jkvrhein-sieg\";s:9:\"nav_title\";s:0:\"\";s:5:\"media\";s:0:\"\";s:6:\"layout\";s:1:\"0\";s:6:\"hidden\";s:1:\"0\";s:9:\"starttime\";s:1:\"0\";s:7:\"endtime\";s:1:\"0\";s:8:\"fe_group\";s:1:\"0\";s:16:\"extendToSubpages\";s:1:\"0\";s:7:\"doktype\";s:1:\"4\";s:8:\"TSconfig\";s:0:\"\";s:11:\"storage_pid\";s:1:\"0\";s:11:\"is_siteroot\";s:1:\"0\";s:9:\"mount_pid\";s:1:\"0\";s:12:\"mount_pid_ol\";s:1:\"0\";s:13:\"fe_login_mode\";s:1:\"0\";s:25:\"backend_layout_next_level\";s:1:\"0\";s:22:\"tx_realurl_pathsegment\";s:0:\"\";s:18:\"tx_realurl_exclude\";s:1:\"0\";}i:1;a:26:{s:3:\"pid\";s:4:\"1292\";s:3:\"uid\";s:4:\"1304\";s:9:\"t3ver_oid\";s:1:\"0\";s:10:\"t3ver_wsid\";s:1:\"0\";s:11:\"t3ver_state\";s:1:\"0\";s:14:\"t3ver_swapmode\";s:1:\"0\";s:5:\"title\";s:4:\"Home\";s:5:\"alias\";s:4:\"home\";s:9:\"nav_title\";s:0:\"\";s:5:\"media\";s:0:\"\";s:6:\"layout\";s:1:\"0\";s:6:\"hidden\";s:1:\"0\";s:9:\"starttime\";s:1:\"0\";s:7:\"endtime\";s:1:\"0\";s:8:\"fe_group\";s:1:\"0\";s:16:\"extendToSubpages\";s:1:\"0\";s:7:\"doktype\";s:1:\"1\";s:8:\"TSconfig\";s:0:\"\";s:11:\"storage_pid\";s:1:\"0\";s:11:\"is_siteroot\";s:1:\"0\";s:9:\"mount_pid\";s:1:\"0\";s:12:\"mount_pid_ol\";s:1:\"0\";s:13:\"fe_login_mode\";s:1:\"0\";s:25:\"backend_layout_next_level\";s:1:\"0\";s:22:\"tx_realurl_pathsegment\";s:0:\"\";s:18:\"tx_realurl_exclude\";s:1:\"0\";}}s:6:\"rowSum\";a:83:{i:0;a:3:{i:0;s:3:\"601\";i:1;s:8:\"NEW SITE\";i:2;s:10:\"1314525557\";}i:1;a:3:{i:0;s:7:\"extbase\";i:1;s:7:\"extbase\";i:2;N;}i:2;a:3:{i:0;s:10:\"apimacmade\";i:1;s:11:\"api_macmade\";i:2;N;}i:3;a:3:{i:0;s:8:\"sriframe\";i:1;s:9:\"sr_iframe\";i:2;N;}i:4;a:3:{i:0;s:11:\"femp3player\";i:1;s:12:\"fe_mp3player\";i:2;N;}i:5;a:3:{i:0;s:13:\"httpsenforcer\";i:1;s:14:\"https_enforcer\";i:2;N;}i:6;a:3:{i:0;s:12:\"pdfgenerator\";i:1;s:13:\"pdf_generator\";i:2;N;}i:7;a:3:{i:0;s:12:\"popupsitemap\";i:1;s:13:\"popup_sitemap\";i:2;N;}i:8;a:3:{i:0;s:7:\"overlib\";i:1;s:7:\"overlib\";i:2;N;}i:9;a:3:{i:0;s:13:\"indexedsearch\";i:1;s:14:\"indexed_search\";i:2;N;}i:10;a:3:{i:0;s:10:\"flvplayer2\";i:1;s:10:\"flvplayer2\";i:2;N;}i:11;a:3:{i:0;s:22:\"directmailsubscription\";i:1;s:24:\"direct_mail_subscription\";i:2;N;}i:12;a:3:{i:0;s:9:\"ckfortune\";i:1;s:10:\"ck_fortune\";i:2;N;}i:13;a:3:{i:0;s:17:\"rlmpdateselectlib\";i:1;s:18:\"rlmp_dateselectlib\";i:2;N;}i:14;a:3:{i:0;s:15:\"macinasearchbox\";i:1;s:16:\"macina_searchbox\";i:2;N;}i:15;a:3:{i:0;s:7:\"felogin\";i:1;s:7:\"felogin\";i:2;N;}i:16;a:3:{i:0;s:5:\"fluid\";i:1;s:5:\"fluid\";i:2;N;}i:17;a:3:{i:0;s:15:\"ccrdfnewsimport\";i:1;s:18:\"cc_rdf_news_import\";i:2;N;}i:18;a:3:{i:0;s:3:\"602\";i:1;s:8:\"NEW SITE\";i:2;s:10:\"1314525679\";}i:19;a:3:{i:0;s:7:\"extbase\";i:1;s:7:\"extbase\";i:2;N;}i:20;a:3:{i:0;s:10:\"apimacmade\";i:1;s:11:\"api_macmade\";i:2;N;}i:21;a:3:{i:0;s:8:\"sriframe\";i:1;s:9:\"sr_iframe\";i:2;N;}i:22;a:3:{i:0;s:11:\"femp3player\";i:1;s:12:\"fe_mp3player\";i:2;N;}i:23;a:3:{i:0;s:13:\"httpsenforcer\";i:1;s:14:\"https_enforcer\";i:2;N;}i:24;a:3:{i:0;s:12:\"pdfgenerator\";i:1;s:13:\"pdf_generator\";i:2;N;}i:25;a:3:{i:0;s:12:\"popupsitemap\";i:1;s:13:\"popup_sitemap\";i:2;N;}i:26;a:3:{i:0;s:7:\"overlib\";i:1;s:7:\"overlib\";i:2;N;}i:27;a:3:{i:0;s:13:\"indexedsearch\";i:1;s:14:\"indexed_search\";i:2;N;}i:28;a:3:{i:0;s:10:\"flvplayer2\";i:1;s:10:\"flvplayer2\";i:2;N;}i:29;a:3:{i:0;s:22:\"directmailsubscription\";i:1;s:24:\"direct_mail_subscription\";i:2;N;}i:30;a:3:{i:0;s:9:\"ckfortune\";i:1;s:10:\"ck_fortune\";i:2;N;}i:31;a:3:{i:0;s:17:\"rlmpdateselectlib\";i:1;s:18:\"rlmp_dateselectlib\";i:2;N;}i:32;a:3:{i:0;s:15:\"macinasearchbox\";i:1;s:16:\"macina_searchbox\";i:2;N;}i:33;a:3:{i:0;s:7:\"felogin\";i:1;s:7:\"felogin\";i:2;N;}i:34;a:3:{i:0;s:5:\"fluid\";i:1;s:5:\"fluid\";i:2;N;}i:35;a:3:{i:0;s:15:\"ccrdfnewsimport\";i:1;s:18:\"cc_rdf_news_import\";i:2;N;}i:36;a:3:{i:0;s:3:\"246\";i:1;s:16:\"JuLis Rhein-Sieg\";i:2;s:10:\"1164878233\";}i:37;a:3:{i:0;s:7:\"extbase\";i:1;s:7:\"extbase\";i:2;N;}i:38;a:3:{i:0;s:10:\"apimacmade\";i:1;s:11:\"api_macmade\";i:2;N;}i:39;a:3:{i:0;s:8:\"sriframe\";i:1;s:9:\"sr_iframe\";i:2;N;}i:40;a:3:{i:0;s:11:\"femp3player\";i:1;s:12:\"fe_mp3player\";i:2;N;}i:41;a:3:{i:0;s:13:\"httpsenforcer\";i:1;s:14:\"https_enforcer\";i:2;N;}i:42;a:3:{i:0;s:12:\"pdfgenerator\";i:1;s:13:\"pdf_generator\";i:2;N;}i:43;a:3:{i:0;s:12:\"popupsitemap\";i:1;s:13:\"popup_sitemap\";i:2;N;}i:44;a:3:{i:0;s:7:\"overlib\";i:1;s:7:\"overlib\";i:2;N;}i:45;a:3:{i:0;s:13:\"indexedsearch\";i:1;s:14:\"indexed_search\";i:2;N;}i:46;a:3:{i:0;s:10:\"flvplayer2\";i:1;s:10:\"flvplayer2\";i:2;N;}i:47;a:3:{i:0;s:22:\"directmailsubscription\";i:1;s:24:\"direct_mail_subscription\";i:2;N;}i:48;a:3:{i:0;s:9:\"ckfortune\";i:1;s:10:\"ck_fortune\";i:2;N;}i:49;a:3:{i:0;s:17:\"rlmpdateselectlib\";i:1;s:18:\"rlmp_dateselectlib\";i:2;N;}i:50;a:3:{i:0;s:15:\"macinasearchbox\";i:1;s:16:\"macina_searchbox\";i:2;N;}i:51;a:3:{i:0;s:7:\"felogin\";i:1;s:7:\"felogin\";i:2;N;}i:52;a:3:{i:0;s:5:\"fluid\";i:1;s:5:\"fluid\";i:2;N;}i:53;a:3:{i:0;s:15:\"ccrdfnewsimport\";i:1;s:18:\"cc_rdf_news_import\";i:2;N;}i:54;a:3:{i:0;s:3:\"106\";i:1;s:52:\"Junge Liberale - Regiosystem - Basistemplate (HHIPS)\";i:2;s:10:\"1366538961\";}i:55;a:3:{i:0;s:24:\"cssstyledcontent/static/\";i:1;s:30:\"EXT:css_styled_content/static/\";i:2;N;}i:56;a:3:{i:0;s:18:\"ttnews/static/css/\";i:1;s:23:\"EXT:tt_news/static/css/\";i:2;N;}i:57;a:3:{i:0;s:20:\"ttnews/static/tsnew/\";i:1;s:26:\"EXT:tt_news/static/ts_new/\";i:2;N;}i:58;a:3:{i:0;s:20:\"ttnews/static/tsold/\";i:1;s:26:\"EXT:tt_news/static/ts_old/\";i:2;N;}i:59;a:3:{i:0;s:14:\"cal/static/ts/\";i:1;s:18:\"EXT:cal/static/ts/\";i:2;N;}i:60;a:3:{i:0;s:15:\"cal/static/css/\";i:1;s:19:\"EXT:cal/static/css/\";i:2;N;}i:61;a:3:{i:0;s:32:\"rtehtmlarea/static/clickenlarge/\";i:1;s:36:\"EXT:rtehtmlarea/static/clickenlarge/\";i:2;N;}i:62;a:3:{i:0;s:40:\"kjimagelightbox2/static/KJImagelightbox/\";i:1;s:47:\"EXT:kj_imagelightbox2/static/KJ__Imagelightbox/\";i:2;N;}i:63;a:3:{i:0;s:29:\"itawyoutoubeembed/pi1/static/\";i:1;s:34:\"EXT:itaw_youtoubeembed/pi1/static/\";i:2;N;}i:64;a:3:{i:0;s:19:\"cal/static/rssfeed/\";i:1;s:24:\"EXT:cal/static/rss_feed/\";i:2;N;}i:65;a:3:{i:0;s:22:\"ttnews/static/rssfeed/\";i:1;s:28:\"EXT:tt_news/static/rss_feed/\";i:2;N;}i:66;a:3:{i:0;s:7:\"extbase\";i:1;s:7:\"extbase\";i:2;N;}i:67;a:3:{i:0;s:10:\"apimacmade\";i:1;s:11:\"api_macmade\";i:2;N;}i:68;a:3:{i:0;s:8:\"sriframe\";i:1;s:9:\"sr_iframe\";i:2;N;}i:69;a:3:{i:0;s:11:\"femp3player\";i:1;s:12:\"fe_mp3player\";i:2;N;}i:70;a:3:{i:0;s:13:\"httpsenforcer\";i:1;s:14:\"https_enforcer\";i:2;N;}i:71;a:3:{i:0;s:12:\"pdfgenerator\";i:1;s:13:\"pdf_generator\";i:2;N;}i:72;a:3:{i:0;s:12:\"popupsitemap\";i:1;s:13:\"popup_sitemap\";i:2;N;}i:73;a:3:{i:0;s:7:\"overlib\";i:1;s:7:\"overlib\";i:2;N;}i:74;a:3:{i:0;s:13:\"indexedsearch\";i:1;s:14:\"indexed_search\";i:2;N;}i:75;a:3:{i:0;s:10:\"flvplayer2\";i:1;s:10:\"flvplayer2\";i:2;N;}i:76;a:3:{i:0;s:22:\"directmailsubscription\";i:1;s:24:\"direct_mail_subscription\";i:2;N;}i:77;a:3:{i:0;s:9:\"ckfortune\";i:1;s:10:\"ck_fortune\";i:2;N;}i:78;a:3:{i:0;s:17:\"rlmpdateselectlib\";i:1;s:18:\"rlmp_dateselectlib\";i:2;N;}i:79;a:3:{i:0;s:15:\"macinasearchbox\";i:1;s:16:\"macina_searchbox\";i:2;N;}i:80;a:3:{i:0;s:7:\"felogin\";i:1;s:7:\"felogin\";i:2;N;}i:81;a:3:{i:0;s:5:\"fluid\";i:1;s:5:\"fluid\";i:2;N;}i:82;a:3:{i:0;s:15:\"ccrdfnewsimport\";i:1;s:18:\"cc_rdf_news_import\";i:2;N;}}}s:2:\"id\";i:1304;s:4:\"type\";i:0;s:7:\"gr_list\";s:4:\"0,-1\";s:2:\"MP\";s:0:\"\";s:5:\"cHash\";a:0:{}s:15:\"domainStartPage\";N;}\";s:12:\"INTincScript\";a:1:{s:43:\"INT_SCRIPT.5755f648d9f1ea19a20d1a6fc11881c2\";a:4:{s:4:\"file\";N;s:4:\"conf\";a:2:{i:10;s:3:\"COA\";s:3:\"10.\";a:3:{s:3:\"if.\";a:1:{s:7:\"isTrue.\";a:2:{s:7:\"numRows\";s:7:\"CONTENT\";s:8:\"numRows.\";a:3:{s:5:\"table\";s:10:\"tt_content\";s:7:\"select.\";a:3:{s:7:\"orderBy\";s:7:\"sorting\";s:5:\"where\";s:8:\"colPos=1\";s:13:\"languageField\";s:16:\"sys_language_uid\";}s:5:\"slide\";s:1:\"0\";}}}i:10;s:7:\"CONTENT\";s:3:\"10.\";a:4:{s:5:\"table\";s:10:\"tt_content\";s:7:\"select.\";a:5:{s:7:\"orderBy\";s:6:\"rand()\";s:5:\"where\";s:8:\"colPos=1\";s:13:\"languageField\";s:16:\"sys_language_uid\";s:10:\"pidInList.\";a:1:{s:4:\"data\";s:9:\"field:uid\";}s:3:\"max\";s:1:\"1\";}s:5:\"slide\";s:1:\"0\";s:4:\"wrap\";s:59:\"<div id=\"teaserArtikel\"><div id=\"teaserInner\">|</div></div>\";}}}s:4:\"cObj\";s:9189:\"O:10:\"tslib_cObj\":32:{s:5:\"align\";a:3:{i:0;s:6:\"center\";i:1;s:5:\"right\";i:2;s:4:\"left\";}s:12:\"stdWrapOrder\";a:145:{s:17:\"stdWrapPreProcess\";s:4:\"hook\";s:19:\"setContentToCurrent\";s:7:\"boolean\";s:20:\"setContentToCurrent.\";s:5:\"array\";s:10:\"setCurrent\";s:6:\"string\";s:11:\"setCurrent.\";s:5:\"array\";s:5:\"lang.\";s:5:\"array\";s:4:\"data\";s:7:\"getText\";s:5:\"data.\";s:5:\"array\";s:5:\"field\";s:9:\"fieldName\";s:6:\"field.\";s:5:\"array\";s:7:\"current\";s:7:\"boolean\";s:8:\"current.\";s:5:\"array\";s:7:\"cObject\";s:7:\"cObject\";s:8:\"cObject.\";s:5:\"array\";s:8:\"numRows.\";s:5:\"array\";s:8:\"filelist\";s:3:\"dir\";s:9:\"filelist.\";s:5:\"array\";s:11:\"preUserFunc\";s:12:\"functionName\";s:15:\"stdWrapOverride\";s:4:\"hook\";s:8:\"override\";s:6:\"string\";s:9:\"override.\";s:5:\"array\";s:17:\"preIfEmptyListNum\";s:7:\"listNum\";s:18:\"preIfEmptyListNum.\";s:5:\"array\";s:7:\"ifEmpty\";s:6:\"string\";s:8:\"ifEmpty.\";s:5:\"array\";s:7:\"ifBlank\";s:6:\"string\";s:8:\"ifBlank.\";s:5:\"array\";s:7:\"listNum\";s:7:\"listNum\";s:8:\"listNum.\";s:5:\"array\";s:4:\"trim\";s:7:\"boolean\";s:5:\"trim.\";s:5:\"array\";s:7:\"stdWrap\";s:7:\"stdWrap\";s:8:\"stdWrap.\";s:5:\"array\";s:14:\"stdWrapProcess\";s:4:\"hook\";s:8:\"required\";s:7:\"boolean\";s:9:\"required.\";s:5:\"array\";s:3:\"if.\";s:5:\"array\";s:13:\"fieldRequired\";s:9:\"fieldName\";s:14:\"fieldRequired.\";s:5:\"array\";s:6:\"csConv\";s:6:\"string\";s:7:\"csConv.\";s:5:\"array\";s:9:\"parseFunc\";s:10:\"objectpath\";s:10:\"parseFunc.\";s:5:\"array\";s:10:\"HTMLparser\";s:7:\"boolean\";s:11:\"HTMLparser.\";s:5:\"array\";s:6:\"split.\";s:5:\"array\";s:10:\"prioriCalc\";s:7:\"boolean\";s:11:\"prioriCalc.\";s:5:\"array\";s:4:\"char\";s:7:\"integer\";s:5:\"char.\";s:5:\"array\";s:6:\"intval\";s:7:\"boolean\";s:7:\"intval.\";s:5:\"array\";s:13:\"numberFormat.\";s:5:\"array\";s:4:\"date\";s:8:\"dateconf\";s:5:\"date.\";s:5:\"array\";s:8:\"strftime\";s:12:\"strftimeconf\";s:9:\"strftime.\";s:5:\"array\";s:3:\"age\";s:7:\"boolean\";s:4:\"age.\";s:5:\"array\";s:4:\"case\";s:4:\"case\";s:5:\"case.\";s:5:\"array\";s:5:\"bytes\";s:7:\"boolean\";s:6:\"bytes.\";s:5:\"array\";s:9:\"substring\";s:10:\"parameters\";s:10:\"substring.\";s:5:\"array\";s:13:\"removeBadHTML\";s:7:\"boolean\";s:14:\"removeBadHTML.\";s:5:\"array\";s:8:\"cropHTML\";s:4:\"crop\";s:9:\"cropHTML.\";s:5:\"array\";s:9:\"stripHtml\";s:7:\"boolean\";s:10:\"stripHtml.\";s:5:\"array\";s:4:\"crop\";s:4:\"crop\";s:5:\"crop.\";s:5:\"array\";s:12:\"rawUrlEncode\";s:7:\"boolean\";s:13:\"rawUrlEncode.\";s:5:\"array\";s:16:\"htmlSpecialChars\";s:7:\"boolean\";s:17:\"htmlSpecialChars.\";s:5:\"array\";s:11:\"doubleBrTag\";s:6:\"string\";s:12:\"doubleBrTag.\";s:5:\"array\";s:2:\"br\";s:7:\"boolean\";s:3:\"br.\";s:5:\"array\";s:5:\"brTag\";s:6:\"string\";s:6:\"brTag.\";s:5:\"array\";s:12:\"encapsLines.\";s:5:\"array\";s:8:\"keywords\";s:7:\"boolean\";s:9:\"keywords.\";s:5:\"array\";s:9:\"innerWrap\";s:4:\"wrap\";s:10:\"innerWrap.\";s:5:\"array\";s:10:\"innerWrap2\";s:4:\"wrap\";s:11:\"innerWrap2.\";s:5:\"array\";s:7:\"fontTag\";s:4:\"wrap\";s:8:\"fontTag.\";s:5:\"array\";s:10:\"addParams.\";s:5:\"array\";s:10:\"textStyle.\";s:5:\"array\";s:11:\"tableStyle.\";s:5:\"array\";s:9:\"filelink.\";s:5:\"array\";s:10:\"preCObject\";s:7:\"cObject\";s:11:\"preCObject.\";s:5:\"array\";s:11:\"postCObject\";s:7:\"cObject\";s:12:\"postCObject.\";s:5:\"array\";s:9:\"wrapAlign\";s:5:\"align\";s:10:\"wrapAlign.\";s:5:\"array\";s:9:\"typolink.\";s:5:\"array\";s:14:\"TCAselectItem.\";s:5:\"array\";s:5:\"space\";s:5:\"space\";s:6:\"space.\";s:5:\"array\";s:11:\"spaceBefore\";s:3:\"int\";s:12:\"spaceBefore.\";s:5:\"array\";s:10:\"spaceAfter\";s:3:\"int\";s:11:\"spaceAfter.\";s:5:\"array\";s:4:\"wrap\";s:4:\"wrap\";s:5:\"wrap.\";s:5:\"array\";s:10:\"noTrimWrap\";s:4:\"wrap\";s:11:\"noTrimWrap.\";s:5:\"array\";s:5:\"wrap2\";s:4:\"wrap\";s:6:\"wrap2.\";s:5:\"array\";s:8:\"dataWrap\";s:8:\"dataWrap\";s:9:\"dataWrap.\";s:5:\"array\";s:7:\"prepend\";s:7:\"cObject\";s:8:\"prepend.\";s:5:\"array\";s:6:\"append\";s:7:\"cObject\";s:7:\"append.\";s:5:\"array\";s:5:\"wrap3\";s:4:\"wrap\";s:6:\"wrap3.\";s:5:\"array\";s:9:\"outerWrap\";s:4:\"wrap\";s:10:\"outerWrap.\";s:5:\"array\";s:10:\"insertData\";s:7:\"boolean\";s:11:\"insertData.\";s:5:\"array\";s:10:\"offsetWrap\";s:5:\"space\";s:11:\"offsetWrap.\";s:5:\"array\";s:12:\"postUserFunc\";s:12:\"functionName\";s:15:\"postUserFuncInt\";s:12:\"functionName\";s:13:\"prefixComment\";s:6:\"string\";s:14:\"prefixComment.\";s:5:\"array\";s:9:\"editIcons\";s:6:\"string\";s:10:\"editIcons.\";s:5:\"array\";s:9:\"editPanel\";s:7:\"boolean\";s:10:\"editPanel.\";s:5:\"array\";s:18:\"stdWrapPostProcess\";s:4:\"hook\";s:5:\"debug\";s:7:\"boolean\";s:6:\"debug.\";s:5:\"array\";s:9:\"debugFunc\";s:7:\"boolean\";s:10:\"debugFunc.\";s:5:\"array\";s:9:\"debugData\";s:7:\"boolean\";s:10:\"debugData.\";s:5:\"array\";}s:17:\"image_compression\";a:22:{i:10;a:2:{s:6:\"params\";s:0:\"\";s:3:\"ext\";s:3:\"gif\";}i:11;a:2:{s:6:\"params\";s:11:\"-colors 128\";s:3:\"ext\";s:3:\"gif\";}i:12;a:2:{s:6:\"params\";s:10:\"-colors 64\";s:3:\"ext\";s:3:\"gif\";}i:13;a:2:{s:6:\"params\";s:10:\"-colors 32\";s:3:\"ext\";s:3:\"gif\";}i:14;a:2:{s:6:\"params\";s:10:\"-colors 16\";s:3:\"ext\";s:3:\"gif\";}i:15;a:2:{s:6:\"params\";s:9:\"-colors 8\";s:3:\"ext\";s:3:\"gif\";}i:20;a:2:{s:6:\"params\";s:12:\"-quality 100\";s:3:\"ext\";s:3:\"jpg\";}i:21;a:2:{s:6:\"params\";s:11:\"-quality 90\";s:3:\"ext\";s:3:\"jpg\";}i:22;a:2:{s:6:\"params\";s:11:\"-quality 80\";s:3:\"ext\";s:3:\"jpg\";}i:23;a:2:{s:6:\"params\";s:11:\"-quality 70\";s:3:\"ext\";s:3:\"jpg\";}i:24;a:2:{s:6:\"params\";s:11:\"-quality 60\";s:3:\"ext\";s:3:\"jpg\";}i:25;a:2:{s:6:\"params\";s:11:\"-quality 50\";s:3:\"ext\";s:3:\"jpg\";}i:26;a:2:{s:6:\"params\";s:11:\"-quality 40\";s:3:\"ext\";s:3:\"jpg\";}i:27;a:2:{s:6:\"params\";s:11:\"-quality 30\";s:3:\"ext\";s:3:\"jpg\";}i:28;a:2:{s:6:\"params\";s:11:\"-quality 20\";s:3:\"ext\";s:3:\"jpg\";}i:30;a:2:{s:6:\"params\";s:11:\"-colors 256\";s:3:\"ext\";s:3:\"png\";}i:31;a:2:{s:6:\"params\";s:11:\"-colors 128\";s:3:\"ext\";s:3:\"png\";}i:32;a:2:{s:6:\"params\";s:10:\"-colors 64\";s:3:\"ext\";s:3:\"png\";}i:33;a:2:{s:6:\"params\";s:10:\"-colors 32\";s:3:\"ext\";s:3:\"png\";}i:34;a:2:{s:6:\"params\";s:10:\"-colors 16\";s:3:\"ext\";s:3:\"png\";}i:35;a:2:{s:6:\"params\";s:9:\"-colors 8\";s:3:\"ext\";s:3:\"png\";}i:39;a:2:{s:6:\"params\";s:0:\"\";s:3:\"ext\";s:3:\"png\";}}s:13:\"image_effects\";a:9:{i:1;s:10:\"-rotate 90\";i:2;s:11:\"-rotate 270\";i:3;s:11:\"-rotate 180\";i:10;s:16:\"-colorspace GRAY\";i:11;s:11:\"-sharpen 70\";i:20;s:10:\"-normalize\";i:23;s:9:\"-contrast\";i:25;s:10:\"-gamma 1.3\";i:26;s:10:\"-gamma 0.8\";}s:4:\"data\";a:71:{s:3:\"uid\";s:4:\"1304\";s:3:\"pid\";s:4:\"1292\";s:6:\"tstamp\";s:10:\"1174680211\";s:7:\"sorting\";s:1:\"8\";s:7:\"deleted\";s:1:\"0\";s:12:\"perms_userid\";s:3:\"121\";s:13:\"perms_groupid\";s:3:\"114\";s:10:\"perms_user\";s:2:\"31\";s:11:\"perms_group\";s:2:\"27\";s:15:\"perms_everybody\";s:1:\"0\";s:6:\"crdate\";s:10:\"1147397799\";s:9:\"cruser_id\";s:3:\"121\";s:5:\"title\";s:4:\"Home\";s:7:\"doktype\";s:1:\"1\";s:8:\"TSconfig\";s:0:\"\";s:11:\"storage_pid\";s:1:\"0\";s:11:\"is_siteroot\";s:1:\"0\";s:13:\"php_tree_stop\";s:1:\"0\";s:17:\"tx_impexp_origuid\";s:1:\"0\";s:3:\"url\";s:0:\"\";s:6:\"hidden\";s:1:\"0\";s:9:\"starttime\";s:1:\"0\";s:7:\"endtime\";s:1:\"0\";s:7:\"urltype\";s:1:\"1\";s:8:\"shortcut\";s:1:\"0\";s:13:\"shortcut_mode\";s:1:\"0\";s:8:\"no_cache\";s:1:\"0\";s:8:\"fe_group\";s:1:\"0\";s:8:\"subtitle\";s:0:\"\";s:6:\"layout\";s:1:\"0\";s:6:\"target\";s:0:\"\";s:5:\"media\";s:0:\"\";s:11:\"lastUpdated\";s:1:\"0\";s:8:\"keywords\";s:0:\"\";s:13:\"cache_timeout\";s:1:\"0\";s:8:\"newUntil\";s:1:\"0\";s:11:\"description\";s:0:\"\";s:9:\"no_search\";s:1:\"0\";s:15:\"SYS_LASTCHANGED\";s:10:\"1394398071\";s:8:\"abstract\";s:0:\"\";s:6:\"module\";s:0:\"\";s:16:\"extendToSubpages\";s:1:\"0\";s:6:\"author\";s:0:\"\";s:12:\"author_email\";s:0:\"\";s:9:\"nav_title\";s:0:\"\";s:16:\"content_from_pid\";s:1:\"0\";s:9:\"mount_pid\";s:1:\"0\";s:5:\"alias\";s:4:\"home\";s:8:\"nav_hide\";s:1:\"0\";s:12:\"mount_pid_ol\";s:1:\"0\";s:9:\"t3ver_oid\";s:1:\"0\";s:8:\"t3ver_id\";s:1:\"0\";s:11:\"t3ver_label\";s:0:\"\";s:8:\"editlock\";s:1:\"0\";s:8:\"l18n_cfg\";s:1:\"0\";s:13:\"fe_login_mode\";s:1:\"0\";s:22:\"tx_realurl_pathsegment\";s:0:\"\";s:10:\"t3ver_wsid\";s:1:\"0\";s:11:\"t3ver_state\";s:1:\"0\";s:11:\"t3ver_stage\";s:1:\"0\";s:11:\"t3ver_count\";s:1:\"0\";s:12:\"t3ver_tstamp\";s:1:\"0\";s:14:\"t3ver_swapmode\";s:1:\"0\";s:10:\"t3_origuid\";s:1:\"0\";s:29:\"tx_httpsenforcer_force_secure\";s:1:\"0\";s:13:\"t3ver_move_id\";s:1:\"0\";s:18:\"tx_realurl_exclude\";s:1:\"0\";s:10:\"url_scheme\";s:1:\"0\";s:14:\"backend_layout\";s:1:\"0\";s:25:\"backend_layout_next_level\";s:1:\"0\";s:26:\"currentValue_kidjls9dksoje\";s:0:\"\";}s:8:\"\0*\0table\";s:5:\"pages\";s:7:\"oldData\";a:0:{}s:15:\"alternativeData\";s:0:\"\";s:10:\"parameters\";a:0:{}s:13:\"currentValKey\";s:26:\"currentValue_kidjls9dksoje\";s:13:\"currentRecord\";s:10:\"pages:1304\";s:18:\"currentRecordTotal\";i:0;s:19:\"currentRecordNumber\";i:0;s:18:\"parentRecordNumber\";i:0;s:12:\"parentRecord\";a:0:{}s:6:\"regObj\";N;s:11:\"INT_include\";i:0;s:14:\"checkPid_cache\";a:0:{}s:23:\"checkPid_badDoktypeList\";s:3:\"255\";s:15:\"lastTypoLinkUrl\";s:0:\"\";s:18:\"lastTypoLinkTarget\";s:0:\"\";s:14:\"lastTypoLinkLD\";a:0:{}s:16:\"substMarkerCache\";a:0:{}s:14:\"recordRegister\";a:0:{}s:18:\"cObjHookObjectsArr\";a:0:{}s:21:\"\0*\0stdWrapHookObjects\";a:0:{}s:28:\"\0*\0getImgResourceHookObjects\";N;s:17:\"\0*\0contentObjects\";a:7:{s:8:\"Template\";O:22:\"tslib_content_Template\":1:{s:7:\"\0*\0cObj\";r:1;}s:4:\"File\";O:18:\"tslib_content_File\":1:{s:7:\"\0*\0cObj\";r:1;}s:7:\"Content\";O:21:\"tslib_content_Content\":1:{s:7:\"\0*\0cObj\";r:1;}s:4:\"User\";O:18:\"tslib_content_User\":1:{s:7:\"\0*\0cObj\";r:1;}s:4:\"Text\";O:18:\"tslib_content_Text\":1:{s:7:\"\0*\0cObj\";r:1;}s:18:\"ContentObjectArray\";O:32:\"tslib_content_ContentObjectArray\":1:{s:7:\"\0*\0cObj\";r:1;}s:26:\"ContentObjectArrayInternal\";O:40:\"tslib_content_ContentObjectArrayInternal\":1:{s:7:\"\0*\0cObj\";r:1;}}s:24:\"doConvertToUserIntObject\";b:0;s:17:\"\0*\0userObjectType\";b:0;s:21:\"stdWrapRecursionLevel\";i:0;s:13:\"stopRendering\";a:0:{}}\";s:4:\"type\";s:3:\"COA\";}}s:16:\"INTincScript_ext\";a:5:{s:6:\"divKey\";s:32:\"8b5e037c0066ee2628e5171bcf2231c6\";s:20:\"additionalHeaderData\";a:2:{s:6:\"JSCode\";s:0:\"\";s:9:\"JSImgCode\";s:696:\"\nimg7313_cdf5_0_n=new Image(); img7313_cdf5_0_n.src = \"typo3temp/menu/deb80aea7b.png\"; \nimg7313_cdf5_0_h=new Image(); img7313_cdf5_0_h.src = \"typo3temp/menu/2b85d98a2b.png\"; \nimg7312_cdf5_1_n=new Image(); img7312_cdf5_1_n.src = \"typo3temp/menu/4076cc8746.png\"; \nimg7312_cdf5_1_h=new Image(); img7312_cdf5_1_h.src = \"typo3temp/menu/64143f209b.png\"; \nimg7311_cdf5_2_n=new Image(); img7311_cdf5_2_n.src = \"typo3temp/menu/ce327e1db0.png\"; \nimg7311_cdf5_2_h=new Image(); img7311_cdf5_2_h.src = \"typo3temp/menu/a16580110e.png\"; \nimg7310_cdf5_3_n=new Image(); img7310_cdf5_3_n.src = \"typo3temp/menu/0f80955e7a.png\"; \nimg7310_cdf5_3_h=new Image(); img7310_cdf5_3_h.src = \"typo3temp/menu/85edfeff78.png\"; \";}s:20:\"additionalFooterData\";a:0:{}s:20:\"additionalJavaScript\";a:2:{s:7:\"openPic\";s:140:\" function openPic(url,winName,winParams) { //\n var theWindow = window.open(url,winName,winParams);\n if (theWindow) {theWindow.focus();}\n }\";s:9:\"mouseOver\";s:669:\" // JS function for mouse-over\n function over(name,imgObj) { //\n if (version == \"n3\" && document[name]) {document[name].src = eval(name+\"_h.src\");}\n else if (document.getElementById && document.getElementById(name)) {document.getElementById(name).src = eval(name+\"_h.src\");}\n else if (imgObj) {imgObj.src = eval(name+\"_h.src\");}\n }\n // JS function for mouse-out\n function out(name,imgObj) { //\n if (version == \"n3\" && document[name]) {document[name].src = eval(name+\"_n.src\");}\n else if (document.getElementById && document.getElementById(name)) {document.getElementById(name).src = eval(name+\"_n.src\");}\n else if (imgObj) {imgObj.src = eval(name+\"_n.src\");}\n }\";}s:13:\"additionalCSS\";a:0:{}}}','1472475703','1472454103')
debug_backtrace require(ypo3/sysext/cms/tslib/index_ts.php),ndex.php#83 // tslib_fe->generatePage_postProcessing#453 // tslib_fe->realPageCacheContent#3214 // tslib_fe->setPageCacheContent#2865 // t3lib_DB->exec_INSERTquery#2933 // t3lib_DB->debug#172
JuLis Rhein-Sieg: Home
Home

Die Zukunft im Blick

Seltene Erden – Restriktionen im Handel mit China

Seltene Erden und Metalle, die man in ihnen findet, spielen vor allem in der heutigen Mikroelektronik eine Schlüsselrolle. In andere Metalle wie etwa Silizium integriert erhält man hochwertige Halbleiter. Halbleiterbauteile findet man heute in so gut wie jedem komplexeren elektronischen Produkt, etwa in jedem Computer und in jedem Smartphone.

Doch die Lagerstätten, in denen man Erze findet, die diese seltenen Metalle enthalten, sind meist klein und man findet sie nur selten. Größere Lagerstätten vermutet man heute in China.

Da der weltweite Bedarf an seltenen Erden wird in den nächsten Jahren weiter steigen. So sind die Befürchtungen groß, dass China diese Kapazitäten dazu nutzen könnte, poitischen Druck auf andere Staaten und ihre Technologiewirtschaft auszuüben.

Zu diesem Thema führten die JuLis Rhein-Sieg eine Bildungsveranstaltung in Kalkar durch. Die rege Beteiligung zeigte das große Interesse an dem Thema und spiegelt seine hohe Relevanz wieder.

Neu aufgestellt für den Wahlkampf

Anfang Juni fanden sich die Jungen Liberalen Rhein-Sieg zum jährlichen Kreiskongress zusammen, um einen neuen Vorstand zu wählen. Hierbei wurde Dr. Christina Trück, molekulare Medizinerin, in ihrem Amt als Vorsitzende bestätigt, ebenso wie Kassenwart Markus Linnartz, Germanist, sowie der für das Internet zuständige Informatiker Christoph Briese und Sebastian Siegel als Schriftführer. Als neue Mitglieder wurden der 15 jährige Schüler Moritz Gillmair als stellv. Vorsitzender für Organisation und Tobias Köhler, Abiturient aus Meckenheim, als stellv. Vorsitzender für Presse und Programmatik in den Vorstand gewählt. Gemeinsam hoffen sie, die Arbeit des letzten Jahres, die mit vielen Infoständen und einer Bildungsfahrt nach Kalkar äußerst erfolgreich verlief, genau so produktiv fortzusetzen. Der FDP Kreisvorsitzende Jürgen Peter freute sich über die gute Stimmung und wünscht dem neu gewählten Vorstand alles Gute für die kommenden Aufgaben. "Nun sind wir gut aufgestellt für den Wahlkampf, in dem wir uns nach Kräften für unsere FDP ins Zeug legen werden" , freut sich Dr. Trück, die nun ihre dritte Amtszeit als Vorsitzende antritt. Mit dieser Erfahrung und dem Elan der neuen Vorstandsmitglieder hoffen die JuLis Rhein-Sieg auf ein weiteres Jahr voller Einsatz und Spaß am politischen Engagement

© Junge Liberale Rhein-Sieg 2006 - 2008 | Impressum