// Content Interactivity

var dragitem = new Object();
dragitem.zIndex = 0; 
var currSeries = -1;
var currDrag = -1;
var numCorrect = 0;
//Array of arrays of series targets (each series has an array)
var dSeries = new Array();

//Array of result objects (see below)
var reps = new Array();/**/

//Stores Browser info
var Netapp = new Netapp();

//Constructor for NetApp set NSB or IEB to true
function Netapp() 
{
        
        var browtype, brow, ib;
        this.NSB    = false;
        this.IEB    = false;
        this.version = null;
        
        browtype = navigator.userAgent;
        
        brow = "MSIE";
        if ((ib = browtype.indexOf(brow)) >= 0) {
                this.IEB = true;
                this.version = parseFloat(browtype.substr(ib + brow.length));
                return;
        }
        
        brow = "Netscape";
        if ((ib = browtype.indexOf(brow)) >= 0) {
                this.NSB = true;
                this.version = parseFloat(browtype.substr(ib + brow.length));
                return;
        }
        
}/**/

//Constructor for object to hold info about series. loc = Feedback item, ind = boolean true for individual reports
//num is number of dragTargets in series
function result(series, loc, ind, num,numCorrect)
{
        this.series = series;
        this.report = loc;
        this.ind = ind;
        this.num = num;
		this.numCorrect = numCorrect;
/**/}

//Puts a new drag series result object in reps
function setRep(series, loc, ind, num)
{
        reps.push(new result(series, loc, ind, num,0));
/**/}


//Sets Target and stores info about target in dSeries element
function settarget(dragtar, droptar, series, messageright, messagewrong, ev){
        
        showAnswer(" ", series);
        
        for (var j = 0;j < dSeries.length; j++)
        {
                if (dSeries[j][0].dragseries == series)
                {
                        currSeries = j;
                }
        }
        
        if (currSeries == -1) 
        {
                currSeries = dSeries.push(new Array())-1;
        }
        
        for (var i = 0;i < dSeries[currSeries].length; i++)
        {
                if (dSeries[currSeries][i].dragtarget == dragtar) currDrag = i;
        }
        if (currDrag == -1) currDrag = dSeries[currSeries].push(new dItem(dragtar, droptar, series, messageright, messagewrong)) -1;
        dragStart(ev, dragtar);
		if(dSeries[currSeries][currDrag].ansCorrect) dragStop(ev);
/**/}

//Constructor for dItem (element of series stored in dSeries)
function dItem(dragtar, droptar, series, messageright, messagewrong)
{
        this.dragtarget = dragtar;
        this.droptarget = droptar;
        this.feedbackright = messageright;
        this.feedbackwrong = messagewrong;
        this.dragseries = series;
        
        //stores if element is in correct target
        this.ansCorrect = false;
        
        //stores if element is in any target
        this.onTarget = false;
/**/}



function dragStart(event, id) {

  var element;
  var x, y;
  if (id){
    dragitem.elNode = document.getElementById(id);
  	
  }else {
    if (Netapp.NSB)
    dragitem.elNode = event.target;
	  
    if (Netapp.IEB)
      dragitem.elNode = window.event.srcElement;

    if (dragitem.elNode.nodeType == 3)
      dragitem.elNode = dragitem.elNode.parentNode;
  }
  if (Netapp.NSB) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  if (Netapp.IEB) {
    x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
  }



  dragitem.cursorStartY = y;
  dragitem.cursorStartX = x;
  dragitem.elStartTop   = parseInt(dragitem.elNode.style.top,  10);
  dragitem.elStartLeft  = parseInt(dragitem.elNode.style.left, 10);

  if (isNaN(dragitem.elStartTop))  dragitem.elStartTop  = 0;
  if (isNaN(dragitem.elStartLeft)) dragitem.elStartLeft = 0;


  dragitem.elNode.style.zIndex = ++dragitem.zIndex;

  if (Netapp.NSB) {
    document.addEventListener("mousemove", dragGo,   true);
    document.addEventListener("mouseup",   dragStop, true);
    event.preventDefault();
  }

  if (Netapp.IEB) {
    document.attachEvent("onmousemove", dragGo);
    document.attachEvent("onmouseup",   dragStop);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }

}



