Skip to content
Snippets Groups Projects
quack.js 7.57 KiB
//! Toggling of grid and overlays

function toggleGrid() {
    
    if (document.getElementById('toggle_grid').checked) {
        state = 'block';
    } else {
        state = 'none';
    }
    
    var content = document.getElementsByClassName('gridline');
    for (var i = 0 ; i < content.length ; i++) {
        content[i].style.display = state;
    }
}

function toggleBlown() {
    if (document.getElementById('toggle_blown').checked) {
        opacity = 100;
    } else {
        opacity = 0;
    }
    
    for (var i = 0; i < myDragon.overlays.length; i++) {
        var id = myDragon.overlays[i].id;
        if ( id == 'black' || id == 'white' ) {
            OpenSeadragon.setElementOpacity(id, opacity, false);
        }
    }

    if (document.getElementById('toggle_blown').checked) {
        state = 'block';
    } else {
        state = 'none';
    }
    
    var content = document.getElementsByClassName('whiteoverlay');
    for (var i = 0 ; i < content.length ; i++) {
        if (content[i].style.backgroundImage == '' && state == 'block') {
            content[i].style.backgroundImage = "url('" + whiteoverlayurl + "')";
        }
        content[i].style.display = state;
    }
    var content = document.getElementsByClassName('blackoverlay');
    for (var i = 0 ; i < content.length ; i++) {
        if (content[i].style.backgroundImage == '' && state == 'block') {
            content[i].style.backgroundImage = "url('" + blackoverlayurl + "')";
        }
        content[i].style.display = state;
    }
}

function toggleTextBlock() {
    if (document.getElementById('toggle_textblock').checked) {
        opacity = 100;
    } else {
        opacity = 0;
    }
    
    for (var i = 0; i < myDragon.overlays.length; i++) {
        var id = myDragon.overlays[i].id;
        if ( id == 'black' || id == 'white' ) {
            continue;
        }
        OpenSeadragon.setElementOpacity(id, opacity, false);
    }
}

var ocrs = {};
var nexts = {};
var prevs = {};

// Fill in OCR for blocks with
// ocrs["BLOCK1"] = "MyOCR";
// On the preview page

function addForward(overlay, className) {
    if (!document.getElementById(overlay)) return;
    document.getElementById(overlay).className = document.getElementById(overlay).className + ' ' + className;
    if (overlay in nexts) {
        addForward(nexts[overlay], className);
    }
}
function addBackward(overlay, className) {
    if (!document.getElementById(overlay)) return;
    document.getElementById(overlay).className = document.getElementById(overlay).className + ' ' + className;
    if (overlay in prevs) {
        addBackward(prevs[overlay], className);
    }
}
function removeForward(overlay, className) {
    if (!document.getElementById(overlay)) return;
    document.getElementById(overlay).className = document.getElementById(overlay).className.replace(' ' + className, '');
    if (overlay in nexts) {
        removeForward(nexts[overlay], className);
    }
}
function removeBackward(overlay, className) {
    if (!document.getElementById(overlay)) return;
    document.getElementById(overlay).className = document.getElementById(overlay).className.replace(' ' + className, '');
    if (overlay in prevs) {
        removeBackward(prevs[overlay], className);
    }
}
function inOverlay(overlay) {
    document.getElementById('idbox').innerHTML = 'ID: ' + overlay;
    if (overlay in nexts) {
        document.getElementById('idnextbox').innerHTML = 'IDNEXT: ' + nexts[overlay];
    } else {
        document.getElementById('idnextbox').innerHTML = 'IDNEXT: ';
    }
    
    if (overlay in ocrs) {
        document.getElementById('ocrbox').innerHTML = ocrs[overlay];
    } else {
        document.getElementById('ocrbox').innerHTML = '';
    }
    addForward(overlay, "group");
//    addForward(overlay, "next");
    addBackward(overlay, "group");
    if (overlay in nexts) {
        document.getElementById(nexts[overlay]).className = document.getElementById(nexts[overlay]).className + ' next';
    }
}
function outOverlay(overlay) {
    document.getElementById('ocrbox').innerHTML = '';
    document.getElementById('idnextbox').innerHTML = 'IDNEXT: ';
    document.getElementById('idbox').innerHTML = 'ID: ';

    removeForward(overlay, "group");
    removeForward(overlay, "next");
    removeBackward(overlay, "group");
    removeBackward(overlay, "next");
}

