// 画像切り替えをしたい要素のクラスを指定
var cl = "swap";

// 切り替え画像ファイルにつけるマーカー
var marker = "_om";

/* ================================================ */

window.onload = function () {
    var imgELs = getElementsByCT(cl,"IMG");
    var imgObjs_off = preloadImgsByMarker(imgELs,'');
    var imgObjs_on = preloadImgsByMarker(imgELs,marker);
    setSwapImgEvent(imgELs,imgObjs_off,imgObjs_on);
}

// 画像エレメントの配列から、src名の最後にmarkerを付加した画像をプリロードする関数
// -> marker = "-om" なら hoge.jpg から hoge-om.jpgをプリロードする
function preloadImgsByMarker(imgElements,marker) {
    var r = new Array();
    var pattern = /\.([^\.]+$)/;
    for ( var i = 0; i< imgElements.length; i++ ) {
        r[i] = new Image();
        r[i].src = imgElements[i].src.replace(pattern, marker + ".$1");
    }
    return r;
}

// クラス指定された要素自身とその内部から特定のタグ名を持つ要素を取り出す関数
function getElementsByCT(cn,tn) {
    var c = getElementsByClassName(cn);
    var r = new Array();
    var i = 0; 
    var t = new Array();
    for ( var j = 0; j < c.length; j++ ) {
        if ( c[j].tagName == tn ) {
            r[i] = c[j];
            i++;
        }
        else {
            t = c[j].getElementsByTagName(tn);
            for ( var k = 0; k < t.length; k++ ) {
                if( t[k] ) {
                    r[i] = t[k];
                    i++;
                }
            }
        }
    }
    return r;
}

// img要素の配列にオンマウス時とオフマウス時それぞれのイベントと画像オブジェクトをセットする
function setSwapImgEvent(imgElements,imgObjs_OFF,imgObjs_ON) {
    if( imgElements.length != imgObjs_ON.length || imgElements.length != imgObjs_OFF.length ) {
        alert("setSwapImgEventに渡された引数配列の数が等しくありません");
    }
    else {
        for ( var i = 0; i < imgElements.length; i++) {
            imgElements[i].onmouseover  = new Function('this.src="' + imgObjs_ON[i].src  + '";')
            imgElements[i].onmouseout = new Function('this.src="' + imgObjs_OFF[i].src + '";')
        }
    }
}

function getElementsByClassName(str) {
    var elements = document.getElementsByTagName("*");
    var r = new Array();
    var j = 0;
    var pattern = new RegExp('(^|( +))'+ str + '(( +)|$)')
    for(var i = 0; i < elements.length; i++) {
        if(pattern.test(elements[i].className) ) {
            r[j] = elements[i];
            j++;
        }
    }
    return r;
}
