{"version":3,"sources":["qrcode.min.js","components/dropdown.js","components/form.js","components/linkSpinner.js","components/modal.js","components/preventDoubleClick.js","components/select.js","components/slideout.js","components/submitButton.js","OutermostLMSV5.js"],"names":[],"mappings":"AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"app.js","sourcesContent":["var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+\"/\"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error(\"Too long data\");return c}function s(a){var b=encodeURI(a).toString().replace(/\\%[0-9a-fA-F]{2}/g,\"a\");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+\",\"+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error(\"code length overflow. (\"+g.getLengthInBits()+\">\"+8*l+\")\");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error(\"bad maskPattern:\"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error(\"mode:\"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error(\"mode:\"+a)}else{if(!(41>b))throw new Error(\"type:\"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error(\"mode:\"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error(\"glog(\"+a+\")\");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS(\"http://www.w3.org/2000/svg\",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g(\"svg\",{viewBox:\"0 0 \"+String(d)+\" \"+String(d),width:\"100%\",height:\"100%\",fill:b.colorLight});h.setAttributeNS(\"http://www.w3.org/2000/xmlns/\",\"xmlns:xlink\",\"http://www.w3.org/1999/xlink\"),c.appendChild(h),h.appendChild(g(\"rect\",{fill:b.colorDark,width:\"1\",height:\"1\",id:\"template\"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g(\"use\",{x:String(i),y:String(j)});k.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",\"#template\"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p=\"svg\"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL(\"image/png\"),this._elImage.style.display=\"block\",this._elCanvas.style.display=\"none\"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement(\"img\"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src=\"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if(\"nodeName\"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else\"undefined\"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement(\"canvas\"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext(\"2d\"),this._bIsPainted=!1,this._elImage=document.createElement(\"img\"),this._elImage.style.display=\"none\",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display=\"none\",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push(\"\");for(var i=0;d>i;i++)g.push('');g.push(\"\")}g.push(\"
\"),c.innerHTML=g.join(\"\");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+\"px \"+k+\"px\")},a.prototype.clear=function(){this._el.innerHTML=\"\"},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:\"#000000\",colorLight:\"#ffffff\",correctLevel:d.H},\"string\"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];\"string\"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){\"function\"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}();","\r\nvar sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.dropdown = function () {\r\n return {\r\n open: false,\r\n container: {\r\n ['x-on:keydown.escape.stop']() {\r\n this.open = false;\r\n },\r\n ['x-on:click.away']() {\r\n this.open = false;\r\n },\r\n },\r\n trigger: {\r\n ['x-on:click']() {\r\n this.open = !this.open;\r\n },\r\n ['x-bind:aria-expanded']() {\r\n return this.open;\r\n }\r\n },\r\n dropdown: {\r\n ['x-show']() {\r\n return this.open;\r\n },\r\n\r\n ['x-transition:enter']: 'transition ease-out duration-200',\r\n ['x-transition:enter-start']: 'transform opacity-0 scale-95',\r\n ['x-transition:enter-end']: 'transform opacity-100 scale-100',\r\n ['x-transition:leave']: 'transition ease-in duration-75',\r\n ['x-transition:leave-start']: 'transform opacity-100 scale-100',\r\n ['x-transition:leave-end']: 'transform opacity-0 scale-95',\r\n }\r\n }\r\n}","var sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.form = function () {\r\n return {\r\n modelState: {},\r\n hasError(key) {\r\n var field = this.modelState[key];\r\n if (field) {\r\n return field.Errors.length !== 0;\r\n }\r\n return false;\r\n },\r\n hasRequiredError(key) {\r\n var field = this.modelState[key];\r\n if (field) {\r\n return field.Errors.length !== 0 && field.Errors[0].ErrorMessage.includes('required');\r\n }\r\n return false;\r\n },\r\n hasOtherError(key) {\r\n var field = this.modelState[key];\r\n if (field) {\r\n return field.Errors.length !== 0 && !this.hasRequiredError(key);\r\n }\r\n return false;\r\n },\r\n message(key) {\r\n var field = this.modelState[key];\r\n if (field) {\r\n if (field.Errors.length !== 0) {\r\n return field.Errors[0].ErrorMessage;\r\n }\r\n }\r\n return '';\r\n },\r\n clear(key, event) {\r\n console.log(event.keyCode);\r\n if (event.keyCode !== 9) { // TAB key \r\n this.modelState[key] = null;\r\n }\r\n },\r\n async submitEnd(event) {\r\n if ((event.target).isSameNode(this.$el)) {\r\n var response = event.detail.formSubmission.result.fetchResponse.response;\r\n if (response.status === 422) {\r\n var json = await response.json();\r\n this.modelState = json;\r\n }\r\n }\r\n },\r\n async validate(event) {\r\n if (event.target.hasAttribute('name')) { // only clientside validate elements with a name attribute\r\n var val = event.target.value;\r\n this.$fetch({\r\n url: this.$el.action,\r\n method: 'post',\r\n headers: { 'clientside-validation': '' },\r\n data: new FormData(this.$el)\r\n }).then((res) => {\r\n // if the value has changed don't show the validation message as it could be wrong or cause a flash as the message is shown and hidden\r\n if (val === event.target.value) {\r\n var name = event.target.getAttribute('name');\r\n this.modelState[name] = res.data[name];\r\n }\r\n });\r\n }\r\n }\r\n }\r\n}","var sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.linkSpinner = function () {\r\n return {\r\n originalContent: null,\r\n timeoutId: null,\r\n button: {\r\n ['x-on:click']() {\r\n var el = this.$el;\r\n this.originalContent = el.innerHTML;\r\n el.dataset.spinning = true;\r\n this.timeoutId = setTimeout(function () {\r\n el.style.width = el.offsetWidth + 'px';\r\n el.innerHTML = '
' +\r\n '' +\r\n '' +\r\n '
';\r\n }, 400);\r\n this.$el.style.pointerEvents = 'none'; //disable link\r\n },\r\n ['x-on:stop']() {\r\n clearTimeout(this.timeoutId);\r\n this.$el.innerHTML = this.originalContent;\r\n this.$el.style.pointerEvents = 'auto';\r\n this.$el.style.width = 'auto';\r\n this.$el.dataset.spinning = false;\r\n }\r\n }\r\n }\r\n}","var sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.modal = function () {\r\n return {\r\n modal: {\r\n ['x-on:click']: 'click($event, $dispatch)',\r\n },\r\n click($event, $dispatch) {\r\n $dispatch('open-modal');\r\n },\r\n }\r\n}","\r\nvar sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.preventDoubleClick = function () {\r\n return {\r\n timestamp: 0,\r\n delay: 2000,\r\n trigger: {\r\n ['x-on:click'](event) {\r\n if (this.timestamp + this.delay > event.timeStamp) {\r\n // double-click - cancel follow\r\n event.preventDefault();\r\n return\r\n }\r\n // follow link\r\n this.timestamp = event.timeStamp;\r\n },\r\n }\r\n }\r\n}","var sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.select = function (config) {\r\n return {\r\n data: config.data,\r\n\r\n emptyOptionsMessage: config.emptyOptionsMessage ?? 'No results match your search.',\r\n\r\n focusedOptionIndex: null,\r\n\r\n name: config.name,\r\n\r\n open: false,\r\n\r\n options: [],\r\n\r\n placeholder: config.placeholder ?? 'Select an option',\r\n\r\n search: '',\r\n\r\n value: config.value ?? 0,\r\n\r\n selectedText: config.selectedText,\r\n\r\n fetchUrl: config.fetchUrl ?? null,\r\n\r\n closeListbox: function () {\r\n this.open = false\r\n\r\n this.focusedOptionIndex = null\r\n\r\n this.search = ''\r\n },\r\n\r\n focusNextOption: function () {\r\n if (this.focusedOptionIndex === null) return this.focusedOptionIndex = Object.keys(this.options).length - 1\r\n\r\n if (this.focusedOptionIndex + 1 >= Object.keys(this.options).length) return\r\n\r\n this.focusedOptionIndex++\r\n\r\n this.$refs.listbox.children[this.focusedOptionIndex].scrollIntoView({\r\n block: \"center\",\r\n })\r\n },\r\n\r\n focusPreviousOption: function () {\r\n if (this.focusedOptionIndex === null) return this.focusedOptionIndex = 0\r\n\r\n if (this.focusedOptionIndex <= 0) return\r\n\r\n this.focusedOptionIndex--\r\n\r\n this.$refs.listbox.children[this.focusedOptionIndex].scrollIntoView({\r\n block: \"center\",\r\n })\r\n },\r\n\r\n init: function () {\r\n this.options = this.data\r\n\r\n if (this.fetchUrl != \"\") {\r\n for (var i = 0; i < this.options.length; i++) {\r\n if (this.options[i].key == this.value) {\r\n this.selectedText = this.options.find(element => element.key === this.value).value;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this.selectedText == null || this.selectedText == \"\" || this.selectedText == \" \") {\r\n this.value = null;\r\n this.selectedText = this.placeholder;\r\n };\r\n\r\n this.$watch('search', ((value) => {\r\n\r\n if (this.fetchUrl === \"\") {\r\n if (!this.open || !value) return this.options = this.data\r\n\r\n this.options = this.data.filter(function (el) {\r\n return el.value.toLowerCase().includes(value.toLowerCase())\r\n });\r\n }\r\n else {\r\n fetch(this.fetchUrl.concat(value))\r\n .then(response => response.json())\r\n .then(data => this.options = data);\r\n }\r\n\r\n }))\r\n },\r\n\r\n selectOption: function () {\r\n if (!this.open) return this.toggleListboxVisibility()\r\n\r\n this.value = this.options[this.focusedOptionIndex].key;\r\n\r\n this.selectedText = this.options[this.focusedOptionIndex].value;\r\n\r\n this.closeListbox()\r\n },\r\n\r\n toggleListboxVisibility: function () {\r\n if (this.open) return this.closeListbox()\r\n\r\n this.focusedOptionIndex = Object.keys(this.options).indexOf(this.value)\r\n\r\n if (this.focusedOptionIndex < 0) this.focusedOptionIndex = 0\r\n\r\n this.open = true\r\n\r\n this.$nextTick(() => {\r\n this.$refs.search.focus()\r\n\r\n this.$refs.listbox.children[this.focusedOptionIndex].scrollIntoView({\r\n block: \"center\"\r\n })\r\n })\r\n },\r\n }\r\n}","var sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.slideout = function () {\r\n return {\r\n slideout: {\r\n ['x-on:click']: 'click($event, $dispatch)',\r\n },\r\n click($event, $dispatch) {\r\n $dispatch('open-slider');\r\n },\r\n }\r\n}","var sc = sc || {};\r\nsc.alpine = sc.alpine || {};\r\n\r\nsc.alpine.submitButton = function () {\r\n return {\r\n originalContent: null,\r\n timeoutId: null,\r\n button: {\r\n ['x-on:click']() {\r\n var el = this.$el;\r\n this.originalContent = el.innerHTML;\r\n el.dataset.spinning = true;\r\n this.timeoutId = setTimeout(function () {\r\n el.style.width = el.offsetWidth + 'px';\r\n el.style.height = el.offsetHeight + 'px';\r\n el.innerHTML = '
' +\r\n '' +\r\n '' +\r\n '
';\r\n }, 400);\r\n this.$el.style.pointerEvents = 'none'; //disable link\r\n },\r\n ['x-on:stop']() {\r\n clearTimeout(this.timeoutId);\r\n this.$el.innerHTML = this.originalContent;\r\n this.$el.style.pointerEvents = 'auto';\r\n this.$el.style.width = 'auto';\r\n this.$el.style.height = 'auto';\r\n this.$el.dataset.spinning = false;\r\n }\r\n }\r\n }\r\n}","/*******************************************************************************\r\n**\r\n** FileName: OutermostLMSV5.js\r\n** Common LMS interface routines \r\n*******************************************************************************/\r\n\r\n/*******************************************************************************\r\n**\r\n** By David Hodges\r\n** Outermost Software, LLC\r\n** Brattleboro, VT\r\n ** Rev 5/15/2018 Revised from OutermostLMSV3.js for ThinClient project, using new WebAPI interface\r\n ** Rev 6/11/2018 Adding error log for debugging, plus debug window\r\n * Bug Fix 6/19/2020 Somehow an old bug resurfaced in GetValue and SetValue, where the return value wasn't being returned to the caller\r\n*******************************************************************************/\r\n//debug info\r\nvar blnDebug = false;\r\nvar aryDebug = new Array();\r\nvar strDebug = \"\";\r\nvar winDebug;\r\n// establish a pointer to this api so the SCO can find it (HAS to be called \"API\" for 1.2 and \r\n// for SCORM 2004 it has to be API_1484_11\r\nvar API = new apiclass();\r\nAPI.version = '1.2';\r\nvar API_1484_11 = new apiclass();\r\nAPI_1484_11.version = '1.3';\r\nvar sessionid;\r\nvar userid;\r\nvar coreid;\r\nvar scorm_course_id;\r\nvar sco_identifier;\r\nvar exit_status;\r\n\r\n/****************************************************************************************\r\n** api class. This api takes the SCORM-compliant calls from the SCO\r\n** and converts them to the OUTERMOST Web Service behavior calls that interact\r\n** with the OUTERMOST LMS.\r\n****************************************************************************************/\r\nfunction apiclass() {\r\n this._Debug = true; // set this to false to turn debugging off\r\n\r\n this.version = '1.3'; // new value for SCORM2004\r\n\r\n // Define exception/error codes\r\n this._NoError = 0;\r\n this._GeneralException = 101;\r\n this._ServerBusy = 102;\r\n this._InvalidArgumentError = 201;\r\n this._ElementCannotHaveChildren = 202;\r\n this._ElementIsNotAnArray = 203;\r\n this._NotInitialized = 301;\r\n this._NotImplementedError = 401;\r\n this._InvalidSetValue = 402;\r\n this._ElementIsReadOnly = 403;\r\n this._ElementIsWriteOnly = 404;\r\n this._IncorrectDataType = 405;\r\n // define properties\r\n this.serviceAvailable = false; // WebService initialization state\r\n this.initialized = false; // SCO LMSInitialize state\r\n this.LastError = this._NotInitialized;\r\n this.LastErrorString = \"\";\r\n this.LastErrorDiagnostic = \"\";\r\n\r\n this._sessionid = \"\";\r\n this._userid = \"\";\r\n this._coreid = \"\";\r\n this._scorm_course_id = \"\";\r\n this._sco_identifier = \"\";\r\n this._exit_status = \"\"; // this will stay as is in browse or review mode, will change if they are actually taking the sco for credit to completed. Will only request the next page if this is \"completed\"\r\n\r\n // initialize the member function references\r\n // for the class prototype\r\n if (typeof (_api_prototype_called) == 'undefined') {\r\n _api_prototype_called = true;\r\n apiclass.prototype.LMSInitialize = _LMSInitialize;\r\n apiclass.prototype.LMSFinish = _LMSFinish;\r\n apiclass.prototype.LMSGetValue = _LMSGetValue;\r\n apiclass.prototype.LMSSetValue = _LMSSetValue;\r\n apiclass.prototype.LMSCommit = _LMSCommit;\r\n apiclass.prototype.LMSGetLastError = _LMSGetLastError;\r\n apiclass.prototype.LMSGetErrorString = _LMSGetErrorString;\r\n apiclass.prototype.LMSGetDiagnostic = _LMSGetDiagnostic;\r\n // for SCORM 2004\r\n apiclass.prototype.Initialize = _LMSInitialize;\r\n apiclass.prototype.Terminate = _LMSFinish;\r\n apiclass.prototype.GetValue = _LMSGetValue;\r\n apiclass.prototype.SetValue = _LMSSetValue;\r\n apiclass.prototype.Commit = _LMSCommit;\r\n apiclass.prototype.GetLastError = _LMSGetLastError;\r\n apiclass.prototype.GetErrorString = _LMSGetErrorString;\r\n apiclass.prototype.GetDiagnostic = _LMSGetDiagnostic;\r\n }\r\n\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function: LMSInitialize()\r\n\t** Inputs: None\r\n\t** Return: CMIBoolean true if the initialization was successful, or\r\n\t** CMIBoolean false if the initialization failed.\r\n\t**\r\n\t** Description:\r\n\t** Initialize communication with LMS by calling the LMSInitialize\r\n\t** Web Service\r\n\t**\r\n\t*******************************************************************************/\r\n\r\n function _LMSInitialize(val) {\r\n WriteToDebug(\"----------------------------------------\");\r\n WriteToDebug(\"----------------------------------------\");\r\n WriteToDebug(\"In LMS Initialize\");\r\n WriteToDebug(\"Browser Info (\" + navigator.appName + \" \" + navigator.appVersion + \")\");\r\n WriteToDebug(\"URL: \" + window.document.location.href);\r\n WriteToDebug(\"----------------------------------------\");\r\n WriteToDebug(\"----------------------------------------\");\r\n\r\n if (val != '') {\r\n this.LastErrorString = \"Value passed to LMSInitialize, should be blank\";\r\n this.LastError = \"201\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n return \"false\";\r\n }\r\n\r\n if (this.initialized) {\r\n this.LastErrorString = \"LMS is already initialized, call to LMSInitialize ignored.\";\r\n this.LastError = \"101\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n WriteToDebug(this.LastErrorString);\r\n return \"false\";\r\n }\r\n // the calling application leaves a session id and other variables \r\n this._sessionid = SCOClient.sessionid;\r\n this._userid = SCOClient.userid;\r\n this._coreid = SCOClient.coreid;\r\n this._scorm_course_id = SCOClient.scorm_course_id;\r\n this._sco_identifier = SCOClient.sco_identifier;\r\n // LMSInfo object carries arguments to the server and back\r\n var lmsInfo = JSON.stringify(createLMSInfo(this._sessionid, this._userid, this._coreid, this._scorm_course_id, this._sco_identifier));\r\n WriteToDebug(\"LMSInitialize: \" + lmsInfo);\r\n var that = this; // get reference to current API instance\r\n $.ajax({\r\n type: \"POST\",\r\n url: \"/api/LMSInitialize\",\r\n data: lmsInfo,\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n async: false,\r\n success: function (response) {\r\n lmsInfo = response;\r\n that.LastError = lmsInfo.errorCode;\r\n that.LastErrorString = lmsInfo.errorString\r\n // check error code from server\r\n if (lmsInfo.errorCode != \"0\") {\r\n that.initialized = false;\r\n }\r\n else {\r\n that.initialized = true;\r\n }\r\n // return (API.initialized) ? \"true\" : \"false\";\r\n },\r\n error: function (request, error) {\r\n // Ajax call failed\r\n that.LastError = \"101\"; //general exception\r\n that.LastErrorString = error.Message;\r\n that.LastErrorDiagnostic = \"AJAX error\";\r\n WriteToDebug(\"Ajax error\");\r\n WriteToDebug(error.Message);\r\n return \"false\";\r\n }\r\n });\r\n return (this.initialized) ? \"true\" : \"false\";\r\n }\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function LMSFinish()\r\n\t** Inputs: None\r\n\t** Return: CMIBoolean true if successful\r\n\t** CMIBoolean false if failed.\r\n\t**\r\n\t** Description:\r\n\t** Close communication with LMS by calling the LMSFinish\r\n\t** function which will be implemented by the LMS\r\n\t**\r\n\t*******************************************************************************/\r\n function _LMSFinish(val) {\r\n WriteToDebug(\"LMSFinish\");\r\n if (val != '') {\r\n this.LastErrorString = \"Value passed to LMSFinish, should be blank\";\r\n this.LastError = \"201\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n return \"false\";\r\n }\r\n if (!this.initialized) {\r\n this.LastErrorString = \"LMS is not initialized, call to LMSFinish ignored.\";\r\n this.LastError = \"301\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n return \"false\";\r\n }\r\n // LMSInfo object carries arguments to the server and back\r\n var lmsInfo = JSON.stringify(createLMSInfo(this._sessionid, this._userid, this._coreid, this._scorm_course_id, this._sco_identifier));\r\n WriteToDebug(\"LMSFinish: \" + JSON.stringify({ 'lmsInfo': lmsInfo }));\r\n var that = this; // get reference to current instance\r\n $.ajax({\r\n type: \"POST\",\r\n url: \"/api/LMSFinish\",\r\n data: lmsInfo,\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n async: true,\r\n success: LMSFinish_callback,\r\n error: function (request, error) {\r\n // Ajax call failed\r\n that.LastError = \"101\"; //general exception\r\n that.LastErrorString = error;\r\n that.LastErrorDiagnostic = \"AJAX error\";\r\n WriteToDebug(\"Ajax error\");\r\n WriteToDebug(error.Message);\r\n return \"false\";\r\n }\r\n });\r\n\r\n // AJAX callback for the LMSFinish call\r\n function LMSFinish_callback(response) {\r\n lmsInfo = response.d == null ? response : response.d; // asp.net 3.5 adds the 'd' attribute to the response object\r\n that.LastError = lmsInfo.errorCode;\r\n that.LastErrorString = lmsInfo.errorString\r\n that.LastError = \"101\";\r\n that.LastErrorString = \"\";\r\n that.initialized = false;\r\n }\r\n return (this.initialized) ? \"true\" : \"false\";\r\n }\r\n\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function LMSGetValue(name)\r\n\t** Inputs: name - string representing the cmi data model defined category or\r\n\t** element (e.g. cmi.core.student_id)\r\n\t** Return: The value presently assigned by the LMS to the cmi data model\r\n\t** element defined by the element or category identified by the name\r\n\t** input value.\r\n\t**\r\n\t** Description:\r\n\t** Wraps the call to the LMS LMSGetValue method\r\n\t**\r\n\t*******************************************************************************/\r\n function _LMSGetValue(name) {\r\n WriteToDebug(\"LMSGetValue\");\r\n if (!this.initialized) {\r\n this.LastErrorString = \"LMS is not initialized, call to LMSGetValue ignored.\";\r\n this.LastError = \"301\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n return \"\";\r\n }\r\n var lmsInfo = JSON.stringify(createLMSInfo(this._sessionid, this._userid, this._coreid, this._scorm_course_id, this._sco_identifier, name));\r\n WriteToDebug(\"GETVALUE: \" + JSON.stringify({ 'lmsInfo': lmsInfo }));\r\n\r\n var returnValue = '';\r\n var that = this; // get reference to current API instance\r\n $.ajax({\r\n type: \"POST\",\r\n url: \"/api/LMSGetValue\",\r\n data: lmsInfo,\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n async: false,\r\n success: function (response) {\r\n lmsInfo = response;\r\n that.LastError = lmsInfo.errorCode;\r\n that.LastErrorString = lmsInfo.errorString;\r\n // check error code from server\r\n if (lmsInfo.errorCode != \"0\") {\r\n return \"false\";\r\n }\r\n else {\r\n returnValue = lmsInfo.returnValue;\r\n return lmsInfo.returnValue;\r\n\r\n }\r\n },\r\n error: function (request, error) {\r\n // Ajax call failed\r\n that.LastError = \"101\"; //general exception\r\n that.LastErrorString = error;\r\n that.LastErrorDiagnostic = \"AJAX error\";\r\n WriteToDebug(\"Ajax error\");\r\n WriteToDebug(error.Message);\r\n return \"false\";\r\n\r\n }\r\n });\r\n\r\n return returnValue;\r\n\r\n }\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function LMSSetValue(name, value)\r\n\t** Inputs: name -string representing the data model defined category or element\r\n\t** value -the value that the named element or category will be assigned\r\n\t** Return: CMIBoolean true if successful\r\n\t** CMIBoolean false if failed.\r\n\t**\r\n\t** Description:\r\n\t** Wraps the call to the LMS LMSSetValue function\r\n\t**\r\n\t*******************************************************************************/\r\n function _LMSSetValue(name, value) {\r\n if (name == \"cmi.core.lesson_status\" || name == \"cmi.core.exit\") {\r\n this._exit_status = value; // set this so LMSFinish knows what to do\r\n }\r\n if (!this.initialized) {\r\n this.LastErrorString = \"LMS is not initialized, call to LMSSetValue ignored.\";\r\n this.LastError = \"301\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n return \"false\";\r\n }\r\n var lmsInfo = JSON.stringify(createLMSInfo(this._sessionid, this._userid, this._coreid, this._scorm_course_id, this._sco_identifier, name, value));\r\n WriteToDebug(\"SETVALUE: \" + JSON.stringify({ 'lmsInfo': lmsInfo }));\r\n var returnValue = '';\r\n var that = this; // get reference to current API instance\r\n $.ajax({\r\n type: \"POST\",\r\n url: \"/api/LMSSetValue\",\r\n data: lmsInfo,\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n async: false,\r\n success: function (response) {\r\n lmsInfo = response;\r\n that.LastError = lmsInfo.errorCode;\r\n that.LastErrorString = lmsInfo.errorString\r\n // check error code from server\r\n if (lmsInfo.errorCode != \"0\") {\r\n returnValue = \"false;\"\r\n return \"false\";\r\n }\r\n else {\r\n returnValue = lmsInfo.ReturnValue;\r\n return lmsInfo.ReturnValue;\r\n }\r\n },\r\n error: function (request, error) {\r\n // Ajax call failed\r\n that.LastError = \"101\"; //general exception\r\n that.LastErrorString = error;\r\n that.LastErrorDiagnostic = \"AJAX error\";\r\n WriteToDebug(\"Ajax error\");\r\n WriteToDebug(error.Message);\r\n return \"false\";\r\n }\r\n });\r\n return returnValue;\r\n }\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function LMSCommit()\r\n\t** Inputs: None\r\n\t** Return: None\r\n\t**\r\n\t** Description:\r\n\t** Call the LMSCommit function \r\n\t**\r\n\t*******************************************************************************/\r\n function _LMSCommit(val) {\r\n // LMSCommit is a no-op since we commit every time.\r\n if (val != '') {\r\n this.LastErrorString = \"Value passed to LMSCommit, should be blank\";\r\n this.LastError = \"201\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n return \"false\";\r\n }\r\n if (!this.initialized) {\r\n this.LastErrorString = \"LMS is not initialized, call to LMSCommit ignored.\";\r\n this.LastError = \"301\";\r\n this.LastErrorDiagnostic = \"Error from API\";\r\n return \"false\";\r\n }\r\n return \"true\";\r\n }\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function LMSGetLastError()\r\n\t** Inputs: None\r\n\t** Return: The error code that was set by the last LMS function call\r\n\t**\r\n\t** Description:\r\n\t** Call the LMSGetLastError function \r\n\t**\r\n\t*******************************************************************************/\r\n function _LMSGetLastError() {\r\n return this.LastError;\r\n }\r\n\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function LMSGetErrorString(errorCode)\r\n\t** Inputs: errorCode - Error Code\r\n\t** Return: The textual description that corresponds to the input error code\r\n\t**\r\n\t** Description:\r\n\t** Call the LMSGetErrorString function \r\n\t**\r\n\t********************************************************************************/\r\n function _LMSGetErrorString() {\r\n return this.LastErrorString;\r\n }\r\n\r\n\t/*******************************************************************************\r\n\t**\r\n\t** Function MSGetDiagnostic()\r\n\t** Return: The vendor specific textual description that corresponds to the \r\n\t** input error code\r\n\t**\r\n\t** Description:\r\n\t** Call the LMSGetDiagnostic function\r\n\t**\r\n\t*******************************************************************************/\r\n function _LMSGetDiagnostic() {\r\n return this.LastErrorDiagnostic;\r\n }\r\n} // end API\r\n/*********************************************************************************\r\n**\r\n** Function createLMSInfo(...)\r\n** returns an LMSInfo object for data transfer to and from the server\r\n * \r\n*********************************************************************************/\r\nfunction createLMSInfo(Sessionid, user_id, core_id, SCORM_course_id, SCO_identifier, DataItem, DataValue, ErrorCode, ErrorString, ErrorDiagnostic, ReturnValue) {\r\n var o = new Object();\r\n o.sessionId = Sessionid;\r\n o.userId = user_id;\r\n o.coreId = core_id;\r\n o.scoIdentifier = SCO_identifier;\r\n o.scormCourseId = SCORM_course_id;\r\n o.dataItem = DataItem;\r\n o.dataValue = DataValue;\r\n o.errorCode = ErrorCode;\r\n o.errorString = ErrorString;\r\n o.errorDiagnostic = ErrorDiagnostic;\r\n o.returnValue = ReturnValue;\r\n for (prop in o) {\r\n if (o[prop] == null) {\r\n o[prop] = \"null\";\r\n }\r\n }\r\n return o;\r\n}\r\n/*********************************************************************************\r\n**\r\n** Debug functions\r\n**\r\n*********************************************************************************/\r\nfunction WriteToDebug(strInfo) {\r\n\r\n if (blnDebug) {\r\n\r\n var dtm = new Date();\r\n var strLine;\r\n\r\n strLine = aryDebug.length + \":\" + dtm.toString() + \" - \" + strInfo;\r\n\r\n aryDebug[aryDebug.length] = strLine;\r\n\r\n if (winDebug && !winDebug.closed) {\r\n winDebug.document.body.appendChild(winDebug.document.createTextNode(strLine));\r\n winDebug.document.body.appendChild(winDebug.document.createElement(\"br\"));\r\n }\r\n\r\n }\r\n return;\r\n}\r\n\r\n//public\r\nfunction ShowDebugWindow() {\r\n var renderLog = function () {\r\n var i,\r\n len = aryDebug.length;\r\n\r\n winDebug.document.body.innerHTML = \"\";\r\n for (i = 0; i < len; i += 1) {\r\n winDebug.document.body.appendChild(winDebug.document.createTextNode(aryDebug[i]));\r\n winDebug.document.body.appendChild(winDebug.document.createElement(\"br\"));\r\n }\r\n };\r\n\r\n if (winDebug && !winDebug.closed) {\r\n winDebug.close();\r\n }\r\n\r\n winDebug = window.open(\"/SCORM/ThinClient/blank.html\", \"Debug\", \"width=600,height=300,resizable,scrollbars\");\r\n\r\n if (winDebug === null) {\r\n alert(\"Debug window could not be opened, popup blocker in place?\");\r\n }\r\n else {\r\n if (winDebug.addEventListener || winDebug.attachEvent) {\r\n winDebug[winDebug.addEventListener ? 'addEventListener' : 'attachEvent'](\r\n (winDebug.attachEvent ? 'on' : '') + 'load',\r\n renderLog,\r\n false\r\n );\r\n }\r\n\r\n renderLog();\r\n\r\n winDebug.document.close();\r\n winDebug.focus();\r\n }\r\n\r\n return;\r\n}\r\n\r\n//public\r\nfunction DisplayError(strMessage) {\r\n\r\n var blnShowDebug;\r\n\r\n WriteToDebug(\"In DisplayError, strMessage=\" + strMessage);\r\n\r\n blnShowDebug = confirm(\"An error has occured:\\n\\n\" + strMessage + \"\\n\\nPress 'OK' to view debug information to send to technical support.\");\r\n\r\n if (blnShowDebug) {\r\n ShowDebugWindow();\r\n }\r\n\r\n}\r\n\r\n"]}