DEBUG = true

function ProductPageManager(opts)
{
    var instance = this,
        swatchList,
        sizeList,
        quantitySelect,
        orderForm,
        activeRequest,
        orderBox,
        orderFormDiv,
        confirmationDiv,
        topQuote,
        microTrolleyContainer,
        checkoutFormContainer,
        orderMoreLink,
        topTrolleyNumItems,
        nonEmptyTrolleyControls;
    
    function init()
    {
        var self = instance,
            doc = document,
            ieVer;
        
        if (opts.colourSelection)
            swatchList = doc.getElementById("swatch_list");
        if (opts.sizeSelection)
            sizeList = doc.getElementById("size_list");
        try {
            quantitySelect = doc.getElementById("quantity_select");
        } catch (e) {
            quantitySelect = null;
        }
        orderBox = doc.getElementById("order_box");
        orderForm = doc.getElementById("order_form");
        orderFormDiv = doc.getElementById("order_box_form");
        confirmationDiv = doc.getElementById("order_box_confirmation");
        topQuote = doc.getElementById("confirmation_top_quote");
        microTrolleyContainer = doc.getElementById("micro_trolley_container");
        checkoutFormContainer = doc.getElementById("checkout_form_container");
        nonEmptyTrolleyControls = doc.getElementById("non_empty_trolley_controls");
        orderMoreLink = doc.getElementById("order_more_link");
        topTrolleyNumItems = doc.getElementById("top_trolley_num_items");
        
        Util.addListener(confirmationDiv, "click", handleClick);
        Util.addListener(orderForm, "submit", handleSubmit);
        Util.addListener(doc, "unload", handleUnload);
        
        $("a.image_zoom").fancybox({ hideOnContentClick: true }); 
        $("a.dog_coat_sizing_guide").fancybox({ frameWidth: 630, frameHeight: 430, zoomSpeedIn: 300, zoomSpeedOut: 0, overlayShow: false })
    }
    
    function handleUnload(e)
    {
        Util.removeListener(confirmationDiv, "click", handleClick);
        Util.removeListener(orderForm, "submit", handleOrderFormSubmit);
        Util.removeListener(doc, "unload", handleUnload);
    }
    
    function handleClick(e)
    {
        if (!e) e = event;
        var t = e.target || e.srcElement,
            handled = false,
            cls, uid;
            
        cls = t.className;
        if (t == orderMoreLink) {
            confirmationDiv.style.display = "none";
            orderFormDiv.style.display = "block"; 
            handled = true;
        } else {
            if (cls === "remove") {
                doRemoveRequest(t.value);
            }
        }
            
        if (handled) {
            if (e.preventDefault)
                e.preventDefault();
            else
                e.returnValue = false;
            return false;
        }
        
        return true;
    }
    
    function handleSubmit(e)
    {
        if (!e) e = event;
        var t = e.target || e.srcElement,
            req, value, data, index;
               
        if (t == orderForm) {
            doAddRequest();
        } else {
            /* The micro trolley form. */
        }
        
        if (e.preventDefault)
            e.preventDefault();
        else
            e.returnValue = false;
        
        return false;
    }
    
    function doAddRequest()
    {
        var req;
        
        if (activeRequest != null)
            return;
        
        if (quantitySelect && (index = quantitySelect.selectedIndex) >= 0) {
            value = quantitySelect.options[index].text;
        } else
            value = 1;
        data = [ "add=", opts.productId, "&quantity=", value ];
        if (swatchList) {
             value = Util.getCheckedRadio(swatchList).value;
             data.push("&colour_id=", value);
        }
        if (sizeList) {
            value = Util.getCheckedRadio(sizeList).value;
            data.push("&size_id=", value);
        }
        data = data.join("");

        req = Util.createXmlHttpRequest();
        req.open("POST", "/shop/ajax_trolley_add/", true);
        req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        req.setRequestHeader("Content-length", data.length);
        req.setRequestHeader("Connection", "close");
        req.onreadystatechange = handleReadyStateChange;
        activeRequest = req;
        req.send(data);
        
        function handleReadyStateChange(e)
        {
            if (req.readyState === 4) {
                if (req.status === 200) {
                    data = eval("(" + req.responseText + ")");
                    processAddResponse(data);
                } else {
                    processAddResponse(null);
                    if (DEBUG)
                        document.body.innerHTML = req.responseText;
                }
                activeRequest = null;
            }
        }
    }
    
    function doRemoveRequest(uid)
    {
        var req;
        
        if (activeRequest != null)
            return;
        
        data = "remove=" + uid;

        req = Util.createXmlHttpRequest();
        req.open("POST", "/shop/ajax_trolley_remove/", true);
        req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        req.setRequestHeader("Content-length", data.length);
        req.setRequestHeader("Connection", "close");
        req.onreadystatechange = handleReadyStateChange;
        activeRequest = req;
        req.send(data);
        
        function handleReadyStateChange(e)
        {
            if (req.readyState === 4) {
                if (req.status === 200) {
                    data = eval("(" + req.responseText + ")");
                    processRemoveResponse(data);
                } else {
                    processRemoveResponse(null);
                }
                activeRequest = null;
            }
        }
    }
    
    function updateFromResponse(data)
    {
        var trolleyForm, numItems;
        
        numItems = data["num_items"];
        
        /* This switching of event handlers appears to be necessary because IE doesn't bubble onsubmit. */
        trolleyForm = microTrolleyContainer.firstChild;
        if (trolleyForm != null)
            Util.removeListener(trolleyForm, "submit", handleSubmit);
        microTrolleyContainer.innerHTML = data["micro_trolley_html"];
        checkoutFormContainer.innerHTML = data["checkout_form_html"];
        nonEmptyTrolleyControls.style.display = numItems != 0 ? "" : "none";
        trolleyForm = microTrolleyContainer.firstChild;
        Util.addListener(trolleyForm, "submit", handleSubmit);
        
        /* Update the top trolley's item count. */
        numItems = data["num_items"];
        if (numItems == 1)
            numItems = "1 item";
        else
            numItems = numItems + " items";
        topTrolleyNumItems.firstChild.data = numItems;
    }
    
    function processAddResponse(data)
    {
        var form, addedRow;
        
        if (data != null) {
            updateFromResponse(data);
            if (data.success) {
                topQuote.firstChild.data = "Thanks!";
            } else {
                topQuote.firstChild.data = "You already have this item.";
            }
            addedRow = document.getElementById("added_item_row");
            if (addedRow != null) {
                addedRow.style.opacity = 0.0;
                Animation.fade(addedRow, 1500, 0.0, 1.0, null);
            }
            orderFormDiv.style.display = "none";
            confirmationDiv.style.display = "block";
        }
    }
    
   function processRemoveResponse(data)
    {
        if (data != null) {
            updateFromResponse(data);
            topQuote.firstChild.data = "Item removed.";
        }
    }
    
    Util.addDomLoadHandler(init);
}

