//
// engine_4
//
//

// ##################################################################
//
//    General Methods follow
//
// ##################################################################



function rand() {
    var x                                            ;                                  
    x = ( Math.floor(100*Math.random())) % 9         ;
    while (x == ran) {
        x = ( Math.floor(100*Math.random()) ) % 9    ;
    } 
    ran = x                                          ;
    return x                                         ;
}

function moveTo(obj,x,y)
{
    if (IE) {
        var units = (moveTo.arguments.length > 3) ? moveTo.arguments[3] : "px" ;
        obj.style.left = x + "" + units                                   ;
        obj.style.top  = y + "" + units                                   ;
    }
}


function question_position(name) {
    var obj                                                 ;
    
    for (i = 0; i < MAX ; i++) {
        if (name == layerNameArray[i]) {
            break ;
        }
    }
    
    if (IE) {

        obj = document.getElementById(name)                 ;
        obj.style.left = column_1                           ;
        obj.style.top             = (MATCHLIST_START + 40*i);


    } else if (N6) {
    
        obj = document.getElementById(name)                 ;
        obj.style.left = column_1                           ;
        obj.style.top   = (MATCHLIST_START + 40*i)          ;
            
        
    } else {
        // N4 requires no assertion of the location
        // of the answer objects.
    }
}


function assert_assignments() {
    var obj                                                     ;
    
    if (IE) {
        for (i = 0; i < MAX ; i++) {

            obj = document.getElementById(layerNameArray[i])    ;
            obj.style.left = column_1                           ;
            obj.style.top             = (MATCHLIST_START + 40*i);

            obj = document.getElementById("answer" + (i+1))     ;
            obj.style.left = column_2                           ;
            obj.style.top             = (MATCHLIST_START + 40*(matchNameArray[layerNameArray[i]]-1));

        }
    } else if (N6) {
    
        for (i = 0 ; i < MAX ; i++) {
            obj = document.getElementById(layerNameArray[i])    ;
            obj.style.left = column_1                           ;
            obj.style.top   = (MATCHLIST_START + 40*i)          ;

            obj = document.getElementById(answerNameArray[i])   ;
            obj.style.left = column_2                           ;
            obj.style.top   = (MATCHLIST_START + 40*(matchNameArray[layerNameArray[i]]-1))          ;
        }
        
    } else {
        // N4 requires no assertion of the location
        // of the answer objects.
    }

}


function setzIndex(question, zOrder) {
    if (N6) {
        question.style.zIndex = zOrder                          ;
    } else {
        question.zIndex = zOrder                                ;
    }

}

function shiftTo(question, x, y)
{
    if (N4) {
        question.moveTo(x,y)                                    ;
    } else if (N6) {
        question.style.left = x                                 ;
        question.style.top  = y                                 ;
    } else {
        question.pixelLeft = x                                  ;
        question.pixelTop  = y                                  ;
    }
}

function setAnswerName(QuestionName)
{
    x = QuestionName.substring(8) ;
    str = "answer" + x ;
    return str ;
}

function setSelectedElem(e) {

    if (N4) {
        clickX = e.pageX                                        ;
        clickY = e.pageY                                        ;
        
        for (i = document.layers.length - 1 ; i >= 0 ; i--) {
            testObj = document.layers[i]                        ;
            
            for (j = 0 ; j < layerNameArray.length ; j++) {
                if ((testObj.id == layerNameArray[j]) 
                && (clickX > testObj.left) &&
                (clickX < testObj.left + testObj.clip.width) &&
                (clickY > testObj.top) &&
                (clickY < testObj.top + testObj.clip.height)) {
                    selectedQuestion = testObj                  ;
                    setzIndex(selectedQuestion, 100)            ;
                    return testObj.id                           ;
                }
            }
        }
    } else {
        imgObj = window.event.srcElement                        ;
        testObj = imgObj.parentElement.style                    ;
        
        layerName = imgObj.parentElement.id                     ;
        for (i = 0 ; i < layerNameArray.length ; i++) { 
            if (layerName == layerNameArray[i] && testObj) {
                selectedQuestion = testObj                      ;
                setzIndex(selectedQuestion, 100)                ;
                return layerName                                ;
            }
        }
    }
}

function setNSEventCapture()
{
    document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP) ;
}

