function SortNumeric(x, y) { return x - y } String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); } String.prototype.ltrim = function() { return this.replace(/^\s+/, ""); } String.prototype.rtrim = function() { return this.replace(/\s+$/, ""); } function Traverse(node, testament) { try { var treeText = ""; if (node != null) { if (node.hasChildNodes()) { if (node.nodeName == "s") { // you need to test if this is the OT or NT and set the attribute accordingly. var t = ""; if (testament == "old") { t = "H"; } if (testament == "new") { t = "G"; } treeText += "" + Traverse(node.childNodes.item(0), testament) + ""; } else { treeText += '<' + node.nodeName + '>'; for (var i = 0; i < node.childNodes.length; i++) { treeText += Traverse(node.childNodes.item(i), testament); } treeText += ''; } } else { if (node.nodeValue != null) { if (node.nodeValue.search(/^(\,|\.|\:|\?|\;|\!)/) != -1) { treeText += node.nodeValue; } else { treeText += " " + node.nodeValue; } } } } return treeText; } catch (err) { Util.HandleError(err); } } function Search(sv) { try { var qs = sv.split(";"); for (var x in qs) { var q = qs[x].trim(); if (q != "") { // its a search term. if (q.search(/[0-9]/i) == -1) { // get new results. Words.FindReferences(q); } // its a strongs lookup else if (q.search(/(H|G)[0-9]/i) != -1) { var dict = q.substring(0, 1); if (dict.search(/h/i) != -1) { dict = "heb"; } else { dict = "grk"; } q = q.substring(1, q.length); var results = Strongs.GetStrongs(q, dict); // display results. if ($("#display-strongs-as-dialog")[0].checked) { Strongs.DisplayStrongsDialog(results); } else { Strongs.DisplayStrongs(results); } } // its a verse reference. else { var passage = ""; if (q.trim() != "") { var myref = new Reference(q.trim()); var r = Bible.GetPassage(myref.book, myref.startchapter, myref.endchapter, myref.startverse, myref.endverse); Bible.DisplayPassage(r.cs, myref.book, myref.startchapter, myref.endchapter, myref.startverse, myref.endverse, r.testament); } } } } $( "#result" ).sortable({ axis: "x", handle: ".handle" }); } catch (err) { Util.HandleError(err); } return false; } var Settings = { Load: function() { var str = $.cookie('settings'); if (str != null) { var s = str.split(","); $("#resultwrap").css("float", s[0]); $("#searchresultswrap").css("float", s[0]); if (s[1] == "none") { $("#searchresultswrap").css("display", "none"); $("#showhidesearch").html("Show Search"); $("#resultwrap").css("width", "100%"); } else { $("#searchresultswrap").css("display", "block"); $("#showhidesearch").html("Hide Search"); $("#resultwrap").css("width", "70%"); } $("#result").css("font-size", s[2]); $("#result").css("font-family", s[3]); } }, Save: function() { var s = {}; s.Panes = $("#resultwrap").css("float"); s.Search = $("#searchresultswrap").css("display"); s.FontSize = $("#result").css("font-size"); s.Font = $("#result").css("font-family"); var str = s.Panes + "," + s.Search + "," + s.FontSize + "," + s.Font; $.cookie('settings', str, { expires: 365 }); }, ShowHideSearch: function() { var o = $("#showhidesearch"); var s = $("#searchresultswrap"); var r = $("#resultwrap"); if (s.css("display") != "none") { s.css("display", "none"); o.html("Show Search"); r.css("width", "100%"); } else { s.css("display", "block"); o.html("Hide Search"); r.css("width", "70%"); } this.Save(); }, SwitchPanes: function() { var s = $("#searchresultswrap"); var r = $("#resultwrap"); var v = s.css("float"); if (v == "right") { s.css("float", "left"); r.css("float", "left"); } else { s.css("float", "right"); r.css("float", "right"); } this.Save(); }, IncreaseResultFontSize: function() { var s = $("#result").css("font-size"); $("#result").css("font-size", parseInt(s) + 1); this.Save(); }, DecreaseResultFontSize: function() { var s = $("#result").css("font-size"); $("#result").css("font-size", parseInt(s) - 1); this.Save(); }, ChangeResultFont: function(fontfamily) { $("#result").css("font-family", fontfamily); this.Save(); } } var Util = { HandleLink: function(e) { Search($(e.target).text()); }, HandleHiddenLink: function(e) { Search($(e.target).find(".searchvalue").text()); }, RemoveResult: function(e) { $(e.target).parent().parent().remove(); }, HandleError: function(e) { // for now we're going to put the error in the main result div. var t = $("
" + e + "
"); return false; } } var Bible = { DisplayPassage: function(cs, b, sch, ech, sv, ev, testament) { try { var r = ""; // make the end verse pretty. var tvs = cs[cs.length - 1].vss.length; if (ev == "*" || ev > tvs) { ev = tvs; } for (var j = 0; j < cs.length; j++) { if (sch < ech) { r += "Chapter: " + cs[j].ch + "
"; } var vss = cs[j].vss; for (var m = 0; m < vss.length; m++) { var v = vss[m]; r += "" + v.v + ". "; for (var w = 0; w < v.w.length; w++) { if (v.w[w].s != undefined) { var strongs_pre = ""; if (testament == "old") { strongs_pre = "H"; } if (testament == "new") {strongs_pre = "G"; } var sp = ""; if (v.w[w].t.substr(v.w[w].t.length-1) == " ") { sp = " "; } r += "" + v.w[w].t.trim() + ""+sp; } else { r += v.w[w].t; } } r += "
"; } } var t = $("
" + "

" + bookName(b) + " " + sch + ":" + sv + "-" + ech + ":" + ev + "

" + r + "

"); t.find(".hiddenlink").click(function(e) { Util.HandleHiddenLink(e); }); t.find(".removeresult").click(function(e) { Util.RemoveResult(e); }); $("#result").prepend(t); } catch (err) { Util.HandleError(err); } }, GetPassage: function(b, sch, ech, sv, ev) { try { var chapters = []; // the verses from the chapter. var cs = []; // the verses requested. var r = {}; for (var i = sch; i <= ech; i++) { var url = "bibles/kjv_strongs/" + b + "-" + i + ".json" $.ajax({ async: false, type: "GET", url: url, dataType: "json", success: function(d, t, x) { chapters.push(d); }, error: function(request, status, error) { Util.HandleError(error, request); } }); } for (var j = 0; j < chapters.length; j++) { var vss = []; var start; var end; // figure out the start verse. if (j == 0) { start = sv; } else { start = 1; } // figure out the end verse if ((j + 1) == chapters.length) { end = ev; } else { end = "*"; } // get the verses requested. var tvs = chapters[j].vss.length; if (end == "*" || end > tvs) { end = tvs; } for (i = start; i <= end; i++) { // we're using c based indexes here, so the index is 1 less than the verse #. vss.push(chapters[j].vss[i-1]); } cs.push({ "ch": chapters[j].ch, "vss": vss }); } r.cs = cs; if (b >= 40) { r.testament = "new"; } else { r.testament = "old"; } return r; } catch (err) { Util.HandleError(err); } } } var Strongs = { GetStrongs: function(sn, dict) { try { var self = this; var results = {}; var url = dict + parseInt((sn - 1) / 100) + ".xml" if (dict == "grk") { results.prefix = "G"; } else { results.prefix = "H"; } results.sn = sn; $.ajax({ async: false, type: "GET", url: "xml/" + url, dataType: "xml", success: function(d, t, x) { results.strongs = d; }, error: function(request, status, error) { Util.HandleError(error, request); } }); $.ajax({ async: false, type: "GET", url: "xml/cr" + url, dataType: "xml", success: function(d, t, x) { results.crossrefs = d; }, error: function(request, status, error) { Util.HandleError(error, request); } }); if (dict == "grk") { url = "xml/rs" + parseInt((sn - 1) / 1000) + ".xml"; // rmac is a two get process. $.ajax({ async: false, type: "GET", url: url, dataType: "xml", success: function(d, t, x) { results.rmac = d; }, error: function(request, status, error) { Util.HandleError(error, request); } }); // deal with RMAC results.rmaccode = $(results.rmac).find('s[id="' + sn + '"]').attr("r"); url = "xml/r-" + results.rmaccode.substring(0, 1) + ".xml"; $.ajax({ async: false, type: "GET", url: url, dataType: "xml", success: function(d, t, x) { results.rmac = d; }, error: function(request, status, error) { Util.HandleError(error, request); } }); } return results; } catch (err) { Util.HandleError(err); } }, BuildStrongs: function(r) { try { // first deal with strongs data. var entry = $(r.strongs).find("i#" + r.prefix + r.sn); var title = $(entry).find("t").text(); var trans = $(entry).find("tr").text(); var pron = $(entry).find("p").text(); var desc = Traverse($(entry).find("d")[0]); var re = /([hg][0-9]{1,4})/gi; desc = desc.replace(re, "$1"); // now deal with cross references. var cr = $(r.crossrefs).find("i#" + r.prefix + r.sn).find("rs"); var crtxt = "
Cross References: Show
"; cr.each(function(i) { crtxt += "" + $(this).find("t").text() + ": "; $(this).find("r").each(function(j) { var ref = $(this).attr("r").split(";"); crtxt += "" + bookName(ref[0]) + " " + ref[1] + ":" + ref[2] + ", "; }); crtxt = crtxt.substr(0, crtxt.length - 2); crtxt += "
"; }); crtxt += "
"; // ...processing statements go here... var rtxt = ""; if (r.prefix == "G") { rtxt += "
Robinsons Morphological Analysis Code: " + r.rmaccode + " Show
"; ; $(r.rmac).find('i[id="' + r.rmaccode.toUpperCase() + '"]').find("d").each(function() { rtxt += $(this).text() + "
"; }); rtxt += "
"; } // put together the display. // ok. we have to do this because click events seem to be cumulative with jquery. var t = $("
" + trans + " (" + r.sn + ") - " + pron + " - " + title + " - " + desc + "
" + rtxt + crtxt + "

"); t.find(".link").click(function(e) { Util.HandleLink(e); }); t.find(".removeresult").click(function(e) { Util.RemoveResult(e); }); t.find(".showhide").click(function(e) { Strongs.ShowHide(e); }); return t; } catch (err) { Util.HandleError(err); } }, DisplayStrongs: function(r) { try { var t = Strongs.BuildStrongs(r); $("#result").prepend(t); return false; } catch (err) { Util.HandleError(err); } }, DisplayStrongsDialog: function(r) { try { var t = Strongs.BuildStrongs(r); var d = $("
").append(t); d.dialog({ draggable:true, width: 600, height: 500, resizable: true, title: "Strongs Definition", buttons: { "Close": function() { $( this ).dialog( "close" ); } } }); return false; } catch (err) { Util.HandleError(err); } }, ShowHide: function(e) { var o = $(e.target); var c = o.parent().find(".contents"); if (c.css("display") != "none") { c.css("display", "none"); o.html("Show"); } else { c.css("display", "inline"); o.html("Hide"); } } } var Words = { ConvertResultsToArray: function(r) { try { var results = new Array(); $(r).each(function() { results.push([$(this).attr("b"), $(this).attr("ch"), $(this).attr("v")]); }); return results; } catch (err) { Util.HandleError(err); } }, DisplayResults: function(results, q) { try { var txt = "

Query: " + q + "

"; var t = $(txt); t.find(".link").click(function(e) { Util.HandleLink(e); }); $("#searchresults").html(t); $("#searchTotal").html(results.length); return false; } catch (err) { Util.HandleError(err); } }, FindReferences: function(qry) { try { qry = qry.toLowerCase(); var qs = qry.split(" "); var words = this.BuildIndexArray().sort(); var results = new Array(); // Loop through each query term. for (i = 0; i < qs.length; i++) { var q = qs[i].replace("'", ""); // we don't included ticks in our words. // For each query term, figure out which xml file it is in, and get it. // getSearchRefs returns an array of references. for (var w = 0; w < words.length; w++) { // If we are at the end of the array, we want to use a different test. if (w == 0) { if (q <= words[w]) { results.unshift(this.GetSearchReferences("index/" + words[w] + "idx.json", q)); break; } } else { if (q <= words[w] && q > words[w - 1]) { results.unshift(this.GetSearchReferences("index/" + words[w] + "idx.json", q)); break; } } } } // End of loop through query terms // Now we need to test results. If there is more than one item in the array, we need to find the set // that is shared by all of them. IF not, we can just return those refs. if (results.length == 1) { this.DisplayResults(results[0], qry); } else { this.DisplayResults(this.FindSharedSet(results), qry); } return false; } catch (err) { Util.HandleError(err); } }, GetSearchReferences: function(url, query) { try { // getSearchRefs takes a url and uses ajax to retrieve the references and returns an array of references. var r; $.ajax({ async: false, type: "GET", url: url, dataType: "json", success: function(d, t, x) { r = d; }, error: function(request, status, error) { Util.HandleError(error, request); } }); // find the right word var refs = $.grep(r, function(o,i) { return o.word == query; }); return refs[0].refs; } catch (err) { Util.HandleError(err); } }, BuildIndexArray: function() { try { var words = new Array(); words.unshift('abiram'); words.unshift('accepteth'); words.unshift('acquit'); words.unshift('adna'); words.unshift('affecteth'); words.unshift('aharhel'); words.unshift('aijeleth'); words.unshift('almug'); words.unshift('amiable'); words.unshift('ancients'); words.unshift('anything'); words.unshift('appointeth'); words.unshift('areopagus'); words.unshift('art'); words.unshift('ashteroth'); words.unshift('astaroth'); words.unshift('availeth'); words.unshift('azotus'); words.unshift('badness'); words.unshift('baptizing'); words.unshift('bat'); words.unshift('bechorath'); words.unshift('beguile'); words.unshift('bemoaning'); words.unshift('beside'); words.unshift('bezek'); words.unshift('bitterly'); words.unshift('bloodthirsty'); words.unshift('bolted'); words.unshift('bountifulness'); words.unshift('breastplates'); words.unshift('broth'); words.unshift('bunni'); words.unshift('cain'); words.unshift('cankered'); words.unshift('carry'); words.unshift('celebrate'); words.unshift('chapel'); words.unshift('cheese'); words.unshift('chilmad'); words.unshift('circumcision'); words.unshift('closer'); words.unshift('come'); words.unshift('communication'); words.unshift('concerning'); words.unshift('confusion'); words.unshift('consummation'); words.unshift('convince'); words.unshift('couch'); words.unshift('covers'); words.unshift('crisping'); words.unshift('curse'); words.unshift('damnable'); words.unshift('deacons'); words.unshift('decision'); words.unshift('defileth'); words.unshift('depart'); words.unshift('despisest'); words.unshift('diblathaim'); words.unshift('directly'); words.unshift('dishonesty'); words.unshift('distracted'); words.unshift('dominion'); words.unshift('dreamer'); words.unshift('dulcimer'); words.unshift('eastward'); words.unshift('eighteenth'); words.unshift('elihoreph'); words.unshift('embrace'); words.unshift('endeavored'); words.unshift('ensign'); words.unshift('ephraim'); words.unshift('eshtemoa'); words.unshift('evening'); words.unshift('excellest'); words.unshift('extended'); words.unshift('fairer'); words.unshift('fastings'); words.unshift('feign'); words.unshift('fight'); words.unshift('fishermen'); words.unshift('flint'); words.unshift('foolishness'); words.unshift('forever'); words.unshift('forts'); words.unshift('fresh'); words.unshift('furnish'); words.unshift('gallio'); words.unshift('gebal'); words.unshift('gezrites'); words.unshift('girt'); words.unshift('goath'); words.unshift('government'); words.unshift('greeteth'); words.unshift('guiltless'); words.unshift('haggai'); words.unshift('hamstrung'); words.unshift('happy'); words.unshift('harum'); words.unshift('hattush'); words.unshift('heard'); words.unshift('heir'); words.unshift('herbs'); words.unshift('hezronites'); words.unshift('hivite'); words.unshift('honored'); words.unshift('hostages'); words.unshift('huntest'); words.unshift('idalah'); words.unshift('impenitent'); words.unshift('inferior'); words.unshift('insomuch'); words.unshift('ira'); words.unshift('isuah'); words.unshift('jabneh'); words.unshift('japhia'); words.unshift('jeduthun'); words.unshift('jerahmeelites'); words.unshift('jew'); words.unshift('joined'); words.unshift('joy'); words.unshift('kadmonites'); words.unshift('kid'); words.unshift('kneaded'); words.unshift('lack'); words.unshift('languish'); words.unshift('lazarus'); words.unshift('legions'); words.unshift('libnath'); words.unshift('likhi'); words.unshift('lock'); words.unshift('louder'); words.unshift('lysias'); words.unshift('magpiash'); words.unshift('malchus'); words.unshift('marble'); words.unshift('mastery'); words.unshift('meddle'); words.unshift('members'); words.unshift('mesech'); words.unshift('midian'); words.unshift('ministered'); words.unshift('mithnite'); words.unshift('morasthite'); words.unshift('mower'); words.unshift('myrtle'); words.unshift('naphish'); words.unshift('necks'); words.unshift('net'); words.unshift('noadiah'); words.unshift('nursed'); words.unshift('occurrent'); words.unshift('omnipotent'); words.unshift('orchard'); words.unshift('outside'); words.unshift('owed'); words.unshift('palti'); words.unshift('partition'); words.unshift('paulus'); words.unshift('peoples'); words.unshift('persecute'); words.unshift('phares'); words.unshift('pilate'); words.unshift('plagues'); words.unshift('plentiful'); words.unshift('poorer'); words.unshift('powerful'); words.unshift('presented'); words.unshift('prison'); words.unshift('promoted'); words.unshift('provision'); words.unshift('purely'); words.unshift('quarter'); words.unshift('rahab'); words.unshift('ravening'); words.unshift('rebuking'); words.unshift('refined'); words.unshift('release'); words.unshift('rent'); words.unshift('requirest'); words.unshift('return'); words.unshift('rezon'); words.unshift('riseth'); words.unshift('roof'); words.unshift('rump'); words.unshift('sail'); words.unshift('sanctuaries'); words.unshift('savors'); words.unshift('scorpions'); words.unshift('second'); words.unshift('sellers'); words.unshift('served'); words.unshift('shaft'); words.unshift('sharaim'); words.unshift('shedder'); words.unshift('shepho'); words.unshift('shimshai'); words.unshift('shophan'); words.unshift('shuppim'); words.unshift('sihor'); words.unshift('sippai'); words.unshift('slandereth'); words.unshift('smelling'); words.unshift('softer'); words.unshift('sores'); words.unshift('sparrows'); words.unshift('spoil'); words.unshift('staff'); words.unshift('steel'); words.unshift('stool'); words.unshift('stretched'); words.unshift('stumblingblocks'); words.unshift('suffice'); words.unshift('surnamed'); words.unshift('swore'); words.unshift('take'); words.unshift('task'); words.unshift('temani'); words.unshift('testator'); words.unshift('thessalonica'); words.unshift('threatening'); words.unshift('tie'); words.unshift('titus'); words.unshift('torments'); words.unshift('translation'); words.unshift('tributaries'); words.unshift('tubal'); words.unshift('unchangeable'); words.unshift('unlawful'); words.unshift('upbraideth'); words.unshift('uzza'); words.unshift('verily'); words.unshift('visage'); words.unshift('walk'); words.unshift('washing'); words.unshift('wayside'); words.unshift('wellspring'); words.unshift('whisperer'); words.unshift('win'); words.unshift('withereth'); words.unshift('work'); words.unshift('wrest'); words.unshift('yours'); words.unshift('zealously'); words.unshift('zetham'); words.unshift('zophim'); words.unshift('zuzims'); return words; } catch (err) { Util.HandleError(err); } }, FindSharedSet: function(results) { try { // FindSharedSet takes an array of reference arrays, and figures out which references are shared // by all arrays/sets, then returns a single array of references. for (var j in results) { var refs = results[j]; for (var i = 0; i < refs.length; i++) { var r = refs[i].split(":"); // convert references to single integers. // Book * 100000, Chapter * 1000, Verse remains same, add all together. var ref = parseInt(r[0]) * 100000000; ref = ref + parseInt(r[1]) * 10000; ref = ref + parseInt(r[2]); results[j][i] = ref; } } // get the first result var result = results[0]; // for each additional result, get the shared set for (i = 1; i < results.length; i++) { result = this.ReturnSharedSet(results[i], result); } // convert the references back into book, chapter and verse. for (i = 0; i < result.length; i++) { ref = result[i]; result[i] = parseInt(ref / 100000000)+":"+parseInt((ref % 100000000) / 10000)+":"+((ref % 100000000) % 10000); } return result; } catch (err) { Util.HandleError(err); } }, ReturnSharedSet: function(x, y) { try { /// /// Takes two javascript arrays and returns an array /// containing a set of values shared by arrays. /// // declare iterator var i = 0; // declare terminator var t = (x.length < y.length) ? x.length : y.length // sort the arrays x.sort(SortNumeric); y.sort(SortNumeric); // in this loop, we remove from the arrays, the // values that aren't shared between them. while (i < t) { if (x[i] == y[i]) { i++; } if (x[i] < y[i]) { x.splice(i, 1); } if (x[i] > y[i]) { y.splice(i, 1); } t = (x.length < y.length) ? x.length : y.length; // we have to make sure to remove any extra values // at the end of an array when we reach the end of // the other. if (t == i && t < x.length) { x.splice(i, x.length - i); } if (t == i && t < y.length) { y.splice(i, x.length - i); } } // we could return y, because at this time, both arrays // are identical. return x; } catch (err) { Util.HandleError(err); } } }