var d_ = document;
var w_ = window;
var t_;
var id=0;
/* Dummy function for bypassing errors when function getElementById doesn't exist */
//if (!d_.getElementById) d_.getElementById = function() { return null; }

/******************************************************************************\

 Common.js

  Description:    Common functions for various purposes

  Functions:      - AddEvent(obj,evType,fn)

  Date:           2005-03-10
  Company:        InterShift
  Author:         Tom Erwich

  Version:      
  Date:        
  Author:        
  Changed        

\******************************************************************************/
function addEvent(obj, evType, fn){
	if(obj.addEventListener){
		obj.addEventListener(evType, fn, false); 
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent('on'+evType, fn);
		return r;
	} else {
		return false;
	}
}


/******************************************************************************\

  Function GetWindowHeight()

  Description:    Retrieves the height of the client's browser window
  Parameters:     none
  Returns:        number (windowHeight)
  Uses function:  none

  Date:           2005-03-10
  Author:         Tom Erwich

\******************************************************************************/
function GetWindowHeight() {
  var windowHeight=0;
  if (typeof(w_.innerHeight)=='number') {
    windowHeight=w_.innerHeight;
  } else {
    if (d_.documentElement&&
      d_.documentElement.clientHeight) {
        windowHeight=
          d_.documentElement.clientHeight;
    } else {
      if (d_.body&&d_.body.clientHeight) {
        windowHeight=d_.body.clientHeight;
      }
    }
  }
  return windowHeight;
}


/******************************************************************************\

  Function GetWindowWidth()

  Description:    Retrieves the width of the client's browser window
  Parameters:     none
  Returns:        number (windowWidth)
  Uses function:  none

  Date:           2005-03-10
  Author:         Tom Erwich

\******************************************************************************/
function GetWindowWidth() {
  var windowWidth=0;
  if (typeof(w_.innerWidth)=='number') {
    windowWidth=w_.innerWidth;
  } else {
    if (d_.documentElement&&
      d_.documentElement.clientWidth) {
        windowWidth=d_.documentElement.clientWidth;
    } else {
      if (d_.body&&d_.body.clientWidth) {
        windowWidth=d_.body.clientWidth;
      }
    }
  }
  return windowWidth;
}


/******************************************************************************\

  Function SetCenter()

  Description:    Sets the given element in center of parent element
  Parameters:     - ElementId (String): Element to center
  Returns:        nothing
  Uses functions: - GetWindowWidth
                  - GetWindowHeight

  Date:           2005-03-10
  Author:         Tom Erwich
  
\******************************************************************************/
function SetCenter(ElementId) {
  if (d_.getElementById) {
    var windowHeight=GetWindowHeight();
    var windowWidth  =GetWindowWidth();
    if (windowHeight>0 && windowWidth>0) {
      var is = d_.getElementById(ElementId);
      var isH = is.offsetHeight;
      var isW = is.offsetWidth;
      is.style.position  = 'relative';
      is.style.top    = (windowHeight/2 - isH) + 'px';
      is.style.left    = (windowWidth/2 - isW/2) + 'px';
    }
  }
}


/******************************************************************************\

  Function hasClass()

  Description:    Checks if an object has a class and returns the class name
  Parameters:     - obj (object):  object
  Returns:        String|false
  Uses functions:    

  Date:           2005-03-10
  Author:         Tom Erwich
  
\******************************************************************************/
function hasClass(obj) {
	var result = false;
	if (obj.getAttributeNode("class") != null) {
		result = obj.getAttributeNode("class").value;
	}
	return result;
}   

/******************************************************************************\

  Function getArrayElements()

  Description:    Returns an array of given elements
  Parameters:     - arrEl (Array) : array of elements to return
  Returns:        Array
  Uses functions:    

  Date:           2005-03-10
  Author:         Tom Erwich
  
\******************************************************************************/
function getArrayElements(arrEl) {
  if(!d_.getElementsByTagName) return;
  var rtn = Array();
  for(var x = 0; x<arrEl.length;x++) {
    var flds  = d_.getElementsByTagName(arrEl[x]);
    for(var y=0;y<flds.length;y++) {
      var myfld = flds[y];
      rtn.push(myfld);
    }
  }
  return rtn;
}   

