function sunshine_local_checkout_validation()
{
    global $sunshine;
    if (isset($_POST['shipping_method']) && $sunshine->options['local_zipcodes'] && SunshineUser::get_user_meta('shipping_method') != 'download' && $_POST['shipping_method'] == 'local') {
        $zipcodes = array_map('trim', explode(',', $sunshine->options['local_zipcodes']));
        if (!in_array(SunshineUser::get_user_meta('shipping_zip'), $zipcodes)) {
            $sunshine->add_error(sprintf(__('Cannot choose %s shipping, not within allowed area', 'sunshine'), strtolower($sunshine->options['local_name'])));
        }
    }
}
 public static function add_order($data, $email = true)
 {
     global $sunshine;
     $order_id = wp_insert_post(array('post_title' => 'Order – ' . date(get_option('date_format') . ' @ ' . get_option('time_format')), 'post_content' => '', 'post_type' => 'sunshine-order', 'post_status' => 'publish', 'comment_status' => 'open', 'post_author' => $data['user_id'] ? $data['user_id'] : 1));
     wp_update_post(array('ID' => $order_id, 'post_title' => 'Order #' . $order_id, 'post_name' => $order_id));
     $data = apply_filters('sunshine_order_data', $data, $order_id);
     $order_items = apply_filters('sunshine_order_items', $data['items'], $order_id);
     update_post_meta($order_id, '_sunshine_order_data', serialize($data));
     update_post_meta($order_id, '_sunshine_order_items', serialize($order_items));
     update_post_meta($order_id, 'ip', $_SERVER['REMOTE_ADDR']);
     if ($data['discounts']) {
         $discount_items = apply_filters('sunshine_order_discounts', $data['discounts'], $order_id);
         update_post_meta($order_id, '_sunshine_order_discounts', serialize($discount_items));
     }
     if (isset($data['user_id'])) {
         update_post_meta($order_id, '_sunshine_customer_id', $data['user_id']);
     }
     // Order status
     $status = isset($data['status']) ? $data['status'] : 'pending';
     wp_set_post_terms($order_id, $status, 'sunshine-order-status');
     // Decrease credits if used
     if (isset($data['user_id']) && $data['credits'] > 0) {
         $available_credits = SunshineUser::get_user_meta_by_id($data['user_id'], 'credits', true);
         SunshineUser::update_user_meta_by_id($data['user_id'], 'credits', $available_credits - $data['credits']);
     }
     // Update discount code usage
     if (!empty($sunshine->cart->discount_items)) {
         foreach ($sunshine->cart->discount_items as $discount) {
             $current_count = get_post_meta($discount->ID, 'use_count', true);
             update_post_meta($discount->ID, 'use_count', $current_count + 1);
         }
     }
     // Meta data
     if (is_array($data['meta'])) {
         foreach ($data['meta'] as $key => $value) {
             update_post_meta($order_id, $key, $value);
         }
     }
     if ($email) {
         self::notify($order_id);
     }
     $sunshine->add_message(__('Order completed successfully!', 'sunshine'));
     do_action('sunshine_add_order_end', $order_id, $data, $order_items);
     return $order_id;
 }
function sunshine_init()
{
    global $sunshine;
    add_rewrite_endpoint($sunshine->options['endpoint_gallery'], EP_PERMALINK | EP_PAGES);
    add_rewrite_endpoint($sunshine->options['endpoint_image'], EP_PERMALINK | EP_PAGES);
    add_rewrite_endpoint($sunshine->options['endpoint_order'], EP_PERMALINK | EP_PAGES);
    SunshineUser::instance();
    SunshineCountries::instance();
    $functions = SUNSHINE_PATH . 'themes/' . $sunshine->options['theme'] . '/functions.php';
    if (file_exists($functions)) {
        include_once $functions;
    }
    if (is_admin()) {
        include_once 'admin/sunshine-admin.php';
    } else {
        SunshineSession::instance();
        SunshinePaymentMethods::instance();
        SunshineEmail::instance();
        SunshineFrontend::instance();
    }
}
 public static function state_dropdown($country, $name = 'state', $selected = '')
 {
     global $sunshine;
     $states = array();
     if ($country == '') {
         $country = $sunshine->options['country'];
     }
     if (isset(SunshineCountries::$states[$country])) {
         $states = SunshineCountries::$states[$country];
     }
     if ($selected == '') {
         $selected = SunshineUser::get_user_meta($name);
     }
     if ($states) {
         echo '<select name="' . $name . '">';
         echo '<option value="">' . __('Select state', 'sunshine') . '</option>';
         foreach ($states as $code => $name) {
             echo '<option value="' . $code . '" ' . selected($selected, $code, 0) . '>' . $name . '</option>';
         }
         echo '</select>';
     } else {
         echo '<input type="text" name="' . $name . '" value="' . $selected . '" />';
     }
 }
