/**
 * Set a membership for a member
 *
 * @param int $memberID			- member that is going to get the membership
 * @param int $membershipID		- membership that is going to be assigned to the member
 * 								  if $membershipID == MEMBERSHIP_ID_STANDARD then $days
 *								  and $startsNow parameters are not used, so Standard
 *								  membership is always set immediately and `forever`
 *
 * @param int $days				- number of days to set membership for
 *								  if 0, then the membership is set forever
 *
 * @param boolean $startsNow	- if true, the membership will start immediately;
 *								  if false, the membership will start after the current
 *								  membership expires
 *
 * @return boolean				- true in case of success, false in case of failure
 *
 *
 */
function setMembership($memberID, $membershipID, $days = 0, $startsNow = false, $transactionID = 0)
{
    $memberID = (int) $memberID;
    $membershipID = (int) $membershipID;
    $days = (int) $days;
    $startsNow = $startsNow ? true : false;
    $SECONDS_IN_DAY = 86400;
    $transactionID = (int) $transactionID;
    if ($transactionID <= 0) {
        $transactionID = 'NULL';
    }
    //check if member exists
    $res = db_res("SELECT COUNT(ID) FROM Profiles WHERE ID = {$memberID}");
    $res = mysql_fetch_row($res);
    if ($res[0] != 1) {
        return false;
    }
    //check if membership exists
    $res = db_res("SELECT COUNT(ID) FROM MemLevels WHERE ID = {$membershipID}");
    $res = mysql_fetch_row($res);
    if ($res[0] != 1) {
        return false;
    }
    if ($membershipID == MEMBERSHIP_ID_NON_MEMBER) {
        return false;
    }
    $currentMembership = getMemberMembershipInfo($memberID);
    $latestMembership = getMemberMembershipInfo_latest($memberID);
    if ($membershipID == MEMBERSHIP_ID_STANDARD) {
        //return if already Standard
        if ($currentMembership['ID'] == MEMBERSHIP_ID_STANDARD) {
            return true;
        }
        //delete any present and future memberships
        db_res("\r\n\t\t\tDELETE\tFROM ProfileMemLevels\r\n\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\tAND\t(DateExpires IS NULL OR DateExpires > NOW())");
        if (mysql_affected_rows() > 0) {
            return true;
        } else {
            return false;
        }
    }
    if ($days < 0) {
        return false;
    }
    $dateStarts = time();
    if (!$startsNow) {
        //make the membership start after the current membership expires
        if (!is_null($latestMembership['DateExpires'])) {
            $dateStarts = $latestMembership['DateExpires'];
            // if membership already exists then it's unlimited - just shift or delete it
            $res = db_res("\r\n\t\t\t\tSELECT\tIDMember\r\n\t\t\t\tFROM\tProfileMemLevels\r\n\t\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\t\tAND UNIX_TIMESTAMP(DateStarts) = {$dateStarts}\r\n\t\t\t\t\t\tAND IDLevel = {$membershipID}");
            $res = mysql_fetch_row($res);
            if ($res[0]) {
                if ($days == 0) {
                    db_res("DELETE\tFROM ProfileMemLevels\r\n\t\t\t\t\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\t\t\t\t\tAND UNIX_TIMESTAMP(DateStarts) = {$dateStarts}\r\n\t\t\t\t\t\t\t\t\tAND IDLevel = {$membershipID}");
                } else {
                    db_res("UPDATE\tProfileMemLevels\r\n\t\t\t\t\t\t\tSET\t\tDateStarts = FROM_UNIXTIME(" . ((int) $dateStarts + $days * $SECONDS_IN_DAY) . ")\r\n\t\t\t\t\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\t\t\t\t\tAND UNIX_TIMESTAMP(DateStarts) = {$dateStarts}\r\n\t\t\t\t\t\t\t\t\tAND IDLevel = {$membershipID}");
                }
            }
        }
    }
    if ($days == 0) {
        //if days==0 then set the membership forever
        $dateExpires = 'NULL';
    } else {
        $dateExpires = (int) $dateStarts + $days * $SECONDS_IN_DAY;
    }
    //insert corresponding record into ProfileMemLevels
    db_res("\r\n\t\tINSERT ProfileMemLevels (IDMember, IDLevel, DateStarts, DateExpires, TransactionID)\r\n\t\tVALUES ({$memberID}, {$membershipID}, FROM_UNIXTIME({$dateStarts}), FROM_UNIXTIME({$dateExpires}), {$transactionID})");
    if (mysql_affected_rows() <= 0) {
        return false;
    }
    return true;
}
/**
 * Set a membership for a member
 *
 * @param int     $iMemberId        - member that is going to get the membership
 * @param int     $iMembershipId    - membership that is going to be assigned to the member
 *                                  if $iMembershipId == MEMBERSHIP_ID_STANDARD then $days
 *                                  and $bStartsNow parameters are not used, so Standard
 *                                  membership is always set immediately and `forever`
 *
 * @param int     $days             - number of days to set membership for
 *                                  if 0, then the membership is set forever
 *
 * @param boolean $bStartsNow       - if true, the membership will start immediately;
 *                                  if false, the membership will start after the current
 *                                  membership expires
 *
 * @return boolean                - true in case of success, false in case of failure
 *
 *
 */
