Index: openacs-4/packages/ecommerce/ecommerce.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/ecommerce.info,v
diff -u -r1.52 -r1.53
--- openacs-4/packages/ecommerce/ecommerce.info	13 Oct 2010 09:59:24 -0000	1.52
+++ openacs-4/packages/ecommerce/ecommerce.info	15 Oct 2010 05:25:32 -0000	1.53
@@ -7,7 +7,7 @@
     <initial-install-p>f</initial-install-p>
     <singleton-p>t</singleton-p>
     
-    <version name="5.17" url="http://openacs.org/repository/download/apm/ecommerce-5.17.apm">
+    <version name="5.18" url="http://openacs.org/repository/download/apm/ecommerce-5.18.apm">
         <owner url="mailto:janine@furfly.net">Janine Sisk</owner>
         <owner url="mailto:bart.teeuwisse@7-sisters.com">Bart Teeuwisse</owner>
         <owner url="mailto:alfred@thunderstick.com">Alfred Werner</owner>
@@ -17,7 +17,7 @@
         <description format="text/plain">This module implements a standard business-to-consumer Web store service. A feature summary is included with the documentaion.</description>
         <maturity>0</maturity>
 
-        <provides url="ecommerce" version="5.17"/>
+        <provides url="ecommerce" version="5.18"/>
         <requires url="acs-datetime" version="4.0"/>
         <requires url="acs-kernel" version="5.0"/>
         <requires url="ref-countries" version="0.1d"/>
@@ -92,7 +92,8 @@
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="UserClassUserViewP"  default="1" description="whether users can see what user classes they are in" section_name="display"/>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="WeightUnits"  default="lbs" description="weight units such as pounds, carats, ounces, etc. If using PayPal, must comply with PayPal choices." section_name="units"/>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="PayPalBusiness"  default="" description="email associated with paypal account." section_name="PayPal"/>
-            <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="PayPalStandardMode"  default="0" description="PayPal Standard mode: 0 = not used, 1 = shipping by weight, 2 = shipping calculated by price, 3 = custom shipping (as a line item)." section_name="PayPal"/>
+            <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="PayPalBusinessRef"  default="" description="PayPal Secure Merchant Account ID for building forms/buttons with paypal account." section_name="PayPal"/>
+            <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="PayPalStandardMode"  default="0" description="PayPal Standard mode: 0 = not used, 1 = shipping by weight, 2 = shipping calculated by price, 3 = custom shipping (as a line item), 5 = use PayPal AddtoCart and ViewCart buttons" section_name="PayPal"/>
         </parameters>
 
     </version>
Index: openacs-4/packages/ecommerce/lib/toolbar.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/lib/toolbar.adp,v
diff -u -r1.2 -r1.3
--- openacs-4/packages/ecommerce/lib/toolbar.adp	10 Aug 2008 10:53:36 -0000	1.2
+++ openacs-4/packages/ecommerce/lib/toolbar.adp	15 Oct 2010 05:25:32 -0000	1.3
@@ -2,7 +2,18 @@
     [&nbsp;<a href="@ec_gift_cert_order_link@">gift certificates</a>&nbsp;] 
  </if>
  <if @current_location@ ne "shopping-cart"> 
+  <if @use_paypal_shopping_cart_p@ true>
+    [&nbsp;
+<form name="_xclick" target="paypal" action="https://www.paypal.com/us/cgi-bin/webscr" method="post">
+<input type="hidden" name="cmd" value="_cart">
+<input type="hidden" name="business" value="@paypal_business_ref@">
+<input type="image" src="https://www.paypal.com/en_US/i/btn/view_cart_new.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
+<input type="hidden" name="display" value="1">
+</form>
+ &nbsp;]
+  </if><else>
     [&nbsp;<a href="@ec_cart_link@" title="View the contents of your shopping cart">shopping cart</a>&nbsp;]
+  </else>
  </if>
  <if @current_location@ ne "your-account"> 
     [&nbsp;<a href="@ec_account_link@" title="View your @ec_system_name@ account">your @ec_system_name@ account</a>&nbsp;]
Index: openacs-4/packages/ecommerce/lib/toolbar.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/lib/toolbar.tcl,v
diff -u -r1.2 -r1.3
--- openacs-4/packages/ecommerce/lib/toolbar.tcl	10 Aug 2008 10:53:36 -0000	1.2
+++ openacs-4/packages/ecommerce/lib/toolbar.tcl	15 Oct 2010 05:25:32 -0000	1.3
@@ -19,3 +19,14 @@
 
 # Check if gift certificates can be bought.
 set gift_certificates_are_allowed [parameter::get -package_id [ec_id] -parameter SellGiftCertificatesP -default 0]
