function &getNotificationsConf(&$params)
 {
     static $nConf = null;
     if ($nConf !== null) {
         return $nConf;
     }
     // (a) Check if notifications are not enabled
     if (!$params->get('enable_notifications', 0)) {
         $nConf = false;
         return $nConf;
     }
     $db = JFactory::getDBO();
     $nConf = new stdClass();
     // (b) Get Content Type specific notifications (that override global)
     $nConf->userlist_notify_new = FLEXIUtilities::paramToArray($params->get('userlist_notify_new'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
     $nConf->usergrps_notify_new = FLEXIUtilities::paramToArray($params->get('usergrps_notify_new', array()));
     $nConf->usergrps_notify_new_fa = FLEXIUtilities::paramToArray($params->get('usergrps_notify_new_fa', array()));
     $nConf->userlist_notify_new_pending = FLEXIUtilities::paramToArray($params->get('userlist_notify_new_pending'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
     $nConf->usergrps_notify_new_pending = FLEXIUtilities::paramToArray($params->get('usergrps_notify_new_pending', array()));
     $nConf->usergrps_notify_new_pending_fa = FLEXIUtilities::paramToArray($params->get('usergrps_notify_new_pending_fa', array()));
     $nConf->userlist_notify_existing = FLEXIUtilities::paramToArray($params->get('userlist_notify_existing'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
     $nConf->usergrps_notify_existing = FLEXIUtilities::paramToArray($params->get('usergrps_notify_existing', array()));
     $nConf->usergrps_notify_existing_fa = FLEXIUtilities::paramToArray($params->get('usergrps_notify_existing_fa', array()));
     $nConf->userlist_notify_existing_reviewal = FLEXIUtilities::paramToArray($params->get('userlist_notify_existing_reviewal'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
     $nConf->usergrps_notify_existing_reviewal = FLEXIUtilities::paramToArray($params->get('usergrps_notify_existing_reviewal', array()));
     $nConf->usergrps_notify_existing_reviewal_fa = FLEXIUtilities::paramToArray($params->get('usergrps_notify_existing_reviewal_fa', array()));
     // (c) Get category specific notifications
     if ($params->get('nf_allow_cat_specific')) {
         $cats = $this->get('categories');
         $query = "SELECT params FROM #__categories WHERE id IN (" . implode(',', $cats) . ")";
         $db->setQuery($query);
         $mcats_params = FLEXI_J16GE ? $db->loadColumn() : $db->loadResultArray();
         foreach ($mcats_params as $cat_params) {
             $cat_params = FLEXI_J16GE ? new JRegistry($cat_params) : new JParameter($cat_params);
             if (!$cat_params->get('cats_enable_notifications', 0)) {
                 continue;
             }
             // Skip this category if category-specific notifications are not enabled for this category
             $cats_userlist_notify_new = FLEXIUtilities::paramToArray($cat_params->get('cats_userlist_notify_new'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
             $cats_usergrps_notify_new = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_new', array()));
             $cats_usergrps_notify_new_fa = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_new_fa', array()));
             $cats_userlist_notify_new_pending = FLEXIUtilities::paramToArray($cat_params->get('cats_userlist_notify_new_pending'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
             $cats_usergrps_notify_new_pending = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_new_pending', array()));
             $cats_usergrps_notify_new_pending_fa = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_new_pending_fa', array()));
             $cats_userlist_notify_existing = FLEXIUtilities::paramToArray($cat_params->get('cats_userlist_notify_existing'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
             $cats_usergrps_notify_existing = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_existing', array()));
             $cats_usergrps_notify_existing_fa = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_existing_fa', array()));
             $cats_userlist_notify_existing_reviewal = FLEXIUtilities::paramToArray($cat_params->get('cats_userlist_notify_existing_reviewal'), $regex = "/[\\s]*,[\\s]*/", $filterfunc = "intval");
             $cats_usergrps_notify_existing_reviewal = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_existing_reviewal', array()));
             $cats_usergrps_notify_existing_reviewal_fa = FLEXIUtilities::paramToArray($cat_params->get('cats_usergrps_notify_existing_reviewal_fa', array()));
             $nConf->userlist_notify_new = array_unique(array_merge($nConf->userlist_notify_new, $cats_userlist_notify_new));
             $nConf->usergrps_notify_new = array_unique(array_merge($nConf->usergrps_notify_new, $cats_usergrps_notify_new));
             $nConf->usergrps_notify_new_fa = array_unique(array_merge($nConf->usergrps_notify_new_fa, $cats_usergrps_notify_new_fa));
             $nConf->userlist_notify_new_pending = array_unique(array_merge($nConf->userlist_notify_new_pending, $cats_userlist_notify_new_pending));
             $nConf->usergrps_notify_new_pending = array_unique(array_merge($nConf->usergrps_notify_new_pending, $cats_usergrps_notify_new_pending));
             $nConf->usergrps_notify_new_pending_fa = array_unique(array_merge($nConf->usergrps_notify_new_pending_fa, $cats_usergrps_notify_new_pending_fa));
             $nConf->userlist_notify_existing = array_unique(array_merge($nConf->userlist_notify_existing, $cats_userlist_notify_existing));
             $nConf->usergrps_notify_existing = array_unique(array_merge($nConf->usergrps_notify_existing, $cats_usergrps_notify_existing));
             $nConf->usergrps_notify_existing_fa = array_unique(array_merge($nConf->usergrps_notify_existing_fa, $cats_usergrps_notify_existing_fa));
             $nConf->userlist_notify_existing_reviewal = array_unique(array_merge($nConf->userlist_notify_existing_reviewal, $cats_userlist_notify_existing_reviewal));
             $nConf->usergrps_notify_existing_reviewal = array_unique(array_merge($nConf->usergrps_notify_existing_reviewal, $cats_usergrps_notify_existing_reviewal));
             $nConf->usergrps_notify_existing_reviewal_fa = array_unique(array_merge($nConf->usergrps_notify_existing_reviewal_fa, $cats_usergrps_notify_existing_reviewal_fa));
         }
     }
     //echo "<pre>"; print_r($nConf); exit;
     // Construct configuation parameter names
     $nConf_emails = new stdClass();
     $notify_types = array('notify_new', 'notify_new_pending', 'notify_existing', 'notify_existing_reviewal');
     foreach ($notify_types as $ntype) {
         $ugrps_fa[$ntype] = 'usergrps_' . $ntype . '_fa';
         $ugrps[$ntype] = 'usergrps_' . $ntype;
         $ulist[$ntype] = 'userlist_' . $ntype;
     }
     // (e) Get emails, but first convert user groups to user ids
     foreach ($notify_types as $ntype) {
         $user_emails = array();
         // emails for user ids
         $user_emails_ulist = array();
         $_user_ids = array();
         $_user_names = array();
         foreach ($nConf->{$ulist[$ntype]} as $user_id_name) {
             if (is_numeric($user_id_name)) {
                 $_user_ids[] = (int) $user_id_name;
             } else {
                 $_user_names[] = $db->Quote($user_id_name);
             }
         }
         if (count($_user_ids) || count($_user_names)) {
             $query = "SELECT DISTINCT email FROM #__users";
             $where_clauses = array();
             if (count($_user_ids)) {
                 $where_clauses[] = " id IN (" . implode(",", $_user_ids) . ") ";
             }
             if (count($_user_names)) {
                 $_user_names_quoted = array();
                 foreach ($_user_names as $_user_name) {
                     $_user_names_quoted[] = $db->Quote($_user_name);
                 }
                 $where_clauses[] = " username IN (" . implode(",", $_user_names_quoted) . ") ";
             }
             $query .= " WHERE " . implode(' OR ', $where_clauses);
             $db->setQuery($query);
             $user_emails_ulist = FLEXI_J16GE ? $db->loadColumn() : $db->loadResultArray();
             if ($db->getErrorNum()) {
                 echo $db->getErrorMsg();
             }
             // if ($ntype=='notify_new_pending') { echo "<pre>"; print_r($user_emails_ulist); exit; }
         }
         $user_emails_ugrps = array();
         if (count($nConf->{$ugrps[$ntype]})) {
             // emails for user groups
             if (!FLEXI_J16GE) {
                 $query = "SELECT DISTINCT email FROM #__users WHERE gid IN (" . implode(",", $nConf->{$ugrps[$ntype]}) . ")";
             } else {
                 $query = "SELECT DISTINCT email FROM #__users as u" . " JOIN #__user_usergroup_map ugm ON u.id=ugm.user_id AND ugm.group_id IN (" . implode(",", $nConf->{$ugrps[$ntype]}) . ")";
             }
             $db->setQuery($query);
             $user_emails_ugrps = FLEXI_J16GE ? $db->loadColumn() : $db->loadResultArray();
             if ($db->getErrorNum()) {
                 echo $db->getErrorMsg();
             }
             // if ($ntype=='notify_new_pending') { print_r($user_emails_ugrps); exit; }
         }
         $user_emails_ugrps_fa = array();
         if (FLEXI_ACCESS && count($nConf->{$ugrps_fa[$ntype]})) {
             $final_groups = array();
             foreach ($nConf->{$ugrps_fa[$ntype]} as $fagrpid) {
                 $curr_groups = FAccess::mgenfant($fagrpid);
                 $final_groups = array_unique(array_merge($final_groups, $curr_groups));
             }
             //print_r($final_groups); exit;
             // emails for flexiaccess user groups
             $query = "SELECT DISTINCT email FROM #__users as u" . " JOIN #__flexiaccess_groups ugm ON u.username=ugm.name AND ugm.type=2 AND ugm.id IN (" . implode(",", $final_groups) . ")";
             $db->setQuery($query);
             $user_emails_ugrps_fa_individual = FLEXI_J16GE ? $db->loadColumn() : $db->loadResultArray();
             if ($db->getErrorNum()) {
                 echo $db->getErrorMsg();
             }
             // emails for flexiaccess user groups
             $query = "SELECT DISTINCT email FROM #__users as u" . " JOIN #__flexiaccess_members ugm ON u.id=ugm.member_id AND ugm.group_id IN (" . implode(",", $final_groups) . ")";
             $db->setQuery($query);
             $user_emails_ugrps_fa_collective = FLEXI_J16GE ? $db->loadColumn() : $db->loadResultArray();
             if ($db->getErrorNum()) {
                 echo $db->getErrorMsg();
             }
             $user_emails_ugrps_fa = array_unique(array_merge($user_emails_ugrps_fa_individual, $user_emails_ugrps_fa_collective));
             // if ($ntype=='notify_new_pending') { print_r($user_emails_ugrps_fa); exit; }
         }
         // merge them
         $user_emails = array_unique(array_merge($user_emails_ulist, $user_emails_ugrps, $user_emails_ugrps_fa));
         $nConf_emails->{$ntype} = $user_emails;
     }
     $nConf->emails = $nConf_emails;
     //echo "<pre>"; print_r($nConf); exit;
     return $nConf;
 }