private void StartInstaller(DataRowView row)
        {
            string applicationName = Utils.GetDbString(row[Global.Parameters.ApplicationName]);
            string componentName = Utils.GetDbString(row[Global.Parameters.ComponentName]);
            string componentCode = Utils.GetDbString(row[Global.Parameters.ComponentCode]);
            string componentDescription = Utils.GetDbString(row[Global.Parameters.ComponentDescription]);
            string component = Utils.GetDbString(row[Global.Parameters.Component]);
            string version = Utils.GetDbString(row[Global.Parameters.Version]);
            string fileName = row[Global.Parameters.FullFilePath].ToString();
            string installerPath = Utils.GetDbString(row[Global.Parameters.InstallerPath]);
            string installerType = Utils.GetDbString(row[Global.Parameters.InstallerType]);

            if (CheckForInstalledComponent(componentCode))
            {
                AppContext.AppForm.ShowWarning(Global.Messages.ComponentIsAlreadyInstalled);
                return;
            }
            try
            {
                // download installer
                Loader form = new Loader(fileName, (e) => AppContext.AppForm.ShowError(e));
                DialogResult result = form.ShowDialog(this);

                if (result == DialogResult.OK)
                {
                    string tmpFolder = FileUtils.GetTempDirectory();
                    string path = Path.Combine(tmpFolder, installerPath);
                    Update();
                    string method = "Install";
                    Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", installerType, method, path));

                    //prepare installer args
                    Hashtable args = new Hashtable();

                    args[Global.Parameters.ComponentName] = componentName;
                    args[Global.Parameters.ApplicationName] = applicationName;
                    args[Global.Parameters.ComponentCode] = componentCode;
                    args[Global.Parameters.ComponentDescription] = componentDescription;
                    args[Global.Parameters.Version] = version;
                    args[Global.Parameters.InstallerFolder] = tmpFolder;
                    args[Global.Parameters.InstallerPath] = installerPath;
                    args[Global.Parameters.InstallerType] = installerType;
                    args[Global.Parameters.Installer] = Path.GetFileName(fileName);
                    args[Global.Parameters.ShellVersion] = AssemblyLoader.GetShellVersion();
                    args[Global.Parameters.BaseDirectory] = FileUtils.GetCurrentDirectory();
                    args[Global.Parameters.ShellMode] = Global.VisualInstallerShell;
                    args[Global.Parameters.IISVersion] = Global.IISVersion;
                    args[Global.Parameters.SetupXml] = this.componentSettingsXml;
                    args[Global.Parameters.ParentForm] = FindForm();

                    //run installer
                    DialogResult res = (DialogResult)AssemblyLoader.Execute(path, installerType, method, new object[] { args });
                    Log.WriteInfo(string.Format("Installer returned {0}", res));
                    Log.WriteEnd("Installer finished");
                    Update();
                    if (res == DialogResult.OK)
                    {
                        AppContext.AppForm.ReloadApplication();
                    }
                    FileUtils.DeleteTempDirectory();
                }
            }
            catch (Exception ex)
            {
                Log.WriteError("Installer error", ex);
                AppContext.AppForm.ShowError(ex);
            }
            finally
            {
                this.componentSettingsXml = null;
                this.componentCode = null;
            }

        }
		private void StartInstaller(DataRowView row)
		{
			string applicationName = Utils.GetDbString(row["ApplicationName"]);
			string componentName = Utils.GetDbString(row["ComponentName"]);
			string componentCode = Utils.GetDbString(row["ComponentCode"]);
			string componentDescription = Utils.GetDbString(row["ComponentDescription"]);
			string component = Utils.GetDbString(row["Component"]);
			string version = Utils.GetDbString(row["Version"]);
			string fileName = row["FullFilePath"].ToString();
			string installerPath = Utils.GetDbString(row["InstallerPath"]);
			string installerType = Utils.GetDbString(row["InstallerType"]);
			//if ( installerType.StartsWith("WebsitePanel.Setup.Portal")) installerType = "WebsitePanel.Setup.StandaloneSetup285";
					
			
			if (CheckForInstalledComponent(componentCode))
			{
				AppContext.AppForm.ShowWarning("Component or its part is already installed.");
				return;
			}
			try
			{
				// download installer
				Loader form = new Loader(this.AppContext, fileName);
				DialogResult result = form.ShowDialog(this);

				if (result == DialogResult.OK)
				{
					string tmpFolder = FileUtils.GetTempDirectory();
					string path = Path.Combine(tmpFolder, installerPath);
					Update();
					string method = "Install";
					Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", installerType, method, path));

					//prepare installer args
					Hashtable args = new Hashtable();

					args["ComponentName"] = componentName;
					args["ApplicationName"] = applicationName;
					args["ComponentCode"] = componentCode;
					args["ComponentDescription"] = componentDescription;
					args["Version"] = version;
					args["InstallerFolder"] = tmpFolder;
					args["InstallerPath"] = installerPath;
					args["InstallerType"] = installerType;
					args["Installer"] = Path.GetFileName(fileName);
					args["ShellVersion"] = AppContext.AppForm.Version;
					args["BaseDirectory"] = FileUtils.GetCurrentDirectory();
					args["IISVersion"] = Global.IISVersion;
					args["SetupXml"] = this.componentSettingsXml;
					args["ParentForm"] = FindForm();

					//run installer
					DialogResult res = (DialogResult)AssemblyLoader.Execute(path, installerType, method, new object[] { args });
					Log.WriteInfo(string.Format("Installer returned {0}", res));
					Log.WriteEnd("Installer finished");
					Update();
					if (res == DialogResult.OK)
					{
						AppContext.AppForm.ReloadApplication();
					}
					FileUtils.DeleteTempDirectory();
				}
			}
			catch (Exception ex)
			{
				Log.WriteError("Installer error", ex);
				AppContext.AppForm.ShowError(ex);
			}
			finally
			{
				this.componentSettingsXml = null;
				this.componentCode = null;
			}
			
		}
		/// <summary>
		/// Uninstalls component
		/// </summary>
		private void UninstallComponent()
		{
			Log.WriteStart("Uninstalling component");
			
			ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
			string installer = element.GetStringSetting(Global.Parameters.Installer);
			string path = element.GetStringSetting(Global.Parameters.InstallerPath);
			string type = element.GetStringSetting(Global.Parameters.InstallerType);
			string componentId = element.ID;
			string componentCode = element.GetStringSetting(Global.Parameters.ComponentCode);
			string componentName = element.GetStringSetting(Global.Parameters.ComponentName);
			string release = element.GetStringSetting(Global.Parameters.Release);

			try
			{
				Log.WriteInfo(string.Format("Uninstalling {0}", componentName));
				//download installer
				Loader form = new Loader(this.AppContext, installer, componentCode, release);
				DialogResult result = form.ShowDialog(this);
				if (result == DialogResult.OK)
				{
					//run installer
					string tmpFolder = FileUtils.GetTempDirectory();
					path = Path.Combine(tmpFolder, path);
					Update();
					string method = "Uninstall";
					//
					Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
					//
					var args = new Hashtable
					{
						{ Global.Parameters.ComponentId, componentId },
						{ Global.Parameters.ComponentCode, componentCode },
						{ Global.Parameters.ShellVersion, AppContext.AppForm.Version },
						{ Global.Parameters.BaseDirectory, FileUtils.GetCurrentDirectory() },
						{ Global.Parameters.IISVersion, Global.IISVersion },
						{ Global.Parameters.ParentForm,  FindForm() },
					};
					//
					result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args });
					//
					Log.WriteInfo(string.Format("Installer returned {0}", result));
					Log.WriteEnd("Installer finished");
					Update();
					ReloadApplication();
					FileUtils.DeleteTempDirectory();
					
				}
				Log.WriteEnd("Uninstall completed");
			}
			catch (Exception ex)
			{
				Log.WriteError("Installer error", ex);
				AppContext.AppForm.ShowError(ex);
			}
		}
		/// <summary>
		/// Setup component
		/// </summary>
		private void SetupComponent()
		{
			Log.WriteStart("Starting component setup");

			var element = AppContext.ScopeNode.Tag as ComponentConfigElement;

			string installer = element.GetStringSetting("Installer");
			string path = element.GetStringSetting("InstallerPath");
			string type = element.GetStringSetting("InstallerType");
			string componentId = element.ID;
			string componentCode = element.GetStringSetting("ComponentCode");
			string componentName = element.GetStringSetting("ComponentName");
			string release = element.GetStringSetting("Release");

			try
			{
				Log.WriteInfo(string.Format("Setup {0} {1}", componentName, release));
				//download installer
				Loader form = new Loader(this.AppContext, installer, componentCode, release);
				DialogResult result = form.ShowDialog(this);
				if (result == DialogResult.OK)
				{
					string tmpFolder = Path.Combine(AppContext.CurrentPath, "Tmp");
					path = Path.Combine(tmpFolder, path);
					Update();
					string method = "Setup";
					Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
					Hashtable args = new Hashtable();
					args["ComponentId"] = componentId;
					args["ShellVersion"] = AppContext.AppForm.Version;
					args["BaseDirectory"] = FileUtils.GetCurrentDirectory();
                    args["IISVersion"] = Global.IISVersion;
					args["ParentForm"] = FindForm();
					args[Global.Parameters.ShellMode] = Global.VisualInstallerShell;
					//
					result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args });
					//
					Log.WriteInfo(string.Format("Installer returned {0}", result));
					Log.WriteEnd("Installer finished");

					if (result == DialogResult.OK)
					{
						ReloadApplication();
					}
					FileUtils.DeleteTempDirectory();
				}
				Log.WriteEnd("Component setup completed");
			}
			catch (Exception ex)
			{
				Log.WriteError("Installer error", ex);
				this.AppContext.AppForm.ShowError(ex);
			}
		}
		/// <summary>
		/// Runs component update
		/// </summary>
		/// <param name="fileName"></param>
		/// <param name="path"></param>
		/// <param name="type"></param>
		private void UpdateComponent(string fileName, string path, string type, string version)
		{
			// InvokeRequired required compares the thread ID of the
			// calling thread to the thread ID of the creating thread.
			// If these threads are different, it returns true.
			if (this.InvokeRequired)
			{
				UpdateComponentCallback callBack = new UpdateComponentCallback(UpdateComponent);
				Invoke(callBack, new object[] { fileName, path, type, version });
			}
			else
			{
				Log.WriteStart("Updating component");

				ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
				string componentId = element.ID;
				string componentName = element.GetStringSetting("ComponentName");

				try
				{
					Log.WriteInfo(string.Format("Updating {0}", componentName));
					//download installer
					Loader form = new Loader(this.AppContext, fileName);
					DialogResult result = form.ShowDialog(this);
					if (result == DialogResult.OK)
					{
						//run installer
						string tmpFolder = FileUtils.GetTempDirectory();
						string installerPath = Path.Combine(tmpFolder, path);
						Update();
						string method = "Update";
						Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
						Hashtable args = new Hashtable();
						args["ComponentId"] = componentId;
						args["ShellVersion"] = AppContext.AppForm.Version;
						args["BaseDirectory"] = FileUtils.GetCurrentDirectory();
						args["UpdateVersion"] = version;
						args["Installer"] = Path.GetFileName(fileName);
						args["InstallerType"] = type;
						args["InstallerPath"] = path;
						args["InstallerFolder"] = tmpFolder;
						args["IISVersion"] = Global.IISVersion;
						args["ParentForm"] = FindForm();

						result = (DialogResult)AssemblyLoader.Execute(installerPath, type, method, new object[] { args });
						Log.WriteInfo(string.Format("Installer returned {0}", result));
						Log.WriteEnd("Installer finished");
						Update();
						if (result == DialogResult.OK)
						{
							ReloadApplication();
						}
						FileUtils.DeleteTempDirectory();
					}
					Log.WriteEnd("Update completed");
				}
				catch (Exception ex)
				{
					Log.WriteError("Installer error", ex);
					AppContext.AppForm.ShowError(ex);
				}
			}
		}