﻿
// AJAX class
function rudlandAjax()
{
    // Private member variables
    var m_ajaxObj = null;
    var m_url = '';
    var m_parameters = null;
    var m_processResponseDelegate = null;
    var m_method = 'POST';
    var m_displayErrors = true;
    
    // Properties
    this.setUrl = setUrl;   
    this.setParameters = setParameters;  
    this.setProcessResponseDelegate = setProcessResponseDelegate;  
    this.setMethod = setMethod;
    this.getResponseText = getResponseText;
    this.getResponseXml = getResponseXml;
    this.setDisplayErrors = setDisplayErrors;
  
    function setUrl(url)
    {
        m_url = url;
    }
    function setParameters(parameters)
    {
        m_parameters = parameters;
    }
    function setProcessResponseDelegate(processResponseDelegate)
    {
        m_processResponseDelegate = processResponseDelegate;
    }
    function setMethod(method)
    {
        m_method = method;
    }
    function getResponseText()
    {
        try
        {
            if (m_ajaxObj != null)
            {
                return m_ajaxObj.responseText;
            }
            else
            {
                return '';
            }
        }
        catch (ex)
        {
            return '';
        }
    }
    function getResponseXml()
    {
        try
        {
            if (m_ajaxObj != null)
            {
                return m_ajaxObj.responseXML;
            }
            else
            {
                return '';
            }
        }
        catch (ex)
        {
            return '';
        }
    }
    function setDisplayErrors(displayErrors)
    {
        m_displayErrors = displayErrors;
    }
       
    // ------------------ Initialise ajax object ------------------
    if (window.XMLHttpRequest)
    {
        m_ajaxObj = new XMLHttpRequest();
    } 
    else if (window.ActiveXObject)
    {
        try
        {
            m_ajaxObj = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (ex)
        {
            try
            {
                m_ajaxObj = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (ex)
            {
                alert('Error creating AJAX object');
            }
        }
    }
    // ------------------------------------------------------------
    
    function rudlandAjax_execute()
    {
        if (m_ajaxObj)
        {
            if (m_url != '')
            {
                if (m_processResponseDelegate != null)
                {
                    m_ajaxObj.onreadystatechange = m_processResponseDelegate;
                    m_ajaxObj.open(m_method, m_url, true);
                    m_ajaxObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                    
                    if (m_parameters != null && m_parameters != "")
                    {
                        m_ajaxObj.setRequestHeader("Content-Length", m_parameters.length);
                    }
                    else
                    {
                        m_ajaxObj.setRequestHeader("Content-Length", "0");
                    }
                    
                    m_ajaxObj.send(m_parameters);
                }
                else
                {
                    alert('Process response delegate has not been set');
                }
            }
            else
            {
                alert('URL has not been set');
            }
        }
    }
    
    // Make execute function available
    rudlandAjax.prototype.execute = rudlandAjax_execute;
    
    function rudlandAjax_checkState()
    {
        if (m_ajaxObj.readyState == 4)
        {
            if (m_ajaxObj.status == 200)
            {
                return true;
            }
            else
            {
                if (m_displayErrors)
                {
                    alert('There was a problem retrieving the XML data' + m_ajaxObj.responseText);
                    return false;
                }
                else
                {
                    return true;
                }                
            }
        }
        else
        {
            return false;
        }
    }
    
    // Make execute function available
    rudlandAjax.prototype.checkState = rudlandAjax_checkState;
}

function searchOnFocus(searchField)
{
    searchField.value = '';
    searchField.style.color = '#333333';
}

function searchOnLoad(searchField)
{
    if (searchField.value != 'Search')
    {
        searchField.style.color = '#333333';
    }
}

function addProductToCart(linkRef, productID, quantity)
{    
    var addReq = null;
    var totalItemsReq = null;
    var totalPriceReq = null;
        
    if (isNaN(quantity))
    {
        quantity = 1;
    }
    
    // Disable link to stop multiple adds
    linkRef.disabled = 'disabled';
    
    // Hide the cart details while updating it and show loading/updating icon
    hideCartDetails();  
    
    // Initialise add cart product to cart ajax request
    addReq = new rudlandAjax();
    addReq.setUrl('/CartService.aspx?function=AddProductToCart&productID=' + productID + '&quantity=' + quantity + '&uniqueRequest=' + new Date().toString());
    //addReq.setParameters('productID=' + productID + '&quantity=' + quantity);
    addReq.setMethod('GET'); //Faster!
    addReq.setDisplayErrors(false);
    addReq.setProcessResponseDelegate(function() {
        if (addReq.checkState())
        {
            if (addReq.getResponseText() == 'ProductAddedToCart')
            {
                totalItemsReq = new rudlandAjax();
                totalItemsReq.setMethod('GET');
                totalItemsReq.setDisplayErrors(false);
                totalItemsReq.setUrl('/CartService.aspx?function=GetTotalItemsInCart&uniqueRequest=' + new Date().toString());
                totalItemsReq.setProcessResponseDelegate(function() {                    
                    if (totalItemsReq.checkState())
                    {
                        document.getElementById('totalItemsInCart').innerHTML = totalItemsReq.getResponseText();
                        
                        totalPriceReq = new rudlandAjax();
                        totalPriceReq.setMethod('GET');
                        totalPriceReq.setDisplayErrors(false);
                        totalPriceReq.setUrl('/CartService.aspx?function=GetTotalPriceInCart&uniqueRequest=' + new Date().toString());
                        totalPriceReq.setProcessResponseDelegate(function() {
                            if (totalPriceReq.checkState())
                            {
                                var totalPrice = totalPriceReq.getResponseText();
                                
                                if (totalPrice.length > 19)
                                {
                                    document.getElementById('totalPriceInCart').parentNode.style.display = 'none';
                                }
                                else
                                {
                                    document.getElementById('totalPriceInCart').innerHTML = totalPrice;
                                }                                
                                
                                // Show cart after updating it
                                showCartDetails();
                                
                                // Display view cart link
                                document.getElementById('viewCartRow').style.display = '';
                                
                                // Enable link
                                linkRef.disabled = '';
                            }
                        });
                        totalPriceReq.execute();
                    }
                }); 
                totalItemsReq.execute();
            }
            else
            {
                // Show cart if it fails
                showCartDetails();
            }
        }
    });
    
    addReq.execute();    
}

function hideCartDetails()
{
    document.getElementById('cartInfo').style.display = 'none';
    document.getElementById('cartUpdating').style.display = '';
}


function showCartDetails()
{
    document.getElementById('cartInfo').style.display = '';
    document.getElementById('cartUpdating').style.display = 'none';
}

function openWindow(url, windowName, windowHeight, windowWidth, scrollBars)
{
    var openWindowOptions = 'height = ' + windowHeight + ', \
                                width = ' + windowWidth + ', \
                                status = no, \
                                toolbar = no, \
                                menubar = no, \
                                location = no \
                                scrollbars = ' + (scrollBars ? 'yes' : 'no');
                        
    window.open(url, windowName, openWindowOptions);
}