[studentbooks15] r81 committed - functionality of jcart

0 views
Skip to first unread message

student...@googlecode.com

unread,
Dec 4, 2010, 4:42:56 PM12/4/10
to student...@googlegroups.com
Revision: 81
Author: reamus
Date: Sat Dec 4 13:38:22 2010
Log: functionality of jcart
http://code.google.com/p/studentbooks15/source/detail?r=81

Added:
/svn/trunk/reamus/shoppingcart
/svn/trunk/reamus/shoppingcart/jcart
/svn/trunk/reamus/shoppingcart/jcart/jcart-admin-tooltips.php
/svn/trunk/reamus/shoppingcart/jcart/jcart-admin.css
/svn/trunk/reamus/shoppingcart/jcart/jcart-config.php
/svn/trunk/reamus/shoppingcart/jcart/jcart-defaults.php
/svn/trunk/reamus/shoppingcart/jcart/jcart-gateway.php
/svn/trunk/reamus/shoppingcart/jcart/jcart-javascript.php
/svn/trunk/reamus/shoppingcart/jcart/jcart-relay.php
/svn/trunk/reamus/shoppingcart/jcart/jcart.css
/svn/trunk/reamus/shoppingcart/jcart/jcart.php

=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart-admin-tooltips.php Sat Dec
4 13:38:22 2010
@@ -0,0 +1,109 @@
+<<?php
+
+$content = $_GET['content'];
+?>
+
+<div id="jcart-thickbox">
+
+<?php
+switch($content)
+ {
+ case 'paypal':
+?>
+
+ <h3>PayPal Setup</h3>
+
+ <p>Enter your secure merchant ID to enable PayPal integration.
You&rsquo;ll find this under <strong>My Account > Profile</strong> when
logged into PayPal.</p>
+
+ <p>Your PayPal profile must also use the following settings:</p>
+
+ <ul>
+ <li><strong>PayPal Account Optional</strong> is turned on</li>
+ <li><strong>Shipping Calculations</strong> have been set up</li>
+ <li><strong>Auto Return</strong> is turned off</li>
+ </ul>
+
+ <p><a
href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_html_ProfileAndTools">Visit
PayPal for more info on profile settings.</a></p>
+
+ <p>If you&rsquo;d like to use your own checkout script or payment
processor, you can edit the source of <code>jcart-gateway.php</code> to
meet your needs.</p>
+
+<?php
+ break;
+ case 'checkout':
+?>
+
+ <h3>Checkout Page</h3>
+
+ <p>Enter the URL of your checkout page.</p>
+
+ <p>This can be any WordPress page that uses the
<strong>checkout.php</strong> template included with jCart.</p>
+
+<?php
+ break;
+ case 'sample_form':
+?>
+
+ <h3 style="margin-bottom:30px;">Sample Add-to-Cart Form</h3>
+
+<pre>
+&lt;form method="post" action="" class="jcart"&gt;
+ &lt;fieldset&gt;
+ &lt;input type="hidden" name="my-item-id" value="1" /&gt;
+ &lt;input type="hidden" name="my-item-name" value="Soccer Ball" /&gt;
+ &lt;input type="hidden" name="my-item-price" value="25.00" /&gt;
+
+ &lt;ul&gt;
+ &lt;li&gt;&lt;strong&gt;Soccer Ball&lt;/strong&gt;&lt;/li&gt;
+ &lt;li&gt;Price: $25.00&lt;/li&gt;
+ &lt;li&gt;
+ &lt;label&gt;Qty: &lt;input type="text" name="my-item-qty"
value="1" size="3" /&gt;&lt;/label&gt;
+ &lt;/li&gt;
+ &lt;/ul&gt;
+
+ &lt;input type="submit" name="my-add-button" value="add to cart"
class="button" /&gt;
+ &lt;/fieldset&gt;
+&lt;/form&gt;
+</pre>
+
+
+<?php
+ break;
+ case 'image_button':
+?>
+
+ <h3>Using an Image Button</h3>
+
+ <p>If your item form uses an <code>&lt;input type="image" /&gt;</code>
for the add-to-cart button, you must append <strong>_x</strong> to the
value of the input&rsquo;s name attribute.</p>
+
+ <p>For example, if your button code looks like this:</p>
+
+ <p style="padding-left:25px;"><code>&lt;input type="image"
name="my-add-button" /&gt;</code></p>
+
+ <p>Enter <strong>my-add-button_x</strong> for the add-to-cart option.</p>
+
+ <p><a
href="http://php.net/manual/en/faq.html.php#faq.html.form-image">Visit the
PHP website for more info on image buttons.</a></p>
+<?php
+ break;
+ case 'encoding':
+?>
+
+ <h3>Using Special or Accented Characters</h3>
+
+ <p>There are two requirements to use special or accented characters in
your item name fields:</p>
+
+ <ol>
+ <li>Your WordPress installation must use UTF-8 character encoding. This
option can be found under <strong>Settings > Reading</strong> in your
WordPress admin.</li>
+ <li>You must use the apppropriate HTML character entity in place of the
literal character.</li>
+ </ol>
+
+ <p><a
href="http://www.evotech.net/blog/2007/08/first-5800-numeric-html-character-entities/">Visit
this page for a good list of HTML character entities.</a></p>
+
+<?php
+ break;
+ }
+
+?>
+
+
+</div>
+
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart-admin.css Sat Dec 4
13:38:22 2010
@@ -0,0 +1,12 @@
+#jcart-admin hr { display:none; }
+#jcart-admin h3 { padding:10px; background:#ededed; margin-top:0; }
+
+#jcart-admin div.hr { border-bottom:dashed 2px #66cc66; margin:30px auto 0
auto; }
+#jcart-admin div.hr hr { display:none; }
+
+#jcart-admin ul, #jcart-thickbox ul { margin:20px 0 20px 25px;
list-style-type:square; }
+#jcart-admin ol, #jcart-thickbox ol { margin:20px 0 20px 25px;
list-style-type:decimal; }
+
+#jcart-thickbox { padding:10px; }
+
+
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart-config.php Sat Dec 4
13:38:22 2010
@@ -0,0 +1,37 @@
+<?php
+
+// JCART v1.2
+// http://conceptlogic.com/jcart/
+
+// IN ORDER TO USE WORDPRESS FUNCTIONS, JCART LOOKS FOR wp-blog-header.php
IN YOUR ROOT DIRECTORY
+// IF NOT INSTALLED IN YOUR ROOT DIRECTORY, SET THE ABSOLUTE PATH HERE
+// FOR EXAMPLE: $wp_blog_header
= '/home/domain/public_html/blog/wp-blog-header.php';
+
+$wp_blog_header = '';
+
+?>
+<?php
+
+//
+
+///////////////////////////////////////////////////////////////////////
+// REQUIRED SETTINGS
+
+// THE HTML NAME ATTRIBUTES USED IN YOUR ADD-TO-CART FORM
+$jcart["item_id"] = "my-item-id"; // ITEM ID
+$jcart["item_name"] = "my-item-name"; // ITEM NAME
+$jcart["item_price"] = "my-item-price"; // ITEM PRICE
+$jcart["item_qty"] = "my-item-qty"; // ITEM QTY
+$jcart["item_add"] = "my-add-button"; // ADD-TO-CART BUTTON
+
+// PATH TO THE DIRECTORY CONTAINING JCART FILES
+$jcart["path"] = "/jcart/1.2/jcart";
+
+// PATH TO YOUR CHECKOUT PAGE (RELATIVE TO YOUR DOMAIN ROOT)
+// USED AS THE ACTION ATTRIBUTE FOR THE SHOPPING CART FORM
+$jcart["form_action"] = "/jcart/1.2/checkout.php";
+
+// YOUR PAYPAL SECURE MERCHANT ACCOUNT ID
+$jcart["paypal_id"] = "";
+
+?>
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart-defaults.php Sat Dec 4
13:38:22 2010
@@ -0,0 +1,103 @@
+<?php
+
+// JCART v1.2
+// http://conceptlogic.com/jcart/
+
+
+// IF THE USER HASN'T SET A VALUE
+if (empty($wp_blog_header))
+ {
+ // ASSUME WORDPRESS IS INSTALLED IN ROOT
+ $wp_blog_header = $_SERVER['DOCUMENT_ROOT'] . '/wp-blog-header.php';
+ }
+include_once($wp_blog_header);
+
+
+// PRE-2.6 COMPATIBILITY
+if (!defined('WP_CONTENT_URL'))
+ {
+ define('WP_CONTENT_URL', get_option( 'siteurl' ) . '/wp-content' );
+ }
+
+if (!defined('WP_CONTENT_DIR'))
+ {
+ define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content');
+ }
+
+if (!defined('WP_PLUGIN_URL'))
+ {
+ define('WP_PLUGIN_URL', WP_CONTENT_URL. '/plugins' );
+ }
+
+if (!defined('WP_PLUGIN_DIR'))
+ {
+ define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' );
+ }
+
+
+// FORM FIELDS
+$jcart['item_id'] = get_option('jcart_item_id');
+$jcart['item_name'] = get_option('jcart_item_name');
+$jcart['item_price'] = get_option('jcart_item_price');
+$jcart['item_qty'] = get_option('jcart_item_qty');
+$jcart['item_add'] = get_option('jcart_item_add');
+
+// wp-mod: NOT USED SINCE WE HAVE WP CONSTANTS
+// PATH TO THE DIRECTORY CONTAINING JCART FILES
+// $jcart['path'] = get_option('siteurl') . '/wp-content/plugins/jcart/';
+
+// CHECKOUT PAGE
+$jcart['form_action'] = get_option('jcart_form_action');
+
+// PAYPAL SETUP
+$jcart['paypal_id'] = get_option('jcart_paypal_id');
+$jcart['paypal_currency'] = get_option('jcart_paypal_currency');
+
+// DISPLAY TEXT
+$jcart['text']['cart_title'] = get_option('jcart_cart_title');
+$jcart['text']['single_item'] = get_option('jcart_single_item');
+$jcart['text']['multiple_items'] = get_option('jcart_multiple_items');
+$jcart['text']['subtotal'] = get_option('jcart_subtotal');
+
+$jcart['text']['update_button'] = get_option('jcart_update_button');
+$jcart['text']['checkout_button'] = get_option('jcart_checkout_button');
+$jcart['text']['checkout_paypal_button'] =
get_option('jcart_checkout_paypal_button');
+$jcart['text']['remove_link'] = get_option('jcart_remove_link');
+$jcart['text']['empty_button'] = get_option('jcart_empty_button');
+$jcart['text']['empty_message'] = get_option('jcart_empty_message');
+$jcart['text']['item_added_message'] =
get_option('jcart_item_added_message');
+
+$jcart['text']['price_error'] = get_option('jcart_price_error');
+$jcart['text']['qty_error'] = get_option('jcart_qty_error');
+$jcart['text']['checkout_error'] = get_option('jcart_checkout_error');
+
+$jcart['button']['update'] = get_option('jcart_update_image');
+$jcart['button']['empty'] = get_option('jcart_empty_image');
+$jcart['button']['checkout'] = get_option('jcart_checkout_image');
+$jcart['button']['checkout_paypal'] =
get_option('jcart_checkout_paypal_image');
+
+// DEFAULT CART TEXT USED IF NOT OVERRIDDEN IN jcart-config.php
+// DEFAULTS MUST BE AVAILABLE TO jcart.php, AND jcart-javascript.php AND
jcart-javascript.min.php
+// INCLUDED AS A SEPARATE FILE TO SIMPLIFY USER CONFIG
+
+// wp-mod: ASSUME WORDPRESS IS INSTALLED IN ROOT, USER CAN OVERRIDE IN WP
ADMIN IF NOT
+// if (!$jcart['path']) die('The path to jCart isn\'t set. Please see
<strong>jcart-config.php</strong> for more info.');
+
+if (!$jcart['text']['cart_title']) $jcart['text']['cart_title']
= 'Shopping Cart';
+if (!$jcart['text']['single_item']) $jcart['text']['single_item']
= 'Item';
+if (!$jcart['text']['multiple_items']) $jcart['text']['multiple_items']
= 'Items';
+if (!$jcart['text']['subtotal']) $jcart['text']['subtotal']
= 'Subtotal';
+
+if (!$jcart['text']['update_button']) $jcart['text']['update_button']
= 'update';
+if (!$jcart['text']['checkout_button']) $jcart['text']['checkout_button']
= 'checkout';
+if (!$jcart['text']['checkout_paypal_button'])
$jcart['text']['checkout_paypal_button'] = 'Checkout with PayPal';
+if (!$jcart['text']['remove_link']) $jcart['text']['remove_link']
= 'remove';
+if (!$jcart['text']['empty_button']) $jcart['text']['empty_button']
= 'empty';
+if (!$jcart['text']['empty_message']) $jcart['text']['empty_message']
= 'Your cart is empty!';
+if (!$jcart['text']['item_added_message'])
$jcart['text']['item_added_message'] = 'Item added!';
+
+if (!$jcart['text']['price_error']) $jcart['text']['price_error']
= 'Invalid price format!';
+if (!$jcart['text']['quantity_error']) $jcart['text']['quantity_error']
= 'Item quantities must be whole numbers!';
+if (!$jcart['text']['checkout_error']) $jcart['text']['checkout_error']
= 'Your order could not be processed!';
+
+?>
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart-gateway.php Sat Dec 4
13:38:22 2010
@@ -0,0 +1,145 @@
+<?php
+
+// JCART v1.2
+// http://conceptlogic.com/jcart/
+
+// THIS FILE IS CALLED WHEN ANY BUTTON ON THE CHECKOUT PAGE (PAYPAL
CHECKOUT, UPDATE, OR EMPTY) IS CLICKED
+// WE CAN ONLY DEFINE ONE FORM ACTION, SO THIS FILE ALLOWS US TO FORK THE
FORM SUBMISSION DEPENDING ON WHICH BUTTON WAS CLICKED
+// ALSO ALLOWS US TO VERIFY PRICES BEFORE SUBMITTING TO PAYPAL
+
+// INCLUDE JCART BEFORE SESSION START
+include_once 'jcart.php';
+
+// START SESSION
+session_start();
+
+// INITIALIZE JCART AFTER SESSION START
+$cart =& $_SESSION['jcart']; if (!is_object($cart)) $cart = new jcart();
+
+// WHEN JAVASCRIPT IS DISABLED THE UPDATE AND EMPTY BUTTONS ARE DISPLAYED
+// RE-DISPLAY THE CART IF THE VISITOR CLICKS EITHER BUTTON
+if ($_POST['jcart_update_cart'] || $_POST['jcart_empty'])
+ {
+
+ // UPDATE THE CART
+ if ($_POST['jcart_update_cart'])
+ {
+ $cart_updated = $cart->update_cart();
+ if ($cart_updated !== true)
+ {
+ $_SESSION['quantity_error'] = true;
+ }
+ }
+
+ // EMPTY THE CART
+ if ($_POST['jcart_empty'])
+ {
+ $cart->empty_cart();
+ }
+
+ // REDIRECT BACK TO THE CHECKOUT PAGE
+ header('Location: ' . $_POST['jcart_checkout_page']);
+ exit;
+ }
+
+// THE VISITOR HAS CLICKED THE PAYPAL CHECKOUT BUTTON
+else
+ {
+
+ ///////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////
+ /*
+
+ A malicious visitor may try to change item prices before checking out,
+ either via javascript or by posting from an external script.
+
+ Here you can add PHP code that validates the submitted prices against
+ your database or validates against hard-coded prices.
+
+ The cart data has already been sanitized and is available thru the
+ $cart->get_contents() function. For example:
+
+ foreach ($cart->get_contents() as $item)
+ {
+ $item_id = $item['id'];
+ $item_name = $item['name'];
+ $item_price = $item['price'];
+ $item_qty = $item['qty'];
+ }
+
+ */
+ ///////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////
+
+ $valid_prices = true;
+
+ ///////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////
+
+ // IF THE SUBMITTED PRICES ARE NOT VALID
+ if ($valid_prices !== true)
+ {
+ // KILL THE SCRIPT
+ die($jcart['text']['checkout_error']);
+ }
+
+ // PRICE VALIDATION IS COMPLETE
+ // SEND CART CONTENTS TO PAYPAL USING THEIR UPLOAD METHOD, FOR DETAILS
SEE http://tinyurl.com/djoyoa
+ else if ($valid_prices === true)
+ {
+ // PAYPAL COUNT STARTS AT ONE INSTEAD OF ZERO
+ $paypal_count = 1;
+ $items_query_string;
+ foreach ($cart->get_contents() as $item)
+ {
+ // BUILD THE QUERY STRING
+ $items_query_string .= '&item_name_' . $paypal_count . '=' .
$item['name'];
+ $items_query_string .= '&amount_' . $paypal_count . '=' .
$item['price'];
+ $items_query_string .= '&quantity_' . $paypal_count . '=' .
$item['qty'];
+
+ // INCREMENT THE COUNTER
+ ++$paypal_count;
+ }
+
+ // EMPTY THE CART
+ $cart->empty_cart();
+
+ if ($jcart['paypal_id'])
+ {
+ // REDIRECT TO PAYPAL WITH MERCHANT ID AND CART CONTENTS
+ header( 'Location:
https://www.paypal.com/cgi-bin/webscr?cmd=_cart&upload=1&charset=utf-8&currency_code=' .
$jcart['paypal_currency'] . '&business=' . $jcart['paypal_id'] .
$items_query_string);
+ exit;
+ }
+ else
+ // THE USER HAS NOT CONFIGURED A PAYPAL ID
+ // DISPLAY THE PAYPAL URL WITH AN ERROR MESSAGE
+ {
+ ?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html>
+ <head>
+ <title></title>
+ </head>
+ <body>
+ <div style="width:950px; margin:40px auto; padding:20px; border:solid
2px #333; background:#ededed;">
+ <p><strong>PayPal integration requires a secure merchant
ID!</strong></p>
+
+ <p>Below is the URL that would be sent to PayPal if a merchant ID was
set in your <a href="<?php echo
get_option('siteurl');?>/wp-admin/options-general.php?page=jcart/jcart-admin.php">jCart
options</a>:</p>
+
+
<p>https://www.paypal.com/cgi-bin/webscr?cmd=_cart&upload=1&charset=utf-8&currency_code=<?php
echo $jcart['paypal_currency'];?>&business=PAYPAL_ID<?php echo
$items_query_string;?></p>
+ </div>
+ </body>
+</html>
+
+
+
+ <?php
+ exit;
+ }
+ }
+ }
+
+?>
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart-javascript.php Sat Dec 4
13:38:22 2010
@@ -0,0 +1,265 @@
+<?php
+
+// JCART v1.2
+// http://conceptlogic.com/jcart/
+
+// INCLUDE CONFIG SO THIS SCRIPT HAS ACCESS TO USER FIELD NAMES
+require_once('jcart-config.php');
+
+// INCLUDE DEFAULT VALUES SINCE WE NEED TO PASS THE VALUE OF THE UPDATE
BUTTON BACK TO jcart.php IF UPDATING AN ITEM QTY
+// IF NO VALUE IS SET IN CONFIG, THERE MUST BE A DEFAULT VALUE SINCE
SIMPLY CHECKING FOR THE VAR ITSELF FAILS
+require_once('jcart-defaults.php');
+
+// OUTPUT PHP FILE AS JAVASCRIPT
+header('content-type:application/x-javascript');
+
+// PREVENT CACHING
+header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
+header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
+
+// CONTINUE THE SESSION
+session_start();
+
+// TRIM '_x' FROM VALUE OF THE ADD TO CART BUTTON
+// IF USING AN IMAGE BUTTON, USER ADDS THIS STRING IN CONFIG SO PHP CAN
PROCESS CORRECTLY
+// HERE WE WANT THE LITERAL VALUE OF THE NAME ATTRIBUTE TO PASS TO
JAVASCRIPT
+$item_add = rtrim($jcart['item_add'], '_x') ;
+
+?>
+
+// WHEN THE DOCUMENT IS READY
+(function($){
+ $(document).ready(function() {
+
+ /**********************************************************************
+ Tooltips based on Wayfarer Tooltip 1.0.2
+ (c) 2006-2009 Abel Mohler
+ http://www.wayfarerweb.com/wtooltip.php
+ **********************************************************************/
+ $.fn.jcartTooltip = function(o, callback){
+ o = $.extend({
+ content: null,
+ follow: true,
+ auto: true,
+ fadeIn: 0,
+ fadeOut: 0,
+ appendTip: document.body,
+ offsetY: 25,
+ offsetX: -10,
+ style: {},
+ id: 'jcart-tooltip'
+ }, o || {});
+
+ o.style = $.extend({}, o.style || {});
+
+ o.style.display = "none";
+ o.style.position = "absolute";
+
+ var over = {};
+ var maxed = false;
+ var tooltip = document.createElement('div');
+
+ tooltip.id = o.id;
+
+ for (var p in o.style){ tooltip.style[p] = o.style[p];}
+
+ function fillTooltip(condition){if(
condition){$(tooltip).html(o.content);}}
+
+ fillTooltip(o.content && !o.ajax);
+ $(tooltip).appendTo(o.appendTip);
+
+ return this.each(function(){
+ this.onclick = function(ev){
+ function _execute(){
+ var display;
+ if (o.content)
+ {
+ display = "block";
+ }
+ else
+ {
+ display = "none";
+ }
+ if (display == "block" && o.fadeIn)
+ {
+ $(tooltip).fadeIn(o.fadeIn);
+
+ setTimeout(function(){
+ $(tooltip).fadeOut(o.fadeOut);
+ }, 1000);
+ }
+ }
+ _execute();
+ };
+
+ this.onmousemove = function(ev){
+ var e = (ev) ? ev : window.event;
+ over = this;
+ if (o.follow){
+ var scrollY = $(window).scrollTop();
+ var scrollX = $(window).scrollLeft();
+ var top = e.clientY + scrollY + o.offsetY;
+ var left = e.clientX + scrollX + o.offsetX;
+ var maxLeft = $(window).width() + scrollX - $(tooltip).outerWidth();
+ var maxTop = $(window).height() + scrollY - $(tooltip).outerHeight();
+ maxed = (top > maxTop || left > maxLeft) ? true : false;
+
+ if (left - scrollX <= 0 && o.offsetX < 0)
+ {
+ left = scrollX;
+ }
+ else if (left > maxLeft)
+ {
+ left = maxLeft;
+ }
+ if (top - scrollY <= 0 && o.offsetY < 0)
+ {
+ top = scrollY;
+ }
+ else if (top > maxTop)
+ {
+ top = maxTop;
+ }
+
+ tooltip.style.top = top + "px";
+ tooltip.style.left = left + "px";
+ }
+ };
+
+ this.onmouseout = function(){
+ $(tooltip).css('display', 'none');
+ };
+ });
+ };
+
+ // SHOW A TOOLTIP AFTER VISITOR CLICKS THE ADD-TO-CART BUTTON
+ // IN CASE THE CART IS OFF SCREEN
+ $('.jcart input[name="<?php echo
$item_add;?>"]').jcartTooltip({content: '<?php echo
$jcart['text']['item_added_message'];?>', fadeIn: 500, fadeOut: 350 });
+
+ // HIDE THE UPDATE AND EMPTY BUTTONS SINCE THESE ARE ONLY USED WHEN
JAVASCRIPT IS DISABLED
+ $('.jcart-hide').remove();
+
+ // DETERMINE IF THIS IS THE CHECKOUT PAGE BY CHECKING FOR HIDDEN INPUT
VALUE
+ // SENT VIA AJAX REQUEST TO jcart.php WHICH DECIDES WHETHER TO DISPLAY
THE CART CHECKOUT BUTTON OR THE PAYPAL CHECKOUT BUTTON BASED ON ITS VALUE
+ // WE NORMALLY CHECK AGAINST REQUEST URI BUT AJAX UPDATE SETS VALUE TO
jcart-relay.php
+ var isCheckout = $('#jcart-is-checkout').val();
+
+ // IF THIS IS NOT THE CHECKOUT THE HIDDEN INPUT DOESN'T EXIST AND NO
VALUE IS SET
+ if (isCheckout !== 'true') { isCheckout = 'false'; }
+
+
+ // WHEN AN ADD-TO-CART FORM IS SUBMITTED
+ $('form.jcart').submit(function(){
+
+ // GET INPUT VALUES FOR USE IN AJAX POST
+ var itemId = $(this).find('input[name=<?php echo
$jcart['item_id']?>]').val();
+ var itemPrice = $(this).find('input[name=<?php echo
$jcart['item_price']?>]').val();
+ var itemName = $(this).find('input[name=<?php echo
$jcart['item_name']?>]').val();
+ var itemQty = $(this).find('input[name=<?php echo
$jcart['item_qty']?>]').val();
+ var itemAdd = $(this).find('input[name=<?php echo
$jcart['item_add']?>]').val();
+
+ // SEND ITEM INFO VIA POST TO INTERMEDIATE SCRIPT WHICH CALLS jcart.php
AND RETURNS UPDATED CART HTML
+ $.post('<?php echo WP_PLUGIN_URL;?>/jcart/jcart-relay.php', { "<?php
echo $jcart['item_id']?>": itemId, "<?php echo $jcart['item_price']?>":
itemPrice, "<?php echo $jcart['item_name']?>": itemName, "<?php echo
$jcart['item_qty']?>": itemQty, "<?php echo $jcart['item_add']?>" : itemAdd
}, function(data) {
+
+ // REPLACE EXISTING CART HTML WITH UPDATED CART HTML
+ $('#jcart').html(data);
+ $('.jcart-hide').remove();
+
+ });
+
+ // PREVENT DEFAULT FORM ACTION
+ return false;
+
+ });
+
+
+ // WHEN THE VISITOR HITS THEIR ENTER KEY
+ // THE UPDATE AND EMPTY BUTTONS ARE ALREADY HIDDEN
+ // BUT THE VISITOR MAY UPDATE AN ITEM QTY, THEN HIT THEIR ENTER KEY
BEFORE FOCUSING ON ANOTHER ELEMENT
+ // THIS MEANS WE'D HAVE TO UPDATE THE ENTIRE CART RATHER THAN JUST THE
ITEM WHOSE QTY HAS CHANGED
+ // PREVENT ENTER KEY FROM SUBMITTING FORM SO USER MUST CLICK CHECKOUT OR
FOCUS ON ANOTHER ELEMENT WHICH TRIGGERS CHANGE FUNCTION BELOW
+ $('#jcart').keydown(function(e) {
+
+ // IF ENTER KEY
+ if (e.which == 13) {
+
+ // PREVENT DEFAULT ACTION
+ return false;
+ }
+ });
+
+
+ // JQUERY live METHOD MAKES FUNCTIONS BELOW AVAILABLE TO ELEMENTS ADDED
DYNAMICALLY VIA AJAX
+
+
+ // WHEN A REMOVE LINK IS CLICKED
+ $('#jcart a').live('click', function(){
+
+ // GET THE QUERY STRING OF THE LINK THAT WAS CLICKED
+ var queryString = $(this).attr('href');
+ queryString = queryString.split('=');
+
+ // THE ID OF THE ITEM TO REMOVE
+ var removeId = queryString[1];
+
+ // SEND ITEM ID VIA GET TO INTERMEDIATE SCRIPT WHICH CALLS jcart.php
AND RETURNS UPDATED CART HTML
+ $.get('<?php echo WP_PLUGIN_URL;?>/jcart/jcart-relay.php',
{ "jcart_remove": removeId, "jcart_is_checkout": isCheckout },
+ function(data) {
+
+ // REPLACE EXISTING CART HTML WITH UPDATED CART HTML
+ $('#jcart').html(data);
+ $('.jcart-hide').remove();
+ });
+
+ // PREVENT DEFAULT LINK ACTION
+ return false;
+ });
+
+
+ // WHEN AN ITEM QTY CHANGES
+ // CHANGE EVENT IS NOT CURRENTLY SUPPORTED BY LIVE METHOD
+ // STILL WORKS IN MOST BROWSERS, BUT NOT INTERNET EXPLORER
+ // INSTEAD WE SIMULATE THE CHANGE EVENT USING KEYUP AND SET A DELAY
BEFORE UPDATING THE CART
+ $('#jcart input[type="text"]').live('keyup', function(){
+
+ // GET ITEM ID FROM THE ITEM QTY INPUT ID VALUE, FORMATTED AS
jcart-item-id-n
+ var updateId = $(this).attr('id');
+ updateId = updateId.split('-');
+
+ // THE ID OF THE ITEM TO UPDATE
+ updateId = updateId[3];
+
+ // GET THE NEW QTY
+ var updateQty = $(this).val();
+
+ // AS LONG AS THE VISITOR HAS ENTERED A QTY
+ if (updateQty !== '')
+ {
+ // UPDATE THE CART ONE SECOND AFTER KEYUP
+ var updateDelay = setTimeout(function(){
+
+ // SEND ITEM INFO VIA POST TO INTERMEDIATE SCRIPT WHICH CALLS
jcart.php AND RETURNS UPDATED CART HTML
+ $.post('<?php echo WP_PLUGIN_URL;?>/jcart/jcart-relay.php',
{ "item_id": updateId, "item_qty": updateQty, "jcart_update_item": '<?php
echo $jcart['text']['update_button'];?>', "jcart_is_checkout": isCheckout
}, function(data) {
+
+ // REPLACE EXISTING CART HTML WITH UPDATED CART HTML
+ $('#jcart').html(data);
+ $('.jcart-hide').remove();
+ });
+
+ }, 1000);
+ }
+
+ // IF THE VISITOR PRESSES ANOTHER KEY BEFORE THE TIMER HAS EXPIRED,
CLEAR THE TIMER
+ // THE NEW KEYDOWN RESULTS IN A NEW KEYUP, TRIGGERING THE KEYUP
FUNCTION AGAIN AND RESETTING THE TIMER
+ // REPEATS UNTIL THE USER DOES NOT PRESS A KEY BEFORE THE TIMER EXPIRES
IN WHICH CASE THE AJAX POST IS EXECUTED
+ // THIS PREVENTS THE CART FROM BEING UPDATED ON EVERY KEYSTROKE
+ $(this).keydown(function(){
+ window.clearTimeout(updateDelay);
+ });
+ });
+ }); // END THE DOCUMENT READY FUNCTION
+ })(jQuery);
+
+
+
+
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart-relay.php Sat Dec 4
13:38:22 2010
@@ -0,0 +1,21 @@
+<?php
+
+// JCART v1.2
+// http://conceptlogic.com/jcart/
+
+// THIS FILE TAKES INPUT FROM AJAX REQUESTS VIA JQUERY post AND get
METHODS, THEN PASSES DATA TO JCART
+// RETURNS UPDATED CART HTML BACK TO SUBMITTING PAGE
+
+// INCLUDE JCART BEFORE SESSION START
+include_once 'jcart.php';
+
+// START SESSION
+session_start();
+
+// INITIALIZE JCART AFTER SESSION START
+$cart =& $_SESSION['jcart']; if (!is_object($cart)) $cart = new jcart();
+
+// PROCESS INPUT AND RETURN UPDATED CART HTML
+$cart->display_cart($jcart);
+
+?>
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart.css Sat Dec 4 13:38:22 2010
@@ -0,0 +1,41 @@
+/*JCART v1.2
+http://conceptlogic.com/jcart/*/
+
+
+#jcart * { margin:0; padding:0; font-family:arial, tahoma, verdana,
sans-serif; color:#000; }
+#jcart, #jcart input, #jcart-tooltip { font-size:12px; }
+
+#jcart fieldset { border:0; }
+
+#jcart table { width:100%; border:0; background:#fff;
border-collapse:collapse; }
+#jcart tr { }
+#jcart th, #jcart td { padding:5px; border:0; border:solid 1px #ccc;
vertical-align:top; text-align:left; font-weight:normal; }
+#jcart td.empty { text-align:center; }
+
+#jcart p.jcart-error { text-align:center; padding:5px; }
+
+#jcart strong#jcart-title { }
+
+#jcart th { background:#ccffcc }
+#jcart th#header { }
+#jcart th#footer { }
+
+#jcart td.jcart-item-qty { width:25%; }
+#jcart td.jcart-item-name { width:50%; font-weight:bold; }
+#jcart td.jcart-item-price { width:25%; font-weight:bold;
text-align:right; }
+#jcart td.jcart-item-price span { display:block; }
+
+#jcart a.jcart-remove { font-size:11px; font-weight:normal; }
+
+#jcart span#jcart-subtotal { display:block; }
+#jcart span#jcart-subtotal strong { }
+
+#jcart input.jcart-button { padding:2px; margin:2px;}
+
+#jcart input#jcart-checkout { float:right; }
+
+#jcart input#jcart-checkout-paypal { display:block; padding:10px;
margin:20px auto; }
+
+#jcart-tooltip { color:#000; border:solid 1px #000; padding:3px 7px 3px
25px; background:url(checkmark.png) 3px center no-repeat #f2fcee;
z-index:10000; }
+
+
=======================================
--- /dev/null
+++ /svn/trunk/reamus/shoppingcart/jcart/jcart.php Sat Dec 4 13:38:22 2010
@@ -0,0 +1,510 @@
+<?php
+
+// JCART v1.2
+// http://conceptlogic.com/jcart/
+
+// SESSION BASED SHOPPING CART CLASS FOR JCART
+
+/**********************************************************************
+Based on Webforce Cart v.1.5
+(c) 2004-2005 Webforce Ltd, NZ
+http://www.webforce.co.nz/cart/
+**********************************************************************/
+
+// USER CONFIG
+include_once('jcart-config.php');
+
+// DEFAULT CONFIG VALUES
+include_once('jcart-defaults.php');
+
+// JCART
+class jcart {
+ var $total = 0;
+ var $itemcount = 0;
+ var $items = array();
+ var $itemprices = array();
+ var $itemqtys = array();
+ var $itemnames = array();
+
+ // CONSTRUCTOR FUNCTION
+ function cart() {}
+
+ // GET CART CONTENTS
+ function get_contents()
+ {
+ $items = array();
+ foreach($this->items as $tmp_item)
+ {
+ $item = FALSE;
+
+ $item['id'] = $tmp_item;
+ $item['qty'] = $this->itemqtys[$tmp_item];
+ $item['price'] = $this->itemprices[$tmp_item];
+ $item['name'] = $this->itemnames[$tmp_item];
+ $item['subtotal'] = $item['qty'] * $item['price'];
+ $items[] = $item;
+ }
+ return $items;
+ }
+
+
+ // ADD AN ITEM
+ function add_item($item_id, $item_qty=1, $item_price, $item_name)
+ {
+
+ // VALIDATION
+ $valid_item_qty = $valid_item_price = false;
+
+ // IF THE ITEM QTY IS AN INTEGER, OR ZERO
+ if (preg_match("/^[0-9-]+$/i", $item_qty))
+ {
+ $valid_item_qty = true;
+ }
+ // IF THE ITEM PRICE IS A FLOATING POINT NUMBER
+ if (is_numeric($item_price))
+ {
+ $valid_item_price = true;
+ }
+
+ // ADD THE ITEM
+ if ($valid_item_qty !== false && $valid_item_price !== false)
+ {
+ // IF THE ITEM IS ALREADY IN THE CART, INCREASE THE QTY
+ if (($this->itemqtys[$item_id] > 0) && ($this->itemnames[$item_id] ==
$item_name))
+ {
+ $this->itemqtys[$item_id] = $item_qty + $this->itemqtys[$item_id];
+ $this->_update_total();
+ }
+ // THIS IS A NEW ITEM
+ else
+ {
+ $this->items[] = $item_id;
+ $this->itemqtys[$item_id] = $item_qty;
+ $this->itemprices[$item_id] = $item_price;
+ $this->itemnames[$item_id] = $item_name;
+ }
+ $this->_update_total();
+ return true;
+ }
+
+ else if ($valid_item_qty !== true)
+ {
+ $error_type = 'qty';
+ return $error_type;
+ }
+ else if ($valid_item_price !== true)
+ {
+ $error_type = 'price';
+ return $error_type;
+ }
+ }
+
+
+ // UPDATE AN ITEM
+ function update_item($item_id, $item_qty)
+ {
+ // IF THE ITEM QTY IS AN INTEGER, OR ZERO
+ // UPDATE THE ITEM
+ if (preg_match("/^[0-9-]+$/i", $item_qty))
+ {
+ if ($item_qty < 1)
+ {
+ $this->del_item($item_id);
+ }
+ else
+ {
+ $this->itemqtys[$item_id] = $item_qty;
+ }
+ $this->_update_total();
+ return true;
+ }
+ }
+
+
+ // UPDATE THE ENTIRE CART
+ // VISITOR MAY CHANGE MULTIPLE FIELDS BEFORE CLICKING UPDATE
+ // ONLY USED WHEN JAVASCRIPT IS DISABLED
+ // WHEN JAVASCRIPT IS ENABLED, THE CART IS UPDATED ONKEYUP
+ function update_cart()
+ {
+ // POST VALUE IS AN ARRAY OF ALL ITEM IDs IN THE CART
+ if (is_array($_POST['jcart_item_ids']))
+ {
+ // TREAT VALUES AS A STRING FOR VALIDATION
+ $item_ids = implode($_POST['jcart_item_ids']);
+ }
+
+ // POST VALUE IS AN ARRAY OF ALL ITEM QUANTITIES IN THE CART
+ if (is_array($_POST['jcart_item_qty']))
+ {
+ // TREAT VALUES AS A STRING FOR VALIDATION
+ $item_qtys = implode($_POST['jcart_item_qty']);
+ }
+
+ // IF NO ITEM IDs, THE CART IS EMPTY
+ if ($_POST['jcart_item_id'])
+ {
+ // IF THE ITEM QTY IS AN INTEGER, OR ZERO, OR EMPTY
+ // UPDATE THE ITEM
+ if (preg_match("/^[0-9-]+$/i", $item_qtys) || $item_qtys == '')
+ {
+ // THE INDEX OF THE ITEM AND ITS QUANTITY IN THEIR RESPECTIVE ARRAYS
+ $count = 0;
+
+ // FOR EACH ITEM IN THE CART
+ foreach ($_POST['jcart_item_id'] as $item_id)
+ {
+ // GET THE ITEM QTY AND DOUBLE-CHECK THAT THE VALUE IS AN INTEGER
+ $update_item_qty = intval($_POST['jcart_item_qty'][$count]);
+
+ if ($update_item_qty < 1)
+ {
+ $this->del_item($item_id);
+ }
+ else
+ {
+ // UPDATE THE ITEM
+ $this->update_item($item_id, $update_item_qty);
+ }
+
+ // INCREMENT INDEX FOR THE NEXT ITEM
+ $count++;
+ }
+ return true;
+ }
+ }
+ // IF NO ITEMS IN THE CART, RETURN TRUE TO PREVENT UNNECSSARY ERROR
MESSAGE
+ else if (!$_POST['jcart_item_id'])
+ {
+ return true;
+ }
+ }
+
+
+ // REMOVE AN ITEM
+ /*
+ GET VAR COMES FROM A LINK, WITH THE ITEM ID TO BE REMOVED IN ITS QUERY
STRING
+ AFTER AN ITEM IS REMOVED ITS ID STAYS SET IN THE QUERY STRING, PREVENTING
THE SAME ITEM FROM BEING ADDED BACK TO THE CART
+ SO WE CHECK TO MAKE SURE ONLY THE GET VAR IS SET, AND NOT THE POST VARS
+
+ USING POST VARS TO REMOVE ITEMS DOESN'T WORK BECAUSE WE HAVE TO PASS THE
ID OF THE ITEM TO BE REMOVED AS THE VALUE OF THE BUTTON
+ IF USING AN INPUT WITH TYPE SUBMIT, ALL BROWSERS DISPLAY THE ITEM ID,
INSTEAD OF ALLOWING FOR USER FRIENDLY TEXT SUCH AS 'remove'
+ IF USING AN INPUT WITH TYPE IMAGE, INTERNET EXPLORER DOES NOT SUBMIT THE
VALUE, ONLY X AND Y COORDINATES WHERE BUTTON WAS CLICKED
+ CAN'T USE A HIDDEN INPUT EITHER SINCE THE CART FORM HAS TO ENCOMPASS ALL
ITEMS TO RECALCULATE TOTAL WHEN A QUANTITY IS CHANGED, WHICH MEANS THERE
ARE MULTIPLE REMOVE BUTTONS AND NO WAY TO ASSOCIATE THEM WITH THE CORRECT
HIDDEN INPUT
+ */
+ function del_item($item_id)
+ {
+ $ti = array();
+ $this->itemqtys[$item_id] = 0;
+ foreach($this->items as $item)
+ {
+ if ($item != $item_id)
+ {
+ $ti[] = $item;
+ }
+ }
+ $this->items = $ti;
+ $this->_update_total();
+ }
+
+
+ // EMPTY THE CART
+ function empty_cart()
+ {
+ $this->total = 0;
+ $this->itemcount = 0;
+ $this->items = array();
+ $this->itemprices = array();
+ $this->itemqtys = array();
+ $this->itemnames = array();
+ }
+
+
+ // INTERNAL FUNCTION TO RECALCULATE TOTAL
+ function _update_total()
+ {
+ $this->itemcount = 0;
+ $this->total = 0;
+ if (sizeof($this->items > 0))
+ {
+ foreach($this->items as $item)
+ {
+ $this->total = $this->total + ($this->itemprices[$item] *
$this->itemqtys[$item]);
+
+ // TOTAL ITEMS IN CART (ORIGINAL wfCart COUNTED TOTAL NUMBER OF LINE
ITEMS)
+ $this->itemcount += $this->itemqtys[$item];
+ }
+ }
+ }
+
+
+ // PROCESS AND DISPLAY CART
+ function display_cart($jcart)
+ {
+ // JCART ARRAY HOLDS USER CONFIG SETTINGS
+ extract($jcart);
+
+ // ASSIGN USER CONFIG VALUES AS POST VAR LITERAL INDICES
+ // INDICES ARE THE HTML NAME ATTRIBUTES FROM THE USERS ADD-TO-CART FORM
+ $item_id = $_POST[$item_id];
+ $item_qty = $_POST[$item_qty];
+ $item_price = $_POST[$item_price];
+ $item_name = $_POST[$item_name];
+
+ // ADD AN ITEM
+ if ($_POST[$item_add])
+ {
+
+ $item_added = $this->add_item($item_id, $item_qty, $item_price,
$item_name);
+ // IF NOT TRUE THE ADD ITEM FUNCTION RETURNS THE ERROR TYPE
+ if ($item_added !== true)
+ {
+ $error_type = $item_added;
+ switch($error_type)
+ {
+ case 'qty':
+ $error_message = $text['quantity_error'];
+ break;
+ case 'price':
+ $error_message = $text['price_error'];
+ break;
+ }
+ }
+ }
+
+ // UPDATE A SINGLE ITEM
+ // CHECKING POST VALUE AGAINST $text ARRAY FAILS?? HAVE TO CHECK AGAINST
$jcart ARRAY
+ if ($_POST['jcart_update_item'] == $jcart['text']['update_button'])
+ {
+ $item_updated = $this->update_item($_POST['item_id'],
$_POST['item_qty']);
+ if ($item_updated !== true)
+ {
+ $error_message = $text['quantity_error'];
+ }
+ }
+
+ // UPDATE ALL ITEMS IN THE CART
+ if ($_POST['jcart_update_cart'] || $_POST['jcart_checkout'])
+ {
+ $cart_updated = $this->update_cart();
+ if ($cart_updated !== true)
+ {
+ $error_message = $text['quantity_error'];
+ }
+ }
+
+ // REMOVE AN ITEM
+ if ($_GET['jcart_remove'] && !$_POST[$item_add]
&& !$_POST['jcart_update_cart'] && !$_POST['jcart_check_out'])
+ {
+ $this->del_item($_GET['jcart_remove']);
+ }
+
+ // EMPTY THE CART
+ if ($_POST['jcart_empty'])
+ {
+ $this->empty_cart();
+ }
+
+ // DETERMINE WHICH TEXT TO USE FOR THE NUMBER OF ITEMS IN THE CART
+ if ($this->itemcount >= 0)
+ {
+ $text['items_in_cart'] = $text['multiple_items'];
+ }
+ if ($this->itemcount == 1)
+ {
+ $text['items_in_cart'] = $text['single_item'];
+ }
+
+ // DETERMINE IF THIS IS THE CHECKOUT PAGE
+ // WE FIRST CHECK THE REQUEST URI AGAINST THE USER CONFIG CHECKOUT (SET
WHEN THE VISITOR FIRST CLICKS CHECKOUT)
+ // WE ALSO CHECK FOR THE REQUEST VAR SENT FROM HIDDEN INPUT SENT BY AJAX
REQUEST (SET WHEN VISITOR HAS JAVASCRIPT ENABLED AND UPDATES AN ITEM QTY)
+ $is_checkout = strpos($_SERVER['REQUEST_URI'], $form_action);
+ if ($is_checkout !== false || $_REQUEST['jcart_is_checkout'] == 'true')
+ {
+ $is_checkout = true;
+ }
+ else
+ {
+ $is_checkout = false;
+ }
+
+ // OVERWRITE THE CONFIG FORM ACTION TO POST TO jcart-gateway.php INSTEAD
OF POSTING BACK TO CHECKOUT PAGE
+ // THIS ALSO ALLOWS US TO VALIDATE PRICES BEFORE SENDING CART CONTENTS
TO PAYPAL
+ if ($is_checkout == true)
+ {
+ $form_action = WP_PLUGIN_URL . '/jcart/jcart-gateway.php';
+ }
+ else
+ {
+ $form_action = '/' . $form_action;
+ }
+
+ // IF THIS ERROR IS TRUE THE VISITOR UPDATED THE CART FROM THE CHECKOUT
PAGE USING AN INVALID PRICE FORMAT
+ // PASSED AS A SESSION VAR SINCE THE CHECKOUT PAGE USES A HEADER REDIRECT
+ // IF PASSED VIA GET THE QUERY STRING STAYS SET EVEN AFTER SUBSEQUENT
POST REQUESTS
+ if ($_SESSION['quantity_error'] == true)
+ {
+ $error_message = $text['quantity_error'];
+ unset($_SESSION['quantity_error']);
+ }
+
+ // SET CURRENCY SYMBOL BASED ON SELECTED CURRENCY CODE
+ switch($paypal_currency)
+ {
+ case 'EUR':
+ $text['currency_symbol'] = '&#128;';
+ break;
+ case 'GBP':
+ $text['currency_symbol'] = '&#163;';
+ break;
+ case 'JPY':
+ $text['currency_symbol'] = '&#165;';
+ break;
+ case 'CHF':
+ $text['currency_symbol'] = 'CHF&nbsp;';
+ break;
+ case 'SEK':
+ case 'DKK':
+ case 'NOK':
+ $text['currency_symbol'] = 'Kr&nbsp;';
+ break;
+ case 'PLN':
+ $text['currency_symbol'] = 'z&#322;&nbsp;';
+ break;
+ case 'HUF':
+ $text['currency_symbol'] = 'Ft&nbsp;';
+ break;
+ case 'CZK':
+ $text['currency_symbol'] = 'K&#269;&nbsp;';
+ break;
+ case 'ILS':
+ $text['currency_symbol'] = '&#8362;&nbsp;';
+ break;
+ case 'AUD':
+ case 'CAD':
+ case 'USD':
+ case 'NZD':
+ case 'HKD':
+ case 'SGD':
+ case 'MXN':
+ default:
+ $text['currency_symbol'] = '$';
+ break;
+ }
+
+ // OUTPUT THE CART
+
+ // IF THERE'S AN ERROR MESSAGE WRAP IT IN SOME HTML
+ if ($error_message)
+ {
+ $error_message = "<p class='jcart-error'>$error_message</p>";
+ }
+
+ // DISPLAY THE CART HEADER
+ echo "\t$error_message\n";
+ echo "\t<form method='post' action='$form_action'>\n";
+ echo "\t\t<fieldset>\n";
+ echo "\t\t\t<table border='1'>\n";
+ echo "\t\t\t\t<tr>\n";
+ echo "\t\t\t\t\t<th id='jcart-header' colspan='3'>\n";
+ echo "\t\t\t\t\t\t<strong id='jcart-title'>" .
$text['cart_title'] . "</strong> (" . $this->itemcount . "&nbsp;" .
$text['items_in_cart'] .")\n";
+ echo "\t\t\t\t\t</th>\n";
+ echo "\t\t\t\t</tr>". "\n";
+
+ // IF ANY ITEMS IN THE CART
+ if ($this->itemcount > 0)
+ {
+
+ // DISPLAY LINE ITEMS
+ foreach($this->get_contents() as $item)
+ {
+ echo "\t\t\t\t<tr>\n";
+
+ // ADD THE ITEM ID AS THE INPUT ID ATTRIBUTE
+ // THIS ALLOWS US TO ACCESS THE ITEM ID VIA JAVASCRIPT ON QTY CHANGE,
AND THEREFORE UPDATE THE CORRECT ITEM
+ // NOTE THAT THE ITEM ID IS ALSO PASSED AS A SEPARATE FIELD FOR
PROCESSING VIA PHP
+ echo "\t\t\t\t\t<td class='jcart-item-qty'>\n";
+ echo "\t\t\t\t\t\t<input type='text' size='2' id='jcart-item-id-" .
$item['id'] . "' name='jcart_item_qty[ ]' value='" . $item['qty'] . "'
/>\n";
+ echo "\t\t\t\t\t</td>\n";
+ echo "\t\t\t\t\t<td class='jcart-item-name'>\n";
+ echo "\t\t\t\t\t\t" . $item['name'] . "<input type='hidden'
name='jcart_item_name[ ]' value='" . $item['name'] . "' />\n";
+ echo "\t\t\t\t\t\t<input type='hidden' name='jcart_item_id[ ]'
value='" . $item['id'] . "' />\n";
+ echo "\t\t\t\t\t</td>\n";
+ echo "\t\t\t\t\t<td class='jcart-item-price'>\n";
+ echo "\t\t\t\t\t\t<span>" . $text['currency_symbol'] .
number_format($item['subtotal'],2) . "</span><input type='hidden'
name='jcart_item_price[ ]' value='" . $item['price'] . "' />\n";
+ echo "\t\t\t\t\t\t<a class='jcart-remove' href='?jcart_remove=" .
$item['id'] . "'>" . $text['remove_link'] . "</a>\n";
+ echo "\t\t\t\t\t</td>\n";
+ echo "\t\t\t\t</tr>\n";
+ }
+ }
+
+ // THE CART IS EMPTY
+ else
+ {
+ echo "\t\t\t\t<tr><td colspan='3' class='empty'>" .
$text['empty_message'] . "</td></tr>\n";
+ }
+
+ // DISPLAY THE CART FOOTER
+ echo "\t\t\t\t<tr>\n";
+ echo "\t\t\t\t\t<th id='jcart-footer' colspan='3'>\n";
+
+ // DEFAULT INPUT TYPE
+ // CAN BE OVERRIDDEN IF USER SETS PATHS FOR BUTTON IMAGES
+ $input_type['checkout'] = $input_type['update'] = $input_type['empty'] =
$input_type['checkout_paypal'] = 'submit';
+
+ // IF THIS IS THE CHECKOUT HIDE THE CART CHECKOUT BUTTON
+ if ($is_checkout !== true)
+ {
+ if ($button['checkout']) { $input_type['checkout'] = 'image';
$src['checkout'] = ' src="' . $button['checkout'] . '" alt="' .
$text['checkout_button'] . '" title="" '; }
+ echo "\t\t\t\t\t\t<input type='" . $input_type['checkout'] . "' " .
$src['checkout'] . "id='jcart-checkout' name='jcart_checkout'
class='jcart-button' value='" . $text['checkout_button'] . "' />\n";
+ }
+
+ echo "\t\t\t\t\t\t<span id='jcart-subtotal'>" . $text['subtotal'] . ":
<strong>" . $text['currency_symbol'] .
number_format($this->total,2) . "</strong></span>\n";
+ echo "\t\t\t\t\t</th>\n";
+ echo "\t\t\t\t</tr>\n";
+ echo "\t\t\t</table>\n\n";
+
+ echo "\t\t\t<div class='jcart-hide'>\n";
+
+ if ($button['update']) { $input_type['update'] = 'image'; $src['update']
= ' src="' . $button['update'] . '" alt="' . $text['update_button'] . '"
title="" '; }
+ echo "\t\t\t\t<input type='" . $input_type['update'] . "' " .
$src['update'] ."name='jcart_update_cart' value='" .
$text['update_button'] . "' class='jcart-button' />\n";
+
+ if ($button['empty']) { $input_type['empty'] = 'image'; $src['empty']
= ' src="' . $button['empty'] . '" alt="' . $text['empty_button'] . '"
title="" '; }
+ echo "\t\t\t\t<input type='" . $input_type['empty'] . "' " .
$src['empty'] ."name='jcart_empty' value='" . $text['empty_button'] . "'
class='jcart-button' />\n";
+
+ echo "\t\t\t</div>\n";
+
+ // IF THIS IS THE CHECKOUT DISPLAY THE PAYPAL CHECKOUT BUTTON
+ if ($is_checkout == true)
+ {
+ // HIDDEN INPUT ALLOWS US TO DETERMINE IF WE'RE ON THE CHECKOUT PAGE
+ // WE NORMALLY CHECK AGAINST REQUEST URI BUT AJAX UPDATE SETS VALUE TO
jcart-relay.php
+ echo "\t\t\t<input type='hidden' id='jcart-is-checkout'
name='jcart_is_checkout' value='true' />\n";
+
+ // SEND THE URL OF THE CHECKOUT PAGE TO jcart-gateway.php
+ // WHEN JAVASCRIPT IS DISABLED WE USE A HEADER REDIRECT AFTER THE
UPDATE OR EMPTY BUTTONS ARE CLICKED
+ $protocol = 'http://'; if (!empty($_SERVER['HTTPS'])) { $protocol
= 'https://'; }
+ echo "\t\t\t<input type='hidden' id='jcart-checkout-page'
name='jcart_checkout_page' value='" . $protocol . $_SERVER['HTTP_HOST'] .
$_SERVER['REQUEST_URI'] . "' />\n";
+
+ // IF THE CART IS EMPTY
+ if ($this->itemcount < 1)
+ {
+ // DISABLE PAYPAL CHECKOUT
+ $disable_paypal_checkout = ' disabled="disabled" ';
+ }
+
+ // PAYPAL CHECKOUT BUTTON
+ if ($button['checkout_paypal']) { $input_type['checkout_paypal']
= 'image'; $src['checkout_paypal'] = ' src="' .
$button['checkout_paypal'] . '" alt="' .
$text['checkout_paypal_button'] . '" title="" '; }
+ echo "\t\t\t<input type='" . $input_type['checkout_paypal'] . "' " .
$src['checkout_paypal'] ."id='jcart-checkout-paypal'
name='jcart_checkout_paypal' value='" .
$text['checkout_paypal_button'] . "'" . $disable_paypal_checkout . " />\n";
+ }
+ echo "\t\t</fieldset>\n";
+ echo "\t</form>\n";
+
+ // IF UPDATING AN ITEM, FOCUS ON ITS QTY INPUT AFTER THE CART IS LOADED
(DOESN'T SEEM TO WORK IN IE7, OR IE8)
+ if ($_POST['jcart_update_item'])
+ {
+ echo "\t" . '<script
type="text/javascript">$(function(){$("#jcart-item-id-' .
$_POST['item_id'] . '").focus()});</script>' . "\n";
+ }
+ }
+ }
+?>

Reply all
Reply to author
Forward
0 new messages