﻿//-----------------------------------------------------------------------------
// XConfig
//
// Copyright 2005-2010 - Xcential Group LLC.
//
//-----------------------------------------------------------------------------

XConfig.prototype = new XNode;
XConfig.prototype.constructor = XConfig;

//=============================================================================
// Constructor

function XConfig(
   refOrItem,
   create
)
{
   refOrItem = (refOrItem == null) ? null : refOrItem;
   create = (create == null) ? true : create;

   if (create)
      return new XConfig(refOrItem, false);

   //--------------------------------------------------------------------------
   // Private Interface

   //--------------------------------------------------------------------------
   // Privileged Interface

   this.valueOf = function()
   {

      return oXNode;
   }

   //--------------------------------------------------------------------------

   this.setObjectValue  = function(
      refOrItem
   )
   {
      refOrItem = (refOrItem == null) ? null : refOrItem;

      oXNode = XConfig.getXNodeFrom(refOrItem);

      return oXNode;
   }

   //--------------------------------------------------------------------------
   // Initialization

   var oXNode = this.setObjectValue(refOrItem);

}

XConfig.prototype.objectClass = "XConfig";

//=============================================================================
// Static Interface

XConfig.NAMESPACE_URI = "http://www.xcential.com/schemas/2006/xcfg";

//-----------------------------------------------------------------------------

XConfig.getXNodeFrom = function(
   refOrItem
)
{
   refOrItem = (refOrItem == null) ? null : refOrItem;

   if (refOrItem == null)
      return null;

   var xNode = null;
   switch (typeof(refOrItem))
   {
      case "string":
         try
         {
            if (XRef.isRef(refOrItem))
            {
               var ref = refOrItem;
               xNode = XDoc(ref, false, XDoc.CACHE_CLIENT).getRoot();
            }
            else if (XNode.isXML(refOrItem))
            {
               var xml = refOrItem;
               xNode = X$(xml);
            }
            else
            {
               var url = null;
               if (refOrItem == "app")
                  url = XApp.URL_APP_CONFIG;
               else if (XApp.isApplication(refOrItem.toString()))
                  url = XApp.URL_APP_CONFIG;
               else if (refOrItem == "model")
                  url = XApp.URL_APP_CONFIG;
               else
                  url = XApp.getDomainURL() + XApp.URL_MODEL + "xfw/" + refOrItem.toString() + "/Properties.xml";
               xNode = XDoc(url, false, XDoc.CACHE_CLIENT).getRoot();
            }
         }
         catch (error)
         {
            XApp.logEvent(XApp.EVENT_ERROR, error);
            throw XMsg("Cannot create configuration.", error);
         }
         break;
      case "number":
         throw XMsg("Cannot create configuration. Invalid reference '" + String(refOrItem) + "'.");
         break;
      case "boolean":
         throw XMsg("Cannot create configuration. Invalid reference '" + String(refOrItem) + "'.");
         break;
      case "function":
         try
         {
            XConfig.getXNodeFrom(refOrItem());
         }
         catch (error)
         {
            XApp.logEvent(XApp.EVENT_ERROR, error);
            throw XMsg("Cannot create configuration from function.", error);
         }
         break;
      case "object":
         try
         {
            xNode = XConfig.getXNodeFrom(refOrItem.toValue());
         }
         catch (error)
         {
            xNode = refOrItem;
            var nodeType = node.nodeType;
            if (nodeType = XNode.NODE_DOCUMENT)
               node = node.documentElement;
            else if (nodeType != XNode.NODE_ELEMENT)
            {
               XApp.logEvent(XApp.EVENT_ERROR, error);
               throw XMsg("Cannot create a configuration from an XML node.", error);
            }
         }
         break;
   }

   if (xNode == null)
      throw XMsg("Cannot create config" + ((typeof(refOrItem) == "string" && XRef.isRef(refOrItem)) ? " from '" + refOrItem + "'." : "."));

   return xNode;
}

//=============================================================================
// Public Interface

XConfig.prototype.getURL = function()
{

   return this.getXDoc().getURL();
}

//-----------------------------------------------------------------------------

XConfig.prototype.getProperty = function(
   propertyName,
   propertyGroup,
   defaultValue
)
{
   propertyGroup = (propertyGroup == null) ? null : propertyGroup;
   defaultValue = (defaultValue == null) ? null : defaultValue;

   var xPath = "/xcfg:Properties/";
   xPath += (propertyGroup == null) ? "" : "xcfg:Group[@name='" + propertyGroup + "']/";
   xPath += "xcfg:Property[@name='" + propertyName + "']";

   var propertyValue = defaultValue;
   var property = this.X$(xPath);
   if (property != null)
   {
      propertyValue = property.getAttribute("value");
      if (propertyValue == null)
         propertyValue = property.toText();
   }

   return propertyValue;
}

//-----------------------------------------------------------------------------

XConfig.prototype.getMenuItems = function(
   menuName,
   role
)
{
   menuName = (menuName == null) ? null : menuName;
   role = (role == null) ? "all" : role.toLowerCase();

   if (menuName == null)
      return [];

   var menuItems = new Array();

   var xPath = "/xcfg:Menus//xcfg:Menu[@name='" + menuName + "']/*";
   if (role != "all")
      xPath += "[" + ((role == "primary") ? "not(@role) or " : "" ) + "@role='" + role + "'"+ "]";
   var menuItemXNodes = this.X$$(xPath);
   for (var i=0; i<menuItemXNodes.length; i++)
   {
      var menuItemXNode = menuItemXNodes.X$(i);
      switch (menuItemXNode.getNodeName())
      {
         case "xcfg:Label":
            var menuItem = new Array();
            menuItem.type = "Label";
            menuItem.text = menuItemXNode.toText();
            menuItems.push(menuItem);
            break;
         case "xcfg:MenuItem":
            var menuItem = new Array();
            menuItem.type = "MenuItem";
            menuItem.onClick = menuItemXNode.getAttribute("onClick");
            menuItem.ref = menuItemXNode.getAttribute("href");
            menuItem.target = menuItemXNode.getAttribute("target");
            if (XString(menuItem.ref).isSomething() && !(/^http:/i).test(menuItem.ref) && menuItem.ref.charAt(0) != "/")
               menuItem.ref = XApp.getDomainURL() + XApp.URL_APP + menuItem.ref;
            menuItem.img = menuItemXNode.getAttribute("img");
            menuItem.round = menuItemXNode.getAttribute("round");
            menuItem.data = menuItemXNode.getAttribute("data");
            menuItem.text = menuItemXNode.toText();
            menuItems.push(menuItem);
            break;
         case "xcfg:Separator":
            var menuItem = new Array();
            menuItem.type = "Separator";
            menuItems.push(menuItem);
            break;
      }
   }

   return menuItems;
}

//=============================================================================

