blue-searchpage/scripts/scripts.js
2019-08-13 02:23:09 +02:00

375 lines
8.4 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var eng = {},
current = {},
fadeDur = 200,
titlePrefix = "Search ",
idxWidth = 700,
idxLogoFull = [225,80],
idxLogoSmall = [157,56],
idxMargin = 24,
idxFadedOpacity = 0.3,
idxHeight = 0;
$(function()
{
// Create Engine Index
indexCreate();
// Behavior
$("#i").keyup(function(ev) { fetchSuggestions(ev.which); });
$(document).click(function(ev) { closeSugBox(ev.srcElement) });
$("#toggleInfo").click(function(){
$("#infoBox").toggle(400);
});
// Set up first engine
build(firstProp(eng), false);
});
function doSearch()
{
var url = eng[current.engine].places[current.place][0];
url = url.replace("%query%", encodeURIComponent($("#i").val()));
if (typeof eng[current.engine].languages == "object")
url = url.replace("%lang%", eng[current.engine].languages[current.language]);
window.location.href = url;
return false;
}
/* ENGINE INDEX
----------------------------------------------------- */
function indexCreate()
{
var row = 0,
i = 0, // Reset every row
j = 0, // Total
offset = 0,
cols = Math.floor(idxWidth/idxLogoSmall[0]);
for (e in eng)
{
// If the offset hasn't been set yet
// And the number of engines left to draw is <= items in the final row
if (
offset == 0 &&
(numKeys(eng) - j) <= (numKeys(eng) % cols)
) {
offset = cols - numKeys(eng) % cols;
offset = offset * (idxLogoSmall[0]+idxMargin) / 2;
}
$("#engines").prepend("<a id='"+e+"_logo' ref='"+e+"'><img src='engines/"+eng[e].logo+"'></a>");
if (i == cols) { i=0; row++; };
eng[e].idxPos = [
(idxLogoSmall[0]+idxMargin)*i - idxWidth/2 + offset,
(idxLogoSmall[1]+idxMargin)*row
];
i++; j++;
}
idxHeight = (row+1)*(idxLogoSmall[1]+idxMargin)-idxMargin;
idxHeight = Math.max(idxHeight, idxLogoFull[1]);
$("#engines a").click(function(){ build($(this).attr("ref"), true); })
$("#engines a").css({
"left": "50%",
"bottom": "0",
"marginLeft": -idxLogoFull[0]/2+"px"
});
$("#engines").mouseenter(function(){ indexOpen(); });
$("#engines").mouseleave(function(){ indexClose(); });
}
var idxState = false,
idxClear = undefined;
function indexOpen()
{
idxState = true;
clearTimeout(idxClear);
$("#engines").css({
"height": idxHeight
});
for (e in eng)
{
var op = $("#"+e+"_logo").hasClass("active");
$("#"+e+"_logo").stop().queue("fx",[]).animate({
"marginLeft": eng[e].idxPos[0]+"px",
"marginBottom": eng[e].idxPos[1]+"px",
"opacity": (op) ? 1 : idxFadedOpacity,
"width": idxLogoSmall[0],
"height": idxLogoSmall[1],
}, fadeDur);
}
}
function indexClose()
{
idxState = false;
$("#engines").css({
"height": idxLogoFull[1]
});
$("#engines a").each(function()
{
var op = $(this).hasClass("active");
$(this).stop().queue("fx",[]).animate({
"marginLeft": -idxLogoFull[0]/2+"px",
"marginBottom": 0,
"opacity": (op) ? 1 : 0,
"width": idxLogoFull[0],
"height": idxLogoFull[1]
}, fadeDur);
});
// Because jQuery doesn't like me
idxClear = setTimeout(function(){ $("#engines a:not(.active)").css("opacity",0) }, fadeDur);
}
/* GENERATING THE SEARCH ENGINE PAGE
----------------------------------------------------- */
function build(e, animate)
{
var methodFade = (animate) ? fadeDur : 0;
current.engine = e; // Just the engine's ID for reference
e = eng[e]; // Engine object
$("#title").html(titlePrefix+e.pageTitle);
$("#method").stop().queue("fx",[]).animate({"opacity": 0}, methodFade);
op = (idxState) ? idxFadedOpacity : 0;
$("#engines a").stop().queue("fx",[]).removeClass("active");
$("#"+current.engine+"_logo").addClass("active").animate({"opacity": 1}, fadeDur);
$("#engines a:not(.active)").animate({"opacity": op}, fadeDur);
if (typeof e.languages == "object") setLang(firstProp(e.languages));
else $("#lang").fadeOut(fadeDur);
closeSugBox(false);
$("#i").attr("autosave", "com.infinise.go."+current.engine);
$("#input input").focus();
setTimeout(function()
{
$("#method").html("");
for (place in e.places) $("#method").append("<a onclick='setPlace(this)'>"+place+"</a>");
setPlace("#method a:first");
$("#method").animate({"opacity": 1}, fadeDur);
}, methodFade);
}
function setPlace(place)
{
current.place = $(place).html();
$("#method a").removeClass("active");
$(place).addClass("active");
$("#input input").focus();
if (eng[current.engine].places[current.place][1] !== false)
{
fetchSuggestions();
$("#i").attr("autocomplete", "off");
}
else
{
closeSugBox(false);
$("#i").attr("autocomplete", "on");
}
}
function setLang(language)
{
current.language = language;
$("#lang").fadeIn(fadeDur).html(language);
$("#input input").focus();
}
/* KEYBOARD SHORTCUTS
----------------------------------------------------- */
var isCtrl = false;
var isCmd = false;
$(document).keyup(function(e)
{
if (e.which == 17) isCtrl=false;
if (e.which == 91) isCmd=false;
}
).keydown(function(e)
{
if (e.which == 17) isCtrl=true;
if (e.which == 91) isCmd=true;
if (e.which == 49 && isCtrl == true) { /* Key "1" */ nextEngine(); return false; }
if (e.which == 50 && isCtrl == true) { /* Key "2" */ nextPlace(); return false; }
if (e.which == 51 && isCtrl == true) { /* Key "3" */ nextLanguage(); return false; }
if (e.which == 38) { /* Arrow Up */ prevSugResult(); }
if (e.which == 40) { /* Arrow Down */ nextSugResult(); }
if (e.which == 27) { /* ESC */ closeSugBox(false); }
if (e.which == 13) { /* Enter */ applySugResult(); }
});
function nextEngine()
{
build(findNext(eng, current.engine), true);
}
function nextPlace()
{
var nextPlace = findNext(eng[current.engine].places, current.place);
$("#method a").each(function()
{
if ($(this).html() == nextPlace) setPlace($(this));
})
}
function nextLanguage()
{
setLang(findNext(eng[current.engine].languages, current.language));
}
/* SUGGESTIONS
----------------------------------------------------- */
function fetchSuggestions(key) 
{
if (key == undefined || (!inArray(key, new Array(13,16,20,27,37,38,39,40)) && !isCtrl && !isCmd))
{
if ( $("#i").val() != "" && eng[current.engine].places[current.place][1] !== false )
{
current.suggestionsTimestamp = new Date().getTime();
var url = eng[current.engine].places[current.place][1];
url = url.replace("%query%", encodeURIComponent($("#i").val()));
url = url.replace("%time%", current.suggestionsTimestamp);
if (typeof eng[current.engine].languages == "object")
url = url.replace("%lang%", eng[current.engine].languages[current.language]);
$.getJSON(url, function(data) { buildSuggestions(data); })
}
else closeSugBox(false);
}
}
function buildSuggestions(list)
{
if (list.empty)
{
if(console)console.log("(1) Suggestions for '"+list.query+"' empty.");
closeSugBox(false);
}
else if (
list.engine == current.engine &&
list.timestamp == current.suggestionsTimestamp &&
list.query == $("#i").val()
) {
if(console)console.log("(2) Suggestions for '"+list.query+"' accepted.");
$("#sugs").html("");
for (sug in list.results)
{
sug = list.results[sug];
$("#sugs").append("<li><a href='"+sug[1]+"'>"+sug[0]+"</a></li>");
}
$("#sugs").css({"display": "block"});
$("#sugs li").mousemove(function()
{
$("#sugs .active").removeClass("active");
$(this).addClass("active");
}
).click(function()
{
applySugResult();
});
}
else
{
if(console)console.log("(3) Suggestions for '"+list.query+"' discarded.");
}
}
function prevSugResult()
{
if ($("#sugs").css("display") == "none") return;
if ($("#sugs .active").length == 0) {
$("#sugs li:last-child").addClass("active");
} else {
$("#sugs .active").removeClass("active").prev().addClass("active");
}
backupQuery();
}
function nextSugResult()
{
if ($("#sugs").css("display") == "none") return;
if ($("#sugs .active").length == 0) {
$("#sugs li:first-child").addClass("active");
} else {
$("#sugs .active").removeClass("active").next().addClass("active");
}
backupQuery();
}
var originalQuery = false;
function backupQuery()
{
if ($("#sugs .active").length > 0) {
if (!originalQuery) originalQuery = $("#i").val();
$("#i").val($("#sugs .active a").html());
} else {
$("#i").val(originalQuery);
originalQuery = false;
}
}
function closeSugBox(src)
{
if (src == false || src == undefined || (src.id != "i" && src.id != "sugs"))
$("#sugs").html("").css({"display": "none"});
}
function applySugResult()
{
if ($("#sugs .active").length > 0) {
$("#i").val($("#sugs .active a").html());
closeSugBox(false);
}
}