
var SessionTimeoutWarning;

function forceInt(x, y)
{
	return isNaN(y = parseInt(x))? 0 : y;
}

function getDivW(el)
{
	return forceInt(
		el ? (el.offsetWidth || el.style.pixelWidth || el.style.width || 0)
		: 0
	);
}

function getDivH(el)
{
	return forceInt(
		el ? (el.offsetHeight || el.style.pixelHeight || el.style.height || 0)
		: 0
	);
}

function getAbsolutePosition(el)
{
	_absX = 0;
	_absY = 0;
	
	while (el)
	{
		_absX += forceInt(el.offsetLeft);
		_absX -= forceInt(el.scrollLeft);

		_absY += forceInt(el.offsetTop);
		_absY -= forceInt(el.scrollTop);
		
		el = el.offsetParent || null;
	}
}

function getOffsetPosition(el)
{
	_absX = 0;
	_absY = 0;
	
	while (el)
	{
		_absX += forceInt(el.offsetLeft);
		_absY += forceInt(el.offsetTop);
		
		el = el.offsetParent || null;
	}
}

// LOADING
//

function showLoader(divID)
{
    var div = document.getElementById(divID);
    if (!div)
        return;

    var width = getDivW(div) + 'px';
    var height = getDivH(div) + 'px';
    getOffsetPosition(div);

    var image = document.createElement('div');
    image.className = 'loaderImage';
    image.style.top = _absY + 'px';
    image.style.left = _absX + 'px';
    image.style.width = width;
    image.style.height = height;
    div.appendChild(image);

    var mask = document.createElement('div');
    mask.className = 'loaderMask';
    mask.style.top = _absY + 'px';
    mask.style.left = _absX + 'px';
    mask.style.width = width;
    mask.style.height = height;
    div.appendChild(mask);
}

// UPLOAD
//

function preUpload(id)
{
    var form = document.forms['aspnetForm'];
    var action = form.elements[id + '_Action'];
    var target = form.target;

    // Show loader
    showLoader(id);

    // Set values
    action.value = 'upload';    
    form.target = id + '_Target';
    
    // Submit form
    form.submit();

    // Restore values
    action.value = '';
    form.target = target;
}

function postUpload(id, filename)
{
    var hidden = document.getElementById(id + '_SlickBack');
    var slickback = hidden.value.replace("__FILE__", filename);

    eval(slickback);
}

// CALENDAR
//

function calendarFocus(divID)
{
    // Mark as focused
    eval('window.focus_' + divID + ' = true;');

    // Show popup
    showDiv(divID);
}

function calendarBlur(divID)
{
    // Mark as blurred
    eval('window.focus_' + divID + ' = false;');

    // If not moused over, hide popup
    eval('var over = window.over_' + divID + ';');
    if (!over)
        hideDiv(divID);
}

function calendarClose(divID)
{
  // Mark as blurred
    eval('window.focus_' + divID + ' = false;');
  
  // Close popup  
  hideDiv(divID);
}

function calendarOver(divID)
{
    // Mark as moused over
    eval('window.over_' + divID + ' = true;');
}

function calendarOut(divID, e)
{
    if (window.event)
        e = window.event;
        
    var div = document.getElementById(divID);
    if (!div)
        return;

    var eventX = e.clientX + document.body.scrollLeft;
    var eventY = e.clientY + document.body.scrollTop;
    getAbsolutePosition(div);
    var divW = getDivW(div);
    var divH = getDivH(div);

    // Ignore this event if the cursor is inside the div
    if (eventX > _absX && eventX < _absX + divW && eventY > _absY && eventY < _absY + divH)
        return;
    
    // Mark as moused out
    eval('window.over_' + divID + ' = false;');

    // If not focused, hide popup
    eval('var focus = window.focus_' + divID + ';');
    if (!focus)
        hideDiv(divID);
}
// SHOW/HIDE
//

function showDiv(divID)
{
    var div = document.getElementById(divID);
    if (!div)
        return;

    div.style.visibility = 'visible';
}

