/* Copyright 2004, Rajiv Shivane. All Rights Reserved. */

/*
 * 
 * Java specific functions used in chroma coding
 * <pre/> elements with class "jsccJAVA"
 * 
 */

supportedLanguages["jsccJAVA"] = new Object();
supportedLanguages["jsccJAVA"].main = jsccJAVA;

var keyWordsRE = createWordSearchRegEx(new Array("package", "import", "class", "void", "interface", "strictfp", "native", "assert", "abstract", "final", "private", "protected", "public", "static", "synchronized", "volatile", "transient", "break", "case", "continue", "default", "do", "else", "for", "if", "instanceof", "new", "return", "switch", "while", "throw", "try", "catch", "extends", "finally", "implements", "throws", "this", "null", "super", "true", "false"));
var primitiveRE = createWordSearchRegEx(new Array("byte", "char", "short", "int", "long", "float", "double", "boolean"));

function markKeywords(text) {
    var text;

    text = text.replace(keyWordsRE, "$1<span class='jsccKeyword'>$2</span>$3");
    text = text.replace(primitiveRE, "$1<span class='jsccPrimitive'>$2</span>$3");

    return text;
}

function matchParens(text) {
    var text;
    var parens = new RegExp ("(\{|\})","mg");
    return text.replace(parens, 
                function (str, p1, p2, offset, s) {
                    if(str=="{")
                        return"<span class='jsccBlockOpen'>{</span><span class='jsccBlockBody'>";
                    else
                        return"</span><span class='jsccBlockClose'>}</span>";
                });
}


function jsccJAVA(curElement){
    var curElement;
    var origText = curElement.innerHTML;
    var ccText = "";
    var lastOffset = 0;

    //Single line comment
    var slcREStr = "//.*"; 
    //String literal
    var stringREStr ="\"(?:(?:\\\\.)|(?:[^\"\r\n]))*\"";
    //Character literal
    var charREStr ="'(?:(?:\\\\.)|(?:[^'\r\n]))'"; //TODO: unicode characters need to be taken care of
    //Multiline comment
    var mlcREStr = "/\\*(?:.|[\\n\\r])*?\\*/";


    //var slcRE = new RegExp ("("+slcREStr+")","img");
    var stringRE = new RegExp ("("+stringREStr+")","img");
    var charRE = new RegExp ("("+charREStr+")","img");
    //var mlcRE = new RegExp ("("+mlcREStr+")","img");

    //(single-line-comment|string-literal|multi-line-comment)
    var myRE = new RegExp ("((?:"+slcREStr+")|(:?"+stringREStr+")|(?:"+mlcREStr+")|(?:"+charREStr+"))","img");
    
    origText.replace(myRE, 
            function (str, p1, p2, offset, s) {
                var tmp=s.substring(lastOffset, offset);
                tmp=makeHtmlSafe(tmp);
                tmp=markKeywords(tmp);
                tmp=matchParens(tmp);
                if((str.search(stringRE)==0) || (str.search(charRE)==0))
                    ccText+=tmp+"<span class='jsccLiteral'>"+makeHtmlSafe(str)+"</span>";
                else
                    ccText+=tmp+"<span class='jsccComment'>"+makeHtmlSafe(str)+"</span>";
                lastOffset=offset+str.length;
                return str;
            });
    if(lastOffset<origText.length){
        var tmp=origText.substring(lastOffset, origText.length);
        tmp=makeHtmlSafe(tmp);
        tmp=markKeywords(tmp);
        tmp=matchParens(tmp);
        ccText+=tmp;
    }
    curElement.innerHTML = ccText;
    var spans = curElement.getElementsByTagName("span");
    registerBlockClickListeners(spans);     
}
