Subversion Repositories cheapmusic

Rev

Rev 8 | Rev 10 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
include_once('php/exchangeRates.php');
include_once('php/countryCodes.php');
include_once('php/constants.php');
include_once('php/ebay.php');

  // search
function performSearch() {
        $_SESSION["currentView"] = 'All';
        $_SESSION["barcode"]["Type"] = clsLibGTIN::GTINCheck($_SESSION["searchTerm"], false, 1);
        $_SESSION["barcode"]["Value"] = clsLibGTIN::GTINCheck($_SESSION["searchTerm"]);

        $_SESSION["resultArr"] = [];
        $_SESSION["resultArr"] = searchAll($_SESSION["searchTerm"]);

        $_SESSION["lowestPrice"]["Used"] = findLowest("Used");
        $_SESSION["lowestPrice"]["New"] = findLowest("New");
        $_SESSION["lowestPrice"]["Digital"] = findLowest("Digital");
        $_SESSION["lowestPrice"]["All"] = 0.00;
        if (array_sum($_SESSION["lowestPrice"]) > 0) {
                $_SESSION["lowestPrice"]["All"] = minNotNull($_SESSION["lowestPrice"]);
        }
        
        saveSearchResult();
}

function resetSessionVars() {
    $_SESSION["searchTerm"] = '';
        $_SESSION["currentView"] = 'All';
        $_SESSION["barcode"]["Type"] = '';
        $_SESSION["barcode"]["Value"] = '';

        $_SESSION["resultArr"] = [];

        $_SESSION["lowestPrice"]["Used"] = 0.00;
        $_SESSION["lowestPrice"]["New"] = 0.00;
        $_SESSION["lowestPrice"]["Digital"] = 0.00;
        $_SESSION["lowestPrice"]["All"] = 0.00;
}

  // search for items on all sites
function searchAll($searchKey)
{
        $arr = [];
        $newArr = [];
        if ($_SESSION["filterCondition"]["New"]) {
                $arr = get_ebay($searchKey, constant("NEW"));
        }
        if ($_SESSION["filterCondition"]["Used"]) {
                $newArr = get_ebay($searchKey, constant("USED"));
        }
        $arr = array_merge($arr, $newArr);

        $arr = applyExchangeRates($arr);
        usort($arr, 'compare_price');

        return $arr;
}

  // check search filters
function checkSearchFilters() {  
    $_SESSION["filterWarnings"] = "";
    $filterOk = true;

        if (!$_SESSION["filterCondition"]["New"] && !$_SESSION["filterCondition"]["Used"]) {
                $_SESSION["filterWarnings"] .= '<div class="alert alert-danger"><i class="fas fa-filter mr-1"></i> Please select at least one Condition (New or Used)</div>';
                $filterOk = false;
        }

        if (!$_SESSION["filterMediaType"]["CD"] && !$_SESSION["filterMediaType"]["Record"] && !$_SESSION["filterMediaType"]["Digital"]) {
                $_SESSION["filterWarnings"] .= '<div class="alert alert-danger"><i class="fas fa-filter mr-1"></i> Please select at least one Media Type (CD, Record or Digital)</div>';
                $filterOk = false;
        }
                
        return($filterOk);
}

  // filter results for types All, New, Used or Digital
function filterResults()
{
        foreach ($_SESSION["resultArr"] as &$value) {
                if ($_SESSION["currentView"] == 'All') {
                        $value["Show"] = true;
                } else {
                        $value["Show"] = ($_SESSION["currentView"] == $value["Type"]);
                }
        }
}
  
  // build HTML table from array
