public static function validate_settings($settings, $defaults)
 {
     if (isset($settings["shipping_settings"]["weight_ids"]) && is_array($settings["shipping_settings"]["weight_ids"])) {
         $w = $settings["shipping_settings"]["weight"];
         foreach (array_unique($settings["shipping_settings"]["weight_ids"]) as $weight_id) {
             $to_val = $w["to_weight_" . $weight_id];
             if (isset($to_val) && intval($to_val) > 0) {
                 $regions = parent::get_shipping_regions();
                 $region_prices = array();
                 foreach ($regions as $region_code => $region_data) {
                     $input = "shipping_weight_" . $region_code . "_" . $weight_id;
                     if (isset($w[$input]) && trim($w[$input]) != "") {
                         $region_prices[$region_code] = intval($w[$input]);
                     }
                 }
                 if (count($region_prices) == count($regions)) {
                     $weights[] = array("to_weight" => $weight["to_weight_" . $weight_id], "regions" => $region_prices);
                 }
             }
         }
     } else {
         $weights = $defaults["shipping_settings"]["weights"];
     }
     usort($weights, array(__CLASS__, 'put_in_order'));
     $settings["shipping_settings"]["weights"] = $weights;
     unset($settings["shipping_settings"]["weight_ids"]);
     unset($settings["shipping_settings"]["weight"]);
     return $settings;
 }
 /**
  * get_shopping_basket
  * used to return HTML for the shopping basket page
  */
 public static function get_shopping_basket()
 {
     //print('<pre>' . print_r($_REQUEST, true) . '</pre>');exit;
     /* make sure we have all the required paypal options */
     $options = SimplePayPalPluginAdmin::get_paypal_options();
     if ($options["cart_url"] == false) {
         return "";
     }
     /* see if we are returning here from paypal */
     if (isset($_REQUEST["merchant_return_link"])) {
         return $options["thanks_msg"];
     }
     /* fields for item delivery address  */
     $address_fields = array('name' => array('label' => __('Name', 'sppp'), 'required' => true), 'address1' => array('label' => __('Address', 'sppp'), 'required' => true), 'address2' => array('label' => '', 'required' => false), 'address3' => array('label' => '', 'required' => false), 'address4' => array('label' => '', 'required' => false), 'country' => array('label' => __('Country', 'sppp'), 'required' => true), 'postcode' => array('label' => __('Postcode/Zip', 'sppp'), 'required' => true));
     /* shipping regions */
     $regions = SimplePayPalPluginShipping::get_shipping_regions();
     /**
      * shipping data is set in the session, including the (non-pickup)
      * delivery address.
      */
     if (!isset($_SESSION["shipping_data"])) {
         $_SESSION["shipping_data"] = array("errors" => array(), "delivery_method" => "post", "address" => array(), "show_errors" => true);
     }
     /* see if we are coming from the delivery address form */
     if (isset($_REQUEST['submit_address']) || isset($_REQUEST["submit_post"])) {
         /* delivery address -  validate form values */
         foreach ($address_fields as $name => $details) {
             /* clear any existing errors */
             if (isset($_SESSION["shipping_data"]["errors"][$name])) {
                 unset($_SESSION["shipping_data"]["errors"][$name]);
             }
             /* set values if adress has been submitted */
             if (isset($_REQUEST['submit_address'])) {
                 /* set data in Session */
                 $_SESSION["shipping_data"]["address"][$name] = trim($_REQUEST["delivery_" . $name]);
             } else {
                 if (!isset($_SESSION["shipping_data"]["address"][$name])) {
                     $_SESSION["shipping_data"]["address"][$name] = '';
                 }
             }
             /* don't shjow errors if this is a change in shipping method */
             if (isset($_REQUEST["submit_post"])) {
                 $_SESSION["shipping_data"]["show_errors"] = false;
             }
             /* validate address fields */
             if ($name === "country") {
                 /* validate country field */
                 if (!SimplePayPalPluginShipping::is_valid_country_code($_SESSION["shipping_data"]["address"][$name])) {
                     $_SESSION["shipping_data"]["errors"][$name] = __('Please select a country', 'sppp');
                 }
             } elseif ($details["required"]) {
                 /* ensure required fields are non-empty */
                 if (trim($_SESSION["shipping_data"]["address"][$name]) == "") {
                     $_SESSION["shipping_data"]["errors"][$name] = __('This field is required', 'sppp');
                 }
             }
         }
     } elseif (isset($_REQUEST["submit_pickup"])) {
         $_SESSION["shipping_data"]["delivery_method"] = "pickup";
     }
     /* see if the customer pays VAT */
     $customer_pays_vat = self::customer_pays_vat();
     /* initialise variables to store output and track totals */
     $out = "";
     $total_items = 0;
     $masterForm = '';
     $total_vat = 0;
     $total_price_ex_vat = 0;
     $total_price_inc_vat = 0;
     if (isset($_SESSION['sppp-cart']) && is_array($_SESSION['sppp-cart']) && count($_SESSION['sppp-cart'])) {
         $out .= '<table class="cart">';
         $out .= sprintf('<thead><tr><th class="deletecolumn"></th><th class="itemcolumn">%s</th><th class="quantitycolumn">%s</th><th class="moneycolumn">%s</th></tr></thead>', __('item', 'sppp'), __('quantity', 'sppp'), __('price', 'sppp'));
         $item_price_inc_vat = array();
         $item_price_ex_vat = array();
         $item_has_more_stock = array();
         foreach ($_SESSION['sppp-cart'] as $item) {
             $paypal = SimplePaypalPluginAdmin::get_paypal_meta($item["product_page_id"]);
             /* make sure we have stock of this item */
             if ($paypal["stock_no"] < $item["quantity"]) {
                 if ($paypal["stock_no"] == 0) {
                     self::remove_from_cart_by_page_id($item["product_page_id"]);
                     continue;
                 } else {
                     $item["quantity"] = $paypal["stock_no"];
                 }
             }
             $item_has_more_stock["p" . $item["product_page_id"]] = $item["quantity"] < $paypal["stock_no"];
             /* get all totals */
             $total_items += $item['quantity'];
             $item_price_inc_vat["p" . $item["product_page_id"]] = floatval($item['price_inc_vat']);
             $item_price_ex_vat["p" . $item["product_page_id"]] = floatval($item['price_ex_vat']);
             $total_price_inc_vat += floatval($item['price_inc_vat']) * intval($item['quantity']);
             $total_price_ex_vat += floatval($item['price_ex_vat']) * intval($item['quantity']);
             $total_vat += floatval($item['vat_amount']) * intval($item['quantity']);
         }
         /* if the cart has been emptied due to a decrease in stock level... */
         if (!count($_SESSION['sppp-cart'])) {
             return apply_filters('sppp_empty_basket_msg', sprintf('<p>%s.</p>', __('Your basket is empty', 'sppp')));
         }
         $count = 1;
         /* oputput the basket table and build the paypal form */
         foreach ($_SESSION['sppp-cart'] as $item) {
             $rowclass = $count % 2 === 0 ? ' even' : ' odd';
             $out .= sprintf('<tr class="itemrow%s">', $rowclass);
             /* remove button */
             $out .= sprintf('<td class="deletecolumn"><form method="post" action="%s"><input type="hidden" name="sppp-delcart" value="1" /><input type="hidden" name="sppp-product_page_id" value="%s" /><button type="submit" class="sppp-small-button sppp-remove-button" title="%s">%s</button></form></td>', $options["cart_url"], $item['product_page_id'], __('Remove item', 'sppp'), __('Remove item', 'sppp'));
             /* item name linking to product page */
             $out .= sprintf('<td class="itemcolumn"><a href="%s">%s</a></td>', get_permalink($item["product_page_id"]), $item["name"]);
             /* quantity indicator and change quantities button */
             $out .= sprintf('<td class="quantitycolumn"><form method="post" action="%s" name="cquantity"><input type="hidden" name="sppp-cquantity" value="1" /><input type="hidden" name="sppp-product_page_id" value="%s" /><input type="hidden" name="sppp-quantity" value="%s" />', $options["cart_url"], $item["product_page_id"], $item["quantity"]);
             if ($item_has_more_stock["p" . $item["product_page_id"]]) {
                 $plusbutton = sprintf('<button type="submit" class="sppp-small-button sppp-increase-button" name="plus" title="%1$s">%1$s</button>', __('Add one', 'sppp'));
             } else {
                 $plusbutton = sprintf('<button class="sppp-small-button sppp-increase-button disabled" title="%1$s">%1$s</button>', __('No more stock available', 'sppp'));
             }
             $out .= sprintf('<button type="submit" class="sppp-small-button sppp-decrease-button" name="minus" title="%1$s">%1$s</button><span class="quantityval">%2$s</span>%3$s</form></td>', __('Remove one', 'sppp'), $item["quantity"], $plusbutton);
             $out .= sprintf('<td class="moneycolumn">&pound;%.2f</td></tr>', $item_price_ex_vat["p" . $item["product_page_id"]]);
             $masterForm .= sprintf('<input type="hidden" name="item_name_%s" value="%s" /><input type="hidden" name="item_number_%s" value="%s" /><input type="hidden" name="amount_%s" value="%s" /><input type="hidden" name="quantity_%s" value="%s" /><input type="hidden" name="code_%s" value="%s" />', $count, $item["name"], $count, $item["product_page_id"], $count, $item["price"], $count, $item["quantity"], $count, $item["code"]);
             $count++;
         }
         $out .= sprintf('<tr class="subtotal"><td colspan="2">%s:</td><td class="moneycolumn" colspan="2">&pound;%.2f</td></tr>', __('Subtotal', 'sppp'), $total_price_ex_vat);
         if ($total_vat > 0 && $customer_pays_vat) {
             $out .= sprintf('<tr class="subtotal"><td colspan="2">%s:</td><td class="moneycolumn" colspan="2">&pound;%.2f</td></tr>', __('VAT', 'sppp'), $total_vat);
         }
         /* flag to determine whether the paypal form can be submitted*/
         $order_complete = false;
         /* output a form to allow changes in shipping information */
         $shipping_form = sprintf('<h3>%s</h3><form method="post" class="sppp-shipping-address-form" action="%s" method="post">', __('Shipping', 'sppp'), $options["cart_url"]);
         /* the delivery method is set once the cart page has been submitted */
         $shipping_form .= sprintf('<input type="hidden" name="delivery_method" value="%s" />', $_SESSION["shipping_data"]["delivery_method"]);
         if ($options["allow_pickup"] && $_SESSION["shipping_data"]["delivery_method"] == "pickup") {
             $shipping_form .= sprintf('<p>%s</p><h4>%s</h4>%s<input type="submit" name="submit_post" value="%s" class="sppp-button" />', __('You are picking these items up in person', 'sppp'), __('Pickup address', 'sppp'), $options["pickup_address"], __('Have them posted instead', 'sppp'));
             /* clear any errors */
             $_SESSION["shipping_data"]["errors"] = array();
             /* order can be completed */
             $order_complete = true;
         } else {
             if (count($_SESSION["shipping_data"]["address"]) && !count($_SESSION["shipping_data"]["errors"])) {
                 /* address has been input, with no errors */
                 $shipping_form .= sprintf('<p>%s:</p>', __('Delivery address', 'sppp'));
                 $address = array();
                 foreach (array_keys($address_fields) as $field) {
                     if (isset($_SESSION["shipping_data"]["address"][$field]) && trim($_SESSION["shipping_data"]["address"][$field]) != "") {
                         if ($field == "country") {
                             $address[] = SimplePayPalPluginShipping::get_country_name($_SESSION["shipping_data"]["address"]["country"]);
                         } else {
                             $address[] = trim($_SESSION["shipping_data"]["address"][$field]);
                         }
                     }
                 }
                 /* add paypal address input hidden fields here */
                 for ($i = 1; $i <= count($address); $i++) {
                     $masterForm .= sprintf('<input type="hidden" name="shipping_address_%d" value="%s" />', $i, $address[$i - 1]);
                 }
                 $shipping_form .= '<p>' . implode(",<br />", $address) . '</p>';
                 $pickup_button = $options["allow_pickup"] ? sprintf('<input type="submit" name="submit_pickup" value="%s" class="sppp-button sppp-change-button" />', __('Pick these items up in person', 'sppp')) : '';
                 $shipping_form .= sprintf('<p><input type="submit" name="submit_post" value="%s" class="sppp-button sppp-change-button" /></p>', __('Change this address', 'sppp'), $pickup_button);
                 /* order can be completed */
                 $order_complete = true;
             } else {
                 /* address not input, or input with errors */
                 $shipping_form .= sprintf('<p>%s:</p>', __('Please enter your name and delivery address', 'sppp'));
                 foreach ($address_fields as $name => $details) {
                     $value = isset($_SESSION["shipping_data"]["address"][$name]) ? trim($_SESSION["shipping_data"]["address"][$name]) : '';
                     $required = $details["required"] ? ' <span class="required">*</span>' : '';
                     if ($name == 'country') {
                         $shipping_form .= sprintf('<p><label for="delivery_country">%s%s</label>%s</p>', $details["label"], $required, SimplePayPalPluginShipping::get_countries_dropdown('delivery_country', $value, array("GB", "FR")));
                     } else {
                         if (!empty($details["label"])) {
                             $shipping_form .= sprintf('<p><label for="delivery_%s">%s%s</label><input type="text" name="delivery_%s" class="pp-input" id="delivery_%s" value="%s" /></p>', $name, $details["label"], $required, $name, $name, $value);
                         } else {
                             $shipping_form .= sprintf('<p class="nolabel"><input type="text" name="delivery_%s" class="pp-input" id="delivery_%s" value="%s" /></p>', $name, $name, $value);
                         }
                     }
                     if ($_SESSION["shipping_data"]["show_errors"] && isset($_SESSION["shipping_data"]["errors"][$name])) {
                         $shipping_form .= sprintf('<p class="error">%s</p>', $_SESSION["shipping_data"]["errors"][$name]);
                     }
                 }
                 $shipping_form .= sprintf('<p class="nolabel"><input type="submit" class="sppp-button sppp-save-button" name="submit_address" value="%s" /></p>', __('Save this address', 'sppp'));
             }
         }
         /* calculate shipping cost */
         if ($_SESSION["shipping_data"]["delivery_method"] === "pickup") {
             $shipping_total = 0;
         } else {
             $shipping_method = SimplePayPalPluginAdmin::get_selected_shipping_method();
             $shipping_cost = call_user_func_array($shipping_method["calculate_callback"], array($_SESSION['sppp-cart'], $options, $_SESSION["shipping_data"]["address"]["country"]));
             $shipping_total = $shipping_cost["total"];
         }
         /* add shipping to basket and paypal data */
         if ($shipping_total > 0) {
             $out .= sprintf('<tr class="subtotal"><td colspan="2">%s:</td><td colspan="2">&pound;%.02f</td></tr>', __('Shipping', 'sppp'), $shipping_total);
             $masterForm .= sprintf('<input type="hidden" name="shipping_1" value="%.02f" />', $shipping_total);
         } else {
             $masterForm .= '<input type="hidden" name="shipping_1" value="0" />';
         }
         /* get paypal button */
         $formaction = $options["paypal_sandbox"] ? $options["paypal_sandbox_url"] : $options["paypal_url"];
         $paypal_button = sprintf('<form action="%s" id="pp-form" method="post">', $formaction);
         $paypal_button .= $masterForm;
         $business = $options["paypal_sandbox"] ? $options["paypal_sandbox_email"] : $options["paypal_email"];
         $paypal_button .= sprintf('<input type="hidden" name="business" value="%s" />', $business);
         $paypal_button .= sprintf('<input type="hidden" name="currency_code" value="%s" />', $options["paypal_currency"]);
         $paypal_button .= sprintf('<input type="hidden" name="return" value="%s" />', $options["cart_url"]);
         $paypal_button .= sprintf('<input type="hidden" name="notify_url" value="%s" />', $options["cart_url"]);
         $paypal_button .= '<input type="hidden" name="cmd" value="_cart" />';
         $paypal_button .= '<input type="hidden" name="upload" value="1" />';
         $paypal_button .= '<input type="submit" class="sppp-button sppp-checkout-button" name="submit" title="Make payments with PayPal -  fast, free and secure!" /></form>';
         /* print total */
         $total = $customer_pays_vat ? $total_price_inc_vat : $total_price_ex_vat;
         $total += $shipping_total;
         $out .= sprintf('	<tr class="total"><td colspan="2">%s:</td><td colspan="2">&pound;%.02f</td></tr>', __('Total', 'sppp'), $total);
         $out .= '</tbody></table>';
         /* print checkout button (if complete) and shipping information */
         if ($order_complete) {
             $out .= $paypal_button . $shipping_form . $paypal_button;
         } else {
             $out .= $shipping_form;
         }
     } else {
         return apply_filters('sppp_empty_basket_msg', sprintf('<p>%s.</p>', __('Your basket is empty', 'sppp')));
     }
     return $out;
 }