/******************************************************************************\

  Function changeHeight()

  Description:    Changes the height in steps of 3 smaller of bigger, with a
                  timeout of 15 milliseconds
  Parameters:     - fldId:  id of element to change the height
                  - val:    current value to change the height to
                  - newVal: max or min height to change the height to
                  - grow:   true|false to grow or to fade
  Returns:        Array
  Uses functions:    

  Date:           2005-03-10
  Author:         Tom Erwich
  
\******************************************************************************/
function changeHeight(fldId,val,newVal,grow) {
  var fld = document.getElementById(fldId);
  
  clearTimeout(t_);
  if(!fld) alert('fld kan niet gevonden worden');
  if(grow) {
    if(val+3>newVal) {
      fld.style.height  = (newVal) +'px';
    } else {
      fld.style.height  = (val+3) +'px';
      t_ = setTimeout('changeHeight(\''+ fldId +'\','+ (val+3) +','+ newVal +','+ grow +')',15);
    }
  } else {
    if(val-3 <= newVal) {
      fld.style.height  = (newVal) +'px';
    } else {
      fld.style.height  = (val-3) +'px';
      t_ = setTimeout('changeHeight(\''+ fldId +'\','+ (val-3) +','+ newVal +','+ grow +')',15);
    }
  }
}

function generateUniqueId() {
  return  "vfldId"+ id++;
}




var nw;


/******************************************************************************\

  Function SetCenter()

  Description:    Sets the given element in center of the screen
  Parameters:      - ElementId (String): Element to center
  Returns:      nothing
  Uses functions:    - GetWindowWidth
            - GetWindowHeight

  Date:        2005-03-10
  Author:        Tom Erwich
  
\******************************************************************************/
function mnw(url,w,h) {
	w		= (w == null)?500:w;
	h		= (h == null)?400:h;
	var wl	= (screen.width-w)/2;
	var wt	= (screen.height-h)/2;

	if((!nw)||(nw.closed)) {
		nw	= window.open(url,"popup","width="+ w +",height="+ h +",left="+ wl +",top="+ wt +",resizable=yes,toolbar=no,status=no,statusbar=no,menubar=no,copyhistory=no,scrollbars=auto,location=no");
		if(!nw.opener) {
			nw.opener	= window;
		}
		nw.focus();
	} else {
		nw.location	= 'about:blank';
		nw.location	= url;
		nw.resizeTo(w,h);
		nw.moveTo(wl,wt);
		nw.focus();
	}
}


/******************************************************************************\

  Function SetCenter()

  Description:    Sets the given element in center of the screen
  Parameters:      - ElementId (String): Element to center
  Returns:      nothing
  Uses functions:    - GetWindowWidth
            - GetWindowHeight

  Date:        2005-03-10
  Author:        Tom Erwich
  
\******************************************************************************/
function hide(aLyr) {
  var lyr = d_.getElementById(aLyr);
  if(!lyr) { return; }

  if(!lyr.stickIt) {
	  clearTimeout(timer);
	  timer = setTimeout("hideLayer('"+ aLyr +"')",200);
  }
}

function stick(lyrid) {
  var lyr = d_.getElementById(lyrid);
  if(!lyr) { return; }
  if(lyr.stickIt == true) {
    lyr.stickIt = false;
  } else {
    lyr.stickIt = true;
  }
}

/******************************************************************************\

  Function SetCenter()

  Description:    Sets the given element in center of the screen
  Parameters:      - ElementId (String): Element to center
  Returns:      nothing
  Uses functions:    - GetWindowWidth
            - GetWindowHeight

  Date:        2005-03-10
  Author:        Tom Erwich
  
\******************************************************************************/
function alt(lyr,text,e) {
	var x,y;
	var div	= d_.getElementById(lyr);
	clearTimeout(timer);

	if(!div || !div.style)	{ return; }
	if(!e)		{ e = window.event; }
	x			= 100;
	y			= 100;
	if(e.pageX && e.pageY) {
		x		= e.pageX;
		y		= e.pageY;
	} else if(e.clientX && e.clientY) {
		x		= e.clientX + d_.body.scrollLeft;
		y		= e.clientY + d_.body.scrollTop;
	}
	div.innerHTML = text;
	div.style.top	= y +'px';
	div.style.left	= x +'px';
  
	timer = setTimeout("showLayer('"+ lyr +"')",300);

}


/******************************************************************************\

  Function SetCenter()

  Description:    Sets the given element in center of the screen
  Parameters:      - ElementId (String): Element to center
  Returns:      nothing
  Uses functions:    - GetWindowWidth
            - GetWindowHeight

  Date:        2005-03-10
  Author:        Tom Erwich
  
\******************************************************************************/
function hideLayer(aLyr) {
	var div	= d_.getElementById(aLyr);

	if(!div || !div.style) { return; }
	clearTimeout(timer);
	div.style.visibility	= 'hidden';
	div.style.display	= 'none';
}


