Current File : /home/lightco1/www/administrator/components/com_jmap/js/supersuggest.js
/**
* Google suggest keywords crawler
*
* @package JMAP::INDEXING::administrator::components::com_jmap
* @subpackage js
* @author Joomla! Extensions Store
* @copyright (C) 2015 Joomla! Extensions Store
* @license GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html
*/
//'use strict';
var JMapSupersuggest = (function($) {
var gKeyword = "";
var gLanguage = "en";
var callbackNum = 0;
var gResults = {};
function setKeyword(keyword, language) {
gKeyword = keyword;
gLanguage = language;
if(typeof(gResults[gKeyword]) !== 'undefined' && typeof(gResults[gKeyword][gLanguage]) !== 'undefined' && gResults[gKeyword][gLanguage]['length']) { } else {
if(typeof(gResults[gKeyword]) !== 'object') {
gResults[gKeyword] = {};
}
gResults[gKeyword][gLanguage] = new Array();
}
}
function getKeyword() {
return gKeyword;
}
function generateKeywordArr(skeyword) {
// Add whitespace to keyword
var kWordWithSpace = skeyword + '%20';
// Define the output array.
var skeywords = new Array(skeyword, kWordWithSpace);
// Create an array with all the characters to append.
var additionalChars = new Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
// Create array of Keywords.
for ( var i = 0; i < additionalChars.length; i++) {
skeywords.push(kWordWithSpace + additionalChars[i]);
}
return skeywords;
}
function setCallbackCount(length) {
callbackNum = length;
}
function changeCallbackCount(num) {
callbackNum += num;
}
function getCallbackCount() {
return callbackNum;
}
function getSuggestions(sKeywords) {
// Check if already keywords present in the cache array
if(typeof(gResults[gKeyword]) !== 'undefined' && typeof(gResults[gKeyword][gLanguage]) !== 'undefined' && gResults[gKeyword][gLanguage]['length'] > 0) {
// Got a cache hit, retrieve here results and return
showGResults();
return;
}
// Loop through keywords. This will populate the gResults global
// variable (array).
for ( var i = 0; i < sKeywords.length; i++) {
initializeSuggestCall(sKeywords[i]);
}
}
function initializeSuggestCall(cKeyword) {
// Create the script component that will get the JSONP response from Google's suggestor
var script = document.createElement('script');
script.type = 'text/javascript';
script.id = 'script_' + cKeyword;
script.src = 'http://suggestqueries.google.com/complete/search?client=youtube&jsonp=JMapSupersuggest.suggestCallback&q=' + cKeyword + '&hl=' + gLanguage;
// Append the script to the header on the HTML
document.getElementsByTagName('head')[0].appendChild(script);
// Delete the added script to clean up the HTML (requires common.js or a version of that).
script.remove();
}
function pushGResult(result) {
gResults[gKeyword][gLanguage].push(result);
}
function getGResults() {
return gResults[gKeyword][gLanguage];
}
function checkGStatus() {
callbackNum -= 1
if (callbackNum < 1) {
// Show the results to the client.
if(gResults[gKeyword][gLanguage]['length']) {
showGResults();
} else {
showFallbackResults();
}
}
}
function privateCallback(dataWeGotViaJSONP) {
// dataWeGotViaJSONP is an array (0 is name 1 is stuff we care about 2 is the search query object) Get the results from the JSONP response
var rawResults = dataWeGotViaJSONP[1];
// The results contain some info we don't care about (namely 0's). This filters them out.
var resultsWeCareAbout = new Array();
for ( var i = 0; i < rawResults.length; i++) {
gResults[gKeyword][gLanguage].push(rawResults[i][0]);
}
checkGStatus();
}
function showGResults() {
// Process results here, enable back the search keyword input field
$('#search').prop('disabled', false);
// Remove waiter
$('img.waiterinfo').remove();
// Show the results in the DOM (one per line).
$('div.popover.keywords_suggestion div.popover-content').html('<ul class="keywords_results"><li>' + gResults[gKeyword][gLanguage].join("</li><li>") + '</li></ul>');
// Fix the popover arrow
$('div.popover.right.keywords_suggestion div.arrow').css('top', '5%');
// Reset counter
callbackNum = 0;
}
function showFallbackResults() {
// Fallback to an alternative system API
// Wordstream service
$.get('http://kwrs.wordstream.com/keywords?pattern=' + gKeyword, function(response){
if(typeof(response) === 'object' && response.code == 'OK') {
gResults[gKeyword][gLanguage] = new Array();
$.each(response.data.keywords, function(index, keywordObject){
gResults[gKeyword][gLanguage].push(keywordObject.keyword);
});
showGResults();
}
}, "jsonp");
}
// / Public methods interface
return {
setKeywordVariable : function(keyword, language) {
return setKeyword(keyword, language);
},
getKeywordVariable : function() {
return getKeyword();
},
generateKeywords : function(seed) {
return generateKeywordArr(seed);
},
setCallbackNumer : function(int) {
return setCallbackCount(int);
},
editCallbackNumber : function(num) {
return changeCallbackCount(num);
},
getCallbackNumer : function(int) {
return getCallbackCount();
},
pushResults : function(result) {
return pushGResult(result);
},
getResults : function() {
return getGResults();
},
checkStatus : function() {
return checkGStatus();
},
getSuggestionsFromG : function(sKeywords) {
return getSuggestions(sKeywords);
},
suggestCallback : function(dataJSONP) {
return privateCallback(dataJSONP);
}
};
})(jQuery);