if( typeof(config) == "undefined" ) {
    var config = {};
}

var openOrderSettings;
$(document).ready( function() {
    Date.preferAmericanFormat = false;
    openOrderSettings = $.extend({
            customtabs:{},
            customlogo:'',
            welcomeFade:3000,
            debugError:false,
            clientLog: false,
            useSearchTree:false,
            modalWait:true,
            loginProgress:true,
            logoutRedirect:''
        }, config );
    for( var t in openOrderSettings.customtabs ) {
        if(openOrderSettings.customtabs[t] )  {
            $('#header ul.primary-links a[title='+ t +']').attr('href', openOrderSettings.customtabs[t]);
        } else {
            $('#header ul.primary-links a[title='+ t +']').parent().remove();    
        }
    }

    if( openOrderSettings.customlogo ) {
        $('#headerlogo').attr('src', openOrderSettings.customlogo );
    }
    $('#header').bind('tabsload', function(event,ui){
        var panel = $(ui.panel).attr('id');
        if(panel == 'cart') {
            cartInit();
        } else if (panel == 'myaccount') {
            myAccountInit();
        } else if (panel == 'myorders') {
            myOrdersInit();
        } else if ( panel =='products') {
            $('#productsBanner').load('products-banner.html');
            $('#productsBanner').hide();
        }
        $(ui.tab).addClass('notshown');
        applyStyles('#'+panel);
    });
    $('#header').bind('tabsshow', function(event,ui){
        var tab = $(ui.tab);
        if( tab.hasClass('notshown')) {
            tab.removeClass('notshown')
            var panel = $(ui.panel).attr('id');
            if (panel == 'myorders') {
                $('#invoicesMenuItem').click();
            } else if (panel == 'products') {
                selectProductCategory(0);
            }
        }

    });
    $('#header').tabs(
        {
            navClass: 'primary-links',
            cache:true,
            ajaxOptions : {
                cache:false,
                async:false
            },
            tabClass: 'ui-state-default'
            //panelClass: 'ui-tabs-panel-alt',
            //hideClass: 'ui-tabs-hide-alt',
            //loadingClass: 'ui-tabs-loading-alt'
        }
    );
    $('#login.dialog').dialog({
        autoOpen:false,
        width:350,
        height:230,
        draggable: false,
        resizable:false,
        bgiframe:true,
        open: function() {
            $('#username').focus();            
        }
    });
    $('#waitBox.dialog').dialog({
        autoOpen:false,
        width:500,
        height:110,
        draggable: false,
        resizable:false,
        bgiframe:true,
        modal:openOrderSettings.modalWait
    });
    $('#checkout.dialog').dialog({
        autoOpen:false,
        width:750,
        height:500,
        draggable: true,
        resizable:true,
        bgiframe:true,
        modal:true
    });
    $('#document.dialog').dialog({
        autoOpen:false,
        width:800,
        height:500,
        draggable: true,
        resizable:true,
        bgiframe:true,
        modal:true
    });
    $('#progressbar').progressbar();

    $('#summaryCart').cluetip({
            local:true,
            width:520,
            sticky:false,
            dropShadow:false,
            cluetipClass:'popupCartDetail',
            topOffset:-15,
            leftOffset:35
    });

    $('.display-auth').hide();
    $('.display-authorise').hide();



    $('#searchForm').bind('submit', productSearchSubmit);
    $('#loginForm').bind('submit', loginSubmit);

    $(".addProductToCart").live("click",addProductToCart);

    $.ceam.defaults.onError = ceamOnError;
    $.ceam.defaults.onSuccess= ceamOnSuccess;
    $.ceam.defaults.onLogin= ceamOnLogin;
    $.ceam.defaults.onLogout= ceamOnLogout;
    $.ceam.defaults.onAuthorise= ceamOnAuthorise;
    $.ceam.defaults.useSearchTree = openOrderSettings.useSearchTree;
    $.ceam.defaults.clientLog= openOrderSettings.clientLog;    
    $.ceam.storeData(updateStoreData);

    applyStyles('');

    if( $.query.get('code') ) {
        productSearch('c',$.query.get('code'));
    }
});

var templateOptions = {compile:true};

function applyStyles(selector){
    $(selector + ' .button').hover(
        function(){
            $(this).addClass("ui-state-hover");
        },
        function(){
            $(this).removeClass("ui-state-hover");
        }
    ).addClass("ui-state-default").addClass("ui-corner-all");

    if( $.ceam.isLoggedIn) {
        $(selector + ' .display-auth').show();
        $(selector + ' .display-anon').hide();
    } else {
        $(selector + ' .display-auth').hide();
        $(selector + ' .display-anon').show();
    }
};




function switchToTab(tab) {
    $('#header').tabs("select", tab);
};

function ceamOnError(XMLHttpRequest, textStatus, errorThrown, ceamRequest) {
    $('#progressbar').stopTime();
    $('#waitBox').dialog('close');
    var msg = 'Unable to Retrieve Data from Store.';
    if( openOrderSettings.debugError ) {
        msg += "\n Result = " + (textStatus ? textStatus : errorThrown);
        msg += "\n Workflow = " + ceamRequest.workflow;
        msg += "\n Params \n";
        for( p in ceamRequest.params ) {
            msg += "     "  + p + " = " + ceamRequest.params[p] +" \n";   
        }

    }
    $.popup.show('Error',msg);
};
function ceamOnSuccess(xml) {
    $('#progressbar').stopTime('progress');
    $('#waitBox').dialog('close');
    var msgtype = 'error';
    var msg = $('message',xml);
    if( msg.length ) {
        msgtype = msg.attr('type');
        var msgtext = msg.attr('desc');
        if( !msgtext) {
            msgtext = msg.text();
        }
        msg = msgtext;
    } else {
        var missing = '';
        $('required',xml).each(function() {
            missing += '<li>'+$(this).attr('name')+'</li>';
        });
        if( missing.length > 0 ){
            msg = "Missing required fields: <ul>"+missing+"</ul>";
        } else {
            msg= null;
        }
    }
    if( msg ) {
        $.popup.show($("#message-"+msgtype).text(), msg);
    }

};
function ceamOnLogin(xml) {
    $('.display-auth').show();
    $('.display-anon').hide();

    $.popup.show('Welcome', "<div id='welcome'><p class='client'>" + $.cookies.get('AuthContact') + ",</p><p class='client client-company'></p><p>to</p> <p class='store'>" + $('webpage',xml).attr('company') + "</p></div>");
    $('#welcome').oneTime(openOrderSettings.welcomeFade, function() {
        $('#popup_close').click();
    });
    $.ceam.contactData(function(xml) {
        $('#welcome .client-company').text($('compbilling',xml).attr('company'));
        updateContactData(xml);
    });
    $.ceam.getCart(processCart);
    refreshProducts();
}

