using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Globalization;

/* =====================================================================

  File:      ShoppingCart.aspx.cs for Adventure Works Cycles Storefront Sample
  Summary:   Displays the contents of the shopping cart and provides the opportunity to update the cart or checkout
  Date:	     June 16, 2003

---------------------------------------------------------------------

  This file is part of the Microsoft SQL Server Code Samples.
  Copyright (C) Microsoft Corporation.  All rights reserved.

This source code is intended only as a supplement to Microsoft
Development Tools and/or on-line documentation.  See these other
materials for detailed information regarding Microsoft code samples.

THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

======================================================= */

namespace Microsoft.Samples.SqlServer {

    public partial class ShoppingCart : System.Web.UI.Page
    {


//         public ShoppingCart() {
//             Page.Init += new System.EventHandler(Page_Init);
//         }

        //*******************************************************
        //
        // The Page_Load event on this page is used to load the
        // ShoppingCart DataGrid *the first time* the page is
        // accessed.
        //
        // Note that subsequent postbacks to the page *do not*
        // reload the Datagrid.  Instead, we rely on the control's
        // built-in viewstate management to rebuild the control
        // on the server.
        //
        //*******************************************************

        private void Page_Load(object sender, System.EventArgs e) {

            // Populate the shopping cart the first time the page is accessed.
            if (Page.IsPostBack == false) {
                PopulateShoppingList();
            }
        }

        //*******************************************************
        //
        // The UpdateButton_Click event is raised when a user clicks
        // the "update" button on the client.  The event handler
        // updates all items in the cart back to the database,
        // and then repopulates the datagrid with the current
        // cart contents.
        //
        //*******************************************************

        protected void UpdateButton_Click(object sender, System.Web.UI.ImageClickEventArgs e)
        {
            // Update the Shopping Cart and then Repopulate the List
            UpdateShoppingCartDatabase();
            PopulateShoppingList();
        }

        //*******************************************************
        //
        // The CheckoutButton_Click event is raised when a user clicks
        // the "checkout" button on the client.  The event handler
        // updates all items in the cart back to the database,
        // and then redirects the user to the checkout.aspx page
        //
        //*******************************************************

        protected void CheckoutButton_Click(object sender, System.Web.UI.ImageClickEventArgs e)
        {

            // Update Shopping Cart
            UpdateShoppingCartDatabase();

            // If cart is not empty, proceed on to checkout page
            ShoppingCartDB cart = new ShoppingCartDB();

            // Calculate shopping cart ID
            String cartId = cart.GetShoppingCartId();

            // If the cart isn't empty, navigate to checkout page
            if (cart.GetItemCount(cartId) !=0) {
                Response.Redirect("Checkout.aspx");
            }
            else {
                MyError.Text = "You can't proceed to the Check Out page with an empty cart.";
            }
        }

        //*******************************************************
        //
        // The PopulateShoppingList helper method is used to
        // dynamically populate a GridControl with the contents of
        // the current user's shopping cart.
        //
        //*******************************************************

        void PopulateShoppingList() {

            ShoppingCartDB cart = new ShoppingCartDB();

            // Obtain current user's shopping cart ID
            String cartId = cart.GetShoppingCartId();

            // If no items, hide details and display message
            if (cart.GetItemCount(cartId) == 0) {
                DetailsPanel.Visible = false;
                MyError.Text = "There are currently no items in your shopping cart.";
            }
            else {

                // Databind Gridcontrol with Shopping Cart Items
                MyList.DataSource = cart.GetItems(cartId);
                MyList.DataBind();

                //Update Total Price Label

				totalLabel.Text = cart.GetTotal(cartId).ToString();
            }
        }

        //*******************************************************
        //
        // The UpdateShoppingCartDatabase helper method is used to
        // update a user's items within the shopping cart database
        // using client input from the GridControl.
        //
        //*******************************************************

        void UpdateShoppingCartDatabase() {

            ShoppingCartDB cart = new ShoppingCartDB();

            // Obtain current user's shopping cart ID
            String cartId = cart.GetShoppingCartId();

            // Iterate through all rows within shopping cart list
            for (int i=0; i < MyList.Items.Count; i++) {

                // Obtain references to row's controls
                TextBox quantityTxt = (TextBox) MyList.Items[i].FindControl("Quantity");
                CheckBox remove = (CheckBox) MyList.Items[i].FindControl("Remove");

                // Wrap in try/catch block to catch errors in the event that someone types in
                // an invalid value for quantity
                int quantity;
				try 
				{
					quantity = Int32.Parse(quantityTxt.Text, CultureInfo.InvariantCulture);

					// If the quantity field is changed or delete is checked
					if (quantity != (int)MyList.DataKeys[i] || remove.Checked == true) 
					{

						Label productIDLabel = (Label) MyList.Items[i].FindControl("ProductID");

						if (quantity == 0 || remove.Checked == true) 
						{
							cart.RemoveItem(cartId, Int32.Parse(productIDLabel.Text, CultureInfo.InvariantCulture));
						}
						else 
						{
							cart.UpdateItem(cartId, Int32.Parse(productIDLabel.Text, CultureInfo.InvariantCulture),
								quantity);
						}
					}
				}
				catch (System.FormatException) 
				{
					MyError.Text = "You must specify a valid number using only numerals";
				}
				catch (System.OverflowException) 
				{
					MyError.Text = "You must specify a valid number within range.";
				}
            }
        }

        private void Page_Init(object sender, EventArgs e) {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
        }

        #region Web Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
			this.UpdateButton.Click += new System.Web.UI.ImageClickEventHandler(this.UpdateButton_Click);
			this.CheckoutButton.Click += new System.Web.UI.ImageClickEventHandler(this.CheckoutButton_Click);

		}

        #endregion

    }
}