function buildTable()
{
        $str = "<div>";
        $str .= "<table class=\"table table-striped table-condensed small\">";
        $str .= "<thead class=\"thead-dark sticky-top\"><tr><th>Image</th><th class=\"text-left\">Title / Merchant</th><th>Condition</th><th class=\"hide-small\">Price</th><th class=\"hide-small\">S/H</th><th>Total</th><th class=\"hide-extra-small\"></th></tr></thead>";
        $str .= "<tbody>";

    if (count($_SESSION["resultArr"]) > 0) {
        foreach ($_SESSION["resultArr"] as $value) {
                if (!$value["Show"]) {
                        continue;
                }

                $url = base64_encode($value["URL"]);

                $str .= "<tr>";
            
            // Image
                $str .= "<td><a href=\"/redirect.php?target=" . $url . "\" target=\"_blank\"><img class=\"img-fluid\" src=\"" . $value["Image"] . "\" alt=\"Item Image\"></a></td>";

            // Title / Merchant
                $str .= "<td class=\"text-left\"><span class=\"font-weight-bold\"><a href=\"/redirect.php?target=" . $url . "\" target=\"_blank\">" . $value["Title"] . "</a></span><br/><br/>";
                $str .= "<span class=\"font-weight-bold\">" . $value["Merchant"] . "</span>";
                $str .= "<span class=\"hide-extra-small\"><br/>" . $value["SellerName"] . " (" . number_format($value["FeedbackScore"], 0, "", ",") . " / " . $value["FeedbackPercent"] . "%)</span></td>";

            // Condition
                $str .= "<td>";
                $categoryIcon = "";
                $categoryStyle = "";
                $tooltip = "";
                switch ($value["Category"]) {
                        case "CD":
                                $categoryIcon = "fas fa-compact-disc";
                                $categoryStyle = "color:silver;";
                                $tooltip = "Compact Disc";
                                break;

                        case "Record":
                                $categoryIcon = "fas fa-dot-circle";
                                $tooltip = "Vinyl Record";
                                break;

                        case "Digital":
                                $categoryIcon = "digital";
                                $tooltip = "Digital Download";
                                break;
                }
                $str .= "<span class=\"font-weight-bold\">" . $value["Condition"] . "</span>";
                $str .= "<br/><br/>";
                $str .= "<i class=\"" . $categoryIcon . "\" style=\"font-size:32px;text-shadow:2px 2px 4px #000000;" . $categoryStyle . "\" title=\"" . $tooltip . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\"></i>";
                $str .= "</td>";

            // Price
                $str .= "<td class=\"hide-small\">" . print_monetary($value["Price"], $value["Currency"]);
                if ($value["Currency"] != $_SESSION["buyer"]["Currency"]) {
                        $str .= "<br/>&asymp; " . print_monetary($value["ConvertedPrice"], $_SESSION["buyer"]["Currency"]);
                }
                $str .= "</td>";

            // Shipping and Handling Cost
                $str .= "<td class=\"hide-small\">";
                if ($value["ShippingCost"] == 0.00) {
                        $str .= "Free Shipping";
                } else {
                        $str .= print_monetary($value["ShippingCost"], $value["ShippingCurrency"]);
                }
                if ($value["ShippingCost"] > 0.00 && $value["ShippingCurrency"] != $_SESSION["buyer"]["Currency"]) {
                        $str .= "<br/>&asymp; " . print_monetary($value["ConvertedShippingCost"], $_SESSION["buyer"]["Currency"]);
                }
                $str .= "<br/><img class=\"img-fluid\" title=\"Ships from " . getCountry($value["Country"]) . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\" src=\"/images/flags/" . $value["Country"] . ".png\" alt=\"" . getCountry($value["Country"]) . " Flag\"></td>";

            // Total Price
                $str .= "<td class=\"font-weight-bolder\">" . print_monetary($value["ConvertedTotalPrice"], $_SESSION["buyer"]["Currency"]) . "</td>";

            // Link
                $str .= "<td class=\"hide-extra-small\"><a class=\"btn btn-danger\" role=\"button\" href=\"/redirect.php?target=" . $url . "\" target=\"_blank\"><i class=\"fas fa-shopping-cart\" style=\"font-size:20px\"></i><span class=\"hide-small\"><br>Buy It Now</span></a></td>";

                $str .= "</tr>";
        }
    } else {
        $str .= "<tr class=\"text-center bg-warning\"><td colspan=\"7\"><span class=\"display-5\">No items found.<br>Try again with less keywords.</span></td></tr>";
    }

        $str .= "</tbody>";
        $str .= "<tfoot class=\"text-right\"><tr><td colspan=\"7\">Prices retrieved on " . gmdate("Y-m-d H:i") . " UTC<br>Daily exchange rates update</td></tr></tfoot>";
        $str .= "</table>";
        $str .= "</div>";

        return ($str);
}

  // print summary/header on top of listing table