function ceamOnLogout() {
    $('.display-auth').hide();
    $('.display-anon').show();
    $('.display-authorise').hide();
    $.popup.show('Goodbye', "<div id='welcome'><p class='client'>" + $.cookies.get('AuthContact') + ",</p><p>We hope you enjoyed your visit, and look forward to serving you again</p></div>");
    $('#contacts-data').empty();
    $('#header > ul a').each(function() {
       $(this).addClass('notshown');
    });
    switchToTab('home');
    if(openOrderSettings.logoutRedirect) {
        window.location = openOrderSettings.logoutRedirect;
    }
}

function ceamOnAuthorise(authorise) {
    if( authorise ) {
        $('.display-authorise').show();
    } else {
        $('.display-authorise').hide();
    }
}



function wait(msg, timeout) {
    var t = timeout || 5;
    t *= 1000;
    $('#waitBox').data('title.dialog', msg);
    $('#waitBox').dialog('open');
    $('#progressbar').progressbar('value',0);
    var progress = 0;
    $('#progressbar').everyTime(t/100, 'progress',
            function(){
                progress += 1;
                $('#progressbar').progressbar('value',progress);
            }, 100, true);
}


var storeDataTemplate = $.template('<div><strong>${fullName}</strong></div><div>${addr1}</div><div>${addr2}</div><div>${addr3}</div><div>${suburb} ${state} ${postCode}</div><div><strong>${phone}</strong></div>', templateOptions);

function updateStoreData(xml) {

    var storexml = $('storenamexml',xml);

    $('#storeDetailElement .content').html( storeDataTemplate , {
        fullName: storexml.attr("storefullname"),
        addr1:storexml.attr("storeaddr1"),
        addr2:storexml.attr("storeaddr2"),
        addr3:storexml.attr("storeaddr3"),
        suburb:storexml.attr("storesuburb"),
        state:storexml.attr("storestate"),
        postCode:storexml.attr("storepostcode"),
        phone:storexml.attr("storephone")
    });
};

var addressTemplate = $.template('<div id=${type} class="address">' +
                    '<span class="name">${name}</span>' +
                    '<span class="company">${company}</span>' +
                    '<span class="addr1">${addr1}</span>' +
                    '<span class="addr2">${addr2}</span>' +
                    '<span class="addr3">${addr3}</span>' +
                    '<span class="suburb">${suburb}</span>' +
                    '<span class="state">${state}</span>' +
                    '<span class="postcode">${postcode}</span>' +
                    '<span class="country">${country}</span>' +
                    '<span class="phone">${phone}</span>' +
                    '<span class="email">${email}</span>' +
                    '</div>');

var contactHeaderTemplate = $.template('<div><strong>${userName}</strong></div><div>${billingName}</div>', templateOptions);


var contactTemplate = $.template('<div class="contact" name="${name}" isbilling="${billing}" isdelivery="${delivery}">' +
                    '<span class="name">${name}</span>' +
                    '<span class="company">${company}</span>' +
                    '<span class="addr1">${addr1}</span>' +
                    '<span class="addr2">${addr2}</span>' +
                    '<span class="addr3">${addr3}</span>' +
                    '<span class="suburb">${suburb}</span>' +
                    '<span class="state">${state}</span>' +
                    '<span class="postcode">${postcode}</span>' +
                    '<span class="country">${country}</span>' +
                    '<span class="phone">${phone}</span>' +
                    '<span class="email">${email}</span>' +
                    '<span class="type">${type}</span>' +
                    '</div>', templateOptions);


function updateContactData(xml) {
    // Header

    $('#contactDetailElement .content').html( contactHeaderTemplate , {
        userName: $('contact[isuser=1]',xml).attr('name'),
        billingName:$('compbilling',xml).attr("company")
    });

    // Store the info for later

    $('#contacts-data').empty();
    var company = $('compbilling', xml).attr('company');
    var contactData = $('#contacts-data');
    $('contact', xml).each(function() {
        var data = $(this).children('address');
        contactData.append( contactTemplate, extractContactDataFromAttributes( data, {
            company: company,
            billing: $(this).attr("isbilling") == "1",
            delivery: $(this).attr("isdelivery") == "1"
        }));
    });

    contactData.append(addressTemplate, extractContactDataFromAttributes($('compbilling',xml),{type:'billing'}));
    contactData.append(addressTemplate, extractContactDataFromAttributes($('compdelivery',xml),{type:'delivery'}));

    setupCartAddressSelect($('#cartBillAddress'));
    setupCartAddressSelect($('#cartDeliveryAddress'));
};


function extractContactDataFromAttributes(element, override) {
    var data = {
            name: element.attr('contact'),
            company: element.attr('company'),
            addr1: element.attr('addr1'),
            addr2: element.attr('addr2'),
            addr3: element.attr('addr3'),
            suburb: element.attr('suburb'),
            state: element.attr('state'),
            postcode: element.attr('postcode'),
            country: element.attr('country'),
            phone: element.attr('phone'),
            email: element.attr('email'),
            type: element.attr('type')
        };
    if( override ) {
        data = $.extend(data, override);
    }
    return data;
}
function extractContactDataFromChildren(element, override) {
    var data = {
            name: element.children('.name').text(),
            company: element.children('.company').text(),
            addr1: element.children('.addr1').text(),
            addr2: element.children('.addr2').text(),
            addr3: element.children('.addr3').text(),
            suburb: element.children('.suburb').text(),
            state: element.children('.state').text(),
            postcode: element.children('.postcode').text(),
            country: element.children('.country').text(),
            phone: element.children('.phone').text(),
            email: element.children('.email').text(),
            type: element.children('.type').text()
        };
    if( override ) {
        data = $.extend(data, override);
    }
    return data;
}

function refreshProducts() {
    var prod = $('#node-selected').attr('product');
    if( prod == undefined) {
        selectProductCategory();
    } else if (prod == "category") {
        selectProductCategory($('#node-selected').text());
    } else if (prod == "search") {
        productSearch($('#node-selected').attr('type'),$('#node-selected').text());
    } else if (prod == "favourites") {
        displayFavourites();
    }

}

