//class html manager
function htmlMng(oSystem){
  //objects
  this.oSystem = oSystem;
  //properties
  this.oHtmlHead = document.getElementsByTagName('head')[0];
  this.oHtmlBody = document.getElementsByTagName('body')[0];
  this.oLayoutContainer;
  this.bMovingBlock;
  this.movingBlock;
  this.dragXoffset;
  this.dragYoffset;
  //methods
  this.createElementWithAttributes = createElementWithAttributes;
  this.addEventSimple = addEventSimple;
  this.loadCss = loadCss;
  this.loadJs = loadJs;
  this.setPageTitle = setPageTitle;
  this.createLayoutContainer = createLayoutContainer;
  this.switchLayoutContainer = switchLayoutContainer;
  this.createBlockContainer = createBlockContainer;
  this.createExtraBlockContainer = createExtraBlockContainer;
  this.createFloatingBlockHeader = createFloatingBlockHeader;
  this.bringFloatingBlockToFront = bringFloatingBlockToFront;
  this.dragFloatingBlock = dragFloatingBlock;
  this.cleanDragging = cleanDragging;
  this.moveHandler = moveHandler;
  this.deleteBlock = deleteBlock;
  this.xslTransform = xslTransform;
  this.createCookie = createCookie;
  this.readCookie = readCookie;
  this.eraseCookie = eraseCookie;
}

function loadCss(cssPath){
  var aAttrs = [['rel','stylesheet'],['type','text/css'],['media','screen'],['href',cssPath]];
  var oLink = this.createElementWithAttributes('link',true,aAttrs);
  this.oHtmlHead.appendChild(oLink);
}

function loadJs(jsPath){
  var aAttrs = [['type','text/javascript'],['src',jsPath]];
  var oScript = this.createElementWithAttributes('script',true,aAttrs);
  this.oHtmlHead.appendChild(oScript);
}
function setPageTitle(title){
  document.title = title;
}

function createLayoutContainer(){
  var aAttrs = [['id','container_layout_'+this.oSystem.oLayoutMng.currentLayout]];
  this.oLayoutContainer = this.createElementWithAttributes('div',false,aAttrs);
  this.oHtmlBody.appendChild(this.oLayoutContainer);
}

function switchLayoutContainer(){
  this.oLayoutContainer.id = 'container_layout_'+this.oSystem.oLayoutMng.currentLayout;
}

function createBlockContainer(blockName){
  var aAttrs = [['id','container_block_'+blockName]];
  var oBlockContainer = this.createElementWithAttributes('div',false,aAttrs);
  this.oLayoutContainer.appendChild(oBlockContainer);
  return oBlockContainer;
}

function createExtraBlockContainer(blockName,bFloating,bAddClose){
  var aAttrs = [['id','container_extra_block_'+blockName]];
  if(bFloating){
    aAttrs.push(['floating','1'],['class','floating_block'],['style','z-index:'+this.oSystem.oBlockMng.extraBlocksMaxZindex]);
  }
  var oBlockContainer = this.createElementWithAttributes('div',false,aAttrs);
  if(bFloating){
    this.addEventSimple(oBlockContainer,'mousedown',function(e){oSystem.focusFloatingBlock(e,blockName)});
    if(bAddClose) oBlockContainer.appendChild(this.createFloatingBlockHeader(blockName));
    var aAttrs = [['class','floating_block_content']];
    var oBlockContent = this.createElementWithAttributes('div',false,aAttrs);
    oBlockContainer.appendChild(oBlockContent); 
    this.oHtmlBody.appendChild(oBlockContainer);
    return oBlockContent;
  }else{
    this.oLayoutContainer.appendChild(oBlockContainer);
    return oBlockContainer;
  }
}

function createFloatingBlockHeader(blockName){
  //aAttrs = [['class','floating_block_header']];
  //var oDiv1 = this.createElementWithAttributes('div',false,aAttrs);
  //if(this.oSystem.browserCode == 'e') oDiv1.innerHTML = '&nbsp;';
  aAttrs = [['id',blockName+'_close'],['class','floating_block_close'],['onclick','oSystem.closeFloatingBlock(\''+blockName+'\')']];
  var oDiv2 = this.createElementWithAttributes('div',false,aAttrs);
  oDiv2.innerHTML = 'X';
  //oDiv1.appendChild(oDiv2);
  return oDiv2;
}
function bringFloatingBlockToFront(blockName){
  var oContainer = document.getElementById('container_extra_block_'+blockName);
  this.oSystem.oBlockMng.extraBlocksMaxZindex++;
  oContainer.style.zIndex = this.oSystem.oBlockMng.extraBlocksMaxZindex;
}

function moveHandler(e){
  if (e == null) { e = window.event } 
  if (e.button<=1 && this.bMovingBlock){
     this.movingBlock.style.left=e.clientX-this.dragXoffset+'px';
     this.movingBlock.style.top=e.clientY-this.dragYoffset+'px';
     return false;
  }
}

function cleanDragging(e) {
  document.onmousemove = null;
  document.onmouseup = null;
  this.movingBlock.style.cursor = 'default';
  this.bMovingBlock = false;
}

