diff --git a/include/nav.php b/include/nav.php index 16ec941aa8..600043ee58 100644 --- a/include/nav.php +++ b/include/nav.php @@ -114,7 +114,7 @@ function nav(&$a) { /* only show friend requests for normal pages. Other page types have automatic friendship. */ if($_SESSION['page_flags'] == PAGE_NORMAL) { - $nav['notifications'] = array('notifications', t('Notifications'), "", t('Friend requests')); + $nav['notifications'] = array('notifications/network', t('Notifications'), "", t('Notifications')); } $nav['messages'] = array('message', t('Messages'), "", t('Private mail')); diff --git a/js/main.js b/js/main.js index 430f216d14..799330676b 100644 --- a/js/main.js +++ b/js/main.js @@ -95,22 +95,15 @@ if(home == 0) { home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') } $('#home-update').html(home); - var intro = $(data).find('intro').text(); - if(intro == 0) { intro = ''; $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') } - $('#intro-update').html(intro); - - var mail = $(data).find('mail').text(); - if(mail == 0) { mail = ''; $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') } - $('#mail-update').html(mail); - - - var eNotif = $(data).find('notif') notif = eNotif.attr('count'); if (notif>0){ $("#nav-notifications-linkmenu").addClass("on"); nnm = $("#nav-notifications-menu"); - nnm.html(""); + + //nnm.html(""); + nnm.html("
  • Show All Notifications
  • "); + //nnm.attr('popup','true'); eNotif.children("note").each(function(){ e = $(this); @@ -118,6 +111,7 @@ html = notifications_tpl.format(e.attr('href'),e.attr('photo'), text, e.attr('date')); nnm.append(html); }); + } else { $("#nav-notifications-linkmenu").removeClass("on"); $("#nav-notifications-menu").html(notifications_empty); @@ -164,15 +158,6 @@ }); function NavUpdate() { - if(! stopped) { - $.get("ping",function(data) { - $(data).find('result').each(function() { - // send nav-update event - $('nav').trigger('nav-update', this); - }); - }) ; - } - if($('#live-network').length) { src = 'network'; liveUpdate(); } if($('#live-profile').length) { src = 'profile'; liveUpdate(); } @@ -191,6 +176,14 @@ } } + if(! stopped) { + $.get("ping",function(data) { + $(data).find('result').each(function() { + // send nav-update event + $('nav').trigger('nav-update', this); + }); + }) ; + } timer = setTimeout(NavUpdate,30000); } diff --git a/mod/notifications.php b/mod/notifications.php index 0c35d4cd1a..403efc5bd4 100644 --- a/mod/notifications.php +++ b/mod/notifications.php @@ -64,110 +64,257 @@ function notifications_content(&$a) { } $o = ''; - nav_set_selected("notifications"); - - if(($a->argc > 1) && ($a->argv[1] == 'all')) - $sql_extra = ''; - else - $sql_extra = " AND `ignore` = 0 "; - - $o .= '

    ' . t('Pending Friend/Connect Notifications') . '

    ' . "\r\n"; - $o .= '
    '; - $o .= '' - . ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '
    ' . "\r\n"; + if( (($a->argc > 1) && ($a->argv[1] == 'intros')) || (($a->argc == 1))) { + + if(($a->argc > 2) && ($a->argv[2] == 'all')) + $sql_extra = ''; + else + $sql_extra = " AND `ignore` = 0 "; + + $notif_tpl = get_markup_template('notifications.tpl'); + + $notif_content .= '' + . ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '' . "\r\n"; + $r = q("SELECT COUNT(*) AS `total` FROM `intro` + WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", + intval($_SESSION['uid']) + ); + if($r && count($r)) { + $a->set_pager_total($r[0]['total']); + $a->set_pager_itemspage(20); + } - $r = q("SELECT COUNT(*) AS `total` FROM `intro` - WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", - intval($_SESSION['uid']) - ); - if($r && count($r)) { - $a->set_pager_total($r[0]['total']); - $a->set_pager_itemspage(20); - } + $r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest` + FROM `intro` LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id` + WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", + intval($_SESSION['uid'])); - $r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest` - FROM `intro` LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id` - WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", - intval($_SESSION['uid'])); + if(($r !== false) && (count($r))) { - if(($r !== false) && (count($r))) { + $sugg = get_markup_template('suggestions.tpl'); + $tpl = get_markup_template("intros.tpl"); - $sugg = get_markup_template('suggestions.tpl'); - $tpl = get_markup_template("intros.tpl"); + foreach($r as $rr) { + if($rr['fid']) { - foreach($r as $rr) { - if($rr['fid']) { + $return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); + $notif_content .= replace_macros($sugg,array( + '$str_notifytype' => t('Notification type: '), + '$notify_type' => t('Friend Suggestion'), + '$intro_id' => $rr['intro_id'], + '$madeby' => sprintf( t('suggested by %s'),$rr['name']), + '$contact_id' => $rr['contact-id'], + '$photo' => ((x($rr,'fphoto')) ? $rr['fphoto'] : "images/default-profile.jpg"), + '$fullname' => $rr['fname'], + '$url' => $rr['furl'], + '$knowyou' => $knowyou, + '$approve' => t('Approve'), + '$note' => $rr['note'], + '$request' => $rr['frequest'] . '?addr=' . $return_addr, + '$ignore' => t('Ignore'), + '$discard' => t('Discard') - $return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); - $o .= replace_macros($sugg,array( + )); + + continue; + + } + $friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled '); + $fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : ''); + $dfrn_tpl = get_markup_template('netfriend.tpl'); + + $knowyou = ''; + $dfrn_text = ''; + + if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) { + if($rr['network'] === NETWORK_DFRN) + $knowyou = t('Claims to be known to you: ') . (($rr['knowyou']) ? t('yes') : t('no')); + else + $knowyou = ''; + $dfrn_text = replace_macros($dfrn_tpl,array( + '$intro_id' => $rr['intro_id'], + '$friend_selected' => $friend_selected, + '$fan_selected' => $fan_selected, + '$approve_as' => t('Approve as: '), + '$as_friend' => t('Friend'), + '$as_fan' => (($rr['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer')) + )); + } + + $notif_content .= replace_macros($tpl,array( '$str_notifytype' => t('Notification type: '), - '$notify_type' => t('Friend Suggestion'), + '$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')), + '$dfrn_text' => $dfrn_text, + '$dfrn_id' => $rr['issued-id'], + '$uid' => $_SESSION['uid'], '$intro_id' => $rr['intro_id'], - '$madeby' => sprintf( t('suggested by %s'),$rr['name']), '$contact_id' => $rr['contact-id'], - '$photo' => ((x($rr,'fphoto')) ? $rr['fphoto'] : "images/default-profile.jpg"), - '$fullname' => $rr['fname'], - '$url' => $rr['furl'], + '$photo' => ((x($rr,'photo')) ? $rr['photo'] : "images/default-profile.jpg"), + '$fullname' => $rr['name'], + '$url' => $rr['url'], '$knowyou' => $knowyou, '$approve' => t('Approve'), '$note' => $rr['note'], - '$request' => $rr['frequest'] . '?addr=' . $return_addr, '$ignore' => t('Ignore'), '$discard' => t('Discard') )); - - continue; - } - $friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled '); - $fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : ''); - $dfrn_tpl = get_markup_template('netfriend.tpl'); - - $knowyou = ''; - $dfrn_text = ''; - - if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) { - if($rr['network'] === NETWORK_DFRN) - $knowyou = t('Claims to be known to you: ') . (($rr['knowyou']) ? t('yes') : t('no')); - else - $knowyou = ''; - $dfrn_text = replace_macros($dfrn_tpl,array( - '$intro_id' => $rr['intro_id'], - '$friend_selected' => $friend_selected, - '$fan_selected' => $fan_selected, - '$approve_as' => t('Approve as: '), - '$as_friend' => t('Friend'), - '$as_fan' => (($rr['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer')) - )); - } - - - - $o .= replace_macros($tpl,array( - '$str_notifytype' => t('Notification type: '), - '$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')), - '$dfrn_text' => $dfrn_text, - '$dfrn_id' => $rr['issued-id'], - '$uid' => $_SESSION['uid'], - '$intro_id' => $rr['intro_id'], - '$contact_id' => $rr['contact-id'], - '$photo' => ((x($rr,'photo')) ? $rr['photo'] : "images/default-profile.jpg"), - '$fullname' => $rr['name'], - '$url' => $rr['url'], - '$knowyou' => $knowyou, - '$approve' => t('Approve'), - '$note' => $rr['note'], - '$ignore' => t('Ignore'), - '$discard' => t('Discard') - - )); } + else + info( t('No notifications.') . EOL); + + $o .= replace_macros($notif_tpl,array( + '$notif_content' => $notif_content, + '$activetab' => 'intros' + )); + + $o .= paginate($a); + return $o; + + } else if (($a->argc > 1) && ($a->argv[1] == 'network')) { + + $notif_tpl = get_markup_template('notifications.tpl'); + + $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, + `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`, + `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink` + FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent` + WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND + `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" , + intval(local_user()) + ); + + $tpl_item_likes = get_markup_template('notifications_likes_item.tpl'); + $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl'); + $tpl_item_friends = get_markup_template('notifications_friends_item.tpl'); + $tpl_item_comments = get_markup_template('notifications_comments_item.tpl'); + + $notif_content = ''; + + if (count($r) > 0) { + + foreach ($r as $it) { + switch($it['verb']){ + case ACTIVITY_LIKE: + $notif_content .= replace_macros($tpl_item_likes,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']), + '$item_when' => relative_date($it['created']) + )); + + break; + case ACTIVITY_DISLIKE: + $notif_content .= replace_macros($tpl_item_dislikes,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']), + '$item_when' => relative_date($it['created']) + )); + + break; + case ACTIVITY_FRIEND: + $notif_content .= replace_macros($tpl_item_friends,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s is now friend with %s"), $it['author-name'], $it['fname']), + '$item_when' => relative_date($it['created']) + )); + + break; + default: + $notif_content .= replace_macros($tpl_item_comments,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s commented %s's post"), $it['author-name'], $it['pname']), + '$item_when' => relative_date($it['created']) + )); + } + } + + } else { + + $notif_content = 'Nothing new!'; + } + + $o .= replace_macros($notif_tpl,array( + '$notif_content' => $notif_content, + '$activetab' => 'network' + )); + + } else if (($a->argc > 1) && ($a->argv[1] == 'home')) { + + $notif_tpl = get_markup_template('notifications.tpl'); + + $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, + `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`, + `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink` + FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent` + WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND + `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1 ORDER BY `item`.`created` DESC", + intval(local_user()) + ); + + $tpl_item_likes = get_markup_template('notifications_likes_item.tpl'); + $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl'); + $tpl_item_friends = get_markup_template('notifications_friends_item.tpl'); + $tpl_item_comments = get_markup_template('notifications_comments_item.tpl'); + + $notif_content = ''; + + if (count($r) > 0) { + + foreach ($r as $it) { + switch($it['verb']){ + case ACTIVITY_LIKE: + $notif_content .= replace_macros($tpl_item_likes,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']), + '$item_when' => relative_date($it['created']) + )); + + break; + case ACTIVITY_DISLIKE: + $notif_content .= replace_macros($tpl_item_dislikes,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']), + '$item_when' => relative_date($it['created']) + )); + + break; + case ACTIVITY_FRIEND: + $notif_content .= replace_macros($tpl_item_friends,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s is now friend with %s"), $it['author-name'], $it['fname']), + '$item_when' => relative_date($it['created']) + )); + + break; + default: + $notif_content .= replace_macros($tpl_item_comments,array( + '$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'], + '$item_image' => $it['author-avatar'], + '$item_text' => sprintf( t("%s commented %s's post"), $it['author-name'], $it['pname']), + '$item_when' => relative_date($it['created']) + )); + } + } + + } else { + $notif_content = 'Nothing new!'; + } + + $o .= replace_macros($notif_tpl,array( + '$notif_content' => $notif_content, + '$activetab' => 'home' + )); } - else - info( t('No notifications.') . EOL); $o .= paginate($a); return $o; diff --git a/view/nav.tpl b/view/nav.tpl index cf1c2a2271..b6caa2c233 100644 --- a/view/nav.tpl +++ b/view/nav.tpl @@ -43,6 +43,7 @@ diff --git a/view/notifications.tpl b/view/notifications.tpl new file mode 100644 index 0000000000..8656ea9d10 --- /dev/null +++ b/view/notifications.tpl @@ -0,0 +1,13 @@ + +

    Notifications

    + +

    + Network + Home + Introductions + Messages +

    + +
    + $notif_content +
    diff --git a/view/notifications_comments_item.tpl b/view/notifications_comments_item.tpl new file mode 100644 index 0000000000..96327b2d8f --- /dev/null +++ b/view/notifications_comments_item.tpl @@ -0,0 +1,3 @@ +
    + $item_text $item_when +
    \ No newline at end of file diff --git a/view/notifications_dislikes_item.tpl b/view/notifications_dislikes_item.tpl new file mode 100644 index 0000000000..96327b2d8f --- /dev/null +++ b/view/notifications_dislikes_item.tpl @@ -0,0 +1,3 @@ +
    + $item_text $item_when +
    \ No newline at end of file diff --git a/view/notifications_friends_item.tpl b/view/notifications_friends_item.tpl new file mode 100644 index 0000000000..96327b2d8f --- /dev/null +++ b/view/notifications_friends_item.tpl @@ -0,0 +1,3 @@ +
    + $item_text $item_when +
    \ No newline at end of file diff --git a/view/notifications_likes_item.tpl b/view/notifications_likes_item.tpl new file mode 100644 index 0000000000..96327b2d8f --- /dev/null +++ b/view/notifications_likes_item.tpl @@ -0,0 +1,3 @@ +
    + $item_text $item_when +
    \ No newline at end of file diff --git a/view/notifications_network_item.tpl b/view/notifications_network_item.tpl new file mode 100644 index 0000000000..f398f12109 --- /dev/null +++ b/view/notifications_network_item.tpl @@ -0,0 +1,3 @@ +
    + {$item_text} {$item_when} +
    \ No newline at end of file diff --git a/view/theme/testbubble/nav.tpl b/view/theme/testbubble/nav.tpl index baf5f7d301..3fbd73e319 100644 --- a/view/theme/testbubble/nav.tpl +++ b/view/theme/testbubble/nav.tpl @@ -9,6 +9,7 @@ {{ if $nav.notifications }}{{ endif }} {{ if $nav.messages }}{{ endif }} @@ -54,5 +55,5 @@ diff --git a/view/theme/testbubble/style.css b/view/theme/testbubble/style.css index 5e31a2c8a5..fd7482ba36 100644 --- a/view/theme/testbubble/style.css +++ b/view/theme/testbubble/style.css @@ -25,7 +25,7 @@ body { font-family: freesans,helvetica,arial,clean,sans-serif; font-size: 15px; color: #626262; - width: 100%; + width: 100%; } img { border: 0 none; max-width: 550px; } @@ -113,10 +113,13 @@ input[type=submit]:active { ::-moz-selection { background:#fdf795; color: #000; /* Firefox */ } section { - margin: 20px 11% 0px 11%; + float: left; + margin-left: 8%; + padding-top: 50px; + width: 50%; + margin: 20px 0px 30px 10%; font-size: 0.9em; line-height: 1.2em; - padding-right: 230px; } .lframe { @@ -256,9 +259,11 @@ section { /* ======= */ nav { + z-index: 10000; height: 50px; display: block; - position: relative; + position: fixed; + width: 100%; padding: 0px 10%; color: #efefef; background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) ); @@ -273,7 +278,7 @@ nav a:hover { text-decoration: none; color: #eeeeec; border:0px;} nav #banner { display: block; position: absolute; - margin-left: 20px; + margin-left: 10px; margin-top: 5px; padding-bottom:5px; } @@ -288,7 +293,7 @@ nav #user-menu { display: block; width: 250px; float: right; - margin-right:15px; + margin-right:20%; margin-top: 10px; padding: 5px; position: relative; @@ -361,7 +366,7 @@ ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:in #notifications { height: 32px; position: absolute; - top:10px; left: 40%; + top:10px; left: 35%; } .nav-ajax-update { width: 44px; @@ -431,10 +436,11 @@ ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:in /* ================= */ aside { - position: absolute; - right: 11%; - width: 260px; - margin-top: auto; + float: right; + margin-right: 10%; + /*width: 21%;*/ + width: 250px; + margin-top: 50px; font-size: 0.8em; font-style: bold; } @@ -475,16 +481,15 @@ aside a{ aside h4 { font-size: 1.3em; } -aside #viewcontacts { +.allcontact-link { + color: #626262; text-align: center; font-weight: bold; font-variant:small-caps; font-size: 1.1em; - padding-top: 5px; } - -#viewcontacts a { - color: #898989; +.allcontact-link a { + padding-bottom: 10px; } #profile-extra-links ul { margin-left: 0px; padding-left: 0px; list-style: none; } @@ -841,7 +846,7 @@ profile-jot-banner-wrapper { /* ========= */ .wall-item-outside-wrapper { - max-width: 83%; + max-width: 93%; border-bottom: 1px solid #dedede; margin-top: 20px; padding-right: 10px; @@ -2341,6 +2346,7 @@ margin-left: 0px; padding: 20px; padding-top: 10px; margin: 0 0px; + margin-bottom: 10px; background-color: #fff; -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); @@ -3030,7 +3036,7 @@ ul.menu-popup { #nav-notifications-menu { width: 320px; max-height: 400px; - overflow-y: scroll; + overflow-y: scroll;overflow-style:scrollbar; background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) ); background:-moz-linear-gradient( center top, #797979 5%, #898988 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988'); @@ -3049,7 +3055,7 @@ ul.menu-popup { #nav-notifications-menu img { float: left; margin-right: 5px; } #nav-notifications-menu .notif-when { font-size: 0.8em; display: block; } #nav-notifications-menu li { - padding: 7px 10px 7px 10px; + padding: 7px 0px 7px 10px; word-wrap:normal; border-bottom: 1px solid #626262; } @@ -3060,3 +3066,23 @@ ul.menu-popup { filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); background-color:#b20202; } + +.notif-item a { + vertical-align: middle; + color: #626262; + padding-bottom: 7px; +} + +.notif-item a:hover { + color: #b20202; +} + +.notif-image { + width: 32px; + height: 32px; + padding: 7px 7px 0px 0px; +} + +#jGrowl { + z-index: 20000; +} \ No newline at end of file