function selectProductCategory(id) {
    if( id == undefined) {
        id = 0;//$('#catalogueNode').text();
    }

    if( id != 0 ) {
        wait( 'Loading products from ' + $('#node-'+id+' > a:first').text(), 20);
    }
    $.ceam.productCategory(id, displayProducts);
    $('#node-selected').attr('product','category').text(id);
}

function displayFavourites() {
    switchToTab('products');
    wait( 'Loading your favourites', 20);
    $.ceam.getFavourites(displayProducts);
    $('#node-selected').attr('product','favourites').text('');
}

function addToFavourites(event) {
    var prod =  $(this).closest('.oneProduct').attr('productId');
    wait('Adding ' + prod + ' to your favourites');
    $.ceam.addToFavourites(prod);
}

function removeFromFavourites(event) {
    wait("Removing " +$(this).closest('.oneProduct').attr('productid')+ " from your favourites", 20);
    $.ceam.removeFromFavourites($(this).closest('.oneProduct').attr('productId'), displayProducts);
}

function displayProducts(xml) {
    var nodeId = $('catalogue',xml).attr('nodeid');
    displayProductCategory(nodeId, xml);
    displayCatalogueBreadcrumb(nodeId);
    displayProductHeader(nodeId, xml);
    displayProductList(nodeId,xml);
}

var catalogueBreadcrumbTemplate = $.template('<td onclick=selectProductCategory("${nodeID}")>${desc:appendif(" >")}</td>', templateOptions);

function displayCatalogueBreadcrumb(nodeId) {

    $('#catalogueBreadcrumb td').remove();
    var breadcrumbTable = $('#catalogueBreadcrumb tr');


    $('#node-'+nodeId).parents('li').each(function() {
        breadcrumbTable.prepend(catalogueBreadcrumbTemplate, {
           nodeID:$(this).attr('id').replace('node-',''),
           desc:$(this).children('a').text()
        });
    });
};


var productCategoryTemplate = $.template('<li id="node-${nodeID}" class="leaf"><a onclick=selectProductCategory("${nodeID}")>${desc}</a></li>');

function displayProductCategory(nodeId, xml) {
    var nodeSelector = '#node-' +nodeId;
    if( $(nodeSelector+' ul.menu').length == 0 ) {
        var children = $('category[id][id != '+nodeId+']', xml);
        if( children.length > 0 ) {
            $(nodeSelector).removeClass('leaf').addClass('expanded');
            $(nodeSelector).append('<ul class="menu"/>');
            var categoryList = $(nodeSelector + ' ul.menu');
            children.each(function() {
                // Guard against categories being returned as siblings
                if( $('#node-'+$(this).attr('id')).length == 0) {
                    categoryList.append(productCategoryTemplate, {
                       nodeID:$(this).attr('id'),
                       desc:$(this).attr('desc')
                    });
                }
            });
        }
    }
    activateProductCategory(nodeId);
};

function activateProductCategory(nodeId) {
    var nodeSelector = '#node-' +nodeId;
    if( $(nodeSelector).length == 0 ) {
        return;
    }
    $('#node-0').find('li').removeClass('active-trail');
    $('#node-0').find('.expanded').removeClass('expanded').addClass('collapsed');
    $(nodeSelector).parents('li').addClass('expanded').removeClass('collapsed').andSelf().addClass('active-trail')
    $(nodeSelector+':not(.leaf)').addClass('expanded').removeClass('collapsed');

}


var productHeaderTemplate = $.template('<li><a onclick=selectProductCategory("${nodeID}")>${desc}</a></li>', templateOptions);

function displayProductHeader(nodeId, xml) {
    var taxDisplay = '';
    if( $.ceam.isLoggedIn) {
        if (isWholesale(xml)) 	{
            taxDisplay = '(Ex Tax)';
        }else{
            taxDisplay = '(Inc Tax)';
        }
    }
    $('#productTax').text(taxDisplay)

    var headerText;
    var category = $('category',xml);


    if(category.attr('search')) {
        headerText = 'Your search for "' + category.attr('search') + '" returned ' + $('product',xml).length  + ' items';
    } else {
        headerText = $('#node-'+nodeId).children('a').text();;
    }


    $('#productTitle').text(headerText);

    $('#productChildren ul').empty();
    $('#productChildren').removeClass('empty');

    var children = $('#node-'+nodeId ).children('.menu').children('li');
    var colSize = Math.ceil(children.length / 3.0);
    children.each(function(index) {
        var column = Math.floor(index / colSize);
        $('#productChildren .column-'+column ).append( productHeaderTemplate, {
            nodeID:$(this).attr('id').replace('node-',''),
            desc:$(this).children('a').text()
         });
    });
    if(children.length == 0) {
        $('#productChildren').addClass('empty');
    }
};



function formatPrice(price) {
    price = parseFloat(price);
    price = price.toFixed(2);
    //If not logged in price will be 0.00 so don't display
    //Also don't display if logged in and price is 0.00
    if (price == "0.00"  || !$.ceam.isLoggedIn ){
        return '';
    } else {
        return '$' + price;
    }
}

var oneProductTemplate = $.template('<div class="oneProduct" id="${htmlId}" productId="${sourceId}">' +
'<div class="productThumbnail" rel="#${htmlId}-cluetip" title="${description}" ><img height="60" src="${imageName}"/></div> ' +
'<div class="price">${price}</div>' +
'<div class="volumePricing-${volumePricing}"></div>' +
'<div class="productDescription">${description}</div>' +
'<form class="productAttributes">' +
'<span class="code">Code:  ${code}</span>' +
'<input class="addProductToCart addToOrder button display-auth" type="button" value="Add to Order"/>' +
'<input type="hidden" name="prd" value="${code}"/><input type="hidden" name="unit" value="${unit}"/>' +
'<span class="quantity display-auth">Qty<input type="text" size="2" name="qty"/></span>' +
'<span class="imageFav display-auth"/>' +
'</form>' +
'<div id="${htmlId}-cluetip" class="cluetip-content">' +
'<div class="productSpecification">' +
   '<img src="${imageName}"/>' +
   '<h2>PRODUCT DETAILS</h2> ' +
   '<div>Item Code: ${code}</div> ' +
   '<div>Item Price: ${price}</div> ' +
   '<div class="volumePriceDetails-${volumePricing}">' +
    'Volume Pricing: ${volumePriceDetails:foreach("<span>Buy ${quantity} and pay ${price}</span>","<span>Standard Price is Lower</span>")}' +
   '</div> ' +
   '<h2>PRODUCT SPECIFICATIONS</h2>  ' +
   '<span class="specificationBody">${specification}</span><span class="clear-block"/> ' +
   '<h2 class="${documentClass}">PRODUCT DOCUMENTS</h2>  ' +
   '<ul class="documents ${documentClass}">'+
   '${documents:foreach("<li><a target=_blank href=${link}>${title}</a></li>","")}' +
   '</ul>' +
'</div>' +
'</div>' +
'</div>', templateOptions);

