/*
       _____          ______       __
      / __  \___ ___ /_  __/__  __/ /_ / _____ (C) 2007
     / / / / __ '__ \ / // __ \/ / __ \  \  __\
    / /_/ / / / / / // // /_/   / /_/ / __\ \
    \____/_/ /_/ /_//_/ \____/_/\____/ /____/
 
    (C) 2007 all rights reserved by om-soft / oliver metzlaff 
     
    license conform using only for 
    om-soft (oliver metzlaff) and cut360 germany (marc ilgner)
     
*/

//-----------------------------------------------------------------------------
// settings
//-----------------------------------------------------------------------------
var tabtbody_id = 'omTable';

//-----------------------------------------------------------------------------
// languages
//-----------------------------------------------------------------------------
/* declaration and initialisation (default language: german) */
var languages = new Array();
var lang_sort       = "Sortierung";
var lang_sort_asc   = "aufsteigend";
var lang_sort_desc  = "absteigend";
var lang_filter     = "Anzeige";
var lang_filter_all = "Alle";

/* specific languages */
languages[0] = new Object();
languages[0]["lang"]   = "de";
languages[0]["sort"]   = "Sortierung";
languages[0]["asc"]    = "aufsteigend";
languages[0]["desc"]   = "absteigend";
languages[0]["filter"] = "Anzeige";
languages[0]["all"]    = "alle";

languages[1] = new Object();
languages[1]["lang"]   = "en";
languages[1]["sort"]   = "Sort";
languages[1]["asc"]    = "ascending";
languages[1]["desc"]   = "descending";
languages[1]["filter"] = "Show";
languages[1]["all"]    = "all";

/* load a specific language */
function LoadLanguage(lang) {
  for (var i = 0; i < languages.length; i++) {
	if (languages[i]["lang"]==lang) {
      lang_sort       = languages[i]["sort"];
      lang_sort_asc   = languages[i]["asc"];
      lang_sort_desc  = languages[i]["desc"];
      lang_filter     = languages[i]["filter"];
      lang_filter_all = languages[i]["all"];
	}
  }  
}