/******************************************************************************\

  Function SetCenter()

  Description:    Sets the given element in center of the screen
  Parameters:      - ElementId (String): Element to center
  Returns:      nothing
  Uses functions:    - GetWindowWidth
            - GetWindowHeight

  Date:        2005-03-10
  Author:        Tom Erwich
  
\******************************************************************************/
function showLayer(lyr) {
	
	var div = d_.getElementById(lyr);

	if(!div) { return; }

	div.style.visibility = 'visible';
	div.style.display	= 'block';
}


/******************************************************************************\

  Function SetCenter()

  Description:    Sets the given element in center of the screen
  Parameters:      - ElementId (String): Element to center
  Returns:      nothing
  Uses functions:    - GetWindowWidth
            - GetWindowHeight

  Date:        2005-03-10
  Author:        Tom Erwich
  
\******************************************************************************/
function showhide(lyr) {
	var div = d_.getElementById(lyr);

	if(!div) { return; }
	if(!div.style.visibility || div.style.visibility == 'hidden') {
		showLayer(lyr);
	} else {
		hideLayer(lyr);
	}
}





function getParent(el, pTagName) {
  if (el == null) return null;
  else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
    return el;
  else
    return getParent(el.parentNode, pTagName);
}



/******************************************************************************/



  

/******************************************************************************/
function vtx_highlight(fld,val) {
  var overColor = (val!="yes"||val!="no")?val:'#ffa526';
  if (!fld||!fld.tagName) return;
  
  switch(fld.tagName) {
    case 'TABLE':
      var tbodies = fld.getElementsByTagName("tbody");
      for(var h=0;h<tbodies.length;h++) {
        var trs = tbodies[h].getElementsByTagName("tr");
        for(var i=0;i<trs.length;i++) {
          var mytr  = trs[i];
          mytr.onmouseover  = function(evt) {
            this.oldbackground  = this.style.backgroundColor;
            this.style.backgroundColor = overColor;
            var tds = this.getElementsByTagName("td");
            for(var x=0;x<tds.length;x++) {
              mytd  = tds[x];
              mytd.oldbackground = mytd.style.backgroundColor;
              mytd.style.backgroundColor = '';
            }
          }

          mytr.onmouseout = function(evt) {
            this.style.backgroundColor=this.oldbackground;
            var tds = this.getElementsByTagName("td");
            for(var x=0;x<tds.length;x++) {
              mytd  = tds[x];
              mytd.style.backgroundColor = mytd.oldbackground;
            }
          }
        }
      }
      break;
  }
}
/******************************************************************************/
var SORT_COLUMN_INDEX;
function sortable(table) {var funcs;if(table.rows && table.rows.length > 0) {var firstRow  = table.rows[0];}if(!firstRow) return;for(var i=0;i<firstRow.cells.length;i++) {var cell  = firstRow.cells[i];var txt   = ts_getInnerText(cell);if(cell.getAttribute("nosort")=="nosort") {} else {if(table.getAttribute("fstripe")) {func = "fstripe('"+ table.id +"');";} else {funcs = "";}cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this);'+ funcs +';return false;">'+ txt +'</a>';}}}
function ts_getInnerText(el){if (typeof el == "string" || typeof el == "undefined"){s1 = new String(el);el = s1.replace(/,/g,"");return el;};if (el.innerText) {s1 = new String(el.innerText);el = s1.replace(/,/g,"");return el;}var str = "";var cs = el.childNodes;var l = cs.length;for (var i = 0; i < l; i++) {switch (cs[i].nodeType) {case 1:str += ts_getInnerText(cs[i]);break;case 3:str += cs[i].nodeValue;break;}}s1 = new String(str);el = s1.replace(/,/g,"");return el;}
function ts_resortTable(lnk) {var td = lnk.parentNode;var column = td.cellIndex;var table = getParent(td,'TABLE');if (table.rows.length <= 1) return;var itm = ts_getInnerText(table.rows[1].cells[column]);var s1 = new String(itm);itm = s1.replace(/,/g,"");var sortfn = ts_sort_caseinsensitive;if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn = ts_sort_date;if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = ts_sort_date;if (itm.match(/^[£$€]/)) sortfn = ts_sort_currency;if (itm.match(/^[\d\.]+$/)) sortfn = ts_sort_numeric;SORT_COLUMN_INDEX = column;var firstRow = new Array();var newRows = new Array();var lngth = table.rows[0].length;for (var i=0;i<lngth;i++) { firstRow[i] = table.rows[0][i]; }for (var j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }newRows.sort(sortfn);if(lnk.getAttribute("sortdir") && lnk.getAttribute("sortdir") == 'down') {newRows.reverse();lnk.setAttribute('sortdir','up');} else {lnk.setAttribute('sortdir','down');}for (i=0;i<newRows.length;i++) {if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) table.tBodies[0].appendChild(newRows[i]);}for (i=0;i<newRows.length;i++) {if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) table.tBodies[0].appendChild(newRows[i]);}}
function ts_sort_date(a,b) {var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);var dt1, dt2, yr;if (aa.length == 10) {dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);} else {yr = aa.substr(6,2);if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }dt1 = yr+aa.substr(3,2)+aa.substr(0,2);}if (bb.length == 10) {dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);} else {yr = bb.substr(6,2);if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }dt2 = yr+bb.substr(3,2)+bb.substr(0,2);}if (dt1==dt2) return 0;if (dt1<dt2) return -1;return 1;}
function ts_sort_currency(a,b) {var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');return parseFloat(aa) - parseFloat(bb);}
function ts_sort_numeric(a,b){var aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));var bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));if (isNaN(aa)) aa = 0;if (isNaN(bb)) bb = 0;return aa-bb;}
function ts_sort_caseinsensitive(a,b){var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();var s1 = new String(aa);var s2 = new String(bb);aa = s1.replace(/,/g,"");bb = s2.replace(/,/g,"");if (!isNaN(aa) && !isNaN(bb)) {return aa-bb;}if (aa==bb) return 0;if (aa<bb) return -1;return 1;}
function ts_sort_default(a,b){var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);if (aa==bb) return 0;if (aa<bb) return -1;return 1;}


