



function _doReplace (str, terms) {
    // This is a very inefficient replacement algorithm.
    var result = "";
    var state = 0;
    var j = 0;
    for (var i = 0, n = str.length; i < n; i++) {
        var c = str.charAt(i);
        switch (state) {
        case 0:
            if (c == '<') {
                // Start of HTML tag
                result += c;
                state = 1;
            } else {
                for (j = 0; j < terms.length; j++) {
                    var len = terms[j].length;
                    var lcTerm = terms[j].toLowerCase();
                    var substr = str.substring (i, i+len);
                    if (substr.toLowerCase() == lcTerm) {
                        result += "<span class=\"highlightTerm\">" + substr + "</span>";
                        i += terms[j].length - 1;
                        break;
                    }
                }
                if (j >= terms.length) { // No match found
                    result += c;
                }
            }
            break;

            // States 1, 2 and 3 occur when we are within an HTML tag.
        case 1:
            result += c;
            switch (c) {
            case '>':
                state = 0;
                break;
            
            case '"':
                state = 2;
                break;

            case "'":
                state = 3;
                break;
            }
            break;

        case 2:
            result += c;
            state = (c == '"') ? 1 : 2;
            break;

        case 3:
            result += c;
            state = (c == "'") ? 1 : 3;
            break;

        default:
            alert ("Internal error: invalid state " + state + " at char " + i + " of\n" + str);
            break;
        }
    }
    return result;
}


var COOKIE_NAME = "sfcrmRatedItems";
function _getCookieValue () {
    var cookieString = document.cookie;
    var index = cookieString.indexOf (COOKIE_NAME);
    if (index < 0) return "";
    var index2 = cookieString.indexOf(';', index2);
    if (index2 < 0) index2 = cookieString.length;
    var cookieVal = cookieString.substring (index + COOKIE_NAME.length+1, index2);
    return unescape (cookieVal);
}


function _showRatingDiv (itemId) {
    if (_isAlreadyRated (itemId)) {
        var ratingDiv = document.getElementById ("kbItem_ratingDiv");
        if (ratingDiv) ratingDiv.style.display = "none";
    }
}


function _isAlreadyRated (itemId) {
    var items = _getCookieValue();
    if (items) {
        var ids = items.split (",");
        for (var i = 0; i < ids.length; i++) {
            if (parseInt(ids[i]) == itemId) {
                return true;
            }
        }
    }
    return false;
}


function ratingFormSubmitted (itemId) {
    if (!_isAlreadyRated (itemId)) {
        var val = _getCookieValue();
        val = val && val != "" ? (val + "," + itemId) : itemId;
        var today = new Date();
        var expiration = new Date();
        expiration.setTime (today.getTime() + 3600000*24*365);
        var cookieStr = COOKIE_NAME + "=" + escape(val) + ";expires=" + expiration.toGMTString();
        document.cookie = cookieStr;
    }
    return true;
}


var MAX_RATING = 5;
function showRatingIndicator (nRatingsStr, totalRatingStr) {
    var nRatings = parseInt (nRatingsStr);
    var totalRating = parseInt (totalRatingStr);
    if (isNaN (nRatings) || isNaN (totalRating) || nRatings <= 0) {
        document.write ("None");
    } else {
        var aveRating = totalRating / nRatings;
        var str = "";
        for (var i = 1; i <= MAX_RATING; i++) {
            var spanColor =  (aveRating > i) ? "red" : "#aaaaaa";
            str += "<span style=\"padding-left: 2px;padding-right:2px;font-size: 160%;color:" + spanColor + "\">&#8226;</span>";
        }
        document.write (str);
    }
}


