diff --git a/boot.php b/boot.php index 561290ef2e..0fafa1cf30 100755 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once('include/nav.php'); require_once('include/cache.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '2.3.1277' ); +define ( 'FRIENDICA_VERSION', '2.3.1278' ); define ( 'DFRN_PROTOCOL_VERSION', '2.22' ); define ( 'DB_UPDATE_VERSION', 1131 ); diff --git a/include/text.php b/include/text.php index 5ad0154d7a..011006b764 100644 --- a/include/text.php +++ b/include/text.php @@ -1235,4 +1235,77 @@ function item_post_type($item) { return t('post'); } +// post categories and "save to file" use the same item.file table for storage. +// We will differentiate the different uses by wrapping categories in angle brackets +// and save to file categories in square brackets. +// To do this we need to escape these characters if they appear in our tag. + +function file_tag_encode($s) { + return str_replace(array('<','>','[',']'),array('%3c','%3e','%5b','%5d'),$s); +} + +function file_tag_decode($s) { + return str_replace(array('%3c','%3e','%5b','%5d'),array('<','>','[',']'),$s); +} + +function file_tag_file_query($table,$s,$type = 'file') { + if($type == 'file') + $str = preg_quote( '[' . file_tag_encode($s) . ']' ); + else + $str = preg_quote( '<' . file_tag_encode($s) . '>' ); + return " AND " . (($table) ? dbesc($table) . '.' : '') . "file regexp '" . dbesc($str) . "' "; +} + +function file_tag_save_file($uid,$item,$file) { + $result = false; + if(! intval($uid)) + return false; + $r = q("select file from item where id = %d and uid = %d limit 1", + intval($item), + intval($uid) + ); + if(count($r)) { + if(! stristr($r[0]['file'],'[' . file_tag_encode($file) . ']')) + q("update item set file = '%s' where id = %d and uid = %d limit 1", + dbesc($r[0]['file'] . '[' . $file_tag_encode($file) . ']'), + intval($item), + intval($uid) + ); + $saved = get_pconfig($uid,'system','filetags'); + if((! strlen($saved)) || (! stristr($saved,'[' . file_tag_encode($file) . ']'))) + set_pconfig($uid,'system','filetags',$saved . '[' . file_tag_encode($file) . ']'); + } + return true; +} + +function file_tag_unsave_file($uid,$item,$file) { + $result = false; + if(! intval($uid)) + return false; + + $pattern = '[' . file_tag_encode($file) . ']' ; + + $r = q("select file from item where id = %d and uid = %d limit 1", + intval($item), + intval($uid) + ); + if(! count($r)) + return false; + + q("update item set file = '%s' where id = %d and uid = %d limit 1", + dbesc(str_replace($pattern,'',$r[0]['file'])), + intval($item), + intval($uid) + ); + + $r = q("select file from item where uid = %d " . file_tag_file_query('item',$file), + intval($uid) + ); + + if(! count($r)) { + $saved = get_pconfig($uid,'system','filetags'); + set_pconfig($uid,'system','filetags',str_replace($pattern,'',$saved)); + } + return true; +} diff --git a/mod/hcard.php b/mod/hcard.php index 19e649dcb6..6d2d9e2ebf 100755 --- a/mod/hcard.php +++ b/mod/hcard.php @@ -21,7 +21,7 @@ function hcard_init(&$a) { profile_load($a,$which,$profile); if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) { - $a->page['htmlhead'] .= ''; + $a->page['htmlhead'] .= ''; } if(x($a->profile,'openidserver')) $a->page['htmlhead'] .= '' . "\r\n"; diff --git a/mod/network.php b/mod/network.php index aabd9095fc..7e7a958419 100755 --- a/mod/network.php +++ b/mod/network.php @@ -52,13 +52,15 @@ function network_init(&$a) { function saved_searches($search) { $srchurl = '/network?f=' - . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') - . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '') + . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') + . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '') . ((x($_GET,'bmark')) ? '&bmark=' . $_GET['bmark'] : '') - . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '') - . ((x($_GET,'nets')) ? '&nets=' . $_GET['nets'] : '') - . ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '') - . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : ''); + . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '') + . ((x($_GET,'nets')) ? '&nets=' . $_GET['nets'] : '') + . ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '') + . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '') + . ((x($_GET,'file')) ? '&file=' . $_GET['file'] : ''); + ; $o = ''; @@ -226,6 +228,7 @@ function network_content(&$a, $update = 0) { $nets = ((x($_GET,'nets')) ? $_GET['nets'] : ''); $cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0); $cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99); + $file = ((x($_GET,'file')) ? $_GET['file'] : ''); if(($a->argc > 2) && $a->argv[2] === 'new') $nouveau = true; @@ -239,7 +242,7 @@ function network_content(&$a, $update = 0) { } } - if(x($_GET,'search')) + if(x($_GET,'search') || x($_GET,'file')) $nouveau = true; if($cid) $def_acl = array('allow_cid' => '<' . intval($cid) . '>'); @@ -358,6 +361,7 @@ function network_content(&$a, $update = 0) { . ((x($_GET,'nets')) ? '&nets=' . $_GET['nets'] : '') . ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '') . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '') + . ((x($_GET,'file')) ? '&file=' . $_GET['file'] : '') . "'; var profile_page = " . $a->pager['page'] . "; \r\n"; } @@ -371,6 +375,9 @@ function network_content(&$a, $update = 0) { dbesc('\\]' . preg_quote($search) . '\\[') ); } + if(strlen($file)) { + $sql_extra .= file_tag_file_query('item',$file); + } if($conv) { $myurl = $a->get_baseurl() . '/profile/'. $a->user['nickname']; diff --git a/mod/profile.php b/mod/profile.php index 1a701f4077..428679ffc5 100755 --- a/mod/profile.php +++ b/mod/profile.php @@ -27,7 +27,7 @@ function profile_init(&$a) { profile_load($a,$which,$profile); if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) { - $a->page['htmlhead'] .= ''; + $a->page['htmlhead'] .= ''; } if(x($a->profile,'openidserver')) $a->page['htmlhead'] .= '' . "\r\n"; diff --git a/view/theme/dispy-dark/icons.png b/view/theme/dispy-dark/icons.png index f99ec29ee2..eb84b8d8e7 100644 Binary files a/view/theme/dispy-dark/icons.png and b/view/theme/dispy-dark/icons.png differ diff --git a/view/theme/dispy-dark/nav.tpl b/view/theme/dispy-dark/nav.tpl index 4a030e7ae1..f6e399ef52 100644 --- a/view/theme/dispy-dark/nav.tpl +++ b/view/theme/dispy-dark/nav.tpl @@ -1,5 +1,4 @@ +
+$langselector +
+ diff --git a/view/theme/dispy-dark/style.css b/view/theme/dispy-dark/style.css index 805749b1c5..7a57628b94 100644 --- a/view/theme/dispy-dark/style.css +++ b/view/theme/dispy-dark/style.css @@ -122,7 +122,6 @@ a { color: #88a9d2; text-decoration: none; margin-bottom: 1px; - text-decoration: none; } /*a:hover { */ /* text-decoration: none;*/ @@ -140,7 +139,6 @@ blockquote { } a:hover { color: #729fcf; - padding-bottom: 0; border-bottom: 1px dotted #729fcf; } .required { @@ -483,12 +481,12 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-link height: 22px; overflow: hidden; margin: 0px; - background: transparent url(icons.png) -190px -60px no-repeat; + background: transparent url(icons.png) -190px -60px no-repeat; } .nav-ajax-update, .nav-ajax-left { width: 30px; height: 19px; - background: transparent url(notifications.svg) 0 0 no-repeat; + background: transparent url(notifications.png) 0 0 no-repeat; color: #222; font-weight: bold; font-size: 0.8em; @@ -519,14 +517,14 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-link } #lang-select-icon { cursor: pointer; - position: absolute; - left: 0; - top: 0; + position: fixed; + left: 28px; + bottom: 6px; } #language-selector { - position: absolute; - top: 0; - left: 16px; + position: fixed; + bottom: 2px; + left: 52px; } .menu-popup { position: absolute; @@ -539,9 +537,9 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-link list-style: none; border: 3px solid #364e59; z-index: 100000; - -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7); - -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7); - box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7); + -webkit-box-shadow: 3px 3px 10px 0 rgba(0, 0, 0, 0.7); + -moz-box-shadow: 3px 3px 10px 0 rgba(0, 0, 0, 0.7); + box-shadow: 3px 3px 10px 0 rgba(0, 0, 0, 0.7); } .menu-popup a { display: block; @@ -589,24 +587,24 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-link /** sysmsg **/ #sysmsg_info { - position:fixed; - bottom:0; - -moz-box-shadow:0 0 5px #888; - -webkit-box-shadow:0 0 5px #888; - box-shadow:0 0 5px #888; + position: fixed; + bottom: 0; + -moz-box-shadow: 3px 3px 3px 10px 0 #000; + -webkit-box-shadow: 3px 3px 10px 0 #000; + box-shadow: 3px 3px 10px 0 #000; padding: 10px; - background-color:#fcaf3e; + background-color: #fcaf3e; border:2px solid #f8911b; - border-bottom:0; + border-bottom: 0; padding-bottom: 50px; z-index: 1000; } #sysmsg { position: fixed; bottom: 0; - -moz-box-shadow: 0 0 5px #888; - -webkit-box-shadow: 0 0 5px #888; - box-shadow: 0 0 5px #888; + -moz-box-shadow: 3px 3px 10px 0 #000; + -webkit-box-shadow: 3px 3px 10px 0 #000; + box-shadow: 3px 3px 10px 0 #000; padding: 10px; background-color: #fcaf3e; border: 2px solid #f8911b; @@ -946,7 +944,7 @@ aside #viewcontacts { * section */ section { - margin: 20px 6% 0 4%; + margin: 20px 8% 0 4%; font-size: 0.8em; padding-right: 230px; min-width: 475px; @@ -955,30 +953,31 @@ section { /** tabs **/ .tabs { list-style: none; - margin: 10px 0 10px; + margin: 10px 0; padding: 0; - border-bottom: 1px solid #729fcf; - font-size: 14px; } .tabs li { display: inline; } .tab { - padding: 0 5px; + border: 1px solid #729fcf; + padding: 4px; } .tab:hover { - background-color: #88a9d2; - color: #111; - border: 0px; + background: #88a9d2; + color: #2e2f2e; } .tab:active { - background-color: #88a9d2; - color: #111; - border: 0px; + background: #88a9d2; + color: #2e2f2e; } .tab.active { - background-color: #88a9d2; - color: #111; + background: #88a9d2; + color: #2e2f2e; +} +.tab a { + border: 0; + text-decoration: none; } /** @@ -1005,6 +1004,9 @@ section { .shiny { background: #2e3436; } +.heart { + color: red; +} .wall-item-content { overflow-x: auto; } @@ -1328,10 +1330,11 @@ div[id$="wrapper"] br { .photo-album-image-wrapper, .photo-top-image-wrapper { float: left; - -moz-box-shadow: 0 0 5px #888; - -webkit-box-shadow: 0 0 5px #888; - box-shadow: 0 0 5px #888; - background-color: #eee; + -moz-box-shadow: 3px 3px 10px 0 #000; + -webkit-box-shadow: 3px 3px 10px 0 #000; + box-shadow: 3px 3px 10px 0 #000; + background-color: #222; + color: #2e2f2e; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; @@ -1548,8 +1551,7 @@ div[id$="wrapper"] br { .view-contact-wrapper, .contact-entry-wrapper { float: left; - margin-right: 5px; - margin-bottom: 40px; + margin: 0 5px 40px 0; width: 120px; height: 120px; padding: 3px; @@ -1712,17 +1714,20 @@ div[id$="wrapper"] br { clear: both; } -#register-form label, -#profile-edit-form label { - width: 300px; - float: left; -} +/*#register-form label, */ +/*#profile-edit-form label {*/ +/* width: 300px; */ +/* float: left; */ +/*} */ -#register-form span, -#profile-edit-form span { - color:#555753; - display:block; - margin-bottom:20px; +/*#register-form span, */ +/*#profile-edit-form span {*/ +/* color: #555753; */ +/* display: block; */ +/* margin-bottom: 20px; */ +/*} */ +#profile-edit-marital-label span { + margin: -4px; } .settings-submit-wrapper, .profile-edit-submit-wrapper { @@ -1944,7 +1949,12 @@ div[id$="wrapper"] br { */ .directory-item { float: left; - margin: 50px 50px 0px 0px; + /*margin: 50px 50px 0px 0px;*/ + margin: 0 5px 4px 0; + padding: 3px; + width: 180px; + height: 250px; + position: relative; } @@ -1956,8 +1966,8 @@ div[id$="wrapper"] br { } .group-selected, .nets-selected { padding: 3px; - border: 1px solid #f8f8f8; - background: #2e302e; + color: #2e2f2e; + background: #88a9d2; font-weight: bold; } .groupsideedit { diff --git a/view/theme/dispy-dark/theme.php b/view/theme/dispy-dark/theme.php index c72884f1a5..a7aec1c1a4 100644 --- a/view/theme/dispy-dark/theme.php +++ b/view/theme/dispy-dark/theme.php @@ -72,3 +72,6 @@ $(document).ready(function() { }); EOT; + +$a->page['footer'] .= << -$langselector @@ -112,11 +111,14 @@ works --> {{ endif }} - +
+$langselector +
+ diff --git a/view/theme/dispy/style.css b/view/theme/dispy/style.css index 8081bfc281..24fa39f77f 100644 --- a/view/theme/dispy/style.css +++ b/view/theme/dispy/style.css @@ -79,7 +79,7 @@ mark { /* Redeclare monospace font family: h5bp.com/j */ pre, code, kbd, samp, .wall-item-body code { font-family: monospace, monospace; - _font-family: 'courier new', monospace; + _font-family: monospace; font-size: 1em; } /* Improve readability of pre-formatted text in all browsers */ @@ -127,6 +127,7 @@ a:hover img { } blockquote { background: #eee; + color: #111; text-indent: 5px; padding: 5px; border: 1px #aaa solid; @@ -134,7 +135,6 @@ blockquote { } a:hover { color: #729fcf; - padding-bottom: 0; border-bottom: 1px dotted #729fcf; } .required { @@ -462,6 +462,7 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-link right: 1%; padding: 5px; background: #2e3436; + color: transparent; border-radius: 5px; z-index: 100; } @@ -511,14 +512,14 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-link } #lang-select-icon { cursor: pointer; - position: absolute; - left: 0; - top: 0; + position: fixed; + left: 28px; + bottom: 6px; } #language-selector { - position: absolute; - top: 0; - left: 16px; + position: fixed; + bottom: 2px; + left: 52px; } .menu-popup { position: absolute; @@ -633,8 +634,24 @@ aside { .vcard #profile-photo-wrapper { margin: 20px; } +/* http://css-tricks.com/snippets/css/css-box-shadow/ + * box-shadow: + * 1. The horizontal offset of the shadow, positive means + * the shadow will be on the right of the box, a negative + * offset will put the shadow on the left of the box. + * 2. The vertical offset of the shadow, a negative one + * means the box-shadow will be above the box, a + * positive one means the shadow will be below the box. + * 3. The blur radius (optional), if set to 0 the shadow + * will be sharp, the higher the number, the more blurred + * it will be. + * 4. The spread radius (optional), positive values increase + * the size of the shadow, negative values decrease the size. + * Default is 0 (the shadow is same size as blur). + * 5. Colo[u]r + */ .vcard #profile-photo-wrapper img { - box-shadow: 3px 3px 10px 0; + box-shadow: 3px 3px 10px 0 #000; } aside h4 { font-size: 1.2em; @@ -643,8 +660,10 @@ aside #viewcontacts { text-align: right; } .aprofile dt { - box-shadow: 1px 1px 5px 0; color: #666666; + background: transparent; + font-weight: bold; + box-shadow: 1px 1px 5px 0 #000; margin: 15px 0 5px; padding-left: 5px; } @@ -707,51 +726,11 @@ aside #viewcontacts { } #jot #jot-tools span a { display: block; - /*color: #cccccc; */ - /*width: 100%; */ - /*height: 40px; */ - /*text-align: center;*/ - /*line-height: 40px; */ - /*overflow: hidden;*/ } -/*#jot #jot-tools li:hover {*/ - /*background-color: #364e59;*/ -/*}*/ #jot #jot-tools .perms { float: right; width: 40px; } -/*#jot #jot-tools .perms a.unlock {*/ -/* width: 30px; */ -/* border-left: 10px solid #cccccc;*/ -/* background-color: #cccccc; */ -/*}*/ -/*#jot #jot-tools .perms a.lock {*/ -/* width: 30px; */ -/* border-left: 10px solid #666666;*/ -/* background-color: #666666; */ -/*}*/ -/*#jot #jot-tools li.submit { */ -/* float: right; */ -/* background-color: #cccccc; */ -/* border-bottom: 2px solid #cccccc; */ -/* border-right: 1px solid #666666; */ -/* border-left: 1px solid #666666; */ -/*} */ -/*#jot #jot-tools li.submit input { */ -/* border: 0px; */ -/* margin: 0px; */ -/* padding: 0px; */ -/* background-color: #cccccc; */ -/* color: #666666; */ -/* width: 80px; */ -/* height: 40px; */ -/* line-height: 40px; */ -/*} */ -/*#jot #jot-tools li.submit input:hover {*/ -/* background-color: #bdcdd4; */ -/* color: #666666; */ -/*} */ #jot #jot-tools li.loading { float: right; background-color: #ffffff; @@ -945,17 +924,22 @@ aside #viewcontacts { } #jot-preview-content { background-color: #ffffe0; - border: 1px #aaaa00 solid; + color: #111; + border: 1px #aa0 solid; border-radius: 3px; padding: 3px 3px 6px 10px; } +#jot-preview-content .wall-item-outside-wrapper { + border: 0; + border-radius: 0px; +} /** * section */ section { - margin: 20px 6% 0 4%; + margin: 20px 8% 0 4%; font-size: 0.8em; padding-right: 230px; min-width: 475px; @@ -964,28 +948,32 @@ section { /** tabs **/ .tabs { list-style: none; - margin: 10px 0 10px; + margin: 10px 0; padding: 0; - border-bottom: 1px solid #729fcf; - font-size: 14px; } .tabs li { display: inline; } .tab { - padding: 0 5px; + border: 1px solid #729fcf; + padding: 4px; } .tab:hover { - background-color: #729fcf; + background: #729fcf; color: #eeeeec; - border: 0px; } .tab:active { - background-color: #729fcf; + background: #729fcf; color: #eeeeec; - border: 0px; } - +.tab.active { + background: #729fcf; + color: #eeeeec; +} +.tab a { + border: 0; + text-decoration: none; +} /** * items @@ -1011,6 +999,9 @@ section { .shiny { background: #efefdf; } +.heart { + color: red; +} .wall-item-content { overflow-x: auto; } @@ -1297,6 +1288,7 @@ section { border-style: solid; border-width: 1px 1px 1px 10px; background: #eee; + color: #444; width: 95%; } @@ -1553,8 +1545,7 @@ div[id$="wrapper"] br { .view-contact-wrapper, .contact-entry-wrapper { float: left; - margin-right: 5px; - margin-bottom: 40px; + margin: 0 5px 40px 0; width: 120px; height: 120px; padding: 3px; @@ -1666,8 +1657,9 @@ div[id$="wrapper"] br { } .contact-photo-menu { width: auto; - border: 2px solid #444444; - background: #FFFFFF; + border: 2px solid #444; + background: #eee; + color: #111; position: absolute; left: 0px; top: 90px; display: none; @@ -1706,6 +1698,7 @@ div[id$="wrapper"] br { -moz-border-radius: 5px; border-radius: 5px; padding: 5px; + color: #111; } #settings-default-perms { margin-bottom: 20px; @@ -1715,17 +1708,20 @@ div[id$="wrapper"] br { clear: both; } -#register-form label, -#profile-edit-form label { - width: 300px; - float: left; -} +/*#register-form label, */ +/*#profile-edit-form label {*/ +/* width: 300px; */ +/* float: left; */ +/*} */ -#register-form span, -#profile-edit-form span { - color:#555753; - display:block; - margin-bottom:20px; +/*#register-form span, */ +/*#profile-edit-form span {*/ +/* color: #555753; */ +/* display: block; */ +/* margin-bottom: 20px; */ +/*} */ +#profile-edit-marital-label span { + margin: -4px; } .settings-submit-wrapper, .profile-edit-submit-wrapper { @@ -1742,17 +1738,19 @@ div[id$="wrapper"] br { float: left; margin: 20px 20px 0px 0px; } - #profile-edit-links ul { margin: 20px 0; padding: 0; list-style: none; } - #register-sitename { display: inline; font-weight: bold; } +#advanced-expire-popup { +/* background: #2e2f2e; + color: #eec;*/ +} /** * contacts selector @@ -1945,7 +1943,12 @@ div[id$="wrapper"] br { */ .directory-item { float: left; - margin: 50px 50px 0px 0px; + /*margin: 50px 50px 0px 0px;*/ + margin: 0 5px 4px 0; + padding: 3px; + width: 180px; + height: 250px; + position: relative; } @@ -1957,6 +1960,7 @@ div[id$="wrapper"] br { } .group-selected, .nets-selected { padding: 3px; + color: #111; border: 1px solid #CCCCCC; background: #F8F8F8; font-weight: bold; @@ -2132,6 +2136,7 @@ div[id$="wrapper"] br { padding: 5px; background: #eee; vertical-align: middle; + color: #111; } .field input, input[type="text"] { width: 250px; @@ -2172,7 +2177,7 @@ div[id$="wrapper"] br { display:none !important; } .field.radio .field_help { - margin-left: 0; + margin-left: 297px; } @@ -2182,8 +2187,8 @@ div[id$="wrapper"] br { .popup { width: 100%; height: 100%; - top:0px; - left:0px; + top: 0px; + left: 0px; position: absolute; display: none; } @@ -2298,12 +2303,6 @@ div[id$="wrapper"] br { .icon.drophide, .icon.delete { float: left; } -/*.icon.s22 { - display: block; - background: url(icons.png) no-repeat; - width: 22px; - height: 22px; -}*/ .icon.s22.delete { display: block; background-position: -110px 0; @@ -2649,4 +2648,3 @@ footer { font-size: 15pt; } } - diff --git a/view/theme/dispy/theme.php b/view/theme/dispy/theme.php index c72884f1a5..a7aec1c1a4 100644 --- a/view/theme/dispy/theme.php +++ b/view/theme/dispy/theme.php @@ -72,3 +72,6 @@ $(document).ready(function() { }); EOT; + +$a->page['footer'] .= <<