function hideDiv(divID)
{
    var div = document.getElementById(divID);
    if (!div)
        return;

    div.style.visibility = 'hidden';
}

var _moveGradeBookDivsTop = -1;
var _moveGradeBookDivsLeft = -1;

function moveGradeBookDivs(maindiv, leftdivid, topdivid, centerdiv, left2divid, top2divid, icondivid)
{
    if (!maindiv)
        return;
    
    var top = maindiv.scrollTop;
    if (top != _moveGradeBookDivsTop)
    {
        var leftDiv = document.getElementById(leftdivid);
        if (leftDiv)
            leftDiv.scrollTop = top;
            
        var left2Div = document.getElementById(left2divid);
        if (left2Div)
            left2Div.scrollTop = top;
            
        _moveGradeBookDivsTop = top;
    }
        
    var left = maindiv.scrollLeft; 
    if (left != _moveGradeBookDivsLeft)
    {
        var topDiv = document.getElementById(topdivid);
        if (topDiv)
            topDiv.scrollLeft = left;
            
        var centerDiv = document.getElementById(centerdiv);
        if (centerDiv)
            centerDiv.scrollLeft = left;
            
        var top2Div = document.getElementById(top2divid);
        if (top2Div)
            top2Div.scrollLeft = left;
        
        var iconDiv = document.getElementById(icondivid);
        if (iconDiv)
            iconDiv.scrollLeft = left;
     
        _moveGradeBookDivsLeft = left;   
    }
}

// SLICKBACK
//

function __doSlickBack(eventTarget, eventArgument, contentDivIDs, loaderDivIDs) 
{
  var theForm = document.forms['aspnetForm'];
  
  // Set slickback values
  theForm.__SLICKBACKTARGET.value = eventTarget.split("$").join(":");
  theForm.__SLICKBACKARGUMENT.value = eventArgument;
  
  // Make request
  if (supportsXMLHttpRequest())
  {
    // Reflect loading status in div
    if (loaderDivIDs != null && loaderDivIDs.length > 0)
    {
        var divIDs = loaderDivIDs.split(',');
        
        for (i=0; i<divIDs.length; i++)
        {
            showLoader(divIDs[i]);
        }
    }

    // Use XMLHttpRequest
    theForm.__SLICKBACKDIVIDS.value = contentDivIDs;

    var body = processFormElements(theForm);
    postXMLDoc(theForm.action, body);

  
    // Reset values since the page isn't refreshed
    theForm.__SLICKBACKTARGET.value = '';
    theForm.__SLICKBACKARGUMENT.value = '';
    theForm.__SLICKBACKDIVIDS.value = '';
  }
  else
  {
    // Use vanilla post
    theForm.__SLICKBACKDIVIDS.value = '';
    theForm.submit();
  }
}

function processFormElements(theForm) 
{
  var re1 = new RegExp("&", "g");
  var re2 = new RegExp("\\x2B", "g");

  var r = '';
  var count = theForm.elements.length;

  for (i=0; i<count; i++) 
  {
    var element = theForm.elements[i];
    var elementName = element.tagName.toLowerCase();

    if (elementName == "input") 
    {
      if (element.type == "submit" || element.type == "image")
        continue;

      if (element.type == "checkbox" || element.type == "radio")
      {
        if (!element.checked)
          continue;
      }
      
      r += element.name + "=" + element.value.replace(re1, "%26").replace(re2, "%2B") + "&";
    }
    else if (elementName == "textarea")
    {
      r+= element.name + "=" + element.value.replace(re1, "%26").replace(re2, "%2B") + "&";
    }
    else if (elementName == "select") 
    {
      var selectCount = element.options.length;

      for (j=0; j<selectCount; j++) 
      {
        var option = element.options[j];

        if (option.selected == true)
          r += element.name + "=" + option.value.replace(re1, "%26").replace(re2, "%2B") + "&";
      }
    }
  }
  
  //alert(r);
  
  return r;
}

