/*
# 2000-2008 by Kevag Telekom GmbH (KTK)
#
# Copyright by KTK, Cusanusstr. 7, D-56073 Koblenz, Germany. All rights reserved.
# Copyright in this software is owned by KTK, unless otherwise indicated.
#
# You are not allowed to distribute this software in any form or use it as
# part of another project without asking the owner for permission to use.
*/


onError = null;

//
// Markup configuration
//
var mark_fg  = ['black','black','white','white','white','white','black','black'];
var mark_bg  = ['#99ff99','#ff66ff','#00aa00','#886800','#004699','#990099','#ffff66','#A0FFFF'];
var mark_par = 'mark';
var mark_tag = 'marked';
var mark_msg = 'Suchbegriffe: ';
var mark_del = 'Markierung aufheben.';
var mark_cnt = 0;


//
// Public markup functions
//

function markup(marks){
  if (!document.createDocumentFragment) return false;

  var result = 0;
  var bodynode = document.getElementsByTagName('body')[0];
  for (var c=0, mc=marks.length; c<mc; c++)
    if (marks[c].length){
      var hits = mark_traverse(bodynode, eval('/\\b('+marks[c]+')\\b/i'))
      result += hits;
      if (hits) mark_cnt++;
    };

  return result;
};


function unmark(){
  if (!document.createDocumentFragment) return false;

  var spans = new Array();
  for (var s=document.getElementsByTagName('span'), sc=s.length, c=0; c<sc; c++)
    if (s[c].id == mark_tag)
      spans.push(s[c])

  while (spans.length){
    var span = spans.pop();
    var text = span.firstChild.data;
    if (span.previousSibling && span.previousSibling.nodeType == 3){
      text = span.previousSibling.data + text;
      span.parentNode.removeChild(span.previousSibling);
    };
    if (span.nextSibling && span.nextSibling.nodeType == 3){
      text += span.nextSibling.data;
      span.parentNode.removeChild(span.nextSibling);
    };
    span.parentNode.replaceChild(document.createTextNode(text), span);
  };

  mark_cnt = 0;
  return false;
};



//
// Non public markup functions
//
function showquery(query){
  var bodynode  = document.getElementsByTagName('body')[0];
  var insertpos = bodynode.firstChild;
  while (insertpos.nodeName != 'BR') insertpos = insertpos.nextSibling;
  insertpos = insertpos.nextSibling;
  
  var message = document.createElement('p');
  message.id = mark_tag + 'message';
  message.onclick = hidequery;
  message.style.border = '1px solid #287dc3';
  message.style.cursor = 'pointer';
  message.style.background = '#eeeeee';
  message.style.padding = '5px';
  message.style.paddingLeft = '93px';
  message.style.textIndent = '-88px';
    
  var msgspan = document.createElement('span');
  msgspan.style.fontWeight = 'bold';
  msgspan.appendChild(document.createTextNode(mark_msg));
    
  var delspan = document.createElement('div');
  delspan.style.color = '#287dc3';
  delspan.style.fontSize = 'small';
  delspan.style.textAlign = 'right';
  delspan.appendChild(document.createTextNode(mark_del));
    
  message.appendChild(msgspan);
  message.appendChild(document.createTextNode(query.join('  ')));
  message.appendChild(delspan);

  bodynode.insertBefore(message, insertpos);
};

function hidequery(){
  var message = document.getElementById(mark_tag + 'message');
  message.parentNode.removeChild(message);
  unmark();
};

function mark_traverse(obj, regex){
  var childs = new Array();
  for (var t=obj.childNodes, tc=t.length, c=0; c<tc; c++)
    childs.push(t[c])
  var hits = 0;
  while (childs.length){
    var child = childs.pop(); 
    if (child.nodeType == 1 && child.id != mark_tag) hits += mark_traverse(child, regex);
    if (child.nodeType == 3) hits += mark_colorize(child, regex);
  };
  return hits;
};

function mark_colorize(obj, regex){
  var hits = 0;
  var text = obj.data;
  if (regex.test(text)){
    var fragment = document.createDocumentFragment();
    var chunks = splitter(text, regex);
    var clength  = chunks.length;
    for (var count=0; count<clength; count++){
      var chunk = chunks[count];
      if (chunk.length)
        if (count%2){
          hits++;
          var col = document.createElement('span');
          col.id = mark_tag;
          col.style.color = mark_fg[mark_cnt%mark_fg.length];
          col.style.background = mark_bg[mark_cnt%mark_bg.length];
          col.appendChild(document.createTextNode(chunk));
          fragment.appendChild(col);
        }else{
          fragment.appendChild(document.createTextNode(chunk))
        };
      };
    obj.parentNode.replaceChild(fragment, obj);
  };
  return hits;
};

function splitter(text, regex){
  var result = new Array();
  while (1){
    var pos = text.search(regex);
    if (pos >= 0){
      var match = RegExp.$1;
      result.push(text.substr(0,pos));
      result.push(match);
      text = text.substr(pos+match.length);
    }else{
      if (text.length) result.push(text);
      break;
    };
  };
  return result;
};



function initmarkup(){
  if (document.createDocumentFragment){
    var query = document.location.search;
    var regex = eval('/'+mark_par+'=([^&]+)&?/');
    if (query && regex.test(query)){
      regex.exec(query);
      query = unescape(RegExp.$1).split(';');
      //showquery(query);
      markup(query);
    };
  };
};






