/// <reference path="jquery/jquery-vsdoc.js" />

var jsddm_timeout = 500;
var closetimer = 0;
var ddmenuitem = 0;

function jsddm_open() {
    jsddm_canceltimer();
    jsddm_close();
    ddmenuitem = $(this).find('ul').css('visibility', 'visible');
}

function jsddm_close()
{ if (ddmenuitem) ddmenuitem.css('visibility', 'hidden'); }

function jsddm_timer()
{ closetimer = window.setTimeout(jsddm_close, jsddm_timeout); }

function jsddm_canceltimer() {
    if (closetimer) {
        window.clearTimeout(closetimer);
        closetimer = null;
    }
}


function loadPage() {
    if (typeof EndRequestHandler == 'function') {
        if (typeof Sys == 'undefined') {
            return false;
        }
        else {
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
        }
    }
}

function doFoldout(daObj)
{
	daCurrentObj = daObj.parentNode.nextSibling;
	if(daCurrentObj.nodeType==3)
	{
		daCurrentObj = daCurrentObj.nextSibling;
	}
	toggleDisplay(daCurrentObj,daObj);
	
	daObj.blur();
	return false;
}

function toggleDisplay(daObj,daLinkObj)
{
	daStyleObj = daObj.style;
	if(daStyleObj.display=="" || daStyleObj.display=="none")
	{
		daStyleObj.display="block";
		daLinkObj.className = "sublink-up";
	}
	else if(daStyleObj.display=="block")
	{
		daStyleObj.display="none";
		daLinkObj.className = "sublink";
	}
}

function addRecipient(daObj)
{
	document.getElementById("recipients").value+=daObj.innerHTML + ", ";
}

function checkboxChange(theForm, checker)
{
    var i;
    if (checker.checked == true)
    {
        for(i=0;i<theForm.elements.length;i++)
        {
            if (theForm.elements[i].type == "checkbox")
                theForm.elements[i].checked = true;
        }
    } 
    else 
    {
        for(i=0;i<theForm.elements.length;i++)
        {
            if (theForm.elements[i].type == "checkbox")
                theForm.elements[i].checked = false;
        }
    }
}

function deletePersonalEvent(eventId, phrase, d)
{
	if(confirm(phrase))
		location.href = "DeletePersonalEvent.aspx?eventId=" + eventId + "&date=" + d;
}

function ConfirmAction(phrase)
{
    return confirm(phrase);
}

function CheckAll_portal_nobg(masterCb,cbString)
{
	inputArr = document.getElementsByTagName("input");
	for(i=0;i<inputArr.length;i++)
	{
		if (inputArr[i].type=="checkbox" && inputArr[i].name.indexOf(cbString) >= 1)
			inputArr[i].checked = masterCb.checked;
	}
}

function CheckAll_portal(masterCb, cbString, color)
{
	inputArr = document.getElementsByTagName("input");
	for(i=0;i<inputArr.length;i++)
	{
		if (inputArr[i].type=="checkbox" && inputArr[i].name.indexOf(cbString) >= 1)
		{
			inputArr[i].checked = masterCb.checked;
			highlightRow(inputArr[i], color);
		}
	}
}

function highlightRow (checkbox, color) { 
  var tr; 
  if (checkbox.parentNode) 
  { 
    tr = checkbox.parentNode; 
    while (tr.nodeName.toLowerCase() != 'tr') 
      tr = tr.parentNode; 
  } 
  else if (checkbox.parentElement) 
  { 
    tr = checkbox.parentElement; 
    while (tr.tagName.toLowerCase() != 'tr') 
      tr = tr.parentElement; 
  } 
  if (tr) 
  { 
    if (checkbox.checked) 
    {     
      tr.style.backgroundColor = color; 
    } 
    else 
    { 
      tr.style.backgroundColor = ""; 
    } 
  } 
} 

