/* Copyright 2004, Rajiv Shivane. All Rights Reserved. */

/*
 * The main java script file which goes over all the 
 * <pre/> tags in the currently loaded html and tries to 
 * chroma code them. 
 * 
 * The language specific functions are separated in 
 * separate files. This file has functions which are
 * useful in implementing the language specific functions.
 */

var supportedLanguages = new Array();

window.onload = 
    function() {
        var preElements = document.getElementsByTagName('pre');

        for (var i = 0; i < preElements.length; i++) {
            var curElement = preElements[i];
            var currentClass = curElement.className;
            if (supportedLanguages[currentClass]) { //We have handler for this lamguage

                supportedLanguages[currentClass].main(curElement);        
                //TODO: Look at ways of dynamically downloading the lang specific javascript

            }
        }
        return true;
    };

//TODO: These should be attributes of the supportedLanguages
var collapsedBlockFiller = "...";
var tabWidth = 4;

function createWordSearchRegEx(keywords) 
{
    return createWordSearchRegEx(keywords, true);
}

function createWordSearchRegEx(keywords, caseSensitive) 
{
    var keywords;
    var caseSensitive;
    
    var flag = caseSensitive?"mg":"img";
    
    var re = "";
    for (var i = 0; i < keywords.length; i++) {
        re+=keywords[i];
        if(i+1<keywords.length){
            re+="|"
        }
    }

    return new RegExp ("([^a-zA-Z0-9_$]|^)("+re+")([^a-zA-Z0-9_$]|$)", flag);
}


function registerBlockClickListeners(spanElements) 
{
    var spanElements;
    for (var i = 0; i < spanElements.length; i++){
        if ( spanElements[i].className == "jsccBlockOpen" || spanElements[i].className == "jsccBlockClose"){
            spanElements[i].onclick = showHideBlock;
        }
    }
}

function showHideBlock()
{
    var blockStart;
    var block;
    
    //locate the blockStart and the block nodes
    if(this.className == "jsccBlockOpen"){
        blockStart = this;
        block = this.nextSibling;
    }else{
        blockStart = this.previousSibling.previousSibling;
        block = this.previousSibling;
    }

    //toggle the display style of the block
    if (block.style.display == "none"){
        block.style.display = "inline";
        blockStart.innerHTML=blockStart.innerHTML.substring(0, blockStart.innerHTML.length-collapsedBlockFiller.length);
    } else {
        block.style.display = "none";
        blockStart.innerHTML+=collapsedBlockFiller;
    }
}

function makeHtmlSafe(text)
{
    var text;
    var htmlSafeText = "";

    for (i = 0; i < text.length; i++){
        switch (text.charAt(i)) 
        {
          case "<":
            htmlSafeText += "&lt;";
            break;
          case ">":
            htmlSafeText += "&gt;";
            break;
          case " ":
            htmlSafeText += "&nbsp;";
            break;
          case "\r":
            break;
          case "\n":
            htmlSafeText += "&nbsp;<br/>";            
            break;
          case "\x09":
            for (var j = 1; j <= tabWidth; j++) {
              htmlSafeText+="&nbsp;";
            }
            break;
          default:
            htmlSafeText += text.charAt(i);
            break;
        }
    }
    return htmlSafeText;
}