/******************************************************************************/
function vtx_init() {
  var fnc;
  if(!d_.getElementsByTagName) return;
  fnc       = [
    Array("stripe","vtx_stripe(thisFld,attrVal)",Array("table","ul","ol")),
    Array("fstripe","vtx_stripe(thisFld,attrVal,true)",Array("table","ul","ol")),
    Array("sortable","sortable(thisFld)",Array("table")),
    Array("highlight","vtx_highlight(thisFld,attrVal)",Array("table")),
    Array("slide","slide(thisFld,attrVal)",Array("div"))
  ];
  for(var x=0;x<fnc.length;x++) {
    var flds  = getArrayElements(fnc[x][2]);
    for(var y=0;y<flds.length;y++) {
      thisFld = flds[y];
      if(thisFld.getAttributeNode("v:"+ fnc[x][0])) {
        attrVal = thisFld.getAttribute("v:"+ fnc[x][0]);
        eval(fnc[x][1]);
      }
    }
  }

  els   = [
    Array("navbox","navbox(thisFld)",Array("navbox","v:navbox")),
    Array("rooster","rooster(thisFld)",Array("rooster","v:rooster")),
    Array("panelset","panelset(thisFld)",Array("panelset","v:panelset"))
  ];

  for(x=0;x<els.length;x++) {
    var flds  = getArrayElements(els[x][2]);
    for(y=0;y<flds.length;y++) {
      thisFld = flds[y];
      eval(els[x][1]);
    }
  }
}

function vtx_stripe(fld,val) {
	var even		= false;
  var force     = arguments[2] ? arguments[2] : false;
	var oddColor	= (fld.getAttributeNode("v:color1"))?fld.getAttribute("v:color1"):"#ffeebb";
	var evenColor	= (fld.getAttributeNode("v:color2"))?fld.getAttribute("v:color2"):"#fff";
  if(!fld || !fld.tagName) return;

  switch(fld.tagName) {
    case 'TABLE':
      var tbodies = fld.getElementsByTagName("tbody");
        h=0;
        var trs = tbodies[h].getElementsByTagName("tr");
        for (var i = 0; i < trs.length; i++) {
          if (! hasClass(trs[i]) && ! trs[i].style.backgroundColor) {
            var tds = trs[i].getElementsByTagName("td");
            for (var j = 0; j < tds.length; j++) {
              var mytd = tds[j];
              if (force || (! hasClass(mytd) &&	! mytd.style.backgroundColor)) {
                mytd.style.backgroundColor = even ? evenColor : oddColor;
              }
              if(val=="ver") even = !even;
				    }
			    }
		      if(val=="hor"||val=="stripe"||val=="fstripe")even =  ! even;
		    }
	    
      break;
    case 'UL':
    case 'OL':
      var lis = fld.getElementsByTagName("li");
      for(var k = 0;k <lis.length;k++) {
        var myli = lis[k];
        if(force || (!hasClass(myli) && !myli.style.backgroundColor)) {
          myli.style.backgroundColor = even?evenColor:oddColor;
        }
        even = !even;
      }
      break;
  }
}