function SetUniqueRadioButton(nameregex, current)
{
   re = new RegExp(nameregex);
   for(i = 0; i < document.forms[0].elements.length; i++)
   {
      elm = document.forms[0].elements[i]
      if (elm.type == 'radio')
      {
         if (re.test(elm.name))
         {
            var tr; 
            if (elm.parentNode) 
            { 
              tr = elm.parentNode; 
              while (tr.nodeName.toLowerCase() != 'tr') 
              tr = tr.parentNode; 
            } 
            else if (elm.parentElement) 
            { 
                tr = elm.parentElement; 
                while (tr.tagName.toLowerCase() != 'tr') 
                tr = tr.parentElement; 
            } 
            if (tr) 
            { 
                tr.style.backgroundColor = "";  
            } 
            elm.checked = false;
         }
      }
   }
   
   current.checked = true;
   
    var tr2; 
    if (current.parentNode) 
    { 
    tr2 = current.parentNode; 
    while (tr2.nodeName.toLowerCase() != 'tr') 
      tr2 = tr2.parentNode; 
    } 
    else if (current.parentElement) 
    { 
    tr2 = current.parentElement; 
    while (tr2.tagName.toLowerCase() != 'tr') 
      tr2 = tr2.parentElement; 
    } 
    if (tr2) 
    { 
        tr2.style.backgroundColor = '#CCCCCC'; 
    } 
}
		
function CheckMe_portal(me)
{
	if (!me.checked)
	{
		try{document.getElementById(CheckAllId).checked = false;}catch(ex){}
	}
}

function CheckMeNoCounter_portal(me, masterCb)
{
	if (!me.checked)
	{
		document.getElementById(masterCb).checked = false;
	}
}

function CheckContactsChecked(text)
{
	var chkArray = document.getElementsByTagName("input");
	
	for(i=0; i<chkArray.length; i++)
	{
		if((chkArray[i].id.indexOf("ChkContact") != '-1'))
		{
			if(chkArray[i].checked)
				return true;
		}
	}
	alert(text);
	return false;
}

function CheckMessagesChecked(text, text2)
{
	var chkArray = document.getElementsByTagName("input");
	
	for(i=0; i<chkArray.length; i++)
	{
		if((chkArray[i].id.indexOf("ChkItem") != '-1'))
		{
			if(chkArray[i].checked)
				return confirm(text2);
		}
	}
	alert(text);
	return false;
}	

//Used to check if any checkbox is checked in a specific object.
function CheckAnyChecked(msgNothingChecked, msgConfirm, objId)
{	
	var rootObj = document;
	if(objId!=null)
	{
		rootObj = document.getElementById(objId);
		if(rootObj==null)
			return false;
	}
	var chkArray = rootObj.getElementsByTagName("input");
	
	for(i=0; i<chkArray.length; i++)
	{
		if(chkArray[i].type=="checkbox")
		{
			if(chkArray[i].checked)
			{
				if(msgConfirm != "")
					return confirm(msgConfirm);
				else
					return true;
			}
		}
	}
	alert(msgNothingChecked);
	return false;
}

//This returns the nr of checked checkboxes in a specific object
function CheckNrOfChecked(objId)
{
	var rootObj = document;
	var nrOfCheckedInObj = 0;
	if(objId!=null)
	{
		rootObj = document.getElementById(objId);
		if(rootObj==null)
			return false;
	}
	var chkArray = rootObj.getElementsByTagName("input");
	
	for(i=0; i<chkArray.length; i++)
	{
		if(chkArray[i].type=="checkbox")
		{
			if(chkArray[i].checked)
			{
				nrOfCheckedInObj++;
			}
		}
	}
	return nrOfCheckedInObj;
}

//Used to check if any checkbox is checked in a specific object.
function CheckAnyCheckedNoConfirm(msgNothingChecked, objId)
{	
	var rootObj = document;
	if(objId!=null)
	{
		rootObj = document.getElementById(objId);
		if(rootObj==null)
			return false;
	}
	var chkArray = rootObj.getElementsByTagName("input");
	
	for(i=0; i<chkArray.length; i++)
	{
		if(chkArray[i].type=="checkbox" || chkArray[i].type=="radio")
		{
			if(chkArray[i].checked)
			{
				return true;
			}
		}
	}
	alert(msgNothingChecked);
	return false;
}


