@ou-imdt/css
Version:
The IMDT CSS library styles native elements with light, extendable CSS. It is developed for Interactive Media Developers at the Open University.
1,048 lines (1,010 loc) • 46.3 kB
JavaScript
/*
* This script is provided for inclusion in HTML activities that wish to access
* VLE features such as parameters, attachments, and server-side data.
*
* This is a stub. If running on the VLE, the actual version of these functions
* will automatically be applied using a script from the server that overwrites
* the definitions here.
*
* For new projects, the current version of this file is available on the VLE
* as /mod/oucontent/api/vleapi.1.js (this file is not actually used by the VLE).
* We will try to ensure that old versions of this file keep working.
*/
var VLE = {
/**
* API version of this file (integer changed only when API has
* non-compatible change).
*/
apiversion: 1,
/**
* Point version of this file. Changed for information when there is an
* update to the file version that does not break API, such as adding a new
* function.
*/
pointversion: 33,
/**
* Marked true if sent from server.
*/
serverversion: false,
/**
* Text strings used in display. You can modify these strings if you want
* your activity to be in a foreign language.
*/
strings : {
label_group: 'Group',
option_choose: 'Choose...'
},
/**
* Obtains value of a named parameter or attachment. For attachments, this
* will return the URL of the attachment. If you want to retrieve the
* content of the attachment, use get_attachment function.
*
* Parameter names are restricted to these characters: [A-Za-z0-9_-.] and
* can only be up to 20 characters long.
*
* Because parameters are provided in the URL to index.html, this function
* will not work if the user has clicked a link to a different file within
* your activity, unless you previously ensured that all parameters were
* included in the link.
*
* When not running in the VLE, this code still works to retrieve parameter
* values from the URL.
*
* The following special parameter names are available when running in the
* VLE. They have short names to avoid taking up too much space in the URL.
*
* _c : Course id (number); not set for previews
* _i : Document item id (text; from id= on Item; not set for previews
* or if document item id does not match character restriction)
* _p : Preview id (number); only set for previews
* _a : Activity id (text; from id= on MediaContent); note if no id is set in the tag a temp id is assigned
* _s : Moodle session key for user (text)
* _u : Moodle user id (number)
* _nosave : Flag indicating if the current user is prevented from saving data (e.g. a guest) (text, y if true)
*
* @param name Parameter name
* @return Value of parameter or null if not set
*/
get_param : function(name) {
// Check valid param name
this.check_key(name, 'Invalid param name: ' + name);
// Find in query
var search = String(location.search);
var matches = new RegExp('[?&]' + name + '=([^&]+)').exec(search);
if (matches && matches[1]) {
return decodeURIComponent(matches[1].replace(/\+/g, ' '));
} else {
return null;
}
},
/**
* Gets the content of an attachment. (If you only want to retrieve the
* URL, use get_param function.) The attachment must be an XML or text
* file. For XML support, the filename must end in '.xml'.
*
* You must pass two functions as parameters. Here is an example:
* VLE.get_attachment('frog', function(text, xmldocument) { ... },
* function(message) {...});
*
* In this example the xmldocument parameter is a DOM document object
* containing the XML file result (if any), and the text parameter is a
* string containing the result as plain text. The error parameter
* is a string.
*
* When not running in the VLE, this function may still work but should
* be used for testing purposes only. Specifically, it only works fully
* on Firefox (tested on Firefox 12) and while testing, the attachment must
* be placed in the same folder as the HTML file. It doesn't work in Chrome
* due to browser security restrictions (Chromium issue 47416) and works
* only partially on IE9.
*
* @param name Attachment name
* @param ok Function that is called if the attachment is retrieved OK.
* @param error Function that is called if there is an error.
*/
get_attachment : function(name, ok, error) {
var url = this.get_param(name);
if (!url) {
error('Attachment not found: ' + name);
return;
}
var xml = url.match(/\.xml$/);
this.ajax_get(url, function(req) {
ok(req.responseText, xml ? req.responseXML : null);
}, error);
},
/**
* Return array of objects that give path and url properties
* of all files in the zipped Folder specified (pass name attribute value).
*
* You must pass two functions as parameters. Here is an example:
* VLE.get_folder('frog', function(contents) { ... },
* function(message) {...});
*
* In this example contents would be an array with one element for every
* file in the folder's zip file. Each element is an object containing
* 'path' (e.g. 'frog.jpg' or 'frog/frog.jpg' if within a folder) and 'url'
* (the url of the file, either absolute or relative to the HTML activity's index.html).
*
* When not running in the VLE, this function will still work but should
* have a supporting folder.js file in a directory named after the specified folder
* e.g. frog/frog.folder.js. The js file should return the list of folder info, as
* specified above, in javascript to VLE.get_folder_callback.(this is a jsonp approach)
*
* @param string name Folder name as specified in src attribute.
* @param object ok Function that is called if the attachment is retrieved OK.
* @param object error Function that is called if there is an error (VLE api only).
* @param object t value of this
*/
get_folder : function(name, ok, error, t) {
// Specify this for callbacks.
if (t === undefined) {
t = this;
}
VLE.get_folder_callback = function(data) {
ok.call(t, data);
};
var script = document.createElement('script');
script.async = true;
script .src = name + '/' + name + '.folder.js';
document.getElementsByTagName('head')[0].appendChild(script);
},
/**
* Gets data that was stored on the server.
*
* Note that you should not normally use the last four parameters.
* These are for special cases where you want to access the same
* data across different activities.
*
* You can retrieve data either for the current user (each user has
* independent data), for all users (so that all users access the same
* data), or for a specific group (all users accessing that group access
* the same data). If you specify a specific group, it must be one to
* which the current user has access. Use Boolean true for the current user,
* false for global data, or the string 'g1234' for group id 1234.
*
* You must pass two functions as parameters. Here is an example:
* VLE.get_server_data(true, ['frog'], function(values) { ... },
* function(message) { ...});
*
* In this example the 'values' parameter is a JavaScript object containing
* fields with the same names as you passed (so in this case, values.frog
* would be the value of the data named 'frog' for this user, or an empty
* string '' if no such data had been set). The 'message' parameter is
* an error message string.
*
* When not running in the VLE, always calls the 'error' function with the
* message set to null.
*
* @param userorgroup User, global, or group identifier
* @param names Array of names
* @param ok Function that is called if the data is retrieved OK.
* @param error Function that is called if there is an error.
* @param activityid Activity id (Optional: omit to use current activity)
* @param itemid Document item id (Optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
* @param modname Either 'oucontent' or 'htmlactivity' (Optional; use to get data from a different activity type)
*/
get_server_data : function(userorgroup, names, ok, error, activityid, itemid, courseid, modname) {
window.setTimeout(function() { error(null); }, 0);
},
/**
* Gets all data that was stored on the server.
*
* Note that you should not normally use the last four parameters.
* These are for special cases where you want to access the same
* data across different activities.
*
* You can retrieve data either for the current user (each user has
* independent data), for all users (so that all users access the same
* data), or for a specific group (all users accessing that group access
* the same data). If you specify a specific group, it must be one to
* which the current user has access. Use Boolean true for the current user,
* false for global data, or the string 'g1234' for group id 1234.
*
* You must pass two functions as parameters. Here is an example:
* VLE.get_all_server_data(true, function(values) { ... },
* function(message) { ...});
*
* When not running in the VLE, always calls the 'error' function with the
* message set to null.
*
* @param userorgroup User, global, or group identifier
* @param ok Function that is called if the data is retrieved OK.
* @param error Function that is called if there is an error.
* @param activityid Activity id (Optional: omit to use current activity)
* @param itemid Document item id (Optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
* @param modname Either 'oucontent' or 'htmlactivity' (Optional; use to get data from a different activity type)
*/
get_all_server_data : function(userorgroup, ok, error, activityid, itemid, courseid, modname) {
window.setTimeout(function() { error(null); }, 0);
},
/**
* Stores data on the server for the current user.
*
* Note that you should not normally use the last three parameters.
* These are for special cases where you want to access the same
* data across different activities.
*
* You can set data either for the current user (each user has
* independent data), for all users (so that all users access the same
* data), or for a specific group (all users accessing that group access
* the same data). If you specify a specific group, it must be one to
* which the current user has access. Use Boolean true for the current user,
* false for global data, or the string 'g1234' for group id 1234.
*
* The value of each key-value pair is limited to 64,000 bytes (not
* characters) but can contain any Unicode. Keys may be up to 20 characters
* and must contain only [A-Za-z0-9_-.]. Activity IDs and item IDs have the
* same restriction. (Item IDs are only restricted in this way when you
* set an activity ID for an HTML activity.)
*
* Setting a value to empty string has the effect of deleting that value
* from our database and saving space, so we recommend doing that when
* appropriate.
*
* You must pass two functions as parameters. Here is an example which sets
* the value of the data item 'frog' to 'Kermit':
* VLE.set_server_data(true, {'frog' : 'Kermit'}, function() { ... },
* function(message) { ... });
*
* In this example the 'message' parameter on the second function is an
* error message string. The first function, with no parameters, is called
* if the update succeeds.
*
* When not running in the VLE, always calls the 'error' function with the
* message set to null.
*
* Especially when storing data for all users, you may wish to consider
* race conditions. For example, if you are storing a count value, you may
* use a pattern where based on a user action, you retrieve the current
* value (say, 4) and then set a new one (say, 5). If two users do this at
* a similar time, you will end up setting it to 5 twice. To avoid this
* possibility, you can use the optional previousvalues and retry
* parameters. If you specify previousvalues, this should be the object
* containing the old values of the data, as retrieved by get_server_data.
* The system will only apply the update if the data is the same as this.
* If it is different, then the retry function will be called, passing the
* actual current server data as its single parameter.
*
* Here is an example where we try to set a number to 5 but only if the
* current value is 4. If the current number is not 4 then the last
* function will be called with an object including the 'num' field with
* the actual value.
* VLE.set_server_data(true, {'num' : 5}, function() { ... },
* function(message) { ... }, {'num' : 4}, function(actualvalues) { ... });
*
* @param userorgroup User, global, or group identifier
* @param values JavaScript object containing the key/value pairs to set
* @param ok Function that is called if the data is set OK.
* @param error Function that is called if there is an error.
* @param previousvalues Previous values (optional)
* @param retry Function that is called if previous values changed (optional)
* @param activityid Activity id (optional: omit to use current activity)
* @param itemid Document item id (optional; omit to use current document)
* @param courseid Course numeric id (optional; omit to use current course)
*/
set_server_data : function(userorgroup, values, ok, error, previousvalues, retry,
activityid, itemid, courseid) {
window.setTimeout(function() { error(null); }, 0);
},
/**
* Sets exported response data on the server for the current user.
*
* The exported data is set as arbitrary HTML which will be included if
* the student uses the 'Export responses' option.
*
* If you want to clear the value (as if the user had not saved one), then
* set html to an empty string.
*
* HTML should be plain HTML with no styling (no CSS and no HTML attributes
* that control styling). It should appear completely plain. (This is because
* it needs to work with the RTF converter.)
*
* Note that you should not normally use the last three parameters.
* These are for special cases where you want to access the same
* data across different activities.
*
* You must pass two functions as parameters. Here is an example which sets
* the value of the data item 'frog' to 'Kermit':
* VLE.set_server_data(true, {'frog' : 'Kermit'}, function() { ... },
* function(message) { ... });
*
* In this example the 'message' parameter on the second function is an
* error message string. The first function, with no parameters, is called
* if the update succeeds.
*
* When not running in the VLE (e.g. in a EPUB3 document) it always calls
* the 'error' function with the message set to null.
*
* @param html String containing HTML code for use if exported
* @param ok Function that is called if the data is set OK.
* @param error Function that is called if there is an error.
* @param activityid Activity id (optional: omit to use current activity)
* @param itemid Document item id (optional; omit to use current document)
* @param courseid Course numeric id (optional; omit to use current course)
*/
set_exported_response : function(html, ok, error, activityid, itemid, courseid) {
window.setTimeout(function() { error(null); }, 0);
},
/**
* Gets a list of all groups that the current user can access.
*
* This method will make an AJAX request the first time it is called on the
* page.
*
* If it succeeds, the 'ok' function will be called with an array of
* grouping objects with fields id, name, and groups; the groups field is
* an array of group objects with fields id, name, and member (boolean).
*
* A special 'all groups' grouping has the name set to '' and id to 0.
*
* If there is an error in AJAX processing, the 'error' function will be
* called with an error message string. The error message will be null if
* this function is used offline.
*
* Staff (sometimes including tutors) have access to groups to which they
* don't belong. This function will return all groups, but you can use the
* 'member' flag if you really want to include only groups they actively
* belong to.
*
* @param ok Function that is called with the array of groupings
* @param error Function called if AJAX request fails
* @param t Optional; value to use as 'this' for callback functions
*/
get_all_groups : function(ok, error, t) {
if (t === undefined) {
t = this;
}
window.setTimeout(function() { error.call(t, null); }, 0);
},
/**
* Gets a list of tutor groups that the current user can access.
*
* This method will make an AJAX request the first time it is called on the
* page.
*
* If it succeeds, the 'ok' function will be called with one parameter.
* This is an array of group objects (representing tutor groups) with
* fields id, name, and member (boolean).
*
* The array will be empty if the user cannot access any tutor groups,
* or if there are no tutor groups on the website.
*
* If there is an error in AJAX processing, the 'error' function will be
* called with an error message string. The error message will be null if
* this function is used offline.
*
* Websites with multiple variants will have multiple sets of tutor groups
* (one per variant). This function returns all groups the user can access
* from any of these, combined into the single array.
*
* Staff (sometimes including tutors) have access to groups to which they
* don't belong. This function will return all groups, but you can use the
* 'member' flag if you really want to include only groups they actively
* belong to.
*
* @param ok Function that is called with the array of groups
* @param error Function called if AJAX request fails
* @param t Optional; value to use as 'this' for callback functions
*/
get_tutor_groups : function(ok, error, t) {
if (t === undefined) {
t = this;
}
window.setTimeout(function() { error.call(t, null); }, 0);
},
/**
* Gets a list of regional groups that the current user can access.
*
* This method will make an AJAX request the first time it is called on the
* page.
*
* If it succeeds, the 'ok' function will be called with one parameter.
* This is an array of group objects (representing regional groups) with
* fields id, name, and member (boolean).
*
* The array will be empty if the user cannot access any regional groups,
* or if there are no regional groups on the website.
*
* If there is an error in AJAX processing, the 'error' function will be
* called with an error message string. The error message will be null if
* this function is used offline.
*
* Websites with multiple variants will have multiple sets of regional
* groups (one per variant). This function returns all groups the user can
* access from any of these, combined into the single array.
*
* Staff (sometimes including tutors) have access to groups to which they
* don't belong. This function will return all groups, but you can use the
* 'member' flag if you really want to include only groups they actively
* belong to.
*
* @deprecated since version 29
* @param ok Function that is called with the array of groups
* @param error Function called if AJAX request fails
* @param t Optional; value to use as 'this' for callback functions
*/
get_regional_groups : function(ok, error, t) {
if (t === undefined) {
t = this;
}
window.setTimeout(function() { error.call(t, null); }, 0);
},
/**
* Gets a list of cluster groups that the current user can access.
*
* This method will make an AJAX request the first time it is called on the
* page.
*
* If it succeeds, the 'ok' function will be called with one parameter.
* This is an array of group objects (representing cluster groups) with
* fields id, name, and member (boolean).
*
* The array will be empty if the user cannot access any cluster groups,
* or if there are no cluster groups on the website.
*
* If there is an error in AJAX processing, the 'error' function will be
* called with an error message string. The error message will be null if
* this function is used offline.
*
* Websites with multiple variants will have multiple sets of cluster
* groups (one per variant). This function returns all groups the user can
* access from any of these, combined into the single array.
*
* Staff (sometimes including tutors) have access to groups to which they
* don't belong. This function will return all groups, but you can use the
* 'member' flag if you really want to include only groups they actively
* belong to.
*
* @param ok Function that is called with the array of groups
* @param error Function called if AJAX request fails
* @param t Optional; value to use as 'this' for callback functions
*/
get_cluster_groups : function(ok, error, t) {
if (t === undefined) {
t = this;
}
window.setTimeout(function() { error.call(t, null); }, 0);
},
/**
* Returns a new <div> containing controls that can be used to select a
* group from a list.
*
* The onchange function will be called when the user selects a group, or
* if one is selected automatically. The function has two parameters;
* first the group object that is selected, and then true (meaning the user
* selected it manually) or false (meaning it's the first one we picked
* for them).
*
* Special behaviour:
* 1. If there are no groups, an empty div (display:none) is returned and
* the onchange function is called with parameter null.
* 2. If there is only one group, an empty div (display:none) is returned
* and the onchange function is called with that group.
*
* The returned div has class="groupselector", so you can style it in CSS.
* Please be aware that the precise HTML contents of the returned div may
* change between VLE releases if we find bugs or make improvements..
*
* You can specify groups in one of three ways:
* 1. An array of groups e.g. returned by VLE.get_tutor_groups(), or from
* within a grouping in VLE.get_all_groups().
* 2. The keywords (strings) 'tutor' or 'regional' or 'cluster'.
* 3. A string beginning with 'grouping:' and followed by a regular
* expression, such as 'grouping:^Tutor groups'; this will automatically
* include all groups from groupings where the name matches the expresison
*
* In all cases, this function returns immediately with a div containing the
* control. In the latter two cases, the control will be hidden (display:none)
* while an AJAX request takes place.
*
* The autoselect option, if enabled, means the system will automatically
* pick the first group in the list (if there are more than one). When
* false, 'Choose...' text will show and onchange will not be called until
* the user selects something.
*
* The offline version of this function behaves as if the user does not
* have any groups (calls onchange with parameter null).
*
* @param groups Array of groups, keyword, or grouping regex
* @param onchange Function to call on change and initial group selection
* @param autoselect True if autoselect is enabled, false to choose if multi
* @param error Function to call if AJAX request fails
* @param t Optional; value to use as 'this' for callback functions
* @return HTML div containing control
*/
make_group_chooser : function(groups, onchange, autoselect, error, t) {
var div = document.createElement('div');
div.style.display = 'none';
if (t === undefined) {
t = this;
}
window.setTimeout(function() { onchange.call(t, null, false); }, 0);
return div;
},
/**
* (Internal function, not recommended for other use.)
* Makes an AJAX GET request and calls the ok function if it succeeds or the
* error function if it fails.
*/
ajax_get : function(url, ok, error) {
// Get the XMLHttpRequest object. On IE we prefer the ActiveX version
// even though it now supports the standard way too, because the ActiveX
// one can access files if run locally.
var req;
if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
} else {
req = new XMLHttpRequest();
}
req.open('GET', url, true);
req.onreadystatechange = function(e) {
if (req.readyState == 4) {
// Status 0 is for local files (testing use only).
if (req.status == 200 || req.status == 0) {
ok(req);
} else {
error('Error ' + req.status + ' loading ' + url);
}
}
};
req.send(null);
},
/**
* Internal use only: Various keys are restricted to a certain regular
* expression. This checks it and throws exception if it doesn't match.
* @param key Key to test
* @param message Message to throw if it fails test
*/
check_key : function(key, message) {
if (key === null || !key.match(/^[A-Za-z0-9._-]{1,20}$/)) {
throw message;
}
},
/**
* Obtains information about the context where this activity has been
* embedded. The information is returned as a JavaScript object which
* includes the following fields (more fields may be added later).
*
* Fields that correspond directly to CSS values:
* - backgroundColor (of surrounding area, e.g. '#ffffff')
* - fontSize (of main body text, e.g. '0.875em')
* - color (of main body text, e.g. '#1a1a1a')
* - fontFamily (of main body text, e.g. 'Arial, sans-serif')
* - lineHeight (of main body text, e.g. '1.4')
* - marginBottom (of paragraphs in main body text, e.g. '10px')
*
* Extra fields:
* - variant (alternate text colour for certain headings or
* highlights, depending on selected VLE theme)
*/
get_embed_context : function() {
return {
backgroundColor: '#ffffff',
fontSize: '0.875em',
color: '#1a1a1a',
fontFamily: 'Arial, sans-serif',
lineHeight: '1.4',
marginBottom: '0.5em',
variant: '#e80074'
};
},
/**
* Reports a user accessing this experiment, for the analytics system.
*
* If using the analytics system, you must call this function before any
* of the other report_ functions. This function should usually be called
* on each page load. (The system counts a 'visit' only once per user
* session, so repeated visit reports within the same session will be
* safely ignored.)
*
* You can optionally pass an 'error' function with one parameter (error
* message). If you don't supply this value, errors will be ignored.
*
* When not running in the VLE, always calls the 'error' function (if
* provided) with the message set to null.
*
* @param error Function that is called if there is an error (Optional)
* @param activityid Activity id (Optional: omit to use current activity)
* @param itemid Document item id (Optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
*/
report_visit : function(error, activityid, itemid, courseid) {
if (typeof error !== undefined) {
error(null);
}
},
/**
* Reports a counted event for analytics.
*
* Example: In an activity about examining rock samples, you want to
* provide information about how many rock samples the user examined. To
* achieve this, call report_count each time the user examines a rock
* sample.
*
* The short name and display name identify the event. The short name is
* subject to the same restrictions as other identifiers (20 characters).
* The display name can be any text up to 40 characters and will be used
* to display to user when showing statistics. Although the display name is
* supplied with each function call, it is actually only stored once; if
* you change the display name, that will change the display name for all
* previous events that used the same short name.
*
* You can optionally pass an 'error' function with one parameter (error
* message). If you don't supply this value, errors will be ignored.
*
* When not running in the VLE, always calls the 'error' function (if
* provided) with the message set to null.
*
* @param shortname Short name of event (Optional; see above)
* @param displayname Display name of event (Optional; see above)
* @param error Function that is called if there is an error (Optional)
* @param activityid Activity id (Optional: omit to use current activity)
* @param itemid Document item id (Optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
*/
report_count : function(shortname, displayname, error, activityid, itemid, courseid) {
if (typeof error !== undefined) {
error(null);
}
},
/**
* Starts a timer which will report a quantity of elapsed time for
* analytics.
*
* Example: You want to track the total time users spend with an activity.
* To track this, you call this function as soon as they click a 'Start
* activity' button. You then call the returned 'stop' function whenever
* they finish the activity.
*
* This function is designed only for reporting *cumulative* time, such
* as the total time using an activity, or the total time using a particular
* tab. At present there is no facility to report individual timed events.
*
* If you don't call the stop function, the system will automatically report
* time once per minute until the page containing the activity is closed.
*
* The short name and display name identify the event. The short name is
* subject to the same restrictions as other identifiers (20 characters).
* The display name can be any text up to 40 characters and will be used
* to display to user when showing statistics. Although the display name is
* supplied with each function call, it is actually only stored once; if
* you change the display name, that will change the display name for all
* previous events that used the same short name.
*
* You can optionally pass an 'error' function with one parameter (error
* message). If you don't supply this value, errors will be ignored.
*
* When not running in the VLE, always calls the 'error' function (if
* provided) with the message set to null; the returned 'stop' function
* does nothing.
*
* @param shortname Short name of event (Optional; see above)
* @param displayname Display name of event (Optional; see above)
* @param error Function that is called if there is an error (Optional)
* @param activityid Activity id (Optional: omit to use current activity)
* @param itemid Document item id (Optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
* @return Function which you can call when the elapsed time completes
*/
report_start_timer : function(shortname, displayname, error, activityid, itemid, courseid) {
if (typeof error !== undefined) {
error(null);
}
return function() {};
},
/**
* Resets caches, such as the groups cache. Should not be needed in normal
* situations.
*/
reset_caches : function() {
},
/**
* Sends a web service request and passes the result to the given callback.
*
* This function is currently only available when using HTML activity
* module. You must have configured a named web service in that module
* (i.e. the 'service' parameter here is an identifier which maps to a
* service URL defined in the module settings).
*
* The 'input' parameter should be an object containing name/value pairs.
* The values must be either numbers or strings. Names must follow normal
* key rules and must not start with an underline.
*
* If successful, the 'ok' function will be called with a single parameter
* which is a JavaScript object that contains arbitrary data returned by
* the service.
*
* If unsuccessful, the 'error' function will be called with a single
* parameter that is an error message.
*
* When not running in the VLE, always calls the 'error' function (if
* provided) with message set to null.
*
* @param service Unique identifier for service within this activity
* @param input Input data as an object with name/value pairs
* @param ok Function called after success, with result from service
* @param error Function called if an error occurs (Optional)
* @param t Optional; value to use as 'this' for callback functions
*/
send_service_request : function(service, input, ok, error, t) {
if (typeof(error) !== undefined) {
window.setTimeout(function() { error.call(t, null); }, 0);
}
},
/**
* Gets the URL corresponding to an olink on the course.
*
* If successful, the 'ok' function will be called with a single parameter
* which is the URL.
*
* If unsuccessful, the 'error' function will be called with a single
* parameter that is an error message. This can occur if there is a
* connection problem (no network, session lost, etc.) and also if the
* olink cannot be found.
*
* When not running in the VLE, always calls the 'error' function (if
* provided) with message set to null.
*
* @param targetdoc Target document name
* @param targetptr Specific location in target document (normally blank)
* @param ok Function called after success, with URL
* @param error Function called if an error occurs (Optional)
* @param courseid Course numeric id (Optional; omit to use current course)
* @param t Optional; value to use as 'this' for callback functions
*/
get_olink_url : function(targetdoc, targetptr, ok, error, courseid, t) {
if (t === undefined) {
t = this;
}
if (typeof(errror) !== undefined) {
window.setTimeout(function() { error.call(t, null); }, 0);
}
},
/**
* Gets the list of URL corresponding to an olink on the course.
*
* If successful, the 'ok' function will be called with a single parameter
* which is the list of URL.
*
* If unsuccessful, the 'error' function will be called with a single
* parameter that is an error message. This can occur if there is a
* connection problem (no network, session lost, etc.) and also if the
* olink cannot be found.
*
* When not running in the VLE, always calls the 'error' function (if
* provided) with message set to null.
*
* @param targetdocs List target document name
* @param targetptrs List specific location in target document (normally blank)
* @param ok Function called after success, with URL
* @param error Function called if an error occurs (Optional)
* @param courseid Course numeric id (Optional; omit to use current course)
* @param t Optional; value to use as 'this' for callback functions
*/
get_multiple_olink_url : function(targetdocs, targetptrs, ok, error, courseid, t) {
if (t === undefined) {
t = this;
}
if (typeof(errror) !== undefined) {
window.setTimeout(function() { error.call(t, null); }, 0);
}
},
/**
* Dynamically resizes the iframe that contains this activity so that it
* matches its content.
*
* The width will not be altered - only the height will be changed. It can
* become larger or smaller.
*
* If you want to use this facility you need to call this function every
* time you do something that might affect the size of the iframe.
*/
resize_iframe : function() {
// Find iframe in parent window.
var iframe = window.frameElement;
// If we can't find it, put a message in the console and abort.
if (!iframe) {
if (window.console) {
console.log('VLE.resize_iframe: Unable to find parent iframe');
}
return;
}
// Calculate body height including margins.
var html = document.getElementsByTagName('html')[0];
var styles = getComputedStyle(html);
var totalHeight = parseFloat(styles['marginTop']) +
parseFloat(styles['marginBottom']) + html.offsetHeight;
// Set the height.
iframe.height = 1;
iframe.height = Math.max(totalHeight, document.documentElement.scrollHeight);
},
/**
* Automatic resize iframe when iframe size is changed.
*
* @param observeElement {HTMLElement} Optional; if not passed the document body will be observed
*/
auto_resize_iframe : function(observeElement) {
var element = observeElement ? observeElement : document.body;
if (!element) {
if (window.console) {
console.log('VLE.auto_resize_iframe: Unable to find element for observing');
}
return;
}
var resizeObserver = new ResizeObserver(function() {
setTimeout(function() {
this.resize_iframe();
}.bind(this), 100);
}.bind(this));
resizeObserver.observe(element);
window.matchMedia('print').addEventListener('change', this.resize_iframe);
},
/**
* Determine whether the current user can save data.
*
* If an activity features the ability to save data for the current user, this
* function should be used to disable this behaviour for guests before the
* activity is marked safe for guests on the VLE.
*
* When this returns false, get_server_data and set_server_data will work using
* local storage, and only for the current user (you cannot save course or group
* data).
*
* @return {boolean} true if the current user can save data, false otherwise.
*/
can_save: function() {
return this.get_param('_nosave') !== 'y';
},
/**
* Get fullscreen link.
* Will be called if webthumbnail is false or not set.
* For use with SC and not htmlactivity.
*
* @returns link url or null.
*/
get_fullscreen_link : function() {
return document.location.href;
},
/**
* Gets the server timestamp in milliseconds.
*
* If successful, the 'ok' function will be called with a single parameter
* which is the server unix timestamp.
*
* If unsuccessful, the 'error' function will be called with a single
* parameter that is an error message. This can occur if there is a
* connection problem (no network, session lost, etc.).
*
* When not running online returns browser/device timestamp.
*
* @param ok Function that is called with the server timestamp
* @param error Function called if AJAX request fails
* @param t Optional; value to use as 'this' for callback functions
*
*/
get_server_time : function(ok, error, t) {
if (t === undefined) {
t = this;
}
ok.call(t, Date.now());
},
/**
* Returns if the app is offline.
*
* @returns bool.
*/
is_offline: function () {
return false;
},
/**
* Gets the week details corresponding to a course module on the course.
*
* Works out if the owning document is located in a study planner course and
* within a week and not a special section or subpage.
*
* If so it returns the start and end date times of the section as seen on the planner
* along with a true/false value of if the current time is within that range.
*
* Response format:
* {
* start: 1613174400000, (server time in milliseconds - 00:00:00 on week start date)
* end: 1613779199000, (server time in milliseconds - 23:59:59 on week end date)
* startdate: '10 February 2020', (output local to user timezone, if not 00:00:00 then add time in output)
* enddate: '17 February 2020' (output local to user timezone, if not 23:59:59 then add time in output)
* current: 1, (server time now is in range)
* activities: (array of activities - only returned if requested); format of items:
* {
* id: 1234,
* name: 'my page',
* modname: 'page',
* completed: 1 (1 or 0)
* }
* }
*
* @param ok Function called after success, with URL
* @param error Function called if an error occurs (Optional)
* @param activityid Activity id (optional: omit to use current activity)
* @param itemid Document item id (optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
* @param t Optional; value to use as 'this' for callback functions
* @param activities Optional boolean: Set true to include activities data
*/
get_week : function(ok, error, activityid, itemid, courseid, t, activities) {
if (t === undefined) {
t = this;
}
if (typeof (errror) !== undefined) {
window.setTimeout(function () {
error.call(t, null);
}, 0);
}
},
/**
* Get all weeks data on the course.
*
* Response format:
* [{
* title: "Week 1",
* number: 1,
* start: 1613174400000, (server time in milliseconds - 00:00:00 on week start date)
* end: 1613779199000, (server time in milliseconds - 23:59:59 on week end date)
* startdate: '10 February 2020', (output local to user timezone, if not 00:00:00 then add time in output)
* enddate: '17 February 2020' (output local to user timezone, if not 23:59:59 then add time in output)
* current: 1|0 current date of the section is available to access in a range of time of the section.
* thissection: true|false the section is getting the API.
* activities: (array of activities - only returned if requested); format of items:
* {
* id: 1234,
* name: 'my page',
* modname: 'page',
* completed: 1 (1 or 0)
* }
* }]
*
* @param ok Function called after success, with URL
* @param error Function called if an error occurs (Optional)
* @param activityid Activity id (optional: omit to use current activity)
* @param itemid Document item id (optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
* @param t Optional; value to use as 'this' for callback functions
* @param activities Optional boolean: Set true to include activities data
*/
get_all_weeks: function(ok, error, activityid, itemid, courseid, t, activities) {
if (t === undefined) {
t = this;
}
if (typeof (errror) !== undefined) {
window.setTimeout(function () {
error.call(t, null);
}, 0);
}
},
/**
* Gets the completion details corresponding to a course module on the course.
*
* Response format:
* {
* completed: 1/0, (completed flag)
* }
*
* @param ok Function called after success, with URL
* @param error Function called if an error occurs (Optional)
* @param activityid Activity id (optional: omit to use current activity)
* @param itemid Document item id (optional; omit to use current document)
* @param courseid Course numeric id (Optional; omit to use current course)
* @param t Optional; value to use as 'this' for callback functions
*/
get_completion : function(ok, error, activityid, itemid, courseid, t) {
if (t === undefined) {
t = this;
}
if (typeof (errror) !== undefined) {
window.setTimeout(function () {
error.call(t, null);
}, 0);
}
}
};