//-----------------------------------------------------------------------------
// OM Tables
//-----------------------------------------------------------------------------
function initOmTables(lang, sort, filter) {
  var new_a;
  var col;
  var i, j, k, m, x;
  var td_parent_id, td_id;

  /* Language initialisation */
  LoadLanguage(lang);
  
  /* INIT OM Table - Help Functions*/
  function CallSortAsc() {
    sortTable(tabtbody_id,'ascending',this.value[0],this.value[1]);
    return false;
  } 
  function CallSortDesc() {
    sortTable(tabtbody_id,'descending',this.value[0],this.value[1]);
    return false;
  } 
  function CallLineFilter() {
    LineFilter(tabtbody_id,this.value[0],this.value[1]);
    return false;
  } 
  
  function AddMenuP(parent_id, title) {
   	var new_p = document.createElement('p');
    if (IsBrowserIE()) { new_p.setAttribute('className', 'submenu_p')
   	} else { new_p.setAttribute('class', 'submenu_p'); }
  	new_p.innerHTML = title;
    parent_id.appendChild(new_p);
  }

  function AddMenu() {  
    /* create OM Table menu */
    var new_div = document.createElement('div');
    if (IsBrowserIE()) { var col = (m-1);
    } else if (IsBrowserOpera()) { var col = (m-1);
    } else { var col = (parseInt(m / 2)-1); }
    if (IsBrowserIE()) { new_div.setAttribute('className', 'submenu')  //for IE browser
    } else { new_div.setAttribute('class', 'submenu'); } //for other browsers
    new_div.style.display = 'none';
    new_div.style.float = 'left';
    new_div.id = 'om_submenu'+col;
    td_id.appendChild(new_div);
    
    if (sort==true) {
    	var new_p = document.createElement('p');
	    if (IsBrowserIE()) { new_p.setAttribute('className', 'submenu_p_static')  //for IE browser
    	} else { new_p.setAttribute('class', 'submenu_p_static'); } //for other browsers
	    new_p.innerHTML = lang_sort;
	    new_div.appendChild(new_p);
	    
    	new_a = document.createElement('a');
	    new_a.href = '#';
	    new_a.value = new Array(td_id.getAttribute('value'),col+1);
    	new_a.onclick = CallSortAsc;
	    new_div.appendChild(new_a);  
        AddMenuP(new_a,lang_sort_asc);
        
    	new_a = document.createElement('a');
	    new_a.href = '#';
	    new_a.value = new Array(td_id.getAttribute('value'),col+1);
    	new_a.onclick = CallSortDesc;
	    new_div.appendChild(new_a);  
        AddMenuP(new_a,lang_sort_desc);
    }
    
    if (filter==true) {
      var new_p = document.createElement('p');
	  if (IsBrowserIE()) { new_p.setAttribute('className', 'submenu_p_static')  //for IE browser
      } else { new_p.setAttribute('class', 'submenu_p_static'); } //for other browsers
	  new_p.innerHTML = lang_filter;
      new_div.appendChild(new_p);
      new_a = document.createElement('a');
      new_a.href = '#';
      new_a.value = new Array('all',col+1);
      new_a.onclick = CallLineFilter;
      new_div.appendChild(new_a);  
      AddMenuP(new_a,lang_filter_all);	    

      var colArray = new Array();
      var tab_tbody = document.getElementById(tabtbody_id);
  	  for (x = 0; x < tab_tbody.rows.length; x++) {
        colArray[colArray.length] = getElementValue(tab_tbody.rows[x].cells[col+1]);        
        tab_tbody.rows[x].id = 'omtable_tr'+x;
      }
      colArray = DeleteMultipleEntries(colArray, td_id.getAttribute('value'));
  	  for (x = 0; x < colArray.length; x++) {
        new_a = document.createElement('a');
        new_a.href = '#';
	    new_a.value = new Array(colArray[x],col+1);
        new_a.onclick = CallLineFilter;
        new_div.appendChild(new_a);  
        AddMenuP(new_a,colArray[x]);	    
	  }	  
    }   
  }

  function AddOMSubMenu() {
    if (IsBrowserIE()) { 
      var element_id = 'om_submenu'+(m-1);
	  td_id.setAttribute('onmouseover',function anonymous(){document.getElementById(element_id).style.display='block';});
	  td_id.setAttribute('onmouseout',function anonymous(){document.getElementById(element_id).style.display='none';});
    } else { 
      if (IsBrowserOpera()) { var element_id = 'om_submenu'+(m-1);
      } else { var element_id = 'om_submenu'+(parseInt(m / 2)-1); }
      td_id.setAttribute('onmouseover',"document.getElementById('"+element_id+"').style.display='block'");
      td_id.setAttribute('onmouseout',"document.getElementById('"+element_id+"').style.display='none'");
    } 
  }

  /* INIT OM Table */
  if ((sort==true)||(filter==true)) {
	for(i=0;i<document.getElementsByTagName('TBODY').length;i++) {
	  if ((document.getElementsByTagName('TBODY')[i].id==tabtbody_id)&&(document.getElementsByTagName('TBODY')[i].parentNode.nodeName=='TABLE')) {
	    for(j=0;j<document.getElementsByTagName('TBODY')[i].parentNode.childNodes.length;j++) {
		  if (document.getElementsByTagName('TBODY')[i].parentNode.childNodes[j].nodeName=='THEAD') {
		    for(k=0;k<document.getElementsByTagName('TBODY')[i].parentNode.childNodes[j].childNodes.length;k++) {
		      if (document.getElementsByTagName('TBODY')[i].parentNode.childNodes[j].childNodes[k].nodeName=='TR') {		      
		        td_parent_id = document.getElementsByTagName('TBODY')[i].parentNode.childNodes[j].childNodes[k];		
  			    for(m=0;m<document.getElementsByTagName('TBODY')[i].parentNode.childNodes[j].childNodes[k].childNodes.length;m++) {		        
  			      td_id = document.getElementsByTagName('TBODY')[i].parentNode.childNodes[j].childNodes[k].childNodes[m];		
			      if ((td_id.innerHTML!='')&&((td_id.nodeName=='TD')||(td_id.nodeName=='TH'))&&(td_id.getAttribute('value')!=null)) {
					AddOMSubMenu();
					AddMenu();
				  }
				}
			  }
		    }
		  }
	    }
	  }
	}
  } 

}

//-----------------------------------------------------------------------------
// Sort-Function
//-----------------------------------------------------------------------------
if (document.ELEMENT_NODE == null) {
  //browser specifics
  document.ELEMENT_NODE = 1;
  document.TEXT_NODE = 3;
}

