
var generic = generic || {};

/**
 * @namespace
 */
var bb = bb || {};

/**
 * @namespace
 */
bb.qas = bb.qas || {};

/**
 * This constructor method creates and returns a productCatalog singleton object.
 * The method exectues immediately on load. 
 * object that executes 
 * @return {Object} product catalog object
 * @namespace
 * @methodOf generic
 */
bb.qas = ( function() {
    var QASResult = function(responseData) {
        var data = responseData;
    };
        
    /** @scope generic.productCatalog */
    return {
        /* args is a hash */
        getQASAddress: function(args){
          
            var self = this;   
            var onSuccess = args.onSuccess || Prototype.emptyFunction;  
            var onFailure = args.onFailure || Prototype.emptyFunction; 

            var search_string = ( !$("form--qas_do_search--field--QAS_PICKLIST" + args.params.suffix) ) ?  
                                $("form--qas_do_search--field--QAS_BUILDING" + args.params.suffix).getValue().strip() + "," +
                                $("form--qas_do_search--field--QAS_POSTCODE" + args.params.suffix).getValue().strip() : '';

            var moniker = ( $("form--qas_do_search--field--QAS_PICKLIST" + args.params.suffix) ) ?  
                            $("form--qas_do_search--field--QAS_PICKLIST" + args.params.suffix).getValue() : ''; 

            var params = {
                'MONIKER': moniker,
                'SEARCH_STRING': search_string,
                'SUFFIX': args.params.suffix
            };  
        
            var id = generic.jsonrpc.fetch({
                "method" : 'qas.doSearch',
                "params" : [params],
                "onSuccess": function(jsonRpcResponse){  
                    var data = jsonRpcResponse.getData(); 
                    
                    //load data
                    var QASResultObj = new QASResult(data);
                    onSuccess(jsonRpcResponse);
                },
                "onError": function(jsonRpcResponse){
                    onFailure(jsonRpcResponse);
                },
                "onFailure": function(jsonRpcResponse){
                    onFailure(jsonRpcResponse);
                }
            });
 
            return id;
        }, 
        clearAllData : function () {
            data = {};
        }      

    };
} )();

bb.qas.addButton = function (args) {
    var addButtonNode = args.addButtonNode;

    addButtonNode.observe("click", function(clickEvt) {
        clickEvt.preventDefault();
        bb.qas.addQASCall(args);
    });
};

bb.qas.addQASCall = function (args) {
    var progressNode = args.progressNode;
    var addButtonNode = args.addButtonNode;

    if (progressNode) {
        progressNode.style.display = "block";
        addButtonNode.style.display = "none";
    }
    var revertButton = function() {
        if (progressNode) {
            progressNode.style.display = "none";
            addButtonNode.style.display = "block";
        }            
    };

    bb.qas.getQASAddress({
        params: {
            'suffix': args.suffix
        },
        onSuccess: function(r) {
            var self = this;
            var result_value = r.getValue();
            var suffix = result_value.query.SUFFIX;
            var suffix_lc = (suffix) ? suffix.toLowerCase() : '';
            var qas_node = $("QAS_NODE" + suffix);
            var addressFormName = (args.addressFormName) ? args.addressFormName : 'address';
            var params = {};

            // If we have full address, split correctly.
            if( result_value.data.result_address ) {

                //Populate the address fields
                $('form--' + addressFormName + suffix_lc + '--field--ADDRESS1' + suffix).setValue( result_value.data.result_address[0] );
                $('form--' + addressFormName + suffix_lc + '--field--ADDRESS2' + suffix).setValue( result_value.data.result_address[1] );
                $('form--' + addressFormName + suffix_lc + '--field--ADDRESS3' + suffix).setValue( result_value.data.result_address[2] );
                $('form--' + addressFormName + suffix_lc + '--field--ADDRESS4' + suffix).setValue( result_value.data.result_address[3] );
                $('form--' + addressFormName + suffix_lc + '--field--POSTAL_CODE' + suffix).setValue( result_value.data.result_address[4] );

                params = {
                    'QAS_SUFFIX': suffix
                }; 

                // fetch HTML template            
                generic.templatefactory.get({path: '/templates/qas/qas_search_again.tmpl'}).evaluateCallback({
                    object: params,
                    callback: function(html) {
                        qas_node.update(html); 

                        //Reattach the event listener to the submit button.
                        var buttonNode = $("QAS_SUBMIT" + suffix);
                        var responseNode = $("QAS_PROGRESS" + suffix);
                        bb.qas.searchAgain({
                            progressNode: responseNode,
                            addButtonNode: buttonNode,
                            suffix: suffix,
                            addressFormName: addressFormName
                        });
                    }
                });   
        
            }
            else if( result_value.data.result_list ) {

                var address_options = '';
                var address_hash = result_value.data.result_list;                    

                address_options += '<select name="QAS_PICKLIST#{suffix}" id="form--qas_do_search--field--QAS_PICKLIST' + suffix + '" class="replaceselect w-252">';

                address_hash.each(function(pair) {
                    address_options += '<option value="' + pair.Moniker + '">' + pair.PartialAddress + '</option>';
                });

                address_options += '</select>';

                params = {
                    'QAS_SUFFIX': suffix,
                    'QAS_PICKLIST': address_options,
                    'QAS_MESSAGE': ''
                }; 

                // fetch HTML template            
                generic.templatefactory.get({path: '/templates/qas/qas_picklist.tmpl'}).evaluateCallback({
                    object: params,
                    callback: function(html) {
                        qas_node.update(html); 

                        //Reattach the event listener to the submit button.
                        var buttonNode = $("QAS_SUBMIT" + suffix);
                        var responseNode = $("QAS_PROGRESS" + suffix);
                        bb.qas.addButton({
                            progressNode: responseNode,
                            addButtonNode: buttonNode,
                            suffix: suffix,
                            addressFormName: addressFormName
                        });
                        bb.page.replaceSelects();
                    }
                });   
                
                                 
            }

            // Hide the QAS search box.  Display search again button.
            revertButton();
        },
        onFailure: function(r) {
            var resultData = r.getError();
            var errorObjectsArray = r.getMessages();

            revertButton();  

            var errListNode = $$("ul.error_messages")[0];
            generic.showErrors(errorObjectsArray, errListNode);
        }
    });
};

//This is to allow the QAS search buttons to be visible after searching.
bb.qas.searchAgain = function (args) {
    var progressNode = args.progressNode;
    var addButtonNode = args.addButtonNode;
    var suffix = args.suffix;
    var addressFormName = args.addressFormName;
    var qas_node = $("QAS_NODE" + suffix);

    addButtonNode.observe("click", function(clickEvt) {
        clickEvt.preventDefault();

        if (progressNode) {
            progressNode.style.display = "block";
            addButtonNode.style.display = "none";
        }
        var revertButton = function() {
            if (progressNode) {
                progressNode.style.display = "none";
                addButtonNode.style.display = "block";
            }            
        };

        var params = {
            'QAS_SUFFIX': suffix
        }; 
    
        // fetch HTML template            
        generic.templatefactory.get({path: '/templates/qas/qas_section' + suffix + '.tmpl'}).evaluateCallback({
            object: params,
            callback: function(html) {
                qas_node.update(html); 
    
                //Reattach the event listener to the submit button.
                var buttonNode = $("QAS_SUBMIT" + suffix);
                var responseNode = $("QAS_PROGRESS" + suffix);
                bb.qas.addButton({
                    progressNode: responseNode,
                    addButtonNode: buttonNode,
                    suffix: suffix,
                    addressFormName: addressFormName
                });
            }
        }); 
    });
};