function printTableHeader()
{
    global $handler;
    
        $str = '<form method="post" action="/index.php">';
    $str .= '<input type="hidden" name="sessionTab" value="' . $handler->getSessionTab() . '">';
    $str .= '<div class="d-flex flex-wrap justify-content-center p-2">';
        $str .= '    <button name="submit" value="All" type="' . getButtonType("All") . '" class="btn mx-2 ' . getBackgroundColor("All") . '"';
        if ($_SESSION["lowestPrice"]["All"] <= 0) {
                $str .= ' disabled';
        }
        $str .= '><span class="display-5 font-weight-bolder">All</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["All"], $_SESSION["buyer"]["Currency"]) . '</span>';
        $str .= '    </button>';
        $str .= '    <button name="submit" value="New" type="' . getButtonType("New") . '" class="btn mx-2 ' . getBackgroundColor("New") . '"';
        if ($_SESSION["lowestPrice"]["New"] <= 0) {
                $str .= ' disabled';
        }
        $str .= '><span class="display-5 font-weight-bolder">New</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["New"], $_SESSION["buyer"]["Currency"]) . '</span>';
        $str .= '    </button>';
        $str .= '    <button name="submit" value="Used" type="' . getButtonType("Used") . '" class="btn mx-2 ' . getBackgroundColor("Used") . '"';
        if ($_SESSION["lowestPrice"]["Used"] <= 0) {
                $str .= ' disabled';
        }
        $str .= '><span class="display-5 font-weight-bolder">Used</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["Used"], $_SESSION["buyer"]["Currency"]) . '</span>';
        $str .= '    </button>';
        /*
    $str .= '    <button name="submit" value="Digital" type="' . getButtonType("Digital") . '" class="btn mx-2 ' . getBackgroundColor("Digital"). '"';
    if ($_SESSION["lowestPrice"]["Digital"] <= 0) {
        $str .= ' disabled';
    } 
    $str .= '><span class="display-5 font-weight-bolder">Digital</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["Digital"], $_SESSION["buyer"]["Currency"]) . '</span>';
    $str .= '    </button>';
*/
                                        $str .= '</div>';
        $str .= '</form>';

        return $str;
}

  // get top button background color
function getBackgroundColor($sel)
{
        if ($_SESSION["currentView"] == $sel) {
                return ("btn-primary active");
        }

        return ("btn-primary text-dark");
}  

  // get top button type
function getButtonType($sel)
{
        if ($_SESSION["currentView"] == $sel) {
                return ("button");
        }

        return ("submit");
}  

  // compare price for sort low to high
function compare_price($a, $b)
{
        return strnatcmp($a['ConvertedTotalPrice'], $b['ConvertedTotalPrice']);
}
  
  // print monetary values with correct symbol and thousands/decimal delimiters
function print_monetary($num, $curr)
{
        if ($curr == "USD") {
                return ("$" . number_format($num, 2, '.', ','));
        } else if ($curr == "CAD") {
                return ("C $" . number_format($num, 2, '.', ','));
        } else if ($curr == "EUR") {
                return (number_format($num, 2, ',', '.') . "&euro;");
        } else if ($curr == "GBP") {
                return ("&pound;" . number_format($num, 2, '.', ','));
        } else if ($curr == "AUD") {
                return ("AU $" . number_format($num, 2, '.', ','));
        }

        return ($curr . " " . number_format($num, 2, '.', ','));
}

  // find lowest used / new prices and return their array index
function findLowest($type)
{
        foreach ($_SESSION["resultArr"] as $value) {
                if (!$value["Show"]) {
                        continue;
                }

                if ($type == $value["Type"]) {
                        return ($value["ConvertedTotalPrice"]);
                }
        }

        return (0);
}

  // find lowest non-zero double value in array
function minNotNull(Array $values)
{
        return min(array_diff(array_map('doubleval', $values), array(0)));
}  
  // apply exchange rates
function applyExchangeRates($arr)
{
        foreach ($arr as &$value) {
                $value["ConvertedPrice"] = $value["Price"];
                $value["ConvertedShippingCost"] = $value["ShippingCost"];

                if ($_SESSION["buyer"]["Currency"] != $value["Currency"]) {
                        $value["ConvertedPrice"] = number_format($value["Price"] / getExchangeRate($_SESSION["buyer"]["Currency"], $value["Currency"]), 2, '.', '');
                }

                if ($_SESSION["buyer"]["Currency"] != $value["ShippingCurrency"]) {
                        $value["ConvertedShippingCost"] = number_format($value["ShippingCost"] / getExchangeRate($_SESSION["buyer"]["Currency"], $value["ShippingCurrency"]), 2, '.', '');
                }

                $value["ConvertedTotalPrice"] = number_format($value["ConvertedPrice"] + $value["ConvertedShippingCost"], 2, '.', '');
        }

        return ($arr);
}

  // sanitize user input