function dragFloatingBlock(e,blockName){
  var oBlock = document.getElementById('container_extra_block_'+blockName);
  var hType = '-moz-grabbing';
  if (e == null) { e = window.event; hType = 'move';} 
  var target = e.target != null ? e.target : e.srcElement;
  var sId = new String(target.id);
  if(sId.substr(0,22) != 'container_extra_block_') return false;
  this.movingBlock = target;       
  target.style.cursor = hType;
  this.bMovingBlock = true;
  this.dragXoffset = e.clientX-parseInt(oBlock.offsetLeft);
  this.dragYoffset = e.clientY-parseInt(oBlock.offsetTop);
  document.onmousemove = function(e){oSystem.oHtmlMng.moveHandler(e)};
  document.onmouseup = function(e){oSystem.oHtmlMng.cleanDragging(e)};
  return false;
}

function deleteBlock(blockName,bFloatingBlock){
  var blockId = bFloatingBlock ? 'container_extra_block_'+blockName : 'container_block_'+blockName;
  var oBlock = document.getElementById(blockId);
  oBlock.parentNode.removeChild(oBlock)
}

function xslTransform(blockName,sortFieldName,sortDataType,sortOrder){  
  var myXslProc;
  var finishedHTML = "";
  if(!sortFieldName){
    sortFieldName = this.readCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortFieldName');
    sortDataType = this.readCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortDataType');
    sortOrder = this.readCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortOrder');
  }
  if(this.oSystem.browserCode == 'm') {
    myXslProc = new XSLTProcessor();
    myXslProc.importStylesheet(this.oSystem.oBlockMng[blockName].oXsl);
    myXslProc.setParameter(null,'page',this.oSystem.oPage.name);
    if(sortFieldName){
      myXslProc.setParameter(null,'sortField',sortFieldName);
      var xslDataType;
      if(sortDataType == 'integer') xslDataType = 'number';
      else xslDataType = 'text';
      myXslProc.setParameter(null,'sortDataType',xslDataType);
      myXslProc.setParameter(null, "sortOrder", sortOrder);
      this.createCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortFieldName',sortFieldName,365);
      this.createCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortDataType',sortDataType,365);
      this.createCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortOrder',sortOrder,365);
    }
    var fragment = myXslProc.transformToFragment(this.oSystem.oBlockMng[blockName].oXml,document);
    var tmpBox = document.createElement("div");
    tmpBox.appendChild(fragment);
    finishedHTML = tmpBox.innerHTML;
  } else {
    var xslTemplate = new ActiveXObject("Msxml2.XSLTemplate");
    //xslDoc.async = false;
    xslTemplate.stylesheet = this.oSystem.oBlockMng[blockName].oXsl;
    myXslProc = xslTemplate.createProcessor();
    myXslProc.input = this.oSystem.oBlockMng[blockName].oXml;
    myXslProc.addParameter('page',this.oSystem.oPage.name);
    if(sortFieldName){
      myXslProc.addParameter('sortField', sortFieldName);
      if(sortDataType == 'integer') xslDataType = 'number';
      else xslDataType = 'text';
      myXslProc.addParameter('sortDataType',xslDataType);
      myXslProc.addParameter("sortOrder", sortOrder);
    }
    myXslProc.transform();
    finishedHTML = myXslProc.output;
  }
  if(sortFieldName){
    this.createCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortFieldName',sortFieldName,365);
    this.createCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortDataType',sortDataType,365);
    this.createCookie(this.oSystem.systemName+'_'+blockName+'_'+this.oSystem.oPage.name+'_sortOrder',sortOrder,365);
  }
  return finishedHTML;
}

function createElementWithAttributes(){}
(function(){
  try {
    var el=document.createElement( '<div name="foo">' );
    if( 'DIV'!=el.tagName ||
        'foo'!=el.name ){
      throw 'create element error';
    }
    createElementWithAttributes = function(tag,bEmpty,aAttrs){
      var sAttrs = '';
      var aAttr;
      var attr;
      var value;
      for(i=0;i<aAttrs.length;i++){
        aAttr = aAttrs[i];
        attr = aAttr[0];
        value = aAttr[1];
        sAttrs += attr+'="'+value+'"';
      }
      var sTag = '<'+tag+' '+sAttrs;
      if(bEmpty == true) sTag += ' />';
      else sTag += '></'+tag+'>';
      
      return document.createElement(sTag);
    }
  }catch( e ){
    createElementWithAttributes = function( tag,bEmpty, aAttrs ){
      var el = document.createElement(tag);
      var aAttr;
      var attr;
      var value;
      // setAttribute might be better here ?
      for(i=0;i<aAttrs.length;i++){
        aAttr = aAttrs[i];
        attr = aAttr[0];
        value = aAttr[1];
        el.setAttribute(attr,value);
      }
      
      return el;
    }
  }
})();

/****************************************
* from www.quirksmode.org
*/
function addEventSimple(obj,evt,fn){
	if (obj.addEventListener)
		obj.addEventListener(evt,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent('on'+evt,fn);
}
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}
