(function($) {               

  // plugin code here, use $ as much as you like
    $.ceam = function(options) {

    };

    $.ceam.defaults = {
        path : '/ceam',
        server : '',
        onError:ceamCallFailed,
        onSuccess:ceamStub,
        onLogin:ceamStub,
        onLogout:ceamStub,
        onAuthorise:ceamStub,
        useSearchTree: false,
        clientLog: false
    };

    $.ceam.isLoggedIn=false;
    $.ceam.canAuthorise;

    $.ceam.login = function(username, password, onSuccess) {
        call('oo_login', {uid:username, pwd:password}, onSuccess, null, "Login " + username);
    };

    $.ceam.logout = function(onSuccess) {
        call('oo_login', {uid:'', pwd:''}, onSuccess, null, "Logout " + $.cookies.get('AuthName'));
    };
    $.ceam.getAuthorisedStatus= function(onSuccess) {
        call('oo_ordlist', {mode:134913}, onSuccess);
    };


    $.ceam.storeData = function(onSuccess) {
        call('oo_contact', {},onSuccess);
    };

    $.ceam.contactData = function(onSuccess) {
        call('oo_contact', {}, onSuccess);
    };


    $.ceam.productCategory= function(nodeId, onSuccess) {
        if($.ceam.defaults.useSearchTree ) {
            call('oo_prdsrch', { nodeid:nodeId}, onSuccess);
        } else {
            call('oo_prdbrws', { nodeid:nodeId}, onSuccess);
        }
    };

    $.ceam.productSearch = function(type, text, onSuccess ) {
        var mode = type == 'c' ? '6161' : '7185';  // Code search, Description Search
        var limit = type == 'c' ? 50 : 150;
        call('oo_catsrch', {rows:limit, sequence:0, searchtxt:text,btnSearch:'Go', mode:mode}, onSuccess);
    };

    $.ceam.getFavourites= function(onSuccess ) {
        call('oo_fav', {}, onSuccess);
    };
    $.ceam.addToFavourites= function(id, onSuccess ) {
        call('oo_fav', {add:id}, onSuccess);
    };
    $.ceam.removeFromFavourites= function(id, onSuccess ) {
        call('oo_fav', {del:id}, onSuccess);
    };


    $.ceam.getCart= function(onSuccess) {
        call('oo_crtview', {mode:1}, onSuccess);
    };

    $.ceam.getCartAddresses= function(onSuccess) {
        call('oo_chkout', {step:0}, onSuccess);
    };
    $.ceam.checkout= function(onSuccess) {
        post('oo_chkout', {step:2}, onSuccess);
    };
    $.ceam.saveCustomerReference= function(value, onSuccess) {
        call('oo_custref', {custref:value}, onSuccess);
    };

    $.ceam.setCartBillingAddress= function(address,onSuccess) {
        call('oo_contmod', add(address, {mode:6, name:'Contact', contact:address.name}), onSuccess);
    };

    $.ceam.setCartDeliveryAddress= function(address,onSuccess) {
        call('oo_contmod', add(address, {mode:5, name:'Contact', contact:address.name}), onSuccess);
    };

    $.ceam.setDefaultBillingAddress= function(name,onSuccess) {
        call('oo_contmod',  {mode:8, name:name}, onSuccess);
    };

    $.ceam.setDefaultDeliveryAddress= function(name,onSuccess) {
        call('oo_contmod', {mode:7, name:name}, onSuccess);
    };

    $.ceam.addProductToCart= function(id,quantity, description, unit, onSuccess) {
        if( !quantity) {
            quantity=1;
        }
        post('oo_crtadd', {prd:id, qty:quantity, desc:description, unit:unit}, onSuccess);
    };
    
    $.ceam.updateCart= function(contents, onSuccess) {
        post('oo_crtmod', add(contents, {mode:1}), onSuccess);
    };
    $.ceam.emptyCart= function( onSuccess) {
        post('oo_crtmod', {mode:2}, onSuccess);
    };

    $.ceam.saveCartAsStandardOrder=function(onSuccess) {
        call('oo_stdord',{},onSuccess);
    };
    $.ceam.updateOrderFromCart= function(book,num, onSuccess) {
        post('oo_ordsave', {book:book,num:num},onSuccess);
    };
    $.ceam.loadCartFromOrder= function(book,num, onSuccess) {
        post('oo_ordload', {book:book,num:num},onSuccess);
    };


    $.ceam.changePassword= function(data, onSuccess) {
        post('oo_profile', add(data,{mode:1}), onSuccess);
    };

    $.ceam.setContactDetails= function(data,onSuccess) {
        call('oo_contmod', add(data, {mode:1}), onSuccess);
    };

    $.ceam.removeContactDetails= function(contact,onSuccess) {
        call('oo_contmod',  {contact:contact, mode:4}, onSuccess);
    };
    $.ceam.addContactDetails= function(data,onSuccess) {
        call('oo_contmod', add(data, {mode:3}), onSuccess);
    };


    $.ceam.getInvoices= function(status,onSuccess) {
        call('oo_invoice', {docstatus:status, type:'I'}, onSuccess);
    };
    $.ceam.getOrders= function(status, onSuccess) {
        call('oo_invoice', {docstatus:status, type:'S'}, onSuccess);
    };
    $.ceam.getStandardOrders= function(onSuccess) {
        call('oo_ordlist', {mode:130816}, onSuccess);
    };
    $.ceam.removeStandardOrders= function(id, onSuccess) {
        call('oo_stdord', {remove:2, id:id}, onSuccess);
    };

    $.ceam.getDocument= function(book,num, onSuccess) {
        call('oo_invdet', {book:book,num:num},onSuccess);
    };
    $.ceam.emailDocument= function(book, number, onSuccess) {
        call('oo_ordemai', {book:book, num:number},onSuccess);
    };

    $.ceam.cancelOrder= function(book, number, onSuccess) {
        call('oo_ordcncl', {book:book, num:number},onSuccess);
    };
    $.ceam.authoriseOrder= function(book, number, onSuccess) {
        call('oo_ordauth', {book:book, num:number},onSuccess);
    };



    function add( params, additional ) {
        if( $.isArray(params)) {
            for( var name in additional) {
                params.push( {name:name, value: additional[name]});
            }
            return params;
        } else {
            return $.extend(params, additional);
        }
    }

    function post(workflow, params, onSuccess, logMsg) {
        call(workflow, params, onSuccess,'POST', logMsg);
    }

    function call(workflow, params, onSuccess, method, logMsg) {
        if( !method){
            method= 'GET';
        };

        for (p in params) {
            if( params[p] == undefined) {
                delete params[p];
            }
        }

        var ceamRequest = { workflow:workflow, type:method, params:params};

        $.ajax({
           type:method,
           data:params,  
           cache: false,
           dataType: 'xml',
           error: function(XMLHttpRequest, textStatus, errorThrown) {
               $.ceam.defaults.onError(XMLHttpRequest, textStatus, errorThrown, ceamRequest );
               if( logMsg ) {
                  $.ceam.log("ERROR -  " + (textStatus ? textStatus : errorThrown) + " - " + logMsg, ceamRequest,data);
               }
           },
           success: function(data, textStatus){
               $.ceam.defaults.onSuccess(data, textStatus, ceamRequest);
               if(onSuccess) onSuccess(data, textStatus,ceamRequest);
               if( logMsg ) {
                  $.ceam.log(logMsg, ceamRequest,data);
               }
               checkLoginStatus(data,ceamRequest);
           },
           url:$.ceam.defaults.path + '/' + workflow
        });
    };

    function ceamCallFailed(XMLHttpRequest, textStatus, errorThrown) {
        alert('Unable to Retrieve Data from Store');
    };
    function ceamStub() {
    };

    function checkLoginStatus(data, ceamRequest) {
        var newlogin = $('webpage',data).attr('loggedin');
        if( $.ceam.isLoggedIn != newlogin) {
            if( newlogin == 1) {
                $.ceam.isLoggedIn = true;
                $.ceam.getAuthorisedStatus(checkAuthorisedStatus);
                $.ceam.defaults.onLogin(data);

            } else {
                $.ceam.log("checkLoginStatus: No longer logged in", ceamRequest,data);
                $.ceam.isLoggedIn = false;
                $.ceam.canAuthorise = false;
                $.ceam.defaults.onLogout(data);
            }
        }
    };
    function checkAuthorisedStatus(xml){
        $.ceam.canAuthorise = ($('order',xml).attr('canauthorise') == 1);
        $.ceam.defaults.onAuthorise($.ceam.canAuthorise );
    };

    $.ceam.log = function ( message, ceamRequest, response) {
        if( $.ceam.defaults.clientLog) {
            var params ='';
            for( p in ceamRequest.params ) {
                params +=  p + " = " + ceamRequest.params[p] +",";
            }

            $.post(
                'client_log.php',
                {
                    msg: message,
                    workflow: ceamRequest.workflow,
                    requestType: ceamRequest.type,
                    params: params,
                    response: xmlToString(response)
                }

            );
        }
    }

    function xmlToString(xml) {
        if( xml == null) {
            return '';
        }
        xml = $(xml);
        var s = "";

        if (xml.length) 
            xml.each(function() {
                if(window.ActiveXObject) {  //==  IE browser ?
                    s+= this.xml;
                } else {
                    s+= (new XMLSerializer()).serializeToString(this);
                }
            });
        return s;
    }
    

})(jQuery);