+
+set paypal_standard_mode [parameter::get -parameter PayPalStandardMode]
+set user_session_id [ec_get_user_session_id]
+set n_items_in_cart [db_string get_n_items "select count(*) from ec_orders o, ec_items i
+    where o.order_id=i.order_id and o.user_session_id=:user_session_id and o.order_state='in_basket'"]
+if { $paypal_standard_mode == 5 && $n_items_in_cart == 0 } {            
+    set paypal_business_ref [parameter::get -parameter PayPalBusinessRef]
+    set use_paypal_shopping_cart_p 1
+} else {
+    set use_paypal_shopping_cart_p 0
+}
\ No newline at end of file
Index: openacs-4/packages/ecommerce/tcl/ecommerce-procs-postgresql.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/tcl/ecommerce-procs-postgresql.xql,v
diff -u -r1.12 -r1.13
--- openacs-4/packages/ecommerce/tcl/ecommerce-procs-postgresql.xql	28 Aug 2003 09:41:53 -0000	1.12
+++ openacs-4/packages/ecommerce/tcl/ecommerce-procs-postgresql.xql	15 Oct 2010 05:25:32 -0000	1.13
@@ -51,7 +51,7 @@
   <fullquery name="ec_add_to_cart_link.get_product_info_1">      
     <querytext>
       select case when current_timestamp > available_date  then 1 when current_timestamp-available_date is NULL then 1 else 0 end as available_p,
-      color_list, size_list, style_list, no_shipping_avail_p
+      color_list, size_list, style_list, no_shipping_avail_p, product_name, one_line_description, sku, weight, shipping, shipping_additional
       from ec_products
       where product_id = :product_id
     </querytext>
Index: openacs-4/packages/ecommerce/tcl/ecommerce-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/tcl/ecommerce-procs.tcl,v
diff -u -r1.35 -r1.36
--- openacs-4/packages/ecommerce/tcl/ecommerce-procs.tcl	9 May 2009 18:33:10 -0000	1.35
+++ openacs-4/packages/ecommerce/tcl/ecommerce-procs.tcl	15 Oct 2010 05:25:32 -0000	1.36
@@ -574,68 +574,100 @@
 } { 
     Returns cart link 
 } {
-
     db_1row get_product_info_1 "
-	select decode(sign(sysdate-available_date),1,1,null,1,0) as available_p, color_list, size_list, style_list, no_shipping_avail_p
+	select decode(sign(sysdate-available_date),1,1,null,1,0) as available_p, color_list, size_list, style_list, no_shipping_avail_p, product_name, one_line_description, sku, weight, shipping, shipping_additional
 	from ec_products
 	where product_id = :product_id"
 
     if { ![empty_string_p $color_list] } {
-	set color_widget "Color: <select name=color_choice>"
-	foreach color [split $color_list ","] {
-	    append color_widget "<option value=\"[ad_quotehtml $color]\">$color\n"
-	}
-	append color_widget "\n</select>\n<br>\n"
+        set color_widget "Color: <select name=color_choice>"
+        foreach color [split $color_list ","] {
+            append color_widget "<option value=\"[ad_quotehtml $color]\">$color\n"
+        }
+        append color_widget "\n</select>\n<br>\n"
     } else {
-	set color_widget [ec_hidden_input color_choice ""]
+        set color_widget [ec_hidden_input color_choice ""]
     }
-
+    
     if { ![empty_string_p $size_list] } {
-	set size_widget "Size: <select name=size_choice>
+        set size_widget "Size: <select name=size_choice>
 	"
-	foreach size [split $size_list ","] {
-	    append size_widget "<option value=\"[ad_quotehtml $size]\">$size\n"
-	}
-	append size_widget "\n</select>\n<br>\n"
+        foreach size [split $size_list ","] {
+            append size_widget "<option value=\"[ad_quotehtml $size]\">$size\n"
+        }
+        append size_widget "\n</select>\n<br>\n"
     } else {
-	set size_widget [ec_hidden_input size_choice ""]
+        set size_widget [ec_hidden_input size_choice ""]
     }
-
+    
     if { ![empty_string_p $style_list] } {
-	set style_widget "Style: <select name=style_choice>
+        set style_widget "Style: <select name=style_choice>
 	"
-	foreach style [split $style_list ","] {
-	    append style_widget "<option value=\"[ad_quotehtml $style]\">$style\n"
-	}
-	append style_widget "\n</select>\n<br>\n"
+        foreach style [split $style_list ","] {
+            append style_widget "<option value=\"[ad_quotehtml $style]\">$style\n"
+        }
+        append style_widget "\n</select>\n<br>\n"
     } else {
-	set style_widget [ec_hidden_input style_choice ""]
+        set style_widget [ec_hidden_input style_choice ""]
     }
-
+    
     set warnings ""
-
+    
     if { $no_shipping_avail_p == "t" } {
-      append warnings "(This item does not require shipping.)"
+        append warnings "(This item does not require shipping.)"
     }
     
     if { $available_p } {
-	set r "
+        set paypal_standard_mode [parameter::get -parameter PayPalStandardMode]
+        set user_session_id [ec_get_user_session_id]
+        set n_items_in_cart [db_string get_n_items "select count(*) from ec_orders o, ec_items i
+    where o.order_id=i.order_id and o.user_session_id=:user_session_id and o.order_state='in_basket'"]
+        if { $paypal_standard_mode == 5 && $n_items_in_cart == 0 } {            
+            set currency [parameter::get -parameter Currency]
+            set weight_unit [parameter::get -parameter WeightUnits]
+            set paypal_business_ref [parameter::get -parameter PayPalBusinessRef]
+            set user_id [ad_get_user_id]
+            # actual example from paypal.com:
+            set r "<form target=\"paypal\" action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\">
+<input type=\"hidden\" name=\"cmd\" value=\"_cart\">
+<input type=\"hidden\" name=\"business\" value=\"${paypal_business_ref}\">
+<input type=\"hidden\" name=\"lc\" value=\"US\">
+<input type=\"hidden\" name=\"item_name\" value=\"${product_name}\">
+<input type=\"hidden\" name=\"item_number\" value=\"$sku\">
+<input type=\"hidden\" name=\"weight\" value=\"$weight\">
+<input type=\"hidden\" name=\"weight_unit\" value=\"${weight_unit}\">
+<input type=\"hidden\" name=\"shipping\" value=\"$shipping\">
+<input type=\"hidden\" name=\"shipping2\" value=\"${shipping_additional}\">
+<input type=\"hidden\" name=\"amount\" value=\"[lindex [ec_lowest_price_and_price_name_for_an_item $product_id $user_id] 0]\">
+<input type=\"hidden\" name=\"currency_code\" value=\"$currency\">
+<input type=\"hidden\" name=\"button_subtype\" value=\"products\">
+<input type=\"hidden\" name=\"no_note\" value=\"0\">
+<input type=\"hidden\" name=\"cn\" value=\"Add special instructions to the seller\">
+<input type=\"hidden\" name=\"no_shipping\" value=\"2\">
+<input type=\"hidden\" name=\"add\" value=\"1\">
+<input type=\"hidden\" name=\"bn\" value=\"PP-ShopCartBF:btn_cart_LG.gif:NonHosted\">
+<input type=\"image\" src=\"https://www.paypal.com/en_US/i/btn/btn_cart_LG.gif\" border=\"0\" name=\"submit\" alt=\"PayPal - The safer, easier way to pay online!\">
+<img alt=\"\" border=\"0\" src=\"https://www.paypal.com/en_US/i/scr/pixel.gif\" width=\"1\" height=\"1\">
+ </form>"
+
+        } else {
+            set r "
         <form method=post action=\"[ec_url]$form_action\">
 	[export_form_vars product_id]
 	[ec_decode $order_id "" "" [export_form_vars order_id]]
 	$color_widget $size_widget $style_widget
-	<input type=submit value=\"[ad_quotehtml $add_to_cart_button_text]\"><br>
+ <input type=submit value=\"[ad_quotehtml $add_to_cart_button_text]\"><br>
         $warnings
-	</form>
-	"
+	</form>"
+        }
     } else {
-	set available_date [db_string available_date_select "
+        set available_date [db_string available_date_select "
         select to_char(available_date,'Month DD, YYYY') available_date
           from ec_products
          where product_id = :product_id
         "]
-	if { [ad_parameter -package_id [ec_id] AllowPreOrdersP ecommerce] } {
-	    set r "
+        if { [ad_parameter -package_id [ec_id] AllowPreOrdersP ecommerce] } {
+            set r "
             <form method=post action=\"[ec_url]$form_action\">
 	    [export_form_vars product_id]
 	    [ec_decode $order_id "" "" [export_form_vars order_id]]
@@ -644,9 +676,9 @@
 	    $warnings
 	    </form>
 	    "
-	} else {
-	    set r "This item cannot yet be ordered.<br>(Available $available_date)"
-	}
+        } else {
+            set r "This item cannot yet be ordered.<br>(Available $available_date)"
+        }
     }
     return $r
 }