def view_po(self):
    """Open a window with detailed PO information"""
    if not self.selected_po_id:
        return
        
    # Create a new window for PO details
    detail_window = tk.Toplevel(self.parent)
    detail_window.title("PO Details")
    detail_window.geometry("700x600")
    detail_window.resizable(1, 1)
    
    # Create main frame with padding
    main_frame = tk.Frame(detail_window, bg="white", padx=10, pady=10)
    main_frame.pack(fill="both", expand=1)
    
    # Create PO header section
    self.create_po_header_section(main_frame)
    
    # Create separator
    separator = tk.Frame(main_frame, height=2, bg="gray")
    separator.pack(fill="x", pady=10)
    
    # Create items table section
    self.create_po_items_section(main_frame)
    
    # Create buttons at bottom
    self.create_po_buttons_section(main_frame, detail_window)
    
    # Load the PO data
    self.load_po_details(self.selected_po_id, main_frame)

def create_po_header_section(self, parent):
    """Create the PO header information section"""
    # Header frame
    header_frame = tk.Frame(parent, bg="white")
    header_frame.pack(fill="x", pady=10)
    
    # Title
    title_label = tk.Label(header_frame, text="Purchase Order Details", 
                          bg="white", font=("Geneva", 16, "bold"))
    title_label.pack(anchor="w", pady=(0, 10))
    
    # Create two columns for PO information
    info_frame = tk.Frame(header_frame, bg="white")
    info_frame.pack(fill="x")
    
    # Left column
    left_frame = tk.Frame(info_frame, bg="white")
    left_frame.pack(side="left", fill="both", expand=1, padx=(0, 20))
    
    # Right column  
    right_frame = tk.Frame(info_frame, bg="white")
    right_frame.pack(side="right", fill="both", expand=1)
    
    # Left column labels and values
    self.po_number_label = self.create_field_pair(left_frame, "PO Number:", "")
    self.supplier_label = self.create_field_pair(left_frame, "Supplier:", "")
    self.po_date_label = self.create_field_pair(left_frame, "PO Date:", "")
    self.status_label = self.create_field_pair(left_frame, "Status:", "")
    self.type_label = self.create_field_pair(left_frame, "Type:", "")
    
    # Right column labels and values
    self.po_value_label = self.create_field_pair(right_frame, "PO Value:", "")
    self.expended_label = self.create_field_pair(right_frame, "Expended:", "")
    self.remaining_label = self.create_field_pair(right_frame, "Remaining:", "")
    self.funding_label = self.create_field_pair(right_frame, "Funding:", "")
    self.invoice_delivered_label = self.create_field_pair(right_frame, "Invoice Delivered:", "")

def create_field_pair(self, parent, label_text, value_text):
    """Create a label-value pair"""
    row_frame = tk.Frame(parent, bg="white")
    row_frame.pack(fill="x", pady=2)
    
    # Label
    label = tk.Label(row_frame, text=label_text, bg="white", 
                    font=("Geneva", 10, "bold"), width=15, anchor="w")
    label.pack(side="left")
    
    # Value
    value = tk.Label(row_frame, text=value_text, bg="white", 
                    font=("Geneva", 10), anchor="w")
    value.pack(side="left", fill="x", expand=1)
    
    return value  # Return the value label so we can update it later

def create_po_items_section(self, parent):
    """Create the PO items table section"""
    # Items section header
    items_header = tk.Label(parent, text="Purchase Order Items", 
                           bg="white", font=("Geneva", 14, "bold"))
    items_header.pack(anchor="w", pady=(10, 5))
    
    # Create frame for the items table
    items_frame = tk.Frame(parent, bg="white")
    items_frame.pack(fill="both", expand=1, pady=5)
    
    # Create headers for items table
    headers_frame = tk.Frame(items_frame, bg="light gray")
    headers_frame.pack(fill="x", pady=(0, 5))
    
    # Define item columns
    item_columns = [
        ("Description", 200),
        ("Quantity", 80),
        ("Received", 80),
        ("Unit Price", 80),
        ("Line Total", 80),
        ("Consumable", 80)
    ]
    
    # Create column headers
    for i, (header_text, width) in enumerate(item_columns):
        header = tk.Label(headers_frame, text=header_text, 
                         bg="light gray", font=("Geneva", 10, "bold"),
                         width=width/8, anchor="w", relief=tk.RAISED, borderwidth=1)
        header.grid(row=0, column=i, padx=1, pady=1, sticky="ew")
    
    # Create scrollable frame for items
    canvas_frame = tk.Frame(items_frame)
    canvas_frame.pack(fill="both", expand=1)
    
    # Scrollbar
    items_scrollbar = tk.Scrollbar(canvas_frame, orient=tk.VERTICAL)
    items_scrollbar.pack(fill="y", side="right")
    
    # Canvas for scrolling
    self.items_canvas = tk.Canvas(canvas_frame, bd=0, bg="white",
                                 yscrollcommand=items_scrollbar.set)
    self.items_canvas.pack(side="left", fill="both", expand=1)
    items_scrollbar.config(command=self.items_canvas.yview)
    
    # Frame inside canvas for items
    self.items_content_frame = tk.Frame(self.items_canvas, bg="white")
    self.items_canvas.create_window(0, 0, window=self.items_content_frame, anchor="nw")