function OpenMess(daObj, t, id, read, box, courseid)
{
    trObj = daObj.parentNode.parentNode;
    if(trObj.className.indexOf("unread") != -1)
    {
		//Change color of the table row
		trObj.className = trObj.className.replace("unread","");
		imgObj = trObj.getElementsByTagName("img")[0];
		//Set the image to the "read message" icon
		imgObj.src = imgObj.src.replace("icon_message","icon_message_read");
    }
    if(courseid == null)
	    window.open("message.aspx?messageid=" + id + "&type=" + t + "&read=" + read + "&box=" + box,"","width=600,height=600,resizable,scrollbars");
	else
	    window.open("message.aspx?messageid=" + id + "&type=" + t + "&read=" + read + "&box=" + box + "&courseid=" + courseid,"","width=600,height=600,resizable,scrollbars");
}

var composemesswin = null;

function ComposeMessage(id,type,courseid,replyall)
{
    if(composemesswin == null || composemesswin.closed)
    {
	    strUrl = "composemessage.aspx";
	    if(type!="")
	    {
		    strUrl += "?type=" + type;
	    }
	    else
	    {
		    strUrl += "?type=portal";
	    }
	    if(id!=""){strUrl += "&messageid=" + id;}
	    if(courseid!=""){strUrl += "&courseid=" + courseid;}
    	
	    strUrl += "&replyall=" + replyall;
    	
	    composemesswin = window.open(strUrl,"composemesswin","width=830,height=600,resizable=yes,scrollbars=yes");
	}
	else
	{	    
	    composemesswin.focus();
	}
}

function ForwardMessage(id,courseid)
{
    if(composemesswin == null || composemesswin.closed)
    {
	    strUrl = "composemessage.aspx?type=portal";
	
	    if(id!=""){strUrl += "&messageid=" + id;}
	    if(courseid!=""){strUrl += "&courseid=" + courseid;}
    	
	    strUrl += "&forward=1";
    	
	    composemesswin = window.open(strUrl,"composemessage","width=800,height=600,resizable=yes,scrollbars=yes");
	}
	else
	{
	    composemesswin.focus();
	}
}

//Stuff for the message indicator and the message popup functions.
var objMsgChecker;
function InitMessageChecker()
{
	clearInterval(objMsgChecker);
	CheckMessages();
	objMsgChecker = setInterval(CheckMessages, MsgRequestInterval);
	
	//Only keep the msgchecker going for 30 minutes
	objMsgCheckerAborter = setTimeout(AbortMessageChecker, 1800000);
}

//This stops the object that checks for new messages
function AbortMessageChecker()
{
	clearInterval(objMsgChecker);
}

//This resets the timer object that eventually stops message checking
function ResetMsgCheckerAborter()
{
	if(typeof(objMsgCheckerAborter) != "undefined")
	{
		clearTimeout(objMsgCheckerAborter);
	}
	objMsgCheckerAborter = setTimeout(AbortMessageChecker, 1800000);
}

function CheckMessages()
{
	ajaxSend("GET", MessageXmlUrl + "?refresher=" + escape(new Date()), CheckMessages_handleReturn, null, true);
}

function CheckMessages_handleReturn(xmlObj) {
	var nrUnreadMsgCount = Number(getXmlValue(xmlObj, "messagecount", "val"));
	var hasNewAlerts = (getXmlValue(xmlObj, "hasalerts", "val") == "1");
	var indicatorObj = document.getElementById(StrMessageXmlLinkObj);
	var alertIndicatorObj = document.getElementById(StrAlertXmlLinkObj);
	var counterObj = document.getElementById("spnNrOfNewMessages");
	counterObj.innerHTML = nrUnreadMsgCount;
	if(nrUnreadMsgCount > 0)
	{
		indicatorObj.style.display = "inline"; //Show the indicator
		
		var newMsgNode = xmlObj.getElementsByTagName("newmessage")[0];
		myXmlAttributes = xmlAttributes(newMsgNode);
		var msgId = myXmlAttributes["id"];
		if(msgId != "")
		{
			//Pop up the new message
			ShowMsgPopup(newMsgNode.firstChild.nodeValue);
		}
	}
	else
	{
		indicatorObj.style.display = "none";
	}
	
	if(hasNewAlerts)
	{
		alertIndicatorObj.style.display = "inline";
	}
	else
	{
		alertIndicatorObj.style.display = "none";
	}
}