function displayProductList(nodeId, xml) {
    $('#productsBox').empty();
    $('#product-list-pagination').empty();

    var products = {};
    var productCount = 0;

    $('product',xml).each(function() {
        var p = $(this);
        var groupCode =p.attr('id').split(':');
        var data = {
            detail : p.attr('detail'),
            sourceId: p.attr('id'),
            group : groupCode[0],
            code : groupCode[1],
            htmlId:"prd" + productCount,
            description: p.attr('desc') + ' (' + p.attr('unit') + ')',
            unit: p.attr('unit'),
            price: formatPrice(p.attr('price')),
            specification: $.htmlClean(p.children('spec').text()),
            imageName: '',
            thumbnail: p.attr('thumbnail'),
            volumePricing:(p.attr('volbreaks')=='1') && $.ceam.isLoggedIn,
            documentClass : 'hidden',
            documents: []
        };
        data.imageName = 'image.php?'+$.param({'docid':data.thumbnail,'group':data.group, 'code': data.code});

        if( data.volumePricing ) {
            data.volumePriceDetails = [];
            p.find('volbreak').each(function() {
                data.volumePriceDetails.push( {
                    quantity:$(this).attr('qty'),
                    price:$(this).attr('dispprice')
                });
            });
        }
        p.find('document').each(function(){
                data.documentClass ='';
                data.documents.push({
                    id:$(this).attr('id'),
                    title:$(this).attr('title'),
                    filename:$(this).attr('filename'),
                    link:'doc.php?'+$.param({'docid':$(this).attr('id'),'group':data.group, 'code': data.code,'filename':$(this).attr('filename')})
                });
            });
        products[data.sourceId]=data;
        productCount++;
    });


    $('#productsBanner').hide();
    if( productCount == 0 ) {
        $('#productTax').hide();
        if( nodeId == '0') {
            $('#productsBanner').show();
        }
    } else {
        $('#productTax').show();
        $('#productsBox')
                //.append("<div id='product-list-flag-dropdown/>")
                //.append("<div id='product-list-pagination/>")
                .append("<div id='product-list' class='"+nodeId+"'/>");
        var p = $('#product-list');
        $.each(products, function(i,val) {
           p.append(oneProductTemplate, val);
        });
        $.smartlist({
            baseName:               "product-list",
            itemClass:              "oneProduct",
              showFlagCount:          false,
              numItemsPerPage:        10,
              maxPaginationLinks:     30,
              defaultDropdownOptText: "All items"

        });
        $('#product-list .productThumbnail').cluetip({
                local:true,
                width:500,
                sticky:true,
                positionBy:'auto',
                leftOffset:0,
                topOffset:0,
                cluetipClass:'openOrder',
                mouseOutClose:true,
                closePosition:'title',
                closeText:'',
                hoverIntent: {
                   sensitivity:  3,
                   interval:     150,
                   timeout:      300
                 }

        });
        $('#productsBox').append("<div id='addAllProducts'><input class='button display-auth' type='button' value='Add all to Order'/></div>");
        applyStyles('#productsBox');
        $('#addAllProducts input').bind('click', '#productsBox', addAllProductsToCart);
    }

    if( nodeId=='favourites') {
        $('.imageFav').click(removeFromFavourites);
    } else {
        $('.imageFav').click(addToFavourites);
    }
};


function productSearchSubmit(event){
    var searchForm = $(event.target);
    var type = searchForm.find('[name=type]:input').val();
    var text = searchForm.find('[name=search]:input').val();
    productSearch(type, text);
    searchForm.find('[name=search]:input').val('');
    return false;
}

function productSearch(type, text){
    switchToTab('products');
    $('#productsBox').empty();
    $('#product-list-pagination').empty();

    $.ceam.productSearch(type,text,displayProducts );
    $('#search').dialog('close');
    wait( 'Searching for ' + text, 20);
    $('#node-selected').attr('product','search').attr('type',type).text(text);
    return false;
}

function loginSubmit(event){
    var loginForm = $(event.target);
    var username = loginForm.find('[id=username]:input').val();
    var password = loginForm.find('[id=password]:input').val();
    $.ceam.login(username,password,verifyLogin);
    $('#login').dialog('close');
    if(openOrderSettings.loginProgress ) {
        wait( 'Logging in ' + username, 20);
    }
    return false;
}


function verifyLogin() {
    if( !$.ceam.isLoggedIn) {
        $.popup.show('Error','Invalid Username or Password.\nPlease Try again.');
    }
}

function processCart(xml) {
    displaySummaryCart(xml);
    displayPopupCart(xml);
    displayEditCart(xml);
}

function displaySummaryCart(xml) {
    var cart = $('cart', xml);
    $('#nItems').html(cart.attr('nItems'));

    var value = cart.attr('value');
    if( isWholesale(xml) ) {
        value *= 1.1;
        value = value.toFixed(2);
//        value = '$' + value +' Ex Tax';
//    } else {
//        value = '$' + value +' Inc Tax';
    }

    $('#orderTotal').html('$' + value);
}

var popupCartLineTemplate = $.template("<tr class='line'><td >${code}</td><td >${description}</td><td >${price}</td><td>${quantity}</td></tr>", templateOptions);

