updateProgress();

function AICCManager() {

	this.getParameterValue = getParameterValue;
	this.setParameterValue = setParameterValue;
	this.getUserData = getUserData;
	this.setUserData = setUserData;
	this.load = load;
	this.unload = unload;
	this.available = available;
		
	var params = new Array();
	params["lesson_location"] = "end";
	params["lesson_status"] = "NA";
	params["score"] = "0";
	params["time"] = "0";
	params["data"] = "";
	
	var aicc_url = parent.getAiccURL();
	var aicc_sid = parent.getAiccSID();
	
	function available() {
	    return (aicc_url != null && aicc_sid != null);
	}
	
	function getParameterValue(name) {
		return params[name];
	}
	
	function setParameterValue(name, value) {
		params[name] = value;
	}
	
	function getUserData() {
		return params["data"];
	}
	
	function setUserData(value) {
		params["data"] = value;
	}
	
	function load() {
		send("GetParam");
	}
	
	function unload() {
		send("PutParam");
		send("ExitAU");
	}
	
	// wrap all parameters into a string for POSTing to the server
	function getParameterString() {
		var paramString = "[Core]\r\nlesson_location=" + params["lesson_location"] + "\r\nlesson_status=" + params["lesson_status"] + "\r\nscore=" + params["score"] + "\r\ntime=" + params["time"] + "\r\n[Core_Lesson]\r\ndata=" + params["data"] + "\r\n";
    	return paramString;
	}
	
	// update parameters by passing the server-response-string
	function setParameterString(string) {
		params["lesson_location"] = extractValue("lesson_location", string);
		params["lesson_status"] = extractValue("lesson_status", string);
		params["score"] = extractValue("score", string);
		params["time"] = extractValue("time", string);
		params["data"] = extractValue("data", string);
	}
	
	// send an AICC-command and its parameters to the server and update the parameterlist by the server-response-string 	
	function send(cmd) {
		var request = null;
		var query = "";
		var parameterString = "";
		
		try {
    		if (typeof XMLHttpRequest != 'undefined') {
    		   	request = new XMLHttpRequest();
    		}
    		else if (typeof ActiveXObject != 'undefined') {
    		   	request = new ActiveXObject('Microsoft.XMLHTTP');
    		}
    		request.open("POST", parent.getAiccURL(), false);
    		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    		
    		if (cmd == "PutParam") {
    			parameterString = getParameterString();
    		}
    		query = "Command=" + cmd + "&Version=0&Session_id=" + aicc_sid + "&AICC_Data=" + parameterString;
    		
    		alert("AICC Send: " + query);
    		request.send(query);
    		var responseText = request.responseText;
    		//setParameterString(responseText);
    		alert("AICC Response: " + responseText);
		}
		catch (e) {
		    alert("Security Failure: WBT cannot connect to LMS because it is hosted at a different server");
		}
	}
	
	// utility-function for extracting values from the server-response-string
	function extractValue(parName, string) {
		var a = string.indexOf(parName);
		var b = string.indexOf("=", a) + 1;
		var parValue = string.substring(b, string.indexOf("\r", a));
		return parValue;
	}
	
}

function SCORMManager() {

	this.getParameterValue = getParameterValue;
	this.setParameterValue = setParameterValue;
	this.getUserData = getUserData;
	this.setUserData = setUserData;
	this.load = load;
	this.unload = unload;
	this.available = available;
	
	var mm_adl_API = null;
    var _Debug = false;
    var startDate;
    
    // Define exception/error codes
    var _NoError = 0;
    var _GeneralException = 101;
    var _ServerBusy = 102;
    var _InvalidArgumentError = 201;
    var _ElementCannotHaveChildren = 202;
    var _ElementIsNotAnArray = 203;
    var _NotInitialized = 301;
    var _NotImplementedError = 401;
    var _InvalidSetValue = 402;
    var _ElementIsReadOnly = 403;
    var _ElementIsWriteOnly = 404;
    var _IncorrectDataType = 405;
    
    mm_getAPI();
    
    function available() {
        return mm_adl_API != null;
    }
		
	function getParameterValue(name) {
		return doLMSGetValue(name);
	}
	
	function setParameterValue(name, value) {
		doLMSSetValue(name, value);
	}
	
	function getUserData() {
		return doLMSGetValue("cmi.suspend_data");
	}
	
	function setUserData(value) {
		doLMSSetValue("cmi.suspend_data", value);
	}
	
	function load() {
		mm_adlOnload();
	}
	
	function unload() {
		mm_adlOnunload()
	}
	
	function mm_getAPI() {
      var myAPI = null;
      var tries = 0, triesMax = 500;
      while (tries < triesMax && myAPI == null) {
        window.status = 'Looking for API object ' + tries + '/' + triesMax;
        myAPI = findAPI(window);
        if (myAPI == null && typeof(window.parent) != 'undefined') myAPI = findAPI(window.parent)
        if (myAPI == null && typeof(window.top) != 'undefined') myAPI = findAPI(window.top);
        if (myAPI == null && typeof(window.opener) != 'undefined') if (window.opener != null && !window.opener.closed) myAPI = findAPI(window.opener);
        tries++;
      }
      if (myAPI != null) {
        mm_adl_API = myAPI;
      }
    }

    function findAPI(win) {
      if (typeof(win) != 'undefined' ? typeof(win.API) != 'undefined' : false) {
        if (win.API != null )  return win.API;
      }
      // look in this window's frameset kin (except opener)
      if (win.frames.length > 0)  for (var i = 0 ; i < win.frames.length ; i++);
      {
        if (typeof(win.frames[i]) != 'undefined' ? typeof(win.frames[i].API) != 'undefined' : false)
        {
                 if (win.frames[i].API != null)  return win.frames[i].API;
        }
      }
      return null;
    }

    function mm_adlOnload() {
      if (mm_adl_API != null) {
        var api = mm_adl_API;
        mm_adl_API.LMSInitialize("");
        var value = api.LMSGetValue("cmi.core._children");
        var errCode = api.LMSGetLastError().toString();
        if (errCode == _NotInitialized) {
             alert('LMS is not initialized');
        }
        else {
             window.status = 'LMS initialized';
        }
      }
    }

    function mm_adlOnunload() {
      if (mm_adl_API != null)  {
        mm_adl_API.LMSCommit("");
        mm_adl_API.LMSFinish("");
      }
    }
    
    function doLMSGetValue(name) {
        var api = mm_adl_API;
        if (api != null) {
            var value = api.LMSGetValue(name);
    	    value = unescape(value);
            var errCode = api.LMSGetLastError().toString();
            if (errCode != _NoError) {
                var errDescription = api.LMSGetErrorString(errCode);
                alert("LMSGetValue("+name+") failed. \n"+ errDescription);
                return "";
            }
            else {
                return value.toString();
            }
         }
         return "";
    }
    
    function doLMSSetValue(name, value) {
       var api = mm_adl_API;
       if (api != null) {
          var result = api.LMSSetValue(name, value);
          if (result.toString() != "true") {
             var err = ErrorHandler();
          }
       }
    }
    
    function doLMSGetLastError() {
       var api = mm_adl_API;
       if (api == null) {
          alert("Unable to locate the LMS's API Implementation.\nLMSGetLastError was not successful.");
          return _GeneralError;
       }
       return api.LMSGetLastError().toString();
    }
    
    function ErrorHandler() {
       var api = mm_adl_API;
       if (api == null) {
          alert("Unable to locate the LMS's API Implementation.\nCannot determine LMS error code.");
    	  return;
       }
       var errCode = api.LMSGetLastError().toString();
       if (errCode != _NoError) {
          var errDescription = api.LMSGetErrorString(errCode);
          if (_Debug == true) {
             errDescription += "\n";
             errDescription += api.LMSGetDiagnostic(null);
          }
          alert(errDescription);
       }
       return errCode;
    }
	
}