function dragGo(event) 
{

        var x, y;
        
        // Get cursor position with respect to the page.
        
        if (Netapp.IEB)
        {    
                y = window.event.clientY + document.documentElement.scrollTop
                + document.body.scrollTop;
                x = window.event.clientX + document.documentElement.scrollLeft
                + document.body.scrollLeft;
                
        }
        if (Netapp.NSB)
        {   
                y = event.clientY + window.scrollY;
                x = event.clientX + window.scrollX;
                
        }
        
        // Move drag element by the same amount the cursor has moved.
        dragitem.elNode.style.top  = (dragitem.elStartTop  + y - dragitem.cursorStartY) + "px";
        dragitem.elNode.style.left = (dragitem.elStartLeft + x - dragitem.cursorStartX) + "px";
        
        if (Netapp.NSB)
        {
                event.preventDefault();
        }
        
        if (Netapp.IEB) {
                window.event.cancelBubble = true;
                window.event.returnValue = false;
        }

}
/**/

//Halts drag (onmouseup)
//takes appropriate action for dropsite
function dragStop(event) 
{
        if (Netapp.NSB) {
                document.removeEventListener("mousemove", dragGo,   true);
                document.removeEventListener("mouseup",   dragStop, true);
        }
        
        if (Netapp.IEB) {
                document.detachEvent("onmousemove", dragGo);
                document.detachEvent("onmouseup",   dragStop);
        }
        
         var loc = myCheckDrag();
         if (loc == null)//offtarget
         {
                dragitem.elNode.style.position  =  "relative";
				dragitem.elNode.style.top = 0;
                dragitem.elNode.style.left = 0;
                dSeries[currSeries][currDrag].ansCorrect = false;
                dSeries[currSeries][currDrag].onTarget = false;
         }
         else//ontarget
         {
                dSeries[currSeries][currDrag].onTarget = true;
                 if(loc == dSeries[currSeries][currDrag].droptarget){//correct
                         dSeries[currSeries][currDrag].ansCorrect = true;
                         for(var i = 0; i< reps.length; i++) {//show answer dependant on boolean ind in result
                                 if(reps[i].series == dSeries[currSeries][currDrag].dragseries && reps[i].ind){
										 reps[i].numCorrect++;
										 if (reps[i].numCorrect == reps[i].num)showAnswer(dSeries[currSeries][currDrag].feedbackright, reps[i].series);
                                 }
                         }
						dragitem.elNode.style.position  =  "absolute";
						dragitem.elNode.style.width = parseInt(document.getElementById(loc).style.width);
						dragitem.elNode.style.height  =  parseInt(document.getElementById(loc).style.height); 
						dragitem.elNode.style.left = parseInt(document.getElementById(loc).offsetLeft);
						dragitem.elNode.style.top  =  parseInt(document.getElementById(loc).offsetTop)+5; 
                 }
                 else//incorrect
                 {
                        for (var k = 0;k < reps.length; k++)
                        {
                                //snap back if ind
                                if(dSeries[currSeries][currDrag].dragseries == reps[k].series && reps[k].ind) {
										dragitem.elNode.style.position  =  "relative";
                                        dragitem.elNode.style.top = 0;
                                        dragitem.elNode.style.left = 0;
									
                                }
                        }
                        dSeries[currSeries][currDrag].ansCorrect = false;
                        for(var i = 0; i< reps.length; i++) {//show answer dependant on boolean ind in result
                                 if(reps[i].series == dSeries[currSeries][currDrag].dragseries && reps[i].ind){
                                        // showAnswer(dSeries[currSeries][currDrag].feedbackwrong, reps[i].series);
                                 }
                         }
                 }
         }
         currSeries = -1;
         currDrag = -1;
}/**/

