/*********************************************************************************************
 * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 * ------------------------------------------------------------------------------
 * $Workfile: PrivateProfile.cs $     $Revision: 1 $
 * $Author: Kathy $   $Date: 7/27/04 8:34a $
 *
 * $History: PrivateProfile.cs $
 * 
 * *****************  Version 1  *****************
 * User: Kathy        Date: 7/27/04    Time: 8:34a
 * Created in $/LibSource/Utils
 *********************************************************************************************/

using System;
using System.IO;
using System.Xml;
namespace Utils
{
	/// <summary>
	/// PrivateProfile opens a private profile string and stores it's contents in an xml document.
	/// </summary>
	public class PrivateProfile
	{
		private string ppName;
		private XmlDocument  ppXml;
		private XmlNode AddNode(XmlNode xParent, string sName, string sValue )
		{
			XmlNode nd;
			// Add a node 
			nd=xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Element,sName,"");
			xParent.AppendChild(nd);
			nd.Value=sValue;
			return nd;
		}
		private XmlNode AddNode(XmlNode xParent, string sName)
		{
			XmlNode nd;
			// Add a node 
			nd=xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Element,sName,"");
			xParent.AppendChild(nd);
			return nd;
		}
		private void AddAttribute(XmlNode xParent, string sName, string sValue )
		{
			XmlNode  xa=xParent.Attributes.GetNamedItem(sName);
			// bug fix. 09/15/03
			// If there was a space after an equal sign, that space character
			// was becomming part of the value string (reading the user.CFG file).
			// This was giving us a "Must have semi-colon" error message.
			// We now strip spaces before and after any Attribute that is written.
			sValue = sValue.Trim(' ');

			// Add an attribute 
			if(sValue=="")
			{
				if(xa != null)
				{
					xParent.Attributes.RemoveNamedItem(sName);
				}
			}
			else
			{
				if(xa == null)
				{
					xa = xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Attribute ,sName,"");
					xParent.Attributes.SetNamedItem(xa);
				}
				xa.Value=sValue;
			}
			
		}
		private XmlNode AddSection(XmlNode xParent, string sSection )
		{
			// Add a section [name]
			XmlNode nd =AddNode(xParent,"section");
			AddAttribute(nd,"name",sSection.Substring(1,sSection.IndexOf("]")-1));
			return nd;
		}
		private XmlNode AddSection_UC(XmlNode xParent, string sSection )
		{
			// Add a section [name]
			string name_uc = sSection.Substring(1,sSection.IndexOf("]")-1).ToUpper() + "__UC";
			XmlNode nd =AddNode(xParent,"sectionUC");
			AddAttribute(nd,"name",name_uc);
			return nd;
		}
		private void  AddComment(XmlNode xParent, string sComment)
		{
			
			if(xParent.ChildNodes.Count > 0)
			{
				XmlNode ndlast=xParent.ChildNodes.Item(xParent.ChildNodes.Count-1);
				if(ndlast.Name=="comment")
				{
					XmlNode xa = ndlast.Attributes.GetNamedItem("text");
					xa.Value=xa.Value + "\r\n" + sComment;
					return;
				}
			}
			// Add a comment text
			XmlNode nd =AddNode(xParent,"comment");			
			AddAttribute(nd,"text",sComment);
		}
		private void  AddLine(XmlNode xParent, string sLine)
		{
			// Add a comment text
			XmlNode nd =AddNode(xParent,"line");			
			AddAttribute(nd,"text",sLine);
		}
		private void AddParam(XmlNode xParent, string sParam)
		{
			int i = sParam.IndexOf("=");
			// add a param name=value
			string sName=sParam.Substring(0,i);
			string sValue=sParam.Substring(i+1);
			XmlNode nd =AddNode(xParent,"param");
			sName = sName.Trim(' ');
			AddAttribute(nd,"name",sName);
			AddAttribute(nd,"value",sValue);
//			AddAttribute(nd,"srchname",sName.ToUpper()+"__UC");
//			AddAttribute(nd,"value",sValue);
		}
		private void AddParam_UC(XmlNode xParent, string sParam)
		{
			int i = sParam.IndexOf("=");
			// add a param name=value
			string sName=sParam.Substring(0,i);
			string sValue=sParam.Substring(i+1);
			XmlNode nd =AddNode(xParent,"paramUC");
			sName = sName.Trim(' ');
			AddAttribute(nd,"name",sName.ToUpper()+"__UC");
			AddAttribute(nd,"value",sValue);
		}
		private void LoadXML()
		{
			string sLine;
			ppXml.LoadXml("<ini/>");// initialize ppXml
			XmlNode  xmlTop=ppXml.DocumentElement;
			XmlNode  xmlNd=ppXml.DocumentElement;
			XmlNode  xmlNd_UC=ppXml.DocumentElement;
			StreamReader myReader = new StreamReader(ppName);// Open file
			while( (sLine = myReader.ReadLine())!= null)// read line-by-line
			{
				// add structure
				if(sLine.Length > 0)
				{
					switch (sLine.Substring(0,1))
					{
						case "[":
							xmlNd=AddSection(xmlTop, sLine);
							xmlNd_UC=AddSection_UC(xmlTop, sLine);
							break;
						case ";":
							AddComment(xmlNd, sLine);
							break;
						default:
							if(sLine.IndexOf("=") >= 0)
							{
								AddParam(xmlNd, sLine);
								AddParam_UC(xmlNd_UC, sLine);
							}
							else
							{
								AddLine(xmlNd, sLine);
							}
							break;
					}
				}
			}
			myReader.Close();
			// close file
		}
		public PrivateProfile(string sFileName)
		{
			ppName=sFileName; // Store file name
			ppXml= new XmlDocument();// Allocate XML
			LoadXML();// Load XML
		}
		~PrivateProfile()
		{
			// Clean-up
			// 
		}
		public string PrettyNode(XmlNode nd,int level)
		{
			string retval="";
			string prefix=new string(' ',level*2);
			if(nd.ChildNodes.Count > 0)
			{
				retval = prefix + "<" + nd.Name;
				for(int i=0;i<nd.Attributes.Count;i++)
				{
					retval=retval + " " + nd.Attributes.Item(i).Name + "='" + nd.Attributes.Item(i).Value + "'";
				}
				retval=retval+">";
				for(int i=0;i<nd.ChildNodes.Count;i++)
				{
					retval=retval+"\r\n"+PrettyNode(nd.ChildNodes.Item(i),level+1);
				}
				retval=retval+"\r\n" + prefix + "</" + nd.Name + ">";
			}
			else
			{
				retval = prefix + "<" + nd.Name;
				for(int i=0;i<nd.Attributes.Count;i++)
				{
					retval=retval + " " + nd.Attributes.Item(i).Name + "='" + nd.Attributes.Item(i).Value + "'";
				}
				retval=retval+"/>";
			}
			return retval;
		}
		public string PrettyXML()
		{
			return PrettyNode(ppXml.DocumentElement,0);
		}
		public XmlDocument XML()
		{
			// return XML Document
			return ppXml;
		}
		public override string ToString()
		{
			// return string
			return "";
		}
		public void Save()
		{
			SaveAs(ppName);
		}
		public void SaveAs(string sName)
		{
		}
		public string Attr(string sPath)
		{
			string retval="";
			XmlNode xn = ppXml.SelectSingleNode(sPath);
			if(xn != null)
			{
				string quots = xn.Value;
				if (quots.Substring(0,1)=="\"" && quots.Substring(quots.Length-1,1)=="\"")
					retval = quots.Substring(1,quots.Length-2);
				else
					retval=xn.Value;
			}
			return retval;
		}

		public string Attr(string sSection, string sParameter)
		{
			string findstr = "/ini/sectionUC[@name='" + sSection.ToUpper() + "__UC']/paramUC[@name='" + sParameter.ToUpper() + "__UC']/@value";
			return Attr(findstr);
		}
	}
}
