PageSourceSearch

https://anaptyxi.gov.gr/DesktopModules/AVMap.OneGlance/js/oneglance.js?v=20240407

js anaptyxi.gov.gr collected 2026-10-02 13:16:29 UTC 91,085 bytes, 2,551 lines download raw bytes

1var static_perifereies = [];
2window.popups = [];
3var initialColors = Highcharts.getOptions().colors;
4initialColors1 = [
5	"#4B68B6",
6	"#D4312C",
7	"#67A94F",
8	"#DBE300",
9	"#481097",
10	"#811717",
11	"#e6beff",
12	"#008080",
13	"#d2f53c",
14	"#E8D64C",
15	"#911eb4",
16	"#C2C08D",
17	"#808000",
18	"#D37FB1",
19	"#fffac8",
20	"#f032e6"
21];
22initialColors2 = [
23	"#DBE300",
24	"#4B68B6",
25	"#D4312C",
26	"#67A94F",
27	"#481097",
28	"#811717",
29	"#e6beff",
30	"#008080",
31	"#d2f53c",
32	"#E8D64C",
33	"#911eb4",
34	"#C2C08D",
35	"#808000",
36	"#D37FB1",
37	"#fffac8",
38	"#f032e6"
39];
40//initialColors = shuffle(initialColors);	//random on each page load
41Highcharts.getOptions().colors = Highcharts.map(initialColors1, function (color) {
42    return {
43        radialGradient: {
44            cx: 0.5,
45            cy: 0.3,
46            r: 0.7
47        },
48        stops: [
49            [0, color],
50            [1, Highcharts.Color(color).brighten(-0.3).get('rgb')] // darken
51        ]
52    };
53});
54$.views.helpers({
55    getTitle: function (data, key) {
56        return window.english ? data[key + "_en"] : data[key];
57    }
58});
59var moduleMode = 1;
60var path = "/DesktopModules/AVMap.HomePage_Map/";
61var digimap;
62var digiContainer;
63var zoomRequest;
64var nomTitleChanged = false;
65var clickProjectShown = false;
66var proj;
67var highlightCtrl;
68var selectCtrl;
69var zoomMode = -1;
70var previousPerifCode;
71var previousNomCode;
72var olStyle;
73var currentlySelected = -1;
74var activeTab = 0;
75var kmlLayer;
76var refreshMap = null;
77var selectedThematics = [];
78var selectedEP = [];
79var selectedFunds = [];
80var selectedAreas = [];
81var loadedQueries = 0;
82var maxQueries = 0;
83
84if (!Object.keys) {
85    Object.keys = function (obj) {
86        var keys = [];
87
88        for (var i in obj) {
89            if (obj.hasOwnProperty(i)) {
90                keys.push(i);
91            }
92        }
93
94        return keys;
95    };
96}
97if (typeof jQuery.when.all === 'undefined') {
98    jQuery.when.all = function (deferreds, key) {
99        var retObj = jQuery.Deferred(function (def) {
100            jQuery.when.apply(jQuery, deferreds).then(
101                function () {
102                    if (key) this.hashKey = key;
103                    def.resolveWith(this, [Array.prototype.slice.call(arguments)]);
104                },
105                function () {
106                    if (key) this.hashKey = key;
107                    def.rejectWith(this, [Array.prototype.slice.call(arguments)]);
108                });
109        });
110        return retObj;
111    }
112}
113
114var thematicTemplate = jQuery.templates("#thematicTemplate");
115var fundingTemplate = jQuery.templates("#fundingTemplate");
116var epTemplate = jQuery.templates("#epTemplate");
117var itemSelectionTmpl = jQuery.templates("#itemSelectionTemplate");
118var avtranslate = jQuery.templates("#translateTemplate");
119loadThematics = function () {
120    jQuery.ajax({
121        url: "/GetData.ashx?queryType=lists&queryArgument=thematic_objectives",
122        success: function (data) {
123            var items = [];
124            for (var i = 0; i < data.items.length; i++) {
125                items.push({
126                    code: data.items[i].code,
127                    title: window.english ? data.items[i].title_en : data.items[i].title
128                });
129            }
130            var tmplData = {
131                thematics: items
132            };
133            jQuery("#thematicContainer").html(thematicTemplate.render(tmplData));
134        }
135    });
136}
137loadFunding = function () {
138    jQuery.ajax({
139        url: "/GetData.ashx?queryType=lists&queryArgument=funding",
140        success: function (data) {
141            var tmplData = {
142                funding: data.items
143            };
144            jQuery("#fundingContainer").html(fundingTemplate.render(tmplData));
145        }
146    });
147}
148loadEP = function () {
149    jQuery.ajax({
150        url: "/GetData.ashx?queryType=lists&queryArgument=operational_programmes",
151        success: function (data) {
152            var tmplData = {
153                ep: data.items
154            };
155            jQuery("#epContainer").html(epTemplate.render(tmplData));
156        }
157    });
158}
159function shuffle(a) {
160    var j, x, i;
161    for (i = a.length; i; i--) {
162        j = Math.floor(Math.random() * i);
163        x = a[i - 1];
164        a[i - 1] = a[j];
165        a[j] = x;
166    }
167    return a;
168}
169function sortObj(obj,weird) {
170    //console.log('called sort',obj,weird);
171	weird=true;
172    Object.keys(obj).sort(function (a, b) {
173        return a.localeCompare(b);
174    }).forEach(function (key) {	
175        var value = obj[key];
176        delete obj[key];
177        obj[key] = value;
178        if (weird) {
179            obj[key].areas = obj[key].areas.sort(function (a, b) {
180				try{
181					return (parseInt((a.key=="-"?"9999":a.key)) > parseInt((b.key=="-"?"9999":b.key)));
182				}catch(ex){
183					return a.key > b.key;
184				}
185                
186            });
187        }
188    });
189    //console.log('after sort', obj);
190    return obj;
191}
192function initMap() {
193    proj = new OpenLayers.Projection("EPSG:4326");
194
195    digimap = new OpenLayers.Map(digiContainer.id, {
196        controls: [],
197        projection: new OpenLayers.Projection("EPSG:900913"),
198        displayProjection: proj,
199        layers: [
200				new OpenLayers.Layer.Google(
201					"Google Streets", // the default
202					{ numZoomLevels: 20, opacity: 0 },
203					{ isBaseLayer: true, opacity: 0 }
204				)
205        ],
206        center: new OpenLayers.LonLat(24.165735, 38.24609).transform(this.displayProjection, this.projection)
207    });
208    olStyle = new OpenLayers.StyleMap({
209        "default": new OpenLayers.Style({
210            strokeColor: "#666666", 
211            strokeOpacity: 1,
212            strokeWidth: 1,
213            fillColor: "#d4d8e3",
214            fillOpacity: 1,
215            cursor: "pointer",
216            graphicZIndex: 0
217        }),
218        "temporary": new OpenLayers.Style({
219            strokeColor: "#666666", //,
220            strokeOpacity: 1,
221            strokeWidth: 2,
222            fillColor: "#5e8df7",
223            fillOpacity: 1,
224            graphicZIndex: 100,
225            cursor: "pointer"
226        }),
227        "select": new OpenLayers.Style({
228            strokeColor: "#666666", //,
229            strokeOpacity: 1,
230            strokeWidth: 2,
231            fillColor: "#5e8df7",
232            fillOpacity: 1,
233            graphicZIndex: 100,
234            cursor: "pointer"
235        })
236    });
237    var keyboardControl = new OpenLayers.Control();
238
239    var keyHandler = new OpenLayers.Handler.Keyboard(keyboardControl, {
240        keydown: function (evt) {
241            if (evt.which === 9) {
242                evt.preventDefault();
243                var layer = digimap.layers[1];
244                if (currentlySelected > -1) {
245                    highlightCtrl.unhighlight(layer.features[currentlySelected]);
246                    highlightCtrl.unselect(layer.features[currentlySelected]);
247                }
248                currentlySelected++;
249                if (currentlySelected > layer.features.length - 1) {
250                    currentlySelected = 0;
251                }
252                highlightCtrl.highlight(layer.features[currentlySelected]);
253                highlightCtrl.select(layer.features[currentlySelected]);
254            }
255            if (evt.which === 13 && highlightCtrl.layer.selectedFeatures) {
256                mapFeatureClicked(highlightCtrl.layer.selectedFeatures[0]);
257            }
258        },
259    });
260    keyHandler.activate();
261    digimap.addControl(keyboardControl);
262    fixZoom();
263}
264
265function fixZoom(optCenter, optZoom) {
266    if (optCenter) {
267        digimap.setCenter(optCenter, optZoom);
268    } else {
269        switch (zoomMode) {
270            case -1:
271                digimap.setCenter(new OpenLayers.LonLat(24.165735, 38.24609).transform(digimap.displayProjection, digimap.projection), 6);
272                break;
273            case 0:
274                digimap.zoomToExtent(kmlLayer.getDataExtent());
275                break;
276            case 1:
277                digimap.zoomToExtent(kmlLayer.getDataExtent());
278                break;
279            case 2:
280
281                break;
282        }
283    }
284}
285
286function mapFeatureClicked(e) {
287    for (var i = 0; i < window.popups.length; i++) {
288        digimap.removePopup(window.popups[i]);
289    }
290    window.popups.length = 0;
291    var data = e.attributes.name;
292    if (selectedAreas.indexOf(data) == -1) {
293        selectedAreas.push(data);
294        getAreas();
295    }
296    performSearch();
297}
298function mapFeatureRemoved(e) {
299    var data = e.attributes.name;
300    if (selectedAreas.indexOf(data) >= 0) {
301        selectedAreas.splice(selectedAreas.indexOf(data), 1);
302        getAreas();
303    }
304}
305
306
307function showTooltip(evt) {
308    for (var i = 0; i < window.popups.length; i++) {
309        digimap.removePopup(window.popups[i]);
310    }
311    window.popups.length = 0;
312    var center = evt.feature.geometry.getBounds().getCenterLonLat();
313    var lonlat = center;
314
315    var html = "";
316    var zoom = digimap.getZoom();
317    var code = "";
318    html = returnPerifName(evt.feature.attributes.name);
319
320    var popup = new OpenLayers.Popup.AnchoredBubble(
321		'myPopup',
322		lonlat,
323		new OpenLayers.Size(150, 60),
324		html,
325		{ size: { w: 14, h: 14 }, offset: { x: -7, y: -7 } },
326		false
327	);
328    window.popups.push(popup);
329    evt.feature.popup = popup;
330    digimap.addPopup(popup);
331}
332function hideTooltip(evt) {
333    digimap.removePopup(evt.feature.popup);
334}
335
336function addKML() {
337    kmlLayer = getKMLLayer("/DesktopModules/AVMap.HomePage_Map/KML/KML_Country.kml");
338    digimap.addLayers([kmlLayer]);
339    try {
340        digimap.removeControl(highlightCtrl);
341        digimap.removeControl(selectCtrl);
342    } catch (err) { }
343
344    highlightCtrl = new OpenLayers.Control.SelectFeature(kmlLayer, {
345        hover: true,
346        highlightOnly: true,
347        renderIntent: "temporary",
348        eventListeners: {
349            featurehighlighted: showTooltip,
350            featureunhighlighted: hideTooltip
351        }
352    });
353    selectCtrl = new OpenLayers.Control.SelectFeature(kmlLayer, {
354        clickout: false,
355        hover: false,
356        toggle: true,
357        multiple: false,
358        onSelect: mapFeatureClicked,
359        onUnselect: mapFeatureRemoved
360    });
361    digimap.addControls([highlightCtrl, selectCtrl]);
362    highlightCtrl.activate();
363    selectCtrl.activate();
364    kmlLayer.events.register("loadend", kmlLayer, function () {
365        for (var i = 0; i < kmlLayer.features.length; i++) {
366            var item = kmlLayer.features[i].attributes;
367            item.clabel = returnPerifName(item.name);
368        }
369        digimap.setCenter(new OpenLayers.LonLat(24.165735, 38.24609).transform(digimap.displayProjection, digimap.projection), 6);
370    });
371}
372
373function returnPerifName(perif_ID) {
374    var found = false;
375    var retvalue = "";
376    var counter = 0;
377    var comp_id = parseInt(perif_ID) < 10 ? "0" + perif_ID : perif_ID;
378    var prefix = window.english ? "Region" : "Περιφέρεια";
379    while (!found && counter < static_perifereies.length) {
380        if (static_perifereies[counter].id == comp_id) {
381            found = true;
382            retvalue = static_perifereies[counter].value;
383        } else {
384            counter++;
385        }
386    }
387    return prefix + " " + retvalue;
388}
389
390function clearMap() {
391    digimap.removeLayer(digimap.layers[1]);
392}
393
394function addPerifKML(code) {
395    var codes = ["03", "09", "17", "22", "28", "33", "38", "42", "48", "55", "58", "62", "65"];
396
397    kmlLayers = [];
398    for (var i = 0; i < codes.length; i++) {
399        kmlLayers.push(getKMLLayer("/DesktopModules/AVMap.HomePage_Map/KML/KML_Perif" + codes[i] + ".kml"));
400    }
401    digimap.addLayers(kmlLayers);
402    highlightCtrl = new OpenLayers.Control.SelectFeature(kmlLayers, {
403        hover: true,
404        highlightOnly: true,
405        renderIntent: "temporary",
406        eventListeners: {
407            //featurehighlighted: showTooltip
408        }
409    });
410    selectCtrl = new OpenLayers.Control.SelectFeature(kmlLayers, {
411        clickout: false,
412        toggle: true,
413        multiple: true,
414        onSelect: mapFeatureClicked,
415        onUnselect: mapFeatureRemoved
416    });
417    digimap.addControls([highlightCtrl, selectCtrl]);
418    highlightCtrl.activate();
419    selectCtrl.activate();
420}
421function getKMLLayer(curl) {
422    var layer = new OpenLayers.Layer.Vector("KML", {
423        projection: digimap.displayProjection,
424        strategies: [new OpenLayers.Strategy.Fixed()],
425        protocol: new OpenLayers.Protocol.HTTP({
426            url: curl,
427            format: new OpenLayers.Format.KML({
428                extractStyles: false,
429                extractAttributes: true
430
431            })
432        }),
433        styleMap: olStyle,
434    },
435		{
436		    isBaseLayer: false
437		}
438	);
439    return layer;
440}
441
442function toggleThematic(event) {
443    if (event.which === 13 || event.type === 'click') {
444        jQuery("#thematicContainer .thematicLink").removeClass("selected");
445        jQuery(this).toggleClass("selected");
446        event.preventDefault();
447        event.stopPropagation();
448        getThematics();
449        performSearch();
450    }
451}
452function toggleEP(event) {
453    if (event.which === 13 || event.type === 'click') {
454        jQuery("#epContainer .epLink").removeClass("selected");
455        jQuery(this).toggleClass("selected");
456        event.preventDefault();
457        event.stopPropagation();
458        getEP();
459        performSearch();
460    }
461}
462function toggleFund(event) {
463    if (event.which === 13 || event.type === 'click') {
464        jQuery("#fundingContainer .fundingLink").removeClass("selected");
465        jQuery(this).toggleClass("selected");
466        event.preventDefault();
467        event.stopPropagation();
468        getFunds();
469        performSearch();
470    }
471}
472
473function getEP() {
474    var selected = jQuery("#epContainer .selected");
475    jQuery("#epSelection").empty();
476    selectedEP = [];
477    if (selected.length) {
478        jQuery.each(selected, function (i, selection) {
479            var title = jQuery(selection).find(".epLabel").text();
480            var code = jQuery(selection).find(".epLabel").attr("data-code");
481            selectedEP.push(code);
482            jQuery("#epSelection").append(itemSelectionTmpl.render({ code: code, title: title }));
483        });
484    } else {
485        jQuery("#epSelection").html(itemSelectionTmpl.render({ code: "-", title: og.allEP }));
486    }
487}
488function getFunds() {
489    var selected = jQuery("#fundingContainer .selected");
490    jQuery("#fundingSelection").empty();
491    selectedFunds = [];
492    if (selected.length) {
493        jQuery.each(selected, function (i, selection) {
494            var title = jQuery(selection).find(".fundingLabel").text();
495            var code = jQuery(selection).find(".fundingLabel").attr("data-code");
496            selectedFunds.push(code);
497            jQuery("#fundingSelection").append(itemSelectionTmpl.render({ code: code, title: title }));
498        });
499    } else {
500        jQuery("#fundingSelection").html(itemSelectionTmpl.render({ code: "-", title: og.allFunds }));
501    }
502}
503
504function getThematics() {
505    var selected = jQuery("#thematicContainer .selected");
506    jQuery("#thematicSelection").empty();
507    selectedThematics = [];
508    if (selected.length) {
509        jQuery.each(selected, function (i, selection) {
510            var title = jQuery(selection).find(".thematicLabel").text();
511            var code = jQuery(selection).find(".icon").attr("class").replace("icon ", "");
512            selectedThematics.push(code);
513            jQuery("#thematicSelection").append(itemSelectionTmpl.render({ code: code, title: title }));
514        });
515    } else {
516        jQuery("#thematicSelection").html(itemSelectionTmpl.render({ code: "-", title: og.allThematics }));
517    }
518}
519function getAreas() {
520    jQuery("#mapSelection").empty();
521    if (selectedAreas.length) {
522        jQuery.each(selectedAreas, function (i, selection) {
523            var title = getAreaTitle(selection);
524            var code = selection;
525            jQuery("#mapSelection").append(itemSelectionTmpl.render({ code: code, title: title }));
526        });
527    } else {
528        jQuery("#mapSelection").html(itemSelectionTmpl.render({ code: "-", title: (moduleMode == 2) ? og.allPrefectures : og.allRegions }));
529    }
530}
531
532function getEPTitle(code) {
533    var retvalue = code;
534    var text = jQuery("#epContainer .epLink .epLabel[data-code='" + parseInt(code) + "']").text();
535    return text ? text : retvalue;
536}
537function getFundingTitle(code) {
538    var retvalue = code;
539    var text = jQuery("#fundingContainer .fundingLink .fundingLabel[data-code='" + code + "']").text();
540    return text ? text : retvalue;
541}
542function getThematicTitle(code) {
543    var retvalue = code;
544    var text = jQuery("#thematicContainer .thematicLink .thematicLabel[data-code='" + code + "']").text();
545    return text ? text : retvalue;
546}
547
548function getAreaTitle(code) {
549    var list;
550    list = moduleMode == 2 ? static_nomoi : static_perifereies;
551    var found = false;
552    var retvalue = code;
553    var counter = 0;
554    if (moduleMode == 2) {
555        while (!found && counter < list.length) {
556            //god damn disparencies...
557            var idParts = list[counter].id.split("_");
558            var codeParts = code.split("_");
559            if (parseFloat(idParts[0]) == parseFloat(codeParts[0]) &&
560					parseFloat(idParts[1]) == parseFloat(codeParts[1])) {
561                found = true;
562                retvalue = list[counter].value;
563            }
564            counter++;
565        }
566    } else {
567        while (!found && counter < list.length) {
568            if (parseFloat(list[counter].id) == parseFloat(code)) {
569                found = true;
570                retvalue = list[counter].value;
571            }
572            counter++;
573        }
574    }
575
576    return retvalue;
577}
578function getAllThematics() {
579    var retvalue = [];
580    jQuery.each(static_anapt, function (i, anapt) {
581        retvalue.push(anapt.key);
582    });
583    return retvalue;
584}
585function getAllEP() {
586    var retvalue = [];
587    var links = jQuery("#epContainer .epLink .epLabel");
588    jQuery.each(links, function (i, link) {
589        retvalue.push(jQuery(link).attr("data-code"));
590    });
591    return retvalue;
592}
593function getAllFunding() {
594    var retvalue = [];
595    var links = jQuery("#fundingContainer .fundingLink .fundingLabel");
596    jQuery.each(links, function (i, link) {
597        retvalue.push(jQuery(link).attr("data-code"));
598    });
599    return retvalue;
600}
601
602function getAllAreas() {
603    var list;
604    list = moduleMode == 2 ? static_nomoi : static_perifereies;
605    var retvalue = [];
606    if (moduleMode == 2) {
607        jQuery.each(list, function (i, listitem) {
608            retvalue.push(listitem.id.toString());
609        });
610    } else {
611        jQuery.each(list, function (i, listitem) {
612            retvalue.push(parseFloat(listitem.id).toString());
613        });
614    }
615
616    return retvalue;
617}
618function linkChartSeries(chart) {
619    /* 
620		Until current version (v5.0.12) linked pie charts are not supported automatically.
621		So they must be linked manually.
622		See https://github.com/highcharts/highcharts/issues/2079 
623		Workaround: http://jsfiddle.net/highcharts/u7FQS/278/ 
624	*/
625    $(chart.series[0].data).each(function (i, e) {
626        e.legendItem.on('click', function (event) {
627            var legendItem = e.name;
628            event.stopPropagation();
629            $(chart.series).each(function (j, f) {
630                $(this.data).each(function (k, z) {
631                    if (z.name == legendItem) {
632                        if (z.visible) {
633                            z.setVisible(false);
634                        }
635                        else {
636                            z.setVisible(true);
637                        }
638                    }
639                });
640            });
641        });
642        e.legendItem.on('mouseover', function (event) {
643            var legendItem = e.name;
644            event.stopPropagation();
645            $(chart.series).each(function (j, f) {
646                $(this.data).each(function (k, z) {
647                    if (z.name == legendItem) {
648                        z.setState('hover')
649                    }
650                });
651            });
652        });
653        e.legendItem.on('mouseout', function (event) {
654            var legendItem = e.name;
655
656            event.stopPropagation();
657
658            $(chart.series).each(function (j, f) {
659                $(this.data).each(function (k, z) {
660                    if (z.name == legendItem) {
661                        z.setState('')
662                    }
663                });
664            });
665        });
666    });
667}
668
669function searchMode1() {	//Thematics per region
670    var areas = selectedAreas;
671    var thematics = selectedThematics;
672    if (thematics.length == 0) {
673        thematics = getAllThematics();
674    }
675    var deferreds = [];
676    var results = {};
677    var language = window.english ? "en-US" : "el-GR";
678    maxQueries = thematics.length;
679    for (var i = 0; i < thematics.length; i++) {	//Fire a request for each op
680        var key = "" + thematics[i];
681        var urlKey = key.replace("stoxos_", "");
682        deferreds.push(
683			$.ajax({
684			    ajax_key: key,
685			    url: "/GetData.ashx?queryType=statistics&queryArgument=thematic_objectives&queryFilter=region&queryCode=" + urlKey,
686			    success: function (data) {
687			        results[this.ajax_key] = data;
688			        loadedQueries += 1;
689			        updateProgressBar();
690			    }
691			})
692		);
693    }
694    var retValue = {
695        hashKey: 'searchMode1',
696        def: jQuery.when.all(deferreds, 'searchMode1'),
697        cb: function (objects) {
698            var targets = {};
699            jQuery.each(results, function (key, result) {	
700                for (var i = 0; i < result.items.length; i++) {
701                    var record = result.items[i];
702                    if (selectedAreas.indexOf(record.code) >= 0 || selectedAreas.length == 0) {
703                        var keyCode = parseInt(key.replace("stoxos_", ""));
704                        var finalKeyCode = keyCode.toString();
705                        if (keyCode < 10) {
706                            finalKeyCode = "0" + keyCode;
707                        }
708                        if (!targets["stoxos_" + finalKeyCode]) {
709                            targets["stoxos_" + finalKeyCode] = {
710                                title: getThematicTitle(key.replace("stoxos_", "")),
711                                areas: []
712                            };
713                        }
714                        var f1 = parseInt(record.code);
715                        var f2 = f1.toString();
716                        if (f1 < 10) {
717                            f2 = "0" + f1;
718                        }
719                        targets["stoxos_" + finalKeyCode].areas.push({
720                            key: f2,
721                            budget: parseFloat(record.budget.replace(/\./g, "")),
722                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
723                            payments: parseFloat(record.payments.replace(/\./g, "")),
724                            //commitments: parseFloat(record.commitments.replace(/\./g, ""))
725                        });
726                    }
727                }
728            });
729            targets = sortObj(targets);
730            renderCharts(targets, 'bar', 'searchMode1');
731        }
732    };
733    return retValue;
734}
735/*
736function searchMode1() {	//Thematics per region
737    var areas = selectedAreas;
738    if (selectedAreas.length == 0) {
739        areas = getAllAreas();
740    }
741    var deferreds = [];
742    var results = {};
743    var language = window.english ? "en-US" : "el-GR";
744    maxQueries = areas.length;
745    for (var i = 0; i < areas.length; i++) {	//Fire a request for each region
746        var key = "" + areas[i];
747        deferreds.push(
748			$.ajax({
749			    ajax_key: key,
750			    url: "/DesktopModules/AVMap.HomePage_Map/SearchHandler.ashx?queryType=Anapt&mapZoom=perif_" + areas[i] + "&language=" + language, //This should be replaced with API call in 2020 site
751			    success: function (data) {
752			        results[this.ajax_key] = data;
753			        loadedQueries += 1;
754			        updateProgressBar();
755			    }
756			})
757		);
758    }
759    var retValue = {
760        hashKey: 'searchMode1',
761        def: jQuery.when.all(deferreds, 'searchMode1'),
762        cb: function (objects) {
763            var targets = {};
764            jQuery.each(results, function (key, result) {	//Pivot all results by thematic
765                for (var i = 0; i < result.Rows.length; i++) {
766                    var record = result.Rows[i];
767                    if (record) {
768                        if (selectedThematics.indexOf(record.ClassName) >= 0 || selectedThematics.length == 0) {
769                            if (!targets[record.ClassName]) {
770                                targets[record.ClassName] = {
771                                    title: record.Title,
772                                    areas: []
773                                }
774                            }
775                            targets[record.ClassName].areas.push({
776                                key: key,
777                                budget: parseFloat(record.Budget.replace(/\./g, "")),
778                                contracts: parseFloat(record.Contracts.replace(/\./g, "")),
779                                payments: parseFloat(record.Payments.replace(/\./g, ""))
780                            });
781                        }
782                    }
783                }
784            });
785            targets = sortObj(targets);
786            renderCharts(targets, 'bar', 'searchMode1');
787        }
788    };
789    return retValue;
790}*/
791
792/*
793function searchMode2(){	//Thematics per prefecture
794	var areas=selectedAreas;	
795	if (selectedAreas.length==0){
796		areas =getAllAreas();
797	}
798	var deferreds = [];
799	var results = {};
800	var language=window.english?"en-US":"el-GR";
801	maxQueries=areas.length;
802	for (var i=0;i<areas.length;i++){	//Fire a request for each nom
803		var key=""+areas[i];
804		var keyParts = areas[i].split("_");
805		var urlKey=parseFloat(keyParts[0])+"_"+parseFloat(keyParts[1]);	//handle disparencies
806		deferreds.push(
807			$.ajax({
808				ajax_key: key,
809				url: "/DesktopModules/AVMap.HomePage_Map/SearchHandler.ashx?queryType=Anapt&mapZoom=nom_"+urlKey+"&language="+language, //This should be replaced with API call in 2020 site
810				success: function(data){
811					results[this.ajax_key]=data;
812					loadedQueries+=1;
813					updateProgressBar();
814				}
815			})
816		);
817	}
818	jQuery.when.all(deferreds).then(function(objects){
819		var targets={};
820		jQuery.each(results,function(key,result){	//Pivot all results by thematic
821			for (var i=0;i<result.Rows.length;i++){
822				var record =result.Rows[i];
823				if (record){
824					if (selectedThematics.indexOf(record.ClassName)>=0 || selectedThematics.length==0){
825						if (!targets[record.ClassName]){
826							targets[record.ClassName]={
827								title: record.Title,
828								areas: []
829							}
830						}
831						targets[record.ClassName].areas.push({
832							key: key,
833							budget: parseFloat(record.Budget.replace(/\./g,"")),
834							contracts: parseFloat(record.Contracts.replace(/\./g,"")),
835							payments: parseFloat(record.Payments.replace(/\./g,""))
836						});
837					}
838				}
839			}
840		});
841		renderCharts(targets);
842	});
843}
844*/
845function searchMode3() {	//Thematics per o.p.
846    var eps = selectedEP;
847    var thematics = selectedThematics;
848    if (thematics.length == 0) {
849        thematics = getAllThematics();
850    }
851    var deferreds = [];
852    var results = {};
853    var language = window.english ? "en-US" : "el-GR";
854    maxQueries = thematics.length;
855    for (var i = 0; i < thematics.length; i++) {	//Fire a request for each op
856        var key = "" + thematics[i];
857        var urlKey = key.replace("stoxos_", "");
858        deferreds.push(
859			$.ajax({
860			    ajax_key: key,
861			    url: "/GetData.ashx?queryType=statistics&queryArgument=thematic_objectives&queryFilter=operational_programme&queryCode=" + urlKey,
862			    success: function (data) {
863			        results[this.ajax_key] = data;
864			        loadedQueries += 1;
865			        updateProgressBar();
866			    }
867			})
868		);
869    }
870    var retValue = {
871        hashKey: 'searchMode3',
872        def: jQuery.when.all(deferreds, 'searchMode3'),
873        cb: function (objects) {
874            var targets = {};
875            jQuery.each(results, function (key, result) {
876                for (var i = 0; i < result.items.length; i++) {
877                    var record = result.items[i];
878                    if (selectedEP.indexOf(record.code) >= 0 || selectedEP.length == 0) {
879                        var keyCode = parseInt(key.replace("stoxos_", ""));
880                        var finalKeyCode = keyCode.toString();
881                        if (keyCode < 10) {
882                            finalKeyCode = "0" + keyCode;
883                        }
884                        if (!targets["stoxos_" + finalKeyCode]) {
885                            targets["stoxos_" + finalKeyCode] = {
886                                title: getThematicTitle(key.replace("stoxos_", "")),
887                                areas: []
888                            };
889                        }
890                        var f1 = parseInt(record.code);
891                        var f2 = f1.toString();
892                        if (f1 < 10) {
893                            f2 = "0" + f1;
894                        }
895                        targets["stoxos_" + finalKeyCode].areas.push({
896                            key: f2,
897                            budget: parseFloat(record.budget.replace(/\./g, "")),
898                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
899                            payments: parseFloat(record.payments.replace(/\./g, "")),
900                            commitments: parseFloat(record.commitments.replace(/\./g, ""))
901                        });
902                    }
903                }
904            });
905            //console.log('before', targets);
906            targets = sortObj(targets,true);
907            //console.log('after', targets);
908            renderCharts(targets, 'bar', 'searchMode3');
909        }
910    };
911    return retValue;
912}
913function searchMode4() {	//Thematics per fund
914    var funds = selectedFunds;
915    var thematics = selectedThematics;
916    if (thematics.length == 0) {
917        thematics = getAllThematics();
918    }
919    var deferreds = [];
920    var results = {};
921    var language = window.english ? "en-US" : "el-GR";
922    maxQueries = thematics.length;
923    for (var i = 0; i < thematics.length; i++) {	//Fire a request for each fund
924        var key = "" + thematics[i];
925        var urlKey = key.replace("stoxos_", "");
926        deferreds.push(
927			$.ajax({
928			    ajax_key: key,
929			    url: "/GetData.ashx?queryType=statistics&queryArgument=thematic_objectives&queryFilter=fund&queryCode=" + urlKey,
930			    success: function (data) {
931			        results[this.ajax_key] = data;
932			        loadedQueries += 1;
933			        updateProgressBar();
934			    }
935			})
936		);
937    }
938    var retValue = {
939        hashKey: 'searchMode4',
940        def: jQuery.when.all(deferreds, 'searchMode4'),
941        cb: function (objects) {
942            var targets = {};
943            jQuery.each(results, function (key, result) {
944                for (var i = 0; i < result.items.length; i++) {
945                    var record = result.items[i];
946                    if (selectedFunds.indexOf(record.code) >= 0 || selectedFunds.length == 0) {
947                        if (!targets["stoxos_" + key.replace("stoxos_", "")]) {
948                            targets["stoxos_" + key.replace("stoxos_", "")] = {
949                                title: getThematicTitle(key.replace("stoxos_", "")),
950                                areas: []
951                            };
952                        }
953                        targets["stoxos_" + key.replace("stoxos_", "")].areas.push({
954                            key: record.code,
955                            budget: parseFloat(record.budget.replace(/\./g, "")),
956                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
957                            payments: parseFloat(record.payments.replace(/\./g, "")),
958							commitments: parseFloat(record.commitments.replace(/\./g, ""))
959                        });
960                    }
961                }
962            });
963            targets = sortObj(targets);
964            renderCharts(targets, 'pie', 'searchMode4'); 
965        }
966    };
967    return retValue;
968}
969function searchMode5() {	//Region per o.p.
970    var eps = selectedEP;
971    var areas = selectedAreas;
972    if (selectedAreas.length == 0) {
973        areas = getAllAreas();
974    }
975    var deferreds = [];
976    var results = {};
977    var language = window.english ? "en-US" : "el-GR";
978    maxQueries = areas.length;
979    for (var i = 0; i < areas.length; i++) {	//Fire a request for each ep
980        var key = "" + areas[i];
981        var urlKey = key;
982        deferreds.push(
983			$.ajax({
984			    ajax_key: key,
985			    url: "/GetData.ashx?queryType=statistics&queryArgument=regions&queryFilter=operational_programme&queryCode=" + urlKey,
986			    success: function (data) {
987			        results[this.ajax_key] = data;
988			        loadedQueries += 1;
989			        updateProgressBar();
990			    }
991			})
992		);
993    }
994    var retValue = {
995        hashKey: 'searchMode5',
996        def: jQuery.when.all(deferreds, 'searchMode5'),
997        cb: function (objects) {
998            var targets = {};
999            jQuery.each(results, function (key, result) {
1000                for (var i = 0; i < result.items.length; i++) {
1001                    var record = result.items[i];
1002                    if (selectedEP.indexOf(record.code) >= 0 || selectedEP.length == 0) {
1003                        if (!targets[key]) {
1004                            targets[key] = {
1005                                title: getAreaTitle(key),
1006                                areas: []
1007                            };
1008                        }
1009                        targets[key].areas.push({
1010                            key: record.code,
1011                            budget: parseFloat(record.budget.replace(/\./g, "")),
1012                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1013                            payments: parseFloat(record.payments.replace(/\./g, ""))
1014                        });
1015                    }
1016                }
1017            });
1018            targets = sortObj(targets);
1019            renderCharts(targets, 'bar', 'searchMode5');
1020        }
1021    };
1022    return retValue;
1023}
1024function searchMode6() {	//Region per fund
1025    var funds = selectedFunds;
1026    var areas = selectedAreas;
1027    if (selectedAreas.length == 0) {
1028        areas = getAllAreas();
1029    }
1030    var deferreds = [];
1031    var results = {};
1032    var language = window.english ? "en-US" : "el-GR";
1033    maxQueries = areas.length;
1034    for (var i = 0; i < areas.length; i++) {	//Fire a request for each ep
1035        var key = "" + areas[i];
1036        var urlKey = key;
1037        deferreds.push(
1038			$.ajax({
1039			    ajax_key: key,
1040			    url: "/GetData.ashx?queryType=statistics&queryArgument=regions&queryFilter=fund&queryCode=" + urlKey,
1041			    success: function (data) {
1042			        results[this.ajax_key] = data;
1043			        loadedQueries += 1;
1044			        updateProgressBar();
1045			    }
1046			})
1047		);
1048    }
1049    var retValue = {
1050        hashKey: 'searchMode6',
1051        def: jQuery.when.all(deferreds, 'searchMode6'),
1052        cb: function (objects) {
1053            var targets = {};
1054            jQuery.each(results, function (key, result) {
1055                for (var i = 0; i < result.items.length; i++) {
1056                    var record = result.items[i];
1057                    if (selectedFunds.indexOf(record.code) >= 0 || selectedFunds.length == 0) {
1058                        if (!targets[key]) {
1059                            targets[key] = {
1060                                title: getAreaTitle(key),
1061                                areas: []
1062                            };
1063                        }
1064                        targets[key].areas.push({
1065                            key: record.code,
1066                            budget: parseFloat(record.budget.replace(/\./g, "")),
1067                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1068                            payments: parseFloat(record.payments.replace(/\./g, ""))
1069                        });
1070                    }
1071                }
1072            });
1073            targets = sortObj(targets);
1074            renderCharts(targets, 'pie', 'searchMode6'); 
1075        }
1076    };
1077    return retValue;
1078}
1079function searchMode7() {	//Region per thematic
1080    var areas = selectedAreas;
1081    if (selectedAreas.length == 0) {
1082        areas = getAllAreas();
1083    }
1084    var deferreds = [];
1085    var results = {};
1086    var language = window.english ? "en-US" : "el-GR";
1087    maxQueries = areas.length;
1088    for (var i = 0; i < areas.length; i++) {	//Fire a request for each ep
1089        var key = "" + areas[i];
1090        var urlKey = key;
1091        deferreds.push(
1092			$.ajax({
1093			    ajax_key: key,
1094			    url: "/GetData.ashx?queryType=statistics&queryArgument=regions&queryFilter=thematic&queryCode=" + urlKey,
1095			    success: function (data) {
1096			        results[this.ajax_key] = data;
1097			        loadedQueries += 1;
1098			        updateProgressBar();
1099			    }
1100			})
1101		);
1102    }
1103    var retValue = {
1104        hashKey: 'searchMode7',
1105        def: jQuery.when.all(deferreds, 'searchMode7'),
1106        cb: function (objects) {
1107            var targets = {};
1108            jQuery.each(results, function (key, result) {
1109                for (var i = 0; i < result.items.length; i++) {
1110                    var record = result.items[i];
1111                    if (selectedThematics.indexOf(record.code) >= 0 || selectedThematics.length == 0) {
1112                        if (!targets[key]) {
1113                            targets[key] = {
1114                                title: getAreaTitle(key),
1115                                areas: []
1116                            };
1117                        }
1118                        targets[key].areas.push({
1119                            key: record.code,
1120                            budget: parseFloat(record.budget.replace(/\./g, "")),
1121                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1122                            payments: parseFloat(record.payments.replace(/\./g, ""))
1123                        });
1124                    }
1125                }
1126            });
1127            targets = sortObj(targets);
1128            renderCharts(targets, 'bar', 'searchMode7');
1129        }
1130    };
1131    return retValue;
1132}
1133function searchMode8() {	//OP per region
1134    var eps = selectedEP;
1135    if (selectedEP.length == 0) {
1136        eps = getAllEP();
1137    }
1138    var deferreds = [];
1139    var results = {};
1140    var language = window.english ? "en-US" : "el-GR";
1141    maxQueries = eps.length;
1142    for (var i = 0; i < eps.length; i++) {	//Fire a request for each ep
1143        var key = "" + eps[i];
1144        var urlKey = key;
1145        deferreds.push(
1146			$.ajax({
1147			    ajax_key: key,
1148			    url: "/GetData.ashx?queryType=statistics&queryArgument=oprogrammes&queryFilter=region&queryCode=" + urlKey,
1149			    success: function (data) {
1150			        results[this.ajax_key] = data;
1151			        loadedQueries += 1;
1152			        updateProgressBar();
1153			    }
1154			})
1155		);
1156    }
1157    var retValue = {
1158        hashKey: 'searchMode8',
1159        def: jQuery.when.all(deferreds, 'searchMode8'),
1160        cb: function (objects) {
1161            var targets = {};
1162            jQuery.each(results, function (key, result) {
1163                for (var i = 0; i < result.items.length; i++) {
1164                    var record = result.items[i];
1165                    if (selectedAreas.indexOf(record.code) >= 0 || selectedAreas.length == 0) {
1166                        if (!targets[key]) {
1167                            targets[key] = {
1168                                title: getEPTitle(key),
1169                                areas: []
1170                            };
1171                        }
1172                        targets[key].areas.push({
1173                            key: record.code,
1174                            budget: parseFloat(record.budget.replace(/\./g, "")),
1175                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1176                            payments: parseFloat(record.payments.replace(/\./g, ""))
1177							
1178                        });
1179                    }
1180                }
1181            });
1182            targets = sortObj(targets);
1183            renderCharts(targets, 'bar', 'searchMode8');
1184        }
1185    };
1186    return retValue;
1187}
1188function searchMode9() {	//OP per fund
1189    var eps = selectedEP;
1190    if (selectedEP.length == 0) {
1191        eps = getAllEP();
1192    }
1193    var deferreds = [];
1194    var results = {};
1195    var language = window.english ? "en-US" : "el-GR";
1196    maxQueries = eps.length;
1197    for (var i = 0; i < eps.length; i++) {	//Fire a request for each ep
1198        var key = "" + eps[i];
1199        var urlKey = key;
1200        deferreds.push(
1201			$.ajax({
1202			    ajax_key: key,
1203			    url: "/GetData.ashx?queryType=statistics&queryArgument=oprogrammes&queryFilter=fund&queryCode=" + urlKey,
1204			    success: function (data) {
1205			        results[this.ajax_key] = data;
1206			        loadedQueries += 1;
1207			        updateProgressBar();
1208			    }
1209			})
1210		);
1211    }
1212    var retValue = {
1213        hashKey: 'searchMode9',
1214        def: jQuery.when.all(deferreds, 'searchMode9'),
1215        cb: function (objects) {
1216            var targets = {};
1217            jQuery.each(results, function (key, result) {
1218                for (var i = 0; i < result.items.length; i++) {
1219                    var record = result.items[i];
1220                    if (selectedFunds.indexOf(record.code) >= 0 || selectedFunds.length == 0) {
1221                        if (!targets[key]) {
1222                            targets[key] = {
1223                                title: getEPTitle(key),
1224                                areas: []
1225                            };
1226                        }
1227                        targets[key].areas.push({
1228                            key: record.code,
1229                            budget: parseFloat(record.budget.replace(/\./g, "")),
1230                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1231                            payments: parseFloat(record.payments.replace(/\./g, "")),
1232							commitments: parseFloat(record.commitments.replace(/\./g, ""))
1233                        });
1234                    }
1235                }
1236            });
1237            targets = sortObj(targets);
1238            renderCharts(targets, 'pie', 'searchMode9'); 
1239        }
1240    };
1241    return retValue;
1242
1243}
1244function searchMode10() {	//OP per thematic
1245    var eps = selectedEP;
1246    if (selectedEP.length == 0) {
1247        eps = getAllEP();
1248    }
1249    var deferreds = [];
1250    var results = {};
1251    var language = window.english ? "en-US" : "el-GR";
1252    maxQueries = eps.length;
1253    for (var i = 0; i < eps.length; i++) {	//Fire a request for each ep
1254        var key = "" + eps[i];
1255        var urlKey = key;
1256        deferreds.push(
1257			$.ajax({
1258			    ajax_key: key,
1259			    url: "/GetData.ashx?queryType=statistics&queryArgument=oprogrammes&queryFilter=thematic&queryCode=" + urlKey,
1260			    success: function (data) {
1261			        results[this.ajax_key] = data;
1262			        loadedQueries += 1;
1263			        updateProgressBar();
1264			    }
1265			})
1266		);
1267    }
1268    var retValue = {
1269        hashKey: 'searchMode10',
1270        def: jQuery.when.all(deferreds, 'searchMode10'),
1271        cb: function (objects) {
1272            var targets = {};
1273            jQuery.each(results, function (key, result) {
1274                for (var i = 0; i < result.items.length; i++) {
1275                    var record = result.items[i];
1276                    if (selectedThematics.indexOf(record.code) >= 0 || selectedThematics.length == 0) {
1277                        if (!targets[key]) {
1278                            targets[key] = {
1279                                title: getEPTitle(key),
1280                                areas: []
1281                            };
1282                        }
1283                        targets[key].areas.push({
1284                            key: record.code,
1285                            budget: parseFloat(record.budget.replace(/\./g, "")),
1286                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1287                            payments: parseFloat(record.payments.replace(/\./g, "")),
1288                            commitments: parseFloat(record.commitments.replace(/\./g, "")),
1289                        });
1290                    }
1291                }
1292            });
1293            targets = sortObj(targets);
1294            renderCharts(targets, 'bar', 'searchMode10');
1295        }
1296    };
1297    return retValue;
1298}
1299function searchMode11() {	//Fund per region
1300    var funds = selectedFunds;
1301    if (selectedFunds.length == 0) {
1302        funds = getAllFunding();
1303    }
1304    var deferreds = [];
1305    var results = {};
1306    var language = window.english ? "en-US" : "el-GR";
1307    maxQueries = funds.length;
1308    for (var i = 0; i < funds.length; i++) {	//Fire a request for each fund
1309        var key = "" + funds[i];
1310        var urlKey = key;
1311        deferreds.push(
1312			$.ajax({
1313			    ajax_key: key,
1314			    url: "/GetData.ashx?queryType=statistics&queryArgument=funds&queryFilter=region&queryCode=" + urlKey,
1315			    success: function (data) {
1316			        results[this.ajax_key] = data;
1317			        loadedQueries += 1;
1318			        updateProgressBar();
1319			    }
1320			})
1321		);
1322    }
1323    var retValue = {
1324        hashKey: 'searchMode11',
1325        def: jQuery.when.all(deferreds, 'searchMode11'),
1326        cb: function (objects) {
1327            var targets = {};
1328            jQuery.each(results, function (key, result) {
1329                for (var i = 0; i < result.items.length; i++) {
1330                    var record = result.items[i];
1331                    if (selectedAreas.indexOf(record.code) >= 0 || selectedAreas.length == 0) {
1332                        if (!targets[key]) {
1333                            targets[key] = {
1334                                title: getFundingTitle(key),
1335                                areas: []
1336                            };
1337                        }
1338                        targets[key].areas.push({
1339                            key: record.code,
1340                            budget: parseFloat(record.budget.replace(/\./g, "")),
1341                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1342                            payments: parseFloat(record.payments.replace(/\./g, ""))
1343                        });
1344                    }
1345                }
1346            });
1347            targets = sortObj(targets);
1348            renderCharts(targets, 'bar', 'searchMode11');
1349        }
1350    };
1351    return retValue;
1352}
1353function searchMode12() {	//Fund per op
1354    var funds = selectedFunds;
1355    if (selectedFunds.length == 0) {
1356        funds = getAllFunding();
1357    }
1358    var deferreds = [];
1359    var results = {};
1360    var language = window.english ? "en-US" : "el-GR";
1361    maxQueries = funds.length;
1362    for (var i = 0; i < funds.length; i++) {	//Fire a request for each fund
1363        var key = "" + funds[i];
1364        var urlKey = key;
1365        deferreds.push(
1366			$.ajax({
1367			    ajax_key: key,
1368			    url: "/GetData.ashx?queryType=statistics&queryArgument=funds&queryFilter=operational_programme&queryCode=" + urlKey,
1369			    success: function (data) {
1370			        results[this.ajax_key] = data;
1371			        loadedQueries += 1;
1372			        updateProgressBar();
1373			    }
1374			})
1375		);
1376    }
1377    var retValue = {
1378        hashKey: 'searchMode12',
1379        def: jQuery.when.all(deferreds, 'searchMode12'),
1380        cb: function (objects) {
1381            var targets = {};
1382            jQuery.each(results, function (key, result) {
1383                for (var i = 0; i < result.items.length; i++) {
1384                    var record = result.items[i];
1385                    if (selectedEP.indexOf(record.code) >= 0 || selectedEP.length == 0) {
1386                        if (!targets[key]) {
1387                            targets[key] = {
1388                                title: getFundingTitle(key),
1389                                areas: []
1390                            };
1391                        }
1392                        targets[key].areas.push({
1393                            key: record.code,
1394                            budget: parseFloat(record.budget.replace(/\./g, "")),
1395                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1396                            payments: parseFloat(record.payments.replace(/\./g, "")),
1397							commitments: parseFloat(record.commitments.replace(/\./g, ""))
1398                        });
1399                    }
1400                }
1401            });
1402            targets = sortObj(targets);
1403            renderCharts(targets, 'bar', 'searchMode12');
1404        }
1405    };
1406    return retValue;
1407}
1408function searchMode13() {	//Fund per thematic
1409    var funds = selectedFunds;
1410    if (selectedFunds.length == 0) {
1411        funds = getAllFunding();
1412    }
1413    var deferreds = [];
1414    var results = {};
1415    var language = window.english ? "en-US" : "el-GR";
1416    maxQueries = funds.length;
1417    for (var i = 0; i < funds.length; i++) {	//Fire a request for each fund
1418        var key = "" + funds[i];
1419        var urlKey = key;
1420        deferreds.push(
1421			$.ajax({
1422			    ajax_key: key,
1423			    url: "/GetData.ashx?queryType=statistics&queryArgument=funds&queryFilter=thematic&queryCode=" + urlKey,
1424			    success: function (data) {
1425			        results[this.ajax_key] = data;
1426			        loadedQueries += 1;
1427			        updateProgressBar();
1428			    }
1429			})
1430		);
1431    }
1432    var retValue = {
1433        hashKey: 'searchMode13',
1434        def: jQuery.when.all(deferreds, 'searchMode13'),
1435        cb: function (objects) {
1436            var targets = {};
1437            jQuery.each(results, function (key, result) {
1438                for (var i = 0; i < result.items.length; i++) {
1439                    var record = result.items[i];
1440                    if (selectedThematics.indexOf(record.code) >= 0 || selectedThematics.length == 0) {
1441                        if (!targets[key]) {
1442                            targets[key] = {
1443                                title: getFundingTitle(key),
1444                                areas: []
1445                            };
1446                        }
1447                        targets[key].areas.push({
1448                            key: record.code,
1449                            budget: parseFloat(record.budget.replace(/\./g, "")),
1450                            contracts: parseFloat(record.contracts.replace(/\./g, "")),
1451                            payments: parseFloat(record.payments.replace(/\./g, "")),
1452							commitments: parseFloat(record.commitments.replace(/\./g, ""))
1453                        });
1454                    }
1455                }
1456            });
1457            targets = sortObj(targets);
1458            renderCharts(targets, 'bar', 'searchMode13'); 
1459        }
1460    };
1461    return retValue;
1462}
1463
1464
1465function updateProgressBar() {
1466    var width = parseInt((100 * loadedQueries) / maxQueries);
1467    jQuery("#loadingProgress .progress-bar").css("width", width + "%");
1468    jQuery("#loadingProgress .progress-bar").text(width + "%");
1469    if (width == 100) {
1470        jQuery("#loadingProgress").hide();
1471    }
1472}
1473function resetProgressBar() {
1474    loadedQueries = 0;
1475    maxQueries = 0;
1476    jQuery("#loadingProgress .progress-bar").css("width", 0 + "%");
1477    jQuery("#loadingProgress .progress-bar").text(0 + "%");
1478    jQuery("#loadingProgress").show();
1479}
1480
1481function performSearch(event) {
1482    if (event) {
1483        event.preventDefault();
1484        event.stopPropagation();
1485    }
1486    jQuery("#section3").show();
1487    resetProgressBar();
1488    jQuery("#results").empty();
1489    var atLeastOne = false;
1490    var gatherCBs = {};
1491    switch (moduleMode) {
1492        case 1:
1493            if ($("#modePerRegion")[0].checked) {
1494                var result = searchMode1();	//thematics per region
1495                gatherCBs[result.hashKey] = result;
1496                atLeastOne = true;
1497            }
1498            if ($("#modePerOP")[0].checked) {
1499                var result = searchMode3();	//thematics per op
1500                gatherCBs[result.hashKey] = result;
1501                atLeastOne = true;
1502            }
1503            if ($("#modePerFund")[0].checked) {
1504                var result = searchMode4();	//thematics per fund
1505                gatherCBs[result.hashKey] = result;
1506                atLeastOne = true;
1507            }
1508            break;
1509        case 5:
1510            if ($("#modePerOP")[0].checked) {
1511                var result = searchMode5();	//region per op
1512                gatherCBs[result.hashKey] = result;
1513                atLeastOne = true;
1514            }
1515            if ($("#modePerFund")[0].checked) {
1516                var result = searchMode6();	//region per fund
1517                gatherCBs[result.hashKey] = result;
1518                atLeastOne = true;
1519            }
1520            if ($("#modePerThematic")[0].checked) {
1521                var result = searchMode7();	//region per thematic
1522                gatherCBs[result.hashKey] = result;
1523                atLeastOne = true;
1524            }
1525            break;
1526        case 7:
1527            if ($("#modePerRegion")[0].checked) {
1528                var result = searchMode8();	//op per region
1529                gatherCBs[result.hashKey] = result;
1530                atLeastOne = true;
1531            }
1532            if ($("#modePerFund")[0].checked) {
1533                var result = searchMode9();	//op per fund
1534                gatherCBs[result.hashKey] = result;
1535                atLeastOne = true;
1536            }
1537            if ($("#modePerThematic")[0].checked) {
1538                var result = searchMode10();	//op per thematic
1539                gatherCBs[result.hashKey] = result;
1540                atLeastOne = true;
1541            }
1542            break;
1543        case 8:
1544            if ($("#modePerRegion")[0].checked) {
1545                var result = searchMode11();	//fund per region
1546                gatherCBs[result.hashKey] = result;
1547                atLeastOne = true;
1548            }
1549            if ($("#modePerOP")[0].checked) {
1550                var result = searchMode12();	//fund per op
1551                gatherCBs[result.hashKey] = result;
1552                atLeastOne = true;
1553            }
1554            if ($("#modePerThematic")[0].checked) {
1555                var result = searchMode13();	//fund per thematic
1556                gatherCBs[result.hashKey] = result;
1557                atLeastOne = true;
1558            }
1559            break;
1560    }
1561    if (!atLeastOne) {
1562        alert(og.selectSomething);
1563        jQuery("#section3").hide();
1564    }
1565    var gatherDefs = [];
1566    jQuery.each(gatherCBs, function (i, obj) {
1567        gatherDefs.push(obj.def);
1568    });
1569
1570    jQuery.when.all(gatherDefs).then(function (x) {
1571        /* This all merry go-round has been done in order to:
1572			a) Retrieve async the data in no particular order
1573			b) Render the charts in particular order
1574			The wtfness of this code is partly because of weeks in-between requirements.
1575		*/
1576        //First "per OP" charts:
1577        if (typeof gatherCBs['searchMode3'] !== 'undefined') {
1578            gatherCBs['searchMode3'].cb();
1579        }
1580        if (typeof gatherCBs['searchMode5'] !== 'undefined') {
1581            gatherCBs['searchMode5'].cb();
1582        }
1583        if (typeof gatherCBs['searchMode12'] !== 'undefined') {
1584            gatherCBs['searchMode12'].cb();
1585        }
1586
1587        //Second "per Thematic" charts:
1588        if (typeof gatherCBs['searchMode7'] !== 'undefined') {
1589            gatherCBs['searchMode7'].cb();
1590        }
1591        if (typeof gatherCBs['searchMode10'] !== 'undefined') {
1592            gatherCBs['searchMode10'].cb();
1593        }
1594        if (typeof gatherCBs['searchMode13'] !== 'undefined') {
1595            gatherCBs['searchMode13'].cb();
1596        }
1597
1598        //Third "per Fund" charts: 
1599        if (typeof gatherCBs['searchMode4'] !== 'undefined') {
1600            gatherCBs['searchMode4'].cb();
1601        }
1602        if (typeof gatherCBs['searchMode6'] !== 'undefined') {
1603            gatherCBs['searchMode6'].cb();
1604        }
1605        if (typeof gatherCBs['searchMode9'] !== 'undefined') {
1606            gatherCBs['searchMode9'].cb();
1607        }
1608
1609        //Finally, "per Region" charts:
1610        if (typeof gatherCBs['searchMode1'] !== 'undefined') {
1611            gatherCBs['searchMode1'].cb();
1612        }
1613        if (typeof gatherCBs['searchMode2'] !== 'undefined') {
1614            gatherCBs['searchMode2'].cb();
1615        }
1616        if (typeof gatherCBs['searchMode8'] !== 'undefined') {
1617            gatherCBs['searchMode8'].cb();
1618        }
1619        if (typeof gatherCBs['searchMode11'] !== 'undefined') {
1620            gatherCBs['searchMode11'].cb();
1621        }
1622
1623        var focusedDiv = $($(".chartContainer")[0]).find(">div")[0];
1624        focusedDiv.focus();
1625    });
1626}
1627
1628function mergeArrays(a, b) {
1629    var hash = {}, i;
1630    for (i = 0; i < a.length; i++) {
1631        hash[a[i]] = true;
1632    }
1633    for (i = 0; i < b.length; i++) {
1634        hash[b[i]] = true;
1635    }
1636    return Object.keys(hash);
1637}
1638
1639function getDistinctCategories(data) {
1640    var retvalue = [];
1641    for (var i = 0; i < data.length; i++) {
1642        retvalue.push(data[i].name);
1643    }
1644    return retvalue;
1645}
1646
1647function deMorphGroupedDataSeries(series, chartType) {
1648    /*
1649		To display a chart with groups and categories, we need:
1650			- the series data to be in the same order as the categories
1651			- the series data to be simple values (not objects)
1652		Input: multiple series, with data like: 
1653		{
1654			name: 'XXXX',	//same as category name
1655			data: [ value ]
1656		}
1657		Output: the expected structure
1658	*/
1659    var retvalue = [];
1660    if (chartType == 'pie') {
1661        for (var i = 0; i < series.length; i++) {
1662            id = series[i].name;
1663            switch (series[i].name) {
1664				case "commitments":
1665					pieInner = '90%';
1666                    pieOuter = '100%';
1667                    depth = 25;
1668                    linkedTo = '';
1669                    showInLegend = false;
1670					break;
1671                case "budget":
1672                    pieInner = '75%';
1673                    pieOuter = '85%';
1674                    depth = 25;
1675                    linkedTo = '';
1676                    showInLegend = true;
1677                    break;
1678                case "contracts":
1679                    pieInner = '50%';
1680                    pieOuter = '60%';
1681                    depth = 25;
1682                    linkedTo = ':previous';
1683                    showInLegend = false;
1684                    break;
1685                case "payments":
1686                    pieInner = 0;
1687                    pieOuter = '25%';
1688                    depth = 25;
1689                    linkedTo = ':previous';
1690                    showInLegend = false;
1691                    break;
1692				default:
1693					//showInLegend=true;
1694            }
1695            var data = [];
1696			/*
1697            var sortedData = series[i].data[0].data.sort(function (a, b) {
1698                return a.name.localeCompare(b.name);
1699            });
1700			*/
1701			var sortedData = series[i].data[0].data;
1702            for (var j = 0; j < sortedData.length; j++) {
1703                data.push(sortedData[j]);
1704            }
1705            retvalue.push({
1706                name: og[series[i].name],
1707                data: data,
1708                innerSize: pieInner,
1709                size: pieOuter,
1710                depth: depth,
1711                id: series[i].name,
1712                linkedTo: linkedTo,
1713                showInLegend: showInLegend
1714            });
1715        }
1716
1717    } else {
1718        for (var i = 0; i < series.length; i++) {
1719            var data = [];
1720			/*
1721            var sortedData = series[i].data.sort(function (a, b) {
1722                return a.name.localeCompare(b.name);
1723            });
1724			*/
1725			var sortedData = series[i].data;
1726            for (var j = 0; j < sortedData.length; j++) {
1727                data.push(sortedData[j].data[0]);
1728            }
1729            retvalue.push({
1730                name: og[series[i].name],
1731                data: data
1732            });
1733        }
1734    }
1735    return retvalue;
1736}
1737
1738function getSeriesTitle(area, chartMode) {
1739    var areaTitle = area.key;
1740    switch (chartMode) {
1741        case 'searchMode1':
1742            areaTitle = getAreaTitle(area.key);
1743            break;
1744        case 'searchMode3':
1745            areaTitle = getEPTitle(area.key);
1746            break;
1747        case 'searchMode4':
1748            areaTitle = getFundingTitle(area.key);
1749            break;
1750        case 'searchMode5':
1751            areaTitle = getEPTitle(area.key);
1752            break;
1753        case 'searchMode6':
1754            areaTitle = getFundingTitle(area.key);
1755            break;
1756        case 'searchMode7':
1757            areaTitle = getThematicTitle(area.key);
1758            break;
1759        case 'searchMode8':
1760            areaTitle = getAreaTitle(area.key);
1761            break;
1762        case 'searchMode9':
1763            areaTitle = getFundingTitle(area.key);
1764            break;
1765        case 'searchMode10':
1766            areaTitle = getThematicTitle(area.key);
1767            break;
1768        case 'searchMode11':
1769            areaTitle = getAreaTitle(area.key);
1770            break;
1771        case 'searchMode12':
1772            areaTitle = getEPTitle(area.key);
1773            break;
1774        case 'searchMode13':
1775            areaTitle = getThematicTitle(area.key);
1776            break;
1777    }
1778    return areaTitle;
1779}
1780
1781function getAdditionalTitle(mode) {
1782    var additionalTitle = "";
1783    switch (mode) {
1784        case 'searchMode1':
1785            additionalTitle = og['perRegion'];
1786            break;
1787        case 'searchMode3':
1788            additionalTitle = og['perOP'];
1789            break;
1790        case 'searchMode4':
1791            additionalTitle = og['perFund'];
1792            break;
1793        case 'searchMode5':
1794            additionalTitle = og['perOP'];
1795            break;
1796        case 'searchMode6':
1797            additionalTitle = og['perFund'];
1798            break;
1799        case 'searchMode7':
1800            additionalTitle = og['perThematic'];
1801            break;
1802        case 'searchMode8':
1803            additionalTitle = og['perRegion'];
1804            break;
1805        case 'searchMode9':
1806            additionalTitle = og['perFund'];
1807            break;
1808        case 'searchMode10':
1809            additionalTitle = og['perThematic'];
1810            break;
1811        case 'searchMode11':
1812            additionalTitle = og['perRegion'];
1813            break;
1814        case 'searchMode12':
1815            additionalTitle = og['perOP'];
1816            break;
1817        case 'searchMode13':
1818            additionalTitle = og['perThematic'];
1819            break;
1820    }
1821    return additionalTitle;
1822}
1823
1824function getMorphedChartData(ajaxData, chartMode, chartType, field, isGroup) {
1825
1826    var seriesData = [];
1827    var actualData = [];
1828    var dataMax = 0;
1829    jQuery.each(ajaxData.areas, function (i, area) {
1830        dataMax += area[field];
1831
1832    });
1833    for (var i = 0; i < ajaxData.areas.length; i++) {
1834        var area = ajaxData.areas[i];
1835        var seriesTitle = getSeriesTitle(area, chartMode);
1836        if (chartType == 'pie') {
1837            if (area[field]) {	//skip zero values
1838                var color = "#000";
1839                switch (area.key) {
1840                    case "1": //erdf
1841                        color = "#006a6e";
1842                        break;
1843                    case "2": //esf
1844                        color = "#a654c6";
1845                        break;
1846                    case "4": //maritime
1847                        color = "#497bef";
1848                        break;
1849                    case "6": //cohesion
1850                        color = "#da710f";
1851                        break;
1852                    case "7": //youth
1853                        color = "#ed4985";
1854                        break;
1855                }
1856                actualData.push(
1857					{ color: color, code: area.key, name: seriesTitle, y: area[field], percentage: Math.round(((100 * area[field]) / dataMax) * 100) / 100 }
1858				);
1859            }
1860        } else {
1861            if (area[field] > -1) {
1862                var cvalues;
1863                if (isGroup) {
1864                    cvalues = {
1865						code: area.key,
1866                        name: seriesTitle,
1867                        data: [area[field]]
1868                    };
1869                } else {
1870                    cvalues = {
1871                        code: area.key,
1872                        name: seriesTitle,
1873                        data: [{ name: seriesTitle, y: area[field] }]
1874                    }
1875                }
1876                seriesData.push(cvalues);
1877            }
1878
1879        }
1880    }
1881    jQuery.each(ajaxData.areas, function (i, area) {
1882        
1883
1884    });
1885
1886    if (chartType == 'pie') {
1887        seriesData = [
1888			{
1889			    name: ajaxData.title,
1890			    type: chartType,
1891			    data: actualData
1892			}
1893        ];
1894    }else{
1895		//console.log('before before',seriesData);
1896		
1897		seriesData = seriesData.sort(function(a,b){
1898			return (parseInt((a.code=="-"?"9999":a.code)) > parseInt((b.code=="-"?"9999":b.code)));
1899		});
1900		//console.log('after after',seriesData);
1901	}
1902	
1903    return seriesData;
1904}
1905
1906function renderSingleChart(chartType, key, height, options3d, seriesData, categories, headerTitle) {
1907	
1908    var pieInner;
1909    var pieOuter;
1910    var className = 'chart-' + chartType + (categories ? '-grouped' : '');
1911	
1912    switch (true) {
1913        case (!categories):
1914        default:
1915            pieInner = 0;
1916            pieOuter = '100%';
1917            break;
1918
1919    }
1920	var smallScreen = (window.innerWidth<1400);
1921	var absLeft = 0; //((smallScreen&&(className == 'chart-pie-grouped'))?jQuery("#chart_" + key).width()/2:0);
1922	var absTop=0;
1923	var absMargin=0;
1924	if (false){//(className == 'chart-pie-grouped'){
1925		if (smallScreen){
1926			absLeft=(jQuery("#chart_" + key).width()/2)+"px";
1927			absTop="200px";
1928		}else{
1929			absLeft=0;
1930			absTop=0;
1931		}
1932		absMargin=10;
1933	}else{
1934		if (smallScreen){
1935			//absMargin=70;
1936		}else{
1937			
1938		}
1939		absMargin=160;
1940		absLeft=0;
1941		absTop="-80px";
1942	}
1943	
1944	console.log(className,smallScreen,absLeft,absMargin);
1945    var x = new Highcharts.Chart({
1946        chart: {
1947            renderTo: "chart_" + key,
1948            defaultSeriesType: chartType,
1949            spacing: [10, 0, 0, 0],
1950            height: height,
1951            options3d: options3d,
1952            marginLeft: absMargin,
1953            className: className,
1954        },
1955        accessibility: {
1956            keyboardNavigation: {
1957                mode: "serialize"
1958            }
1959        },
1960        title: {
1961            text: headerTitle,
1962            useHTML: true,
1963        },
1964        subtitle: {
1965            enabled: false,
1966        },
1967        labels: {
1968            items: [
1969                {
1970                    html: (className == 'chart-pie-grouped')?"":'<div class="chartSuperLabel">'+og['tips'] + (className == 'chart-pie-grouped' ? ('<br />' + og['farOuterCircle'] + '<br />'+og['outerCircle'] + '<br />' + og['innerCircle'] + '<br />' + og['innerMostCircle']) : ''+'</div>')
1971                }
1972            ],
1973            style: {
1974                color: "#333333",
1975                position: "absolute",
1976                left: absLeft,
1977				//right: absLeft,
1978                //left: (className == 'chart-pie-grouped' ? "-60px" : "-160px"),
1979                top: absTop,	//(className == 'chart-pie-grouped'?(smallScreen?200:0):"-80px"),
1980                textAlign: "center"
1981            }
1982        },
1983        plotOptions: {
1984            pie: {
1985                dataLabels: {
1986                    enabled: false
1987                },
1988                innerSize: pieInner,
1989                size: pieOuter,
1990                depth: 35,
1991				center: smallScreen?["25%","50%"]:[null,null],
1992                showInLegend: true
1993            },
1994            column: {
1995                depth: 50,
1996                minPointLength: 1
1997            },
1998            bar: {
1999                depth: 50,
2000                minPointLength: 1
2001            },
2002            series: {
2003                //groupPadding: 0.025,
2004                maxPointWidth: 40,	//not current
2005                //pointWidth: 25
2006            }
2007        },
2008        xAxis: {
2009            categories: categories,
2010            title: {
2011                text: ""
2012            },
2013            opposite: false,
2014            labels: {
2015                useHTML: true,
2016                reserveSpace: (jQuery(window).width() > 480) ? true : false,
2017                //rotation: (chartType=='bar')?0:-45,
2018                //autoRotationLimit: (jQuery(window).width()>480)?80:10,
2019                align: 'center',
2020                //align: (chartType=='bar')?(jQuery(window).width()>480?'right':'center'):'center',	//highcharts bug: https://github.com/highcharts/highcharts/issues/5286 
2021                enabled: !!categories,
2022                staggerLines: (chartType == 'bar') ? (jQuery(window).width() > 480 ? 2 : 1) : 1,
2023                style: {
2024                    "color": "#666666",
2025                    "cursor": "default",
2026                    "fontSize": jQuery(window).width() > 480 ? "11px" : "8px",
2027                    "fontWeight": "bold",
2028                    "textAlign": "center",
2029                    "whiteSpace": (chartType == 'bar') ? "normal" : "normal",
2030                    "textOverflow": (chartType == 'bar') ? "ellipsis" : "none",
2031                    "width": (jQuery(window).width() > 480) ? "150px" : "30px"
2032                },
2033                y: (chartType == 'bar') ? 0 : 30,
2034                x: (chartType == 'bar') ? ((jQuery(window).width() > 480) ? 5 : -50) : 0,
2035            },
2036            maxPadding: 0.1,
2037            minPadding: 0.1,
2038        },
2039        yAxis: {
2040            title: {
2041                text: (window.english ? "in m. Euros" : "σε εκατ. Ευρώ"),
2042                align: 'low',
2043                position3d: 'chart'
2044            },
2045            labels: {
2046
2047                formatter: function () {
2048                    var m = this.value;
2049                    return Math.round(m * 100) / 100 / 1000000;
2050                },
2051                skew3d: true,
2052                style: {
2053                    "fontSize": jQuery(window).width() > 480 ? "13px" : "8px"
2054                }
2055            },
2056        },
2057        tooltip: {
2058            formatter: function () {
2059                var nStr = this.y;
2060                var newY;
2061                x = nStr.toString().split('.');
2062                x1 = x[0];
2063                x2 = x.length > 1 ? '.' + x[1] : '';
2064                var rgx = /(\d+)(\d{3})/;
2065                while (rgx.test(x1)) {
2066                    x1 = x1.replace(rgx, '$1' + '.' + '$2');
2067                }
2068                x2 = x2.replace(".", ",");
2069                newY = x1 + x2;
2070                newY = newY.replace(/\./g, og.thousandsSeparator);
2071                if (chartType == 'pie') {
2072                    return this.point.name + '. ' + this.point.series.name+': ' + newY + " €";
2073                } else {
2074                    var myXValue = (this.point.category) ? this.point.category + " - <b>" + this.point.series.name : this.point.name;
2075                    return myXValue + ': ' + newY + " €</b>";
2076                }
2077
2078            }
2079        },
2080        legend: {
2081            layout: (className == 'chart-pie-grouped'?'vertical':'horizontal'),
2082            align: (className == 'chart-pie-grouped'?'right':'center'),
2083            verticalAlign: 'top',
2084            x: 0,
2085            y: (className == 'chart-pie-grouped'?0:20),
2086            floating: false,
2087            borderWidth: 1,
2088            backgroundColor: '#FFFFFF',
2089            shadow: true
2090        },
2091        credits: {
2092            enabled: false
2093        },
2094        series: seriesData
2095    });
2096	if (className == 'chart-pie-grouped'){
2097		var htmlLabels = '<div class="chartSuperLabel">'+og['tips'] + (className == 'chart-pie-grouped' ? ('<br />' + og['farOuterCircle'] + '<br />'+og['outerCircle'] + '<br />' + og['innerCircle'] + '<br />' + og['innerMostCircle']) : ''+'</div>');
2098		jQuery("#chart_" + key).closest('.chartContainer').append(htmlLabels);
2099	}
2100    x.reflow();
2101
2102    return x;
2103}
2104
2105function renderCharts(data, chartType, additionalKey) {
2106    if (!chartType) {
2107        chartType = 'column';
2108    }
2109    tabIndex = 1;
2110    jQuery.each(data, function (key, record) {
2111        var theme = "";
2112        switch (key) {
2113            case "stoxos_01":
2114            case "stoxos_02":
2115            case "stoxos_03":
2116            case "stoxos_04":
2117                theme = "theme1";
2118                break;
2119            case "stoxos_05":
2120            case "stoxos_06":
2121            case "stoxos_07":
2122                theme = "theme2";
2123                break;
2124            case "stoxos_08":
2125            case "stoxos_09":
2126            case "stoxos_10":
2127            case "stoxos_11":
2128                theme = "theme3";
2129                break;
2130            default:
2131                theme = "theme4";
2132        }
2133
2134        var colClass = "";	
2135        var additionalTitle = getAdditionalTitle(additionalKey);
2136
2137        var threeDAlpha;
2138        var threeDBeta;
2139
2140        var separateCharts = jQuery("#separateChartsMode")[0].checked;
2141        if (separateCharts) {
2142            switch (chartType) {
2143                case 'bar':
2144                    threeDAlpha = 0;
2145                    threeDBeta = 15;
2146                    break;
2147                case 'column':
2148                    threeDAlpha = 15;
2149                    threeDBeta = 0;
2150                    break;
2151                case 'pie':
2152                    threeDAlpha = 45;
2153                    threeDBeta = 0;
2154                    break;
2155            }
2156            var options3d = {
2157                enabled: true,
2158                alpha: threeDAlpha,
2159                beta: threeDBeta
2160            };
2161            for (var k = 0; k < 4; k++) {
2162                var field = '';
2163                switch (k) {
2164                    case 0:
2165                        field = 'budget';
2166                        break;
2167                    case 1:
2168                        field = 'contracts';
2169                        break;
2170                    case 2:
2171                        field = 'payments';
2172                        break;
2173                    case 3:
2174                        field = 'commitments';
2175                        break;
2176                }
2177                var seriesData = getMorphedChartData(record, additionalKey, chartType, field);
2178                var compositeKey = additionalKey + '_' + key + '_' + field;
2179                var headerTitle = record.title + additionalTitle;
2180                if (moduleMode == 5) {
2181                    headerTitle = og['labelRegion'] + headerTitle;
2182                }
2183                switch (field) {
2184                    case 'budget':
2185                        headerTitle += " - <span class='fieldType'>" + og[field] + "</span>";
2186                        break;
2187                    case 'contracts':
2188                        headerTitle += " - <span class='fieldType'>" + og[field] + "</span>";
2189                        break;
2190                    case 'payments':
2191                        headerTitle += " - <span class='fieldType'>" + og[field] + "</span>";
2192                        break;
2193                    case 'commitments':
2194                        headerTitle += " - <span class='fieldType'>" + og[field] + "</span>";
2195                        break;
2196                }
2197                var div = "<div class='" + colClass + " " + theme + "'><div class='chartContainer'><h3>" + headerTitle + "</h3><div id='chart_" + compositeKey + "' ></div></div></div>";
2198                jQuery("#results").append(div);
2199                var height;
2200                var multiplier = (chartType == 'column') ? 40 : 50;
2201                if (chartType == 'pie') {
2202                    height = 400;
2203                } else {
2204                    height = Math.max(Math.min(600, (multiplier) * seriesData.length), 150);
2205                }
2206                renderSingleChart(chartType, compositeKey, height, options3d, seriesData, null, headerTitle);
2207            }
2208        } else {
2209            switch (chartType) {
2210                case 'bar':
2211                    threeDAlpha = 0;
2212                    threeDBeta = 0;
2213                    break;
2214                case 'column':
2215                    threeDAlpha = 15;
2216                    threeDBeta = 0;
2217                    break;
2218                case 'pie':
2219                    threeDAlpha = 45;
2220                    threeDBeta = 0;
2221                    break;
2222            }
2223            var options3d = {
2224                enabled: (chartType != 'pie'),
2225                alpha: threeDAlpha,
2226                beta: threeDBeta
2227            };
2228            var allData = [];
2229            var categories = [];
2230
2231            var limit;
2232            switch (additionalKey) {	//reverse limit change
2233				//case 'searchMode1':	//Thematics per region
2234                case 'searchMode3':	//Thematics per o.p.
2235				case 'searchMode4':	//Thematics per fund
2236				case 'searchMode9':	//OP per fund
2237                case 'searchMode10':	//OP per thematic
2238				case 'searchMode12':	//fund per op
2239				case 'searchMode13':	//fund per thematic
2240                    limit = 0;	//for these cases (where we have data), enable the 4th dimension
2241                    Highcharts.getOptions().colors = Highcharts.map(initialColors2, function (color) {
2242                        return {
2243                            radialGradient: {
2244                                cx: 0.5,
2245                                cy: 0.3,
2246                                r: 0.7
2247                            },
2248                            stops: [
2249								[0, color],
2250								[1, Highcharts.Color(color).brighten(-0.3).get('rgb')] // darken
2251                            ]
2252                        };
2253                    });
2254                    break;
2255                default:
2256                    Highcharts.getOptions().colors = Highcharts.map(initialColors1, function (color) {
2257                        return {
2258                            radialGradient: {
2259                                cx: 0.5,
2260                                cy: 0.3,
2261                                r: 0.7
2262                            },
2263                            stops: [
2264								[0, color],
2265								[1, Highcharts.Color(color).brighten(-0.3).get('rgb')] // darken
2266                            ]
2267                        };
2268                    });
2269                    limit = 1;
2270            }
2271            for (var k = limit; k < 4; k++) {
2272                var field = '';
2273                switch (k) {
2274                    case 0:
2275                        field = 'commitments';
2276                        break;
2277                    case 1:
2278                        field = 'budget';
2279
2280                        break;
2281                    case 2:
2282                        field = 'contracts';
2283
2284                        break;
2285                    case 3:
2286                        field = 'payments';
2287                        break;
2288                }
2289                //console.log('record before',record);
2290                var data = getMorphedChartData(record, additionalKey, chartType, field, true);
2291                allData.push({
2292                    name: field,
2293                    data: data
2294                });
2295				// console.log('data after',allData);
2296                categories = mergeArrays(categories, getDistinctCategories(data));
2297            }
2298            
2299            //categories.sort(function (a, b) {
2300            //    return a.localeCompare(b)
2301            //});
2302
2303            allData = deMorphGroupedDataSeries(allData, chartType);
2304
2305            var compositeKey = additionalKey + '_' + key;
2306            var headerTitle = record.title + additionalTitle;
2307            if (moduleMode == 5) {
2308                headerTitle = og['labelRegion'] + headerTitle;
2309            }
2310            if (additionalKey == 'searchMode8') {	//OP per region
2311                headerTitle = og['geoAnalysis'];
2312            }
2313            var div = "<div class='" + colClass + " " + theme + "'><div class='chartContainer'><h3>" + headerTitle + "</h3><div id='chart_" + compositeKey + "' tabindex='" + (3 + tabIndex) + "'></div></div></div>";
2314            jQuery("#results").append(div);
2315            var height;
2316            height = 400;
2317            console.log('chartType: ' + chartType + ', key: ' + additionalKey + ', allData: ' + allData.length + ', categories: ' + categories.length);
2318
2319            var multiplier = 400;
2320            if (chartType == 'pie') {
2321                height = 400;
2322            } else {
2323                if (categories.length > allData.length) {
2324                    height = Math.max(Math.min(600, (multiplier / 5) * categories.length), 150);
2325                } else {
2326                    height = Math.max(Math.min(600, multiplier * (allData.length / 3)), 150);
2327                }
2328
2329            }
2330
2331
2332            switch (additionalKey) {
2333                case 'searchMode1':	//Thematic per Region, chartType: bar
2334                    height = 200 + (60 * categories.length);
2335                    break;
2336                case 'searchMode3':	//Thematic per OP, chartType: bar
2337                    height = 200 + (60 * categories.length);
2338                    break;
2339                case 'searchMode4':	//Thematic per Fund, chartType: pie
2340                    height = 350 + (60 * categories.length);
2341                    break;
2342
2343                case 'searchMode5':	//Region per OP, chartType: bar
2344                    height = 200 + (60 * categories.length);
2345                    break;
2346                case 'searchMode6':	//Region per Fund, chartType: pie
2347                    height = 350 + (60 * categories.length);
2348                    break;
2349                case 'searchMode7':	//Region per thematic, chartType: bar
2350                    height = 200 + (60 * categories.length);
2351                    break;
2352
2353                case 'searchMode8':	//OP per region, chartType: bar
2354                    height = 200 + (60 * categories.length);
2355                    break;
2356                case 'searchMode9':	//OP per fund, chartType: pie
2357                    height = 350 + (60 * categories.length);
2358                    break;
2359                case 'searchMode10':	//OP per thematic, chartType: bar
2360                    height = 200 + (60 * categories.length);
2361                    break;
2362
2363                case 'searchMode11':	//Fund per OP, chartType: bar
2364                    height = 200 + (60 * categories.length);
2365                    break;
2366                case 'searchMode12':	//Fund per Thematic, chartType: bar
2367                    height = 200 + (60 * categories.length);
2368                    break;
2369                case 'searchMode13':	//Fund per Region, chartType: bar
2370                    height = 200 + (60 * categories.length);
2371                    break;
2372
2373
2374            }
2375            var chart = renderSingleChart(chartType, compositeKey, height, options3d, allData, categories, headerTitle);
2376            if (chartType == 'pie') {
2377                linkChartSeries(chart);
2378            }
2379        }
2380    });
2381    jQuery(document).scrollTop(jQuery("#section3").offset().top);
2382    jQuery("svg title").remove();
2383}
2384function getModeSelectTitle() {
2385    var mode = jQuery("#modeInp").val();
2386    if (mode) {
2387        moduleMode = parseFloat(mode.replace("mode", ""));
2388    }
2389    var title = "";
2390    switch (moduleMode) {
2391        case 1:
2392            title = og.menuItemThematic;
2393            break;
2394        case 5:
2395            title = og.menuItemRegion;
2396            break;
2397        case 7:
2398            title = og.menuItemOperationalProgramme;
2399            break;
2400        case 8:
2401            title = og.menuItemFund;
2402            break;
2403    }
2404
2405    return title;
2406}
2407function initControls(mode) {
2408    digiContainer = jQuery("#map")[0];
2409    loadThematics();
2410    jQuery("#mapSelection").show();
2411    jQuery("#epSelection").show();
2412    loadEP();
2413    jQuery("#fundingSelection").show();
2414    loadFunding();
2415
2416    switch (mode) {
2417        case 1:
2418            jQuery("#thematicContainer").show();
2419            jQuery("#modePerRegionContainer").show();
2420            jQuery("#modePerFundContainer").show();
2421            jQuery("#modePerOPContainer").show();
2422            //jQuery("#modePerThematic").show();
2423            jQuery("#criteriaSelection .moduleHelp").attr("href", "/Portals/0/AVMap/siteHelp/2.2.1.pdf");
2424            break;
2425        case 5:
2426            jQuery("#mapContainer").show();
2427            //jQuery("#modePerRegionContainer").show();
2428            jQuery("#modePerFundContainer").show();
2429            jQuery("#modePerOPContainer").show();
2430            jQuery("#modePerThematicContainer").show();
2431            jQuery("#criteriaSelection .moduleHelp").attr("href", "/Portals/0/AVMap/siteHelp/2.2.2.pdf");
2432            initMap();
2433            addKML();
2434            break;
2435        case 7:
2436            jQuery("#epContainer").show();
2437            jQuery("#modePerRegionContainer").show();
2438            jQuery("#modePerFundContainer").show();
2439            //jQuery("#modePerOPContainer").show();
2440            jQuery("#modePerThematicContainer").show();
2441            jQuery("#criteriaSelection .moduleHelp").attr("href", "/Portals/0/AVMap/siteHelp/2.2.3.pdf");
2442            break;
2443        case 8:
2444            jQuery("#fundingContainer").show();
2445            jQuery("#modePerRegionContainer").show();
2446            //jQuery("#modePerFundContainer").show();
2447            jQuery("#modePerOPContainer").show();
2448            jQuery("#modePerThematicContainer").show();
2449            jQuery("#criteriaSelection .moduleHelp").attr("href", "/Portals/0/AVMap/siteHelp/2.2.4.pdf");
2450            break;
2451
2452    }
2453}
2454
2455jQuery(document).ready(function ($) {
2456    var mode = jQuery("#modeInp").val();
2457    if (mode) {
2458        moduleMode = parseFloat(mode.replace("mode", ""));
2459    }
2460    initControls(moduleMode);
2461    jQuery.when(
2462		jQuery.get("/GetData.ashx?queryType=lists&queryArgument=regions")
2463	).done(function (regions) {
2464	    var regions = regions.items;
2465	    jQuery.each(regions, function (i, region) {
2466	        static_perifereies.push({
2467	            id: region.code,
2468	            value: window.english ? region.title_en : region.title
2469	        });
2470	    });
2471	});
2472    jQuery("#buttonContainer .trans").html(avtranslate.render({ text: og.buttonSearch }));
2473
2474    jQuery("#mapSelection").html(itemSelectionTmpl.render({ code: "-", title: (moduleMode == 2) ? og.allPrefectures : og.allRegions }));
2475    jQuery("#thematicSelection").html(itemSelectionTmpl.render({ code: "-", title: og.allThematics }));
2476    jQuery("#fundingSelection").html(itemSelectionTmpl.render({ code: "-", title: og.allFunds }));
2477    jQuery("#epSelection").html(itemSelectionTmpl.render({ code: "-", title: og.allEP }));
2478    jQuery("#searchCriteriaExplain .trans").html(avtranslate.render({ text: og.criteriaRecap }));
2479
2480    jQuery("#thematicContainer").on("keypress click", ".thematicLink", toggleThematic);
2481    jQuery("#fundingContainer").on("keypress click", ".fundingLink", toggleFund);
2482    jQuery("#epContainer").on("keypress click", ".epLink", toggleEP);
2483    jQuery("#buttonContainer").on("keypress click", "#searchBtn", performSearch);
2484
2485    jQuery("#criteriaSelection .trans").html(avtranslate.render({ text: og.section1 }));
2486    var modeSelect = getModeSelectTitle();
2487    jQuery(".selectedMenuItem").html(avtranslate.render({ text: modeSelect }));
2488    jQuery("#criteriaRecount .trans").html(avtranslate.render({ text: og.section2 }));
2489    jQuery("#criteriaResults .trans").html(avtranslate.render({ text: og.section3 }));
2490
2491    jQuery("#chartsAdvancedModeContainer .trans").html(avtranslate.render({ text: og.btnAdvanced }));
2492
2493    jQuery("#chartsModeContainer .trans").html(avtranslate.render({ text: og.separateCharts }));
2494    jQuery("#modePerRegionContainer .trans").html(avtranslate.render({ text: og.btnPerRegion }));
2495    jQuery("#modePerFundContainer .trans").html(avtranslate.render({ text: og.btnPerFund }));
2496    jQuery("#modePerOPContainer .trans").html(avtranslate.render({ text: og.btnPerOP }));
2497    jQuery("#modePerThematicContainer .trans").html(avtranslate.render({ text: og.btnPerThematic }));
2498
2499
2500    $('#chartsAdvancedMode').bootstrapToggle({
2501        on: og['btnOn'],
2502        off: og['btnOff'],
2503        size: 'mini',
2504        onstyle: 'success',
2505        offstyle: 'danger'
2506    }).change(function () {
2507        jQuery("#advancedTogglers").toggle();
2508    });
2509
2510    $('#separateChartsMode').bootstrapToggle({
2511        on: og['btnOn'],
2512        off: og['btnOff'],
2513        size: 'mini',
2514        onstyle: 'success',
2515        offstyle: 'danger'
2516    }).change(function () {
2517        if (jQuery("#thematicContainer .thematicLink.selected").length > 0) {
2518            getThematics();
2519            performSearch();
2520        }
2521    });
2522
2523    $('#modePerRegion').bootstrapToggle({
2524        on: og['btnOn'],
2525        off: og['btnOff'],
2526        size: 'mini',
2527        onstyle: 'success',
2528        offstyle: 'danger'
2529    });
2530    $('#modePerFund').bootstrapToggle({
2531        on: og['btnOn'],
2532        off: og['btnOff'],
2533        size: 'mini',
2534        onstyle: 'success',
2535        offstyle: 'danger'
2536    });
2537    $('#modePerOP').bootstrapToggle({
2538        on: og['btnOn'],
2539        off: og['btnOff'],
2540        size: 'mini',
2541        onstyle: 'success',
2542        offstyle: 'danger'
2543    });
2544    $('#modePerThematic').bootstrapToggle({
2545        on: og['btnOn'],
2546        off: og['btnOff'],
2547        size: 'mini',
2548        onstyle: 'success',
2549        offstyle: 'danger'
2550    });
2551});

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.