var project={"_id":"56dcb42bde78eca41cc5a741","id":"c5e29a3cc442550225728ea69523ad51ecbf3330","name":"Daily Weather Calendar (Public)","user":"566ac9850286a8f9080cdd79","description":"Heat calendar for weather conditions per airport","created":"2016-02-05T15:19:42.969Z","shared":false,"server":"micro","datafiles":[{"file":{"link":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/weather/conditions-stats?airport=ellx","type":"URL/API","url":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/weather/conditions-stats?airport=ellx","message":{"error":false,"text":""}},"varname":"weather","title":"Weather Conditions","activated":true,"name":"datafile","linkedtofile":true,"optional":true,"content":"","sendtojs":true},{"file":{"link":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/weather/metar-list?airport=ellx","type":"URL/API","url":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/weather/metar-list?airport=ellx","message":{"error":false,"text":""}},"varname":"live","title":"Live Weather","activated":true,"name":"datafile","linkedtofile":true,"optional":true,"content":"","sendtojs":true},{"file":{"link":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/weather/monthly-conditions-stats?airport=ellx","type":"URL/API","url":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/weather/monthly-conditions-stats?airport=ellx","message":{"error":false,"text":""}},"varname":"monthly","title":"Monthly Stats","activated":true,"name":"datafile","linkedtofile":true,"optional":true,"content":"","sendtojs":true},{"file":{"link":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/locations/international-list?api_key=7c3cb620-ed23-11e5-a5f9-adff4fb3e3e1","type":"URL/API","url":"https://v4p4sz5ijk.execute-api.us-east-1.amazonaws.com/anbdata/airports/locations/international-list?api_key=7c3cb620-ed23-11e5-a5f9-adff4fb3e3e1","message":{"error":false,"text":""}},"varname":"intairports","title":"International Airports","activated":true,"name":"datafile","linkedtofile":true,"optional":true,"content":"","sendtojs":true}],"packs":["bootstrap","highcharts","jquery","D3"],"container":"mainpart","js":{"file":{"type":"","url":"","link":"","message":{"error":true,"text":"File not defined"},"depurl":"https://quipslibistars.s3.amazonaws.com/prod/c5e29a3cc442550225728ea69523ad51ecbf3330/script.js"},"title":"Javascript","activated":true,"name":"js","linkedtofile":false,"optional":true,"content":"\n\nvar width = 800,\n height = 136,\n cellSize = 13; // cell size\nvar today = new Date().toISOString().substring(4,10);\ntoday = \"2015\" + today;\nvar forwardAPI = \"https://api.anbdata.com/anb/services/forward\";\n\nvar metarAPI = \"https://api.anbdata.com/anb/airports/weather/metar-list\";\nvar statsAPI = \"https://api.anbdata.com/anb/airports/weather/conditions-stats\";\nvar monthlystatsAPI = \"https://api.anbdata.com/anb/airports/weather/monthly-conditions-stats\";\n\nvar startDate = new Date(2015, 0, 1);\nvar endDate = new Date(2016, 0, 1);\n\nvar waitText = d3.select(\"#wait\");\nvar airport = d3.select(\"#autocomp\"),\n apt = airport.property(\"value\").toUpperCase();\nvar metric = d3.select(\"#metric\"),\n met = metric.property(\"value\");\n \nvar summary = d3.select(\"#summary\");\nvar goButton = d3.select(\"#go\");\n\nvar percent = d3.format(\".1%\"),\n format = d3.time.format(\"%y-%m-%d\"),\n threeDigits = d3.format(\".3n\"),\n betterDate = d3.time.format(\"%Y-%m-%d\");\n\nvar titles=[\n {\n name: \"Precipitation\",\n field: \"precipitation\",\n max: 3,\n color: d3.scale.linear().domain([0, 3]).range([\"white\",\"darkblue\"])\n },\n {\n name: \"Visib. & Ceiling\",\n field: \"visibility\",\n max: 5,\n color: d3.scale.linear().domain([0, 5]).range([\"white\",\"darkgray\"])\n },\n {\n name: \"Freezing Cond.\",\n field: \"freezing\",\n max: 4,\n color:d3.scale.linear().domain([0, 4]).range([\"white\",\"purple\"])\n },\n {\n name: \"Wind\",\n field: \"wind\",\n max: 5,\n color: d3.scale.linear().domain([0, 5]).range([\"white\",\"darkgreen\"])\n },\n {\n name: \"Dangerous Phen.\",\n max: 30,\n field: \"dangerous\",\n color: d3.scale.linear().domain([0, 30]).range([\"white\",\"darkred\"])\n }];\n\n $('#autocomp').typeahead({minLength:3,source:function(query,next){\n var s=[]\n intairports.forEach(function(apt){\n if ((apt.airportName.toUpperCase().indexOf(query.toUpperCase())>=0)||\n (apt.airportCode.indexOf(query.toUpperCase())>=0)||\n (apt.cityName.toUpperCase().indexOf(query.toUpperCase())>=0)) {\n s.push(apt.airportName+\" (\"+apt.airportCode+\"), \"+apt.cityName)\n }\n })\n next(s)\n }})\n\n\nvar color = d3.scale.linear()\n .domain([0, 5])\n .range([\"white\",\"darkblue\"]);\nvar calendars = d3.select(\"#calendar\").selectAll(\"svg\")\n .data(titles)\n .enter().append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height)\n //.style(\"margin\",\"auto\")\n .attr(\"class\", function(d) {return d.field;})\n .append(\"g\")\n //.attr(\"transform\", \"translate(\" + ((width - cellSize * 53) / 2) + \",\" + (height - cellSize * 7 - 1) + \")\");\n .attr(\"transform\", \"translate(\" + ((width - cellSize * 53) / 2) + \",20)\");\n\n calendars.append(\"text\")\n //.attr(\"transform\", \"translate(-6,\" + cellSize * 3.5 + \")rotate(-90)\")\n .attr(\"transform\", \"translate(\" + cellSize * 3.5 + \",-6)\")\n .style(\"text-anchor\", \"start\")\n .text(function(d) { return d.name; });\n\n calendars.append(\"text\")\n //.attr(\"transform\", \"translate(-6,\" + cellSize * 3.5 + \")rotate(-90)\")\n .attr(\"transform\", \"translate(\"+(width-200)+\",\"+(height-25)+\")\")\n .style(\"text-anchor\", \"start\")\n .text(\"0\");\n calendars.append(\"text\")\n //.attr(\"transform\", \"translate(-6,\" + cellSize * 3.5 + \")rotate(-90)\")\n .attr(\"transform\", \"translate(\"+(width-100)+\",\"+(height-25)+\")\")\n .style(\"text-anchor\", \"start\")\n .text(\"10\");\ncalendars.selectAll('.legend')\n .data([0,1,2,3,4,5,6,7,8,9,10])\n .enter().append(\"rect\")\n .attr(\"class\", \"legend\")\n .attr(\"width\", 8)\n .attr(\"height\", cellSize)\n .attr(\"x\", function(d) { return width-190+d*8})\n .attr(\"y\", function(d) { return height-25-cellSize; })\n .style(\"fill\",function(d){\n var para=d3.select(this.parentNode).datum()\n return para.color(d*para.max/10)\n })\n\nvar rect = calendars.selectAll(\".day\")\n .data(d3.time.days(startDate, endDate))\n .enter().append(\"rect\")\n .attr(\"class\", \"day\")\n .attr(\"width\", cellSize)\n .attr(\"height\", cellSize)\n .attr(\"x\", function(d) { return d3.time.weekOfYear(d) * cellSize; })\n .attr(\"y\", function(d) { return d.getDay() * cellSize; })\n .classed(\"today\", function(d) {\n return (today === d.toISOString().substring(0,10));\n })\n .datum(format);\n\nrect.append(\"title\")\n .text(function(d) { return d; });\n\ncalendars.selectAll(\".month\")\n .data(d3.time.months(startDate, endDate))\n .enter().append(\"path\")\n .attr(\"class\", \"month\")\n .attr(\"d\", monthPath);\n\nmetric.on(\"change\", function() {\n met = d3.event.target.value;\n redraw(); });\n\n\n\n\nfunction redraw() {\n summary.html(live.thetab);\n $(\"i.info\").click(function(e){\n $(\"#\"+$(this).attr(\"name\")).modal()\n })\n chart.series[0].data=[];\n var s = 0,\n n = 0;\n titles.forEach(function(val,index) {\n //graph1\n s += live[val.field];\n n += val.max;\n chart.series[0].data.push(\n {\n y: Math.round(100*live[val.field] / val.max)/10,\n color: val.color(live[val.field])\n });\n //graph2\n chart2.series[index].data=[]\n chart2.series[index].color=val.color(val.max)\n monthly.forEach(function(month){\n chart2.series[index].data.push({\n y:Math.round(month[\"bad_\"+val.field+\"_avg\"]*10000)/100\n })\n })\n });\n\n //chart.yAxis.plotLines[0].value=s/n\n\n chart.series[0].name = live.airport;\n $(\"#graph\").highcharts(chart);\n $(\"#graph2\").highcharts(chart2);\n met = metric.property(\"value\");\n d3.select(\"#apcode\").text(live.airport);\n rect.style(\"fill\",function(d) {\n var metar = weather.filter(function(r) { return r.date === d; })[0];\n var para = d3.select(this.parentNode).datum();\n return (metar ? para.color(metar[para.field + \"_\" + met]) : para.color(0));\n });\n\n rect.filter(function(d) {\n var metar = weather.filter(function(r) { return r.date === d; })[0];\n return metar; // keep if data is available\n })\n .select(\"title\")\n .text(\n function(d) {\n var metar = weather.filter(function(r) { return r.date === d; })[0];\n var para = d3.select(this.parentNode).datum();\n var para2 = d3.select(this.parentNode.parentNode.parentNode).datum();\n var what = d3.select(this.parentNode.parentNode.parentNode).attr(\"class\");\n //return metar[what + \"_\" + met]\n return betterDate(format.parse(d)) + \": \" + Math.round(Number(metar[what + \"_\" + met])*10/para2.max)+\"/10\";\n });\n\n \n}\nfunction jqjson(req,next){\n $.getJSON(req,function(res){next(null,res)})\n}\nfunction query() {\n waitText.classed(\"hidden\", false);\n apt = airport.property(\"value\").toUpperCase().split(/[()]/)[1]\n var mdata={url:\"http://test.anbdata.com:8000/anb/airports/weather/metar-list\",qs:{airport:apt}}\n queue()\n //.defer(d3.json, metarAPI + \"?airport=\" + apt)\n .defer(jqjson, forwardAPI + \"?callback=?&data=\"+JSON.stringify(mdata))\n .defer(jqjson, statsAPI + \"?callback=?&airport=\" + apt)\n .defer(jqjson, monthlystatsAPI + \"?callback=?&airport=\" + apt)\n .await(function(error, met, stat, mon) {\n weather = stat;\n live = met;\n monthly = mon;\n waitText.classed(\"hidden\", true);\n redraw();\n });\n}\n\ngoButton.on(\"click\", function() { query()});\nquery()\n\nfunction monthPath(t0) {\n var t1 = new Date(t0.getFullYear(), t0.getMonth() + 1, 0),\n d0 = t0.getDay(), w0 = d3.time.weekOfYear(t0),\n d1 = t1.getDay(), w1 = d3.time.weekOfYear(t1);\n return \"M\" + (w0 + 1) * cellSize + \",\" + d0 * cellSize\n + \"H\" + w0 * cellSize + \"V\" + 7 * cellSize\n + \"H\" + w1 * cellSize + \"V\" + (d1 + 1) * cellSize\n + \"H\" + (w1 + 1) * cellSize + \"V\" + 0\n + \"H\" + (w0 + 1) * cellSize + \"Z\";\n}\n\nvar chart={\n chart: {\n type: 'column'\n },\n \n credits:{\n enabled:false\n },\n title: {\n text: 'Severity by Weather Class'\n },\n subtitle: {\n text: 'Current weather'\n },\n xAxis: {\n categories: [\n 'Precipitation','Visibility & Ceiling','Freezing Cond.','Wind','Dangerous Phen.'\n ]\n },\n yAxis: {\n min: 0,\n max:10,\n tickInterval:1,\n title: {\n text: 'Severity'\n }\n //,\n //plotLines:[{value:5,\n // width:2,\n // dashStyle:\"shortdash\",\n // color:\"red\"\n //}]\n },\n legend:{enabled:false},\n series: [{\n dataLabels:{enabled:true},name:\"\",data:[]}]\n}\nvar chart2={\n chart: {\n type: 'column'\n },\n credits:{\n enabled:false\n },\n title: {\n text: 'Monthly Averages'\n },\n subtitle:{\n text:\"Percentage of bad weather conditions (severity >0) per month by weather class\"\n },\n xAxis: {\n categories: [\n 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'\n ]\n },\n yAxis: {\n min: 0,\n max:100,\n tickInterval:10,\n title: {\n text: 'Bad conditions (%)'\n }\n },\n legend:{enabled:true},\n series: [\n {name:'Precipitation',data:[]},\n {name:'Visibility & Ceiling',data:[]},\n {name:'Freezing Cond.',data:[]},\n {name:'Wind',data:[]},\n {name:'Dangerous Phen.',data:[]}\n\n ]\n}\nredraw()\n\n"},"css":{"file":{"type":"","url":"","link":"","message":{"error":true,"text":"File not defined"}},"title":"Cascading Style Sheet (CSS)","activated":true,"name":"css","linkedtofile":false,"optional":true,"content":".day {\n fill: #fff;\n stroke: #ccc;\n}\n\n.month {\n fill: none;\n stroke: #000;\n stroke-width: 2px;\n}\n\n.today {\n stroke: yellow;\n stroke-width: 4px;\n /*margin: 4px;*/\n}\n\n.hidden{\n display: none;\n}\n\nform {\n margin-bottom: 5em;\n margin-top: 5em;\n}\n\nlabel{\n display: inline-block;\n float: left;\n clear: left;\n width: 250px;\n text-align: right;\n}\nlabel + input {\n display: inline-block;\n float: left;\n margin-bottom: 5px;\n}\n\nlabel + select {\n display: inline-block;\n float: left;\n}\n\n#calendar {\n //padding-left: 70px;\n padding-bottom: 30px;\n}\n\n#decoded td {\n border-color:#ddd;\n}"},"jade":{"file":{"type":"","url":"","link":"","message":{"error":true,"text":"File not defined"},"depurl":"https://quipslibistars.s3.amazonaws.com/prod/c5e29a3cc442550225728ea69523ad51ecbf3330/main.jade"},"title":"Jade","activated":true,"name":"jade","linkedtofile":false,"optional":false,"content":".container(style=\"width:800px\")\n h1.text-center(style=\"text-align:center\") Weather Conditions Worldwide\n br\n p This application provides information about \n strong weather conditions \n | at international aerdromed worldwide using METeorological Aerodrome Reports (METARS) \n | as available through the \n a(href=\"https://www.aviationweather.gov/adds/metars\",target=\"_blank\") AVIATION WEATHER CENTER\n | . The algorithm is largely based on a technical note from Eurocontrol on \n a(href=\"https://www.eurocontrol.int/sites/default/files/publication/files/algorithm-met-technical-note.pdf\",target=\"_blank\") Algorithm to describe weather conditions at European airports\n p Use the search box to select an aerdrome by name or code. \n | Current and historical conditions for various weather classes will be displayed. Severity scores are provided for each weather class.\n p APIs to access the data will be provided soon.\n p This is a beta version of the application. For any comments or suggestions, contact space@icao.int\n p: em Please read the \n a(href=\"http://www.icao.int/Pages/Disclaimer.aspx\",target=\"_blank\") terms and conditions \n | related to the use of this app.\n\n form\n label Airport/City name or ICAO code:\n //input#airport(type=\"text\", value=\"ELLX\")\n input#autocomp(type=\"text\",size=35,data-provide=\"typeahead\",value=\"Luxembourg (ELLX), Luxembourg\")\n input#go.btn.btn-info.btn-xs(type=\"button\", value=\"Go\")\n \n //label Display Daily:\n select#metric(style=\"display:none\")\n option(value=\"avg\") Average\n option(value=\"max\",selected) Worst\n \n span#wait.hidden Be patient ...\n #summary\n #graph(style=\"width:700px;height:300px;margin:auto\")\n #graph2(style=\"width:700px;height:300px;margin:auto\")\n h2#title.text-center\n | 2015 Daily Maximum Severity at \n span#apcode ELLX\n #calendar(style=\"width:100%\")\n\n\n#precipitation.modal.fade(tabindex=\"-1\",role=\"dialog\")\n .modal-dialog\n .modal-content\n .modal-header\n button.close(type=\"button\",data-dismiss=\"modal\",aria-label=\"Close\")\n span(aria-hidden=\"true\")×\n h4.modal-title Precipitation: Highest Coeff. 3\n .modal-body\n table.table.table-condensed\n thead\n tr\n th Coefficient\n th Type of precipitations\n tbody\n tr\n td 0\n td No precipitation\n tr\n td 1\n td RA, (+)DZ, UP, -RASN, -SNRA\n tr\n td 2\n td +RA, SG, BLSN, DRSN, RASN, SNRA, -SN\n tr\n td 3\n td (+-)FZxx (+)SN\n div(style=\"font-size:10px\")\n p: em RA: RA, SHRA, TSRA. SN: SN, SHSN, TSSN. UP: UP, SHUP, TSUP. PL: PL, SHPL, TSPL. GR: GR, SHGR, TSGR.\n p: em GS: GS, SHGS,TSGS. FZxx: FZRA, FZDZ\n p: em No intensity: moderate.\n p: em (+): moderate or heavy. \n p: em (-): moderated or light. \n p: em (-+): All\n p: em Final scores are cooefficient values normalized to 10/10 scale, rounded to the closest\n\n#freezing.modal.fade(tabindex=\"-1\",role=\"dialog\")\n .modal-dialog\n .modal-content\n .modal-header\n button.close(type=\"button\",data-dismiss=\"modal\",aria-label=\"Close\")\n span(aria-hidden=\"true\")×\n h4.modal-title Freezing Conditions: Highest Coeff. 4\n .modal-body\n table.table.table-condensed\n thead\n tr\n th Coefficient\n th Temperature [C]\n th Moisture presence\n th True Temperatur & Dew Point [C]\n tbody\n tr\n td 0\n td T>3\n td NO visible moisture\n td Any\n tr\n td 0\n td T>3\n td visible moisture\n td Any\n tr\n td 0\n td -15 < T =< 3\n td NO visible moisture\n td TT - DP >= 3\n tr\n td 1\n td -15 < T =< 3\n td (-+)DZ, (-)RA, -RASN, -SNRA, UP, FG, BR\n td TT - DP < 3\n tr\n td 3\n td -15 < T =< 3\n td -SN, +RA, RASN, SNRA, SG, GR,GS, PL\n td Any\n tr\n td 4\n td -15 < T =< 3\n td (+)SN, (+-)FZxx\n td Any\n tr\n td 4\n td T < -15\n td visible moisture\n td Any\n div(style=\"font-size:10px\")\n p: em RA: RA, SHRA, TSRA. SN: SN, SHSN, TSSN. UP: UP, SHUP, TSUP. PL: PL, SHPL, TSPL. GR: GR, SHGR, TSGR.\n p: em GS: GS, SHGS,TSGS. FZxx: FZRA, FZDZ\n p: em No intensity: moderate.\n p: em (+): moderate or heavy. \n p: em (-): moderated or light. \n p: em (-+): All\n p: em Final scores are cooefficient values normalized to 10/10 scale, rounded to the closest\n#wind.modal.fade(tabindex=\"-1\",role=\"dialog\")\n .modal-dialog\n .modal-content\n .modal-header\n button.close(type=\"button\",data-dismiss=\"modal\",aria-label=\"Close\")\n span(aria-hidden=\"true\")×\n h4.modal-title Wind: Highest Coeff. 5\n .modal-body\n table.table.table-condensed\n thead\n tr\n th Coefficient\n th Wind Speed [KT]\n tbody\n tr\n td 0\n td =< 15\n tr\n td 1\n td between 16 and 20\n tr\n td 2\n td between 21 and 30\n tr\n td 4\n td > 30\n div(style=\"font-size:10px\")\n p: em For Gust add +1 to the coefficient\n p: em Final scores are cooefficient values normalized to 10/10 scale, rounded to the closest\n#visibility.modal.fade(tabindex=\"-1\",role=\"dialog\")\n .modal-dialog\n .modal-content\n .modal-header\n button.close(type=\"button\",data-dismiss=\"modal\",aria-label=\"Close\")\n span(aria-hidden=\"true\")×\n h4.modal-title Visibility and Ceiling: Highest Coeff. 5\n .modal-body\n table.table.table-condensed\n thead\n tr\n th Coefficient\n th Visibility or RVR [meter]\n th\n th Cloud base/vertical visibility [feet]\n tbody\n tr\n td 0\n td >=800\n td(rowspan=4,style=\"vertical-align:middle\"): strong OR \n td >=300\n tr\n td 2\n td between 550 & 750\n td between 200 & 250 with OVC or BKN\n tr\n td 4\n td between 350 & 500\n td between 100 & 150 with OVC or BKN\n tr\n td 5\n td =< 325\n td =< 50 with OVC or BKN\n div(style=\"font-size:10px\")\n p: em Final scores are cooefficient values normalized to 10/10 scale, rounded to the closest\n#dangerous.modal.fade(tabindex=\"-1\",role=\"dialog\")\n .modal-dialog\n .modal-content\n .modal-header\n button.close(type=\"button\",data-dismiss=\"modal\",aria-label=\"Close\")\n span(aria-hidden=\"true\")×\n h4.modal-title Dangerous phenomena: Highest Coeff. 30\n .modal-body\n table.table.table-condensed\n thead\n tr\n th Cloud Cover\n th CB\n th TCU\n tbody\n tr\n td -\n td 0\n td 0\n tr\n td FEW\n td 4\n td 3\n tr\n td SCT\n td 6\n td 5\n tr\n td BKN\n td 10\n td 8\n tr\n td OVC\n td 12\n td 10\n table.table.table-condensed\n thead\n tr\n th CB\n th TCU\n th\n th -SHxx\n th -SHxx & +SHxx\n tbody\n tr\n td -\n td -\n td(rowspan=6,style=\"vertical-align:middle\"): strong +\n td 0\n td 0\n tr\n td -\n td FEW\n td 4\n td 6\n tr\n td FEW\n td SCT\n td 8\n td 12\n tr\n td SCT\n td BKN\n td 10\n td 15\n tr\n td BKN\n td OVC\n td 12\n td 20\n tr\n td OVC\n td -\n td 18\n td 24\n table.table.table-condensed\n thead\n tr\n th Coefficient\n th Type of Dangerous phenomena\n tbody\n tr\n td -\n td 0\n tr\n td GS\n td 18\n tr\n td FC, DS, SS, VA, SA, SA, GR, PL, TS\n td 24\n tr\n td +TS\n td 30\n div(style=\"font-size:10px\")\n p: em Final scores are cooefficient values normalized to 10/10 scale, rounded to the closest\n\n"},"capture":"https://quipslibistars.s3.amazonaws.com/prod/c5e29a3cc442550225728ea69523ad51ecbf3330/capture.png","sharedwith":["568e92dc437f1f671e76a9fd","56d090054e6f52b20ef754d5","57dfeb1654955f1127d5672b"],"morecss":[{"url":"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css"}],"prod":true,"morejs":[{"url":"https://cdnjs.cloudflare.com/ajax/libs/queue-async/1.0.7/queue.min.js"},{"url":"https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.0/bootstrap3-typeahead.min.js"}],"deploydate":"2018-02-02T20:49:18.845Z","libs":[{"_id":"5672b285f36b083214f3e63b","description":"A sleek, intuitive, and powerful mobile first front-end framework for faster and easier web development.","key":"","version":"3.3.6","link":"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css,https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css,https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js","name":"bootstrap","__v":0,"haskey":false,"required":false,"website":"http://www.getbootstrap.com"},{"_id":"5672b2dbf36b083214f3e63c","description":"","key":"","version":"4.2.0","link":"https://code.highcharts.com/highcharts.js","name":"highcharts","__v":0,"haskey":false,"required":false,"website":"Highcharts.com"},{"_id":"5672b602f36b083214f3e63e","description":"The Write Less, Do More, JavaScript Library","key":"","version":"2.1.1","link":"https://code.jquery.com/jquery-2.1.4.js","name":"jquery","__v":0,"required":true,"haskey":false,"website":"https://jquery.com"},{"_id":"568c42d091ce286c15af73fd","required":false,"description":"A JavaScript library for visualizing data with HTML, SVG and CSS.","haskey":false,"version":"3","link":"//d3js.org/d3.v3.min.js,//d3js.org/topojson.v0.min.js","name":"D3","__v":0,"website":"http://d3js.org"}],"host":"https://quips.anbdata.com","version":"prod"} function loadjquery(url,callback) { if(typeof jQuery=='undefined') { loadScript(url,callback) } else { callback() } } function loadScript(url, callback) { var script = document.createElement("script") script.type = "text/javascript"; if (script.readyState) { //IE script.onreadystatechange = function () { if (script.readyState == "loaded" || script.readyState == "complete") { script.onreadystatechange = null; callback(); } }; } else { //Others script.onload = function () { callback(); }; } script.src = url; document.getElementsByTagName("head")[0].appendChild(script); } (function () { loadjquery("https://code.jquery.com/jquery-2.1.4.js", function () { //jQuery loaded $("#"+project.container).html("") var libs=[] $(project.libs).each(function(i,v){ if (v.name!="jquery") { $(v.link.split(",")).each(function(j,u){ if (u.slice(-2)=="js") { libs.push(u+(v.haskey?"?key="+project[v.name+"key"]:"")) } else { $("head").append("") } }) } }) if (project.morejs) { $(project.morejs).each(function(i,v){ if ((v.url.substring(0,2)=="//")||(v.url.substring(0,8)=="https://")||(v.url.substring(0,7)=="http://")) { libs.push(v.url) } }) } if (project.morecss) { $(project.morecss).each(function(i,v){ $("head").append("") }) } loadlibs(libs.reverse()) }); })(); function loadlibs(libs){ if (libs.length>0) { var l=libs.pop() loadScript(l,function(){ //$.getScript(l,function(res){ loadlibs(libs) }) //.fail(function(e){ // loadlibs(libs) // //}) } else { start() } } function putscriptcontent(content){ var script = document.createElement("script") script.type = "text/javascript"; $(script).text(content) document.getElementsByTagName("head")[0].appendChild(script); } function start(){ //load jade $.getJSON(project.host+"/project/"+project.version+"/"+project.id+"/render?callback=?"+(project.datachange?"&data="+project.datachange:""),function(res){ $("#"+project.container).html(res.html) if (project.css.activated) { if (project.css.linkedtofile) { $("head").append("")} else { $("head").append("")} } if (project.js.activated) { if (project.js.linkedtofile) { $.getScript(project.js.file[(project.prod?"depurl":"url")])} else { putscriptcontent(project.js.content)} if (project.mainjs) { window[project.mainjs]() } } }) }