// jspwiki.js
//
// 001. Table Of Contents show/hide   DF/Mar 2004
// 002. Highlight Search target
// 003. Collapsable list items or menus  DF/Apr 2004
// 004. zebra-table DF/May 2004
// 005. enableTopMenu  DF / May 2004
// 006. Increase/Decrease size of Textarea in EditContent.jsp  DF / May 2004
// 007. Remember 10 most recent search topics DF / May 2004
// 008. GraphBar on the findpage DF / May 2004
// 009. Edit Find and Replace DF / Jun 2004
// 010. SkinSeletor DF / May 2004
// 011. Tree Box / December 2004 - Val
// 012. Tree / Januar 2005 - Val
// 013. Transparent Pop-up/ November 2005 - Val


// 002 Highlight Search target
//
// http://www.kryogenix.org/code/browser/searchhi/
// Modified 20021006 to fix query string parsing and add case insensitivity
// Modified 20030227 by sgala@hisitech.com to skip words with "-" and cut %2B (+) preceding pages

function highlightWord(node,word)
{
    // Iterate into this nodes childNodes
    if (node.hasChildNodes)
    {
        var hi_cn;
        for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++)
        {
            highlightWord(node.childNodes[hi_cn],word);
        }
    }

    // And do this node itself
    if (node.nodeType == 3)
    { // text node
        tempNodeVal = node.nodeValue.toLowerCase();
        tempWordVal = word.toLowerCase();
        if (tempNodeVal.indexOf(tempWordVal) != -1)
        {
            pn = node.parentNode;
            if (pn.className != "searchword")
            {
                // word has not already been highlighted!
                nv = node.nodeValue;
                ni = tempNodeVal.indexOf(tempWordVal);
                // Create a load of replacement nodes
                before = document.createTextNode(nv.substr(0,ni));
                docWordVal = nv.substr(ni,word.length);
                //alert( "Found: " + docWordVal );
                after = document.createTextNode(nv.substr(ni+word.length));
                hiwordtext = document.createTextNode(docWordVal);
                hiword = document.createElement("span");
                hiword.className = "searchword";
                hiword.appendChild(hiwordtext);
                pn.insertBefore(before,node);
                pn.insertBefore(hiword,node);
                pn.insertBefore(after,node);
                pn.removeChild(node);
            }
        }
    }
}


function googleSearchHighlight()
{
    if (!document.createElement) return;
    ref = document.referrer; //or URL for highlighting in place
    if (ref.indexOf('?') == -1) return;
    qs = ref.substr(ref.indexOf('?')+1);
    qsa = qs.split('&');
    for (i=0;i<qsa.length;i++)
    {
        qsip = qsa[i].split('=');
        if (qsip.length == 1) continue;

        // q= for Google, p= for Yahoo
        // query= for JSPWiki

        if (qsip[0] == 'query' || qsip[0] == 'q')
        {
            words = qsip[1].replace(/%2B/g,'');
            words = words.replace(/-\S+\s/g,'');
            words = unescape(words.replace(/\+/g,' ')).split(/\s+/);
            for (w=0;w<words.length;w++) {
                highlightWord(document.getElementsByTagName("body")[0],words[w]);
            }
        }
    }
}

// 003. Collapsable list items or menus  DF/Apr 2004
//
// Convert blocks with %%collapse to dynamic collapsable lists
// Remember collapse status in a coockie
//
var clpsCookie    = null;
var previousLI    = null;

function Cookie(name)
{
  this.name   = name;
  this.pos    = clpsCookie.length;
  this.cookie = "";
  this.index  = 0;

  var re = new RegExp( "clps" + name + "=([-+e]*)\." );
  if ( re.exec(document.cookie) )  this.cookie = RegExp.$1;

  this.isNew = ( this.cookie.length == 0) ;
}


function putCOOKIE(name,value)
{
  document.cookie = "clps" + name + "=" + value + "." ;
}


function toggleLI(id)
{
  var re = /clps(\d+)\.(\d+)/;          if (!re.exec(id)) return;
  var cookie = clpsCookie[RegExp.$1];   if (!cookie) return;

  var i = RegExp.$2 ;
  var s = cookie.cookie ;
  var c = s.charAt(i-1) ;

  c = hideLI(id, c) ;
  cookie.cookie = s.substring(0,i-1) + c + s.substring(i,s.length) ;
  putCOOKIE(cookie.name, cookie.cookie);
}