function displayPopupCart(xml){
    var wholesale = isWholesale(xml);
    var html = "<table id='popHead' class='popCurrent'><tr>" +
"<th>Code</th>" +
"<th>Description</th>" +
"<th>Price<br/>" + (wholesale? "(Ex Tax)" : "(Inc Tax)") + "</th>" +
"<th>Qty</th>" +
"</tr>";

    $.each(extractProductData($('product',xml)), function(){
       html += popupCartLineTemplate.apply(this);
    });

    var total = extractCartTotals($('cart', xml), wholesale);

    html +=
    "<tr class='separator'><td colspan=4></td></tr>" +
    "<tr class='total'>" +
    "<td colspan=2>Total GST</td>" +
    "<td colspan=2>$" + total.gst + "</td>" +
    "</tr>" +
    "<tr class='total'>" +
    "<td colspan=2>Total Price</td>" +
    "<td colspan=2>$" + total.order+ "</td>" +
    "</tr>" +
    "<tr class='separator'><td colspan=4></td></tr>" +
    "</table>";

    $('#popupCartDetail').empty().append(html);
}


function extractProductData(xmllines) {
    var lines = [];
    xmllines.each(function() {
        var p = $(this);
        var groupCode =p.attr('id').split(':');
        var data = {
            sourceId: p.attr('id'),
            group : groupCode[0],
            code : groupCode[1],
            description: p.attr('desc') ,
            unit: p.attr('unit'),
            price: formatPrice(p.attr('price')),
            totalPrice:formatPrice(p.attr('total')),
            quantity:p.attr('qty'),
            type: (groupCode[1] == '' ? 'comment' : 'product')
        };
        lines.push(data);
    });
    return lines;
}

function extractCartTotals( cartxml, wholesale ) {
    var orderTotal 	= cartxml.attr('value');
    var nItems 		= cartxml.attr('nItems');

    var totalGST = 0;
    if (wholesale) {
        totalGST = orderTotal/10;
    } else  {
        totalGST = orderTotal/11;
    }
    totalGST	= totalGST.toFixed(2);

    orderTotal = parseFloat(orderTotal);
    if (wholesale) {
        orderTotal *= 1.1;
    }
    orderTotal = orderTotal.toFixed(2);

    return {
      nItems: nItems,
      order: orderTotal,
      gst: totalGST,
      extax: orderTotal - totalGST
    };

}

var editCartLineTemplate = $.template("<tr class='line ${type}' id='${sourceId}'><td>${code}</td><td class='desc'>${description}</td><td class='price'>${price}</td>" +
                   "<td><input name='qty' value='${quantity}'/></td><td class='unit'>${unit}</td><td class='price'>${totalPrice}</td>" +
                   "<td><img  class='deleteLine' src='images/trash.gif'></td></tr>", templateOptions);

function displayEditCart(xml){
    var wholesale = isWholesale(xml);
    var html = "<tr>" +
                   "<th>Code</th><th>Description</th><th>Unit Cost "+(wholesale? "Ex Tax" : "Inc Tax")+"</th><th>Quantity</th><th>Unit</th>"+
                   "<th>Total</th><th>Remove</th>"+
                "</tr>";



    var lines = extractProductData($('product',xml));
    if( lines.length > 0) {
        $.each(lines, function(){
           html += editCartLineTemplate.apply(this);
        });

        var totals = extractCartTotals($('cart', xml), wholesale);

        html +=
        "<tr class='separator'><td colspan=7></td></tr>" +
        "<tr class='total'>" +
        "<td colspan=4></td>" +
        "<td>GST</td>" +
        "<td class='price'>$" + totals.gst + "</td>" +
        "<td><input type='button' class='button' value='Update' onclick='return updateCartContents(event);'></td>" +
        "</tr>" +
        "<tr class='total'>" +
        "<td colspan=4></td>" +
        "<td>Total</td>" +
        "<td class='price'>$" + totals.order + "</td>" +
        "<td colspan=1></td>" +
        "</tr>" +
        "<tr class='separator'><td colspan=7></td></tr>";
        $('.showWithCart').show();
    } else {
        html = '';
        $('.showWithCart').hide();
    }

    $('#editCartDetail').empty().append(html);
    applyStyles('#editCartDetail');
    $('#editCartDetail .deleteLine').click(deleteCartLine);
}



function isWholesale(xml) {
    return ($('webpage',xml).attr('wholesale') == "1");
}


function cartInit() {
    $.ceam.getCart(processCart);
    $('#cartBillAddress select').change(function() {
        var details;
        if( $(this).val() == "Default") {
            details = $('#contacts-data #billing').html();
        } else {
            details = $('#contacts-data .contact[name="'+$(this).val()+'"]').html();
        }
        if( details ) {
            $('#cartBillAddress .details').html(details);
            $.ceam.setCartBillingAddress(extractContactDataFromChildren($('#cartBillAddress .details')));
        }
    });
    $('#cartDeliveryAddress select').change(function() {
        var details;
        if( $(this).val() == "Default") {
            details = $('#contacts-data #delivery').html();
        } else {
            details = $('#contacts-data .contact[name="'+$(this).val()+'"]').html();
        }
        if( details) {
            $('#cartDeliveryAddress .details').html(details);
            $.ceam.setCartDeliveryAddress(extractContactDataFromChildren($('#cartDeliveryAddress .details')));
        }
    });
    setupCartAddressSelect($('#cartBillAddress'));
    setupCartAddressSelect($('#cartDeliveryAddress'));

    $.ceam.getCartAddresses(updateCartAddresses);
    $('#customerReferenceInput').change(saveCustomerReference);
}

function updateCartAddresses(xml) {
    var delivery = addressTemplate.apply(extractContactDataFromAttributes($('address[type="Delivery"]',xml)));
    var billing = addressTemplate.apply(extractContactDataFromAttributes($('address[type="Billing"]',xml)));
    $('#cartBillAddress .details').html(billing);
    $('#cartDeliveryAddress .details').html(delivery);
    $('#customerReferenceInput').val($('custref',xml).attr('desc'));
}

function setupCartAddressSelect(address) {
    address.find('select').empty();
    var select = address.find('select');

    var current = address.find('.name').text();
    select.append("<option>Default</option>");
    $('#contacts-data .contact').each(function() {
        var val = $(this).children('.name').text();
        if( val === current) {
            select.append("<option selected='selected'>"+val+"</option>");
        }else {
            select.append("<option>"+val+"</option>");
        }
    });

    address.find('select').styledSelect();
    //select.change();
}



function addProductToCart(event) {
    var form = $(event.target).closest('form');
    $.ceam.addProductToCart(form.find(':input[name="prd"]').val(),
                            form.find(':input[name="qty"]').val(),
                            form.find(':input[name="desc"]').val(),
                            form.find(':input[name="unit"]').val(),
                            function(xml) {
                                form.find(':text').val('');
                                processCart(xml);
                            });
    return false;
}