function sanitizeInput($data)
{
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return $data;
}

  // get a SESSION value, return empty string if not set
function getSV($var)
{
        if (!isset($_SESSION[$var])) {
                return ('');
        }

        return ($_SESSION[$var]);
}

  // initialize a SESSION value if not set
function initSV($var, $value)
{
        if (!isset($_SESSION[$var])) {
                $_SESSION[$var] = $value;
        }
}

  // initialize sessions variables
function initSessionVariables()
{
        initSV("resultArr", []);
        initSV("barcode", array("Type" => "", "Value" => ""));
        initSV("buyer", array("Country" => "United States", "Currency" => "USD", "Zip" => ""));
        initSV("filterCondition", array("New" => true, "Used" => true));
        initSV("filterMediaType", array("CD" => true, "Record" => false, "Digital" => false));
        initSV("currentView", "All");
        initSV("lowestPrice", array("Used" => 0.00, "New" => 0.00, "Digital" => 0.00, "All" => 0.00));
        initSV("filterWarnings", "");
}

  // check POST value, return true if set and false if not
function checkPV($var)
{
        if (isset($_POST[$var])) {
                return (true);
        }

        return (false);
}

// print search filter modal with current selection
function printSearchFilterModal()
{
    global $handler;
    
        $str = '';
        $str .= '<div class="modal fade" id="filterModal">';
        $str .= '    <div class="modal-dialog">';
        $str .= '        <div class="modal-content">';
        $str .= '';
        $str .= '            <div class="modal-header bg-primary">';
        $str .= '                <h4 class="modal-title">Search Filters</h4>';
        $str .= '            </div>';
        $str .= '';
        $str .= '            <form method="post" action="/index.php">';
    $str .= '                <input type="hidden" name="sessionTab" value="' . $handler->getSessionTab() . '">';
        $str .= '                <div class="modal-body">';
        $str .= '                    <div class="card-group">';
        $str .= '';
        $str .= '                        <div class="card m-2">';
        $str .= '                            <div class="card-header font-weight-bold">Condition</div>';
        $str .= '                            <div class="card-body">';
        $str .= '                                <div class="form-check">';
        $str .= '                                    <label class="form-check-label">';
        $str .= '                                        <input name="filterConditionNew" type="checkbox" class="form-check-input" value="New"' . ($_SESSION["filterCondition"]["New"] ? " checked" : "") . '>New';
        $str .= '                                    </label>';
        $str .= '                                </div>';
        $str .= '                                <div class="form-check">';
        $str .= '                                    <label class="form-check-label">';
        $str .= '                                        <input name="filterConditionUsed" type="checkbox" class="form-check-input" value="Used"' . ($_SESSION["filterCondition"]["Used"] ? " checked" : "") . '>Used';
        $str .= '                                    </label>';
        $str .= '                                </div>';
        $str .= '                            </div>';
        $str .= '                        </div>';
        $str .= '';
        $str .= '                        <div class="card m-2">';
        $str .= '                            <div class="card-header font-weight-bold">Media Type</div>';
        $str .= '                            <div class="card-body">';
        $str .= '                                <div class="form-check">';
        $str .= '                                    <label class="form-check-label">';
        $str .= '                                        <input name="filterMediaTypeCD" type="checkbox" class="form-check-input" value="CD"' . ($_SESSION["filterMediaType"]["CD"] ? " checked" : "") . '><i class="fas fa-compact-disc" style="color:silver;"></i> Compact Disc';
        $str .= '                                    </label>';
        $str .= '                                </div>';
        $str .= '                                <div class="form-check">';
        $str .= '                                    <label class="form-check-label">';
        $str .= '                                        <input name="filterMediaTypeRecord" type="checkbox" class="form-check-input" value="Record"' . ($_SESSION["filterMediaType"]["Record"] ? " checked" : "") . '><i class="fas fa-dot-circle"></i> Vinyl Record';
        $str .= '                                    </label>';
        $str .= '                                </div>';
        $str .= '                                <div class="form-check">';
        $str .= '                                    <label class="form-check-label">';
        $str .= '                                        <input name="filterMediaTypeDigital" type="checkbox" class="form-check-input" value="Digital"' . ($_SESSION["filterMediaType"]["Digital"] ? " checked" : "") . '><i class="fas fa-download"></i> Digital';
        $str .= '                                    </label>';
        $str .= '                                </div>';
        $str .= '                            </div>';
        $str .= '                        </div>';
        $str .= '                    </div>';
        $str .= '                </div>';
        $str .= '';
        $str .= '                <div class="modal-footer bg-primary">';
        $str .= '                    <button id="save" type="submit" class="btn btn-success" name="submit" value="Save">Save</button>';
        $str .= '                    <button id="discard" type="button" class="btn btn-danger" data-dismiss="modal">Discard</button>';
        $str .= '                </div>';
        $str .= '            </form>';
        $str .= '        </div>';
        $str .= '    </div>';
        $str .= '</div>';

        return ($str);
}