function setMembership($iMemberId, $iMembershipId, $iDays = 0, $bStartsNow = false, $sTransactionId = '', $isSendMail = true)
{
    $iMemberId = (int) $iMemberId;
    $iMembershipId = (int) $iMembershipId;
    $iDays = (int) $iDays;
    $bStartsNow = $bStartsNow ? true : false;
    $SECONDS_IN_DAY = 86400;
    if (!$iMemberId) {
        $iMemberId = -1;
    }
    if (empty($sTransactionId)) {
        $sTransactionId = 'NULL';
    }
    //check if member exists
    $aProfileInfo = getProfileInfo($iMemberId);
    if (!$aProfileInfo) {
        return false;
    }
    //check if membership exists
    $iRes = (int) db_value("SELECT COUNT(`ID`) FROM `sys_acl_levels` WHERE `ID`='" . $iMembershipId . "' LIMIT 1");
    if ($iRes != 1) {
        return false;
    }
    if ($iMembershipId == MEMBERSHIP_ID_NON_MEMBER) {
        return false;
    }
    $aMembershipCurrent = getMemberMembershipInfo($iMemberId);
    $aMembershipLatest = getMemberMembershipInfo_latest($iMemberId);
    /**
     * Setting Standard membership level
     */
    if ($iMembershipId == MEMBERSHIP_ID_STANDARD) {
        if ($aMembershipCurrent['ID'] == MEMBERSHIP_ID_STANDARD) {
            return true;
        }
        //delete any present and future memberships
        $res = db_res("DELETE FROM `sys_acl_levels_members` WHERE `IDMember`='" . $iMemberId . "' AND (`DateExpires` IS NULL OR `DateExpires`>NOW())");
        if (db_affected_rows($res) <= 0) {
            return false;
        }
    }
    if ($iDays < 0) {
        return false;
    }
    $iDateStarts = time();
    if (!$bStartsNow) {
        /**
         * make the membership starts after the latest membership expires
         * or return false if latest membership isn't Standard and is lifetime membership
         */
        if (!is_null($aMembershipLatest['DateExpires'])) {
            $iDateStarts = $aMembershipLatest['DateExpires'];
        } else {
            if (is_null($aMembershipLatest['DateExpires']) && $aMembershipLatest['ID'] != MEMBERSHIP_ID_STANDARD) {
                return false;
            }
        }
    } else {
        // delete previous profile's membership level and actions traces
        db_res("DELETE FROM `sys_acl_levels_members` WHERE `IDMember`='" . $iMemberId . "'");
        clearActionsTracksForMember($iMemberId);
    }
    /**
     * set lifetime membership if 0 days is used.
     */
    $iDateExpires = $iDays != 0 ? (int) $iDateStarts + $iDays * $SECONDS_IN_DAY : 'NULL';
    $res = db_res("INSERT `sys_acl_levels_members` (`IDMember`, `IDLevel`, `DateStarts`, `DateExpires`, `TransactionID`) VALUES ('" . $iMemberId . "', '" . $iMembershipId . "', FROM_UNIXTIME(" . $iDateStarts . "), FROM_UNIXTIME(" . $iDateExpires . "), '" . $sTransactionId . "')");
    if (db_affected_rows($res) <= 0) {
        return false;
    }
    //Set Membership Alert
    bx_import('BxDolAlerts');
    $oZ = new BxDolAlerts('profile', 'set_membership', '', $iMemberId, array('mlevel' => $iMembershipId, 'days' => $iDays, 'starts_now' => $bStartsNow, 'txn_id' => $sTransactionId));
    $oZ->alert();
    //Notify user about changed membership level
    bx_import('BxDolEmailTemplates');
    $oEmailTemplate = new BxDolEmailTemplates();
    $aTemplate = $oEmailTemplate->getTemplate('t_MemChanged', $iMemberId);
    $aMembershipInfo = getMembershipInfo($iMembershipId);
    $aTemplateVars = array('MembershipLevel' => $aMembershipInfo['Name']);
    if ($isSendMail) {
        sendMail($aProfileInfo['Email'], $aTemplate['Subject'], $aTemplate['Body'], $iMemberId, $aTemplateVars);
    }
    //Notify admin about changed user's membership level
    $aTemplate = $oEmailTemplate->parseTemplate('t_UserMemChanged', $aTemplateVars, $iMemberId);
    sendMail($GLOBALS['site']['email'], $aTemplate['Subject'], $aTemplate['Body']);
    return true;
}
/**
 * Set a membership for a member
 *
 * @param int $memberID			- member that is going to get the membership
 * @param int $membershipID		- membership that is going to be assigned to the member
 * 								  if $membershipID == MEMBERSHIP_ID_STANDARD then $days
 *								  and $startsNow parameters are not used, so Standard
 *								  membership is always set immediately and `forever`
 *
 * @param int $days				- number of days to set membership for
 *								  if 0, then the membership is set forever
 *
 * @param boolean $startsNow	- if true, the membership will start immediately;
 *								  if false, the membership will start after the current
 *								  membership expires
 *
 * @return boolean				- true in case of success, false in case of failure
 *
 *
 */
