Skip to content

Instantly share code, notes, and snippets.

@mjtko
Created January 26, 2012 08:57
Show Gist options
  • Select an option

  • Save mjtko/1681832 to your computer and use it in GitHub Desktop.

Select an option

Save mjtko/1681832 to your computer and use it in GitHub Desktop.

Revisions

  1. mjtko created this gist Jan 26, 2012.
    565 changes: 565 additions & 0 deletions bmi.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,565 @@
    var bmi_htmlEdit = 0;
    var bmi_ie;
    var bmi_ns;
    var bmi_safari;
    var bmi_imageObjSelected;
    var bmi_ffx_op_toolTip = "Shift+R improves the quality of this image. Shift+A improves the quality of all images on this page.";
    var bmi_toolTip = "Shift+R improves the quality of this image. CTRL+F5 reloads the whole page.";
    var bmi_ns_tooltip = "Shift+Reload reloads the whole page.";
    var bmi_toolTipSeperator = " ... ";
    var bmi_concatStr = "bmi_orig_img";
    var bmi_frameNotAllowed;
    var agt = navigator.userAgent.toLowerCase();
    var is_major = parseInt(navigator.appVersion);
    var is_minor = parseFloat(navigator.appVersion);
    var bmi_ns = ((agt.indexOf('mozilla') != -1) && (agt.indexOf('spoofer') == -1) && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera') == -1) && (agt.indexOf('webtv') == -1) && (agt.indexOf('hotjava') == -1));
    var bmi_ns2 = (bmi_ns && (is_major == 2));
    var bmi_ns3 = (bmi_ns && (is_major == 3));
    var bmi_ns4 = (bmi_ns && (is_major == 4));
    var bmi_ns4up = (bmi_ns && (is_major >= 4));
    var bmi_nsonly = (bmi_ns && ((agt.indexOf(";nav") != -1) || (agt.indexOf("; nav") != -1) || (agt.indexOf("Netscape") != -1) || (agt.indexOf("netscape") != -1)));
    var bmi_ns6 = (bmi_ns && (is_major == 5));
    var bmi_ns6up = (bmi_ns && (is_major >= 5));
    var is_gecko = (agt.indexOf('gecko') != -1);
    var bmi_firefox = (agt.indexOf('firefox') != -1);
    var bmi_safari = (agt.indexOf('applewebkit') != -1);
    var bmi_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    var bmi_ie3 = (bmi_ie && (is_major < 4));
    var bmi_ie4 = (bmi_ie && (is_major == 4) && (agt.indexOf("msie 4") != -1));
    var bmi_ie4up = (bmi_ie && (is_major >= 4));
    var bmi_ie5 = (bmi_ie && (is_major == 4) && (agt.indexOf("msie 5.0") != -1));
    var bmi_ie5_5 = (bmi_ie && (is_major == 4) && (agt.indexOf("msie 5.5") != -1));
    var bmi_ie5up = (bmi_ie && !bmi_ie3 && !bmi_ie4);
    var bmi_ie5_5up = (bmi_ie && !bmi_ie3 && !bmi_ie4 && !bmi_ie5);
    var bmi_ie6 = (bmi_ie && (is_major == 4) && (agt.indexOf("msie 6.") != -1));
    var bmi_ie6up = (bmi_ie && !bmi_ie3 && !bmi_ie4 && !bmi_ie5 && !bmi_ie5_5);
    var bmi_opera = (agt.indexOf("opera") != -1);
    var bmi_opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
    var bmi_opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
    var bmi_opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
    var bmi_opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
    var bmi_opera5up = (bmi_opera && !bmi_opera2 && !bmi_opera3 && !bmi_opera4);

    function bmi_checkAccess(win) {
    bmi_frameNotAllowed = 0;
    window.bmioldOnError = window.onerror;
    window.onerror = null;
    try {
    var l = win.location.href;
    } catch (e) {
    bmi_frameNotAllowed = 1;
    }
    if (bmi_frameNotAllowed == 1) {
    window.onerror = window.bmioldOnError;
    return false;
    } else {
    window.onerror = window.bmioldOnError;
    return true;
    }
    }

    function bmi_ImageElement(el) {
    if (!el) return 0;
    var str = new String(el.tagName);
    if (str.match("IMG")) {
    return 1;
    }
    if (str.match("INPUT")) {
    if (el.type && bmi_checkInputType(el.type)) {
    return 1;
    }
    return 0;
    }
    if (str.match("OBJECT")) {
    if (el.type && bmi_checkMIMEType(el.type)) {
    el.bmi_objTag = 1;
    return 1;
    }
    }
    if (str.match("EMBED")) {
    if (el.type && bmi_checkMIMEType(el.type)) {
    return 1;
    }
    }
    if (str.match("AREA") || str.match("A")) {
    var p = el.parentNode;
    if (p && (p.tagName == "MAP") && (p.bmi_imgObj != null)) {
    el.bmi_mapImage = p.bmi_imgObj;
    p.bmi_imgObj.bmi_areaEl = el;
    return 1;
    }
    }
    return 0;
    }

    function bmi_resetTitle(el) {
    if (!el) return;
    if (el.bmi_touched != 1) return;
    el.title = "";
    if (el.bmi_oldTitle) {
    el.title = el.bmi_oldTitle;
    if (el.bmi_oldAlt) {
    el.alt = el.bmi_oldAlt;
    }
    } else if (el.bmi_oldAlt) {
    el.alt = el.bmi_oldAlt;
    if (bmi_ie) el.title = el.alt;
    }
    if (el.bmi_gotOriginal) {
    if (el.bmi_orig_mouseout) {
    el.onmouseout = el.bmi_orig_mouseout;
    }
    }
    }

    function bmi_checkElement(el) {
    var pwindow = null;
    if (el.bmi_gotOriginal) return;
    if (el.bmi_mapImage) {
    if (el.bmi_mapImage.bmi_gotOriginal == 1) {
    el.bmi_gotOriginal = 1;
    if (el.bmi_touched) bmi_resetTitle(el);
    return;
    }
    }
    if (el.bmi_touched != 1) {
    bmi_setElementTitle(el);
    if (el.onmouseout) {
    el.bmi_orig_mouseout = el.onmouseout;
    el.onmouseout = bmi_safeMouseOutEvents;
    } else {
    el.onmouseout = bmi_safeMouseOutEvents;
    }
    } else {
    el.title = el.bmi_title;
    el.alt = el.bmi_alt;
    }
    if (el.bmi_mapImage) bmi_imageObjSelected = el.bmi_mapImage;
    else bmi_imageObjSelected = el;
    if (bmi_ie || bmi_opera) pwindow = document.parentWindow;
    else if (bmi_nsonly || is_gecko) pwindow = document.defaultView;
    else pwindow = null;
    if (pwindow && (pwindow != pwindow.parent)) {
    pwindow.focus();
    el.bmi_changedFocus = 1;
    }
    return;
    }

    function bmi_setElementTitle(el) {
    var tmpAlt = "";
    if (el.alt) {
    tmpAlt = el.alt;
    el.bmi_oldAlt = el.alt;
    el.bmi_alt = "";
    el.alt = "";
    }
    if (el.title) {
    el.bmi_oldTitle = el.title;
    el.title = el.title + "";
    } else {
    el.title = tmpAlt + "";
    }
    if (bmi_firefox) {
    el.title = el.title + bmi_toolTipSeperator + bmi_ffx_op_toolTip;
    el.bmi_touched = 1;
    el.bmi_title = el.title;
    } else if (bmi_opera || bmi_safari) {
    el.title = bmi_ffx_op_toolTip;
    el.bmi_touched = 1;
    el.bmi_title = el.title;
    } else {
    el.title = el.title + bmi_toolTipSeperator + bmi_toolTip;
    el.bmi_touched = 1;
    el.bmi_title = el.title;
    }
    return;
    }

    function bmi_checkInputType(type) {
    if (!type) return 0;
    if (type.match("image") || type.match("Image")) {
    return 1;
    }
    return 0;
    }

    function bmi_checkMIMEType(type) {
    var typeStr = new String(type);
    var find = /image\//gi;
    if (typeStr.search(find) != -1) return 1;
    return 0;
    }

    function bmi_mouseOver(e) {
    bmi_imageObjSelected = null;
    var obj;
    if (document.bmi_onmouseover_original != null) document.bmi_onmouseover_original(e);
    if (bmi_ie || bmi_opera) {
    var e = window.event;
    obj = e.srcElement;
    } else {
    obj = e.target;
    }
    if (obj.bmi_gotOriginal) return;
    if (bmi_ImageElement(obj)) {
    bmi_checkElement(obj);
    }
    return;
    }

    function bmi_safeMouseOutEvents(e) {
    var obj;
    if (bmi_ie || bmi_opera) {
    e = window.event;
    obj = e.srcElement;
    } else {
    obj = e.target;
    }
    bmi_resetTitle(obj);
    if (obj.bmi_changedFocus == 1) {
    var pwindow = null;
    if (bmi_ie || bmi_opera) pwindow = document.parentWindow;
    else if (bmi_nsonly || is_gecko) pwindow = document.defaultView;
    else pwindow = null;
    if (pwindow) {
    pwindow.top.focus();
    obj.bmi_changedFocus = 0;
    }
    }
    if (obj.bmi_orig_mouseout) {
    obj.bmi_orig_mouseout();
    }
    }

    function bmi_updateImageSrc(src) {
    var found = 0;
    var find = /\?/g;
    var editUrl;
    var editIndex;
    var editProto;
    var bmiSignIndex;
    var bmiSign;
    srcString = new String(src);
    if (srcString.search(find) != -1) {
    found = 1;
    srcString = srcString.concat("&" + bmi_concatStr + "=1");
    } else {
    var i = srcString.lastIndexOf("/");
    var newStr = srcString.substring(i + 1);
    srcString = srcString.concat("/" + bmi_concatStr + "/" + newStr);
    }
    if (bmi_htmlEdit) {
    editIndex = srcString.indexOf("://");
    if (editIndex != -1) {
    editProto = srcString.substring(0, editIndex + 3);
    editUrl = srcString.substring(editIndex + 3);
    editIndex = editUrl.indexOf("/");
    if (editIndex != -1) {
    editUrl = editUrl.substring(editIndex + 1);
    bmiSignIndex = editUrl.indexOf("/");
    if (bmiSignIndex != -1) {
    bmiSign = editUrl.substring(0, bmiSignIndex);
    if (bmiSign == "bmi") {
    editUrl = editUrl.substring(bmiSignIndex + 1);
    srcString = editProto + editUrl;
    }
    }
    }
    }
    }
    return (srcString);
    }

    function bmi_replaceImages(array) {
    if (!array) return;
    for (var i = 0; i < array.length; i++) {
    if (array[i].bmi_gotOriginal) {
    continue;
    }
    if (array[i].bmi_objTag) {
    array[i].data = bmi_updateImageSrc(array[i].data);
    } else {
    array[i].src = bmi_updateImageSrc(array[i].src);
    }
    array[i].bmi_gotOriginal = 1;
    if (array[i].bmi_touched) {
    bmi_resetTitle(array[i]);
    }
    }
    return;
    }

    function bmi_replaceInputImages(array) {
    if (!array) return;
    for (var i = 0; i < array.length; i++) {
    if (array[i].bmi_gotOriginal) {
    continue;
    }
    if (array[i].type && bmi_checkInputType(array[i].type)) {
    array[i].src = bmi_updateImageSrc(array[i].src);
    array[i].bmi_gotOriginal = 1;
    if (array[i].bmi_touched) {
    bmi_resetTitle(array[i]);
    }
    }
    }
    return;
    }

    function bmi_NSlayers() {
    if (document != null) {
    if (!document.layers) {
    bmi_replaceImages(document.tags.IMG);
    bmi_replaceInputImages(document.tags.INPUT);
    return;
    }
    for (var i = 0; i < document.layers.length; i++) {
    bmi_NSlayers(document.layers[i].document);
    bmi_replaceImages(document.layers[i].document.tags.IMG);
    bmi_replaceInputImages(document.layers[i].document.tags.INPUT);
    }
    }
    return;
    }

    function bmi_downloadAllHandler() {
    if ((true == bmi_checkAccess(parent)) && (parent.location.href != self.location.href)) {
    var newparent = parent;
    do {
    newparent = newparent.parent;
    if ((false == bmi_checkAccess(newparent.parent)) || (newparent.parent.location.href == newparent.location.href)) {
    break;
    }
    } while (newparent); //
    var numFrames = newparent.frames.length;
    var index = 0;
    var frame;
    for (; index < newparent.frames.length; index++) {
    frame = newparent.frames[index];
    if (false == bmi_checkAccess(frame.window)) {
    continue;
    }
    if (frame.window.bmi_reDownloadAllImages) {
    frame.window.bmi_reDownloadAllImages();
    }
    }
    return;
    }
    bmi_reDownloadAllImages();
    }

    function bmi_reDownloadAllImages() {
    var imgArray;
    var inputArray;
    var backgroundArray;
    var numFrames = window.frames.length;
    var index = 0;
    var frame;
    for (; index < numFrames; index++) {
    frame = window.frames[index];
    if (false == bmi_checkAccess(frame.window)) {
    continue;
    }
    if (frame.window.bmi_reDownloadAllImages) {
    frame.window.bmi_reDownloadAllImages();
    }
    }
    if ((bmi_ie5up || bmi_ns6up || bmi_opera5up || bmi_firefox)) {
    imgArray = document.getElementsByTagName("IMG");
    inputArray = document.getElementsByTagName("INPUT");
    bmi_replaceImages(imgArray);
    bmi_replaceInputImages(inputArray);
    } else if (bmi_ns && (bmi_ns4 || bmi_ns3)) {
    var imgArray;
    var docLayers;
    docLayers = document.layers;
    if (docLayers && docLayers.length) {
    for (var layi = 0; layi < 0; layi++) {
    imgArray = docLayers[layi].document.images;
    bmi_replaceImages(imgArray);
    }
    } else {
    imgArray = document.images;
    bmi_replaceImages(imgArray);
    }
    } else {
    imgArray = document.images;
    bmi_replaceImages(imgArray);
    }
    return;
    }

    function bmi_reDownloadSelectedImage(img) {
    if (img.bmi_gotOriginal) {
    return;
    }
    if (img && !img.bmi_gotOriginal) {
    if (img.bmi_objTag) {
    img.data = bmi_updateImageSrc(img.data);
    } else {
    img.src = bmi_updateImageSrc(img.src);
    }
    img.bmi_gotOriginal = 1;
    if (img.bmi_touched) {
    bmi_resetTitle(img);
    }
    if (img.bmi_areaEl && (img.bmi_areaEl.bmi_touched)) {
    bmi_resetTitle(img.bmi_areaEl);
    img.bmi_areaEl.bmi_gotOriginal = 1;
    }
    }
    return;
    }

    function bmi_keypress(e) {
    var reloadSingle = 0;
    var reloadAll = 0;
    var obj;
    if (bmi_ns) {
    if (bmi_ns6up) {
    if ((String.fromCharCode(e.charCode) == 'r') || (String.fromCharCode(e.charCode) == 'R')) reloadSingle = 1;
    else {
    if ((String.fromCharCode(e.charCode) == 'A')) reloadAll = 1;
    }
    obj = e.target;
    var str = new String(obj.tagName);
    if (str.match("INPUT") && (bmi_checkInputType(obj.type) != 1)) {
    if (bmi_imageObjSelected == obj) reloadAll = reloadSingle = 0;
    }
    } else {
    if ((String.fromCharCode(e.which) == 'R') && (e.modifiers == Event.SHIFT_MASK)) reloadSingle = 1;
    else {
    if ((String.fromCharCode(e.which) == 'A') && (e.modifiers == Event.SHIFT_MASK)) reloadAll = 1;
    }
    }
    }
    if (bmi_ie || bmi_opera) {
    if ((String.fromCharCode(window.event.keyCode) == 'R') && (window.event.shiftKey)) reloadSingle = 1;
    else if (bmi_opera) {
    if ((String.fromCharCode(window.event.keyCode) == 'A') && (window.event.shiftKey)) reloadAll = 1;
    }
    var e = window.event;
    obj = e.srcElement;
    var str = new String(obj.tagName);
    if (str.match("INPUT") && (bmi_checkInputType(obj.type) != 1)) {
    if (bmi_imageObjSelected == obj) reloadSingle = reloadAll = 0;
    }
    }
    if (reloadSingle == 1) {
    if (bmi_ns) {
    if (bmi_ns4 || bmi_ns3 || bmi_ns2) {
    return;
    }
    }
    if (bmi_imageObjSelected) bmi_reDownloadSelectedImage(bmi_imageObjSelected);
    } else {
    if (reloadAll == 1) {
    bmi_downloadAllHandler();
    }
    }
    if ((document.bmi_onkeypress_original != null) && (document.bmi_onkeypress_original != bmi_keypress)) {
    return (document.bmi_onkeypress_original(e));
    }
    return;
    }

    function bmi_linkMapImages(maps, objs) {
    var linked = 0;
    for (var i = 0; i < objs.length; i++) {
    if (linked >= maps.length) {
    return linked;
    }
    if (objs[i].useMap) {
    var newStr = new String(objs[i].useMap);
    var mapName = newStr.substring(newStr.lastIndexOf("#") + 1);
    if (bmi_ImageElement(objs[i]) != 1) continue;
    for (var j = 0; j < maps.length; j++) {
    if (maps[j].name == mapName) {
    maps[j].bmi_imgObj = objs[i];
    linked++;
    }
    }
    }
    }
    return linked;
    }

    function bmi_load() {
    if (bmi_orig_onLoad) {
    bmi_orig_onLoad();
    }
    if (bmi_ns2 || bmi_ns3 || bmi_ns4) {
    window.defaultStatus = bmi_ns_tooltip;
    return;
    }
    if (document.onmouseover) {
    if (document.onmouseover != bmi_mouseOver) {
    document.bmi_onmouseover_original = document.onmouseover;
    }
    }
    document.onmouseover = bmi_mouseOver;
    if (document.onkeypress) {
    if (document.onkeypress != bmi_keypress) {
    document.bmi_onkeypress_original = document.onkeypress;
    }
    } else {
    document.bmi_onkeypress_original = null;
    }
    document.onkeypress = bmi_keypress;
    var maps = document.getElementsByTagName("MAP");
    if ((maps == null) || (maps.length == 0)) {
    return;
    }
    var objs = null;
    if (bmi_ie || bmi_opera) {
    objs = document.all;
    if (objs) {
    bmi_linkMapImages(maps, objs);
    }
    }
    if (bmi_ns || is_gecko) {
    var num = 0;
    objs = document.getElementsByTagName("IMG");
    if (objs) {
    num = num + bmi_linkMapImages(maps, objs);
    }
    if (num >= maps.length) {
    return;
    }
    objs = null;
    objs = document.getElementsByTagName("INPUT");
    if (objs) {
    num += bmi_linkMapImages(maps, objs);
    }
    if (num >= maps.length) {
    return;
    }
    objs = null;
    objs = document.getElementsByTagName("OBJECT");
    if (objs) {
    num += bmi_linkMapImages(maps, objs);
    }
    }
    return;
    }
    var bmi_orig_onLoad;

    function bmi_SafeAddOnload(f, urlStr, htmlEdit) {
    if (urlStr) {
    bmi_concatStr = urlStr;
    }
    if (htmlEdit) {
    bmi_htmlEdit = htmlEdit;
    }
    if (bmi_ie4) {
    window.onload = f;
    } else if (window.onload) {
    if (window.onload != f) {
    bmi_orig_onLoad = window.onload;
    window.onload = f;
    }
    } else {
    window.onload = f;
    }
    }