PageSourceSearch

https://tina.trade/js/custom/tina-compare.js?v=0.2.8-jan2021-8

js tina.trade collected 2026-09-29 07:42:58 UTC 30,856 bytes, 703 lines download raw bytes

1var compareColorArray = ['#9370DB',	'#F5F5DC',	'#2E8B57',	'#DDA0DD',	'#5F9EA0',	'#00FF7F',	'#FFEBCD',	'#B8860B',	'#4682B4',	'#00BFFF',	'#800080',	'#F5FFFA',	'#FFEFD5',	'#FFE4C4',	'#000000',	'#A9A9A9',	'#CD853F',	'#FFFFE0',	'#E0FFFF',	'#9932CC',	'#9966CC',	'#FFFFF0',	'#00FFFF',	'#FFFAFA',	'#6A5ACD',	'#FFE4E1',	'#C0C0C0',	'#32CD32',	'#9ACD32',	'#EEE8AA',	'#696969',	'#FFD700',	'#7B68EE',	'#D2691E',	'#40E0D0',	'#F0F8FF',	'#F4A460',	'#D8BFD8',	'#E6E6FA',	'#98FB98',	'#191970',	'#FF0000',	'#006400',	'#000080',	'#FF7F50',	'#ADFF2F',	'#20B2AA',	'#DA70D6',	'#C71585',	'#A52A2A'];
2var isSelected = 0;
3var columnTradeSelected = [];
4var objSelectedFiles = [];
5var articleInformation = [];
6
7window.dss_environment = 'staging';
8const dss_database_url_development = 'http://localhost:30001';
9const dss_database_url_staging = 'https://data-staging.tina.trade';
10const dss_database_url_production = 'https://data.tina.trade';
11
12const dss_database_url = (dss_environment === 'prod') ? dss_database_url_production : ((dss_environment === 'staging') ? dss_database_url_staging : dss_database_url_development);
13
14
15function prepareResources(){
16    var o = `${dss_database_url}/compare/trade-resources`;
17    const locales = localStorage.getItem('lang') || 'en';
18    $.ajax({
19            url: o,
20            type: "GET",
21            dataType: "json",
22            success: function (r) {
23                var _output = '';
24
25                asyncLoop({
26                    length: r.length,
27                    functionToLoop: function (loop, i) {
28                        var _d = r[i];
29
30                        _output += '<div class="col-lg-12 col-md-12 col-sm-1" style="box-shadow: 0 0 13px 0 rgba(82,63,105,.05);border-radius: 4px; margin-bottom:20px; padding:20px">';
31                        _output += _d.IsVideo == 0 ? '<a href="' + _d.DownloadURL + '" target="_blank"><img class="img img-thumbnail float-left" style="width: 200px; margin-right:20px" src="' + _d.ImageURL + '"></a>' : '<iframe width="540" height="315" class="float-left" style="margin-right:20px" src="' + _d.DownloadURL + '" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>';
32                        _output += '<h6 class="' + (_d.IsVideo == 1 ? 'res-vid' : 'res-pub') + '" style="color: #0648a3 !important">  <a href="' + _d.DownloadURL + '" target="_blank">' + (locales==='fr'?_d.Title_fr:_d.Title) + '</a></h6>'
33
34
35                        _output += '<div class="text-justify">';
36                        _output += locales==='fr'?_d.Short_Desc_fr.replace(/(?:\r\n|\r|\n)/g, '<br>'):_d.Short_Desc.replace(/(?:\r\n|\r|\n)/g, '<br>');
37                        _output += '</div>';
38
39                        _output += '</div>';
40                        _output += '<hr/>';
41
42                        loop();
43                    },
44                    callback: function(){
45                        $('#dss_resources_result').html('<div class="row">' + _output + '</div>');
46                    }
47                });
48
49            },
50            error: function (e) {
51                dss_handle_major_error(e), show_error_message("TINA was unable to list relevant trade provisions because the database containing information on trade agreements could not be reached. If this problem persists, please contact us.", a), $("#" + a).addClass("loaded"), $("#" + a + "_loading").hide(), s.resolve([])
52                $('#dss_table_trade_provision_agreeement_table').unblock();
53            }
54    });
55}
56
57function prepCompareEvents(){
58
59    //buttons
60    $("button[id^='btn-gr-trade-count']").unbind('click').click(function(e){
61        return e.preventDefault(),
62        function (e) {
63            showAllTradeFiltered();
64
65            var _btnNumber = e.match(/\d+/g);
66
67            columnTradeSelected = $("td[data-col-trade='row-trade-" + _btnNumber + "'][data-col-trade-value!=1]");
68
69            $("td[data-col-trade='row-trade-" + _btnNumber + "']").css('background-color','#ffed6f');
70
71            for(var i = 0; i < columnTradeSelected.length; i++){
72                $("th[data-trade-col-id='" + columnTradeSelected[i].getAttribute('data-trade-col-id') + "']").hide();
73                $("td[data-trade-col-id='" + columnTradeSelected[i].getAttribute('data-trade-col-id') + "']").hide();
74            }
75
76            var newColumnWidth = 500 + (columnTradeSelected.length * 100);
77            document.getElementById("dss_table_trade_provisions_agreements_result_table").style.width = newColumnWidth + "px";
78
79        }($(this).attr('id'))
80    });
81
82    $('#btn-compare-selected-agreements').unbind("click").click(function (e) {
83            return e.preventDefault(),
84                function (e) {
85                    var ta_names = [];
86                    var ta_prov = [];
87                    for(var i=0; i < e.length; i++){
88                        ta_names.push($('#' + e[i].id).attr('data-trade-agreement-name'));
89                        ta_prov.push(e[i].id.replace('chk_trade_',''));
90                    }
91
92                    //$('#dss_table_trade_agreements_result_comparison_popup_modal_provision').modal('show');
93
94            }($('.chk-trade-class:checked'))
95        });
96
97    $('#trade-reset-btn').unbind('click').click(function(e){
98        showAllTradeFiltered();
99    });
100
101    $('.cls-similar').unbind("click").click(function(e){
102        return e.preventDefault(),
103            function (e,f) {
104                objSelectedFiles = [];
105                var selectedFiles = $('td[data-col-trade="row-trade-' + e + '"][data-col-trade-value=1]');
106                for(var i = 0; i < selectedFiles.length; i++){
107                    objSelectedFiles.push({
108                        filename : selectedFiles[i].getAttribute('data-col-trade-agreement-file'),
109                        articleNumber : selectedFiles[i].getAttribute('data-col-trade-article')
110                    })
111                }
112
113                $('#dss_table_trade_comparison_agreements_result_popup_modal_title_provision').html(f);
114                $('#dss_table_trade_agreements_result_comparison_popup_modal_provision').modal('show');
115        }($(this).attr("data-trade-row"),$(this).attr("data-trade-prov"))
116    });
117
118    $('#dss_table_trade_agreements_result_comparison_popup_modal_provision').on('show.bs.modal', function () {
119        $('#loadingComparison').show();
120        articleInformation = [];
121        $('#comparison-trade-text-body').html('');
122        var fileList = '';
123        //loop filenames
124        asyncLoop({
125            length: objSelectedFiles.length,
126            functionToLoop: function (loop, i) {
127                fileList += '<span class="badge badge-pill" style="margin:5px;background:' + compareColorArray[i] + ';color:' + getContrast(compareColorArray[i]) + '">' + objSelectedFiles[i].filename + '</span>'
128                loop();
129            },
130            callback: function(){
131                $('#comparison-trade-text').html(fileList);
132            }
133        });
134
135        $('#compare-status').html('Processing XML files...');
136        //loop xml
137        asyncLoop({
138            length: objSelectedFiles.length,
139            functionToLoop: function (loop, i) {
140                getXMLArticle(objSelectedFiles[i].filename, objSelectedFiles[i].articleNumber,compareColorArray[i]);
141                loop();
142            },
143            callback: function(){
144                setTimeout(function(){
145                    var _uniqueArticle = articleInformation.map(item => item.articleNameLCase).filter((value, index, self) => self.indexOf(value) === index);
146                    //Loop unique article
147                    $('#compare-status').html('Grouping Article names...');
148                    groupSameArticle(_uniqueArticle);
149                }, 1000);
150            }
151        });
152    });
153}
154
155function groupSameArticle(uniqueArticle){
156    var _htmlOut = '';
157
158    asyncLoop({
159        length: uniqueArticle.length,
160        functionToLoop: function (loop, i) {
161            var _filterArticle = articleInformation.filter(function(e) {
162                  return e.articleNameLCase == uniqueArticle[i];
163                });
164
165            var _finalOutput = [];
166            for(var x = 0; x < _filterArticle.length; x++){
167                _finalOutput.push({
168                    articleTxt : _filterArticle[x].innerArticle,
169                    articleLngth : _filterArticle[x].innerArticle.split(' ').length,
170                    articleBg : _filterArticle[x].bgColor,
171                    articleTrade: _filterArticle[x].filename
172                });
173            }
174
175            //sort descending
176            _finalOutput.sort((a,b)=>( a.articleLngth < b.articleLngth ? 1 : -1 ));
177            //if multiple filenames
178            var _isMultiple = _finalOutput.map(item => item.articleTrade).filter((value, index, self) => self.indexOf(value) === index).length > 1;
179            var _outputtxt = getCommonAndUncommon(_finalOutput, _isMultiple);
180
181            var _filenamesTxt = '';
182            for(var zz = 0; zz < _filterArticle.length; zz++){
183                _filenamesTxt += '<span class="badge badge-pill" style="margin:5px;background:' + _filterArticle[zz].bgColor + ';color:' + getContrast(_filterArticle[zz].bgColor) + '">' + _filterArticle[zz].filename + '</span>';
184            }
185
186            _htmlOut += '<div class="card">';
187            _htmlOut += '<div class="card-header" id="heading_' + i + '">';
188            _htmlOut += '<h2 class="mb-0">';
189            _htmlOut += '<button class="btn btn-sm" id="btn_compare_trade_' + i + '" type="button" data-toggle="collapse" data-target="#CompareCollapse_' + i + '" aria-expanded="true" aria-controls="CompareCollapse_' + i + '" style="text-align: left;">';
190            _htmlOut += ( _filterArticle.length > 1 ? '<div style="float: left;width: 5px;height: 5px;margin-top: 12px;margin-right: 5px;background-color: red;"></div>' : '') + _filterArticle[0].articleName + _filenamesTxt;
191            _htmlOut += '</button>';
192            _htmlOut += '</h2>';
193            _htmlOut += '</div>';
194            _htmlOut += '<div id="CompareCollapse_' + i + '" class="collapse" aria-labelledby="heading_' + i + '" data-parent="#compareAccordion">';
195            _htmlOut += '<div class="card-body" style="font-size: smaller;">';
196            _htmlOut += _outputtxt;
197            _htmlOut += '<p><table class="table table-bordered table-hover table-sm" style="table-layout: fixed"><tr>';
198            for(var zz = 0; zz < _finalOutput.length; zz++){
199                _htmlOut += '<td>' + _finalOutput[zz].articleTxt + '</td>';
200            }
201            _htmlOut += '</tr></table></p>';
202            _htmlOut += '</div></div></div>';
203
204            loop();
205        },
206        callback: function(){
207            setTimeout(function(){
208                $('#loadingComparison').hide();
209                var htmlCompare = '<div class="accordion" id="compareAccordion">';
210                    htmlCompare += _htmlOut;
211                    htmlCompare += '</div>';
212                $('#comparison-trade-text-body').html(htmlCompare);
213            }, 2000);
214        }
215    });
216}
217
218//Process to group common words
219function getCommonAndUncommon(input,multiple){
220    $('#compare-status').html('Comparing words per article...');
221
222    //split first element
223    var compareFirst = input[0].articleTxt.split(' ');
224    var _retVal = [];
225    var dmp = new diff_match_patch();
226
227    var firstCompare = input[0].articleTxt.trim();
228    var diff = [];
229
230    var _diffObj = [];
231    var _comWords = [];
232
233    //diff using diff_patch
234    for(var x = 0; x < input.length-1; x++){
235        diff = JsDiff["diffWords"](firstCompare,input[x+1].articleTxt.trim());
236
237        var _subComWords = [];
238        for (var i=0; i < diff.length; i++) {
239            if (diff[i].added && diff[i + 1] && diff[i + 1].removed) {
240                var swap = diff[i];
241                diff[i] = diff[i + 1];
242                diff[i + 1] = swap;
243            }
244
245            diff[i].value = diff[i].value.trim();
246            diff[i].bgColor = input[x].articleBg;
247
248            if(!diff[i].hasOwnProperty('added') && !diff[i].hasOwnProperty('removed')){
249                if(_comWords.indexOf(diff[i].value) == -1){
250                    _comWords.push(diff[i].value);
251                }
252            }
253        }
254
255        firstCompare = diff.map(item=>item.value).join(' ');
256        _diffObj.push(diff);
257    }
258
259    //validate commonwords accross
260    var elem = 0;
261    while(typeof _comWords[elem] !== 'undefined' ){
262        var _flag = true;
263        for(var y=0;y<input.length;y++){
264            _flag = input[y].articleTxt.includes(_comWords[elem]);
265            if(!_flag){ _comWords = arrayRemove(_comWords, _comWords[elem]); break; }
266        }
267
268        if(_flag) elem++;
269    }
270
271    return splitPerCommon(_comWords, input, firstCompare);
272
273    //loop per word
274//    for(var x = 0; x < compareFirst.length; x++){
275//        var _compareFrom = compareFirst[x].toLowerCase().replace(/\W/g, '');
276//        var _objComp = [];
277//
278//        _objComp.push({
279//            wordLCase :  _compareFrom,
280//            word: compareFirst[x],
281//            bgColor: input[0].articleBg
282//        });
283//
284//        //compare per element/word
285//        for(var y = 1; y < input.length; y++){
286//            var compareEach = input[y].articleTxt.split(' ');
287//
288//            if(typeof compareEach[x] !== 'undefined') {
289//                var _compareTo = compareEach[x].toLowerCase().replace(/\W/g, '');
290//                _objComp.push({
291//                    wordLCase :  _compareTo,
292//                    word: compareEach[x],
293//                    bgColor: input[y].articleBg
294//                });
295//            }
296//            else break;
297//        }
298//
299//
300//        //merge info
301//        //1. find common word
302//        var _res = allEqual(_objComp.map(item => item.wordLCase));
303//        var _uniqueWord = _objComp.map(item => item.wordLCase).filter((value, index, self) => self.indexOf(value) === index);
304//
305//        if(_objComp.length>1){
306//            if(_res){
307//                _retVal.push(_objComp[0].word);
308//            }
309//            else if(_uniqueWord.length == 2){
310//                var _b = [
311//                    {
312//                        word: _uniqueWord[0],
313//                        exactWord: _objComp.filter(function(e) {
314//                          return e.wordLCase == _uniqueWord[0];
315//                        })[0].word,
316//                        ln: _objComp.filter(function(e) {
317//                          return e.wordLCase == _uniqueWord[0];
318//                        }).length,
319//                        bgColor: _objComp.filter(function(e) {
320//                          return e.wordLCase == _uniqueWord[0];
321//                        })[0].bgColor
322//                    },
323//                    {
324//                        word: _uniqueWord[1],
325//                        ln: _objComp.filter(function(e) {
326//                          return e.wordLCase == _uniqueWord[1];
327//                        }).length,
328//                        exactWord: _objComp.filter(function(e) {
329//                          return e.wordLCase == _uniqueWord[1];
330//                        })[0].word,
331//                        bgColor: _objComp.filter(function(e) {
332//                          return e.wordLCase == _uniqueWord[1];
333//                        })[0].bgColor
334//                    }];
335//
336//                _b.sort((a,b)=>( a.ln < b.ln ? 1 : -1 ));
337//                var _diff = _objComp.length - _b[0].ln;
338//
339//                if(_diff == 1){
340//                    _retVal.push(_b[0].exactWord);
341//                    _retVal.push('<span style="background:' + _b[1].bgColor  + ';color:' + getContrast(_b[1].bgColor ) + '">' + _b[1].exactWord + '</span>');
342//                }
343//                else{
344//                    for(var z = 0; z < _objComp.length; z++){
345//                        _retVal.push('<span style="background:' + _objComp[z].bgColor  + ';color:' + getContrast(_objComp[z].bgColor) + '">' + _objComp[z].word + '</span>');
346//                    }
347//                }
348//                //_retVal.push('<span style="background:' + _diffbg[0].bgColor  + ';color:' + getContrast(_diffbg[0].bgColor) + '">' + _diffbg[0].word + '</span>');
349//
350//            }
351//            else{
352//                for(var z = 0; z < _objComp.length; z++){
353//                    _retVal.push('<span style="background:' + _objComp[z].bgColor  + ';color:' + getContrast(_objComp[z].bgColor) + '">' + _objComp[z].word + '</span>');
354//                }
355//            }
356//        }
357//        else{
358//            if(multiple){
359//                for(var z = 0; z < _objComp.length; z++){
360//                    _retVal.push('<span style="background:' + _objComp[z].bgColor  + ';color:' + getContrast(_objComp[z].bgColor) + '">' + _objComp[z].word + '</span>');
361//                }
362//            }
363//            else{
364//                _retVal.push(_objComp[0].word);
365//            }
366//        }
367//    }
368
369    //return _retVal.join(' ');
370}
371
372const allEqual = arr => arr.every(val => val === arr[0]);
373
374function arrayRemove(arr, value) {
375    return arr.filter(function(ele){
376        return ele != value;
377    });
378}
379
380function splitPerCommon(commonword,input,merged){
381    commonword.sort(function(a, b){return b.length - a.length});
382
383    var _x = merged.split(' ');
384    var _u = [];
385    //mark common words - multiple phrase
386    for(var x = 0; x < commonword.length; x++){
387        if(commonword[x]=='') continue;
388        else if(commonword[x].length == 1) continue;
389        else if(commonword[x].split(' ').length == 1 ) continue;
390        merged = merged.split(commonword[x] + ' ').join('|*' + commonword[x].replaceAll(' ', '*') + '*|');
391    }
392
393    var _splitPerUnique = merged.split('|');
394    var _finalMerged = [];
395
396    var _v = new Array(input.length);
397
398    //clean
399    for(var z=0; z < _splitPerUnique.length; z++){
400        var _s = _splitPerUnique[z].trim();
401
402        if(_s == '') continue;
403        if(_s.startsWith('*') && _s.endsWith('*')) _finalMerged.push(_s.replace(/\*/g, ' ').trim());
404
405        else{
406            //search if included
407            var _f = _s.split(' ');
408            for(y = 0; y < _f.length; y++){
409                var _u = _f[y].trim();
410                if(_u.trim() == '') continue;
411
412                for(var x = 0; x < input.length; x++){
413                    var _in = input[x].articleTxt.trim();
414                    var _bg = input[x].articleBg;
415
416                    var _locate = _in.split(' ').indexOf(_u, typeof _v[x] == 'undefined' ? 0 : _v[x] + 1);
417                    if(_locate > -1){
418                        _finalMerged.push('<span style="background:' + _bg  + ';color:' + getContrast(_bg) + '">' + _u + '</span>');
419                        _v[x] = _locate;
420                    }
421                }
422            }
423        }
424    }
425
426    return _finalMerged.join(' ');
427}
428
429function getXMLArticle(xmlpath, chapterNumber, bg){
430
431    var reqXML = new XMLHttpRequest();
432    reqXML.open("GET", 'http://localhost:8888/CompareText/app/data/trade-agreement-xml/' + xmlpath + '.xml', true);
433    reqXML.responseType = 'document';
434    reqXML.overrideMimeType('text/xml');
435
436    reqXML.onload = function () {
437      if (reqXML.readyState === reqXML.DONE) {
438        if (reqXML.status === 200) {
439            var loopArticle = reqXML.responseXML.getElementsByTagName('body')[0].getElementsByTagName('chapter');
440            for(var i = 0; i < loopArticle.length; i++){
441                var _chapterNumber = loopArticle[i].attributes['chapter_identifier'].nodeValue;
442                if(_chapterNumber == chapterNumber){
443                    var _articles = loopArticle[i].getElementsByTagName('article');
444                    for(var x = 0; x < _articles.length; x++ ){
445                        var _number = _articles[x].attributes['number'].nodeValue;
446                        var _name = _articles[x].attributes['name'].nodeValue;
447                        var _innerHtml = _articles[x].innerHTML;
448
449                        articleInformation.push({
450                            filename: xmlpath,
451                            article: _number.replace(/\s\s+/g, ' ').replace(/(\r\n|\n|\r)/gm, " "),
452                            articleName: _name.replace(/\s\s+/g, ' ').replace(/(\r\n|\n|\r)/gm, " "),
453                            articleNameLCase: _name.replace(/\s\s+/g, ' ').replace(/(\r\n|\n|\r)/gm, " ").toLowerCase().replace(/[^A-Za-z]+/g, ''),
454                            innerArticle: _innerHtml.replace(/\s\s+/g, ' ').replace(/(\r\n|\n|\r)/gm, " "),
455                            bgColor: bg
456                        });
457                    }
458                }
459            }
460        }
461      }
462    };
463
464    reqXML.send(null);
465}
466
467function showAllTradeFiltered(){
468    $("td[data-col-trade^='row-trade']").css('background-color','transparent');
469    $('#dss_table_trade_provisions_agreements_result_table th').show();
470    $('#dss_table_trade_provisions_agreements_result_table td').show();
471
472    var newColumnWidth = 500 + (columnTradeSelected.length * 100);
473    document.getElementById("dss_table_trade_provisions_agreements_result_table").style.width = newColumnWidth + "px";
474}
475
476//Read XML File
477function getXML(xmlpath) {
478    $('#dss_table_trade_xml_loading').show();
479    $("#dss_table_trade_xml_loading_error").hide();
480    $("#inp_trade_search").show();
481    $("#sm_trade_search").show();
482
483    $('#dss_table_status_table_trade_agreement').html('');
484    $('#dss_table_composition_table_trade_agreement').html('');
485    $('#dss_trade_xml_holder').html('');
486    $('#dss_table_implemdate_table_trade_agreement').html('');
487
488    dss_trade_agreement_contents = new Array();
489
490    var reqXML = new XMLHttpRequest();
491    reqXML.open("GET", 'http://localhost:8888/CompareText/app/data/trade-agreement-xml/' + xmlpath + '.xml', true);
492    reqXML.responseType = 'document';
493    reqXML.overrideMimeType('text/xml');
494
495    reqXML.onload = function () {
496      if (reqXML.readyState === reqXML.DONE) {
497        if (reqXML.status === 200) {
498            var loopArticle = reqXML.responseXML.getElementsByTagName('body')[0].getElementsByTagName('chapter');
499            var taType = reqXML.responseXML.getElementsByTagName('meta')[0].getElementsByTagName('status');
500            var taCompo = reqXML.responseXML.getElementsByTagName('meta')[0].getElementsByTagName('composition');
501            var taImplemDate = reqXML.responseXML.getElementsByTagName('meta')[0].getElementsByTagName('end_implementation');
502
503            var isocodes = reqXML.responseXML.getElementsByTagName('meta')[0].getElementsByTagName('partyisocode');
504            var isocde = [];
505
506            asyncLoop({
507                length: isocodes.length,
508                functionToLoop: function (loop, i) {
509                    isocde.push(isocodes[i].innerHTML);
510                    loop();
511                },
512                callback: function(){
513                    var econFlags = '';
514                    isocde.forEach(function(g){
515                       if(g!='') econFlags += '<span data-toggle="kt-tooltip" data-placement="top" title="' + String(dss_economies_by_iso3[g]) + '" class="kt-margin-r-5 flag-icon flag-icon-' + String(dss_economies_iso2_by_iso3[g]).toLowerCase() + '" data-original-title="' + String(dss_economies_by_iso3[g]) + '"></span>';
516                    });
517                    $('#dss_table_economies_table_trade').html(econFlags);
518                }
519            });
520
521            var taAccordion = '<div class="accordion" id="tradeAgreementAccordion_res">';
522
523            asyncLoop({
524                length: loopArticle.length,
525                functionToLoop: function (loop, i) {
526                    var _artCnt = loopArticle[i].getElementsByTagName('article');
527
528                    var _artName = loopArticle[i].attributes['name'].nodeValue;
529                    var _artNumber = loopArticle[i].attributes['number'].nodeValue;
530                    var _artInnerHtml = loopArticle[i].innerHTML;
531
532                    taAccordion += '<div class="card" id="div_hdr_ta_' + i + '">';
533                    taAccordion += '<div class="card-header" id="heading_trade_' + i + '">';
534                    taAccordion += '<h2 class="mb-0">';
535                    taAccordion += '<button class="btn" id="btn_trade_' + i + '" type="button" data-toggle="collapse" data-target="#collapse_' + i + '" aria-expanded="true" aria-controls="collapse_' + i + '">';
536                    taAccordion += _artNumber == '-' ? _artName : _artNumber + ' - ' + _artName ;
537                    taAccordion += '</button>';
538                    taAccordion += '</h2>';
539                    taAccordion += '</div>';
540                    taAccordion += '<div id="collapse_' + i + '" class="collapse" aria-labelledby="heading_' + i + '" data-parent="#tradeAgreementAccordion_res">';
541                    taAccordion += '<div class="card-body" id="cb_trade_' + i + '">';
542
543                    //loop articles
544                    for(var x = 0; x < _artCnt.length; x++){
545                        var _artSubInnerHtml = _artCnt[x].innerHTML;
546                        var _artSubName = _artCnt[x].attributes['name'].nodeValue;
547                        var _artSubNumber = _artCnt[x].attributes['number'].nodeValue;
548
549                        taAccordion += '<div class="card" id="div_subhdr_ta_' + i + '_' + x + '">';
550                        taAccordion += '<div class="card-header" id="sub_heading_trade_' + i + '_' + x + '">';
551                        taAccordion += '<h2 class="mb-0">';
552                        taAccordion += '<button class="btn" id="btn_subtrade_' + i + '_' + x + '" type="button" data-toggle="collapse" data-target="#collapse_' + i + '_' + x + '" aria-expanded="true" aria-controls="collapse_' + i + '_' + x + '">';
553                        taAccordion += _artSubNumber == '-' ? _artSubName : _artSubNumber + ' - ' + _artSubName ;
554                        taAccordion += '</button>';
555                        taAccordion += '</h2>';
556                        taAccordion += '</div>';
557                        taAccordion += '<div id="collapse_' + i + '_' + x + '" class="card-body collapse" aria-labelledby="subheading_' + i + '_' + x + '" data-parent="#cb_trade_' + i + '">';
558                        taAccordion += _artSubInnerHtml.replace(/(?:\r\n|\r|\n)/g, '');
559                        taAccordion += '</div>';
560                        taAccordion += '</div>';
561                    }
562
563                    taAccordion += '</div>';
564                    taAccordion += '</div>';
565                    taAccordion += '</div>';
566
567                    loop();
568                },
569                callback: function(){
570                    taAccordion += '</div>';
571
572                    $('#dss_table_status_table_trade_agreement').html(taType);
573                    $('#dss_table_composition_table_trade_agreement').html(taCompo);
574                    $('#dss_trade_xml_holder').html(taAccordion);
575                    $('#dss_table_implemdate_table_trade_agreement').html(taImplemDate);
576                }
577            });
578          }
579          else{
580               $("#dss_table_trade_xml_loading_error").show();
581               $("#inp_trade_search").hide();
582               $("#sm_trade_search").hide();
583          }
584        }
585
586        $('#dss_table_trade_xml_loading').hide();
587    };
588    reqXML.send(null);
589}
590
591var getContrast = function (hexcolor){
592
593	// If a leading # is provided, remove it
594	if (hexcolor.slice(0, 1) === '#') {
595		hexcolor = hexcolor.slice(1);
596	}
597
598	// If a three-character hexcode, make six-character
599	if (hexcolor.length === 3) {
600		hexcolor = hexcolor.split('').map(function (hex) {
601			return hex + hex;
602		}).join('');
603	}
604
605	// Convert to RGB value
606	var r = parseInt(hexcolor.substr(0,2),16);
607	var g = parseInt(hexcolor.substr(2,2),16);
608	var b = parseInt(hexcolor.substr(4,2),16);
609
610	// Get YIQ ratio
611	var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;
612
613	// Check contrast
614	return (yiq >= 128) ? 'black' : 'white';
615
616};
617
618//Rate similarity
619function similar_text(first, second) {
620    // Calculates the similarity between two strings
621    // discuss at: http://phpjs.org/functions/similar_text
622
623    if (first === null || second === null || typeof first === 'undefined' || typeof second === 'undefined') {
624        return 0;
625    }
626
627    first += '';
628    second += '';
629
630    var pos1 = 0,
631        pos2 = 0,
632        max = 0,
633        firstLength = first.length,
634        secondLength = second.length,
635        p, q, l, sum;
636
637    max = 0;
638
639    for (p = 0; p < firstLength; p++) {
640        for (q = 0; q < secondLength; q++) {
641            for (l = 0;
642            (p + l < firstLength) && (q + l < secondLength) && (first.charAt(p + l) === second.charAt(q + l)); l++);
643            if (l > max) {
644                max = l;
645                pos1 = p;
646                pos2 = q;
647            }
648        }
649    }
650
651    sum = max;
652
653    if (sum) {
654        if (pos1 && pos2) {
655            sum += this.similar_text(first.substr(0, pos2), second.substr(0, pos2));
656        }
657
658        if ((pos1 + max < firstLength) && (pos2 + max < secondLength)) {
659            sum += this.similar_text(first.substr(pos1 + max, firstLength - pos1 - max), second.substr(pos2 + max, secondLength - pos2 - max));
660        }
661    }
662
663    return sum;
664}
665
666function Compare(strA,strB){
667    for(var result = 0, i = strA.length; i--;){
668        if(typeof strB[i] == 'undefined' || strA[i] == strB[i]);
669        else if(strA[i].toLowerCase() == strB[i].toLowerCase())
670            result++;
671        else
672            result += 4;
673    }
674    return 1 - (result + 4*Math.abs(strA.length - strB.length))/(2*(strA.length+strB.length));
675}
676
677function removeDuplicates(myArr, prop) {
678    return myArr.filter((obj, pos, arr) => {
679        return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
680    });
681}
682
683function add(test, key, value) {
684    if (!test[key]) {
685        // Create 1-element array with this value.
686        test[key] = [value];
687    }
688    else {
689        // Append element to existing array.
690        test[key].push(value);
691    }
692}
693
694var asyncLoop = function (o) {
695    var i = -1, length = o.length;
696
697    var loop = function () {
698        i++;
699        if (i == length) { o.callback(); return; }
700        o.functionToLoop(loop, i);
701    }
702    loop();//init
703}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.