// URL parameter parsing
// http://stackoverflow.com/questions/979975/how-to-get-the-value-from-url-parameter
function getRes() {
    var input = window.location.href;
//    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
//    var regexS = "/[\\?&]" + name + "=([^&#]*)/g";  
//    var regex = new RegExp( regexS );  
    var regex = /[\\?&]box=([^&#]*)/g;  
    var results = [];

    var tokens;
    while (tokens = regex.exec(input)) { 
        results.push(decodeURIComponent(tokens[1]));
//        console.log('Pushing ' + decodeURIComponent(tokens[1]));
    }
    return results;
}


function createDiv(id, className, content) {
    var msgContainer = document.createElement('div');
    msgContainer.id = id;               // No setAttribute required
    msgContainer.className = className; // No setAttribute required, note it's "className" to avoid conflict with JavaScript reserved word
    msgContainer.appendChild(document.createTextNode(content));
    document.body.appendChild(msgContainer);
    return msgContainer;
}

// Helper for addResultBoxes that constructs a single box
// 0.036886,0.740071 0.898778x0.108414 I BYEN MED DE KENDTE
var boxCounter = 0;
function addResultBox(boxData) {
//    console.log('Processing box ' + boxData);
    var parts = boxData.split(' ');
    var x = parseFloat(parts[0].split(',')[0]);
    var y = parseFloat(parts[0].split(',')[1]);
    var w = parseFloat(parts[1].split('x')[0]);
    var h = parseFloat(parts[1].split('x')[1]);
    var content = '';
    for (var i = 2 ; i < parts.length ; i++) {
        if (i > 2) {
            content += ' ';
        }
        content += parts[i];
    }
    console.log('Creating overlay box for x=' + x + ', y=' + y + ', w=' + w + ', h=' + h + ', content=' + content);
    myDragon.drawer.addOverlay(createDiv('searchresult' + boxCounter++, 'searchresultbox', content), new OpenSeadragon.Rect(x, y, w, h), OpenSeadragon.OverlayPlacement.TOP_LEFT, '');
}

// Looks for attributes with the name 'box'. A box contains x,y in relative coordinates,
// width x height i relative coordinates and optional context for the box. Sample:
// 0.036886,0.740071 0.898778x0.108414 I BYEN MED DE KENDTE
function addResultBoxes() {
    var results = getRes();
    document.title = document.title + ' ' + results + ' (length ' + results.length + ')';
    for (var i = 0; i < results.length; i++) {
        addResultBox(results[i]);
    }
}

function setupJS() {
    // TODO: Check if this is an image page and if not, exit immediately

    toggleGrid();
    toggleTextBlock();
    toggleBlown();
    addResultBoxes();

    //! Create a callback for eack overlay with the overlay-ID as argument
    for (var i = 0; i < myDragon.overlays.length; i++) {
        id = myDragon.overlays[i].id;
        shortid = id.split("/").pop();
        if ( id == 'white' || id == 'black' ) {
            continue;
        }

        o = document.getElementById(id);
        o.onmouseover = new Function('inOverlay("' + shortid + '")');
        o.onmouseout = new Function('outOverlay("' + shortid + '")');
    }

    // Try to disable fancy interpolation
    var canvases = document.getElementsByTagName("canvas");
    for(var i = 0; i < canvases.length; i++){
        canvases[i].style.imageRendering = "-moz-crisp-edges";
        canvases[i].getContext.mozImageSmoothingEnabled = false;
    }
}
window.onload=setupJS;