function ShowMsgPopup(strMsg) {
    if (typeof jQuery != 'undefined') {
        var fromId = $('<div />').append(strMsg).find("#hidFromId").val();
        var url = UrlMessageIndicator + 'pid=' + fromId;
        var messageDiv = document.getElementById("divNewMessage");
        if (messageDiv == null) {
            messageDiv = document.createElement("div");
            messageDiv.id = "divNewMessage";
            messageDiv.s
            document.getElementsByTagName("body")[0].appendChild(messageDiv);
            $("#divNewMessage").append("<div id='messageIndicator'></div>");
            $("#divNewMessage").append("<div id='messageIndicatorContent'></div>");
            $("#divNewMessage").dialog({
                bgiframe: true,
                title: 'New Message',
                height: 'auto',
                width: '150px',
                position: [50, 50],
                modal: false,
                autoOpen: false,
                draggable: true,
                open: function(event, ui) {
                    $(".ui-dialog").css('font-size', '11px');
                    $("#messageIndicator").load(url);
                    setTimeout("$('#divNewMessage').dialog('destroy').remove();", 15000);
                },
                overlay: {
                    backgroundColor: '#000',
                    opacity: 0.5
                }
            });
        }

        $("#divNewMessage").dialog('open').parent().effect('bounce');
        $("#messageIndicatorContent").html(strMsg);
        ajaxSend("GET", CloseMsgAjaxUrl + "?refresher=" + escape(new Date()));
        try { 
            if (typeof soundManager != 'undefined')
                soundManager.play('newmess');
        } catch (e) { };
    }
    else
        ShowMsgPopup_no_jquery(strMsg);
}

function ShowMsgPopup_no_jquery(strMsg)
{
	var messageDiv = document.getElementById("divNewMessage");
	if(messageDiv == null)
	{
		messageDiv=document.createElement("div");
		document.getElementsByTagName("body")[0].appendChild(messageDiv);
	}
	
	messageDiv.className = "newmessage";
	messageDiv.id = "divNewMessage";
	messageDiv.innerHTML = strMsg;
	
	//Show the course dropdown list on IE
	if(browserIsIE() && IsInCourse)
	{
		if(getDdlCoursesObj() != null)
		{
			getDdlCoursesObj().style.display = "none";
		}
	}
}

function CloseMsgPopup(daObj)
{
	ajaxSend("GET", CloseMsgAjaxUrl + "?refresher=" + escape(new Date()));
	$("#divNewMessage").dialog('close');
	$("#divNewMessage").dialog('destroy');
}

function ReadNewMessage(daObj, msgId)
{
	var url;
	CloseMsgPopup(daObj);
	if(IsInCourse)
	{
		url = ReadNewMsgUrl + "?messageid=" + msgId + "&courseid=" + CourseID + "&type=portal&read=0&box=1&fromedu=1";
	}
	else
	{
		url = ReadNewMsgUrl + "?messageid=" + msgId + "&type=portal&read=0&box=1";
	}
	url += "&popupwin=1";
	OpenWin(url, 640, 480);
}

function OpenAlerts(daObj)
{
	OpenWin(AlertsUrl, 320, 320);
	daObj.blur();
	return false;
}

//END Stuff for the message indicator and the message popup functions.


function CloseCourse()
{
	ajaxSend("GET", CloseCourseUrl + "?refresher=" + escape(new Date()), '', null, false);
}

function OpenHelpWin(url)
{
	window.open(url,"","width=700,height=500,toolbar=yes,scrollbars=yes,resizable=yes");
}

function OpenAlertWin(url)
{
	window.open(url,"","width=360,height=270,toolbar=no,scrollbars=yes,resizable=no");
}

function OpenAboutWin(url, width, height)
{
	window.open(url,"","width=" + width + ",height=" + height + ",scrollbars=yes,resizable=yes");
}