function supportsXMLHttpRequest() 
{
  if (window.XMLHttpRequest)
    return true;
    
  if (window.ActiveXObject) 
  {
    xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
    if (xmlRequest)
      return true;
  }
    
  return false;
}

function postXMLDoc(url, body) 
{
  // Native object
  if (window.XMLHttpRequest) 
  {
    xmlRequest = new XMLHttpRequest();
    xmlRequest.onreadystatechange = xmlRequestChange;
    xmlRequest.open("POST", url, true);
    xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlRequest.send(body);
  } 
  // ActiveX object
  else if (window.ActiveXObject) 
  {
    xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
    if (xmlRequest) 
    {
      xmlRequest.onreadystatechange = xmlRequestChange;
      xmlRequest.open("POST", url, true);
      xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xmlRequest.send(body);
    }
  } 
  // No object?!
  else
  {
    alert('XML POST NEEDS IMPLEMENTATION FOR OTHER BROWSERS!!!!');
  }
}

function xmlRequestChange() 
{
  // Loaded
  if (xmlRequest.readyState == 4) 
  {
    if (xmlRequest.status == 200) 
    {
      xmlRequestDone();
    } 
    else 
    {
      document.body.innerHTML = xmlRequest.responseText;
      //alert("There was a problem retrieving the XML data:\n" + );
    }
  }
}

function nodeValue(node, tagName)
{
  var item = node.getElementsByTagName(tagName).item(0).firstChild;
  return (item == null) ? '' : item.nodeValue;  
}

function xmlRequestDone()
{
  //alert(xmlRequest.responseText);
  //document.body.innerHTML = xmlRequest.responseText;
  //return;
  
  var root = xmlRequest.responseXML.documentElement;  
  var theForm = document.forms['aspnetForm'];
  var viewState = theForm.elements['__VIEWSTATE2'];
  
  if (viewState)
    viewState.value = nodeValue(root, 'viewState');

  var divContents = root.getElementsByTagName('divContent');
  for (i=0; i<divContents.length; i++)
  {
    var divContent = divContents.item(i);
    var divID = divContent.getAttribute('id');
    var div = document.getElementById(divID);
    if (div)
      div.innerHTML = (divContent.firstChild == null) ? '' : divContent.firstChild.nodeValue;
      
      //alert(divContent.firstChild.nodeValue);
  }
  
  RestartTimer();
}

// Grid Functions....
function getGridSelectedID(gridID)
{
	var input = document.forms[0].elements[gridID + '_SID'];
	if (input == null)
		return '';
		
	return input.value;
}

function setGridSelectedID(gridID, id)
{
	var input = document.forms[0].elements[gridID + '_SID'];
	if (input == null)
		return;
		
	input.value = id;
}

function gridRowOver(gridID, rowID)
{
	var div = document.getElementById(gridID + '_' + rowID);
	if (div == null)
		return;
		
	var selectedID = getGridSelectedID(gridID);
	if (rowID == selectedID)
		return;
		
	div.style.backgroundColor = '#B6D0DD';
}

function gridRowOut(gridID, rowID)
{
	var div = document.getElementById(gridID + '_' + rowID);
	if (div == null)
		return;

	var selectedID = getGridSelectedID(gridID);
	if (rowID == selectedID)
		return;
		
	div.style.backgroundColor = '';
}

function gridRowClick(gridID, rowID)
{
	var newDiv = document.getElementById(gridID + '_' + rowID);
	if (newDiv == null)
		return;

	var selectedID = getGridSelectedID(gridID);
	if (rowID == selectedID)
		return;
		
	var oldDiv = document.getElementById(gridID + '_' + selectedID);
	if (oldDiv != null)
	{
		oldDiv.style.backgroundColor = '';
		oldDiv.style.color = '';
		//var link = oldDiv.getElementsByTagName("a");
		//link[0].style.color = '';
	}
		
	setGridSelectedID(gridID, rowID);
	
	var input = document.forms[0].elements[gridID + '_PB'];
	if (input != null)
	{
		location.replace('javascript:' + input.value);
	}
	// old color - #85B0C6
	newDiv.style.backgroundColor = '#00618D';
	newDiv.style.color = '#FFFFFF';
//	var link = newDiv.getElementsByTagName("a");
//	link[0].style.color = '#FFFFFF';
}