function hideLI (id,  hide)
{
  var nodeUL = document.getElementById(id);     if (!nodeUL)  return;
  var nodeA  = document.getElementById("a"+id); if (!nodeA)   return;

  if (hide == '+')
  {
    nodeUL.style.display = "none";
    nodeA.setAttribute ("title", "Click to expand");
    return ('-');
  }
  if (hide == '-')
  {
    nodeUL.style.display = "";
    nodeA.setAttribute ("title", "Click to collapse");
    return('+');
  }
}


// validateCollapse is called after loading the page
// look for a DIV with a %%jspwiki.js (9 matches)collapse marker
function validateCollapse()
{
  if (!document.createElement) return;

  clpsCookie = new Array();

  var re = /\?page=(\w+)/ ;
  var pageName = "";
  if (re.exec(document.location))  pageName = RegExp.$1;

  validateCollapsePage( "jspwiki_leftmenu",       "LeftMenu",       0);
  validateCollapsePage( "jspwiki_leftmenufooter", "LeftMenuFooter", 1);
  validateCollapsePage( "pageContent",    pageName,         2);
}


function validateCollapsePage(pageId, pageName, cookieIndex)
{
  if (pageName == "") return;

  var page = document.getElementById(pageId);
  if (!page) return;

  clpsCookie[cookieIndex] = new Cookie(pageName);

  // find a <div class="collapse"> element
  var divArr = page.getElementsByTagName("div");
  if (! divArr) return;

  for (i=0; i<divArr.length; i++)
  {
    if ( divArr[i].className == "collapse" )
    {
      //alert("collapse found in " + pageId);
      previousLI =  null;
      validateCollapseNode(divArr[i], clpsCookie[cookieIndex]);
    }
  }
}


function validateCollapseNode(node, cookie)
{
  if ( (node.nodeName == "UL") || (node.nodeName == "OL") )
  {
    var hide = validateLI('ULOL',cookie);
    var id   = "clps" + cookie.pos + "." + cookie.index;

    if (previousLI)
    {
      var nodeAnchor = document.createElement("a");
      nodeAnchor.setAttribute ("id", "a"+id);
      nodeAnchor.setAttribute ("href", "javascript:toggleLI('" + id +  "')" );
      nodeAnchor.className = "clpsBullet";
      nodeAnchor.innerHTML = "&raquo;" ;

      previousLI.className = "clpsLI";

      if (previousLI.hasChildNodes)
            { previousLI.insertBefore(nodeAnchor, previousLI.childNodes[0]); }
      else  { previousLI.appendChild(nodeAnchor);                            }

      node.setAttribute ("id", id);
      if (hide == '-')  hideLI(id,'+');

      previousLI = null;
    }
  }

  if ( node.nodeName == "LI")  previousLI = node;

  if (node.hasChildNodes)
  {
    for (var i=0; i<node.childNodes.length; i++)
    {
      validateCollapseNode(node.childNodes[i],cookie);
    }
  }

  if ( (node.nodeName == "UL") || (node.nodeName == "OL"))  // closure of UL OL
  {
    var endULOL = validateLI('eULOL',cookie);
    previousLI = null;
  }

}


// validate LI from page against LI from cookie
// - return expanded '+' or collapsed '-' state for UL and OL
function validateLI(node,cookie)
{
  cookie.index++;
  if (! cookie.isNew)
  {
    var t = cookie.cookie.charAt(cookie.index-1);
    if (node == 'ULOL'  && t == '+') return('+');
    if (node == 'ULOL'  && t == '-') return('-');
    if (node == 'eULOL' && t == 'e') return('e');

    //alert('mismatch between cookie and doc ul|ol -- continue as if new cookie:');
    cookie.cookie=cookie.cookie.substring(0,cookie.index-1);
    cookie.isNew=true;
  }

  // new cookies
  if (node == 'ULOL')  { cookie.cookie+='+'; return('+'); } ;
  if (node == 'eULOL') { cookie.cookie+='e'; return('e'); } ;

}