function OpenWin(url, width, height)
{
	window.open(url,"","width=" + width + ",height=" + height + ",scrollbars=yes,resizable=yes");
	return false;
}

function OpenEmailWin()
{
	window.open("SendEmail.aspx","","width=400,height=450,scrollbars=no,resizable=yes");
}

function OpenFullscreenWin(url) {
    window.open(url, '_blank', 'fullscreen=yes,location=yes,menubar=yes,resizable=yes,scrollbars=yes,status=yes,toolbar=yes,channelmode=no,directories=yes'); 
}

function OpenNonFullscreenWin(url) {
    window.open(url, '_blank', 'location=yes,menubar=yes,resizable=yes,scrollbars=yes,status=yes,toolbar=yes,channelmode=no,directories=yes');
}

//Functions to parse querystring values
function PageQuery(q) 
{
	if(q.length > 1) this.q = q.substring(1, q.length);
	else this.q = null;
	
	this.keyValuePairs = new Array();
	if(q) 
	{
		for(var i=0; i < this.q.split("&").length; i++) 
		{
		this.keyValuePairs[i] = this.q.split("&")[i];
		}
	}
	
	this.getKeyValuePairs = function() { return this.keyValuePairs; }
	
	this.getValue = function(s) 
	{
		for(var j=0; j < this.keyValuePairs.length; j++) 
		{
			if(this.keyValuePairs[j].split("=")[0] == s)
				return this.keyValuePairs[j].split("=")[1];
		}
		return false;
	}
	
	this.getParameters = function() 
	{
		var a = new Array(this.getLength());
		for(var j=0; j < this.keyValuePairs.length; j++) 
		{
			a[j] = this.keyValuePairs[j].split("=")[0];
		}
		return a;
	}
	this.getLength = function() { return this.keyValuePairs.length; }
}

function queryString(key, srcWin)
{
	var page = new PageQuery(srcWin.location.search);
	return unescape(page.getValue(key));
}

function getQueryStringItem(key, srcWin)
{
	if(queryString(key, srcWin)=='false')
	{
		return "_notfound_";
	}
	else
	{
		return queryString(key, srcWin);
	}
}
//END Functions to parse querystring values

//Functions to disable/enable and fade/defade links
function disableLink(daObj)
{
	if(!daObj) return;
	if(daObj.className.indexOf("disabled") == -1)
	{
		daObj.className += " disabled";
	}
	daObj.disabled=true;
}
function enableLink(daObj)
{
	daObj.className = daObj.className.replace("disabled","");
	daObj.disabled=false;
}
function fadeLink(daObj)
{
	if(!daObj) return;
	if(daObj.className.indexOf("faded") == -1)
	{
		daObj.className += " faded";
	}
	daObj.disabled=true;
}
function deFadeLink(daObj)
{
	daObj.className = daObj.className.replace("faded","");
	daObj.disabled=false;
}
//END Functions to disable/enable and fade/defade links

//Function to check if a link is disabled
function linkIsDisabled(daObj)
{
	if(daObj.className!=null)
	{
		return(daObj.className.indexOf("disabled") != -1);
	}
	else
	{
		return true;
	}
}

//Processes xml node attributes into an array and returns it
function xmlAttributes(oNode)
{
	var tAttributes={};
	for (var i=0; i<oNode.attributes.length; ++i)
		tAttributes[oNode.attributes.item(i).name]=oNode.attributes.item(i).value;
	return tAttributes;
}

//returns the value of a specific attribute from a specific node
function getXmlValue(xmlObj, nodeName, attName)
{
	return xmlAttributes(xmlObj.getElementsByTagName(nodeName)[0])[attName];
}

//Function to check for Internet Explorer
function browserIsIE()
{
	ie = document.all?true:false;
	return ie;
}

//Scott Andrew's cross browser event handling code
function addEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    //alert("Handler could not be attached");
  }
}
function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    //alert("Handler could not be removed");
  }
}
//END Scott Andrew's cross browser event handling code