def create_po_buttons_section(self, parent, window):
    """Create buttons at bottom of PO detail window"""
    buttons_frame = tk.Frame(parent, bg="white")
    buttons_frame.pack(fill="x", pady=10)
    
    # Close button
    close_btn = tk.Button(buttons_frame, text="Close", 
                         command=window.destroy)
    close_btn.pack(side="right", padx=5)
    
    # Print button (placeholder)
    print_btn = tk.Button(buttons_frame, text="Print", 
                         command=lambda: self.print_po())
    print_btn.pack(side="right", padx=5)

def load_po_details(self, po_id, parent_frame):
    """Load PO details from API and populate the interface"""
    try:
        # Show loading message
        loading_label = tk.Label(parent_frame, text="Loading PO details...", bg="white")
        loading_label.pack(pady=20)
        parent_frame.update()
        
        # Make API call (you'll need to modify this URL)
        api_url = "http://your-server.com/get_po_details.php?id=" + str(po_id)
        response = urllib.urlopen(api_url)
        data = response.read()
        
        # Remove loading message
        loading_label.pack_forget()
        
        # Parse JSON response
        result = self.parse_json(data)
        
        if not result.get("success"):
            error_label = tk.Label(parent_frame, text="Error: " + result.get("message", "Unknown error"),
                                 bg="white", fg="red")
            error_label.pack(pady=20)
            return
        
        # Get PO and items data
        po_data = result.get("po", {})
        items_data = result.get("items", [])
        
        # Populate PO header fields
        self.populate_po_header(po_data)
        
        # Populate items table
        self.populate_items_table(items_data)
        
    except Exception, e:
        # Remove loading message if it exists
        try:
            loading_label.pack_forget()
        except:
            pass
            
        error_label = tk.Label(parent_frame, text="Error loading PO: " + str(e),
                             bg="white", fg="red")
        error_label.pack(pady=20)

def populate_po_header(self, po_data):
    """Populate the PO header fields with data"""
    self.po_number_label.config(text=po_data.get("po_number", ""))
    self.supplier_label.config(text=po_data.get("supplier", ""))
    self.po_date_label.config(text=po_data.get("po_date", ""))
    self.status_label.config(text=po_data.get("status", ""))
    self.type_label.config(text=po_data.get("type", ""))
    
    # Format currency values
    po_value = float(po_data.get("po_value", 0))
    expended = float(po_data.get("expended", 0))
    remaining = float(po_data.get("remaining", 0))
    
    self.po_value_label.config(text="${:,.2f}".format(po_value))
    self.expended_label.config(text="${:,.2f}".format(expended))
    
    # Color remaining amount based on value
    remaining_color = "green" if remaining > 0 else "red"
    self.remaining_label.config(text="${:,.2f}".format(remaining), fg=remaining_color)
    
    self.funding_label.config(text=po_data.get("funding", ""))
    self.invoice_delivered_label.config(text=po_data.get("invoice_delivered", ""))

def populate_items_table(self, items_data):
    """Populate the items table with data"""
    # Clear existing items
    for widget in self.items_content_frame.winfo_children():
        widget.destroy()
    
    if not items_data:
        no_items_label = tk.Label(self.items_content_frame, text="No items found",
                                bg="white", fg="gray")
        no_items_label.pack(pady=20)
        return
    
    # Add each item as a row
    for i, item in enumerate(items_data):
        # Alternate row colors
        bg_color = "white" if i % 2 == 0 else "#f5f5f5"
        
        item_frame = tk.Frame(self.items_content_frame, bg=bg_color)
        item_frame.pack(fill="x", pady=1)
        
        # Description
        desc_label = tk.Label(item_frame, text=item.get("item_description", ""),
                            bg=bg_color, width=25, anchor="w")
        desc_label.grid(row=0, column=0, padx=2, pady=2, sticky="w")
        
        # Quantity
        qty_label = tk.Label(item_frame, text=str(item.get("quantity", "")),
                           bg=bg_color, width=10, anchor="center")
        qty_label.grid(row=0, column=1, padx=2, pady=2)
        
        # Received
        recv_label = tk.Label(item_frame, text=str(item.get("received_quantity", "")),
                            bg=bg_color, width=10, anchor="center")
        recv_label.grid(row=0, column=2, padx=2, pady=2)
        
        # Unit Price
        unit_price = float(item.get("unit_price", 0))
        price_label = tk.Label(item_frame, text="${:.2f}".format(unit_price),
                             bg=bg_color, width=10, anchor="e")
        price_label.grid(row=0, column=3, padx=2, pady=2)
        
        # Line Total
        line_total = float(item.get("line_total", 0))
        total_label = tk.Label(item_frame, text="${:.2f}".format(line_total),
                             bg=bg_color, width=10, anchor="e")
        total_label.grid(row=0, column=4, padx=2, pady=2)
        
        # Consumable
        consumable = "Yes" if item.get("consumable") else "No"
        cons_label = tk.Label(item_frame, text=consumable,
                            bg=bg_color, width=10, anchor="center")
        cons_label.grid(row=0, column=5, padx=2, pady=2)
    
    # Update canvas scroll region
    self.items_content_frame.update_idletasks()
    self.items_canvas.config(scrollregion=self.items_canvas.bbox("all"))

def print_po(self):
    """Placeholder for print functionality"""
    print "Print PO functionality - to be implemented"