/** Template loader function  */

function loadTemplate()
{
  var templateName = escape(elAdminNetGlobal.currentTemplate); 
  createXmlHttp("loadTemplate");
  getXmlHttp("loadTemplate").open("GET", "elAdmin/components/system/frontEnd/backoffice.php?action=loadTemplate&name=" + templateName,true);
  getXmlHttp("loadTemplate").onreadystatechange=receiveLoadedTemplate;
  getXmlHttp("loadTemplate").send(null);
}

function receiveLoadedTemplate()
{
  if (getXmlHttp("loadTemplate").readyState==4)
  {
    elAdminNetGlobal.templateXml = getXmlHttp("loadTemplate").responseXML;
    removeXmlHttp("loadTemplate");
    
    loadFirstTemplateStyle();
  }
}

/** Template loader function upto here  */

/** Launcher functions */

function processTemplate()
{
  var aResponse = elAdminNetGlobal.templateXml;
  var canvas = document.getElementById("canvas");
  var doubleBuffer;

  elAdminNetGlobal.cStyleSheet = getCurrentStyleSheet();
  doubleBuffer = createDoubleBuffer(canvas);
  doubleBufferStyleSheet(elAdminNetGlobal.cStyleSheet);
  
  moveElementsToDoubleBuffer(canvas,doubleBuffer);
  refreshStyleSheet(elAdminNetGlobal.cStyleSheet);

  canvas.style.visibility = "hidden";
  createTemplateElements(canvas);
  
  doDispatchement(true);  
}

function refreshCanvas()
{
  var canvas       = document.getElementById("canvas");
  var doubleBuffer = document.getElementById("doubleBuffer");
  
  var tempHeight = doubleBuffer.style.height;
  doubleBuffer.style.height = "0px";
  canvas.style.visibility = "visible";
  canvas.style.height = tempHeight;
  doubleBuffer.parentNode.removeChild(doubleBuffer);
    
  removeDoubleBufferStyleSheet(elAdminNetGlobal.cStyleSheet);
  adaptLayout(canvas,elAdminNetGlobal.cStyleSheet);
}

/** Launcher functions upto here  */

/** Style refresher functions  */

function loadFirstTemplateStyle()
{
  aResponse = elAdminNetGlobal.templateXml;
  objects = aResponse.getElementsByTagName("object");
  elAdminNetGlobal.containerStack = Array();
  
  for (i=0;i<objects.length;i++)
  {
  	var idTxt    = objects[i].getElementsByTagName("id").item(0).firstChild.nodeValue;
  	var classTxt = objects[i].getElementsByTagName("class").item(0).firstChild.nodeValue;
  	elAdminNetGlobal.containerStack[i] = Array(idTxt,classTxt);
  }

  elAdminNetGlobal.containerID = 0;
  loadNextTemplateStyle();
}

function loadNextTemplateStyle()
{
  var url;
  if (elAdminNetGlobal.containerID < elAdminNetGlobal.containerStack.length)
  {  	
  	var cClass = elAdminNetGlobal.containerStack[elAdminNetGlobal.containerID][1];
  	var sFile  = escape(elAdminNetGlobal.specificStyleFiles[cClass]);
  	
  	elAdminNetGlobal.containerID++;
  	
  	if (elAdminNetGlobal.specificStyles[cClass] == null)
  	{
  	  url  = "elAdmin/components/system/frontEnd/backoffice.php?action=loadStyle";
  	  url += "&file=" + sFile; 
      createXmlHttp("loadStyle");
      getXmlHttp("loadStyle").open("GET", url,true);
      getXmlHttp("loadStyle").onreadystatechange=receiveNextTemplateStyle;
      getXmlHttp("loadStyle").send(null);
  	}
  	else
  	{
  	  loadNextTemplateStyle();
  	}
    
  }
  else
  {
  	loadGeneralStyle();
  }
}

function receiveNextTemplateStyle()
{
  if (getXmlHttp("loadStyle").readyState==4)
  {
  	var aResponse = getXmlHttp("loadStyle").responseXML;
  	var cClass = elAdminNetGlobal.containerStack[elAdminNetGlobal.containerID-1][1];
  	
  	elAdminNetGlobal.specificStyles[cClass] = aResponse;
  	
    removeXmlHttp("loadStyle");
    loadNextTemplateStyle();
  }
}

function loadGeneralStyle()
{
  if (elAdminNetGlobal.generalStyle == null)
  {
    createXmlHttp("loadGeneralStyle");
    getXmlHttp("loadGeneralStyle").open("GET", "elAdmin/components/system/frontEnd/backoffice.php?action=loadGeneralStyle",true);
    getXmlHttp("loadGeneralStyle").onreadystatechange=receiveGeneralStyle;
    getXmlHttp("loadGeneralStyle").send(null);
  }
  else
  {
    processTemplate();
  }
}