/*Function that adds a style rule to the provided document object*/
function createStyleRule(oDoc, selector, declaration) {
    if (!oDoc.getElementsByTagName ||
      !(oDoc.createElement || oDoc.createElementNS)) return;
    var agt = navigator.userAgent.toLowerCase();
    var is_ie = ((agt.indexOf("msie") != -1) &&  (agt.indexOf("opera") == -1));
    var is_iewin = (is_ie &&  (agt.indexOf("win") != -1));
    var is_iemac = (is_ie &&  (agt.indexOf("mac") != -1));
    if (is_iemac) return; // script doesn't work properly in IE/Mac
    var head = oDoc.getElementsByTagName("head")[0]; 
    var style = (typeof oDoc.createElementNS != "undefined") ?
      oDoc.createElementNS("http://www.w3.org/1999/xhtml", "style") :
      oDoc.createElement("style");
    if (!is_iewin) {
        var styleRule = oDoc.createTextNode(selector + " {" + declaration + "}");
	    style.appendChild(styleRule); // bugs in IE/Win
    }
	style.setAttribute("type", "text/css");
    style.setAttribute("media", "screen"); 
    head.appendChild(style);
    if (is_iewin &&  oDoc.styleSheets &&  oDoc.styleSheets.length > 0) {
        var lastStyle = oDoc.styleSheets[oDoc.styleSheets.length - 1];
        if (typeof lastStyle.addRule == "object") {
            lastStyle.addRule(selector, declaration);
        }
    }
}

// threadsafe asynchronous XMLHTTPRequest code
function ajaxSend(sendMethod, url, callback, objToSend, returnXml, asyncCall, setUtf8Header)
{	
	if(typeof(asyncCall) == "undefined")
	{
		asyncCall = true;
	}
	if(typeof(setUtf8Header) == "undefined")
	{
		setUtf8Header = false;
	}
	// we use a javascript feature here called "inner functions"
	// using these means the local variables retain their values after the outer function
	// has returned. this is useful for thread safety, so
	// reassigning the onreadystatechange function doesn't stomp over earlier requests.
	
	function ajaxBindCallback()
	{
		if (ajaxRequest.readyState == 4)
		{
			if (ajaxRequest.status == 200)
			{
				if (ajaxCallback)
				{
					//If the user has been logged out, the html of the default aspx page will be returned.
					//Check for the presence of a "DOCTYPE"-string. This will most likely mean that the user has been logged out.
					if(ajaxRequest.responseText.toLowerCase().indexOf("doctype html public") > -1) { return; }
					
					if(returnXml)
					{
						ajaxCallback(ajaxRequest.responseXML);
					}
					else
					{
						ajaxCallback(ajaxRequest.responseText);
					}
				}
				else
				{
					//alert('_no callback defined');
				}
			}
			else
			{
				//alert("_There was a problem retrieving the xml data:\n" + ajaxRequest.status + ":\t" + ajaxRequest.statusText + "\n" + ajaxRequest.responseText);
			}
		}
	}

	// use a local variable to hold our request and callback until the inner function is called...
	var ajaxRequest = null;
	var ajaxCallback = callback;
	// bind our callback then hit the server...
	if (window.XMLHttpRequest)
	{
		// moz et al
		ajaxRequest = new XMLHttpRequest();
		ajaxRequest.onreadystatechange = ajaxBindCallback;
		ajaxRequest.open(sendMethod, url, asyncCall);
		if(objToSend)
		{
			if(setUtf8Header)
			{
				ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
			}
			ajaxRequest.send(objToSend);
		}
		else
		{
			ajaxRequest.send(null);
		}
	}
	else if (window.ActiveXObject)
	{
		// ie
		ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
		if (ajaxRequest) 
		{
			ajaxRequest.onreadystatechange = ajaxBindCallback;
			ajaxRequest.open(sendMethod, url, true);
			if(objToSend)
			{
				//If the post method is used, set the proper header
				if(sendMethod.toLowerCase()=="post")
				{
					ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
				}
				ajaxRequest.send(objToSend);
			}
			else
			{
				ajaxRequest.send(null);
			}
		}
	}
}
function handleScormSaveCallback(responseObj)
{
	if(debug)
	{
		alert(responseObj);
	}
}

