﻿var LicenseDetails = (function() {
    function fnLicenseDetailsConstructor() {
        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*           Class Level Private Variables          */
        /*                                                  */
        /*                                                  */
        /****************************************************/
        
        var oInstance;

        var hNetSuiteItems;
        var hPromotions;
        var hRegions;
        var hSubsidiaries;
        
        var sRegion;
        var hLicenseItems;

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                Accessors/Mutators                */
        /*                                                  */
        /*                                                  */
        /****************************************************/
        
        this.getNetSuiteItems = function() {
            var hNewNetSuiteItems = $H();
            
            var aNetSuiteItems = hNetSuiteItems.values();
            var oNetSuiteItem;
            for (var iNetSuiteItem = 0; iNetSuiteItem < aNetSuiteItems.length; iNetSuiteItem++) {
                oNetSuiteItem = aNetSuiteItems[iNetSuiteItem].clone();
                hNewNetSuiteItems.set(oNetSuiteItem.getId(), oNetSuiteItem);
            }
            
            return hNewNetSuiteItems;
        }
        
        this.getNetSuiteItemArray = function() {
            var aNewNetSuiteItems = new Array();
            
            var aNetSuiteItems = hNetSuiteItems.values();
            for (var iNetSuiteItem = 0; iNetSuiteItem < aNetSuiteItems.length; iNetSuiteItem++)
                aNewNetSuiteItems.push(aNetSuiteItems[iNetSuiteItem].clone());
            
            return aNewNetSuiteItems;
        }
        
        this.getPromotions = function() {
            var hNewPromotions = $H();
        
            var aPromotions = hPromotions.values();
            var oPromotion;
            for (var iPromotion = 0; iPromotion < aPromotions.length; iPromotion++) {
                oPromotion = aPromotions[iPromotion].clone();
                hNewPromotions.set(oPromotion.getId(), oPromotion);
            }
            
            return hNewPromotions;
        }
        
        this.getPromotionArray = function() {
            var aNewPromotions = new Array();
        
            var aPromotions = hPromotions.values();
            for (var iPromotion = 0; iPromotion < aPromotions.length; iPromotion++)
                aNewPromotions.push(aPromotions[iPromotion].clone());
            
            return aNewPromotions;
        }
        
        this.getRegions = function() {
            var hNewRegions = $H();
        
            var aRegions = hRegions.values();
            var oRegion;
            for (var iRegion = 0; iRegion < aRegions.length; iRegion++) {
                oRegion = aRegions[iRegion].clone();
                hNewRegions.set(oRegion.getName(), oRegion);
            }
            
            return hNewRegions;
        }
        
        this.getRegionArray = function() {
            var aNewRegions = new Array();
        
            var aRegions = hRegions.values();
            for (var iRegion = 0; iRegion < aRegions.length; iRegion++)
                aNewRegions.push(aRegions[iRegion].clone());
            
            return aNewRegions;
        }
        
        this.getSubsidiaries = function() {
            var hNewSubsidiaries = $H();
            
            var aSubsidiaries = hSubsidiaries.values();
            var oSubsidiary;
            for (var iSubsidiary = 0; iSubsidiary < aSubsidiaries.length; iSubsidiary++) {
                oSubsidiary = aSubsidiaries[iSubsidiary].clone();
                hNewSubsidiaries.set(oSubsidiary.getId(), oSubsidiary);
            }
            
            return hNewSubsidiaries;
        }
        
        this.getSubsidiaryArray = function() {
            var aNewSubsidiaries = new Array();
            
            var aSubsidiaries = hSubsidiaries.values();
            for (var iSubsidiary = 0; iSubsidiary < aSubsidiaries.length; iSubsidiary++)
                aNewSubsidiaries.push(aSubsidiaries[iSubsidiary].clone());
            
            return aNewSubsidiaries;
        }
        
        this.getNetSuiteLinkString = function() {
            var netSuiteItems = this.getNetSuiteItemArray();
            var aLicenseItems = this.getLicenseItemArray();
            var netSuiteLinkString = '';
            
            aLicenseItems.each(function(oLicenseItem, iIndex) {
	            var iId = oLicenseItem.getId();
	            var iQuantity = oLicenseItem.getQuantity();
	            if (iId && iId > 0 && iQuantity && iQuantity > 0) {
	                var oNetSuiteItem = hNetSuiteItems.get(iId);
	                var itemId = oNetSuiteItem.getId();
	                netSuiteLinkString += (itemId + ',' + iQuantity + ';');
	            }
	        });
	        
	        return netSuiteLinkString;       
        }
        
        this.getRegion = function() {
            return sRegion;
        }
        
        this.setRegion = function(sNewRegion) {
            sRegion = sNewRegion;
        }
        
        this.getProductCategories = function() {
            return hLicenseItems.keys();
        }
        
        this.getLicenseItems = function() {
            var hNewLicenseItems = new $H();
            
            var aLicenseItems = hLicenseItems.values();
            var oLicenseItem;
            for (var iLicenseItem = 0; iLicenseItem < aLicenseItems.length; iLicenseItem++) {
                oLicenseItem = aLicenseItems[iLicenseItem].clone();
                hNewLicenseItems.set(oLicenseItem.getId(), oLicenseItem);
            }
            
            return hNewLicenseItems;
        }
        
        this.getLicenseItemArray = function() {
            var aNewLicenseItems = new Array();
            
            var aProductCategories = hLicenseItems.keys();
            var aLicenseItems;
            for (var iProductCategory = 0; iProductCategory < aProductCategories.length; iProductCategory++) {
                aLicenseItems = hLicenseItems.get(aProductCategories[iProductCategory]);
                for (var iLicenseItem = 0; iLicenseItem < aLicenseItems.length; iLicenseItem++)
                    aNewLicenseItems.push(aLicenseItems[iLicenseItem].clone());
            }
            
            return aNewLicenseItems;
        }
        
        this.getLicenseItemsByProductCategory = function(sProductCategory) {
            var aNewLicenseItems = new Array();
            
            var aLicenseItems = hLicenseItems.get(sProductCategory);
            for (var iLicenseItem = 0; iLicenseItem < aLicenseItems.length; iLicenseItem++)
                aNewLicenseItems.push(aLicenseItems[iLicenseItem].clone());
            
            return aNewLicenseItems;
        }
        
        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*          Class Level Priveleged Methods          */
        /*                                                  */
        /*                                                  */
        /****************************************************/
        
        this.addNetSuiteItem = function(oNetSuiteItem) {
            hNetSuiteItems.set(oNetSuiteItem.getId(), oNetSuiteItem);
        }
        
        this.removeNetSuiteItem = function(oNetSuiteItem) {
            hNetSuiteItems.each(function(oPair) {
                if (oPair.value == oNetSuiteItem) {
                    hNetSuiteItems.unset(oPair.key);
                    throw $break;
                }
            });
        }
        
        this.addPromotion = function(oPromotion) {
            hPromotions.set(oPromotion.getId(), oPromotion);
        }
        
        this.removePromotion = function(oPromotion) {
            hPromotions.each(function(oPair) {
                if (oPair.value == oPromotion) {
                    hPromotions.unset(oPair.key);
                    throw $break;
                }
            });
        }
        
        this.addRegion = function(oRegion) {
            hRegions.set(oRegion.getName(), oRegion);
        }
        
        this.removeRegion = function(oRegion) {
            hRegions.each(function(oPair) {
                if (oPair.value == oRegion) {
                    hRegions.unset(oPair.key);
                    throw $break;
                }
            });
        }
        
        this.getRegionByName = function(sRegion) {
            return hRegions.get(sRegion);
        }
        
        this.addSubsidiary = function(oSubsidiary) {
            hSubsidiaries.set(oSubsidiary.getId(), oSubsidiary);
        }
        
        this.removeSubsidiary = function(oSubsidiary) {
            hSubsidiaries.each(function(oPair) {
                if (oPair.value == oSubsidiary) {
                    hSubsidiaries.unset(oPair.key);
                    throw $break;
                }
            });
        }
        
        this.addProductCategory = function(sName) {
            if (!hLicenseItems.get(sName)) {
                hLicenseItems.set(sName, new Array(new LicenseItem()));
            }
        }
        
        this.removeProductCategory = function(sName) {
            hLicenseItems.unset(sName);
        }
        
        this.addLicenseItem = function(sProductCategory, oLicenseItem) {
            var aLicenseItems = hLicenseItems.get(sProductCategory);
            if (aLicenseItems) {
                aLicenseItems.push(oLicenseItem);
            }
        }
        
        this.addLicenseItemAt = function(sProductCategory, iIndex, oLicenseItem) {
            var aLicenseItems = hLicenseItems.get(sProductCategory);
            if (aLicenseItems) {
                aLicenseItems.splice(iIndex, 1, oLicenseItem);
            }
        }
        
        this.modifyLicenseItemAt = function(sProductCategory, iIndex, iId, iQuantity) {
            var aLicenseItems = hLicenseItems.get(sProductCategory);
            var oLicenseItem;
            if (aLicenseItems && iIndex >= 0 && iIndex < aLicenseItems.length) {
                oLicenseItem = aLicenseItems[iIndex];
                oLicenseItem.setId(iId);
                oLicenseItem.setQuantity(iQuantity);
            }
        }
        
        this.removeLicenseItem = function(sProductCategory) {
            var aLicenseItems = hLicenseItems.get(sProductCategory);
            aLicenseItems.pop();
        }
        
        this.removeLicenseItemAt = function(sProductCategory, iIndex) {
            var aLicenseItems = hLicenseItems.get(sProductCategory);
            if (aLicenseItems && iIndex >= 0 && iIndex < aLicenseItems.length) {
                aLicenseItems.splice(iIndex, 1);
            }
        }
        
        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                 Initialize Class                 */
        /*                                                  */
        /*                                                  */
        /****************************************************/
        
        oInstance = this;

        hNetSuiteItems = $H();
        hPromotions = $H();
        hRegions = $H();
        hSubsidiaries = $H();
        
        hLicenseItems = $H();
    }
    
    return fnLicenseDetailsConstructor;
    
})();