// 004. Zebra tables  DF / May 2004
// %%zebra-table
//
var zebraCnt ;

// called after loading the page
function validateZebraTable()
{
  if (!document.createElement) return;

  // find a <div class="zebra-table"> element
  var divArr = document.getElementsByTagName("div");
  if (! divArr) return;

  for (var i=0; i<divArr.length; i++)
  {
    if ( divArr[i].className == "zebra-table" )
    {
      zebraCnt = 0;
      validateZebraTableNode(divArr[i]);
    }
  }

}


function validateZebraTableNode(node)
{
  if ( node.nodeName == "TR")
  {
     zebraCnt++;
     if (zebraCnt % 2 == 1) node.className = "odd";
  }

  if (node.hasChildNodes)
  {
    for (var i=0; i<node.childNodes.length; i++)
    {
      validateZebraTableNode(node.childNodes[i]);
    }
  }

}
// 006. Increase/Decrease size of Textarea in EditContent.jsp  DF / May 2004
// Height, width may be negative values.
// doesnt work yet : opera ok, safari nok, ie ok
//
function changeTextAreaSize(height,form)
{
  var textArea = form.text;

  //alert("tst:" + height + " " + textArea.rows+ " ff " + form.action + " rows " + form.rows);
  if (textArea && height != 0 && textArea.rows + height > 10)
  {
    textArea.rows += height;
    if (form.rows) form.rows.value = textArea.rows;
  }
  //alert("tst:" + height + " " + textArea.rows+ " ff "+form.rows);

}


// 007. Remember 10 most recent search topics DF / May 2004
// Build list of recent search topics and store it in a cookie
//
var arrSearches = new Array();

function submitSearch(aForm)
{
  if (arrSearches.length > 9) arrSearches.shift();
  arrSearches.push(aForm.query.value);

  document.cookie = "JSPWikiSearch=" + arrSearches.join("|") + "#end#" ;
}


function buildRecentSearches()
{
  // find <div id="bpRecentSearches" />
  if (!document.createElement) return;
  var node  = document.getElementById("bpRecentSearches");
  if (! node) return;

  if (node.hasChildNodes)
  {
    for (var i=0; i<node.childNodes.length; i++)
    {
      node.removeChild(node.childNodes[i]);
    }
  }

  // read cookie
  arrSearches = new Array();
  var re = new RegExp( "JSPWikiSearch=(.*)#end#" );
  if (re.exec(document.cookie) )
  { if (RegExp.$1 != "")
    arrSearches = RegExp.$1.split("|");
  }

  for (i=0; i<arrSearches.length; i++)
  {
    var text   = document.createTextNode( arrSearches[i]  );
    var anchor = document.createElement( "a" );
    var br     = document.createElement( "br" );
    anchor.className = "bpSearchItem";
    anchor.setAttribute ("href", "javascript:enterSearchItem('"+ arrSearches[i] +"');" );

    anchor.appendChild(text);
    node.appendChild(anchor);
    node.appendChild(br);
  }

    var p     = document.createElement( "p" );
    node.appendChild(p);

  if (arrSearches.length > 0)
  {
    var text   = document.createTextNode( "Clear Recent Searches" );
    var anchor = document.createElement( "a" );
    anchor.setAttribute ("href", "javascript:clearRecentSearches();" );

    anchor.appendChild(text);
    node.appendChild(anchor);
  }
}


function enterSearchItem(item)
{
  document.forms[0].query.value = item;
  document.forms[0].submit();
}


function clearRecentSearches()
{
  document.cookie="JSPWikiSearch=";
  //buildRecentSearches(); /* nok : dropdown doesnt redraw properly */
  history.go(0);
}


// 008. GraphBar on the findpage DF / May 2004
// Generate BARS on the FindPage

var graphBarMinimum    = 0;
var graphBarMaximum    = 60;
var graphBarMultiplier = 1;

function initGraphBar (low,high,maxx)
{
  graphBarMultiplier = maxx / (high-low);
  graphBarMinimum = low;
  graphBarMaximum = high;
}