//check if dropsit is in target, return target id or null
function myCheckDrag(){
	var x = parseInt(document.getElementById(dSeries[currSeries][currDrag].dragtarget).offsetLeft);  
	var r = parseInt(document.getElementById(dSeries[currSeries][currDrag].dragtarget).offsetWidth)+
		parseInt(document.getElementById(dSeries[currSeries][currDrag].dragtarget).offsetLeft); 
	var y = parseInt(document.getElementById(dSeries[currSeries][currDrag].dragtarget).offsetTop);
	var b = parseInt(document.getElementById(dSeries[currSeries][currDrag].dragtarget).offsetHeight)+
		parseInt(document.getElementById(dSeries[currSeries][currDrag].dragtarget).offsetTop);

	var otherlayers = document.getElementsByTagName("DIV");
	for (var ib = 0; ib < otherlayers.length; ib++) {
			tempLayer = otherlayers[ib];
			if(tempLayer.id.indexOf(dSeries[currSeries][currDrag].dragseries)!= -1){
			var c = parseInt(document.getElementById(tempLayer.id).offsetTop)- 50;
			var e = parseInt(document.getElementById(tempLayer.id).offsetWidth)+ 100;
			var f = parseInt(document.getElementById(tempLayer.id).offsetHeight)+75;
			var d = parseInt(document.getElementById(tempLayer.id).offsetLeft)- 50;                
			if ((x>=d && x<(d+e) && y>=c && y<(c+f))&& (r>=d && r<(d+e) && b>=c && b<(c+f))){
				return tempLayer.id;
			}
		}
	}
	return null;
}

// called by button for series. only acts if ind (boolean in result)
function solved(series, fdr, fdw)
{
        var countW = 0;
        var countN = 0;
        var countR = 0;
        var num = 0;
        var p = -1;
        for (var k = 0;k < reps.length; k++)
        {
                if(series == reps[k].series){
                        if(reps[k].ind) return;// return if individual response given
                        num = reps[k].num;
                }
        }
        for (var i = 0;i < dSeries.length; i++){//find series and count wrong and offtarget answers
                if (dSeries[i][0].dragseries == series){
                        p = i;
                        for (var j = 0;j < dSeries[i].length; j++) {
                                if (dSeries[i][j].onTarget) {
                                        countN++;
                                }
                                if (dSeries[i][j].ansCorrect) countR++;
                                else {
                                        //Reset node if wrong
                                        dSeries[i][j].onTarget = false;
                                        var temp = document.getElementById(dSeries[i][j].dragtarget);
                                        temp.style.top = 0;
                                        temp.style.left = 0;
                                }
                        }
                        countN = num - countN
                        countW = num - countR - countN;
                        i = dSeries.length;
                }
        }
        if(p != -1) showAnswer(countR + " correct - " + fdr + " " + countW + " incorrect - " + fdw + " " + countN + " not placed correctly.",  series);
/**/}

//puts message to series result loc
function showAnswer(msg, series)
{
        var loc = "";
        for (var i = 0;i < reps.length; i++)
        {
             
			    if(series == reps[i].series) loc = reps[i].report;
        }
        
        if (loc)
        {
                
				var result = document.getElementById(loc);
                result.innerHTML = msg;
        }
/**/}