function attachEvent(obj)
{
    obj.addEventListener("mousedown", grabQuestion,    false)   ;
    obj.addEventListener("mousemove", dragQuestion,    false)   ;
    obj.addEventListener("mouseup",   releaseQuestion, false)   ;
}    

function grabQuestion(e)
{
    shiftX = document.body.scrollLeft ;
    shiftY = document.body.scrollTop  ;

    if (N6) {
        offsetX = e.layerX                                      ;
        offsetY = e.layerY                                      ;
	     selectedQuestion = this                                 ;
        setzIndex(selectedQuestion,100)                         ;
    } else {
        selectedQuestionName = setSelectedElem(e)               ;

        selectedAnswerName   = "answer" + matchNameArray[selectedQuestionName]   ;
        if (selectedQuestion) { 
            if (N4) {
                offsetX = e.pageX - selectedQuestion.left       ;
                offsetY = e.pageY - selectedQuestion.top        ;
            } else {
                offsetX = window.event.offsetX - shiftX         ;
                offsetY = window.event.offsetY - shiftY         ;
            }
        }    
        return false                                            ;
    }
}

function dragQuestion(e)
{
    if (selectedQuestion) {
        if (IE) {
            x = window.event.clientX - offsetX                  ;
            y = window.event.clientY - offsetY                  ;
        } else {
            x = e.pageX - offsetX                               ;
            y = e.pageY - offsetY                               ;
        }
        shiftTo(selectedQuestion, x, y)                         ;
        
        return false                                            ;
    }
}

function releaseQuestion(e)
{
    var shiftX = document.body.scrollLeft ;
    var shiftY = document.body.scrollTop  ;
 
    if (selectedQuestion) {
    
        selectedAnswerName = setAnswerName(selectedQuestionName) ;
 
        if (IE) {
            releaseX = window.event.clientX + shiftX            ;
            releaseY = window.event.clientY + shiftY            ;
            
            targetObj    = document.all[selectedAnswerName].style       ;
            targetWidth  = document.all[selectedAnswerName].offsetWidth ;
            targetHeight = document.all[selectedAnswerName].offsetHeight;
            targetLeft   = targetObj.pixelLeft                ;
            targetTop    = targetObj.pixelTop                 ;

        } else {
            releaseX = e.pageX + shiftX                         ;
            releaseY = e.pageY + shiftY                         ;
        
            if (N6) {
                targetObj    = document.getElementById(selectedAnswerName).style         ;
                targetWidth  = document.getElementById(selectedAnswerName).offsetWidth   ;
                targetHeight = document.getElementById(selectedAnswerName).offsetHeight  ;
                targetLeft   = parseInt(document.getElementById(selectedAnswerName).style.left) ;
                targetTop    = parseInt(document.getElementById(selectedAnswerName).style.top)  ;
            } else {
                targetObj    = document.layers[selectedAnswerName]               ;
                targetWidth  = document.layers[selectedAnswerName].clip.width    ;
                targetHeight = document.layers[selectedAnswerName].clip.height   ;
                targetLeft   = document.layers[selectedAnswerName].left          ;
                targetTop    = document.layers[selectedAnswerName].top           ;
            }
        }

        if ((releaseX > targetLeft) &&
            (releaseX < targetLeft + targetWidth) &&
            (releaseY > targetTop) &&
            (releaseY < targetTop + targetHeight)) {
   
            selectedQuestion.visibility = "hidden"                     ;
            level                  = 0                                 ;
        } else {

            question_position(selectedQuestionName) ;
            alert("Nope: Try again.")                                  ;
            level                  = 100                               ;
        }
        setzIndex(selectedQuestion, level)                             ;
        selectedQuestion = null                                        ;
    } 
}


function init() 
{

    if (N6) { 
    
        for (i = 0 ; i < MAX ; i++) {
            question = document.getElementById(layerNameArray[i]) ;
            attacheEvent(question) ;
        }  
        window.onmousemove = dragQuestion                        ;
   } else {
	     if (N4) {
	         setNSEventCapture()                                  ;
        }
        document.onmousedown = grabQuestion                      ;
        document.onmousemove = dragQuestion                      ;
        document.onmouseup   = releaseQuestion                   ;
    }
  
}