function sortTable(id, orientation, type, col) {
  /* parameter-list:
  	 id				id of the tbody
  	 orientation    ascending/descending
  	 type			value (for strings)
  	 				currency (for numbers/currency)
  	 col 			col number
  */
  var tab_tbody = document.getElementById(id);
  var oldDsply = tab_tbody.style.display;
  tab_tbody.style.display = "none";
  
  var tab_tbody_tmp;
  var i, j;
  var minVal, minIdx;
  var testVal;
  var cmp;

  for (i = 0; i < tab_tbody.rows.length - 1; i++) {
    minIdx = i;
    minVal = getElementValue(tab_tbody.rows[i].cells[col]);
    for (j = i + 1; j < tab_tbody.rows.length; j++) {
      testVal = getElementValue(tab_tbody.rows[j].cells[col]);
      cmp = compareValues(minVal, testVal, type);
	  if (orientation=='descending') cmp = -cmp;		
      if (cmp > 0) {
        minIdx = j;
        minVal = testVal;
      }
    }
    if (minIdx > i) {
      tab_tbody_tmp = tab_tbody.removeChild(tab_tbody.rows[minIdx]);
      tab_tbody.insertBefore(tab_tbody_tmp, tab_tbody.rows[i]);
    }
  }
  tab_tbody.style.display = oldDsply;
  return false;
}

function getElementValue(elem) {
  var i;
  var returnstring;

  returnstring = "";
  for (i = 0; i < elem.childNodes.length; i++) {
    if (elem.childNodes[i].nodeType == document.TEXT_NODE)
      returnstring += elem.childNodes[i].nodeValue;
    else if (elem.childNodes[i].nodeType == document.ELEMENT_NODE && elem.childNodes[i].tagName == "BR")
      returnstring += " "
    else
      returnstring += getElementValue(elem.childNodes[i]);
  }
  
  return normalizeString(returnstring);
}

function compareValues(val1, val2, type) {
  var tmpval1, tmpval2;  
  if (type == 'currency') {
  	val1 = val1.replace(/,/g, ".");
  	val2 = val2.replace(/,/g, ".");
	tmpval1 = parseFloat(val1);	tmpval2 = parseFloat(val2);  
  } else {
  	tmpval1 = val1; tmpval2 = val2;
  }
  	
  if (!isNaN(tmpval1) && !isNaN(tmpval2)) {
    val1 = tmpval1; val2 = tmpval2;
  }

  if (val1 == val2) return 0;
  if (val1 > val2) return 1;
  return -1;
}

var whtSpEnds = new RegExp("^\\s*|\\s*$", "g");
var whtSpMult = new RegExp("\\s\\s+", "g");
function normalizeString(s) {
  s = s.replace(whtSpMult, " ");
  s = s.replace(whtSpEnds, "");
  return s;
}


//-----------------------------------------------------------------------------
// Filter-Function
//-----------------------------------------------------------------------------
function LineFilter(id, content, col) {
  /* parameter-list:
  	 id				id of the tbody
  	 content		value to filter 
  	 				("all" for show all table rows)
  	 col 			col number
  */
  var tab_tbody = document.getElementById(id);
  var i, j;
  var actVal;
  var tr_id;
  var unfold;

  if (IsBrowserIE()) { unfold = "block" //for IE browser
  } else { unfold = "table-row" } 		//for other browsers

  for (i = 0; i < tab_tbody.rows.length; i++) {
    actVal = getElementValue(tab_tbody.rows[i].cells[col]);
   	tr_id = tab_tbody.rows[i].cells[col].parentNode.id;   	

    if (content == 'all') {
    	document.getElementById(tr_id).style.display = unfold
    } else if (actVal != content) {
    	document.getElementById(tr_id).style.display = "none"
    } else {
    	document.getElementById(tr_id).style.display = unfold
    } 
  }
  return false; 
}

//-----------------------------------------------------------------------------
// Help-Functions
//-----------------------------------------------------------------------------
function IsBrowserIE() {
  if (navigator.appName=="Microsoft Internet Explorer") { return true
  } else { return false }
}
function IsBrowserOpera() {
  if (navigator.appName=="Opera") { return true
  } else { return false }
}

function DeleteMultipleEntries(a1,value) {
  function Numsort(a, b) {
    return parseFloat(a) - parseFloat(b);
  }

  var a2 = new Array();
  var a3 = new Array();
  for(var i = 0; i < a1.length; i++) {
    if(typeof(a2[a1[i]]) == "undefined") {
      a2[a1[i]] = true;
      a3[a3.length] = a1[i];
    }
  }
  var a4 = new Array();
  for(var i = 0; i < a3.length; i++){a4[a4.length] = a3[i]}

  if (a4.length==a1.length) {
    //if a4 = a1 the filter menu is superfluous
    var a4 = new Array();    
  } else {  
    if (value=='currency') { a4.sort(Numsort);
    } else { a4.sort(); }
  }
  return a4;
}