function MarkMe(objQuestion, txtAns)
{	
	var objImage
	if (objQuestion.type == "checkbox"){
		bCorrect = true;
		if (objQuestion.checked){
			if (txtAns =="no"){bCorrect=false}
		 }else{
		 	if (txtAns=="yes"){bCorrect=false}
		}
	}else{
		if (objQuestion.value == txtAns){bCorrect=true }else{ bCorrect=false}
	}
	if (bCorrect){
		txtImage = 'IMG' + objQuestion.name;
		objImage = document.getElementById(txtImage);
		if (document.images) {
   			 document[txtImage].src = "images/correct.gif"
 		}
	}else{
		txtImage = 'IMG' + objQuestion.name;
		objImage = document.getElementById(txtImage);
		if (document.images) {
   			 document[txtImage].src = "images/incorrect.gif"
 		}
	}
}
//checks user question inputs and provides answer message
function MarkMeWithAnswer(objQuestion, txtAns,correctMsg,wrongMsg)
{	
	var objImage
	divID= 'DIV'+objQuestion.name;
	if (objQuestion.type == "checkbox"){
		bCorrect = true;
		if (objQuestion.checked){
			if (txtAns =="no"){bCorrect=false}
		 }else{
		 	if (txtAns=="yes"){bCorrect=false}
		}
	}else{
		if (objQuestion.value == txtAns){bCorrect=true }else{ bCorrect=false}
	}	
	if (bCorrect){
		txtImage = 'IMG' + objQuestion.name;
		objImage = document.getElementById(txtImage);
		if (correctMsg!=""){
			document.getElementById(divID).innerHTML = correctMsg;
		}
		if (document.images){
			 document[txtImage].src = "images/correct.gif"
		}
	}else{
		txtImage = 'IMG' + objQuestion.name;
		objImage = document.getElementById(txtImage);
		if (wrongMsg != ""){
			document.getElementById(divID).innerHTML= wrongMsg;
		}
		if (document.images) {
			 document[txtImage].src = "images/incorrect.gif"
		}
	}

}
var isMultiChecked = false;//this is used to stop endless recursion of MarkMeMultiAnswer
function MarkMeMultiAnswer(objQuestion, txtAnsArray,otherObjsArray)
//Purpose: This funciton is used for checkpoint questions that have more than one possible answer
//Parameters: 	objQuestion - Current element being used
//				txtAnsArray - string of possible answers. delimited by #
//				otherObjsArray - string of Other elements in which current element answer needs to compare with. Delimited by #		
{	
	var objImage, AnsArray, OtherObjectArray
	if (objQuestion.type == "checkbox"){
		bCorrect = true;
		if (objQuestion.checked){
			if (txtAns =="no"){bCorrect=false}
		 }else{
		 	if (txtAns=="yes"){bCorrect=false}
		}
	}else{
		AnsArray = txtAnsArray.split("#");
		if (otherObjsArray.length > 0){
			OtherObjectArray = otherObjsArray.split("#");
		}
		for (i=0;i<AnsArray.length;i++){
			if (objQuestion.value == AnsArray[i]){
				bCorrect=true; 
				//go through other elements that the answer needs to compare to
				if (otherObjsArray.length > 0){
					for (ii=0;ii<OtherObjectArray.length;ii++){
						if (document.getElementById(OtherObjectArray[ii]).value == AnsArray[i]){
							bCorrect=false
						}
					} 
				}
				if (bCorrect)break;
			}else{ 
				bCorrect=false
			}
		}
	}
	if (bCorrect){
		txtImage = 'IMG' + objQuestion.name;
		objImage = document.getElementById(txtImage);
		if (document.images) {
   			 document[txtImage].src = "images/correct.gif"
 		}
	}else{
		txtImage = 'IMG' + objQuestion.name;
		objImage = document.getElementById(txtImage);
		if (document.images) {
   			 document[txtImage].src = "images/incorrect.gif"
 		}
	}
	if (isMultiChecked){
		isMultiChecked = false;
		MarkMeMultiAnswer(document.getElementById(otherObjsArray), 'Ink Jet#Bubble Jet',objQuestion.id);
	}else{
		isMultiChecked = true;
	}
}
function showDefinition(objQuestion){
	divID = objQuestion.id + "_def";
	document.getElementById(divID).style.visibility = "visible";
}

//******Interactivity code to show lesson hints************************************
//Note: The functions below are for the moment only used in the Interactivity Demostrations
function showLessonHint(hint_id,obj){
/*Purpose: i show a hint msg layer
Parameters: 	hint_id - the layer containing hint to be shown
				obj - the object where the mouse click event was triggered on. Needed to retreieve X,Y coordiantes of Hint
*/
	document.getElementById(hint_id).style.visibility = "visible"
	document.getElementById(hint_id).style.top = document.getElementById(obj.id).offsetTop
	document.getElementById(hint_id).style.left = document.getElementById(obj.id).offsetLeft
}
function closeLessonHint(hint_id){
/*Purpose: i close/hide a visible hint msgs layer*/
	document.getElementById(hint_id).style.visibility = "hidden"
}



