﻿var LicenseDetailsDAO = (function() {
    function fnLicenseDetailsDAOConstructor() {
        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*           Class Level Private Variables          */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        var oLicenseDetails;
        
        /****************************************************/
	    /*                                                  */
	    /*                                                  */
	    /*            Class Level Private Methods           */
	    /*                                                  */
	    /*                                                  */
	    /****************************************************/
	    
	    function getProductCategories(oXML) {
	        /*var aProductCategoryNodes = oXML.getElementsByTagName("ProductCategories")[0].getElementsByTagName("ProductCategory");;
	        for (var iProductCategoryNode = 0; iProductCategoryNode < aProductCategoryNodes.length; iProductCategoryNode++) {
	            oLicenseDetails.addProductCategory(aProductCategoryNodes[iProductCategoryNode].getAttribute("Name"));
	        }*/

            try {
	            var aProductCategories = $$("li.ContentSection > div > h5 > strong");
	            for (var iProductCategory = 0; iProductCategory < aProductCategories.length; iProductCategory++)
	                oLicenseDetails.addProductCategory(aProductCategories[iProductCategory].innerHTML);
	        }
	        catch (eException) {
	        
	        }
	    }
	    
	    function getNetSuiteItemsFromXML(oXML) {
	        try {
	            var aProductCategoryNodes = oXML.getElementsByTagName("ProductCategories")[0].getElementsByTagName("ProductCategory");
	            var oProductCategoryNode;
	            //var sProduct;
	            var sProductCategory;
    	        
	            var aItemNodes;
	            var oItemNode;
	            var oNetSuiteItem;
    	         
	            var aPriceNodes;
	            var oPriceNode;
	            var oNetSuiteItemPrice;
    	        
	            var aPromotionNodes;
	            var oPromotionNode;
	            var oNetSuiteItemPricePromotion;
                for (var iProductCategoryNode = 0; iProductCategoryNode < aProductCategoryNodes.length; iProductCategoryNode++) {
	                oProductCategoryNode = aProductCategoryNodes[iProductCategoryNode];
	                sProduct = oProductCategoryNode.getAttribute("Product").toUpperCase();
	                sProductCategory = oProductCategoryNode.getAttribute("Description").toUpperCase();
	                aItemNodes = oProductCategoryNode.getElementsByTagName("Items")[0].getElementsByTagName("Item");
                    oItemNode;
                    for (var iItemNode = 0; iItemNode < aItemNodes.length; iItemNode++) {
                        oItemNode = aItemNodes[iItemNode];
                        //oNetSuiteItem = new NetSuiteItem(parseInt(oItemNode.getAttribute("Id")), parseInt(oItemNode.getAttribute("ApplicationId")), oItemNode.getAttribute("SKU"), oItemNode.getAttribute("ShortName"), oItemNode.getAttribute("LongName"), parseInt(oItemNode.getAttribute("MaximumElements")), oItemNode.getAttribute("Requirement"), sProduct, sProductCategory);
                        oNetSuiteItem = new NetSuiteItem(parseInt(oItemNode.getAttribute("Id")), parseInt(oItemNode.getAttribute("ApplicationId")), oItemNode.getAttribute("SKU"), oItemNode.getAttribute("Description"), oItemNode.getAttribute("ShortName"), oItemNode.getAttribute("LongName"), parseInt(oItemNode.getAttribute("MaximumElements")), oItemNode.getAttribute("Requirement"), sProduct, sProductCategory);
                        aPriceNodes = oItemNode.getElementsByTagName("Prices")[0].getElementsByTagName("Price");
                        for (var iPriceNode = 0; iPriceNode < aPriceNodes.length; iPriceNode++) {
                            oPriceNode = aPriceNodes[iPriceNode];
                            oNetSuiteItemPrice = new NetSuiteItemPrice(parseInt(oPriceNode.getAttribute("Currency")), parseFloat(oPriceNode.getAttribute("Amount")));
                            aPromotionNodes = oPriceNode.getElementsByTagName("Promotions")[0].getElementsByTagName("Promotion");
                            for (var iPromotionNode = 0; iPromotionNode < aPromotionNodes.length; iPromotionNode++) {
                                oPromotionNode = aPromotionNodes[iPromotionNode];
                                oNetSuiteItemPricePromotion = new NetSuiteItemPricePromotion(parseInt(oPromotionNode.getAttribute("Id")));
                                oNetSuiteItemPrice.addPromotion(oNetSuiteItemPricePromotion);
                            }
                            oNetSuiteItem.addPrice(oNetSuiteItemPrice);
                        }
                        oLicenseDetails.addNetSuiteItem(oNetSuiteItem);
                    }   
	            }
	        }
	        catch (eException) {
	        
	        }
        }
        
        function getPromotionsFromXML(oXML) {
            try {
                var aPromotionsNodes = oXML.getElementsByTagName("Promotions");
                var aPromotionNodes = aPromotionsNodes[aPromotionsNodes.length - 1].getElementsByTagName("Promotion");
                var oPromotionNode;
                for (var iPromotionNode = 0; iPromotionNode < aPromotionNodes.length; iPromotionNode++) {
                    oPromotionNode = aPromotionNodes[iPromotionNode];
                    oLicenseDetails.addPromotion(new Promotion(parseInt(oPromotionNode.getAttribute("Id")), oPromotionNode.getAttribute("Name"), oPromotionNode.getAttribute("Description"), new Date(oPromotionNode.getAttribute("StartDate")), new Date(oPromotionNode.getAttribute("EndDate")), oPromotionNode.getAttribute("IsPercentage") == "true" ? true : false, parseFloat(oPromotionNode.getAttribute("Amount"))));
                }
            }
            catch (eException) {
            
            }
        }
        
        function getRegionsFromXML(oXML) {
            try {
                var aRegionNodes = oXML.getElementsByTagName("Regions")[0].getElementsByTagName("Region");
                var oRegionNode;
                for (var iRegionNode = 0; iRegionNode < aRegionNodes.length; iRegionNode++) {
                    oRegionNode = aRegionNodes[iRegionNode];
                    oLicenseDetails.addRegion(new Region(oRegionNode.getAttribute("Name"), parseInt(oRegionNode.getAttribute("Currency")), parseInt(oRegionNode.getAttribute("SubsidiaryId"))));
                }
            }
            catch (eException) {
            
            }
        }
        
        function getSubsidiariesFromXML(oXML) {
            try {
                var aSubsidiaryNodes = oXML.getElementsByTagName("Subsidiaries")[0].getElementsByTagName("Subsidiary");
                var oSubsidiaryNode;
                for (var iSubsidiaryNode = 0; iSubsidiaryNode < aSubsidiaryNodes.length; iSubsidiaryNode++) {
                    oSubsidiaryNode = aSubsidiaryNodes[iSubsidiaryNode];
                    oLicenseDetails.addSubsidiary(new Subsidiary(parseInt(oSubsidiaryNode.getAttribute("Id")), oSubsidiaryNode.getAttribute("Address1"), oSubsidiaryNode.getAttribute("Address2"), oSubsidiaryNode.getAttribute("City"), oSubsidiaryNode.getAttribute("State"), oSubsidiaryNode.getAttribute("PostalCode"), oSubsidiaryNode.getAttribute("Country"), oSubsidiaryNode.getAttribute("Phone"), oSubsidiaryNode.getAttribute("Fax")));
                }
            }
            catch (eException) {
            
            }
        }
        
        function getSelectedRegionFromXML(oXML) {
            var sSelectedRegion = "";
            
            try {
                var aRegionNodes = oXML.getElementsByTagName("Regions")[0].getElementsByTagName("Region");
                var oRegionNode;
                for (var iRegionNode = 0; iRegionNode < aRegionNodes.length; iRegionNode++) {
                    oRegionNode = aRegionNodes[iRegionNode];
                    if (oRegionNode.getAttribute("Selected") == "1") {
                        sSelectedRegion = oRegionNode.getAttribute("Name");
                        break;
                    }
                }
            }
            catch (eException) {
            
            }
            
            return sSelectedRegion;
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                  Event Handlers                  */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        function ajaxRequest_onSucceed(oEvent) {
            var oXML = oEvent.responseXML;
            oLicenseDetails = new LicenseDetails();
            getProductCategories(oXML);
            getNetSuiteItemsFromXML(oXML);
            getPromotionsFromXML(oXML);
            getRegionsFromXML(oXML);
            getSubsidiariesFromXML(oXML);
            
            var sSelectedRegion = getSelectedRegionFromXML(oXML);
            if (sSelectedRegion.length > 0) {
                oLicenseDetails.setRegion(sSelectedRegion);
            }
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*          Class Level Priveleged Methods          */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        this.retrieveLicenseDetails = function() {
            new Ajax.Request("/onlinequote/getonlinequotedata.aspx?region=" + $("lstRegions").value, { asynchronous: false, method: "get", onSuccess: ajaxRequest_onSucceed });
            return oLicenseDetails;
        }
    }
    
    return fnLicenseDetailsDAOConstructor;

})();