function receiveGeneralStyle()
{
  if (getXmlHttp("loadGeneralStyle").readyState==4)
  {
  	var jsName;
  	
    aResponse = getXmlHttp("loadGeneralStyle").responseXML;
    styleDefs = aResponse.getElementsByTagName("styleDef");
    
    elAdminNetGlobal.generalStyle = Array();
    elAdminNetGlobal.defaultStyle = Array();
    
    for (i=0;i<styleDefs.length;i++)
    {
      javascriptName =
      styleDefs[i].getElementsByTagName("javascriptName").item(0).firstChild.nodeValue;
      defaultValue =
      styleDefs[i].getElementsByTagName("defaultValue").item(0).firstChild.nodeValue;
        
      elAdminNetGlobal.generalStyle[i] = javascriptName;
      elAdminNetGlobal.defaultStyle[i] = defaultValue;
    }
    
    removeXmlHttp("loadGeneralStyle");
    
    processTemplate();
  }
}

/** Style refresher functions upto here */

/** Template processer functions */

function adaptLayout(canvas,cStyleSheet)
{
  var mainCell  = document.getElementById("mainCell");
  var mainTable = document.getElementById("mainTable");
    
  var layout     = elAdminNetGlobal.templateXml.getElementsByTagName("layout").item(0);
  var properties = Array("position","width","height","backgroundColor",
                       "backgroundImage","backgroundRepeat","backgroundPosition",
                       "linkColor","linkDecoration");
  
  var layoutValues = Array();
  for (i=0;i<properties.length;i++)
  {
    layoutValues[properties[i]] = layout.getElementsByTagName(properties[i]).item(0).firstChild.nodeValue;
  }

  canvas.style.width  = parseInt(layoutValues["width"]) + "px";
  canvas.style.height = parseInt(layoutValues["height"]) + "px";

  mainTable.style.backgroundImage    = unescape(layoutValues["backgroundImage"]);
  mainTable.style.backgroundRepeat   = unescape(layoutValues["backgroundRepeat"]);
  mainTable.style.backgroundPosition = unescape(layoutValues["backgroundPosition"]);
                
  switch (parseInt(layoutValues["position"]))
  {
    case 0: ainell.align   = "left";   mainCell.valign="top";    break;
    case 1: mainCell.align = "center"; mainCell.valign="top";    break;
    case 2: mainCell.align = "right";  mainCell.valign="top";    break;
    case 3: mainCell.align = "left";   mainCell.valign="center"; break;
    case 4: mainCell.align = "center"; mainCell.valign="center"; break;
    case 5: mainCell.align = "right";  mainCell.valign="center"; break;
    case 6: mainCell.align = "left";   mainCell.valign="bottom"; break;
    case 7: mainCell.align = "center"; mainCell.valign="bottom"; break;
    case 8: mainCell.align = "right";  mainCell.valign="bottom"; break;
  }
    
  cssRuleSet = getCssRuleSet(cStyleSheet);
  for (var i=cssRuleSet.length-1;i>=0;i--)
  {
    sText = getCssSelector(cssRuleSet[i],"");
    if (sText.indexOf("#drag") != 0)
    {
    	removeCssRule(cStyleSheet,i);
    }
  }

  addCssRule(cStyleSheet,"body","background-color:" + unescape(layoutValues["backgroundColor"]) + ";");
  addCssRule(cStyleSheet,"a","color:" + unescape(layoutValues["linkColor"]) + ";text-decoration:" + unescape(layoutValues["linkDecoration"]) + ";");
}

function removeDoubleBufferStyleSheet(cStyleSheet)
{
  cssRuleSet = getCssRuleSet(cStyleSheet);
  for (var i=cssRuleSet.length-1;i>=0;i--)
  {
  	sText = getCssSelector(cssRuleSet[i],"");
    if (sText.indexOf("#doubledrag") == 0)
    {
      removeCssRule(cStyleSheet,i);
    }
  }
}

function createTemplateElements(canvas)
{
  elAdminNetGlobal.tasks = Array();
  var aDiv = null;

  objects = elAdminNetGlobal.templateXml.getElementsByTagName("object");
  for (i=0;i<objects.length;i++)
  {
    content = objects[i].getElementsByTagName("content").item(0).firstChild.nodeValue;
    	
    oID = objects[i].getElementsByTagName("id").item(0).firstChild.nodeValue;
    oClass = objects[i].getElementsByTagName("class").item(0).firstChild.nodeValue;
    try
    {
      oRefresh = elAdminNetGlobal.refreshFunctions[oClass];
      if (oRefresh.length = 0)
      {
        oRefresh = "";
      }
    }
    catch (e)
    {
      oRefresh = "";
    }
    oScript = elAdminNetGlobal.frontEndScripts[oClass];
        
    aDiv = document.createElement("div");
    aDiv.style.position = "absolute";
    aDiv.id = oID;
    aDiv.className = oClass;

    if (oScript != null)
    {
      var loadDispatcher = "";
      loadDispatcher += "sendGenericRefreshRequest(";
      loadDispatcher += "'" + oID + "',";
      loadDispatcher += "'" + oClass + "',";
      loadDispatcher += "'" + elAdminNetGlobal.frontEndScripts[oClass] + "',";
      loadDispatcher += "'" + oRefresh + "',";
      loadDispatcher += "siteID,refreshContent)";
      
      pushLoadComponent(loadDispatcher);
    }
    
    styling = objects[i].getElementsByTagName("styling").item(0);
    global  = styling.getElementsByTagName("global").item(0);
    for (j=0;j<elAdminNetGlobal.generalStyle.length;j++)
    {
      try
      {
        property =
        global.getElementsByTagName(elAdminNetGlobal.generalStyle[j]).item(0).firstChild.nodeValue;
      }
      catch (e)
      {
        property = elAdminNetGlobal.defaultStyle[j];
      }
      aDiv.style[elAdminNetGlobal.generalStyle[j]] = unescape(property);
    }
    
    if (content != "empty")
    {
      aDiv.innerHTML = unescape(content);
    }
    
    canvas.appendChild(aDiv);
  }
}