function CheckEnter()
{
  if(event.keyCode == 13)
    return false;
  return true;
}

function KeyDownHandler(btn,evt)
{
    //test for FireFox and handle the event accordingly
    var ff = typeof evt.which != "undefined";
    var key = (ff) ? evt.which : event.keyCode;
    // process only the Enter key
    if (key == 13)
    {
        // cancel the default submit
        if(ff)
        {
            evt.returnValue=false;
            evt.cancel = true;
        }
        else
        {
            event.returnValue=false;
            event.cancel = true;
        }
        // submit the form by programmatically clicking the specified button
        btn.click();
    }
    return false;
}

var _timerHost = null;

function StartTimer(host)
{
    if (host != null)
        _timerHost = host;

    SessionTimeoutWarning = setTimeout('ShowTimeoutWarning()', 2400000);
}

function RestartTimer()
{
    window.clearTimeout(SessionTimeoutWarning);
    StartTimer(null);
}

function ShowTimeoutWarning()
{
    if (!_timerHost)
        return;

    window.location = "http://" + _timerHost + "/impact/LoggedOut.aspx";
}

function EnforceMaxLength(Control){
    // Forces Text Area Controls to obey MaxLength Property
    var MaxLen = Control.getAttribute? parseInt(Control.getAttribute("MultiLineMaxLength")) : ""
    if (Control.getAttribute && Control.value.length>MaxLen)
        { 
            Control.value=Control.value.substring(0,MaxLen)
        }
}

function checkMaxLength(e, el)
{   
    switch(e.keyCode)
    {
        case 37: // left arrow...
            return true;
        case 38: // up arrow...
            return true;
        case 39: // right arrow...
            return true;
        case 40: // down arrow...
            return true;
        case 8: // backspace arrow...
            return true;
        case 46: // delete arrow...
            return true;
        case 27: // escape arrow...
            el.value = '';
            return true;
        case 35: // end key...
            return true;
        case 36: // home key...
            return true;
    }
    return (el.value.length < el.getAttribute("MultiLineMaxLength"));
}

function checkGradeBookEntry(val)
{
    if (val.length == 0)
        return false;
        
    if (parseInt(val))
    {
        if (val.indexOf(".") != -1)
            return false;
    }
    else
        return false;
        
    return true;
}

function updateLabel(h, v)
{
    h.className = "gradebookLabel";
    h.innerHTML = "<div style='padding-top:3px;'>" + v + "</div>";
}

//function ReEnrollSelectAll(Select) {
//    // Get SourceTableRows
//    var Rows = document.getElementById("SourceTable").getElementsByTagName("tr");
//    for (RowIndex = 0; RowIndex < Rows.length; RowIndex++) {
//        // Get Cells In each Row
//        var RowName = Rows[RowIndex].id;
//        var Cells = document.getElementById(RowName).getElementsByTagName("td");
//        for (CellIndex = 0; CellIndex < Cells.length; CellIndex++) {
//            // Get all Input Controls
//            
//        }
//    }
//}

// Toggle Function
function Toggle(ID) {
    DivID = "div_" + ID;
    ImgID = "img_" + ID;
    var SelectedDiv = document.getElementById(DivID);
    var Clicked = document.getElementById(ImgID);
    if (SelectedDiv.style.display == 'none') {
        SelectedDiv.style.display = 'block';
        Clicked.src = ImageDown.src;
    }
    else {
        SelectedDiv.style.display = 'none';
        Clicked.src = ImageRight.src;
    }
}

// Code from http://stackoverflow.com/questions/901115/get-querystring-with-jquery
function GetQueryStringParameter(name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.href);
    if (results == null) 
        return "";
    else 
        return results[1];
}

