var LicenseItemModelPropertyValidator = (function() {
    function fnLicenseItemModelPropertyValidatorConstructor(oNewModel) {
        /****************************************************/
		/*                                                  */
		/*                                                  */
		/*                 Private Variables                */
		/*                                                  */
		/*                                                  */
		/****************************************************/
		
		var oModel;
		var hErrorLists;
		
		/****************************************************/
		/*                                                  */
		/*                                                  */
		/*          Class Level Priveleged Methods          */
		/*                                                  */
		/*                                                  */
		/****************************************************/
		
		this.addErrorList = function(sProductCategory) {
		    hErrorLists.set(sProductCategory, new Array());
		}
		
		this.getAllErrors = function() {
			return hErrorLists.clone();
		}
		
		this.getErrorsByProductCategory = function(sProductCategory) {
			return hErrorLists.get(sProductCategory);
		}
		
		this.isLicenseItemSelected = function() {
		    var bValid = false;
			
			var aLicenseItems = oModel.getLicenseItemArray();
			var oLicenseItem;
			var iId;
			var iQuantity;
			
			for (var iLicenseItem = 0; iLicenseItem < aLicenseItems.length; iLicenseItem++) {
			    oLicenseItem = aLicenseItems[iLicenseItem];
			    iId = oLicenseItem.getId();
			    iQuantity = oLicenseItem.getQuantity();
			    if ((iId && iId.toString().length > 0) || (iQuantity && iQuantity > 0)) {
			        bValid = true;
			        break;    
			    }
			}
			
			return bValid;
		}
		
		this.isValid = function() {
			var bValid = false;
			
			var aLicenseItems = oModel.getLicenseItemArray();
			var oLicenseItem;
			var iId;
			var iQuantity;
			
			LicenseItemSelectedCheck:
			for (var iLicenseItem = 0; iLicenseItem < aLicenseItems.length; iLicenseItem++) {
			    oLicenseItem = aLicenseItems[iLicenseItem];
			    iId = oLicenseItem.getId();
			    iQuantity = oLicenseItem.getQuantity();
			    if ((iId && iId.toString().length > 0) || (iQuantity && iQuantity > 0)) {
			        var aErrorLists = hErrorLists.values();
		            var aErrors;
		            for (var iErrorList = 0; iErrorList < aErrorLists.length; iErrorList++) {
			            aErrors = aErrorLists[iErrorList];
			            if (aErrors.length > 0)
				            break LicenseItemSelectedCheck;
		            }
			        bValid = true;
			        break;
			    }
			}
			
			return bValid;
		}
		
		this.validateProductCategoryByName = function(sProductCategory) {
			var aErrors = new Array();
			
			var aLicenseItems = oModel.getLicenseItemsByProductCategory(sProductCategory);
			var oLicenseItem;
			var iId;
			var iQuantity;
			for (var iLicenseItem = 0; iLicenseItem < aLicenseItems.length; iLicenseItem++) {
			    oLicenseItem = aLicenseItems[iLicenseItem];
			    iId = oLicenseItem.getId();
			    iQuantity = oLicenseItem.getQuantity();
			    if (iId && iId.toString().length > 0) {
			        if (!(iQuantity && iQuantity > 0))
			            aErrors.push("No Quantity Entered");
			    }
			    else
			        if (iQuantity && iQuantity > 0)
			            aErrors.push("No License Item Selected");
			}
			
			hErrorLists.set(sProductCategory, aErrors);
		}
		
		/****************************************************/
		/*                                                  */
		/*                                                  */
		/*                 Initialize Class                 */
		/*                                                  */
		/*                                                  */
		/****************************************************/
		
		oModel = oNewModel;
		hErrorLists = $H();
    }
    
    return fnLicenseItemModelPropertyValidatorConstructor;
})();