(function(){    
    ProductCompare = function()
    {
        this.init();
    }   
    
    var chkCounter;
    
    // Helper Functions
    var funcs = {
        
        //* BEGIN PRODUCT COMPARISON LIST HELPERS *//
        
        // Set handlers on all product compare list checkboxes
        productSelectHandler:function(e, obj)
        {   
            var checkBoxes = document.getElementsByName('compareBox');                            
            for(var i=0, len=checkBoxes.length; i < len; i++)
            {
                // Get the current number of products checked
                if(checkBoxes[i].checked)
                {
                    chkCounter++;
                }
            }
        },
        
        // Delegate for preventing users from selecting more than four products at a time
        checkBoxClickCallBack:function(e, obj)
        {   
            var target = YUE.getTarget(e);
            if(!target){return}
            
            if(target.name !== undefined && target.name == 'compareBox')
            {
                if(chkCounter < 4 && target.checked)
                {
                    chkCounter++;                
                }
                else if(!target.checked)
                {   
                    chkCounter--;
                    chkCounter = chkCounter < 0 ? 0 : chkCounter;
                }            
                else
                {   
                    target.checked = false;                
                }
            }
        },
        
        // Creates a XHR to grab the appropriate product list based on what a user selected
        findProductsClickCallBack:function(e, obj)
        {
            var prodCat = YUD.get('productcategory'), 
                prodFam = YUD.get('family'),
                prodCompGrid = YUD.get('prodCompGrid'),
                prodCompTbl = YUD.get('prodCompTblWrapper'),
                hasErrors = false; //this.findProductsValidator.showErrors('prodCompareSearch');                
                        
            YUE.preventDefault(e);                                   
            
            // Errors Temp            
            if(prodCat.selectedIndex == 0 || prodFam.selectedIndex == 0)      
            {   
                obj.showError(prodCat);
                return;
            }
            else
            {
                obj.hideError(prodCat);
            }
            
            // Build the request                
            funcs.getProductList('GET', '/webservices/feservice.aspx?method=findProducts'
                                    + '&category=' + escape(prodCat.options[prodCat.selectedIndex].value)
                                    + '&family=' + escape(prodFam.options[prodFam.selectedIndex].value));                
            
            if(!YUD.hasClass(prodCompGrid, 'loading'))
            {
                YUD.addClass(prodCompGrid, 'loading');
            }
            
            // Clear the product comparison grid                                     
            prodCompGrid.innerHTML = '';
            
            // Clear the product comparison table
            prodCompTbl.innerHTML = '';
            
            // Reset the checkbox counter
            chkCounter = 0;
            
            
            return false;
        },
        
        // Add xhr subscribers to handle success and failure callbacks
        getProductList:function(method, path)
        {
            var xhr = new JSONRequester();            
            xhr.onSuccess.subscribe(funcs.getProductListCallBack);
            xhr.onFailure.subscribe(funcs.getProductListError);
            xhr.makeRequest(method, path);   
        },
        
        // Handles the success case of the XHR return trip for the product list
        getProductListCallBack:function(json)
        {
            if(!json.status || json.status != '1')
            {
                funcs.getProductListError(json);
            }
            
            var button = YUD.get('pctFind'),
                compButton = YUD.get('pctCompare'),
                prodCompGrid = YUD.get('prodCompGrid');            
                
            
            YUD.removeClass(prodCompGrid, 'loading');
            prodCompGrid.innerHTML = json.data; 
            
            // Enable the button
            button.disabled = false;
            
            // Enable the compare products button
            compareEnabled = true;
            
        },
        
        getProductListError:function(json)
        {
            var button = YUD.get('pctFind'),
                prodCompGrid = YUD.get('prodCompGrid');
            
            YUD.removeClass(prodCompGrid, 'loading');
            // Enable the button
            button.disabled = false;            
        },
        
        //* END PRODUCT COMPARISON LIST HELPERS *//
        
        //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        
        //* BEGIN PRODUCT COMPARISON TABLE HELPERS *//
        
        // Creates XHR to grab the product comparison table
        compareClickCallBack:function(e,obj)
        {            
            var tbl = YUD.get('prodCompTblWrapper'),
                chkboxes,
                prodIds = [],
                hasErrors = false;//this.doComparisonValidator.showErrors('prodCompare');
            
            YUE.preventDefault(e);                                    
            
            if(hasErrors){return}
            
            // Build the request                
            YUD.setStyle(tbl, 'display', 'block');
            
            if(!YUD.hasClass(tbl, 'loading'))
            {
                YUD.addClass(tbl, 'loading');
            }
            
            funcs.scrollTo(YUD.get('prodCompTblWrapper'));
            chkboxes = document.getElementsByName('compareBox');
            for(var i=0, len=chkboxes.length; i < len; i++)
            {
                if(chkboxes[i].checked)
                {
                    prodIds.push(chkboxes[i].value);
                }
            }
            
            tbl.innerHTML = '';
            funcs.getProductTable('GET', '/webservices/feservice.aspx?method=compareProducts&prodids='  + prodIds.join(','));
                                        
        },
        
        getProductTable:function(method, path)
        {
            var xhr = new JSONRequester();            
            xhr.onSuccess.subscribe(funcs.getProductTableCallBack);
            xhr.onFailure.subscribe(funcs.getProductTableError);
            xhr.makeRequest(method, path);
        },
        
        getProductTableCallBack:function(json)
        {
            var tbl = YUD.get('prodCompTblWrapper');
            tbl.innerHTML = json.data;
            
            YUD.removeClass(tbl, 'loading');
            compareEnabled = true;
        },
        
        getProductTableError:function()
        {
            var tbl = YUD.get('prodCompTblWrapper');
            tbl.innerHTML = '<h3 class="req">Sorry, an error has occured</h3>';
            YUD.removeClass(tbl, 'loading');
            compareEnabled = true;
        },
        
        scrollTo:function(elem)
        {
            var x = 0;
            var y = 0;
            
            while(elem != null)
            {
                x += elem.offsetLeft;
                y += elem.offsetTop;
                elem = elem.offsetParent;
            }
                                    		      
             window.scrollTo(x,y);              
        }
        //* END PRODUCT COMPARISON TABLE HELPERS *//
    };
    
    ProductCompare.prototype = {
        
        init:function()
        {   
            chkCounter = 0;
            this.compareEnabled = false;
            
            YUE.onContentReady('prodCompGrid', funcs.productSelectHandler, this, false);
            YUE.on('prodCompGrid', 'click', funcs.checkBoxClickCallBack);
            YUE.on('prodCompareSearch', 'submit', funcs.findProductsClickCallBack, this, false);
            YUE.on('pctCompare', 'click', funcs.compareClickCallBack, this, false);             
        },    
        
        showError: function(obj)
        {
            if(!YUD.hasClass(obj, 'hasErrors'))
            {
                var error = document.createElement('span');
                YUD.addClass(error, 'req');
                YUD.addClass(obj, 'hasErrors');
                error.innerHTML = errMsgs.selAll;
                obj.parentNode.insertBefore(error, obj.parentNode.firstChild);
            }
        },
        
        hideError: function(obj)
        {
            var error = YUD.getElementsByClassName('req', 'span', obj.parentNode);                        
            if(error.length > 0)
            {
                YUD.removeClass(obj, 'hasErrors');
                obj.parentNode.removeChild(error[0]);
            }
        }
    };
})();