var CB = null;
function coursewindow(mypage,myname){

	if (CB && !CB.closed) CB.close();
	{
		openitCB(mypage,myname);
	}
}
function openitCB(mypage,myname){

	var w = 780
	var h = 550
	var t = ((self.screen.availHeight/2) - (h/2));
	var l = ((self.screen.availWidth/2) - (w/2));
	settings ='width=' + w + ',height=' + h + ',left=' + l + ',top=' + t + ',toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=yes'
	CB = window.open(mypage,myname,settings);
}

function coursewindowparams(mypage,myname,myparams){

	if (CB && !CB.closed) CB.close();
	{
	openitCBParam(mypage,myname,myparams);
	}
}
function openitCBParams(mypage,myname,myparams){

var w = 800
var h = 550
var t = ((self.screen.availHeight/2) - (h/2));
var l = ((self.screen.availWidth/2) - (w/2));
settings ='width=' + w + ',height=' + h + ',left=' + l + ',top=' + t + ',' + myparams
CB = window.open(mypage,myname,settings);
}

 
function showlayers(theLayer, submenu){ 
var thesublayer = submenu;
var otherlayers = document.getElementsByTagName("div");
	        for (var ib = 0; ib < otherlayers.length; ib++) {
                tempLayer = otherlayers[ib];
                if(tempLayer.id.indexOf(thesublayer)!= -1){
  if(document.getElementById(tempLayer.id).style.display != "block") {
theLayer.style.color=fontcol;
document.getElementById(tempLayer.id).style.display = "block";
  } else {
document.getElementById(tempLayer.id).style.display = "none";
 theLayer.style.color="#ffffff";
  }
} 
else if (tempLayer.id.indexOf("topmenu")!= -1){
document.getElementById(tempLayer.id).style.display = "none";
document.getElementById(tempLayer.id).style.color = "#ffffff";
                        }
						
		else if ((tempLayer.id.indexOf("top1")!= -1)&&(tempLayer!=theLayer)){
document.getElementById(tempLayer.id).style.color = "#ffffff";
                        }				
					
	                }
         }

function donothing(){} 

 function cOn(roll){
 if (document.getElementById){
 roll.style.backgroundColor="#F0F0F0";
 }
 }
 function cOut(roll){
if (document.getElementById){
 roll.style.backgroundColor="";
 }
 }

var win6 = null;
function NewWindow(mypage,myname,w,h){
{
if (win6 && !win6.closed) win6.close();
openit5(mypage,myname,w,h);
}
}

function showHidden_Div(Hidden_Div, Dest_div){ 
	var d=document;
	var dest;
	var div;
	if (d.getElementById(Dest_div)!=null){
		if (d.getElementById(Hidden_Div)!=null){
			d.getElementById(Dest_div).innerHTML = d.getElementById(Hidden_Div).innerHTML;
		}
	}
}
function swapImgRestore() { 
  var i,x,a=document.sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function findObj(n, d) { 
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}


function showTable_Title(Table_Title){ 
	var myTable_Title = "desc_" + Table_Title;
	var alldivs = document.getElementsByTagName("div");
	for (var i_divloop = 0; i_divloop < alldivs.length; i_divloop++) {
	  divinquestion = alldivs[i_divloop];
	  if(divinquestion.id.indexOf(myTable_Title) != -1){
		  if(document.getElementById(divinquestion.id).style.display != "block") {
			 document.getElementById(divinquestion.id).style.display = "block";
		  } 
	   } else if (divinquestion.id.indexOf("desc_") != -1){
			document.getElementById(divinquestion.id).style.display = "none";
	   }
	}
}

function preloadImages() { 
  var d=document; if(d.images){ if(!d.p) d.p=new Array();
    var i,j=d.p.length,a=preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.p[j]=new Image; d.p[j++].src=a[i];}}
}

function swapImgRestore() {
  var i,x,a=document.sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function findObj(n, d) { 
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function swapImage() { 
  var i,j=0,x,a=swapImage.arguments; document.sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=findObj(a[i]))!=null){document.sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}