function addAllProductsToCart(event) {
    var container = $(event.data);
    container.find('form').each(function() {
        var form = $(this);
        if( form.find(':input[name="qty"]').val() > 0) {
            $.ceam.addProductToCart(form.find(':input[name="prd"]').val(),
                                    form.find(':input[name="qty"]').val(),
                                    form.find(':input[name="desc"]').val(),
                                    form.find(':input[name="unit"]').val(),
                                    function(xml) {
                                        form.find(':text').val('');
                                        processCart(xml);
                                    });
        }
    });

    return false;
}

function updateCartContents(event) {
    var table = $('#editCartDetail');
    var row = 1;
    var cart = {};
    table.find('tr.line').each(function() {
        var line = $(this);
        cart['prd'+row] = line.attr('id');
        cart['desc'+row] = line.find('td.desc').text();
        cart['qty'+row] = line.find(':input[name=qty]').val();
        cart['unit'+row] = line.find('td.unit').text();
        row += 1;
    });
    wait('Updating Shopping Cart',5);
    $.ceam.updateCart(cart, function(xml) {
        processCart(xml);
        // Updating cart loses customer reference
        $.ceam.saveCustomerReference($('#customerReferenceInput').val());
    });
    return false;
}

function deleteCartLine(event) {
    var row = $(event.target).closest('tr.line');
    row.find(':input[name=qty]').val('0');
    updateCartContents(event);
}

function emptyCart() {
    $('#customerReferenceInput').val('');
    $.ceam.emptyCart( processCart);
}

function saveCustomerReference() {
    $.ceam.saveCustomerReference($(this).val());
}

function saveCartAsStandardOrder() {
    $.ceam.saveCartAsStandardOrder();
}

function checkout() {
    if( $('#customerReferenceInput').val() == '' ) {
        $.popup.show('Error','You must enter a customer reference.', {postHide:function(){
            $('#customerReferenceInput').focus();
        }});
        return false;
    };
    wait("Confirming addresses");
    $.ceam.getCartAddresses(function(xml){
        wait("Confirming cart");
        updateCheckoutCartAddresses(xml);
        $.ceam.getCart(function(xml){
            displayCheckoutCart(xml);
            $('#checkout').dialog('open');
        });
    });
}

var checkoutLineTemplate = $.template("<tr class='line ${type}' id='${sourceId}'><td>${code}</td><td class='desc'>${description}</td><td class='price'>${price}</td>" +
                   "<td class='qty'>${quantity}</td><td class='unit'>${unit}</td><td class='price'>${totalPrice}</td></tr>", templateOptions);

function displayCheckoutCart(xml){
    var wholesale = isWholesale(xml);
    var html = "<tr>" +
                   "<th>Code</th><th>Description</th><th>Unit Cost "+(wholesale? "Ex Tax" : "Inc Tax")+"</th><th>Quantity</th><th>Unit</th>"+
                   "<th>Total</th>"+
                "</tr>";


    $.each(extractProductData($('product',xml)), function(){
       html += checkoutLineTemplate.apply(this);
    });

    var totals = extractCartTotals($('cart', xml), wholesale);

    html +=
    "<tr class='separator'><td colspan=6></td></tr>" +
    "<tr class='total'>" +
    "<td colspan=4 '></td>" +
    "<td '>GST</td>" +
    "<td class='price'>$" + totals.gst + "</td>" +
    "</tr>" +
    "<tr class='total'>" +
    "<td colspan=4></td>" +
    "<td>Total</td>" +
    "<td class='price'>$" + totals.order + "</td>" +
    "</tr>" +
    "<tr class='separator'><td colspan=6></td></tr>";

    $('#checkoutCartDetail').empty().append(html);
    if($('category',xml).attr('book') ) {
        $('#checkoutBook').text($('category',xml).attr('book'));
        $('#checkoutNumber').text($('category',xml).attr('num'));
        $('#checkoutCartCustomerReference .modifyOrder').show();
    } else {
        $('#checkoutCartCustomerReference .modifyOrder').hide();
    }

}

function updateCheckoutCartAddresses(xml) {
    var delivery = addressTemplate.apply(extractContactDataFromAttributes($('address[type="Delivery"]',xml)));
    var billing = addressTemplate.apply(extractContactDataFromAttributes($('address[type="Billing"]',xml)));
    $('#checkoutCartBillAddress .details').html(billing);
    $('#checkoutCartDeliveryAddress .details').html(delivery);
    $('#checkoutCartCustomerReference span.ref').text($('custref',xml).attr('desc'));
}

function confirmCheckout() {
    $('#checkout').dialog('close');
    if( $('#checkoutBook').text() != '' ) {
        // Saving an existing order
        wait("Updating Sales Order", 5);
        $.ceam.updateOrderFromCart($('#checkoutBook').text(), $('#checkoutNumber').text(), function(xml){
            processCart(xml);
            $.ceam.getCartAddresses(updateCartAddresses);
        });
    } else {
        wait("Submitting Sales Order", 5);
        $.ceam.checkout(function(xml){
            processCart(xml);
            $.ceam.getCartAddresses(updateCartAddresses);
        });
    }
}

function myAccountInit() {
    $('#accountMenu a').click(function() {
        $('.account').hide();
        $($(this).attr('rel')).show();
    });
    $('#editProfileMenuItem').click(function() {
        $.ceam.contactData(loadProfile);
    });
    $('#billingAddressMenuItem').bind("click",{selector:'#billing', type:'Billing'}, loadCompanyInfo);
    $('#deliveryAddressMenuItem').bind("click",{selector:'#delivery', type:'Delivery'},loadCompanyInfo);
    $('#addressBookMenuItem').click(displayAddresses);
    $('#defaultAddressesMenuItem').click(displayDefaultAddresses);
    $('#defaultAddressesForm').bind('submit',updateDefaultAddresses);
    $('#changePasswordForm').bind('submit', updatePassword);

    $("#contactModifyForm").validate({
        submitHandler:modifyContact
    });

    $('#addNewAddress').click(function() {
        $('.account').hide();
        $('#contactModifyForm').find(':input:not(:submit)').val('');
        $('#contactModifyForm .update').hide();
        $('#contactModifyForm .new').show();
        $('#editProfile').show();
    });


}

