function status($action, $result, $values = FALSE)
{
    if ($action == 'RENT') {
        if ($result == OK) {
            $message = '<h3>' . _('Bike') . ' ' . $values->bikenum . ': <span class="label label-primary">' . _('Open with code') . ' ' . $values->bike->currentcode . '.</span></h3>' . _('Change code immediately to') . ' <span class="label label-default">' . $values->newcode . '</span><br />' . _('(open, rotate metal part, set new code, rotate metal part back)') . '.';
            if (isset($values->note)) {
                $message .= "<br />" . _('Reported issue:') . " <em>" . $values->note . "</em>";
            }
            response($message);
        } elseif ($result == 100) {
            response(_('You can not rent any bikes. Contact the admins to lift the ban.'), ERROR);
        } elseif ($result == 101) {
            response(_('You can only rent') . " " . sprintf(ngettext('%d bike', '%d bikes', $values->userlimit), $values->userlimit) . " " . _('at once') . ".", ERROR);
        } elseif ($result == 102) {
            response(_('You can only rent') . " " . sprintf(ngettext('%d bike', '%d bikes', $values->userlimit), $values->userlimit) . " " . _('at once and you have already rented') . " " . $values->userlimit . ".", ERROR);
        } elseif ($result == 110) {
            response(_('Bike') . " " . $values->bikenum . " " . _('is not rentable now, you have to rent bike') . " " . $values->stacktopbike . " " . _('from this stand') . ".", ERROR);
        } elseif ($result == 120) {
            response(_('You have already rented the bike') . ' ' . $values->bikenum . '. ' . _('Code is') . ' <span class="label label-primary">' . $values->currentcode . '</span>. ' . _('Return bike by scanning QR code on a stand') . '.', ERROR);
        } elseif ($result == 121) {
            response(_('Bike') . " " . $values->bikenum . " " . _('is already rented by someone else') . ".", ERROR);
        } elseif ($result == 130) {
            response(_('You are below required credit') . " " . $values->requiredcredit . getcreditcurrency() . ". " . _('Please, recharge your credit.'), ERROR);
        }
    } elseif ($action == 'RETURN') {
        if ($result == OK) {
            $message = '<h3>' . _('Bike') . ' ' . $values->bikenum . ': <span class="label label-primary">' . _('Lock with code') . ' ' . $values->currentcode . '.</span></h3>';
            $message .= '<br />' . _('Please') . ', <strong>' . _('rotate the lockpad to') . ' <span class="label label-default">0000</span></strong> ' . _('when leaving') . '.';
            if (iscreditenabled() and isset($values->creditchange)) {
                $message .= '<br />' . _('Credit change') . ': -' . $values->creditchange . getcreditcurrency() . '.';
            }
            response($message);
        } elseif ($result == 100) {
            response(_('You have no rented bikes currently.'), ERROR);
        } elseif ($result == 101) {
            $message = _('You have') . ' ' . $values->countrented . ' ' . _('rented bikes currently. QR code return can be used only when 1 bike is rented. Please, use web');
            if ($connectors["sms"]) {
                $message .= _(' or SMS');
            }
            $message .= _(' to return the bikes.');
            response($message, ERROR);
        }
    }
    response('Unhandled status ' . $result . ' in ' . $action . ' in file ' . __FILE__ . '.', ERROR);
}
function returnbike($userId, $stand)
{
    global $db, $connectors;
    $stand = strtoupper($stand);
    $result = $db->query("SELECT bikeNum FROM bikes WHERE currentUser={$userId} ORDER BY bikeNum");
    $bikenumber = $result->num_rows;
    if ($bikenumber == 0) {
        response(_('You have no rented bikes currently.'), ERROR);
    } elseif ($bikenumber > 1) {
        $message = _('You have') . ' ' . $bikenumber . ' ' . _('rented bikes currently. QR code return can be used only when 1 bike is rented. Please, use web');
        if ($connectors["sms"]) {
            $message .= _(' or SMS');
        }
        $message .= _(' to return the bikes.');
        response($message, ERROR);
    } else {
        $result = $db->query("SELECT bikeNum,currentCode FROM bikes WHERE currentUser={$userId}");
        $row = $result->fetch_assoc();
        $currentCode = sprintf("%04d", $row["currentCode"]);
        $bikeNum = $row["bikeNum"];
        $result = $db->query("SELECT standId FROM stands where standName='{$stand}'");
        $row = $result->fetch_assoc();
        $standId = $row["standId"];
        $result = $db->query("UPDATE bikes SET currentUser=NULL,currentStand={$standId} WHERE bikeNum={$bikeNum} and currentUser={$userId}");
        $message = '<h3>' . _('Bike') . ' ' . $bikeNum . ': <span class="label label-primary">' . _('Lock with code') . ' ' . $currentCode . '.</span></h3>';
        $message .= '<br />' . _('Please') . ', <strong>' . _('rotate the lockpad to') . ' <span class="label label-default">0000</span></strong> ' . _('when leaving') . '.';
        $creditchange = changecreditendrental($bikeNum, $userId);
        if (iscreditenabled() and $creditchange) {
            $message .= '<br />' . _('Credit change') . ': -' . $creditchange . getcreditcurrency() . '.';
        }
        $result = $db->query("INSERT INTO history SET userId={$userId},bikeNum={$bikeNum},action='RETURN',parameter={$standId}");
        response($message);
    }
}
require "actions-sms.php";
log_sms($sms->UUID(), $sms->Number(), $sms->Time(), $sms->Text(), $sms->IPAddress());
$args = preg_split("/\\s+/", $sms->ProcessedText());
//preg_split must be used instead of explode because of multiple spaces
/**
TODO validation of bike / stand for commands
*/
if (!validateNumber($sms->Number())) {
    sendSMS($sms->Number(), _('Your number is not registered.'));
} else {
    switch ($args[0]) {
        case "HELP":
            help($sms->Number());
            break;
        case "CREDIT":
            if (iscreditenabled() == FALSE) {
                unknownCommand($sms->Number(), $args[0]);
                break;
            }
            credit($sms->Number());
            break;
        case "FREE":
            freeBikes($sms->Number());
            break;
        case "RENT":
            validateReceivedSMS($sms->Number(), count($args), 2, _('with bike number:') . " RENT 47");
            rentbike($sms->Number(), $args[1]);
            //intval
            break;
        case "RETURN":
            validateReceivedSMS($sms->Number(), count($args), 3, _('with bike number and stand name:') . " RETURN 47 RACKO");
function help($number)
{
    global $db;
    $userid = getUser($number);
    $privileges = getprivileges($userid);
    if ($privileges > 0) {
        $message = "Commands:\nHELP\n";
        if (iscreditenabled()) {
            $message .= "CREDIT\n";
        }
        $message .= "FREE\nRENT bikenumber\nRETURN bikeno stand\nWHERE bikeno\nINFO stand\nNOTE bikeno problem\n---\nFORCERENT bikenumber\nFORCERETURN bikeno stand\nLIST stand\nLAST bikeno\nREVERT bikeno\nADD email phone fullname\nDELNOTE bikeno [pattern]\nTAG stand note for all bikes\nUNTAG stand [pattern]";
        sendSMS($number, $message);
    } else {
        $message = "Commands:\nHELP\n";
        if (iscreditenabled()) {
            $message .= "CREDIT\n";
        }
        $message .= "FREE\nRENT bikeno\nRETURN bikeno stand\nWHERE bikeno\nINFO stand\nNOTE bikeno problem description\nNOTE stand problem description";
        sendSMS($number, $message);
    }
}
function getcreditcurrency()
{
    global $credit;
    if (iscreditenabled() == FALSE) {
        return;
    }
    // if credit system disabled, exit
    return $credit["currency"];
}
function validatecoupon($userid, $coupon)
{
    global $db, $credit;
    if (iscreditenabled() == FALSE) {
        return;
    }
    // if credit system disabled, exit
    $result = $db->query("SELECT coupon,value FROM coupons WHERE coupon='" . $coupon . "' AND status<'2'");
    if ($result->num_rows == 1) {
        $row = $result->fetch_assoc();
        $value = $row["value"];
        $result = $db->query("UPDATE credit SET credit=credit+'" . $value . "' WHERE userId='" . $userid . "'");
        $result = $db->query("INSERT INTO history SET userId={$userid},action='CREDITCHANGE',parameter='" . $value . "|add+" . $value . "|" . $coupon . "'");
        $result = $db->query("UPDATE coupons SET status='2' WHERE coupon='" . $coupon . "'");
        response('+' . $value . ' ' . $credit["currency"] . '. ' . _('Coupon') . ' ' . $coupon . ' ' . _('has been redeemed') . '.');
    }
    response(_('Invalid coupon, try again.'), 1);
}
      </div>

    </div>
    <div role="tabpanel" class="tab-pane" id="stands">
      <div class="row">
         <div class="col-lg-12">
         <!-- button type="button" id="stands" class="btn btn-default" title="Show stand situation."><span class="glyphicon glyphicon-map-marker"></span> <?php 
    echo _('Stand situation');
    ?>
</button -->
         <div id="standsconsole"></div>
         </div>
      </div>
    </div>
<?php 
    if (iscreditenabled()) {
        ?>
    <div role="tabpanel" class="tab-pane" id="credit">
      <div class="row">
         <div class="col-lg-12">
         <button type="button" id="listcoupons" class="btn btn-default" title="<?php 
        echo _('Display existing coupons.');
        ?>
"><span class="glyphicon glyphicon-list-alt"></span> <?php 
        echo _('List coupons');
        ?>
</button>
         <button type="button" id="generatecoupons1" class="btn btn-success" title="<?php 
        echo _('Generate new coupons.');
        ?>
"><span class="glyphicon glyphicon-plus"></span> <?php 
function returnBike($number, $bike, $stand, $message = "", $force = FALSE)
{
    global $db;
    $userId = getUser($number);
    $bikeNum = intval($bike);
    $stand = strtoupper($stand);
    $result = $db->query("SELECT standId FROM stands WHERE standName='{$stand}'");
    if (!$result->num_rows) {
        sendSMS($number, _('Stand name') . " '" . $stand . "' " . _('does not exist. Stands are marked by CAPITALLETTERS.'));
        return;
    }
    $row = $result->fetch_assoc();
    $standId = $row["standId"];
    if ($force == FALSE) {
        $result = $db->query("SELECT bikeNum FROM bikes WHERE currentUser={$userId} ORDER BY bikeNum");
        $bikenumber = $result->num_rows;
        if ($bikenumber == 0) {
            sendSMS($number, _('You have no rented bikes currently.'));
            return;
        }
        $listBikes = "";
        while ($row = $result->fetch_assoc()) {
            $listBikes .= $row["bikeNum"] . ",";
        }
        if ($bikenumber > 1) {
            $listBikes = substr($listBikes, 0, strlen($listBikes) - 1);
        }
    }
    if ($force == FALSE) {
        $result = $db->query("SELECT currentCode FROM bikes WHERE currentUser={$userId} AND bikeNum={$bikeNum}");
        if ($result->num_rows != 1) {
            sendSMS($number, _('You does not have bike') . " " . $bikeNum . " rented. " . _('You have rented the following') . " " . sprintf(ngettext('%d bike', '%d bikes', $bikenumber), $bikenumber) . ": {$listBikes}");
            return;
        }
        $row = $result->fetch_assoc();
        $currentCode = sprintf("%04d", $row["currentCode"]);
        $result = $db->query("SELECT note FROM notes WHERE bikeNum={$bikeNum} AND deleted IS NULL ORDER BY time DESC LIMIT 1");
        $row = $result->fetch_assoc();
        $note = $row["note"];
    } else {
        $result = $db->query("SELECT currentCode,currentUser FROM bikes WHERE bikeNum={$bikeNum}");
        if ($result->num_rows != 1) {
            sendSMS($number, _('Bike') . " " . $bikeNum . " " . _('is not rented. Saint Thomas, the patronus of all unrented bikes, prohibited returning unrented bikes.'));
            return;
        }
        $row = $result->fetch_assoc();
        $currentCode = sprintf("%04d", $row["currentCode"]);
        $currentUser = $row["currentUser"];
        $result = $db->query("SELECT note FROM notes WHERE bikeNum={$bikeNum} AND deleted IS NULL ORDER BY time DESC LIMIT 1");
        $row = $result->fetch_assoc();
        $note = $row["note"];
        if ($currentUser) {
            $result = $db->query("SELECT number FROM users WHERE userId={$currentUser}");
            $row = $result->fetch_assoc();
            $currentUserNumber = $row["number"];
        }
    }
    if (!preg_match("/return[\\s,\\.]+[0-9]+[\\s,\\.]+[a-zA-Z0-9]+[\\s,\\.]+(.*)/i", $message, $matches)) {
        $userNote = "";
    } else {
        $userNote = $db->conn->real_escape_string(trim($matches[1]));
    }
    $result = $db->query("UPDATE bikes SET currentUser=NULL,currentStand={$standId} WHERE bikeNum={$bikeNum}");
    if ($userNote) {
        $db->query("INSERT INTO notes SET bikeNum={$bikeNum},userId={$userId},note='{$userNote}'");
        $result = $db->query("SELECT userName,number FROM users WHERE userId='{$userId}'");
        $row = $result->fetch_assoc();
        $userName = $row["userName"];
        $phone = $row["number"];
        $result = $db->query("SELECT stands.standName FROM bikes LEFT JOIN users ON bikes.currentUser=users.userID LEFT JOIN stands ON bikes.currentStand=stands.standId WHERE bikeNum={$bikeNum}");
        $row = $result->fetch_assoc();
        $standName = $row["standName"];
        if ($standName != NULL) {
            $bikeStatus = _('at') . " " . $standName;
        } else {
            $bikeStatus = _('used by') . " " . $userName . " +" . $phone;
        }
        notifyAdmins(_('Note') . " b.{$bikeNum} (" . $bikeStatus . ") " . _('by') . " {$userName}/{$phone}:" . $userNote);
    }
    $message = _('Bike') . " " . $bikeNum . " " . _('returned to stand') . " " . $stand . ". " . _('Make sure you set code to') . " " . $currentCode . ".";
    if ($note or $userNote) {
        $tempnote = $note;
        if ($userNote) {
            $tempnote = $userNote;
        }
        if ($tempnote) {
            $message .= "(note:" . $tempnote . ")";
        }
    }
    $message .= " " . _('Rotate lockpad to 0000.');
    if ($force == FALSE) {
        $creditchange = changecreditendrental($bikeNum, $userId);
        $result = $db->query("INSERT INTO history SET userId={$userId},bikeNum={$bikeNum},action='RETURN',parameter={$standId}");
    } else {
        $result = $db->query("INSERT INTO history SET userId={$userId},bikeNum={$bikeNum},action='FORCERETURN',parameter={$standId}");
        if ($currentUserNumber) {
            sendSMS($currentUserNumber, _('System override') . ": " . _('Your rented bike') . " " . $bikeNum . " " . _('has been returned by admin') . ".");
        }
    }
    if (iscreditenabled()) {
        $message .= _('Credit') . ": " . getusercredit($userId) . getcreditcurrency();
        if ($creditchange) {
            $message .= " (-" . $creditchange . ")";
        }
        $message .= ".";
    }
    sendSMS($number, $message);
}