//Ska tas bort
function ajaxSend2(sendMethod, url, callback, objToSend, returnXml, asyncCall, setUtf8Header)
{	
	if(typeof(asyncCall) == "undefined")
	{
		asyncCall = true;
	}
	if(typeof(setUtf8Header) == "undefined")
	{
		setUtf8Header = false;
	}
	// we use a javascript feature here called "inner functions"
	// using these means the local variables retain their values after the outer function
	// has returned. this is useful for thread safety, so
	// reassigning the onreadystatechange function doesn't stomp over earlier requests.
	
	function ajaxBindCallback()
	{
		if (ajaxRequest.readyState == 4)
		{
			if (ajaxRequest.status == 200)
			{
				if (ajaxCallback)
				{
					//If the user has been logged out, the html of the default aspx page will be returned.
					//Check for the presence of a "DOCTYPE"-string. This will most likely mean that the user has been logged out.
					if(ajaxRequest.responseText.toLowerCase().indexOf("doctype html public") > -1) { return; }
					
					if(returnXml)
					{
						ajaxCallback(ajaxRequest.responseXML);
					}
					else
					{
						ajaxCallback(ajaxRequest.responseText);
					}
				}
				else
				{
					//alert('_no callback defined');
				}
			}
			else
			{
				//alert("_There was a problem retrieving the xml data:\n" + ajaxRequest.status + ":\t" + ajaxRequest.statusText + "\n" + ajaxRequest.responseText);
			}
		}
	}

	// use a local variable to hold our request and callback until the inner function is called...
	var ajaxRequest = null;
	var ajaxCallback = callback;
	// bind our callback then hit the server...
	if (window.XMLHttpRequest)
	{
		// moz et al
		ajaxRequest = new XMLHttpRequest();
		ajaxRequest.onreadystatechange = ajaxBindCallback;
		ajaxRequest.open(sendMethod, url, asyncCall);
		if(objToSend)
		{
			if(setUtf8Header)
			{
				ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
			}
			//alert("Save: "+url+"  "+(new XMLSerializer()).serializeToString(objToSend));
			ajaxRequest.send(objToSend);
		}
		else
		{
		    //alert("Save: "+ url);
			ajaxRequest.send(null);
		}
	}
	else if (window.ActiveXObject)
	{
		// ie
		ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
		if (ajaxRequest) 
		{
			ajaxRequest.onreadystatechange = ajaxBindCallback;
			ajaxRequest.open(sendMethod, url, true);
			if(objToSend)
			{
				//If the post method is used, set the proper header
				if(sendMethod.toLowerCase()=="post")
				{
					ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
				}
				ajaxRequest.send(objToSend);
			}
			else
			{
				ajaxRequest.send(null);
			}
		}
	}
}

//Used to retrieve XML for scormdoc in mozilla, need to be "synchronous".
function getStartXml(url){

        var ajaxRequest = null;
        ajaxRequest = new XMLHttpRequest();
		ajaxRequest.open("GET", url, false);
		ajaxRequest.send(null);
		if (ajaxRequest.status == 200) {
		    var str = ajaxRequest.responseText;
		    //alert("Loaded: "+str);
		    return (new DOMParser()).parseFromString(str, "text/xml");
		}
		else
		{
		    return "";
	    }
}

//The code below is still in use by some functions
var xmlhttp=getXmlHttpRequestObj();
function getXmlHttpRequestObj()
{
	//CODE TO CREATE XMLHTTPREQUEST OBJECT
	var daObj = false;
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	// JScript gives us Conditional compilation, we can cope with old IE versions.
	// and security blocked creation of the objects.
	try 
	{
		daObj = new ActiveXObject("Msxml2.XMLHTTP");
	} 
	catch (e) 
	{
		try 
		{
			daObj = new ActiveXObject("Microsoft.XMLHTTP");
		} 
		catch (E)
		{
			daObj = false;
		}
	}
	@end @*/
	if (!daObj && typeof XMLHttpRequest!='undefined')
	{
		daObj = new XMLHttpRequest();
	}
	if(!daObj && browserIsIE())
		alert("Could not create the xml object. To use this page you must adjust the security settings in your browser to \"medium\"");
	
	return daObj;
	//END CODE TO CREATE XMLHTTPREQUEST OBJECT
}