function LocalSCORMManager() {

	this.getParameterValue = getParameterValue;
	this.setParameterValue = setParameterValue;
	this.getUserData = getUserData;
	this.setUserData = setUserData;
	this.load = load;
	this.unload = unload;
	this.available = available;
	
	function available() {
	    return true;
	}
	
	// not supported by cookies
	function getParameterValue(name) {
		return null;
	}
	// not supported by cookies
	function setParameterValue(name, value) {}
	
	function getUserData() {
	    var data = "";
	    if (USE_FLASHCOOKIES) {
    		data = globalCookieData;
    	}
    	else {
	    	data = document.cookie;
	    	data = unescape(data);
		}
		return data;
	}
	
	function setUserData(value) {
	    var expire = new Date();
        expire.setTime(expire.getTime() + 10000 * 24 * 60 * 60 * 1000);
    	    	
    	if (USE_FLASHCOOKIES) {
    		globalCookieData = value;
    	}
    	else {
    		value = escape(value);
    		if (value.length < 4000) {
        		document.cookie = "data" + "=" + value + "; expires=" + expire.toGMTString();
    		}
    	}
    	
    	
	}
	
	function load() {
		document.cookieManager.TGotoFrame("_flash0", 1);
	}
	
	function unload() {
		document.cookieManager.SetVariable("myVar.arg", globalCookieData);
	}
}



function StandardAPI(scormEnabled, aiccEnabled) {

	var standard = null;
    
    this.setUserData = setUserData;
    this.getUserData = getUserData;
    this.getLMSValue = getLMSValue;
    this.setLMSValue = setLMSValue;
    this.load = load;
    this.unload = unload;
	
	// userdata-propertynames will be shorten in order to save cookie-space
	var userDataDefault = "rl{} vl{} bm{} no{}";
	var userData = userDataDefault;
    var shortPropertyMap = new Array();
    shortPropertyMap["recent-location"] = "rl";
    shortPropertyMap["visited-locations"] = "vl";
    shortPropertyMap["bookmarks"] = "bm";
    shortPropertyMap["notes"] = "no";
    	
	if (aiccEnabled || scormEnabled) {
		if (aiccEnabled) {
			lmsManager = new AICCManager();
		}
		if ((!lmsManager || !lmsManager.available()) && scormEnabled) {
		    lmsManager = new SCORMManager();
		}
	}
	if (lmsManager == null || !lmsManager.available()) {
        lmsManager = new LocalSCORMManager();
    }
	
			
    function setUserData(name, value) {
        var userData = lmsManager.getUserData();
        if (userData == "" || userData == null) {
            userData = userDataDefault;
        }
        var a = userData.indexOf(shortPropertyMap[name] + "{") + shortPropertyMap[name].length + 1;
        var b = userData.indexOf("}", a);
        userData = userData.substring(0, a) + value + userData.substring(b);
        lmsManager.setUserData(userData);		
    }
    
    function getUserData(name) {
        var userData = lmsManager.getUserData();
        var a = userData.indexOf(shortPropertyMap[name] + "{") + shortPropertyMap[name].length + 1;
        var b = userData.indexOf("}", a);
        return userData.substring(a, b);
    }
    	
	function getLMSValue(name) {
		return lmsManager.getParameterValue(name);
	}
        
    function setLMSValue(name, value) {
        lmsManager.setParameterValue(name, value);
    }
    
    function load() {
		lmsManager.load();
    }
    
    function unload() {
		lmsManager.unload();
	}
}