function updatePassword(event) {
    var form = $(event.target);
    $.ceam.changePassword(form.serializeArray(), function() {
        form[0].reset();
    });
    return false;
}

function loadProfile(xml) {
    var contact = $('contact[isuser=1]',xml);
    var form = $('#contactModifyForm');
    var address = extractContactDataFromAttributes(contact.children('address'), {contact:contact.attr('name')});
    for( var field in address ) {
        form.find(':input[name='+field+']').val(address[field]);
    }
}

function inNameValueArray( name, array ) {
    for ( var i = 0, length = array.length; i < length; i++ ) {
        if ( array[ i ].name == name ) {
            return i;
        }
    }
    return -1;
}
function getValueFromNameValueArray( name, array ) {
    for ( var i = 0, length = array.length; i < length; i++ ) {
        if ( array[ i ].name == name ) {
            return array[ i ].value;
        }
    }
    return null;
}


function modifyContact(form) {
    var params = $(form).serializeArray();

    if( inNameValueArray('delete',params) >= 0) {
        $.ceam.removeContactDetails(getValueFromNameValueArray('contact',params), function(xml) {
            updateContactData(xml);
             $('#addressBookMenuItem').click();
        });
    } else if( inNameValueArray('add',params) >= 0) {
        $.ceam.addContactDetails(params, function(xml) {
            updateContactData(xml);
             $('#addressBookMenuItem').click();
        });
    } else {
        $.ceam.setContactDetails(params, updateContactData);
    }
    return false;
}


function displayAddresses() {
    $('#addressBook ul').empty();
    $('#contacts-data .contact').each(function() {
        $('#addressBook ul').append('<li rel="' +$(this).attr('name') + '">'+$(this).attr('name')+'</li>');
    });
    $('#addressBook li').click(function() {
        var contact = $('#contacts-data .contact[name="'+$(this).attr('rel')+'"]');
        var form = $('#contactModifyForm');
        var address = extractContactDataFromChildren(contact, {contact:contact.attr('name'), name:contact.attr('name')});
        for( var field in address ) {
            form.find(':input[name='+field+']').val(address[field]);
        }
        $('.account').hide();
        $('#contactModifyForm .update').show();
        $('#contactModifyForm .new').hide();
        $('#editProfile').show();
    });
}
function displayDefaultAddresses() {
    $('#defaultBillingAddress').empty();
    $('#defaultBillingAddress').append('<option value="">Default</option>');
    $('#contacts-data .contact').each(function() {
        $('#defaultBillingAddress').append('<option>'+$(this).attr('name')+'</option>');
    });
    $('#defaultBillingAddress').val($('#contacts-data .contact[isbilling=true]').attr('name'));

    $('#defaultDeliveryAddress').empty();
    $('#defaultDeliveryAddress').append('<option value="">Default</option>');
    $('#contacts-data .contact').each(function() {
        $('#defaultDeliveryAddress').append('<option>'+$(this).attr('name')+'</option>');
    });
    $('#defaultDeliveryAddress').val($('#contacts-data .contact[isdelivery=true]').attr('name'));    
}

function updateDefaultAddresses(event) {
    $.ceam.setDefaultBillingAddress($('#defaultBillingAddress').val(), function() {
        $.ceam.setDefaultDeliveryAddress($('#defaultDeliveryAddress').val(), function(xml) {
            updateContactData(xml);
        });
    });
    return false;
}

function loadCompanyInfo(event) {
    var data = event.data
    var company = $('#contacts-data ' + data.selector);
    var form = $('#companyInfoModifyForm');
    form.parent().find('.addresstype').text(data.type)
    var address = extractContactDataFromChildren(company);
    for( var field in address ) {
        form.find(':input[name='+field+']').val(address[field]);
    }
}

var invoiceTable;
function myOrdersInit() {
    $('#invoicesMenuItem').click(function () {
        $('#invoices h2').text('Invoices');
        invoiceTable.fnClearTable();
        wait('Retrieving invoices');
        $.ceam.getInvoices('all', displayInvoices);
    });
    $('#ordersCompletedMenuItem').click(function () {
        $('#invoices h2').text('Orders Completed');
        invoiceTable.fnClearTable();
        wait('Retrieving completed orders');
        $.ceam.getOrders('complete', displayInvoices);
    });
    $('#ordersInProgressMenuItem').click(function () {
        $('#invoices h2').text('Orders in Progress');
        invoiceTable.fnClearTable();
        wait('Retrieving orders in progress');
        $.ceam.getOrders('placed', displayInvoices);
    });
    $('#ordersNotAuthorisedMenuItem').click(function () {
        $('#invoices h2').text('Orders Not Authorised');
        invoiceTable.fnClearTable();
        wait('Retrieving orders not authorised');
        $.ceam.getOrders('unauthorised', displayInvoices);
    });
    $('#standardOrdersMenuItem').click(function () {
        $('#invoices h2').text('Standard Orders');
        invoiceTable.fnClearTable();
        wait('Retrieving standard orders');        
        $.ceam.getStandardOrders(displayInvoices);
    });
    invoiceTable = $('#invoiceTable').dataTable({
        bStateSave:false,
        bAutoWidth:false,
        bSort_Classes:false,
        aaSorting:[[1,'desc']],
        sPaginationType:'full_numbers',
        iDisplayLength:25,
        aoColumns: [
            {sClass:'id'}, //num
            {sType:'date' }, //date
            { }, //price
            { }, //ref
            { }  //status
        ]

    });
    $('#invoiceTable tbody tr').live('click',function() {
        wait('Fetching your document');
        var booknum = $(this).find('.id').text().split('-');
        $.ceam.getDocument(booknum[0], booknum[1], displayDocument);
    });

}

var invoiceLineTemplate = $.template('<tr><td class="id">${number}</td><td>${date}</td><td class="price">${total}</td><td>${customerRef}</td><td>${status}</td>', templateOptions);

function displayInvoices(xml) {
//    $('#invoiceTable tbody').empty();
    invoiceTable.fnClearTable();
    //var table = $('#invoiceTable tbody');
    var data = [];
    $('invoice:not(:empty)', xml).each(function() {
        var inv = $(this);
        data.push([
            inv.children('invnum').text(),
            inv.children('invdate').text(),
            '$'+inv.children('invtotals').text(),
            inv.children('custref').text(),
            inv.children('invstatus').text()
        ]);
    });
    // Used to display standard orders
    $('order', xml).each(function() {
        var ord = $(this);
        data.push([
            ord.attr('book')+'-'+ord.attr('num'),
            ord.attr('date'),
            ord.attr('total'),
            ord.attr('ref'),
            ord.attr('status')
        ]);
    });
    invoiceTable.fnAddData(data);
//    $('#invoiceTable').dataTable({
//        bStateSave:true
//    });
}


