
// 
// CLASS:
// - Transform
// 
// VERSION:
// - 1.0.0 - 20071001 - Core design
// 
// DEPENDENCIES:
// - Ajax handler
// - Element Class
// 
// NOTES:
// - This class is structured slightly differently to 
//   accomodate for browser specific methods.
// 

var Transform = {};

Transform.init = function (type, xslFile, mode, element)
{
  if (typeof mode == 'undefined') mode = 'frame';
  if (typeof element == 'undefined') element = '';
  
  this.type = type;
  this.xslFile = xslFile;
  this.mode = mode;
  this.element = element;
}

Transform.errorHandle = function (httpCode)
{
  // ...
}

Transform.execute = function (target)
{
  switch (this.type)
  {
    case 'file':
      Ajax.send(target, {format: 'html', onComplete: this.responseHandle, onStatus: this.errorHandle});
    break;
    case 'string':
      this.responseHandle(target);
    break;
  }
}

Transform.getXslFile = function ()
{
  return this.xslFile;
}

Transform.prepareLink = function (tag, obj)
{
  // Arguments
  if (typeof obj == 'undefined') obj = document;
  
  // Initialize
  var element = '';
  
  // Execute
  element = obj.getElementsByTagName(tag);
  
  for (var i = 0; i < element.length; i++)
  {
    element[i].onclick = function ()
    {
      if (this.href.match(/.+?#$/))
      {
        return false;
      }
      
      else if (Element.hasClass(this, 'external') || this.href.match(/\.pdf$/) || this.href.match(/\.doc$/))
      {
        window.open(this.href, 'external');
        return false;
      }
      
      else if (Element.hasClass(this, 'minimal'))
      {
        window.open(this.href, 'minimal', 'toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=1,resizable=0,width=766,height=480,top=20,left=20');
        return false;
      }
      
      else if (Element.hasClass(this, 'internal'))
      {
        return true;
      }
      
      /*
      else
      {
        Transform.init('file', './xsl/portion_frame.xsl', 'frame', document.getElementById('main'));
        Transform.execute(this.href);
        return false;
      }
      */
    }
  }
}

Transform.responseHandle = function (newXml)
{
  switch (typeof newXml)
  {
    case 'object':
      if (Element.getAttribute('id', newXml.childNodes[0]))
      {
        switch (Transform.mode)
        {
          case 'admin':
            Transform.setContent(newXml)
          break;
          case 'frame':
            Transform.setContent(newXml.childNodes[0])
          break;
        }
      }
    break;
    case 'string':
      newXml = newXml.replace(/<\?.*\?>/, '');
      newXml = newXml.replace(/^.*/, '');
      //newXml = newXml.replace(/.*$/, '');
      
      if (newXml.match(/\[navlink\].+\[\/navlink\]/))
      {
        window.open(/\[navlink\](.+)\[\/navlink\]/.exec(newXml)[1], 'external');
        return false;
      }
      
      else
      {
        document.getElementById('Body').innerHTML = newXml;
      }
      
      var obj = document.getElementById('Main')[0];
      Transform.prepareLink('a', obj);
      //Transform.prepareLink('area', obj);
      
      Form.init();
    break;
  }
}

if (typeof XSLTProcessor != 'undefined')
{
  Transform.setContent = function ()
  {
    var processor = new XSLTProcessor();
    var transform = document.implementation.createDocument('', '', null);
    transform.onload = runTransform;
    transform.load(Transform.getXslFile());
    
    function runTransform()
    {
      processor.importStylesheet(transform);
      
      Element.removeAllChild(Transform.getBlock());
      
      var frag = processor.transformToFragment(newXml, document);
      Transform.getBlock().appendChild(frag);
    }
  }
}

else
{
  Transform.setContent = function (xmlDoc, htmlDoc)
  {
    // Arguments
    if (typeof htmlDoc == 'undefined')
    {
      var htmlDoc = '';
    }
    
    switch (Transform.mode)
    {
      case 'admin':
        // Load XSL
        var xsl = new ActiveXObject("Microsoft.XMLDOM")
        xsl.async = false
        xsl.load(Transform.xslFile)
        
        // Transform
        var newXml = xmlDoc.transformNode(xsl).replace(/<\?.*\?>/, '');
        Transform.element.innerHTML = (Transform.element.innerHTML + newXml);
      break;
      case 'frame':
        // Initialize
        var nodeName = '';
        
        // Load XSL
        var xsl = new ActiveXObject("Microsoft.XMLDOM")
        xsl.async = false
        xsl.load(Transform.getXslFile())
        
        // Transform
        for (var i = 0; i < xmlDoc.childNodes.length; i++)
        {
          if (xmlDoc.childNodes[i].nodeType == 1)
          {
            Transform.setContent(xmlDoc.childNodes[i], htmlDoc);
          }
          
          else if (xmlDoc.childNodes[i].nodeType == 3)
          {
            nodeName = Element.getAttribute('name', xmlDoc);
            
            if (nodeName != 'Nav')
            {
              var htmlDoc = xmlDoc.transformNode(xsl);
              tmpHtmlDoc = htmlDoc.replace(/<.+?>/g, '');
              
              if (tmpHtmlDoc.match(/^\[navlink\].+\[\/navlink\]/))
              {
                window.open(/^\[navlink\](.+)\[\/navlink\]$/.exec(tmpHtmlDoc)[1], 'external');
                return false;
              }
              
              else
              {
                //htmlDoc = htmlDoc.replace(/(<tbody>|<\/tbody>)/, '');
                document.getElementsByName(nodeName)[0].innerHTML = htmlDoc;
              }
              
              var obj = document.getElementById('main')[0];
              Transform.prepareLink('a', obj);
              Transform.prepareLink('area', obj);
              
              Form.init();
            }
          }
        }
      break;
    }
  }
}