function refreshStyleSheet(cStyleSheet)
{
  cssRuleSet = getCssRuleSet(cStyleSheet);  
  for (var i=cssRuleSet.length-1;i>=0;i--)
  {
  	sText = getCssSelector(cssRuleSet[i],"");
    if (sText.indexOf("#drag") == 0)
    {
      removeCssRule(cStyleSheet,i)
    }
  }
      
  objects = elAdminNetGlobal.templateXml.getElementsByTagName("object");
  var currentRule = 0;
  
  for (i=0;i<objects.length;i++)
  {
    var classTxt = objects[i].getElementsByTagName("class").item(0).firstChild.nodeValue;
    var idTxt    = objects[i].getElementsByTagName("id").item(0).firstChild.nodeValue;
    var styling  = objects[i].getElementsByTagName("styling").item(0);
    
    containers = elAdminNetGlobal.specificStyles[classTxt].getElementsByTagName("innerContainer");
    for (j=0;j<containers.length;j++)
    {
	  var objectStyle = "";
      className = containers.item(j).getElementsByTagName("class").item(0).firstChild.nodeValue;
      styleDefs = containers.item(j).getElementsByTagName("styleDef");
      
      templateValues = styling.getElementsByTagName(className).item(0);
      
      for (k=0;k<styleDefs.length;k++)
      {
      	var jsName  = styleDefs.item(k).getElementsByTagName("javascriptName").item(0).firstChild.nodeValue;
      	var cssName = styleDefs.item(k).getElementsByTagName("cssName").item(0).firstChild.nodeValue;
      	var value  = unescape(templateValues.getElementsByTagName(jsName).item(0).firstChild.nodeValue);
      	objectStyle += cssName+":"+value+";\n";
      }
      
      var selector = "#" + idTxt + " ." + className;
      addCssRule(cStyleSheet,selector,objectStyle);
    }
  }
}

function moveElementsToDoubleBuffer(canvas,doubleBuffer)
{  
  var components = canvas.childNodes;
  
  for (i=components.length-1;i>=0;i--)
  {
    try
    {
      if (components[i].id.indexOf("drag") == 0)
      {
      	components[i].id = "double" + components[i].id;
      	doubleBuffer.appendChild(canvas.removeChild(components[i]));
      }
    }
  	catch (e) {}
  }
}

function createDoubleBuffer(canvas)
{		
  var doubleBuffer = document.createElement("div");
  doubleBuffer.id             = "doubleBuffer";
  doubleBuffer.style.position = "relative";
  doubleBuffer.style.width    = canvas.style.width;
  doubleBuffer.style.height   = canvas.style.height;
  doubleBuffer.style.zIndex   = "1000";

  canvas.style.height = "0px";
  canvas.parentNode.appendChild(doubleBuffer);
  
  return doubleBuffer;
}

function doubleBufferStyleSheet(cStyleSheet)
{	
  var sText,cText;
  inserts = Array();
  
  cssRuleSet = getCssRuleSet(cStyleSheet);
  for (var j=0;j<cssRuleSet.length;j++)
  {
    sText = getCssSelector(cssRuleSet[j],"");
    cText = getCssText(cssRuleSet[j],"");
    if (sText.indexOf("#drag") == 0)
    {
      sText = "#double" + sText.substring(1);
      inserts[inserts.length] = Array(sText,cText);
    }
  }
  
  for (var i=0;i<inserts.length;i++)
  {
  	sText = inserts[i][0];
  	cText = inserts[i][1];
  	addCssRule(cStyleSheet,sText,cText);
  }
}

function getCurrentStyleSheet()
{
    var sheetFound = false, sText;
    for (var i in document.styleSheets)
    {
      cssRuleSet = document.styleSheets[i].cssRules;
      if (cssRuleSet == null)
      {
         cssRuleSet = document.styleSheets[i].rules;
      }
    
      for (var j in cssRuleSet)
      {        
        try
        {
          sText = cssRuleSet[j].selectorText;
        }
        catch (e)
        {
          sText = null;
        }
        if (sText != null)
        {
      	  if (sText.indexOf("#drag") == 0)
      	  {
      	    sheetFound = true;
      	    break;
      	  }
        }
      }
    
      if (sheetFound == true)
      {
        break;
      }
    }
    
  return document.styleSheets[i];
}
/** Template processer functions upto here */