function panelset(fld) {}
    
function rooster(fld) {
  var maand = fld.getAttribute("v:maand");
  var jaar  = fld.getAttribute("v:jaar");
  var afdeling  = fld.getAttribute("v:afdeling")

  var prnt        = fld.parentNode;
  var header      = d_.createElement('h2');
  var headertext  = d_.createTextNode(afdeling);
  header.appendChild(headertext);
  prnt.insertBefore(header,fld);
  var table       = d_.createElement('table');
  var thead       = d_.createElement('thead');
  var tr          = d_.createElement('tr');
  var td          = d_.createElement('td');
  td.appendChild(d_.createTextNode('Naam'));
  for(var x=1;x<DaysPerMonth(maand,jaar);x++) {
    td            = d_.createElement('td');
    td.appendChild(d_.createTextNode(x));
    tr.appendChild(td);
  }
  thead.appendChild(tr);
  table.appendChild(thead);
  prnt.insertBefore(table,fld);

  var medewerkers = fld.childNodes;

  for(var y=0;y<medewerkers.length;y++) {
    switch(medewerkers[y].tagName) {
      case 'medewerker':
      case 'V:MEDEWERKER':
        alert(medewerkers[y].tagName);
    }
  }



}

function DaysPerMonth(m,y) {
  var days  = Array(31,28,31,30,31,30,31,31,30,31,30,31);
  
  if(LeapYear(y)) {
    days[1] = 29;
  }
  return days[m-1];
}

function LeapYear(year) {
    if ((year/4)   != Math.floor(year/4))   return false;
    if ((year/100) != Math.floor(year/100)) return true;
    if ((year/400) != Math.floor(year/400)) return false;
    return true;
}
function navbox(fld) {
  var tekst   = fld.innerHTML;
  var uid     = generateUniqueId();

  var navbox  = d_.createElement('div');
  navbox.setAttribute('id',uid);
  //navbox.id   = uid;
  navbox.setAttribute('class','navbox');
  navbox.className  = 'navbox';
  navbox.style.width= (fld.getAttribute("v:width"))?fld.getAttribute("v:width"):'213px';
  navbox.navset     = (fld.getAttribute("v:navset"))?fld.getAttribute("v:navset"):'';

  var navttl  = d_.createElement('div');
  uid         = generateUniqueId();
  navttl.setAttribute('id',uid);
  //navttl.id   = ''+ uid;
  navttl.setAttribute('class','navbox-title');
  navttl.className  = 'navbox-title';
  navttl.style.width  = navbox.style.width;
  navttl.innerHTML  = (fld.getAttribute("v:title"))?fld.getAttribute("v:title"):'&nbsp;';
  navbox.appendChild(navttl);

  var navbody = d_.createElement('div');
  uid         = generateUniqueId();
  navbody.setAttribute('id',uid);
  //navbody.id   = uid;
  navbody.setAttribute('class','navbox-body');
  navbody.className  = 'navbox-body';
  navbody.style.width= navbox.style.width;
  navbody.innerHTML  = fld.innerHTML;
  navbox.appendChild(navbody);
  
  var parent            = fld.parentNode;
  parent.insertBefore(navbox,fld);
  parent.removeChild(fld);
 
  navbox.style.overflow = 'hidden';
  navbox.oldClientHeight= navbox.clientHeight;
  navbox.setAttribute('oldClientHeight',navbox.clientHeight);
  navbox.style.height   = navttl.clientHeight +'px';
  navttl.hidden         = true;
    
  
  
  //add action on onclick function
  navttl.onclick         = function(evt,navbox) {
    if(this.hidden) {
      changeHeight(this.parentNode.id,this.parentNode.clientHeight,this.parentNode.oldClientHeight,true);
      this.style.background = 'transparent url(img/navbox/navttlOpen.gif) no-repeat';

    } else {
      changeHeight(this.parentNode.id,this.parentNode.clientHeight,this.clientHeight,false);
      this.style.background = 'transparent url(img/navbox/navttlClose.gif) no-repeat';
    }
    this.hidden = !this.hidden;
  }

  navbody.ondrag = function(evt) {}
}

addEvent(window,"load",vtx_init);
