private void handlePackageUpdated(IAPPackage package)
        {
            if (package.product == null && package.product.id == this.uid)
            {
                // Update template
//				Debug.LogFormat("handlePackageUpdated {0} type {1} amount {2} hasReceipt {3} {4}",uid,package.productType,package.amount,package.product.hasReceipt,package.product.rawProduct.hasReceipt);
                // To enable/disable button
                if (package.productType == IAPProductType.NonConsumable && package.product.hasReceipt)
                {
                    if (package.amount <= 0)
                    {
                        package.Refill(1);                                     // Add 1 if no
                    }
                    IAPUIUtility.SetButtonEnabled(gameObject, false, "purchase_button");
                }
                else if (package.productType == IAPProductType.Subscription && package.product.hasReceipt)
                {
                    if (package.amount <= 0)
                    {
                        package.Refill(1);                                     // Add 1 if no
                    }
                    package.Unlock();
                    IAPUIUtility.SetButtonEnabled(gameObject, false, "purchase_button");
                }
                else if ((package.productType == IAPProductType.NonConsumable && package.amount > 0))
                {
                    IAPUIUtility.SetButtonEnabled(gameObject, false, "purchase_button");
                }
                else
                {
                    IAPUIUtility.SetButtonEnabled(gameObject, true, "purchase_button");
                    IAPUIUtility.AddButtonCallback(gameObject, (GameObject go) => {
                        IAPUIUtility.SetButtonEnabled(gameObject, false, "purchase_button");
                        package.Purchase(handlePackageUpdated);
                    }, "purchase_button");
                }

                UpdateTemplate(package);
            }
        }
        // Use this for initialization
        void Start()
        {
            if (uid != null)
            {
                // Purchase button action
                System.Action <GameObject> purchaseButtonCallback = null;

                //
                if (targetType == IAPType.Currency)
                {
                    IAPCurrency obj = IAPInventoryManager.GetCurrency(uid);

                    if (obj != null)
                    {
                        UpdateTemplate(obj);
                        IAPInventoryManager.OnCurrencyUpdated += handleCurrencyUpdated;
                        purchaseButtonCallback = (GameObject go) => {
                            handleButtonCallback(obj);
                        };
                    }
                }
                else if (targetType == IAPType.Inventory)
                {
                    IAPInventory obj = IAPInventoryManager.GetInventory(uid);

                    if (obj != null)
                    {
                        Debug.Log("UpdateTemplate " + obj.uid);
                        UpdateTemplate(obj);

                        IAPInventoryManager.OnInventoryUpdated += handleInventoryUpdated;
                        // Debug.Log("obj.available: " + obj.available);
                        // Check if inventory available
                        // if(obj.available==0){
                        //  IAPUIUtility.SetButtonActive(false,gameObject,"purchase_button");
                        // } else {
                        purchaseButtonCallback = (GameObject go) => {
                            // Debug.Log("213123");
                            handleButtonCallback(obj);
                        };
                        // }
                    }
                }
                else if (targetType == IAPType.Ability)
                {
                    IAPAbility obj = IAPInventoryManager.GetAbility(uid);

                    if (obj != null)
                    {
                        UpdateTemplate(obj);

                        IAPInventoryManager.OnAbilityUpdated += handleAbilityUpdated;
                        IAPAbility ability = (obj as IAPAbility);
                        if (ability.level < ability.levels.Count - 1)
                        {
                            // Get the currency
                            IAPCurrency currency = IAPInventoryManager.GetCurrency(obj.currency);
                            purchaseButtonCallback = (GameObject go) => {
                                if (useConfirmDialog)
                                {
                                    if (currency != null)
                                    {
                                        // Construct confirm msg
                                        IAPAbilityLevel lv  = ability.GetCurrentLevel();
                                        string          msg = IAPInventoryManager.uiSettings.abilityConfirmString.Replace("%title%", obj.title);
                                        msg = msg.Replace("%description%", lv.description.ToString());
                                        msg = msg.Replace("%price%", lv.price.ToString());
                                        msg = msg.Replace("%currency_title%", currency.title);
                                        msg = msg.Replace("%currency_description%", currency.description);
                                        // Show confirm diaglog
                                        IAPInventoryManager.ShowConfirmDialog(msg,
                                                                              delegate(IAPDialog diag){
                                            ability.Upgrade();
                                        }
                                                                              );
                                    }
                                }
                                else
                                {
                                    // Purchase the package
                                    ability.Upgrade();
                                }
                            };
                        }
                        else
                        {
                            // Disable the button
                            IAPUIUtility.SetButtonEnabled(gameObject, false);
                        }
                    }
                }
                else if (targetType == IAPType.InAppPurchase)
                {
                    IAPPackage obj = IAPInventoryManager.GetPackage(uid);

                    if (obj != null)
                    {
                        // UpdateTemplate(obj);

                        // if((obj.productType==IAPProductType.NonConsumable || obj.productType==IAPProductType.Subscription) && obj.amount>0)
                        // {
                        //  IAPUIUtility.SetButtonEnabled(gameObject,false,"purchase_button");

                        // } else {

                        if (obj.fetchFromStore)
                        {
                            // For Real Money IAP

                            IAPInventoryManager.OnIAPInitialized += handleOnIAPInitialized;

                            // Check if IAP initialized
                            if (IAPManager.IsInitialized())
                            {
                                Debug.LogFormat("uid: {0} type: {1}  amount: {2}", uid, obj.productType, obj.amount);

                                if ((obj.productType == IAPProductType.NonConsumable || obj.productType == IAPProductType.Subscription) && obj.amount > 0)
                                {
                                    IAPUIUtility.SetButtonEnabled(gameObject, false, "purchase_button");
                                }
                                else
                                {
                                    purchaseButtonCallback = (GameObject go) => {
                                        IAPUIUtility.SetButtonEnabled(gameObject, false, "purchase_button");
                                        obj.Purchase(handlePackageUpdated);
                                    };
                                }
                            }
                            else
                            {
                                IAPUIUtility.SetButtonEnabled(gameObject, false, "purchase_button");
                                IAPInventoryManager.InitIAPManager();
                            }
                        }
                        else
                        {
                            // For Virtual Currency IAP

                            purchaseButtonCallback = (GameObject go) => {
                                if (useConfirmDialog)
                                {
                                    // Construct confirm msg
                                    IAPCurrency currency = IAPInventoryManager.GetCurrency(obj.currency);
                                    if (currency != null)
                                    {
                                        string msg = IAPInventoryManager.uiSettings.iapConfirmString.Replace("%title%", obj.title);
                                        msg = msg.Replace("%description%", obj.description);
                                        msg = msg.Replace("%price%", obj.price.ToString());
                                        msg = msg.Replace("%currency_title%", currency.title);
                                        msg = msg.Replace("%currency_description%", currency.description);
                                        // Show confirm diaglog
                                        IAPInventoryManager.ShowConfirmDialog(msg,
                                                                              delegate(IAPDialog diag){
                                            // Purchase the package
                                            obj.Purchase();
                                        }
                                                                              );
                                    }
                                }
                                else
                                {
                                    // Purchase the package
                                    obj.Purchase();
                                }
                            };
                        }
                        // }

                        UpdateTemplate(obj);
                    }
                }
                else if (targetType == IAPType.GameLevel && level != -1)
                {
                    IAPGameLevel obj = IAPInventoryManager.GetGameLevel(uid);
                    IAPInventoryManager.OnGameLevelUpdated += handleGameLevelUpdated;

                    if (obj != null)
                    {
                        UpdateGameLevelTemplate(obj, level);

                        // IAPCurrency currency = IAPInventoryManager.GetCurrency(obj.currency);
// Debug.LogFormat("obj {0}",level);

                        // purchaseButtonCallback=(GameObject go)=>{
                        IAPUIUtility.AddButtonCallback(gameObject, (GameObject go) => {
                            IAPGameSubLevel subLevel = obj.levels[level];
                            bool islocked            = (obj.GetPropertyValue("locked", level) > 0);
                            // Debug.LogFormat("obj {0} {1} {2}", level, useConfirmDialog, obj.currency);

                            // Check if price valid and
                            if (subLevel.price > 0 && islocked)
                            {
                                if (useConfirmDialog)
                                {
                                    // Construct confirm msg
                                    IAPCurrency currency = IAPInventoryManager.GetCurrency(obj.currency);
                                    if (currency != null)
                                    {
                                        string msg = IAPInventoryManager.uiSettings.iapConfirmString.Replace("%title%", obj.title);
                                        msg        = msg.Replace("%description%", obj.description + " Level " + level.ToString());
                                        msg        = msg.Replace("%price%", subLevel.price.ToString());
                                        msg        = msg.Replace("%currency_title%", currency.title);
                                        msg        = msg.Replace("%currency_description%", currency.description);
                                        // Show confirm diaglog
                                        IAPInventoryManager.ShowConfirmDialog(msg,
                                                                              delegate(IAPDialog diag){
                                            // Check if enough currency
                                            if (currency != null && currency.Consume(subLevel.price))
                                            {
                                                // obj.SetPropertyValue("locked",level,1);
                                                obj.UnlockLevel(level);
                                            }
                                        }
                                                                              );
                                    }
                                }
                                else
                                {
                                    // Get the currency
                                    IAPCurrency currency = IAPInventoryManager.GetCurrency(obj.currency);
                                    // Check if enough currency
                                    if (currency != null && currency.Consume(subLevel.price))
                                    {
                                        obj.UnlockLevel(level);
                                    }
                                }
                            }
                        }, "self,select_button");
                    }
                }

                // Add the button callback to purchase_button
                if (purchaseButtonCallback != null)
                {
                    IAPUIUtility.AddButtonCallback(gameObject, purchaseButtonCallback, "purchase_button");
                }
            }
        }