function graphBar (count)
{
   var s = "<span class=\"graph-bar\">";
   var orig_count = count;
   if (count < graphBarMinimum) count = graphBarMinimum;
   if (count > graphBarMaximum) count = graphBarMaximum;
   var size = ( count - graphBarMinimum) * graphBarMultiplier;
   size = Math.floor(size);
   for (var i=0; i < size ; i++)  { s += "."; }
   s+= "</span>&nbsp;" + orig_count;

   document.write(s);
}


// 009 Edit Find and Replace DF/Jun 2004
//
// See EditContent.jsp and CommentContent.jsp
//
function editReplace(form, dataField)
{
  if (!form) return;
  if (!document.forms["editorForm"]) return;
  if (form.findText.value    =="") return;

  var findText = form.findText.value;
  var replaceText = form.replaceText.value;
  var isRegExp = form.regExp.checked;
  var reGlobal = ((form.global.checked) ? "g" : "") ;
  var reIgnoreCase = ((form.ignoreCase.checked) ? "i" : "") ;
  var data = dataField.value;

  if (! isRegExp) /* escape all special re characters */
  {
    var re = new RegExp( "([\.\*\\\?\+\[\^\$])", "gi");
    findText = findText.replace(re,"\\$1");
  }

  var re = new RegExp(findText, reGlobal+reIgnoreCase);
  if ( ! re.exec(data) )
  {
    alert("No match found!");
    return(true);
  }

  data = data.replace(re,replaceText);

  undoMemory.value = dataField.value;
  var undoButton = document.getElementById("undoHideOrShow");
  undoButton.style.visibility = "visible";
  dataField.value = data;

  return(true);
}

function editReplaceMoreInfo(form)
{
  var info = document.getElementById("FindAndReplaceHelp");
  if (!info) return;
  if (info.style.visibility == "visible")
  {
     info.style.visibility = "hidden";
     info.style.display = "none";
     form.moreInfo.value="More Info";

  } else
  {
     info.style.visibility = "visible";
     info.style.display = "block";
     form.moreInfo.value="Hide Info";
  }
}

function editUndo(form, dataField)
{
  var undoButton = document.getElementById("undoHideOrShow");
  undoButton.style.visibility = "hidden";
  dataField.value = form.undoMemory.value;
  form.undoMemory.value = "";
  return(true);
}


// 010. SkinSelector  DF/May 2004
// The name of the SkinXXX.css is stored in a cookie
// the skin selection was added to the Preferences dropdown
//
function loadSkinSelector()
{
 var skin = document.forms["skinForm"].skinSelector;
 // alert(skin);
//var re = new RegExp( "JspWikiSkin=(.*)#skin#" );
  if (!skin)

  {
	skinValue = "SkinVanilla.css";
	return;
  }

  var skinValue = skin[0].value;

  /* see also cssinclude.js */
  var re = new RegExp( "JspWikiSkin=(.*)#skin#" );
  if ( re.exec(document.cookie) )
  {
	skinValue = RegExp.$1;
	//alert(skinValue);
  }
 // else
 // {
 //       document.cookie = "JspWikiSkin=" + "SkinVanilla.css" + "#skin#";
	//JspWikiSkin = "SkinVanilla" + "#skin#";
	//skinValue = "SkinVanilla.css"
//	return;
//  }

  for (var i=0; i<skin.length; i++)
  {
    if (skin[i].value == skinValue )
    {
      //alert("load "+i);
      skin[i].selected = true;
      document.cookie = "JspWikiSkin=" + skin[i].value + "#skin#" ;
	//alert(skin[i].value);
      return;
    }
  }
}

function skinSelect(skin)
{
  //var skin = document.forms["skinForm"].skinSelector;
  if (! skin)
  {
//	JspWikiSkin= "SkinVanilla.css" + "#skin#" ;
//	document.cookie = "JspWikiSkin=" + "SkinVanilla.css + "#skin#";
	return;
  }

  for (var i=0; i<skin.length; i++)
  {
    if ( skin[i].selected )
    {
      document.cookie = "JspWikiSkin=" + skin[i].value + "#skin#" ;
    }
  }
  location.reload(); /* reload page */
}

// ++++++++++++++++++++++

function putFocus()
{
  if (document.forms.editorForm) document.forms.editorForm.text.focus();

}