function callInProgress(myXmlHttp) 
{
    //alert("\"" + xmlhttp.readyState + "\"" );
    switch (myXmlHttp.readyState) 
    {
        case 1:
            return true;
			break;
		case 2:
            return true;
			break;
		case 3:
            return true;
			break;
        //case 0 or 4
        default:
            return false;
			break;
    }
}

//This hooks up a fixed version of WebForm_FireDefaultButton ;
try { addEvent(window, "load", SetNewDefaultButtonScript); } catch(ex){}
var __defaultFired = false; //Fix after.NET patch 2006-10

function SetNewDefaultButtonScript()
{
	WebForm_FireDefaultButton = WebForm_FireDefaultButton_LUVIT;
}

function WebForm_FireDefaultButton_LUVIT(event, target) {
	if (!__defaultFired && event.keyCode == 13 && !(event.srcElement && (event.srcElement.tagName.toLowerCase() == "textarea"))) {
		var defaultButton;
		if (__nonMSDOMBrowser) {
			defaultButton = document.getElementById(target);
		}
		else {
			defaultButton = document.all[target];
		}
		if (defaultButton && typeof(defaultButton.click) != "undefined") {
			__defaultFired = true;
			defaultButton.click();
			event.cancelBubble = true;
			if (event.stopPropagation) event.stopPropagation();
			return false;
		}
		else if(defaultButton && defaultButton.tagName.toLowerCase() == "a") {
			//We're dealing with a linkbutton and must activate the href, rather than triggering the click event
			eval(defaultButton.href);
			//top.location = defaultButton.href;
			event.cancelBubble = true;
			if (event.stopPropagation) event.stopPropagation();
			return false;
		}
	}
}

function ViewAttachment(url)
{
	window.open(url,'',"width=700,height=500,scrollbars=yes,resizable=yes");
}

function openRSS(strUrl)
{
	window.open(strUrl,"","width=700,height=500,resizable=yes,scrollbars=yes");
}
function noAction()
{
    //Used to set href to noaction value.
}

//Saves the active tab of the Ajax tabcontainer on postback
function OnClientActiveTabChanged(sender, args) {
    sender.get_clientStateField().value = sender.saveClientState();
}

//Validates date in ajax calendar extender
function CalendarExtenderDate_Validate(sender, args) {
    args.Value.match(/^(\d+)-(\d+)-(\d+)$/);

    var yyyy = RegExp.$1;
    var MM = RegExp.$2 - 1;
    var dd = RegExp.$3;

    dte = new Date(yyyy, MM, dd);

    args.IsValid = false;
    if (dte.getFullYear() == yyyy && dte.getMonth() == MM && dte.getDate() == dd)
        args.IsValid = true;
}


function getLuvitTopPage()
{
    try
    {
        return getLuvitTopPageRecursiveWithALongNameThatIsUnlikelyToBeFoundElsewhere(1);
    }
    catch(e)
    {
        // This can be caused by differences between http and https in the frames.
        // Thus it will not work right if Luvits top frame is in a parent frame.
        return top; 
    }
}


function getLuvitTopPageRecursiveWithALongNameThatIsUnlikelyToBeFoundElsewhere(level)
{
    if (self == top || !parent || !parent.getLuvitTopPageRecursiveWithALongNameThatIsUnlikelyToBeFoundElsewhere)
    {
        return self;
    }
    else
    {
        //alert("LuvitTopPage search level => " + level + ", url" + document.URL);
        return parent.getLuvitTopPageRecursiveWithALongNameThatIsUnlikelyToBeFoundElsewhere(level + 1);
    }
}



function URLEncode(string) {
    string = string.replace(/\r\n/g, "\n");
    var utftext = "";

    for (var n = 0; n < string.length; n++) {

        var c = string.charCodeAt(n);

        if (c < 128) {
            utftext += String.fromCharCode(c);
        }
        else if ((c > 127) && (c < 2048)) {
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
        }
        else {
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
        }

    }

    return utftext;
}

