/*
 * $Id: sourceviewer.js,v 0.1 2006/10/09 20:45:17 dankogai Exp dankogai $
 */
function SourceViewer(encoder){
    function encodeEntities(s){
      var result = '';
      for (var i = 0; i < s.length; i++){
        var c = s.charAt(i);
        result += {'<':'&lt;', '>':'&gt;', '&':'&amp;', '"':'&quot;'}[c] || c;
      }
      return result;
    };
    function getElementsByClassName(cls) {
        var result   = [];
        var elems = (document.all || document.getElementsByTagName("*"));
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].className == cls) {
                // result.push(elems[i]); agh! IE5' does not have Array.push!
                result[result.length] = elems[i];
            }
        }
        return result;
    };
    this.encoder = encoder || encodeEntities;
    this.viewerClass = '.sourceviewer';
    this.view = function(e){
        if (e.previousSibling && 
            e.previousSibling.className == this.viewerClass) return;
        var pre = document.createElement('pre');
        pre.className = this.viewerClass;
        pre.innerHTML = this.encoder( e.value );
        e.parentNode.insertBefore(pre, e);
    };
    this.viewClass = function(cls){
        var elems = getElementsByClassName(cls);
        for (var i = 0; i < elems.length; i++){
            this.view(elems[i]);
        }
    };
    this.boot = function(self, cls){
        var loader = function(e){ self.viewClass(cls) };
        if (window.addEventListener){
            window.addEventListener('load', loader, false);
        }else if (window.attachEvent){
            window.attachEvent('onload',  loader);
        }else{
            window.onload = function(e){
                window.status = 
                    'Your browser has neither addEventListener nor attachEvent.'
                    + '  Resorting to window.onload'
                loader(e);
            }
        }
    };
};