// print search info modal
function printSearchInfoModal()
{
        $str = '';
        $str .= '<div class="modal fade" id="searchInfoModal">';
        $str .= '    <div class="modal-dialog">';
        $str .= '        <div class="modal-content">';
        $str .= '';
        $str .= '            <div class="modal-header bg-primary">';
        $str .= '                <h4 class="modal-title">Search Tips</h4>';
        $str .= '                <button type="button" class="close" data-dismiss="modal"><i class="fas fa-window-close" style="font-size:24px"></i></button>';
        $str .= '            </div>';
        $str .= '';
        $str .= '            <div class="modal-body">';
        $str .= '                <h4>Search Keywords</h4>';
        $str .= '';
        $str .= '                <p><span class=font-weight-bold>Barcode:</span>';
        $str .= '                    <br>The 12 or 13 digit barcode, normally located on the back, offers the best chance to find a specific album.</p>';
        $str .= '';
        $str .= '                <p><span class=font-weight-bold>Artist and Title:</span>';
        $str .= '                    <br>The full name of the album, including artist and title, will usually lead to a specific album.</p>';
        $str .= '';
        $str .= '                <p><span class=font-weight-bold>Just Artist or Title:</span>';
        $str .= '                    <br>Searches for artist or title alone will bring up random albums.</p>';
        $str .= '            </div>';
        $str .= '        </div>';
        $str .= '    </div>';
        $str .= '</div>';

        return ($str);
}

        function saveSearchResult() {
            global $handler;
            $_sess_db = $handler->getDBSessionId();
            
        $access = mysqli_real_escape_string($_sess_db, time());
        // BUGBUG
        //  country
        //  currency
        $zip = mysqli_real_escape_string($_sess_db, $_SESSION['buyer']['Zip']);
        $condNew = $_SESSION['filterCondition']['New'] ? 'Y' : 'N';
        $condUsed = $_SESSION['filterCondition']['Used'] ? 'Y' : 'N';
        $mediaCD = $_SESSION['filterMediaType']['CD'] ? 'Y' : 'N';
        $mediaRecord = $_SESSION['filterMediaType']['Record'] ? 'Y' : 'N';
        $mediaDigital = $_SESSION['filterMediaType']['Digital'] ? 'Y' : 'N';
        $data = mysqli_real_escape_string($_sess_db, $_SESSION['searchTerm']);
        $lowNew = floatval($_SESSION['lowestPrice']['New']);
        $lowUsed = floatval($_SESSION['lowestPrice']['Used']);
        $lowDigital = floatval($_SESSION['lowestPrice']['Digital']);
        $count = count($_SESSION['resultArr']);

        $sql = "INSERT
                INTO    searches
                (sessId, access, zip, condNew, condUsed, mediaCD, mediaRecord, mediaDigital, data, lowNew, lowUsed, lowDigital, count)
                VALUES  ('" . session_id() . "', '$access', '$zip', '$condNew', '$condUsed', '$mediaCD', '$mediaRecord', '$mediaDigital', '$data', $lowNew, $lowUsed, $lowDigital, $count)";

        return mysqli_query($_sess_db, $sql);
            
        }
?>