"use strict"; var progressVal = 0; var show_progress = 5; var start_hist_delay = 1000; // used to be 4000 var mini_delay = 300; //var hasLocalStorage = (typeof(Storage) !== "undefined"); // **** var hasLocalStorage = false; var quantHSLHistogramArray; //var saveOnServer=true; var saveOnServer=false; var retrieveFromServer=true; function runlength_encode(int_array) { var array_len = int_array.length; if (array_len<2) { console.warn("runlength_encode(): unable to run-length encode array of length " + array_len); console.warn("returning null"); return null; } var int_array_rle = new Array(); var lock_val=int_array[0]; var next_val=int_array[1]; var i = 1; while (ishow_progress) { $progressArea.slideDown(); } img_list.sort(); var root_img_re = /^.*\/(.*?)\..*?$/; var progress_step = 100.0 / img_list_len; var callback_count = 0; var i; for (i=0; ishow_progress) { progressVal = 100; $progressBar.progressbar('value',progressVal); //$progressArea.slideUp(); // Now move on and start computing colour histograms setTimeout(function() { doneDisplayFlags(img_list,$progressArea,$progressBar); } ,start_hist_delay); } } }; /* $("h2").live('mousedown', function(e) { if( (e.which == 1) ) { alert("left button"); }if( (e.which == 3) ) { alert("right button"); }else if( (e.which == 2) ) { alert("middle button"); } e.preventDefault(); }).live('contextmenu', function(e){ e.preventDefault(); }); */ imageObj.onclick = function(e) { // Store result of HSL quantization in the image object/tag if (!this.quantHSLHist) { // Only need to compute this if it is not already stored in the object/tag this.quantHSLHist = createHSLHistogram(this,16); console.log(this.quantHSLHist); } if (e.which == 1 ) { // Left => use in comparison pair flag_comparison_array[clicked_on_count] = this.quantHSLHist; clicked_on_count++; if (clicked_on_count==2) { // trigger comparison alert("Similarity score: " + quantizedColourHistogramComparison(flag_comparison_array[0],flag_comparison_array[1]) + "%"); clicked_on_count=0; } } else if (e.which == 2) { // Middle => fix on this and do similarity with everything else var fix_id = this.id; e.preventDefault(); } }; imageObj.src = img_url; imageObj.height = 216; imageObj.title = title.toUpperCase(); imageObj.country = imageObj.title; imageObj.id = "flag-img-" + i; $displayDiv.append(imageObj); } } function calcSimilarityValuesChain(newFlagQuantHSLHist, chain_count, img_obj_list, img_obj_list_len, progressVal, progress_step, $progressArea,$progressBar) { var imgObj = img_obj_list[chain_count]; var existingQuantHSLHist = imgObj.quantHSLHist; var similarity_score = quantizedColourHistogramComparison(newFlagQuantHSLHist,existingQuantHSLHist); similarity_score = Math.round(similarity_score * 100) / 100; // round to 2 decimal places similarity_score *= 100; // express as percentage imgObj.similarityScore = similarity_score; var img_title = imgObj.country; if (isoCountryCodes != null) { var country_code = imgObj.country; img_title = isoCountryCodes[country_code] + " (" + country_code + ")"; } imgObj.title = img_title + ", Similarity score: " + similarity_score + "%"; if (similarity_score>50) { //imgObj.style.display = "block"; //imgObj.style.visibility = "visible"; } else { //imgObj.style.display = "none"; //imgObj.style.visibility = "hidden"; } if (chain_count < img_obj_list_len-1) { progressVal += progress_step; if ($progressBar.progressbar) { $progressBar.progressbar('value',progressVal); } setTimeout(function() { calcSimilarityValuesChain(newFlagQuantHSLHist, chain_count+1,img_obj_list, img_obj_list_len, progressVal, progress_step, $progressArea,$progressBar) } ,1 // any time delay causes break in 'rendering' thread, even 0! ); } else { // done $progressArea.find('span:first').text("Done."); if (img_obj_list_len>show_progress) { progressVal = 100; if ($progressBar.progressbar) { $progressBar.progressbar('value',progressVal); } $progressArea.slideUp(); } } } function calcSimilarityValues(newFlagQuantHSLHist, $displayDiv,$progressArea,$progressBar) { console.log("*** calcSimilarityValues()"); var iframe = $('#similarity-2d-iframe').contents(); var img_obj_list = iframe.find('#flagArea').children('img').toArray(); var img_obj_list_len = img_obj_list.length; console.log("*** img obj list len = " + img_obj_list_len); if (img_obj_list_len==0) { return; } else if (img_obj_list_len>show_progress) { // number of images to process non-trivial $progressArea.slideDown(); } for (var i=0; i50) { //imgObj.style.display = "inline"; //imgObj.style.visibility = "visible"; } else { //imgObj.style.display = "none"; //imgObj.style.visibility = "hidden"; } progressVal += progress_step; //console.log("*** i = " + i); //console.log("*** pbar = " + $progressBar.progressbar); if ($progressBar.progressbar) { $progressBar.progressbar('value',progressVal); } } //progressVal = 100; //$progressBar.progressbar('value',progressVal); if (img_obj_list_len>show_progress) { $progressArea.slideUp(); } } function sortUsingAttribute(parent, childSelector, field) { var items = parent.children(childSelector).sort(function(a, b) { var vA = a.attr(field); var vB = b.attr(field) return (vA < vB) ? -1 : (vA > vB) ? 1 : 0; }); parent.empty(childSelecctor); parent.append(items); } function compareSimilarityValue(a,b) { //var vA = a.similarityScore; //var vB = b.similarityScore; //return (vA < vB) ? -1 : (vA > vB) ? 1 : 0; return (b.similarityScore - a.similarityScore); } function sortFlagsBySimilarityValue($iframe) { var img_obj_list = $iframe.find('#flagArea > img').toArray(); var sorted_img_obj_list = img_obj_list.sort(compareSimilarityValue); //console.log("*** sorted img len = " + sorted_img_obj_list.length); $iframe.find('#flagArea').empty('img'); $iframe.find('#flagArea').append(sorted_img_obj_list); //sortUsingAttribute('#flagArea','img','similarityValue'); } function computeFlagHistogramChain(chain_count, img_list_len, progressVal, progress_step, $progressArea,$progressBar) { var flag_id = "flag-img-" + chain_count; console.log("Processing Image ID: " + flag_id); var imageObj = document.getElementById(flag_id); if (!imageObj.quantHSLHist) { // Only need to compute this if it is not // already stored in the object/tag if (retrieveFromServer) { // see if it is stored on the server console.log("Retrieving stored colour histogram for " + imageObj.title.toLowerCase() + " ..."); $.ajax({ async: false, dataType: "json", url: "../similarity-2d/json-data/" + imageObj.title.toLowerCase() + ".json", success: function(data) { console.log("... success"); // 'data' is the array of integer vals we want imageObj.quantHSLHist = data; }, error: function() { console.log("... not stored on server"); // not stored on the server (currently) // => need to compute it imageObj.quantHSLHist = createHSLHistogram(imageObj,16); //console.log(imageObj.quantHSLHist); } }); } else { imageObj.quantHSLHist = createHSLHistogram(imageObj,16); } } if (chain_count < img_list_len-1) { progressVal += progress_step; $progressBar.progressbar('value',progressVal); setTimeout(function() { computeFlagHistogramChain(chain_count+1,img_list_len, progressVal, progress_step, $progressArea,$progressBar) } ,mini_delay // any time delay causes break in 'rendering' thread, even 0! ); } else { $progressArea.find('span:first').text("Done."); if (img_list_len>show_progress) { progressVal = 100; $progressBar.progressbar('value',progressVal); $progressArea.slideUp(); } doneComputingHistograms(img_list_len); } } function computeFlagHistograms(img_list,$progressArea,$progressBar) { var img_list_len = img_list.length; if (img_list_len==0) { $progressArea.find('span:first').text("Empty list: no computation needed."); return; } $progressArea.find('span:first').text("Computing histograms:"); progressVal = 0; if (img_list_len>show_progress) { $progressArea.slideDown(); } var progress_step = 100.0 / img_list_len; // Start the chaining process setTimeout(function() { computeFlagHistogramChain(0,img_list_len, progressVal, progress_step, $progressArea,$progressBar) } ,mini_delay // any time delay causes break in 'rendering' thread, even 0! ); } function doneComputingHistograms(img_list_len) { quantHSLHistogramArray = new Array(img_list_len); for (var i=0; i regenerating"); } } } if (needToComputeHistograms) { if (retrieveFromServer) { // before computing histograms from scratch, see if resulting data stored on server console.log("Retrieving stored colour histgram data for all flags ..."); $.ajax({ async: true, dataType: "json", url: "../similarity-2d/json-data/all-hsv-histograms-rle.json", success: function(rle_data) { console.log("... success"); if (rle_data.length != img_list.length) { console.log("Stored histogram data out of date with flag list."); console.log("rle len = " + rle_data.length + ", img_list len = " + img_list.length); // what is stored on the sever differed to the number of images displayed computeFlagHistograms(img_list,$progressArea,$progressBar); } else { var img_list_len = img_list.length; quantHSLHistogramArray = new Array(img_list_len); // Need to rle decode each entry in this array for (var i=0; i