function sunshine_checkout_payment_methods()
{
    global $sunshine;
    ?>
	<fieldset id="sunshine-payment-methods"<?php 
    echo $sunshine->cart->total == 0 && $sunshine->cart->credits == 0 ? ' style="display: none;"' : '';
    ?>
>
		<h2><?php 
    _e('Payment Methods', 'sunshine');
    ?>
</h2>
		<?php 
    if ($sunshine->cart->credits > 0) {
        ?>
			<div id="sunshine-payment-credit"><label><input type="checkbox" name="use_credits" value="1" <?php 
        checked($sunshine->cart->use_credits, 1);
        ?>
 />
				<?php 
        printf(__('Use my %s in credit', 'sunshine'), sunshine_money_format($sunshine->cart->credits, false));
        ?>
			</div>
		<?php 
    }
    ?>
			<ul id="sunshine-payment-method-options">
			<?php 
    $user_payment_method = SunshineUser::get_user_meta('payment_method');
    foreach (SunshinePaymentMethods::$payment_methods as $payment_method) {
        echo '<li id="sunshine-payment-method-' . $payment_method['key'] . '">
						<label><input type="radio" name="payment_method" value="' . $payment_method['key'] . '" ' . checked($payment_method['key'], $user_payment_method, 0) . ' /> ' . $payment_method['name'] . '</label>
						<div class="sunshine-payment-method-description">' . $payment_method['description'] . '</div>
						<div class="sunshine-payment-method-extra">';
        do_action('sunshine_payment_method_extra_' . $payment_method['key']);
        echo '</div>
				</li>';
    }
    ?>
			</ul>
			<?php 
    do_action('sunshine_checkout_payment_methods');
    echo '</fieldset>';
}
function sunshine_paypal_redirect()
{
    global $current_user, $sunshine;
    if (is_page($sunshine->options['page_checkout']) && isset($_GET['paypal_redirect']) && isset($_GET['order_id'])) {
        $order = get_post((int) $_GET['order_id']);
        if (!$order) {
            wp_die(__('ERROR, something went really wrong', 'sunshine') . ' (1)');
            exit;
        }
        $status = sunshine_get_order_status($order->ID);
        if ($status->slug != 'pending') {
            wp_die(__('ERROR, something went really wrong', 'sunshine') . ' (2)');
            exit;
        }
        $paypal_args = array();
        $paypal_args['custom'] = $order->ID;
        $paypal_url = $sunshine->options['paypal_test_mode'] ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
        ?>
	<html>
		<head>
			<title><?php 
        _e('Redirecting to PayPal', 'sunshine');
        ?>
...</title>
			<style type="text/css">
			body, html { margin: 0; padding: 50px; background: #FFF; }
			h1 { color: #000; text-align: center; font-family: Arial; font-size: 24px; }
			</style>
		</head>
		<body>
			<h1><?php 
        _e('Redirecting to PayPal', 'sunshine');
        ?>
...</h1>
			<form method="post" action="<?php 
        echo $paypal_url;
        ?>
" id="paypal" style="display: none;">

			<?php 
        // Cart info
        $order_data = maybe_unserialize(get_post_meta($order->ID, '_sunshine_order_data', true));
        $order_items = maybe_unserialize(get_post_meta($order->ID, '_sunshine_order_items', true));
        $i = 1;
        foreach ($order_items as $item) {
            $name_key = 'item_name_' . $i;
            $quantity_key = 'quantity_' . $i;
            $amount_key = 'amount_' . $i;
            $product = get_post($item['product_id']);
            $cat = wp_get_post_terms($item['product_id'], 'sunshine-product-category');
            $name = apply_filters('sunshine_cart_item_category', isset($cat[0]->name) ? $cat[0]->name : '', $item) . ' - ' . apply_filters('sunshine_cart_item_name', $product->post_title, $item);
            if ($item['image_id'] > 0) {
                $image = get_post($item['image_id']);
                $name = $image->post_title . ' - ' . $name;
            }
            $paypal_args[$name_key] = $name;
            $paypal_args[$quantity_key] = $item['qty'];
            $paypal_args[$amount_key] = number_format($item['price'], 2);
            $i++;
        }
        if ($sunshine->cart->shipping_method['cost'] > 0) {
            $paypal_args['item_name_' . $i] = sprintf(__('Shipping via %s', 'sunshine'), $sunshine->cart->shipping_method['title']);
            $paypal_args['quantity_' . $i] = 1;
            $paypal_args['amount_' . $i] = number_format($sunshine->cart->shipping_method['cost'], 2);
        }
        $paypal_args['tax_cart'] = number_format($sunshine->cart->tax, 2);
        $discount_total = 0;
        if ($sunshine->cart->discount_total) {
            $discount_total = $sunshine->cart->discount_total;
        }
        if ($sunshine->cart->useable_credits) {
            $discount_total += $sunshine->cart->useable_credits;
        }
        $paypal_args['discount_amount_cart'] = number_format($discount_total, 2);
        /*
        $paypal_args['item_name_1'] = __( 'Order from ','sunshine' ).get_bloginfo( 'name' );
        $paypal_args['quantity_1'] = 1;
        $paypal_args['amount_1'] = number_format( $sunshine->cart->total, 2 );
        */
        // Business Info
        $paypal_args['business'] = $sunshine->options['paypal_email'];
        $paypal_args['cmd'] = '_cart';
        $paypal_args['upload'] = '1';
        $paypal_args['charset'] = 'utf-8';
        if ($sunshine->options['page_style']) {
            $paypal_args['page_style'] = $sunshine->options['page_style'];
        }
        $paypal_args['currency_code'] = $sunshine->options['currency'];
        $paypal_args['return'] = add_query_arg(array('paypal_complete' => '1'), get_permalink($order->ID));
        $paypal_args['cancel_return'] = wp_nonce_url(add_query_arg('order_id', $order->ID, sunshine_url('checkout')), 'paypal_cancel', 'paypal_cancel');
        $paypal_args['notify_url'] = trailingslashit(get_bloginfo('url')) . '?sunshine_paypal_ipn=paypal_standard_ipn';
        if (isset($order_data['shipping_method']) && ($order_data['shipping_method'] == 'pickup' || $order_data['shipping_method'] == 'download')) {
            // Don't need any shipping info, so don't pass anything
            $paypal_args['no_shipping'] = 1;
        } else {
            // Need shipping information
            $paypal_args['no_shipping'] = 2;
            $paypal_args['address_override'] = 1;
            // Send what we got
            $paypal_args['address1'] = SunshineUser::get_user_meta('shipping_address');
            $paypal_args['address2'] = SunshineUser::get_user_meta('shipping_address2');
            $paypal_args['city'] = SunshineUser::get_user_meta('shipping_city');
            $paypal_args['state'] = SunshineUser::get_user_meta('shipping_state');
            $paypal_args['zip'] = SunshineUser::get_user_meta('shipping_zip');
            $paypal_args['country'] = SunshineUser::get_user_meta('shipping_country');
        }
        // Prefill user info
        $paypal_args['first_name'] = SunshineUser::get_user_meta('first_name');
        $paypal_args['last_name'] = SunshineUser::get_user_meta('last_name');
        $paypal_args['email'] = SunshineUser::get_user_meta('email');
        $phone = preg_replace("/[^0-9,.]/", "", SunshineUser::get_user_meta('phone'));
        $paypal_args['night_phone_a'] = substr($phone, 0, 3);
        $paypal_args['night_phone_b'] = substr($phone, 3, 3);
        $paypal_args['night_phone_c'] = substr($phone, 6, 4);
        $paypal_args = apply_filters('sunshine_paypal_args', $paypal_args);
        foreach ($paypal_args as $key => $value) {
            $paypal_args_array[] = '<input type="hidden" name="' . esc_attr($key) . '" value="' . esc_attr($value) . '" />';
        }
        echo implode("\r\n", $paypal_args_array);
        ?>

			<input type="submit" value="<?php 
        _e('Submit payment via PayPal', 'sunshine');
        ?>
" style="border: none; background: #FFF; color: #FFF; box-shadow: none; text-shadow: none;" />
		</form>
		<script>
			document.getElementById("paypal").submit();
		</script>
		</body>
		</html>
<?php 
        die;
    }
}
function sunshine_update_account()
{
    global $current_user, $sunshine;
    if (isset($_POST['sunshine_update_account']) && $_POST['sunshine_update_account'] == 1) {
        $vars['country'] = isset($_POST['country']) ? $_POST['country'] : '';
        $vars['first_name'] = isset($_POST['first_name']) ? $_POST['first_name'] : '';
        $vars['last_name'] = isset($_POST['last_name']) ? $_POST['last_name'] : '';
        $vars['address'] = isset($_POST['address']) ? $_POST['address'] : '';
        $vars['address2'] = isset($_POST['address2']) ? $_POST['address2'] : '';
        $vars['city'] = isset($_POST['city']) ? $_POST['city'] : '';
        $vars['state'] = isset($_POST['state']) ? $_POST['state'] : '';
        $vars['zip'] = isset($_POST['zip']) ? $_POST['zip'] : '';
        $vars['shipping_country'] = isset($_POST['shipping_country']) ? $_POST['shipping_country'] : '';
        $vars['shipping_first_name'] = isset($_POST['shipping_first_name']) ? $_POST['shipping_first_name'] : '';
        $vars['shipping_last_name'] = isset($_POST['shipping_last_name']) ? $_POST['shipping_last_name'] : '';
        $vars['shipping_address'] = isset($_POST['shipping_address']) ? $_POST['shipping_address'] : '';
        $vars['shipping_address2'] = isset($_POST['shipping_address2']) ? $_POST['shipping_address2'] : '';
        $vars['shipping_city'] = isset($_POST['shipping_city']) ? $_POST['shipping_city'] : '';
        $vars['shipping_state'] = isset($_POST['shipping_state']) ? $_POST['shipping_state'] : '';
        $vars['shipping_zip'] = isset($_POST['shipping_zip']) ? $_POST['shipping_zip'] : '';
        if (isset($_POST['billing_as_shipping']) && $_POST['billing_as_shipping'] == 1) {
            $vars['country'] = isset($_POST['shipping_country']) ? $_POST['shipping_country'] : '';
            $vars['first_name'] = isset($_POST['shipping_first_name']) ? $_POST['shipping_first_name'] : '';
            $vars['last_name'] = isset($_POST['shipping_last_name']) ? $_POST['shipping_last_name'] : '';
            $vars['address'] = isset($_POST['shipping_address']) ? $_POST['shipping_address'] : '';
            $vars['address2'] = isset($_POST['shipping_address2']) ? $_POST['shipping_address2'] : '';
            $vars['city'] = isset($_POST['shipping_city']) ? $_POST['shipping_city'] : '';
            $vars['state'] = isset($_POST['shipping_state']) ? $_POST['shipping_state'] : '';
            $vars['zip'] = isset($_POST['shipping_zip']) ? $_POST['shipping_zip'] : '';
        }
        $vars['billing_as_shipping'] = isset($_POST['billing_as_shipping']) ? $_POST['billing_as_shipping'] : '';
        $vars['phone'] = isset($_POST['phone']) ? $_POST['phone'] : '';
        foreach ($vars as $key => $item) {
            SunshineUser::update_user_meta_by_id($current_user->ID, $key, sanitize_text_field($item));
        }
        $userdata['ID'] = $current_user->ID;
        $userdata['user_email'] = sanitize_email($_POST['email']);
        $userdata['first_name'] = sanitize_text_field($_POST['first_name']);
        $userdata['last_name'] = sanitize_text_field($_POST['last_name']);
        wp_update_user($userdata);
        $sunshine->add_message(__('Account updated', 'sunshine'));
        wp_redirect(sunshine_current_url(false));
        exit;
    }
}
function sunshine_delete_favorite($image_id)
{
    $image_id = intval($image_id);
    SunshineUser::delete_user_meta('favorite', $image_id);
    $favorite_count = get_post_meta($image_id, 'sunshine_favorite_count', true);
    $favorite_count--;
    update_post_meta($image_id, 'sunshine_favorite_count', $favorite_count);
}
function sunshine_admin_user_cart($user)
{
    if (current_user_can('sunshine_manage_options')) {
        $items = SunshineUser::get_user_meta_by_id($user->ID, 'cart', false);
        $orders = get_posts('post_type=sunshine-order&meta_key=_sunshine_customer_id&meta_value=' . $user->ID . '&nopaging=1');
        ?>
		<h3><?php 
        _e('Orders', 'sunshine');
        ?>
</h3>
		<?php 
        if ($orders) {
            echo '<ul>';
            foreach ($orders as $order) {
                $order_data = unserialize(get_post_meta($order->ID, '_sunshine_order_data', true));
                $total = sunshine_money_format($order_data['total'], false);
                echo '<li><a href="post.php?post=124&action=edit">' . $order->post_title . '</a>, ' . date(get_option('date_format'), strtotime($order->post_date)) . ' &mdash; ' . $total . '</li>';
            }
        } else {
            echo '<li><em>' . __('User has no orders yet', 'sunshine') . '</em></li>';
        }
        ?>
		<h3><?php 
        _e('Address Information', 'sunshine');
        ?>
</h3>
		<table class="form-table">
	 	<tr>
	 		<th><?php 
        _e('Billing Information', 'sunshine');
        ?>
</th>
	 		<td>
				<?php 
        $address = SunshineUser::get_user_meta_by_id($user->ID, 'address');
        $address2 = SunshineUser::get_user_meta_by_id($user->ID, 'address2');
        $city = SunshineUser::get_user_meta_by_id($user->ID, 'city');
        $state = SunshineUser::get_user_meta_by_id($user->ID, 'state');
        $zip = SunshineUser::get_user_meta_by_id($user->ID, 'zip');
        $country = SunshineUser::get_user_meta_by_id($user->ID, 'country');
        if ($address) {
            echo $address . '<br />';
            if ($address2) {
                echo $address2 . '<br />';
            }
            echo $city . ', ' . $state . ' ' . $zip . '<br />' . $country;
        } else {
            echo '<em>' . __('No current billing address', 'sunshine') . '</em>';
        }
        ?>
			</td>
	 	</tr>
	 	<tr>
	 		<th><?php 
        _e('Shipping Information', 'sunshine');
        ?>
</th>
	 		<td>
				<?php 
        $address = SunshineUser::get_user_meta_by_id($user->ID, 'shipping_address');
        $address2 = SunshineUser::get_user_meta_by_id($user->ID, 'shipping_address2');
        $city = SunshineUser::get_user_meta_by_id($user->ID, 'shipping_city');
        $state = SunshineUser::get_user_meta_by_id($user->ID, 'shipping_state');
        $zip = SunshineUser::get_user_meta_by_id($user->ID, 'shipping_zip');
        $country = SunshineUser::get_user_meta_by_id($user->ID, 'shipping_country');
        if ($address) {
            echo $address . '<br />';
            if ($address2) {
                echo $address2 . '<br />';
            }
            echo $city . ', ' . $state . ' ' . $zip . '<br />' . $country;
        } else {
            echo '<em>' . __('No current shipping address', 'sunshine') . '</em>';
        }
        ?>
			</td>
	 	</tr>
	 	</table>
	 	<h3 id="sunshine-credits"><?php 
        _e('Sunshine Gallery Credits for Purchases', 'sunshine');
        ?>
</h3>
		<table class="form-table">
	 	<tr>
	 		<th><label for="sunshine_credits"><?php 
        _e('Credits', 'sunshine');
        ?>
</label></th>
	 		<td>
				<?php 
        $currency_symbol = sunshine_currency_symbol();
        $currency_symbol_format = sunshine_currency_symbol_format();
        $text_field = '<input type="text" name="sunshine_credits" id="sunshine_credits" value="' . esc_attr(SunshineUser::get_user_meta_by_id($user->ID, 'credits')) . '" />';
        echo sprintf($currency_symbol_format, $currency_symbol, $text_field);
        ?>
			</td>
	 	</tr>
	 	</table>
	 	<h3 id="sunshine-cart"><?php 
        _e('Sunshine Items in Cart', 'sunshine');
        ?>
</h3>
		<?php 
        if ($items) {
            ?>
			<table id="sunshine-cart-items" width="100%">
			<tr>
				<th class="image"><?php 
            _e('Image', 'sunshine');
            ?>
</th>
				<th class="name"><?php 
            _e('Product', 'sunshine');
            ?>
</th>
				<th class="qty"><?php 
            _e('Quantity', 'sunshine');
            ?>
</th>
				<th class="price"><?php 
            _e('Item Price', 'sunshine');
            ?>
</th>
			</tr>
			<?php 
            foreach ($items as $item) {
                ?>
				<tr class="item">
					<td class="image">
						<?php 
                $thumb = wp_get_attachment_image_src($item['image_id'], 'thumbnail');
                $image_html = '<a href="' . get_permalink($item['image_id']) . '"><img src="' . $thumb[0] . '" alt="" class="image-thumb" /></a>';
                echo apply_filters('sunshine_cart_image_html', $image_html, $item, $thumb);
                ?>
					</td>
					<td class="name">
						<?php 
                $product = get_post($item['product_id']);
                $cat = wp_get_post_terms($item['product_id'], 'sunshine-product-category');
                ?>
						<strong><span class="sunshine-item-cat"><?php 
                echo apply_filters('sunshine_cart_item_category', isset($cat[0]->name) ? $cat[0]->name : '', $item);
                ?>
</span> - <span class="sunshine-item-name"><?php 
                echo apply_filters('sunshine_cart_item_name', $product->post_title, $item);
                ?>
</span></strong><br />
						<div class="sunshine-item-comments"><?php 
                echo apply_filters('sunshine_cart_item_comments', $item['comments'], $item);
                ?>
</div>
					</td>
					<td class="qty">
						<?php 
                echo $item['qty'];
                ?>
					</td>
					<td class="price">
						<?php 
                sunshine_money_format($item['price']);
                ?>
					</td>
				</tr>
			<?php 
            }
            ?>
			</table>
		<?php 
        } else {
            ?>
			<p><?php 
            _e('No items in cart', 'sunshine');
            ?>
</p>
		<?php 
        }
        ?>
	<?php 
    }
}
 public function remove_item_in_cart($hash)
 {
     foreach ($this->content as $key => $cart_item) {
         if ($hash == $cart_item['hash']) {
             if (is_user_logged_in()) {
                 SunshineUser::delete_user_meta('cart', $cart_item);
             } else {
                 unset($this->content[$key]);
                 SunshineSession::instance()->cart = $cart;
             }
             break;
         }
     }
 }
<div id="sunshine" class="sunshine-clearfix <?php 
sunshine_classes();
?>
">

	<?php 
do_action('sunshine_before_content');
?>
	
	<div id="sunshine-main">

		<?php 
$credits = SunshineUser::get_user_meta('credits');
if ($credits > 0) {
    ?>
			<h2><?php 
    _e('Credits', 'sunshine');
    ?>
</h2>
			<p>
				<?php 
    printf(__('You have %s in credit', 'sunshine'), sunshine_money_format($credits, false));
    ?>
			</p>
		<?php 
}
?>

		<div id="sunshine-account-orders">
			<h2><?php 
_e('Orders', 'sunshine');