var Logos = Logos || {};
Logos.ReferenceTagging = Logos.ReferenceTagging || {
	lbsBibleVersion: 'ESV',
	lbsLibronixBibleVersion: '',
	lbsAddLibronixDLSLink: false,
	lbsAppendIconToLibLinks: false,
	lbsLibronixLinkIcon: 'dark',
	lbsUseTooltip: true,
	lbsLinksOpenNewWindow: false,
	lbsNoSearchTagNames: ['h1', 'h2', 'h3'],
	lbsNoSearchClassNames: [],
	lbsRootNode: null,
	lbsCssOverride: false,
	lbsCaseInsensitive: false,
	lbsConvertHyperlinks: false,
	lbsHyperlinkTestList: [],
	lbsMaxTreeDepth: 200,
	lbsInsertRefNode: function (ref, displayText, version, sibling) {
		var normRef = Logos.ReferenceTagging.lbsNormalizeReference(ref);
		var bibleVersion = version ? version: Logos.ReferenceTagging.lbsBibleVersion;
		var newRefNode = Logos.ReferenceTagging.lbsAddLinkAttributes(document.createElement('a'), normRef, bibleVersion);
		newRefNode.innerHTML = displayText;
		sibling.parentNode.insertBefore(newRefNode, sibling);
		if (Logos.ReferenceTagging.lbsAddLibronixDLSLink) Logos.ReferenceTagging.lbsInsertLibLink(sibling, normRef.replace(/(\d)\s*(?:[a-z]|ff)(\W|$)|/g, '$1$2').replace(/\s+/g, '').replace(/[‒–—―]+/g, '-'), bibleVersion);
		Logos.ReferenceTagging.lbsRefCount++
	},
	lbsNormalizeReference: function (strReference) {
		var normRef = strReference.replace(/\s+/, ' ');
		normRef = normRef.replace(/:/g, '.');
		return normRef
	},
	lbsAddLinkAttributes: function (elLink, strNormRef, strBibleVersion) {
		var strSurfaceText = elLink.innerHTML;
		elLink.href = Logos.ReferenceTagging.lbsGenerateLink(strNormRef, strBibleVersion);
		elLink.innerHTML = strSurfaceText;
		elLink.lbsReference = strNormRef + '|' + strBibleVersion;
		elLink.className = (elLink.className && elLink.className.length > 0) ? elLink.className + ' lbsBibleRef': 'lbsBibleRef';
		if (Logos.ReferenceTagging.lbsLinksOpenNewWindow) elLink.target = '_blank';
		if (Logos.ReferenceTagging.lbsUseTooltip) {
			if (elLink.addEventListener) {
				elLink.addEventListener('mouseover', Logos.ReferenceTagging.lbsTooltipMouseOver, false);
				elLink.addEventListener('mouseout', Logos.ReferenceTagging.lbsTooltipMouseOut, false)
			} else if (elLink.attachEvent) {
				elLink.attachEvent('onmouseover', Logos.ReferenceTagging.lbsTooltipMouseOver);
				elLink.attachEvent('onmouseout', Logos.ReferenceTagging.lbsTooltipMouseOut)
			}
		}
		return elLink
	},
	lbsGenerateLink: function (reference, version) {
		var webUrlParts = ['http://bible.logos.com/passage/', Logos.ReferenceTagging.lbsGetVersion(version), '/', reference.replace(/:/g, '.')];
		return encodeURI(webUrlParts.join('').replace(/\s+/, ' '))
	},
	lbsInsertLibLink: function (currentNode, normRef, bibleVersion) {
		var newImgNode = document.createElement('img');
		if (Logos.ReferenceTagging.lbsLibronixLinkIcon.toLowerCase() === 'light') newImgNode.src = document.location.protocol + '//www.logos.com/images/Corporate/LibronixLink_light.png';
		else newImgNode.src = document.location.protocol + '//www.logos.com/images/Corporate/LibronixLink_dark.png';
		newImgNode.border = 0;
		newImgNode.title = 'Open in Libronix (if available)';
		newImgNode.style.marginLeft = '4px';
		newImgNode.style.marginBottom = '0px';
		newImgNode.style.marginRight = '0px';
		newImgNode.style.border = 0;
		newImgNode.style.padding = 0;
		newImgNode.style.float = 'none';
		newImgNode.align = 'bottom';
		if (normRef) {
			var newLinkNode = document.createElement('a');
			newLinkNode.href = ['libronixdls:keylink|ref=[en]bible:', normRef].join('');
			if (Logos.ReferenceTagging.lbsLibronixBibleVersion.length && Logos.ReferenceTagging.lbsLibronixBibleVersion.toUpperCase() !== 'DEFAULT') newLinkNode.href += '|res=LLS:' + Logos.ReferenceTagging.lbsLibronixBibleVersion.toUpperCase();
			newLinkNode.className = 'lbsLibronix';
			newLinkNode.appendChild(newImgNode);
			currentNode.parentNode.insertBefore(newLinkNode, currentNode)
		} else {
			currentNode.appendChild(newImgNode)
		}
	},
	lbsInsertTextNode: function (text, sibling) {
		var newTxtNode = document.createTextNode(text);
		sibling.parentNode.insertBefore(newTxtNode, sibling)
	},
	lbsRefSearch: function (textToSearch, currentNode, lastBookName, lastChapter, lastVersion, elParentAnchor) {
		var numNewNodes = 0;
		var bookName = lastBookName;
		var chapNum = lastChapter;
		var refMatch;
		var remaining;
		var reference;
		var textLeft;
		var version = Logos.ReferenceTagging.lbsBibleVersion;
		var versionSurfaceText = null;
		if (lastBookName) {
			refMatch = Logos.ReferenceTagging.lbsBookContRegExp.exec(textToSearch);
			if (refMatch) {
				reference = [bookName, ' ', refMatch[2]].join('');
				chapNum = refMatch[3];
				textLeft = refMatch[1]
			}
		}
		if (lastChapter && !refMatch) {
			refMatch = Logos.ReferenceTagging.lbsChapContRegExp.exec(textToSearch);
			if (refMatch) {
				reference = [bookName, ' ', chapNum, ':', refMatch[2]].join('');
				textLeft = refMatch[1]
			}
		}
		if (!refMatch && Logos.ReferenceTagging.lbsRefQuickTest.test(textToSearch)) {
			refMatch = Logos.ReferenceTagging.lbsRefRegExp.exec(textToSearch);
			if (refMatch) {
				var left = RegExp.leftContext;
				remaining = RegExp.rightContext;
				reference = refMatch[2];
				textLeft = left + refMatch[1];
				bookName = refMatch[3];
				chapNum = refMatch[4];
				if (refMatch[9]) {
					versionSurfaceText = refMatch[9];
					version = versionSurfaceText.replace(/\W/g, '')
				}
				if (refMatch[8]) {
					bookName = refMatch[8];
					chapNum = 1
				}
			}
		}
		if (refMatch) {
			if (elParentAnchor) {
				var normRef = Logos.ReferenceTagging.lbsNormalizeReference(reference);
				var bibleVersion = version ? version: Logos.ReferenceTagging.lbsBibleVersion;
				Logos.ReferenceTagging.lbsAddLinkAttributes(elParentAnchor, normRef, bibleVersion)
			} else {
				if (!remaining) remaining = RegExp.rightContext;
				Logos.ReferenceTagging.lbsInsertTextNode(textLeft, currentNode);
				Logos.ReferenceTagging.lbsInsertRefNode(reference, versionSurfaceText == null ? refMatch[2] : refMatch[2] + versionSurfaceText, version, currentNode);
				numNewNodes = Logos.ReferenceTagging.lbsRefSearch(remaining, currentNode, bookName, chapNum, version == Logos.ReferenceTagging.lbsBibleVersion ? null: version);
				numNewNodes += (Logos.ReferenceTagging.lbsAddLibronixDLSLink ? 3 : 2)
			}
		} else if (textToSearch !== currentNode.nodeValue) {
			if (textToSearch != null && textToSearch != '' && lastVersion != textToSearch) Logos.ReferenceTagging.lbsInsertTextNode(textToSearch, currentNode);
			currentNode.parentNode.removeChild(currentNode)
		}
		return numNewNodes
	},
	lbsTraverseDom: function (currentNode, elParentAnchor, nDepth) {
		var nCurrentDepth = nDepth || 0;
		if (nCurrentDepth > Logos.ReferenceTagging.lbsMaxTreeDepth) return 0;
		var numNewNodes = 0;
		var foundBibleref = false;
		var currentTagName = (currentNode.tagName || '').toLowerCase();
		var aStrNodeClasses = currentNode.className ? currentNode.className.split(' ') : [];
		var bRestrictedClass = false;
		for (var i = 0; i < Logos.ReferenceTagging.lbsNoSearchClassNames.length; i++) {
			for (var j = 0; j < aStrNodeClasses.length; j++) {
				if (Logos.ReferenceTagging.lbsNoSearchClassNames[i].toLowerCase() == aStrNodeClasses[j].toLowerCase()) {
					bRestrictedClass = true;
					break
				}
			}
			if (bRestrictedClass) break
		}
		if (currentNode.nodeType === 3) {
			var nodeTxt = currentNode.nodeValue;
			numNewNodes = Logos.ReferenceTagging.lbsRefSearch(nodeTxt, currentNode, null, null, null, elParentAnchor)
		} else if (currentTagName.length > 0 && (!Logos.ReferenceTagging.lbsNoSearchTags[currentTagName] || currentTagName === 'a') && !bRestrictedClass) {
			var elParentAnchor = null;
			if (currentTagName === 'a') {
				var libronixLinkTest = /^libronixdls:/i;
				if (libronixLinkTest.test(currentNode.href)) {
					if (Logos.ReferenceTagging.lbsAppendIconToLibLinks && !(currentNode.lastChild && currentNode.lastChild.tagName && currentNode.lastChild.tagName.toLowerCase() === 'img')) Logos.ReferenceTagging.lbsInsertLibLink(currentNode, null)
				} else if (/bibleref/.test(currentNode.className.toLowerCase())) {
					foundBibleref = Logos.ReferenceTagging.lbsTagBibleref(currentNode, function (elNode, reference, version) {
						var normRef = Logos.ReferenceTagging.lbsNormalizeReference(reference);
						var bibleVersion = version ? version: Logos.ReferenceTagging.lbsBibleVersion;
						Logos.ReferenceTagging.lbsAddLinkAttributes(elNode, normRef, bibleVersion)
					})
				} else if (Logos.ReferenceTagging.lbsConvertHyperlinks === true && currentNode.childNodes.length === 1 && currentNode.firstChild.nodeType === 3) {
					var bConvertHyperlink = Logos.ReferenceTagging.lbsHyperlinkTestList.length === 0;
					for (var strTest in Logos.ReferenceTagging.lbsHyperlinkTestList) {
						if (currentNode.href.toLowerCase().indexOf(strTest.toLowerCase()) >= 0) {
							bConvertHyperlink = true;
							break
						}
					}
					if (bConvertHyperlink) elParentAnchor = currentNode
				}
				if (elParentAnchor === null) return numNewNodes
			}
			if (currentTagName === 'cite' && /bibleref/.test(currentNode.className.toLowerCase())) {
				foundBibleref = Logos.ReferenceTagging.lbsTagBibleref(currentNode, function (elNode, reference, version) {
					Logos.ReferenceTagging.lbsInsertRefNode(reference, elNode.innerHTML, version, elNode.firstChild);
					elNode.removeChild(elNode.lastChild)
				})
			}
			if (!foundBibleref) {
				var children = currentNode.childNodes;
				var i = 0;
				while (i < children.length) {
					var ret = Logos.ReferenceTagging.lbsTraverseDom(children[i], elParentAnchor, nCurrentDepth + 1);
					i += ret + 1
				}
			}
		}
		return numNewNodes
	},
	lbsTagBibleref: function (currentNode, fnProcessReference) {
		var ret = false;
		Logos.ReferenceTagging.MarkedBiblerefCount++;
		if (currentNode.title && currentNode.childNodes.length <= 1) {
			var version;
			var versionSearch = /^([A-Z]{2,5})[\s:]/.exec(currentNode.title);
			var reference = RegExp.rightContext;
			if (versionSearch) version = versionSearch[1];
			else reference = currentNode.title;
			fnProcessReference(currentNode, reference, version);
			ret = true
		}
		return ret
	},
	lbsGetVersion: function (version) {
		return Logos.ReferenceTagging.lbsVersionAbbreviations[version.toLowerCase()] ? Logos.ReferenceTagging.lbsVersionAbbreviations[version.toLowerCase()] : version.toLowerCase()
	},
	lbsTooltipMouseOver: function (e) {
		var elemRef;
		if (!e) var e = window.event;
		elemRef = e.target || e.srcElement;
		while (elemRef.tagName.toLowerCase() != 'a') elemRef = elemRef.parentNode;
		if (Logos.ReferenceTagging.lbsTooltipToHide) {
			clearTimeout(Logos.ReferenceTagging.lbsTmrHideTooltip);
			if (elemRef !== Logos.ReferenceTagging.lbsTooltipToHide) Logos.ReferenceTagging.lbsHideTooltip(Logos.ReferenceTagging.lbsTooltipToHide)
		}
		var divTooltip = document.getElementById(elemRef.lbsReference);
		Logos.ReferenceTagging.lbsTooltipToDisplay = elemRef;
		if (divTooltip) {
			var anWinSize = Logos.ReferenceTagging.lbsGetWindowInfo();
			var anElemLoc = Logos.ReferenceTagging.lbsGetElementLocation(elemRef);
			var anTooltipLoc = Logos.ReferenceTagging.lbsGetTooltipLocation(divTooltip, anWinSize, anElemLoc);
			divTooltip.style.left = anTooltipLoc.x + 'px';
			divTooltip.style.top = anTooltipLoc.y + 'px';
			Logos.ReferenceTagging.lbsTmrShowTooltip = setTimeout(function () {
				Logos.ReferenceTagging.lbsShowTooltip(divTooltip)
			},
			Logos.ReferenceTagging.constShowTooltip)
		} else {
			Logos.ReferenceTagging.lbsTmrShowTooltip = setTimeout(function () {
				var toolTip = Logos.ReferenceTagging.lbsCreateTooltip(elemRef);
				Logos.ReferenceTagging.lbsShowTooltip(toolTip)
			},
			Logos.ReferenceTagging.constShowTooltip)
		}
	},
	lbsTooltipMouseOut: function (e) {
		var elemRef;
		if (!e) var e = window.event;
		elemRef = e.target || e.srcElement;
		while (elemRef.tagName.toLowerCase() != 'a') elemRef = elemRef.parentNode;
		clearTimeout(Logos.ReferenceTagging.lbsTmrShowTooltip);
		divTooltip = document.getElementById(elemRef.lbsReference);
		if (divTooltip) {
			Logos.ReferenceTagging.lbsTooltipToHide = divTooltip;
			Logos.ReferenceTagging.lbsTmrHideTooltip = setTimeout(function () {
				Logos.ReferenceTagging.lbsHideTooltip(Logos.ReferenceTagging.lbsTooltipToHide)
			},
			Logos.ReferenceTagging.constHideTooltip)
		}
	},
	lbsCreateTooltip: function (elemRef) {
		var nTooltipWidth = 350;
		var nTooltipHeight = 150;
		var anElemLoc = Logos.ReferenceTagging.lbsGetElementLocation(elemRef);
		var divTooltip = document.createElement('div');
		divTooltip.style.position = 'absolute';
		divTooltip.style.width = nTooltipWidth + 'px';
		divTooltip.style.height = nTooltipHeight + 'px';
		divTooltip.style.zIndex = '9999999';
		divTooltip.className = 'lbsTooltip';
		divTooltip.id = elemRef.lbsReference;
		var windowInfo = Logos.ReferenceTagging.lbsGetWindowInfo();
		var anTooltipLoc = Logos.ReferenceTagging.lbsGetTooltipLocation(divTooltip, windowInfo, anElemLoc);
		divTooltip.style.top = anTooltipLoc.y + 'px';
		divTooltip.style.left = anTooltipLoc.x + 'px';
		divTooltip.onmouseover = Logos.ReferenceTagging.lbsMouseInTooltip;
		divTooltip.onmouseout = Logos.ReferenceTagging.lbsMouseLeavesTooltip;
		return divTooltip
	},
	lbsGetTooltipLocation: function (divTooltip, anWinInfo, anElemLoc) {
		var nMoveX = 15;
		var nMoveY = 25;
		var nEdgePadding = 10;
		var nTooltipWidth = parseInt(divTooltip.style.width);
		var nTooltipHeight = parseInt(divTooltip.style.height);
		var anPos = [];
		anPos.x = anElemLoc.x + nMoveX;
		anPos.y = anElemLoc.y - nTooltipHeight;
		if (nTooltipWidth > anWinInfo.width || nTooltipHeight > anWinInfo.height) return anPos;
		anPos.x += nTooltipWidth;
		if (anPos.x > anWinInfo.width + anWinInfo.offX - nEdgePadding) anPos.x = anWinInfo.width + anWinInfo.offX - nMoveX - nEdgePadding;
		if (anPos.x < 0) anPos.x = 0;
		if (anPos.y < anWinInfo.offY) {
			if (anElemLoc.y + nTooltipHeight + nMoveY > anWinInfo.height + anWinInfo.offY) anPos.y = anWinInfo.offY;
			else anPos.y = anElemLoc.y + nMoveY;
		}
		anPos.x -= (nTooltipWidth + 3);
		return anPos
	},
	lbsGetElementLocation: function (elemRef) {
		var anPos = {
			'x': 0,
			'y': 0
		};
		var anOff;
		var elem = elemRef;
		var anElemOff = {
			'offX': 0,
			'offY': 0
		};
		if (typeof(elemRef.offsetLeft) === 'number') {
			while (elemRef) {
				anPos.x += elemRef.offsetLeft;
				anPos.y += elemRef.offsetTop;
				elemRef = elemRef.offsetParent
			}
			while (elem && elem !== document.body && elem !== document.documentElement) {
				anElemOff.offY += elem.scrollTop || 0;
				anElemOff.offX += elem.scrollLeft || 0;
				elem = elem.parentNode
			}
			anPos.x -= anElemOff.offX;
			anPos.y -= anElemOff.offY
		} else if (elemRef.x) {
			anPos.x = elemRef.x;
			anPos.y = elemRef.y
		}
		return anPos
	},
	lbsGetWindowInfo: function () {
		var anWinInfo = {};
		if (typeof(window.innerHeight) === 'number') {
			anWinInfo.width = window.innerWidth;
			anWinInfo.height = window.innerHeight
		} else if (document.documentElement && (document.documentElement.clientHeight || document.documentElement.clientWidth)) {
			anWinInfo.width = document.documentElement.clientWidth;
			anWinInfo.height = document.documentElement.clientHeight
		} else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
			anWinInfo.width = document.body.clientWidth;
			anWinInfo.height = document.body.clientHeight
		}
		var anOffset = Logos.ReferenceTagging.lbsGetOffsets();
		if (anOffset) {
			anWinInfo.offX = anOffset.offX;
			anWinInfo.offY = anOffset.offY
		}
		return anWinInfo
	},
	lbsGetOffsets: function (elemRef) {
		var anOffset = [];
		if (!elemRef) {
			anOffset.offX = window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft;
			anOffset.offY = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop
		} else {
			if (typeof(elemRef.scrollLeft) === 'number' && (elemRef.scrollLeft || elemRef.scrollTop)) {
				anOffset.offX = elemRef.scrollLeft;
				anOffset.offY = elemRef.scrollTop
			} else {
				anOffset = null
			}
		}
		return anOffset
	},
	lbsHideTooltip: function (divTooltip) {
		if (divTooltip && divTooltip.style) divTooltip.style.visibility = 'hidden';
		Logos.ReferenceTagging.lbsTooltipToHide = null
	},
	lbsShowTooltip: function (divTooltip) {
		if (document.getElementById(divTooltip.id)) {
			divTooltip.style.visibility = 'visible'
		} else {
			if (document.body.appendChild) document.body.appendChild(divTooltip);
			else if (document.body.innerHTML) document.body.innerHTML += divTooltip.innerHTML;
			Logos.ReferenceTagging.lbsMakeRequest(divTooltip)
		}
		divTooltip = null
	},
	lbsMouseInTooltip: function () {
		clearTimeout(Logos.ReferenceTagging.lbsTmrHideTooltip)
	},
	lbsMouseLeavesTooltip: function (e) {
		Logos.ReferenceTagging.lbsTmrHideTooltip = setTimeout(function () {
			Logos.ReferenceTagging.lbsHideTooltip(Logos.ReferenceTagging.lbsTooltipToHide)
		},
		Logos.ReferenceTagging.constHideTooltip)
	},
	dstRequests: {},
	requestTooltips: {},
	lbsMakeRequest: function (tooltip) {
		var bgColor = tooltip.currentStyle ? tooltip.currentStyle['backgroundColor'] : 'inherit';
		tooltip.innerHTML = Logos.ReferenceTagging.constructTooltipContent(bgColor, 'Loading...', '', '');
		var reference = tooltip.id.split('|');
		var requestUrl = document.location.protocol + '//bible.logos.com/passage/' + (reference[1] ? Logos.ReferenceTagging.lbsGetVersion(reference[1]) : Logos.ReferenceTagging.lbsGetVersion(Logos.ReferenceTagging.lbsBibleVersion)) + '/' + encodeURIComponent(reference[0]) + '?target=reftagger&callback=Logos.ReferenceTagging.dstCallback&userData=' + encodeURIComponent(tooltip.id);
		var dst = document.createElement('script');
		dst.setAttribute('type', 'text/javascript');
		dst.setAttribute('charset', 'utf-8');
		dst.setAttribute('src', requestUrl);
		Logos.ReferenceTagging.dstRequests[tooltip.id] = dst;
		Logos.ReferenceTagging.requestTooltips[tooltip.id] = tooltip;
		document.getElementsByTagName('head').item(0).appendChild(dst);
		setTimeout(function () {
			if (Logos.ReferenceTagging.requestTooltips[tooltip.id] && Logos.ReferenceTagging.dstRequests[tooltip.id]) {
				Logos.ReferenceTagging.requestTooltips[tooltip.id].innerHTML = Logos.ReferenceTagging.constructTooltipContent(bgColor, 'Sorry', '<p>This reference could not be loaded at this time.</p>', '');
				Logos.ReferenceTagging.dstRequests[tooltip.id] = null;
				Logos.ReferenceTagging.requestTooltips[tooltip.id] = null
			}
		},
		5000)
	},
	dstCallback: function (data) {
		if (! (Logos.ReferenceTagging.requestTooltips[data.UserData] && Logos.ReferenceTagging.dstRequests[data.UserData])) return;
		verseBody = data.Body.replace('<span class="verse-ref" />', '');
		var bgColor = Logos.ReferenceTagging.requestTooltips[data.UserData].currentStyle ? Logos.ReferenceTagging.requestTooltips[data.UserData].currentStyle['backgroundColor'] : 'inherit';
		var content = Logos.ReferenceTagging.constructTooltipContent(bgColor, data.Header + ' (' + data.Version + ')', verseBody, '<div style="float: left; margin-left: 8px;"><a href="' + Logos.ReferenceTagging.lbsGenerateLink(data.Header, data.Version) + '" target="_blank">More &raquo;</a></div>');
		Logos.ReferenceTagging.requestTooltips[data.UserData].innerHTML = content.replace(/\<span\s*class="verse-ref"\s*\/>/gi, '');
		document.getElementsByTagName('head').item(0).removeChild(Logos.ReferenceTagging.dstRequests[data.UserData]);
		Logos.ReferenceTagging.dstRequests[data.UserData] = null;
		Logos.ReferenceTagging.requestTooltips[data.UserData] = null
	},
	constructTooltipContent: function (bgColor, header, body, footer) {
		return '<div style="position: absolute; background: transparent url(' + document.location.protocol + '//bible.logos.com/content/images/refTaggerDropShadow.png) no-repeat; width: 364px; height: 164px; left: -7px; top: -7px; z-index: -1"></div><div class="lbsContainer" style="height:150px; background-color:' + bgColor + ';"><div class="lbsTooltipHeader">' + header + '</div><div class="lbsTooltipBody" style="width:335px;">' + body + '</div><div class="lbsTooltipFooter" style="width:345px;">' + footer + '<div><a href="http://www.logos.com/reftagger" target="_blank">Powered by RefTagger</a></div></div></div>'
	},
	appendCssRules: function () {
		if (document.getElementById('lbsToolTipStyle') == null) {
			var cssNode = document.createElement('link');
			cssNode.type = 'text/css';
			cssNode.rel = 'stylesheet';
			cssNode.href = document.location.protocol + '//bible.logos.com/Content/ReferenceTagging.css';
			cssNode.media = 'screen';
			cssNode.id = 'lbsToolTipStyle';
			document.getElementsByTagName('head')[0].insertBefore(cssNode, document.getElementsByTagName('head')[0].firstChild)
		}
	},
	lbsSavePrefs: function () {
		var container = document.getElementById('lbsRefTaggerCP');
		if (container == null) return;
		var version = document.getElementById('lbsVersion').value;
		var libronix = document.getElementById('lbsUseLibronixLinks').checked == true ? 'true': 'false';
		var expireDate = new Date();
		expireDate.setFullYear(expireDate.getFullYear() + 10);
		document.cookie = 'lbsRefTaggerPrefs=' + version + '.' + libronix + ';expires=' + expireDate.toGMTString() + ';path=/';
		window.location.reload()
	},
	lbsLoadPrefs: function () {
		var cookie = /lbsRefTaggerPrefs=(?:((?:\w|\d){2,5})\.(true|false))/.exec(document.cookie);
		if (cookie) {
			Logos.ReferenceTagging.lbsBibleVersion = cookie[1];
			Logos.ReferenceTagging.lbsAddLibronixDLSLink = cookie[2] == 'true' ? true: false
		}
		var container = document.getElementById('lbsRefTaggerCP');
		if (container !== null) {
			var selectBox = document.getElementById('lbsVersion');
			for (var i = 0; i < selectBox.length; i++) {
				if (selectBox.options[i].outerText == Logos.ReferenceTagging.lbsBibleVersion.toUpperCase()) {
					selectBox.selectedIndex = i;
					break
				}
			}
			if (Logos.ReferenceTagging.lbsAddLibronixDLSLink) document.getElementById('lbsUseLibronixLinks').checked = 'true'
		}
	},
	log: function (source) {
		var image = new Image();
		image.src = [document.location.protocol, '//bible.logos.com/util/ReferenceData.aspx?', 'location=', encodeURIComponent(document.location), '&refCount=', Logos.ReferenceTagging.lbsRefCount, '&microrefCount=', Logos.ReferenceTagging.MarkedBiblerefCount, '&bibleVersion=', Logos.ReferenceTagging.lbsBibleVersion, '&libronix=', Logos.ReferenceTagging.lbsAddLibronixDLSLink, '&tooltip=', Logos.ReferenceTagging.lbsUseTooltip, '&source=', (source || ''), '&rand=', Math.random().toString().substring(10)].join('');
	},
	Init: function () {
		if (Logos.ReferenceTagging.Initialized) return;
		if (!Logos.ReferenceTagging.lbsCssOverride) Logos.ReferenceTagging.appendCssRules();
		Logos.ReferenceTagging.lbsLoadPrefs();
		Logos.ReferenceTagging.lbsNoSearchTags = {
			'applet': true,
			'hr': true,
			'head': true,
			'img': true,
			'input': true,
			'meta': true,
			'script': true,
			'select': true
		};
		for (var i in Logos.ReferenceTagging.lbsNoSearchTagNames) {
			var tagName = Logos.ReferenceTagging.lbsNoSearchTagNames[i];
			Logos.ReferenceTagging.lbsNoSearchTags[tagName] = true
		}
		lbsNoSearchLength = Logos.ReferenceTagging.lbsNoSearchClassNames.length;
		Logos.ReferenceTagging.lbsNoSearchClasses = new Object();
		for (var i in Logos.ReferenceTagging.lbsNoSearchClassNames) {
			var className = Logos.ReferenceTagging.lbsNoSearchClassNames[i];
			Logos.ReferenceTagging.lbsNoSearchClasses[className] = true
		}
		Logos.ReferenceTagging.lbsVersionAbbreviations = {
			'dar': 'darby'
		};
		Logos.ReferenceTagging.lbsRefCount = 0;
		Logos.ReferenceTagging.MarkedBiblerefCount = 0;
		Logos.ReferenceTagging.constShowTooltip = 300;
		Logos.ReferenceTagging.constHideTooltip = 400;
		var supportedVersions = ['AB', 'ASV', 'CEV', 'DARBY', 'DAR', 'ESV', 'GW', 'HCSB', 'KJ21', 'KJV', 'NASB', 'NCV', 'NIRV', 'NIV', 'NIVUK', 'NKJV', 'NLT', 'NLV', 'TM', 'TNIV', 'WE', 'WNT', 'YLT', 'TNIV', 'NIRV', 'TNIV', 'NASB', 'WESTCOTT', 'CHASAOT', 'STEPHENS', 'AV 1873', 'KJV APOC', 'ELZEVIR', 'IT-DIODATI1649', 'TISCH', 'TISCHENDORF', 'CS-KR1579', 'TR1881', 'TR1894MR', 'TR1550MR', 'KAR', 'BYZ'];
		Logos.ReferenceTagging.lbsRefQuickTest = new RegExp('(\\d{1,3})(?:\\s?\\:\\s?|\\.)(\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?)', 'i');
		Logos.ReferenceTagging.lbsRefRegExp = new RegExp('(\\W|^)((Z(?:e(?:p(?:h(?:aniah)?)?|c(?:h(?:ariah)?)?)|[pc])|W(?:is(?:d(?:om(?:\\s+of\\s+(?:Ben\\s+Sirah?|Solomon))?|\.?\\s+of\\s+Sol))?|s)|T(?:ob(?:it)?|it(?:us)?|he(?:\\s+(?:Song\\s+of\\s+(?:Three\\s+(?:Youth|Jew)s|the\\s+Three\\s+Holy\\s+Children)|Re(?:velation|st\\s+of\\s+Esther))|ssalonians)|b)|S(?:us(?:anna)?|o(?:ng(?:\\s+(?:of\\s+(?:Thr(?:ee(?:\\s+(?:(?:Youth|Jew)s|Children))?)?|So(?:l(?:omon)?|ngs)|the\\s+Three\\s+Holy\\s+Children)|Thr))?)?|ir(?:a(?:c?h)?)?|OS)|R(?:u(?:th)?|o(?:m(?:ans)?)?|e(?:v(?:elation)?|st\\s+of\\s+Esther)?|[vm]|th)|Qoh(?:eleth)?|P(?:s(?:\\s+Sol(?:omon)?|a(?:lm(?:s(?:\\s+(?:of\\s+)?Solomon)?)?)?|Sol|s|l?m)?|r(?:ov(?:erbs)?|\\s+(?:(?:of\\s+)?Man|Az)|ayer\\s+of\\s+(?:Manasse[sh]|Azariah)|v)?|h(?:il(?:em(?:on)?|ippians)?|[pm])|Ma)|O(?:b(?:ad(?:iah)?)?|des)|N(?:u(?:m(?:bers)?)?|e(?:h(?:emiah)?)?|a(?:h(?:um)?)?|[mb])|M(?:rk?|ic(?:ah)?|a(?:t(?:t(?:hew)?)?|l(?:achi)?|rk)|[tlk])|L(?:uke?|e(?:v(?:iticus)?|t(?:ter\\s+of\\s+Jeremiah|\\s+Jer))?|a(?:od(?:iceans)?|m(?:entations)?)?|[vk]|tr\\s+Jer|Je)|J(?:ud(?:g(?:es)?|ith|e)?|o(?:s(?:h(?:ua)?)?|n(?:ah)?|el?|hn|b)|nh?|e(?:r(?:emiah)?)?|d(?:th?|gs?)|a(?:me)?s|[ts]h|[rmlgb]|hn)|Is(?:a(?:iah)?)?|H(?:o(?:s(?:ea)?)?|e(?:b(?:rews)?)?|a(?:g(?:gai)?|b(?:akkuk)?)|g)|G(?:e(?:n(?:esis)?)?|a(?:l(?:atians)?)?|n)|E(?:z(?:ra?|e(?:k(?:iel)?)?|k)|x(?:o(?:d(?:us)?)?)?|s(?:th(?:er)?)?|p(?:ist(?:le\\s+(?:to\\s+(?:the\\s+)?Laodiceans|Laodiceans)|\\s+Laodiceans)|h(?:es(?:ians)?)?|\\s+Laod)?|c(?:cl(?:es(?:iast(?:icu|e)s)?|us)?)?|noch)|D(?:eut(?:eronomy)?|a(?:n(?:iel)?)?|[tn])|C(?:ol(?:ossians)?|anticle(?:\\s+of\\s+Canticle)?s)|B(?:el(?:\\s+and\\s+the\\s+Dragon)?|ar(?:uch)?)|A(?:m(?:os)?|dd(?:\\s+(?:Ps(?:alm)?|Es(?:th)?)|ition(?:s\\s+to\\s+Esther|al\\s+Psalm)|Esth)|c(?:ts)?|zariah|Es)|\u03C8|(?:4(?:th\\s)?|[Ff]ourth\\s|(?:IIII|IV)\\s)\\s*(?:Ma(?:c(?:c(?:abees)?)?)?)|(?:3(?:rd\\s)?|[Tt]hird\\s|III\\s)\\s*(?:Ma(?:c(?:c(?:abees)?)?)?|Jo(?:h(?:n)?)?|Jn\\.?|Jhn)|(?:(?:2(?:nd\\s)?|[Ss]econd\\s|II\\s)|(?:1(?:st\\s)?|[Ff]irst\\s|I\\s))\\s*(?:T(?:i(?:m(?:othy)?)?|h(?:es(?:s(?:alonians)?)?)?)|S(?:a(?:m(?:uel)?)?|m)?|P(?:e(?:t(?:er)?)?|t)|Ma(?:c(?:c(?:abees)?)?)?|K(?:i(?:n(?:gs)?)?|gs)|J(?:o(?:hn?)?|h?n)|Es(?:d(?:r(?:as)?)?)?|C(?:o(?:r(?:inthians)?)?|h(?:r(?:on(?:icles)?)?)?)))(?:\\.?\\s*(\\d{1,3})(?:\\s?\\:\\s?|\\.)(\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?)(\\s?(?:-|--|\\u2013|\\u2014)\\s?\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?((?:\\s?\\:\\s?|\\.)\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?)?(?!\\s*(?:T(?:i(?:m(?:othy)?)?|h(?:es(?:s(?:alonians)?)?)?)|S(?:a(?:m(?:uel)?)?|m)?|P(?:e(?:t(?:er)?)?|t)|Ma(?:c(?:c(?:abees)?)?)?|K(?:i(?:n(?:gs)?)?|gs)|J(?:o(?:hn?)?|h?n)|Es(?:d(?:r(?:as)?)?)?|C(?:o(?:r(?:inthians)?)?|h(?:r(?:on(?:icles)?)?)?))(?:\\W)))?)|(Ob(?:ad(?:iah)?)?|Ph(?:ilem(?:on)?|m)|(?:(?:2(?:nd\\s)?|[Ss]econd\\s|II\\s)|(?:3(?:rd\\s)?|[Tt]hird\\s|III\\s))\\s*J(?:o(?:hn?)?|h?n)|Jude?)\\s*\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?(?:\\s?(?:-|--|\\u2013|\\u2014)\\s?\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?)?)([,]?\\s?(?:' + supportedVersions.join('|') + ')|[,]?\\s?[(](?:' + supportedVersions.join('|') + ')[)])?', (Logos.ReferenceTagging.lbsCaseInsensitive ? 'i': ''));
		Logos.ReferenceTagging.lbsBookContRegExp = new RegExp('^((?:(?:[,;\\.]+)?\\s?(?:and|or|&|&amp;)?)\\s*(?:(?:(?:cf|Cf|CF)[.,]?\\s?(?:v(?:v|ss?)?[.]?)?)[.,]?\\s*)?)((\\d{1,3})(?:\\s?\\:\\s?|\\.)\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?(?:\\s?(?:-|--|\\u2013|\\u2014)\\s?\\d{1,3}(?:(?:\\s?\\:\\s?|\\.)\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?)?)?)');
		Logos.ReferenceTagging.lbsChapContRegExp = new RegExp('^((?:(?:[,;\\.]+)?\\s?(?:and|or|&|&amp;)?)\\s*(?:(?:(?:cf|Cf|CF)[.,]?\\s?(?:v(?:v|ss?)?[.]?)?)[.,]?\\s*)?)(\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?(?:\\s?(?:-|--|\\u2013|\\u2014)\\s?\\d{1,3}(?:(?:\\s?(?:[a-z]|ff))(?=\\W|$))?)?)(?!\\s*(?:st|nd|rd|th|T(?:i(?:m(?:othy)?)?|h(?:es(?:s(?:alonians)?)?)?)|S(?:a(?:m(?:uel)?)?|m)?|P(?:e(?:t(?:er)?)?|t)|Ma(?:c(?:c(?:abees)?)?)?|K(?:i(?:n(?:gs)?)?|gs)|J(?:o(?:hn?)?|h?n)|Es(?:d(?:r(?:as)?)?)?|C(?:o(?:r(?:inthians)?)?|h(?:r(?:on(?:icles)?)?)?)))', (Logos.ReferenceTagging.lbsCaseInsensitive ? 'i': ''));
		Logos.ReferenceTagging.Initialized = true
	},
	tag: function (root, source) {
		'ab'.match(/b/);
		if (!document.getElementById || !document.childNodes || !document.createElement || !RegExp.leftContext) return;
		if (!Logos.ReferenceTagging.Initialized) Logos.ReferenceTagging.Init();
		Logos.ReferenceTagging.lbsTraverseDom(root || Logos.ReferenceTagging.lbsRootNode || document.body);
		setTimeout(function () {
			Logos.ReferenceTagging.log(source)
		},
		0)
	}
};