function setMembership($memberID, $membershipID, $days = 0, $startsNow = false, $transactionID = '')
{
    $memberID = (int) $memberID;
    $membershipID = (int) $membershipID;
    $days = (int) $days;
    $startsNow = $startsNow ? true : false;
    $SECONDS_IN_DAY = 86400;
    if (!$memberID) {
        $memberID = -1;
    }
    if (empty($transactionID)) {
        $transactionID = 'NULL';
    }
    //check if member exists
    $aProfileInfo = getProfileInfo($memberID);
    if (!$aProfileInfo) {
        return false;
    }
    //check if membership exists
    $res = db_res("SELECT COUNT(ID) FROM `sys_acl_levels` WHERE ID = {$membershipID}");
    $res = mysql_fetch_row($res);
    if ($res[0] != 1) {
        return false;
    }
    if ($membershipID == MEMBERSHIP_ID_NON_MEMBER) {
        return false;
    }
    $currentMembership = getMemberMembershipInfo($memberID);
    $latestMembership = getMemberMembershipInfo_latest($memberID);
    if ($membershipID == MEMBERSHIP_ID_STANDARD) {
        //return if already Standard
        if ($currentMembership['ID'] == MEMBERSHIP_ID_STANDARD) {
            return true;
        }
        //delete any present and future memberships
        db_res("\r\n\t\t\tDELETE\tFROM `sys_acl_levels_members`\r\n\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\tAND\t(DateExpires IS NULL OR DateExpires > NOW())");
        if (db_affected_rows() > 0) {
            return true;
        } else {
            return false;
        }
    }
    if ($days < 0) {
        return false;
    }
    $dateStarts = time();
    if (!$startsNow) {
        //make the membership start after the current membership expires
        if (!is_null($latestMembership['DateExpires'])) {
            $dateStarts = $latestMembership['DateExpires'];
            // if membership already exists then it's unlimited - just shift or delete it
            $res = db_res("\r\n\t\t\t\tSELECT\tIDMember\r\n\t\t\t\tFROM\t`sys_acl_levels_members`\r\n\t\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\t\tAND UNIX_TIMESTAMP(DateStarts) = {$dateStarts}\r\n\t\t\t\t\t\tAND IDLevel = {$membershipID}");
            $res = mysql_fetch_row($res);
            if ($res[0]) {
                if ($days == 0) {
                    db_res("DELETE\tFROM `sys_acl_levels_members`\r\n\t\t\t\t\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\t\t\t\t\tAND UNIX_TIMESTAMP(DateStarts) = {$dateStarts}\r\n\t\t\t\t\t\t\t\t\tAND IDLevel = {$membershipID}");
                } else {
                    db_res("UPDATE\t`sys_acl_levels_members`\r\n\t\t\t\t\t\t\tSET\t\tDateStarts = FROM_UNIXTIME(" . ((int) $dateStarts + $days * $SECONDS_IN_DAY) . ")\r\n\t\t\t\t\t\t\tWHERE\tIDMember = {$memberID}\r\n\t\t\t\t\t\t\t\t\tAND UNIX_TIMESTAMP(DateStarts) = {$dateStarts}\r\n\t\t\t\t\t\t\t\t\tAND IDLevel = {$membershipID}");
                }
            }
        }
    } else {
        //delete previous profile's membership level
        db_res("DELETE FROM `sys_acl_levels_members` WHERE `IDMember` = {$memberID}");
    }
    if ($days == 0) {
        //if days==0 then set the membership forever
        $dateExpires = 'NULL';
    } else {
        $dateExpires = (int) $dateStarts + $days * $SECONDS_IN_DAY;
    }
    //insert corresponding record into sys_acl_levels_members
    db_res("\r\n\t\tINSERT `sys_acl_levels_members` (IDMember, IDLevel, DateStarts, DateExpires, TransactionID)\r\n\t\tVALUES ({$memberID}, {$membershipID}, FROM_UNIXTIME({$dateStarts}), FROM_UNIXTIME({$dateExpires}), '{$transactionID}')");
    if (db_affected_rows() <= 0) {
        return false;
    }
    //Set Membership Alert
    bx_import('BxDolAlerts');
    $oZ = new BxDolAlerts('profile', 'set_membership', '', $memberID, array('mlevel' => $membershipID, 'days' => $days, 'starts_now' => $startsNow, 'txn_id' => $transactionID));
    $oZ->alert();
    return true;
}