/*
MIT License - https://bitbucket.org/pellepim/jstimezonedetect/src/default/LICENCE.txt
For usage and examples, visit:
http://pellepim.bitbucket.org/jstz/
Copyright (c) Jon Nylander
*/
var jstz = function() {
var HEMISPHERE_SOUTH = "s", consts = {DAY:864E5, HOUR:36E5, MINUTE:6E4, SECOND:1E3, BASELINE_YEAR:2014, MAX_SCORE:864E6, AMBIGUITIES:{"America/Denver":["America/Mazatlan"], "Europe/London":["Africa/Casablanca"], "America/Chicago":["America/Mexico_City"], "America/Asuncion":["America/Campo_Grande", "America/Santiago"], "America/Montevideo":["America/Sao_Paulo", "America/Santiago"], "Asia/Beirut":["Asia/Amman", "Asia/Jerusalem", "Europe/Helsinki", "Asia/Damascus", "Africa/Cairo", "Asia/Gaza", "Europe/Minsk"],
"Pacific/Auckland":["Pacific/Fiji"], "America/Los_Angeles":["America/Santa_Isabel"], "America/New_York":["America/Havana"], "America/Halifax":["America/Goose_Bay"], "America/Godthab":["America/Miquelon"], "Asia/Dubai":["Asia/Yerevan"], "Asia/Jakarta":["Asia/Krasnoyarsk"], "Asia/Shanghai":["Asia/Irkutsk", "Australia/Perth"], "Australia/Sydney":["Australia/Lord_Howe"], "Asia/Tokyo":["Asia/Yakutsk"], "Asia/Dhaka":["Asia/Omsk"], "Asia/Baku":["Asia/Yerevan"], "Australia/Brisbane":["Asia/Vladivostok"],
"Pacific/Noumea":["Asia/Vladivostok"], "Pacific/Majuro":["Asia/Kamchatka", "Pacific/Fiji"], "Pacific/Tongatapu":["Pacific/Apia"], "Asia/Baghdad":["Europe/Minsk", "Europe/Moscow"], "Asia/Karachi":["Asia/Yekaterinburg"], "Africa/Johannesburg":["Asia/Gaza", "Africa/Cairo"]}}, get_date_offset = function get_date_offset(date) {
var offset = -date.getTimezoneOffset();
return offset !== null ? offset : 0;
}, lookup_key = function lookup_key() {
var january_offset = get_date_offset(new Date(consts.BASELINE_YEAR, 0, 2)), june_offset = get_date_offset(new Date(consts.BASELINE_YEAR, 5, 2)), diff = january_offset - june_offset;
if (diff < 0) {
return january_offset + ",1";
} else {
if (diff > 0) {
return june_offset + ",1," + HEMISPHERE_SOUTH;
}
}
return january_offset + ",0";
}, get_from_internationalization_api = function get_from_internationalization_api() {
var format, timezone;
if (typeof Intl === "undefined" || typeof Intl.DateTimeFormat === "undefined") {
return;
}
format = Intl.DateTimeFormat();
if (typeof format === "undefined" || typeof format.resolvedOptions === "undefined") {
return;
}
timezone = format.resolvedOptions().timeZone;
if (timezone && (timezone.indexOf("/") > -1 || timezone === "UTC")) {
return timezone;
}
}, dst_dates = function dst_dates(year) {
var yearstart = (new Date(year, 0, 1, 0, 0, 1, 0)).getTime();
var yearend = (new Date(year, 12, 31, 23, 59, 59)).getTime();
var current = yearstart;
var offset = (new Date(current)).getTimezoneOffset();
var dst_start = null;
var dst_end = null;
while (current < yearend - 864E5) {
var dateToCheck = new Date(current);
var dateToCheckOffset = dateToCheck.getTimezoneOffset();
if (dateToCheckOffset !== offset) {
if (dateToCheckOffset < offset) {
dst_start = dateToCheck;
}
if (dateToCheckOffset > offset) {
dst_end = dateToCheck;
}
offset = dateToCheckOffset;
}
current += 864E5;
}
if (dst_start && dst_end) {
return {s:find_dst_fold(dst_start).getTime(), e:find_dst_fold(dst_end).getTime()};
}
return false;
}, find_dst_fold = function find_dst_fold(a_date, padding, iterator) {
if (typeof padding === "undefined") {
padding = consts.DAY;
iterator = consts.HOUR;
}
var date_start = (new Date(a_date.getTime() - padding)).getTime();
var date_end = a_date.getTime() + padding;
var offset = (new Date(date_start)).getTimezoneOffset();
var current = date_start;
var dst_change = null;
while (current < date_end - iterator) {
var dateToCheck = new Date(current);
var dateToCheckOffset = dateToCheck.getTimezoneOffset();
if (dateToCheckOffset !== offset) {
dst_change = dateToCheck;
break;
}
current += iterator;
}
if (padding === consts.DAY) {
return find_dst_fold(dst_change, consts.HOUR, consts.MINUTE);
}
if (padding === consts.HOUR) {
return find_dst_fold(dst_change, consts.MINUTE, consts.SECOND);
}
return dst_change;
}, windows7_adaptations = function windows7_adaptions(rule_list, preliminary_timezone, score, sample) {
if (score !== "N/A") {
return score;
}
if (preliminary_timezone === "Asia/Beirut") {
if (sample.name === "Africa/Cairo") {
if (rule_list[6].s === 13983768E5 && rule_list[6].e === 14116788E5) {
return 0;
}
}
if (sample.name === "Asia/Jerusalem") {
if (rule_list[6].s === 13959648E5 && rule_list[6].e === 14118588E5) {
return 0;
}
}
} else {
if (preliminary_timezone === "America/Santiago") {
if (sample.name === "America/Asuncion") {
if (rule_list[6].s === 14124816E5 && rule_list[6].e === 1397358E6) {
return 0;
}
}
if (sample.name === "America/Campo_Grande") {
if (rule_list[6].s === 14136912E5 && rule_list[6].e === 13925196E5) {
return 0;
}
}
} else {
if (preliminary_timezone === "America/Montevideo") {
if (sample.name === "America/Sao_Paulo") {
if (rule_list[6].s === 14136876E5 && rule_list[6].e === 1392516E6) {
return 0;
}
}
} else {
if (preliminary_timezone === "Pacific/Auckland") {
if (sample.name === "Pacific/Fiji") {
if (rule_list[6].s === 14142456E5 && rule_list[6].e === 13961016E5) {
return 0;
}
}
}
}
}
}
return score;
}, best_dst_match = function best_dst_match(rule_list, preliminary_timezone) {
var score_sample = function score_sample(sample) {
var score = 0;
for (var j = 0;j < rule_list.length;j++) {
if (!!sample.rules[j] && !!rule_list[j]) {
if (rule_list[j].s >= sample.rules[j].s && rule_list[j].e <= sample.rules[j].e) {
score = 0;
score += Math.abs(rule_list[j].s - sample.rules[j].s);
score += Math.abs(sample.rules[j].e - rule_list[j].e);
} else {
score = "N/A";
break;
}
if (score > consts.MAX_SCORE) {
score = "N/A";
break;
}
}
}
score = windows7_adaptations(rule_list, preliminary_timezone, score, sample);
return score;
};
var scoreboard = {};
var dst_zones = jstz.olson.dst_rules.zones;
var dst_zones_length = dst_zones.length;
var ambiguities = consts.AMBIGUITIES[preliminary_timezone];
for (var i = 0;i < dst_zones_length;i++) {
var sample = dst_zones[i];
var score = score_sample(dst_zones[i]);
if (score !== "N/A") {
scoreboard[sample.name] = score;
}
}
for (var tz in scoreboard) {
if (scoreboard.hasOwnProperty(tz)) {
for (var j = 0;j < ambiguities.length;j++) {
if (ambiguities[j] === tz) {
return tz;
}
}
}
}
return preliminary_timezone;
}, get_by_dst = function get_by_dst(preliminary_timezone) {
var get_rules = function get_rules() {
var rule_list = [];
for (var i = 0;i < jstz.olson.dst_rules.years.length;i++) {
var year_rules = dst_dates(jstz.olson.dst_rules.years[i]);
rule_list.push(year_rules);
}
return rule_list;
};
var check_has_dst = function check_has_dst(rules) {
for (var i = 0;i < rules.length;i++) {
if (rules[i] !== false) {
return true;
}
}
return false;
};
var rules = get_rules();
var has_dst = check_has_dst(rules);
if (has_dst) {
return best_dst_match(rules, preliminary_timezone);
}
return preliminary_timezone;
}, determine = function determine() {
var preliminary_tz = get_from_internationalization_api();
if (!preliminary_tz) {
preliminary_tz = jstz.olson.timezones[lookup_key()];
if (typeof consts.AMBIGUITIES[preliminary_tz] !== "undefined") {
preliminary_tz = get_by_dst(preliminary_tz);
}
}
return {name:function() {
return preliminary_tz;
}};
};
return {determine:determine};
}();
jstz.olson = jstz.olson || {};
jstz.olson.timezones = {"-720,0":"Etc/GMT+12", "-660,0":"Pacific/Pago_Pago", "-660,1,s":"Pacific/Apia", "-600,1":"America/Adak", "-600,0":"Pacific/Honolulu", "-570,0":"Pacific/Marquesas", "-540,0":"Pacific/Gambier", "-540,1":"America/Anchorage", "-480,1":"America/Los_Angeles", "-480,0":"Pacific/Pitcairn", "-420,0":"America/Phoenix", "-420,1":"America/Denver", "-360,0":"America/Guatemala", "-360,1":"America/Chicago", "-360,1,s":"Pacific/Easter", "-300,0":"America/Bogota", "-300,1":"America/New_York",
"-270,0":"America/Caracas", "-240,1":"America/Halifax", "-240,0":"America/Santo_Domingo", "-240,1,s":"America/Asuncion", "-210,1":"America/St_Johns", "-180,1":"America/Godthab", "-180,0":"America/Argentina/Buenos_Aires", "-180,1,s":"America/Montevideo", "-120,0":"America/Noronha", "-120,1":"America/Noronha", "-60,1":"Atlantic/Azores", "-60,0":"Atlantic/Cape_Verde", "0,0":"UTC", "0,1":"Europe/London", "60,1":"Europe/Berlin", "60,0":"Africa/Lagos", "60,1,s":"Africa/Windhoek", "120,1":"Asia/Beirut",
"120,0":"Africa/Johannesburg", "180,0":"Asia/Baghdad", "180,1":"Europe/Moscow", "210,1":"Asia/Tehran", "240,0":"Asia/Dubai", "240,1":"Asia/Baku", "270,0":"Asia/Kabul", "300,1":"Asia/Yekaterinburg", "300,0":"Asia/Karachi", "330,0":"Asia/Kolkata", "345,0":"Asia/Kathmandu", "360,0":"Asia/Dhaka", "360,1":"Asia/Omsk", "390,0":"Asia/Rangoon", "420,1":"Asia/Krasnoyarsk", "420,0":"Asia/Jakarta", "480,0":"Asia/Shanghai", "480,1":"Asia/Irkutsk", "525,0":"Australia/Eucla", "525,1,s":"Australia/Eucla", "540,1":"Asia/Yakutsk",
"540,0":"Asia/Tokyo", "570,0":"Australia/Darwin", "570,1,s":"Australia/Adelaide", "600,0":"Australia/Brisbane", "600,1":"Asia/Vladivostok", "600,1,s":"Australia/Sydney", "630,1,s":"Australia/Lord_Howe", "660,1":"Asia/Kamchatka", "660,0":"Pacific/Noumea", "690,0":"Pacific/Norfolk", "720,1,s":"Pacific/Auckland", "720,0":"Pacific/Majuro", "765,1,s":"Pacific/Chatham", "780,0":"Pacific/Tongatapu", "780,1,s":"Pacific/Apia", "840,0":"Pacific/Kiritimati"};
jstz.olson.dst_rules = {"years":[2008, 2009, 2010, 2011, 2012, 2013, 2014], "zones":[{"name":"Africa/Cairo", "rules":[{"e":12199572E5, "s":12090744E5}, {"e":1250802E6, "s":1240524E6}, {"e":12858804E5, "s":12840696E5}, false, false, false, {"e":14116788E5, "s":1406844E6}]}, {"name":"Africa/Casablanca", "rules":[{"e":12202236E5, "s":12122784E5}, {"e":12508092E5, "s":12438144E5}, {"e":1281222E6, "s":12727584E5}, {"e":13120668E5, "s":13017888E5}, {"e":13489704E5, "s":1345428E6}, {"e":13828392E5, "s":13761E8},
{"e":14142888E5, "s":14069448E5}]}, {"name":"America/Asuncion", "rules":[{"e":12050316E5, "s":12243888E5}, {"e":12364812E5, "s":12558384E5}, {"e":12709548E5, "s":12860784E5}, {"e":13024044E5, "s":1317528E6}, {"e":1333854E6, "s":13495824E5}, {"e":1364094E6, "s":1381032E6}, {"e":13955436E5, "s":14124816E5}]}, {"name":"America/Campo_Grande", "rules":[{"e":12032172E5, "s":12243888E5}, {"e":12346668E5, "s":12558384E5}, {"e":12667212E5, "s":1287288E6}, {"e":12981708E5, "s":13187376E5}, {"e":13302252E5,
"s":1350792E6}, {"e":136107E7, "s":13822416E5}, {"e":13925196E5, "s":14136912E5}]}, {"name":"America/Goose_Bay", "rules":[{"e":122559486E4, "s":120503526E4}, {"e":125704446E4, "s":123648486E4}, {"e":128909886E4, "s":126853926E4}, {"e":13205556E5, "s":129998886E4}, {"e":13520052E5, "s":13314456E5}, {"e":13834548E5, "s":13628952E5}, {"e":14149044E5, "s":13943448E5}]}, {"name":"America/Havana", "rules":[{"e":12249972E5, "s":12056436E5}, {"e":12564468E5, "s":12364884E5}, {"e":12885012E5, "s":12685428E5},
{"e":13211604E5, "s":13005972E5}, {"e":13520052E5, "s":13332564E5}, {"e":13834548E5, "s":13628916E5}, {"e":14149044E5, "s":13943412E5}]}, {"name":"America/Mazatlan", "rules":[{"e":1225008E6, "s":12074724E5}, {"e":12564576E5, "s":1238922E6}, {"e":1288512E6, "s":12703716E5}, {"e":13199616E5, "s":13018212E5}, {"e":13514112E5, "s":13332708E5}, {"e":13828608E5, "s":13653252E5}, {"e":14143104E5, "s":13967748E5}]}, {"name":"America/Mexico_City", "rules":[{"e":12250044E5, "s":12074688E5}, {"e":1256454E6,
"s":12389184E5}, {"e":12885084E5, "s":1270368E6}, {"e":1319958E6, "s":13018176E5}, {"e":13514076E5, "s":13332672E5}, {"e":13828572E5, "s":13653216E5}, {"e":14143068E5, "s":13967712E5}]}, {"name":"America/Miquelon", "rules":[{"e":12255984E5, "s":12050388E5}, {"e":1257048E6, "s":12364884E5}, {"e":12891024E5, "s":12685428E5}, {"e":1320552E6, "s":12999924E5}, {"e":13520016E5, "s":1331442E6}, {"e":13834512E5, "s":13628916E5}, {"e":14149008E5, "s":13943412E5}]}, {"name":"America/Santa_Isabel", "rules":[{"e":12250116E5,
"s":1207476E6}, {"e":12564612E5, "s":12389256E5}, {"e":12885156E5, "s":12703752E5}, {"e":13199652E5, "s":13018248E5}, {"e":13514148E5, "s":13332744E5}, {"e":13828644E5, "s":13653288E5}, {"e":1414314E6, "s":13967784E5}]}, {"name":"America/Santiago", "rules":[{"e":1206846E6, "s":1223784E6}, {"e":1237086E6, "s":12552336E5}, {"e":127035E7, "s":12866832E5}, {"e":13048236E5, "s":13138992E5}, {"e":13356684E5, "s":13465584E5}, {"e":1367118E6, "s":13786128E5}, {"e":13985676E5, "s":14100624E5}]}, {"name":"America/Sao_Paulo",
"rules":[{"e":12032136E5, "s":12243852E5}, {"e":12346632E5, "s":12558348E5}, {"e":12667176E5, "s":12872844E5}, {"e":12981672E5, "s":1318734E6}, {"e":13302216E5, "s":13507884E5}, {"e":13610664E5, "s":1382238E6}, {"e":1392516E6, "s":14136876E5}]}, {"name":"Asia/Amman", "rules":[{"e":1225404E6, "s":12066552E5}, {"e":12568536E5, "s":12381048E5}, {"e":12883032E5, "s":12695544E5}, {"e":13197528E5, "s":13016088E5}, false, false, {"e":14147064E5, "s":13959576E5}]}, {"name":"Asia/Damascus", "rules":[{"e":12254868E5,
"s":120726E7}, {"e":125685E7, "s":12381048E5}, {"e":12882996E5, "s":12701592E5}, {"e":13197492E5, "s":13016088E5}, {"e":13511988E5, "s":13330584E5}, {"e":13826484E5, "s":1364508E6}, {"e":14147028E5, "s":13959576E5}]}, {"name":"Asia/Dubai", "rules":[false, false, false, false, false, false, false]}, {"name":"Asia/Gaza", "rules":[{"e":12199572E5, "s":12066552E5}, {"e":12520152E5, "s":12381048E5}, {"e":1281474E6, "s":126964086E4}, {"e":1312146E6, "s":130160886E4}, {"e":13481784E5, "s":13330584E5}, {"e":13802292E5,
"s":1364508E6}, {"e":1414098E6, "s":13959576E5}]}, {"name":"Asia/Irkutsk", "rules":[{"e":12249576E5, "s":12068136E5}, {"e":12564072E5, "s":12382632E5}, {"e":12884616E5, "s":12697128E5}, false, false, false, false]}, {"name":"Asia/Jerusalem", "rules":[{"e":12231612E5, "s":12066624E5}, {"e":1254006E6, "s":1238112E6}, {"e":1284246E6, "s":12695616E5}, {"e":131751E7, "s":1301616E6}, {"e":13483548E5, "s":13330656E5}, {"e":13828284E5, "s":13645152E5}, {"e":1414278E6, "s":13959648E5}]}, {"name":"Asia/Kamchatka",
"rules":[{"e":12249432E5, "s":12067992E5}, {"e":12563928E5, "s":12382488E5}, {"e":12884508E5, "s":12696984E5}, false, false, false, false]}, {"name":"Asia/Krasnoyarsk", "rules":[{"e":12249612E5, "s":12068172E5}, {"e":12564108E5, "s":12382668E5}, {"e":12884652E5, "s":12697164E5}, false, false, false, false]}, {"name":"Asia/Omsk", "rules":[{"e":12249648E5, "s":12068208E5}, {"e":12564144E5, "s":12382704E5}, {"e":12884688E5, "s":126972E7}, false, false, false, false]}, {"name":"Asia/Vladivostok", "rules":[{"e":12249504E5,
"s":12068064E5}, {"e":12564E8, "s":1238256E6}, {"e":12884544E5, "s":12697056E5}, false, false, false, false]}, {"name":"Asia/Yakutsk", "rules":[{"e":1224954E6, "s":120681E7}, {"e":12564036E5, "s":12382596E5}, {"e":1288458E6, "s":12697092E5}, false, false, false, false]}, {"name":"Asia/Yekaterinburg", "rules":[{"e":12249684E5, "s":12068244E5}, {"e":1256418E6, "s":1238274E6}, {"e":12884724E5, "s":12697236E5}, false, false, false, false]}, {"name":"Asia/Yerevan", "rules":[{"e":1224972E6, "s":1206828E6},
{"e":12564216E5, "s":12382776E5}, {"e":1288476E6, "s":12697272E5}, {"e":13199256E5, "s":13011768E5}, false, false, false]}, {"name":"Australia/Lord_Howe", "rules":[{"e":12074076E5, "s":12231342E5}, {"e":12388572E5, "s":12545838E5}, {"e":12703068E5, "s":12860334E5}, {"e":13017564E5, "s":1317483E6}, {"e":1333206E6, "s":13495374E5}, {"e":13652604E5, "s":1380987E6}, {"e":139671E7, "s":14124366E5}]}, {"name":"Australia/Perth", "rules":[{"e":12068136E5, "s":12249576E5}, false, false, false, false, false,
false]}, {"name":"Europe/Helsinki", "rules":[{"e":12249828E5, "s":12068388E5}, {"e":12564324E5, "s":12382884E5}, {"e":12884868E5, "s":1269738E6}, {"e":13199364E5, "s":13011876E5}, {"e":1351386E6, "s":13326372E5}, {"e":13828356E5, "s":13646916E5}, {"e":14142852E5, "s":13961412E5}]}, {"name":"Europe/Minsk", "rules":[{"e":12249792E5, "s":12068352E5}, {"e":12564288E5, "s":12382848E5}, {"e":12884832E5, "s":12697344E5}, false, false, false, false]}, {"name":"Europe/Moscow", "rules":[{"e":12249756E5, "s":12068316E5},
{"e":12564252E5, "s":12382812E5}, {"e":12884796E5, "s":12697308E5}, false, false, false, false]}, {"name":"Pacific/Apia", "rules":[false, false, false, {"e":13017528E5, "s":13168728E5}, {"e":13332024E5, "s":13489272E5}, {"e":13652568E5, "s":13803768E5}, {"e":13967064E5, "s":14118264E5}]}, {"name":"Pacific/Fiji", "rules":[false, false, {"e":12696984E5, "s":12878424E5}, {"e":13271544E5, "s":1319292E6}, {"e":1358604E6, "s":13507416E5}, {"e":139005E7, "s":1382796E6}, {"e":14215032E5, "s":14148504E5}]},
{"name":"Europe/London", "rules":[{"e":12249828E5, "s":12068388E5}, {"e":12564324E5, "s":12382884E5}, {"e":12884868E5, "s":1269738E6}, {"e":13199364E5, "s":13011876E5}, {"e":1351386E6, "s":13326372E5}, {"e":13828356E5, "s":13646916E5}, {"e":14142852E5, "s":13961412E5}]}]};
(function(root, factory) {
if (typeof module == "object" && module.exports) {
module.exports = factory();
} else {
if (typeof define == "function" && define.amd) {
define(factory);
} else {
root.Spinner = factory();
}
}
})(this, function() {
var prefixes = ["webkit", "Moz", "ms", "O"], animations = {}, useCssAnimations, sheet;
function createEl(tag, prop) {
var el = document.createElement(tag || "div"), n;
for (n in prop) {
el[n] = prop[n];
}
return el;
}
function ins(parent) {
for (var i = 1, n = arguments.length;i < n;i++) {
parent.appendChild(arguments[i]);
}
return parent;
}
function addAnimation(alpha, trail, i, lines) {
var name = ["opacity", trail, ~~(alpha * 100), i, lines].join("-"), start = .01 + i / lines * 100, z = Math.max(1 - (1 - alpha) / trail * (100 - start), alpha), prefix = useCssAnimations.substring(0, useCssAnimations.indexOf("Animation")).toLowerCase(), pre = prefix && "-" + prefix + "-" || "";
if (!animations[name]) {
sheet.insertRule("@" + pre + "keyframes " + name + "{" + "0%{opacity:" + z + "}" + start + "%{opacity:" + alpha + "}" + (start + .01) + "%{opacity:1}" + (start + trail) % 100 + "%{opacity:" + alpha + "}" + "100%{opacity:" + z + "}" + "}", sheet.cssRules.length);
animations[name] = 1;
}
return name;
}
function vendor(el, prop) {
var s = el.style, pp, i;
prop = prop.charAt(0).toUpperCase() + prop.slice(1);
if (s[prop] !== undefined) {
return prop;
}
for (i = 0;i < prefixes.length;i++) {
pp = prefixes[i] + prop;
if (s[pp] !== undefined) {
return pp;
}
}
}
function css(el, prop) {
for (var n in prop) {
el.style[vendor(el, n) || n] = prop[n];
}
return el;
}
function merge(obj) {
for (var i = 1;i < arguments.length;i++) {
var def = arguments[i];
for (var n in def) {
if (obj[n] === undefined) {
obj[n] = def[n];
}
}
}
return obj;
}
function getColor(color, idx) {
return typeof color == "string" ? color : color[idx % color.length];
}
var defaults = {lines:12, length:7, width:5, radius:10, scale:1, corners:1, color:"#000", opacity:1 / 4, rotate:0, direction:1, speed:1, trail:100, fps:20, zIndex:2E9, className:"spinner", top:"50%", left:"50%", shadow:false, hwaccel:false, position:"absolute"};
function Spinner(o) {
this.opts = merge(o || {}, Spinner.defaults, defaults);
}
Spinner.defaults = {};
merge(Spinner.prototype, {spin:function(target) {
this.stop();
var self = this, o = self.opts, el = self.el = createEl(null, {className:o.className});
css(el, {position:o.position, width:0, zIndex:o.zIndex, left:o.left, top:o.top});
if (target) {
target.insertBefore(el, target.firstChild || null);
}
el.setAttribute("role", "progressbar");
self.lines(el, self.opts);
if (!useCssAnimations) {
var i = 0, start = (o.lines - 1) * (1 - o.direction) / 2, alpha, fps = o.fps, f = fps / o.speed, ostep = (1 - o.opacity) / (f * o.trail / 100), astep = f / o.lines;
(function anim() {
i++;
for (var j = 0;j < o.lines;j++) {
alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity);
self.opacity(el, j * o.direction + start, alpha, o);
}
self.timeout = self.el && setTimeout(anim, ~~(1E3 / fps));
})();
}
return self;
}, stop:function() {
var el = this.el;
if (el) {
clearTimeout(this.timeout);
if (el.parentNode) {
el.parentNode.removeChild(el);
}
this.el = undefined;
}
return this;
}, lines:function(el, o) {
var i = 0, start = (o.lines - 1) * (1 - o.direction) / 2, seg;
function fill(color, shadow) {
return css(createEl(), {position:"absolute", width:o.scale * (o.length + o.width) + "px", height:o.scale * o.width + "px", background:color, boxShadow:shadow, transformOrigin:"left", transform:"rotate(" + ~~(360 / o.lines * i + o.rotate) + "deg) translate(" + o.scale * o.radius + "px" + ",0)", borderRadius:(o.corners * o.scale * o.width >> 1) + "px"});
}
for (;i < o.lines;i++) {
seg = css(createEl(), {position:"absolute", top:1 + ~(o.scale * o.width / 2) + "px", transform:o.hwaccel ? "translate3d(0,0,0)" : "", opacity:o.opacity, animation:useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + " " + 1 / o.speed + "s linear infinite"});
if (o.shadow) {
ins(seg, css(fill("#000", "0 0 4px #000"), {top:"2px"}));
}
ins(el, ins(seg, fill(getColor(o.color, i), "0 0 1px rgba(0,0,0,.1)")));
}
return el;
}, opacity:function(el, i, val) {
if (i < el.childNodes.length) {
el.childNodes[i].style.opacity = val;
}
}});
function initVML() {
function vml(tag, attr) {
return createEl("<" + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr);
}
sheet.addRule(".spin-vml", "behavior:url(#default#VML)");
Spinner.prototype.lines = function(el, o) {
var r = o.scale * (o.length + o.width), s = o.scale * 2 * r;
function grp() {
return css(vml("group", {coordsize:s + " " + s, coordorigin:-r + " " + -r}), {width:s, height:s});
}
var margin = -(o.width + o.length) * o.scale * 2 + "px", g = css(grp(), {position:"absolute", top:margin, left:margin}), i;
function seg(i, dx, filter) {
ins(g, ins(css(grp(), {rotation:360 / o.lines * i + "deg", left:~~dx}), ins(css(vml("roundrect", {arcsize:o.corners}), {width:r, height:o.scale * o.width, left:o.scale * o.radius, top:-o.scale * o.width >> 1, filter:filter}), vml("fill", {color:getColor(o.color, i), opacity:o.opacity}), vml("stroke", {opacity:0}))));
}
if (o.shadow) {
for (i = 1;i <= o.lines;i++) {
seg(i, -2, "progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");
}
}
for (i = 1;i <= o.lines;i++) {
seg(i);
}
return ins(el, g);
};
Spinner.prototype.opacity = function(el, i, val, o) {
var c = el.firstChild;
o = o.shadow && o.lines || 0;
if (c && i + o < c.childNodes.length) {
c = c.childNodes[i + o];
c = c && c.firstChild;
c = c && c.firstChild;
if (c) {
c.opacity = val;
}
}
};
}
if (typeof document !== "undefined") {
sheet = function() {
var el = createEl("style", {type:"text/css"});
ins(document.getElementsByTagName("head")[0], el);
return el.sheet || el.styleSheet;
}();
var probe = css(createEl("group"), {behavior:"url(#default#VML)"});
if (!vendor(probe, "transform") && probe.adj) {
initVML();
} else {
useCssAnimations = vendor(probe, "animation");
}
}
return Spinner;
});
goog.provide("CTATConfig");
CTATConfig = {};
CTATConfig.Options = {};
CTATConfig.addProperty = function(property_name, possible_values, default_value, is_constant) {
default_value = default_value || possible_values[0];
Object.defineProperty(CTATConfig, property_name, {enumerable:true, configurable:false, writable:!is_constant, value:default_value.toLowerCase()});
var opts = {};
possible_values.forEach(function(opt) {
opts[opt] = opt.toLowerCase();
Object.defineProperty(CTATConfig, property_name + "_is_" + opt, {enumerable:false, writable:false, value:function() {
return CTATConfig[this.prop].toLowerCase() == this.val;
}.bind({prop:property_name, val:opts[opt]})});
});
CTATConfig.Options[property_name] = opts;
};
CTATConfig.addProperty("platform", ["CTAT", "Google", "Undefined"], "CTAT", true);
CTATConfig.addProperty("external", ["Google", "LTI", "SCORM", "None"], "None");
CTATConfig.addProperty("parserType", ["XML", "JSON"], "XML");
if (typeof module !== "undefined") {
module.exports = CTATConfig;
}
if (window && window.console) {
}
;goog.provide("CTATGlobals");
CTATGlobals = {tutorRunning:false, Tab:{Tracker:1, Focus:null, previousFocus:null}, NameSpace:{svg:"http://www.w3.org/2000/svg", xml:"http://www.w3.org/2000/xmlns/", xlink:"http://www.w3.org/1999/xlink", ev:"http://www.w3.org/2001/xml-events", mathml:"http://www.w3.org/1998/Math/MathML"}, EncodedParams:{authenticity_token:"authenticity_token", info:"info", question_file:"question_file", skills:"skills"}, CommDisabled:false, orientation:"portrait", ignoreInterfaceDescriptions:true};
var useDebugging;
if (useDebugging === undefined) {
useDebugging = false;
}
var useDebuggingBasic;
if (useDebuggingBasic === undefined) {
useDebuggingBasic = false;
}
var version = "3.2.1";
var ctatcontainer = "container";
var movieclips = [];
var canvasCalibrate = 5;
var flashVars = null;
var mobileAPI = null;
var aVars = null;
CTATGlobals.interfaceElement = null;
CTATGlobals.selectedTextInput = null;
var commMessageHandler = null;
var commLoggingLibrary = null;
var logHintSAI = null;
var nameTranslator = null;
var hints = [];
var hintIndex = 0;
var caseInsensitive = true;
var unordered = true;
var lockWidget = true;
var highlightRightSelection = true;
CTATGlobals.suppressStudentFeedback = false;
CTATGlobals.confirmDone = false;
var incompatibleBrowserMessage = "Your browser does not support CTAT. Please update or replace your browser.";
goog.provide("CTATSandboxDriver");
function getSafeElementById(anID) {
return document.getElementById(anID);
}
;goog.provide("CTATGlobalFunctions");
goog.require("CTATConfig");
goog.require("CTATGlobals");
goog.require("CTATSandboxDriver");
CTATGlobalFunctions = {};
function unhighlightall(dummy) {
if (!CTATShellTools.component_descriptions) {
return;
}
var comps = CTATShellTools.getAllComponents();
for (var i = 0;i < comps.length;i++) {
var ref = comps[i];
if (ref["setHintHighlight"]) {
ref.setHintHighlight(false, null);
}
}
}
CTATGlobalFunctions.stringToBoolean = function stringToBoolean(str) {
switch(String(str).toLowerCase()) {
case "true":
;
case "yes":
;
case "1":
return true;
case "false":
;
case "no":
;
case "0":
;
case "":
;
case null:
return false;
default:
return Boolean(str);
}
};
CTATGlobalFunctions.isInstructorMode = function() {
var vars = flashVars ? flashVars.getRawFlashVars() : null;
if (vars && vars["deliverymode"]) {
return vars["deliverymode"] == "delivery" ? false : true;
} else {
return false;
}
};
CTATGlobalFunctions.getLoggingLibrary = function(getLoggingLibrary) {
if (commLoggingLibrary == null) {
commLoggingLibrary = new CTATLoggingLibrary(true);
}
return commLoggingLibrary;
};
CTATGlobalFunctions.setPreviewMode = function(aConfigurationObject, aValue) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["previewMode"] = aValue;
return;
}
aConfigurationObject.setPreviewMode(aValue);
};
CTATGlobalFunctions.setCenterTutor = function(aConfigurationObject, aValue) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["centerTutor"] = aValue;
return;
}
aConfigurationObject.setCenterTutor(aValue);
};
CTATGlobalFunctions.setTutorWidth = function(aConfigurationObject, w) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["width"] = w;
return;
}
aConfigurationObject.setTutorWidth(w);
};
CTATGlobalFunctions.setTutorHeight = function(aConfigurationObject, h) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["height"] = h;
return;
}
aConfigurationObject.setTutorHeight(h);
};
CTATGlobalFunctions.setTutorDimensions = function(aConfigurationObject, w, h) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["width"] = w;
aConfigurationObject["height"] = h;
return;
}
aConfigurationObject.setTutorDimensions(w, h);
};
CTATGlobalFunctions.setTutorValue = function(aConfigurationObject, aKey, aValue) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject[aKey] = aValue;
return;
}
aConfigurationObject.setTutorValue(aKey, aValue);
};
CTATGlobalFunctions.setCommunicationMode = function(aConfigurationObject, aMode) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["tutoring_service_communication"] = aMode;
return;
}
aConfigurationObject.setCommunicationMode(aMode);
};
CTATGlobalFunctions.setRemoteSocketURL = function(aConfigurationObject, aURL) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["remoteSocketURL"] = aURL;
return;
}
aConfigurationObject.setRemoteSocketURL(aURL);
};
CTATGlobalFunctions.setRemoteSocketPort = function(aConfigurationObject, aPort) {
if (!CTATGlobalFunctions.isCTATObject(aConfigurationObject)) {
aConfigurationObject["remoteSocketPort"] = aPort;
return;
}
aConfigurationObject.setRemoteSocketPort(aPort);
};
CTATGlobalFunctions.setProblemSummary = function(aSummary) {
};
CTATGlobalFunctions.isCTATObject = function(aVariable) {
if (typeof testConfig == "object") {
if (testConfig["getClassName"]) {
return true;
} else {
}
}
return false;
};
CTATGlobalFunctions.getCTATClassname = function(aVariable) {
if (typeof testConfig == "object") {
if (testConfig["getClassName"]) {
return testConfig.getClassName();
} else {
}
}
return "object";
};
CTATGlobalFunctions.toBoolean = function(value) {
if (typeof value === "boolean") {
return value;
} else {
if (typeof value === "string") {
return CTATGlobalFunctions.stringToBoolean(value);
} else {
if (typeof value === "number") {
return value > 0;
} else {
if (value) {
return true;
} else {
return false;
}
}
}
}
};
function noenter(e) {
if (CTATConfig.platform_is_Google()) {
return 0;
}
e = e || window.event;
var key = e.keyCode || e.charCode;
return key !== 13;
}
CTATGlobalFunctions.isBlank = function isBlank(str) {
return !str || /^\s*$/.test(str);
};
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {r:parseInt(result[1], 16), g:parseInt(result[2], 16), b:parseInt(result[3], 16)} : null;
}
function parseQueryStringArgs(aQuerySet) {
ctatdebug("parseQueryStringArgs ()");
var str = aQuerySet;
ctatdebug("Query String: " + str);
var query = str.charAt(0) == "?" ? str.substring(1) : str;
var args = {};
if (query) {
var fields = query.split("&");
for (var f = 0;f < fields.length;f++) {
var field = fields[f].split("=");
args[decodeURIComponent(field[0])] = decodeURIComponent(field[1].replace(/\+/g, " "));
}
}
return args;
}
function setOrientation(anOrientation) {
ctatdebug("setOrientation (" + anOrientation + ")");
switch(anOrientation) {
case -90:
;
case 90:
if (mobileAPI) {
mobileAPI.processOrientationChange("landscape");
}
break;
case 180:
;
default:
if (mobileAPI) {
mobileAPI.processOrientationChange("portrait");
}
break;
}
}
if (!Object.hasOwnProperty("create")) {
Object.create = function() {
function F() {
}
return function(o) {
if (arguments.length != 1) {
throw new Error("Object.create implementation only accepts one parameter.");
}
F.prototype = o;
return new F;
};
}();
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
function introspect(name, obj, indent, levels) {
indent = indent || "";
if (this.typeOf(levels) !== "number") {
levels = 1;
}
var objType = this.typeOf(obj);
var result = [indent, name, " ", objType, " :"].join("");
if (objType === "object") {
if (levels > 0) {
indent = [indent, " "].join("");
for (var prop in obj) {
var property = this.introspect(prop, obj[prop], indent, levels - 1);
result = [result, "\n", property].join("");
}
return result;
} else {
return [result, " ..."].join("");
}
} else {
if (objType === "null") {
return [result, " null"].join("");
}
}
return [result, " ", obj].join("");
}
function findPointOfAttachment(anInstance) {
ctatdebug("findPointOfAttachment (" + anInstance + ")");
for (var t = 0;t < movieclips.length;t++) {
var aMovieClip = movieclips[t];
ctatdebug("Examining: " + aMovieClip.getName() + "...");
if (aMovieClip.isRegistered(anInstance) === true) {
return aMovieClip;
}
}
return null;
}
function findMovieClip(anInstance) {
var formatted = anInstance.trim();
ctatdebug("findMovieClip (" + formatted.trim() + ")");
for (var t = 0;t < movieclips.length;t++) {
var aMovieClip = movieclips[t];
ctatdebug("Examining: " + aMovieClip.getName() + "...");
if (aMovieClip.getName() == formatted) {
return aMovieClip;
}
}
return null;
}
function colName(n, toUpperCase) {
ctatdebug("colName (" + n + ")");
var s = "";
while (n >= 0) {
s = String.fromCharCode(n % 26 + 97) + s;
n = Math.floor(n / 26) - 1;
}
if (toUpperCase === true) {
s.toUpperCase();
}
return s;
}
function selectText(target) {
}
function urldecode(str) {
return decodeURIComponent(("" + str).replace(/\+/g, "%20"));
}
function detectIE() {
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
var trident = ua.indexOf("Trident/");
if (msie > 0) {
return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10);
}
if (trident > 0) {
var rv = ua.indexOf("rv:");
return parseInt(ua.substring(rv + 3, ua.indexOf(".", rv)), 10);
}
return false;
}
function listProperties(anObject) {
ctatdebug("listProperties (l: " + anObject.length + ")");
for (var propertyName in anObject) {
ctatdebug("[" + propertyName + "]");
}
}
function listPropertiesKV(anObject, asArray) {
ctatdebug("listPropertiesKV (size: " + anObject.length + ")");
if (asArray == true) {
for (var i = 0;i < anObject.length;i++) {
ctatdebug("[" + i + "]: " + anObject[i]);
}
} else {
for (var propertyName in anObject) {
ctatdebug("[" + propertyName + "]: " + anObject[propertyName]);
}
}
}
function listAllDivAttributes(aDivObject) {
ctatdebug("listAllDivAttributes ()");
for (var i = 0, atts = aDivObject.attributes, n = atts.length, arr = [];i < n;i++) {
pointer.ctatdebug("Attribute: " + atts[i].nodeName + ", with value: " + atts[i].nodeValue);
}
}
var getBackgroundDimensions = function(item) {
ctatdebug("Using url: " + $(item).css("background-image"));
var img = new Image;
img.src = $(item).css("background-image").replace(/url\(|\)$|"/ig, "");
return img.width + " " + img.height;
};
var getBackgroundWidth = function(item) {
ctatdebug("Using url: " + $(item).css("background-image"));
var img = new Image;
img.src = $(item).css("background-image").replace(/url\(|\)$|"/ig, "");
return img.width;
};
var getBackgroundHeight = function(item) {
ctatdebug("Using url: " + $(item).css("background-image"));
var img = new Image;
img.src = $(item).css("background-image").replace(/url\(|\)$|"/ig, "");
return img.height;
};
function getIndicesOf(searchStr, str, caseSensitive) {
var startIndex = 0, searchStrLen = searchStr.length;
var index, indices = [];
if (!caseSensitive) {
str = str.toLowerCase();
searchStr = searchStr.toLowerCase();
}
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
indices.push(index);
startIndex = index + searchStrLen;
}
return indices;
}
CTATGlobalFunctions.formatColor = function(aColor) {
if (/^#[0-9a-f]{6}$/i.test(aColor)) {
return aColor;
}
var rgb = aColor.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i);
if (rgb !== null) {
return rgbToHex(Number(rgb[1]), Number(rgb[2]), Number(rgb[3]));
}
var hex = aColor.match(/^#?([0-9a-f]{0,6})$/i);
if (hex !== null) {
var c = hex[1];
while (c.length < 6) {
c = "0" + c;
}
return "#" + c;
}
return aColor;
};
CTATGlobalFunctions.Gensym = function() {
this.make_gensym = function() {
var prefix = "";
var index = 0;
return {set_prefix:function(p) {
prefix = String(p);
}, set_index:function(i) {
index = i;
}, gensym:function() {
var result = prefix + index;
index += 1;
return result;
}};
};
var z_index = this.make_gensym();
z_index.set_index(2);
var id_index = this.make_gensym();
id_index.set_index(1);
id_index.set_prefix("ctatdiv");
return {z_index:z_index.gensym, div_id:id_index.gensym};
};
CTATGlobalFunctions.gensym = CTATGlobalFunctions.Gensym();
goog.provide("CTATBase");
goog.require("CTATConfig");
goog.require("CTATGlobalFunctions");
goog.require("CTATGlobals");
goog.require("CTATSandboxDriver");
CTATBase = function(aClassName, aName) {
var className = aClassName;
var name = aName;
var pointer = this;
var myDebugging = true;
if (CTATBase["DebuggingFilter"][className] != "undefined" && CTATBase["DebuggingFilter"][className]) {
myDebugging = false;
}
this.getClassName = function getClassName() {
return className;
};
this.getClassname = function getClassname() {
return className;
};
this.setClassName = function setClassName(aClass) {
className = aClass;
};
this.setName = function setName(sName) {
name = sName;
};
this.getName = function getName() {
return name;
};
this.getUseDebugging = function getUseDebugging() {
return useDebugging;
};
this.setUseDebugging = function setUseDebugging(aValue) {
useDebugging = aValue;
};
this.toHHMMSS = function(aValue) {
var sec_num = parseInt(aValue, 10);
var hours = Math.floor(sec_num / 3600);
var minutes = Math.floor((sec_num - hours * 3600) / 60);
var seconds = sec_num - hours * 3600 - minutes * 60;
if (hours < 10) {
hours = "0" + hours;
}
if (minutes < 10) {
minutes = "0" + minutes;
}
if (seconds < 10) {
seconds = "0" + seconds;
}
return hours + ":" + minutes + ":" + seconds;
};
this.ctatdebug = function ctatdebug(msg) {
if (!myDebugging) {
return;
}
var aMessage = msg;
if (useDebuggingBasic) {
pointer.ctatdebugInternal(aMessage, "UnknownClass");
return;
}
if (msg === null) {
aMessage = "No message provided";
}
if (useDebugging) {
pointer.ctatdebugInternal(aMessage, pointer.getClassName());
}
};
this.ctatdebugObject = function debugObject(object) {
var index = 0;
for (var property in object) {
this.ctatdebug("(" + index + ")" + property + ": " + object[property]);
index++;
}
};
this.ctatdebugInternal = function debugInternal(msg, sClassName) {
var aMessage = msg;
var txt = "No msg assigned yet";
if (aMessage === null || aMessage === undefined) {
aMessage = "No message!";
}
if (aMessage === "") {
aMessage = "Empty message!";
}
if (useDebuggingBasic) {
txt = formatLogMessage("Unknown", "undefined", aMessage);
if (!CTATBase.customconsole) {
CTATBase.customconsole = getSafeElementById("customconsole");
}
if (CTATBase.customconsole) {
CTATBase.customconsole.innerHTML += txt + "
";
CTATBase.customconsole.scrollTop = CTATBase.customconsole.scrollHeight;
} else {
console.log(txt);
}
return;
}
if (sClassName === null) {
sClassName = "UndefinedClass";
}
if (aMessage === null) {
aMessage = "No message";
}
txt = formatLogMessage(sClassName, pointer.getName(), aMessage);
try {
console.trace(txt);
} catch (err) {
}
if (CTATConfig.platform == "google") {
Logger.log(txt);
return;
}
if (!CTATBase.customconsole) {
CTATBase.customconsole = getSafeElementById("customconsole");
}
if (CTATBase.customconsole !== null) {
CTATBase.customconsole.innerHTML += txt + "
";
CTATBase.customconsole.scrollTop = CTATBase.customconsole.scrollHeight;
}
};
this.ctatdebugObjectShallow = function debugObjectShallow(object) {
var output = "";
for (var property in object) {
output += property + ", ";
}
pointer.ctatdebugInternal("Object: " + output, "Global");
};
this.urldecode = function urldecode(str) {
return decodeURIComponent((str + "").replace(/\+/g, "%20"));
};
this.entitiesConvert = function entitiesConvert(str) {
this.ctatdebug("entitiesConvert ()");
return this.urldecode(unescape(str));
};
this.entitiesGenerate = function entitiesGenerate(str) {
var temper = str;
return temper;
};
function formatLogMessage(aClass, anInstance, aMessage) {
if (aClass === null) {
aClass = "unknownclass";
}
if (anInstance === null) {
anInstance = "nullinstance";
}
var formatted = aMessage;
var txt = "[" + aClass + ":" + anInstance + "] " + formatted;
return txt;
}
};
function formatLogMessageGoogle(aClass, anInstance, aMessage) {
var base = new CTATBase(aClass, anInstance);
var formatted = base.htmlEncode(aMessage);
var txt = "[" + aClass + ":" + anInstance + "] " + formatted;
return txt;
}
function ctatdebug(aMessage) {
if (!useDebugging && !useDebuggingBasic) {
return;
}
if (aMessage === null) {
aMessage = "Empty message!";
return;
}
if (CTATConfig.platform == "google") {
Logger.log(formatLogMessageGoogle("CTATTutor", "tutor", aMessage));
return;
}
if (!ctatdebug.debugPointer) {
ctatdebug.debugPointer = new CTATBase("CTATTutor", "tutor");
}
ctatdebug.debugPointer.ctatdebug(aMessage, "CTATTutor");
}
Object.defineProperty(CTATBase, "DebuggingFilter", {enumerable:false, configurable:false, writable:true, value:[]});
if (typeof module !== "undefined") {
module.exports = CTATBase;
}
;goog.provide("CTATProblem");
goog.require("CTATBase");
CTATProblem = function() {
CTATBase.call(this, "CTATProblem", "problem");
var label = "";
var description = "";
var tutor_flag = "tutor";
var problem_file = "";
var student_interface = "";
var urlPrefix = "";
var state = "notstarted";
this.setState = function setState(aValue) {
state = aValue;
};
this.getState = function getState() {
return state;
};
this.setLabel = function setLabel(aValue) {
label = aValue;
};
this.getLabel = function getLabel() {
return label;
};
this.setDescription = function setDescription(aValue) {
description = aValue;
};
this.getDescription = function getDescription() {
return description;
};
this.setURLPrefix = function setURLPrefix(aValue) {
urlPrefix = aValue;
};
this.getURLPrefix = function getURLPrefix() {
return urlPrefix;
};
this.setTutorFlag = function setTutorFlag(aValue) {
tutor_flag = aValue;
};
this.getTutorFlag = function getTutorFlag() {
return tutor_flag;
};
this.setProblemFile = function setProblemFile(aValue) {
problem_file = aValue;
};
this.getProblemFile = function getProblemFile() {
return urlPrefix + problem_file;
};
this.setStudentInterface = function setStudentInterface(aValue) {
student_interface = aValue;
};
this.getStudentInterface = function getStudentInterface() {
return urlPrefix + student_interface;
};
};
CTATProblem.prototype = Object.create(CTATBase.prototype);
CTATProblem.prototype.constructor = CTATProblem;
CTATProblem.prototype.toString = function() {
return this.getProblemFile() + " on " + this.getStudentInterface();
};
goog.provide("CTATProblemSet");
goog.require("CTATBase");
goog.require("CTATProblem");
CTATProblemSet = function() {
CTATBase.call(this, "CTATProblemSet", "problemset");
var pointer = this;
var problems = new Array;
this.addProblem = function addProblem(aProblem) {
problems.push(aProblem);
};
this.getProblems = function getProblems() {
return problems;
};
this.getProblemSize = function getProblemSize() {
return problems.length;
};
this.getFirstProblem = function getFirstProblem() {
pointer.ctatdebug("getFirstProblem () problems.length " + problems.length);
if (problems.length == 0) {
return null;
}
return problems[0];
};
};
CTATProblemSet.prototype = Object.create(CTATBase.prototype);
CTATProblemSet.prototype.constructor = CTATProblemSet;
goog.provide("CTATXML");
goog.require("CTATBase");
CTATXML = function() {
CTATBase.call(this, "CTATXML", "xmlparser");
this.parse = function parse(aMessage) {
return this.parseXML(aMessage);
};
this.parseXML = function parseXML(aMessage) {
this.ctatdebug("parseXML ()");
var xmlDoc = null;
try {
if (typeof $ !== "undefined") {
xmlDoc = $.parseXML(aMessage);
} else {
if (typeof XMLParser !== "undefined") {
xmlDoc = (new XMLParser).parseFromString(aMessage);
} else {
this.ctatdebug("Bottoming out, no parser configured!");
}
}
} catch (err) {
if (xmlDoc != null) {
this.ctatdebug("JQuery could not process the provided XML: " + err.message + " (" + xmlDoc.parseError.errorCode + ") (" + xmlDoc.parseError.reason + ") (" + xmlDoc.parseError.line + ")");
} else {
this.ctatdebug("JQuery could not process the provided XML (xmlDoc==null): " + err.message);
}
return null;
}
if (xmlDoc == null) {
this.ctatdebug("Unspecified error parsing xml message. xmlDoc is null");
return null;
}
return xmlDoc.documentElement;
};
this.getElementName = function getElementName(anElement) {
return anElement.nodeName;
};
this.getElementValue = function getElementValue(anElement) {
return anElement.nodeValue;
};
this.getElementChildren = function getElementChildren(anElement) {
var children = [];
for (var i = 0;i < anElement.childNodes.length;i++) {
if (anElement.childNodes[i].nodeType == 1) {
children.push(anElement.childNodes[i]);
}
}
return children;
};
this.getNodeTextValue = function getNodeTextValue(aNode) {
if (aNode == null) {
return "";
}
if (aNode.childNodes == null) {
return aNode.nodeValue;
}
if (aNode.childNodes.length == 0) {
return "";
}
var entries = aNode.childNodes;
for (var t = 0;t < entries.length;t++) {
var entry = entries[t];
if (entry.nodeName == "value" || entry.nodeName == "Value") {
if (entry.childNodes.length == 1) {
return entry.childNodes[0].nodeValue;
} else {
if (entry.childNodes.length == 0) {
return aNode.childNodes[0].nodeValue;
} else {
return entry.childNodes[1].nodeValue;
}
}
}
}
return aNode.childNodes[0].nodeValue;
};
this.getElementAttr = function getElementAttr(anElement, attr) {
if (!anElement.attributes) {
this.ctatdebug("Warning: Element " + anElement.nodeName + " does not have any attributes");
return "";
}
for (var i = 0;i < anElement.attributes.length;i++) {
if (anElement.attributes[i].nodeName == attr) {
return anElement.attributes[i].nodeValue;
}
}
return "";
};
this.listElementAttr = function listElementAttr(anElement) {
this.ctatdebug("Listing " + anElement.attributes.length + " attributes for element " + anElement.nodeName + " ...");
for (var i = 0;i < anElement.attributes.length;i++) {
this.ctatdebug(i + " name: " + anElement.attributes[i].nodeName + ", value: " + anElement.attributes[i].nodeValue);
}
};
this.stringify = function(anObject) {
return this.xmlToString(anObject);
};
this.xmlToString = function xmlToString(xmlData) {
this.ctatdebug("xmlToString ()");
if (xmlData == null) {
this.ctatdebug("Error: xml data is null");
return null;
}
var output = (new XMLSerializer).serializeToString(xmlData);
return output;
};
};
CTATXML.prototype = Object.create(CTATBase.prototype);
CTATXML.prototype.constructor = CTATXML;
if (typeof module !== "undefined") {
module.exports = CTATXML;
}
;goog.provide("CTATPackage");
goog.require("CTATBase");
goog.require("CTATXML");
goog.require("CTATProblem");
goog.require("CTATProblemSet");
CTATPackage = function() {
CTATBase.call(this, "CTATPackage", "packagemanager");
var pointer = this;
var root = null;
var parser = new CTATXML;
var urlPrefix = "";
var problems = new CTATProblemSet;
var problemSets = [problems];
this.init = function init(aDocRoot) {
pointer.ctatdebug("init ()");
if (aDocRoot == null) {
pointer.ctatdebug("Error: document root to be parsed is null.");
return;
}
pointer.ctatdebug("Root name: " + parser.getElementName(aDocRoot));
var packageContent = parser.getElementChildren(aDocRoot);
for (var i = 0;i < packageContent.length;i++) {
var rootEntity = packageContent[i];
var rootEntityName = parser.getElementName(rootEntity);
pointer.ctatdebug("Examining element: " + parser.getElementName(rootEntity));
if (rootEntityName == "Problems") {
pointer.ctatdebug("Processing Problems ...");
var problemList = parser.getElementChildren(rootEntity);
for (var j = 0;j < problemList.length;j++) {
var aProblemElement = problemList[j];
pointer.ctatdebug("Problem [" + j + "] desc: " + parser.getElementAttr(aProblemElement, "description") + ", interface: " + parser.getElementAttr(aProblemElement, "student_interface") + ", brd: " + parser.getElementAttr(aProblemElement, "problem_file"));
var newProblem = pointer.addProblem(parser.getElementAttr(aProblemElement, "problem_file"), parser.getElementAttr(aProblemElement, "student_interface"), parser.getElementAttr(aProblemElement, "name"), parser.getElementAttr(aProblemElement, "label"), parser.getElementAttr(aProblemElement, "description"));
newProblem.setTutorFlag(parser.getElementAttr(aProblemElement, "tutor_flag"));
}
}
if (rootEntityName == "ProblemSets") {
pointer.ctatdebug("Processing ProblemSets ...");
}
if (rootEntityName == "Assets") {
pointer.ctatdebug("Processing Assets ...");
}
}
};
this.addProblem = function(problemFile, studentInterface, name, label, description) {
var newProblem = new CTATProblem;
newProblem.setProblemFile(problemFile);
newProblem.setStudentInterface(studentInterface);
newProblem.setName(name ? name : problemFile);
newProblem.setLabel(label ? label : problemFile);
newProblem.setDescription(description ? description : problemFile);
newProblem.setURLPrefix(urlPrefix);
pointer.ctatdebug("Adding problem ...");
var pSets = pointer.getProblemSets();
pSets[0].addProblem(newProblem);
return newProblem;
};
this.setURLPrefix = function setURLPrefix(aValue) {
urlPrefix = aValue;
};
this.getURLPrefix = function getURLPrefix() {
return urlPrefix;
};
this.getProblems = function getProblems() {
return problems;
};
this.getProblemSets = function getProblemSets() {
return problemSets;
};
};
CTATPackage.prototype = Object.create(CTATBase.prototype);
CTATPackage.prototype.constructor = CTATPackage;
goog.provide("CTATConnectionBase");
goog.require("CTATBase");
CTATConnectionBase = function(aClassName, aName) {
CTATBase.call(this, "CTATConnectionBase", "ctatconnection");
var id = -1;
var url = "";
var socketType = "http";
this.setURL = function setURL(aURL) {
url = aURL;
};
this.getURL = function getURL() {
return url;
};
this.setID = function setID(anID) {
id = anID;
};
this.getID = function getID() {
return id;
};
this.setSocketType = function setSocketType(aType) {
socketType = aType;
};
this.getSocketType = function getSocketType() {
return socketType;
};
};
CTATConnectionBase.prototype = Object.create(CTATBase.prototype);
CTATConnectionBase.prototype.constructor = CTATConnectionBase;
goog.provide("CTATConnection");
goog.require("CTATBase");
goog.require("CTATConnectionBase");
CTATConnection = function(substVars) {
CTATConnectionBase.call(this, "CTATConnection");
var substituteFlashVars = substVars;
var httpObject = null;
var settings = {contentType:"text/plain", data:null, processData:false, method:"POST", mimeType:"text/html", headers:{}};
var consumed = false;
var pointer = this;
var receiveFunction = null;
pointer.setSocketType("http");
this.setContentType = function setContentType(aVal) {
settings.contentType = aVal;
};
this.getContentType = function getContentType() {
return settings.contentType;
};
this.setConsumed = function setConsumed(aVal) {
consumed = aVal;
pointer.ctatdebug("consumed: " + consumed);
};
this.getConsumed = function getConsumed() {
pointer.ctatdebug("consumed: " + consumed);
return consumed;
};
this.assignReceiveFunction = function assignReceiveFunction(aFunction) {
receiveFunction = aFunction;
if (httpObject && typeof httpObject.onreadystatechange != "undefined") {
httpObject.onreadystatechange = aFunction;
}
};
this.assignFailFunction = function assignFailFunction(aFunction) {
settings.error = aFunction;
if (httpObject && typeof httpObject.error == "function") {
httpObject.error(aFunction);
}
};
this.setData = function setData(aData) {
settings.data = aData;
};
this.getData = function getData() {
return settings.data;
};
this.getHTTPObject = function getHTTPObject() {
return httpObject;
};
function createHTTPObject() {
pointer.ctatdebug("createHTTPObject ()");
httpObject = new XMLHttpRequest;
if (typeof $ != "undefined") {
httpObject = null;
} else {
if (window.XMLHttpRequest) {
pointer.ctatdebug("Creating regular XMLHttpRequest ...");
httpObject = new XMLHttpRequest;
if (httpObject.overrideMimeType) {
httpObject.overrideMimeType("text/html");
}
} else {
pointer.ctatdebug("Trying alternative HTTP object creation ...");
if (window.ActiveXObject) {
pointer.ctatdebug("Detected window.ActiveXObject ...");
try {
pointer.ctatdebug("Creating Msxml2.XMLHTTP ...");
httpObject = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e$2) {
try {
pointer.ctatdebug("Creating Microsoft.XMLHTTP ...");
httpObject = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("Error: Unable to create HTTP Request Object: " + e.message);
}
}
} else {
alert("Internal error: an HTTP connection object could not be created");
}
}
}
}
function init() {
pointer.ctatdebug("init ()");
var fVars = flashVars ? flashVars.getRawFlashVars() : substituteFlashVars ? substituteFlashVars : {};
var aSession = fVars["session_id"] ? fVars["session_id"] : "dummySession";
if (httpObject !== null) {
if (aSession == "dummySession") {
pointer.ctatdebug("Unable to find CTAT session information from environment, trying OLI ...");
}
try {
httpObject.setRequestHeader("Content-type", settings.contentType);
httpObject.setRequestHeader("ctatsession", aSession);
} catch (err) {
alert("HTTP object creation error: " + err.message);
}
} else {
if (typeof $ == "undefined") {
alert("Internal error: http object is null right after creation");
} else {
settings.headers.ctatsession = aSession;
}
}
pointer.ctatdebug("init () done");
}
this.getMethod = function() {
return settings.method;
};
this.setMethod = function(newMethod) {
settings.method = newMethod;
};
this.send = function send() {
pointer.ctatdebug("send ()");
var xhr = pointer.getHTTPObject();
var fail = function() {
pointer.ctatdebug("Networking error!");
};
if (xhr) {
xhr.onerror = fail;
}
try {
if (xhr) {
xhr.open(pointer.getMethod(), pointer.getURL(), true);
}
} catch (err) {
pointer.ctatdebug("Error in newConnection.httpObject.open: " + err.message);
return;
}
init();
try {
if (typeof $ != "undefined") {
xhr = $.ajax(pointer.getURL(), settings).done(receiveFunction).fail(fail);
httpObject = xhr;
} else {
if (settings.data) {
xhr.send(settings.data);
} else {
xhr.send();
}
}
} catch (err$3) {
this.ctatdebug("Error in newConnection.httpObject.send: " + err$3.message);
return;
}
};
this.then = function(done, fail) {
var thenSupported = httpObject && typeof httpObject.then == "function";
pointer.ctatdebug("CTATConnection.then() supported " + thenSupported + ", done & fail:\n " + done + ",\n " + fail);
return thenSupported ? httpObject.then(done, fail) : {then:function() {
console.log("CTATConnection.then() not supported");
}};
};
createHTTPObject();
};
CTATConnection.prototype = Object.create(CTATConnectionBase.prototype);
CTATConnection.prototype.constructor = CTATConnection;
goog.provide("CTATWSConnection");
goog.require("CTATBase");
goog.require("CTATConnectionBase");
CTATWSConnection = function(substVars) {
CTATConnectionBase.call(this, "CTATWSConnection");
var substituteFlashVars = substVars;
var data = "";
var consumed = false;
var pointer = this;
var output;
var websocket = null;
var outgoingQueue = [];
var ready = false;
var before = 0;
var after = 0;
var receiveFunction = null;
var closeFunction = null;
pointer.setSocketType("ws");
this.setConsumed = function setConsumed(aVal) {
consumed = aVal;
pointer.ctatdebug("consumed: " + consumed);
};
this.getConsumed = function getConsumed() {
pointer.ctatdebug("consumed: " + consumed);
return consumed;
};
this.assignReceiveFunction = function assignReceiveFunction(aFunction) {
receiveFunction = aFunction;
};
this.assignCloseFunction = function(aFunction) {
closeFunction = aFunction;
};
this.setData = function setData(aData) {
data = aData;
};
this.getData = function getData() {
return data;
};
this.init = function init() {
ctatdebug("init (" + pointer.getURL() + "); websocket " + websocket);
if (websocket != null) {
return;
}
websocket = new WebSocket(pointer.getURL());
websocket.addEventListener("open", function(e) {
ctatdebug("STATUS: open");
ready = true;
ctatdebug("Connection open, flushing outgoing queue ...");
var timeDriver = new Date;
before = timeDriver.getTime();
if (outgoingQueue.length > 0) {
for (var i = 0;i < outgoingQueue.length;i++) {
websocket.send(outgoingQueue[i]);
}
outgoingQueue = [];
}
});
websocket.addEventListener("message", function(e) {
var timeDriver = new Date;
after = timeDriver.getTime();
ctatdebug("STATUS: message after " + (after - before) + " ms");
ctatdebug("Received: " + e.data);
if (receiveFunction) {
receiveFunction(e.data);
} else {
ctatdebug("Error: no processing function provided");
}
});
websocket.addEventListener("close", function(e) {
ctatdebug("STATUS: close; " + (e ? "code " + e.code + ", reason " + e.reason : "no event"));
ready = false;
var reason = e ? e.reason ? e.reason : "received close code " + e.code : "no close event received";
websocket.close(1E3, reason);
if (closeFunction) {
closeFunction(e);
}
});
websocket.addEventListener("error", function(e) {
ctatdebug("STATUS: error; " + (e ? e.type : "no event"));
ready = false;
websocket.close(1E3, "client closing in response to error");
});
ctatdebug("init () done");
};
this.send = function send() {
ctatdebug("send ()");
pointer.init();
if (ready === false) {
ctatdebug("Connection not ready yet, storing ...");
outgoingQueue.push(data);
} else {
ctatdebug("Connection ready, sending data ...");
var timeDriver = new Date;
before = timeDriver.getTime();
websocket.send(data);
}
};
this.getWebSocket = function() {
return websocket;
};
this.close = function(opt_reason, opt_cbk) {
ready = false;
opt_reason = opt_reason || "no reason";
closeFunction = opt_cbk || closeFunction;
websocket.close(1E3, opt_reason);
};
};
CTATWSConnection.prototype = Object.create(CTATConnectionBase.prototype);
CTATWSConnection.prototype.constructor = CTATWSConnection;
goog.provide("CTATCanvasComponent");
CTATCanvasComponent = function(aName) {
var pointer = this;
var shapes = [];
var componentName = aName || "__undefined__";
this.addShape = function addShape(aShape) {
shapes.push(aShape);
};
this.hideShape = function hideShape(aShapeName) {
for (var i = 0;i < shapes.length;i++) {
if (shapes[i].getName() == aShapeName) {
shapes[i].modifyCanvasCSS("visibility", "hidden");
break;
}
}
};
this.showShape = function showShape(aShapeName) {
for (var i = 0;i < shapes.length;i++) {
if (shapes[i].getName() == aShapeName) {
shapes[i].modifyCanvasCSS("visibility", "visible");
break;
}
}
};
this.hideComponent = function hideComponent() {
for (var i = 0;i < shapes.length;i++) {
shapes[i].modifyCanvasCSS("visibility", "hidden");
}
};
this.showComponent = function showComponent() {
for (var i = 0;i < shapes.length;i++) {
shapes[i].modifyCanvasCSS("visibility", "visible");
}
};
this.moveShape = function moveShape(aShapeName, toX, toY) {
for (var i = 0;i < shapes.length;i++) {
if (shapes[i].getName() == aShapeName) {
shapes[i].modifyCanvasCSS("left", toX + "px");
shapes[i].modifyCanvasCSS("top", toY + "px");
break;
}
}
};
this.moveComponent = function moveComponent(toX, toY) {
for (var i = 0;i < shapes.length;i++) {
shapes[i].modifyCanvasCSS("left", toX + "px");
shapes[i].modifyCanvasCSS("top", toY + "px");
}
};
this.removeShape = function removeShape(aShapeName) {
var removeIndex = 0;
for (var i = 0;i < shapes.length;i++) {
if (shapes[i].getName() == aShapeName) {
removeIndex = i;
break;
}
}
shapes[removeIndex].detatchCanvas();
shapes.splice(removeIndex, 1);
};
this.removeComponent = function removeComponent() {
while (shapes.length > 0) {
pointer.removeShape(shapes[0].getName());
}
};
};
goog.provide("CTATLanguageManager");
goog.require("CTATBase");
var CTATDefaultLanguagePack = {"HORIZONTAL":"LR", "VERTICAL":"TB", "LOADING":"Please wait while the tutor is being loaded", "NEXTPROBLEM":"Retrieving the Next Problem...", "CONGRATULATIONS_YOU_ARE_DONE":"Congratulations, you are done with this problem.", "SURE_YOU_ARE_DONE":"Are you sure you are done?", "TUTORDISCONNECTED":"The tutor has disconnected. Please refresh the page.", "OUTOFORDER":"You need to do other steps first, before doing the step you just worked on. You might request a hint for more help.",
"DONE":"Done", "HINT":"Hint", "NEXT":"Next", "PREVIOUS":"Previous", "HIGHLIGHTEDSTEP":"Instead of the step you are working on, please work on the highlighted step.", "NO_HINT_AVAILABLE":"No hint is available at this step.", "NOTDONE":"I'm sorry, but you are not done yet. Please continue working.", "AUTHORPLEASECLOSE":"Authoring Tools disconnected. Please close this page.", "ERROR_502":"Error contacting the server, please refresh the page and try again (HTTP status 502: gateway response).", "ERROR_CONN_TS":"Connection refused by tutoring service, please check your server or contact an administrator.",
"ERROR_CONN_LS":"Connection refused by the logging server, please check your connection or contact an administrator.", "AWAITING_OTHER_COLLABORATORS":"Waiting for other team members..."};
CTATLanguageManager = function() {
CTATBase.call(this, "CTATLanguageManager", "theLanguagePack");
var pointer = this;
this.getString = function getString(anIdentifier) {
pointer.ctatdebug("getString (" + anIdentifier + ") -> " + typeof CTATLanguagePack);
if (typeof CTATLanguagePack !== "undefined") {
if (CTATLanguagePack[anIdentifier]) {
return CTATLanguagePack[anIdentifier];
}
} else {
pointer.ctatdebug("No custom language pack defined, using default...");
}
return CTATDefaultLanguagePack[anIdentifier];
};
this.filterString = function filterString(aString) {
pointer.ctatdebug("filterString (" + aString + ") -> " + typeof CTATLanguagePack);
if (typeof CTATLanguagePack !== "undefined") {
if (CTATLanguagePack[aString]) {
pointer.ctatdebug("Found tag in provided language pack, returning: " + CTATLanguagePack[aString]);
return CTATLanguagePack[aString];
}
} else {
pointer.ctatdebug("No custom language pack defined, using default...");
}
if (typeof CTATDefaultLanguagePack !== "undefined") {
if (CTATDefaultLanguagePack[aString]) {
pointer.ctatdebug("Found tag in default language pack, returning: " + CTATDefaultLanguagePack[aString]);
return CTATDefaultLanguagePack[aString];
}
}
return aString;
};
};
CTATLanguageManager.prototype = Object.create(CTATBase.prototype);
CTATLanguageManager.prototype.constructor = CTATLanguageManager;
CTATLanguageManager.theSingleton = new CTATLanguageManager;
goog.provide("CTATScrim");
goog.require("CTATBase");
goog.require("CTATCanvasComponent");
goog.require("CTATConfig");
goog.require("CTATSandboxDriver");
goog.require("CTATLanguageManager");
var scrimIsUp = false;
var errorScrim = false;
var waitScrim = true;
var warnScrim = false;
var connectionScrim = false;
var authorTimeSet = true;
var inAuthorTime = true;
CTATScrim = function() {
CTATBase.call(this, "CTATScrim", "__undefined__");
var messageList = [];
var tempList = [];
var padding = 4;
var message = "";
var hasYesButton = false;
var hasNoButton = false;
var hasCloseButton = false;
var yesPtr = null;
var noPtr = null;
var scrimComponent = new CTATCanvasComponent("CTAT Scrim");
var scrim = null;
var dialog = null;
var scrimMessage = null;
var errorsAndWarnings = [];
var scrimColor = "rgba(0, 0, 0, 0.25)";
var errorColor = "rgb(255, 0, 0)";
var warningColor = "rgb(255, 255, 0)";
var defaultColor = "#CCCCCC";
var scrimBorderColor = defaultColor;
var dialogWidthRatio = 6 / 8;
var dialogHeightRatio = 2 / 8;
var mainLeft = 0;
var img = null;
var yesButton = null;
var noButton = null;
var closeButton = null;
var okButton = null;
var scrimBorderWidth = 5;
var pointer = this;
function closeFunction() {
warnScrim = false;
pointer.scrimDown();
}
function clearScrim() {
scrimComponent.removeComponent();
pointer.removeHTMLElements();
}
function displayDialog() {
if (CTATConfig.platform == "google") {
return;
}
$("#scrimpanel").empty();
$("#scrim").append('