var documentLineTemplate = $.template("<tr class='line ${linetype}' id='${sourceId}'><td>${code}</td><td class='desc'>${description}</td><td class='unit'>${unit}</td><td class='price'>${unitPrice}</td>" +
                   "<td class='qty'>${quantity}</td><td class='price'>${gst}</td><td class='price'>${totalPrice}</td>", templateOptions);


function displayDocument(xml) {
    var wholesale = isWholesale(xml);

    var isquote = ($('orderdetail',xml).attr('doctype') === 'Q');
    var notauthorised = ($('orderdetail',xml).attr('processed') === 'N');

    var delivery = addressTemplate.apply(extractContactDataFromAttributes($('address[type="Delivery"]',xml)));
    var billing = addressTemplate.apply(extractContactDataFromAttributes($('address[type="Billing"]',xml)));
    $('#documentBillAddress .details').html(billing);
    $('#documentDeliveryAddress .details').html(delivery);

    var details=$('orderdetail', xml);
    $('#docDate').text(details.attr('docdate'));
    $('#docCustomerRef').text(details.attr('ref'));
    $('#docNumber').text(details.attr('book')+'-'+details.attr('num'));
    $('#docAccountCode').text(details.attr('billtocode'));
    $('#docSalesperson').text(details.attr('salesperson'));
    $('#docTerms').text(details.attr('debtterms'));

    var html = "<tr>" +
                   "<th>Code</th><th>Description</th><th>Unit</th><th>Unit Price</th><th>Quantity</th>"+
                   "<th>GST</th><th>Total</th>"+
                "</tr>";

    var lines = [];
    $('lineitem[linetype!=Y][linetype!=H]', xml).each(function() {
        var p = $(this);
        var groupCode =p.attr('gpprod').split(':');
        var data = {
            sourceId: p.attr('gpprod'),
            group : groupCode[0],
            code : groupCode[1],
            description: p.attr('desc') ,
            unit: p.attr('unit'),
            unitPrice: formatPrice(p.attr('selleach')),
            gst: formatPrice(p.attr('gst')),
            totalPrice:formatPrice(p.attr('total')),
            quantity:p.attr('ordqty'),
            linetype:''
        };
        if( p.attr('linetype')=='P' && groupCode[0] != "PACKING") {
            data.linetype = 'item';
        }
        lines.push(data);
    });


    $.each(lines, function(){
       html += documentLineTemplate.apply(this);
    });

    var orderTotal = $('orderdetail',xml).attr('total');
    var totalGST = orderTotal/11;
    var totalGST	= totalGST.toFixed(2);


    html +=
    "<tr class='separator'><td colspan=7></td></tr>" +
    "<tr class='total'>" +
    "<td colspan=5 '></td>" +
    "<td '>GST</td>" +
    "<td class='price'>$" + totalGST+ "</td>" +
    "</tr>" +
    "<tr class='total'>" +
    "<td colspan=5></td>" +
    "<td>Total</td>" +
    "<td class='price'>$" + orderTotal + "</td>" +
    "</tr>" +
    "<tr class='separator'><td colspan=7></td></tr>";

    $('#documentDetail').empty().append(html);
    if( isquote ) {
        $('#document .standardOrder').show();
    } else {
        $('#document .standardOrder').hide();
    }
    if( notauthorised && $.ceam.canAuthorise) {
        $('#document .authoriseOrder').show();
    } else {
        $('#document .authoriseOrder').hide();
    }
    $('#document').dialog('open');
}

function removeStandardOrder() {
    $('#document').dialog('close');
    wait("Removing Standard Order", 5);
    $.ceam.removeStandardOrders($('#docNumber').text(), function(){
        displayStandardOrders();
    });

}

function addOrderToCart() {
    $('#document').dialog('close');
    wait('Retrieving current cart');
    $.ceam.getCart(function(xml) {
        var row = 1;
        var cart = {};

        $('product',xml).each(function(){
            var prod = $(this);
            cart['prd'+row] = prod.attr('id');
            cart['desc'+row] = prod.attr('desc');
            cart['qty'+row] = prod.attr('qty');
            cart['unit'+row] = prod.attr('unit');
            row += 1;

        });

        var table = $('#documentDetail');
        table.find('tr.item').each(function() {
            var line = $(this);
            cart['prd'+row] = line.attr('id');
            cart['desc'+row] = line.find('td.desc').text();
            cart['qty'+row] = line.find('td.qty').text();
            cart['unit'+row] = line.find('td.unit').text();
            row += 1;
        });
        wait('Updating Shopping Cart',5);
        switchToTab('cart');
        $.ceam.updateCart(cart, processCart);
    });
}

function emailDocument() {
    $('#document').dialog('close');
    wait('Sending email');
    var docnumber = $('#docNumber').text().split('-');
    $.ceam.emailDocument(docnumber[0],docnumber[1]);
}

function displayStandardOrders() {
    switchToTab('myorders');
    $('#standardOrdersMenuItem').click();
}

function displayNotAuthorisedOrders() {
    switchToTab('myorders');
    $('#ordersNotAuthorisedMenuItem').click();
}


function cancelOrder() {
    $('#document').dialog('close');
    wait('Cancelling order');
    var docnumber = $('#docNumber').text().split('-');
    $.ceam.cancelOrder(docnumber[0],docnumber[1], function() {
        $('#ordersNotAuthorisedMenuItem').click();
    });
}
function authoriseOrder() {
    $('#document').dialog('close');
    wait('Authorising order');
    var docnumber = $('#docNumber').text().split('-');
    $.ceam.authoriseOrder(docnumber[0],docnumber[1], function() {
        $('#ordersNotAuthorisedMenuItem').click();
    });
}
function modifyOrder() {
    $('#document').dialog('close');
    wait('Loading order');
    var docnumber = $('#docNumber').text().split('-');
    $.ceam.loadCartFromOrder(docnumber[0],docnumber[1], function(xml) {
        switchToTab('cart');
        processCart(xml);
        $.ceam.getCartAddresses(updateCartAddresses);
    });
}