﻿//-----------------------------------------------------------------------------
// XTransforms
//
// Copyright 2005-2010 - Xcential Group LLC.
//
//-----------------------------------------------------------------------------

XTransforms.prototype = new XConfig;
XTransforms.prototype.constructor = XTransforms;

function XTransforms(
   model,
   create
)
{
   model = (model == null) ? null : model;
   create = (create == null) ? true : create;

   if (create)
      return new XTransforms(model, false);

   //--------------------------------------------------------------------------
   // Private Interface

   //--------------------------------------------------------------------------
   // Privileged Interface

   this.valueOf = function()
   {

      return oXNode;
   }

   //--------------------------------------------------------------------------

   this.setObjectValue = function(
      model
   )
   {
      model = (model == null) ? null : model;

      oXNode = XTransforms.getTransformsFor(model);

      return oXNode;
   }

   //--------------------------------------------------------------------------
   // Initialization

   var oXNode = this.setObjectValue(model);

}

XTransforms.prototype.objectClass = "XTransforms";

//=============================================================================
// Static Interface

XTransforms.getTransformsFor = function(
   model
)
{
   model = (model == null) ? null : model.toString();

   if (model == null)
      return null;

   var transformsURL = null;
   if (XApp.isApplication(model))
      transformsURL = XApp.URL_TRANSFORMS;
   else
      transformsURL = XApp.getDomainURL() + XApp.URL_MODEL + "xfw/" + model + "/Transforms.xml";
   var xNode = XConfig.getXNodeFrom(transformsURL);

   return xNode;
}

//=============================================================================
// Public Interface

XTransforms.prototype.getStylesheet = function(
   from,
   to
)
{
   from = (from == null) ? null : from;
   to = (to == null) ? null : to.toString();

   if (from == null)
      throw XMsg("Cannot find stylesheet without source node or format.");

   if (to == null)
      throw XMsg("Cannot find stylesheet without destination format.");

   if (typeof(from) == "string" && from == to)
      return null;

   switch (typeof(from))
   {
      case "string":
         break;
      case "number":
         throw XMsg("Cannot find stylesheet from a number.");
         break;
      case "boolean":
         throw XMsg("Cannot find stylesheet from a boolean.");
         break;
      case "function":
         if (this.getStylesheet)
            return this.getStylesheet(from(), to);
         else
         {
            XApp.logEvent(XApp.EVENT_ERROR, error);
            throw XMsg("Cannot find stylesheet from a function.", error);
         }
         break;
      case "object":
         if (from.getNodeName)
         {
            var nodeName = from.getNodeName();
            from = nodeName;
         }
         else if (from.nodeName)
         {
            var nodeName = from.nodeName;
            from = nodeName;
         }
         else
         {
            XApp.logEvent(XApp.EVENT_ERROR, error);
            throw XMsg("Cannot find stylesheet from an object.", error);
         }
         break;
   }

   if (from == null || typeof(from) != "string" || from.length == 0)
      throw XMsg("Cannot find stylesheet as source format cannot be determined.");

   if (typeof(to) != "string" || to.length == 0)
      throw XMsg("Cannot find stylesheet as destination format is not specified.");

   var xPath = "/xcfg:Transforms/xcfg:Transform[@from='" + from + "' and @to='" + to + "']/@href";
   var transformRefXNode = this.X$(xPath);
   if (transformRefXNode == null)
      throw XMsg("Cannot find stylesheet from '" + from + "' to '" + to + "'.");

   var transformURL = XRef(transformRefXNode.getNodeValue()).getURL();
   if (transformURL == null)
      throw XMsg("Cannot identify location of '" + from + "' to '" + to + "' transform.");

   var stylesheetLoaded = false;
   try
   {
      if (XApp.getMode() == XApp.MODE_CLIENT && (XApp.isBrowser("Safari") || XApp.isBrowser("Chrome")))
      {
         var stylesheet = XTextDoc().read(transformURL);
         stylesheetLoaded = true;
      }
      else
      {
         var stylesheet = XDOM.createDocument(XDOM.FREE_THREADED);

         // Allow XSLT Scripting from MSXML 6 onwards
         if (XDOM.activeXDocClsId)
         {
            if (XDOM.activeXDocClsId != ".4.0")
               stylesheet.setProperty("AllowXsltScript", true);
            if (Number(XDOM.activeXDocClsId.replace(/^\./,"")) >= 5)
               stylesheet.setProperty("ResolveExternals", true);
         }

         stylesheet.async = false;
         stylesheet.validateOnParse = true;
         if (XApp.getMode() == XApp.MODE_STANDALONE || XApp.getMode() == XApp.MODE_SERVER)
         {
            stylesheet.setProperty("ServerHTTPRequest", true);
            stylesheetLoaded = stylesheet.load(transformURL);
            if (!stylesheetLoaded && XRef.isLocal(transformURL))
            {
               stylesheet.setProperty("ServerHTTPRequest", true);
               stylesheetLoaded = stylesheet.load(XRef.getAbsolute(transformURL));
               if (!stylesheetLoaded)
               {
                  stylesheet.setProperty("ServerHTTPRequest", false);
                  stylesheetLoaded = stylesheet.load(XRef.mapPath(transformURL));
               }
            }
         }
         else
            stylesheetLoaded = stylesheet.load(transformURL);

      }
   }
   catch (error)
   {
      stylesheetLoaded = false;
   }
   if (!stylesheetLoaded)
      throw XMsg("Cannot load transform at '" + transformURL + "'.");
   XApp.logEvent(XApp.EVENT_RETRIEVE, transformURL);

   return stylesheet;
}

//=============================================================================

