private static UriMatch CompareUri(string p_sUrl, string p_sLocalPath, NameValueCollection p_queryString,
            ref int p_iQueryEqualityIndex)
        {
            ComparableQueryString qs = null;
              if (p_sUrl.IndexOf('?') != -1)
            qs = new ComparableQueryString(HttpUtility.ParseQueryString(p_sUrl.Substring(p_sUrl.IndexOf('?'))));

              if (p_sUrl.StartsWith(p_sLocalPath))
              {
            if (qs != null)
            {
              p_iQueryEqualityIndex = qs.GetEqualityIndex(p_queryString);
              if (p_iQueryEqualityIndex > 0)
            return UriMatch.PathAndQuery;
            }
            return UriMatch.PathOnly;
              }
              else if (qs != null)
              {
            p_iQueryEqualityIndex = qs.GetEqualityIndex(p_queryString);
            if (p_iQueryEqualityIndex > 0)
              return UriMatch.QueryOnly;
              }
              return UriMatch.None;
        }
        //private int GetIndexOfLastMatchedSymbol(string x, string y)
        //{
        //  x = x.ToUpper();
        //  y = y.ToUpper();
        //  var index = 0;
        //  for (index = 0; index < Math.Min(x.Length, y.Length); index++)
        //  {
        //    if (x[index].Equals(y[index]) == false)
        //    {
        //      break;
        //    }
        //  }
        //  return index;
        //}
        public override SiteMapNode FindSiteMapNode(HttpContext context)
        {
            SiteMapNode node = null;
              var uri = context.Request.Url;
              var qs = new ComparableQueryString(context.Request.QueryString);
              try
              {
            var filter = string.Format("{0} LIKE '%{1}%'"
              , GT.DA.SiteMap.SiteMap.URL_COL, uri.GetComponents(
            UriComponents.Path, UriFormat.UriEscaped));

            var nodes = GT.DA.SiteMap.SiteMap.Instance.Data.Tables[0].Select(filter
              , string.Format("{0} ASC", GT.DA.SiteMap.SiteMap.ID_COL));
            var index = -1;
            var key = -1;
            for(int i  = 0; i < nodes.Length; i++)
            {
              var nodeUrl = nodes[i][GT.DA.SiteMap.SiteMap.URL_COL].ToString().TrimStart('~','/');
              var questionIndex = nodeUrl.IndexOf('?');
              if(questionIndex > 0 && nodeUrl.Contains("?&") == false)
              {
            nodeUrl = nodeUrl.Insert(questionIndex + 1, "&");
              }
              var nodeQueryString  = HttpUtility.ParseQueryString(nodeUrl);
              var temp = qs.GetEqualityIndex(nodeQueryString);
              if(temp > index)
              {
            index = temp;
            key = (int)nodes[i][GT.DA.SiteMap.SiteMap.ID_COL];
              }
            }
            if(key > -1)
            {
              node = FindSiteMapNodeFromKey(key.ToString());
            }
              }
              catch (Exception e)
              {
            AssistLogger.Log<WebExceptionHolder>(new Exception("Cannot resolve sitemap node.", e));
              }

              if(node == null)
              {
            node = base.FindSiteMapNode(context);
              }
              return node;
        }