﻿var PocketBible = (function(){
	var _bShowingHint = false;
	
	if (!Array.prototype.forEach){
		Array.prototype.forEach = function(fun /*, thisp*/){
			var len = this.length;
			if(typeof fun != "function")
				throw new TypeError();
			var thisp = arguments[1];
			for (var i = 0; i < len; i++){
				if (i in this)fun.call(thisp,this[i],i,this);
			}
		};
	}
	if(!String.prototype.trim){
		String.prototype.trim = function(){
			return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
		}
	}

/** ---------------------------------------------------------------------------- **/
	function _parseReference(ref){
    	var original = ref;
		function RegList(arr){
			var len = arr.length;
			function _exec(str){
				var i=0,item;
				for(i;i<len;i++){ //loop through every entry in the array
					item = arr[i]
					switch(typeof item[0]){
						case "string": 
							str = str.replace(new RegExp(item[0],"g"),item[1]);
						break;
						default: //assume its a regular expression
							str = str.replace(item[0],item[1])
						break;
					}
				}
				return str;
			}
			return {exec : _exec}
		}
		//fix user input
        var bookFix = new RegList([
	        [/(?:\bgenesis\b|\bgen\b|\bgn\b)/gi,"{1}"],[/(?:\bexodus\b|\bexod\b|\bexo\b|\bex\b)/gi,"{2}"],[/(?:\bleviticus\b|\blev\b)/gi,"{3}"],
			[/(?:\bnumbers\b|\bnum\b)/gi,"{4}"],[/(?:\bdeuteronomy\b|\bdeut\b)/gi,"{5}"],[/(?:\bjoshua\b|\bjosh\b|\bjos\b)/gi,"{6}"],
			[/(?:\bjudges\b|\bjudg\b|\bjdg\b|\bjd\b)/gi,"{7}"],[/(?:\bruth\b)/gi,"{8}"],[/(?:\b1\s*samuel\b|\b1\s*sam\b|\b1\s*sa\b)/gi,"{9}"],
			[/(?:\b2\s*samuel\b|\b2\s*sam\b|\b2\s*sa\b)/gi,"{10}"],[/(?:\bezra\b)/gi,"{15}"],[/(?:\bjob\b)/gi,"{18}"],
			[/(?:\brevelation\b|\brev\b|\bre\b)/gi,"{66}"],[/(?:\b1\s*kings\b|\b1\s*kgs\b|\b1\s*ki\b)/gi,"{11}"],
			[/(?:\b2\s*kings\b|\b2\s*kgs\b|\b2\s*ki\b)/gi,"{12}"],[/(?:\b1\s*chronicles\b|\b1\s*chr\b|\b1\s*chro\b|\b1\s*ch\b)/gi,"{13}"],
			[/(?:\b2\s*chronicles\b|\b2\s*chr\b|\b2\s*chro\b|\b1\s*ch\b)/gi,"{14}"],[/(?:\bnehemiah\b|\bneh\b)/gi,"{16}"],
			[/(?:\besther\b|\besth\b|\best\b)/gi,"{17}"],[/(?:\bpsalms\b|\bps\b|\bpsa\b)/gi,"{19}"],[/(?:\bproverbs\b|\bpr\b|pro\b)/gi,"{20}"],
			[/(?:\becclesiastes\b|\beccl\b|\becc\b)/gi,"{21}"],[/(?:\bsong\s*of\s*songs\b|\bsong\b|\bsng\b|\bsos\b|\bsong\s*of*solomon\b)/gi,"{22}"],
	        [/(?:\bisaiah\b|\bisa\b|\bis\b)/gi,"{23}"],[/(?:\bjeremiah\b|\bjer\b)/gi,"{24}"],[/(?:\blamentations\b|\blam\b)/gi,"{25}"],
			[/(?:\bezekiel\b|\bezek\b|\beze\b|\bezk\b)/gi,"{26}"],[/(?:\bdaniel\b|\bdan\b)/gi,"{27}"],[/(?:\bhosea\b|\bhos\b)/gi,"{28}"],
			[/(?:\bjoel\b)/gi,"{29}"],[/(?:\bamos\b)/gi,"{30}"],[/(?:\bobadiah\b|\bobad\b|\boba\b)/gi,"{31}"],
			[/(?:\bjonah\b|\bjon\b|\bjnh\b)/gi,"{32}"],[/(?:\bmicah\b|\bmic\b)/gi,"{33}"],[/(?:\bnahum\b|\bnah\b)/gi,"{34}"],
			[/(?:\bhabakkuk\b|\bhab\b|\bhbk\b)/gi,"{35}"],[/(?:\bzephaniah\b|\bzeph\b|\bzep\b)/gi,"{36}"],
			[/(?:\bhaggai\b|\bhagg\b|\bhag\b|\bhg\b)/gi,"{37}"],[/(?:\bzechariah\b|\bzech\b|\bzec\b)/gi,"{38}"],[/(?:\bmalachi\b|\bmal\b)/gi,"{39}"],
			[/(?:\bmatthew\b|\bmatt\b|\bmt\b)/gi,"{40}"],[/(?:\bmark\b|\bmk\b|\bmar\b)/gi,"{41}"],[/(?:\bluke\b|\blk\b|\bluk\b)/gi,"{42}"],
	        [/(?:\bacts\b|\bact\b|\bac\b)/gi,"{44}"],[/(?:\bromans\b|\brom\b)/gi,"{45}"],[/(?:\b1\s*corinthians\b|\b1\s*cor\b|\b1\s*co\b)/gi,"{46}"],
			[/(?:\b2\s*corinthians\b|\b2\s*cor\b|\b2\s*co\b)/gi,"{47}"],[/(?:\bgalatians\b|\bgal\b)/gi,"{48}"],[/(?:\bephesians\b|\beph\b)/gi,"{49}"],
			[/(?:\bphilippians\b|\bphil\b|\bphp\b)/gi,"{50}"],[/(?:\bcolossians\b|\bcol\b)/gi,"{51}"],[/(?:\b1\s*thessalonians\b|\b1\s*th\b|\b1\s*thes\b)/gi,"{52}"],
			[/(?:\b2\s*thessalonians\b|\b2\s*th\b|\b2\s*thes\b)/gi,"{53}"],[/(?:\b1\s*timothy\b|\b1\s*tim\b|\b1\s*ti\b)/gi,"{54}"],
			[/(?:\b2\s*timothy\b|\b2\s*tim\b|\b2\s*ti\b)/gi,"{55}"],[/(?:\btitus\b|\btit\b)/gi,"{56}"],	[/(?:\bphilemon\b|\bphlm\b|\bphile\b|\bphm\b|\bphi\b)/gi,"{57}"],
			[/(?:\bhebrews\b|\bheb\b|\bhe\b)/gi,"{58}"],[/(?:\bjames\b|\bjas\b|\bjam\b|\bja\b)/gi,"{59}"],[/(?:\b1\s*peter\b|\b1\s*pet\b|\b1\s*pe\b)/gi,"{60}"],
	        [/(?:\b2\s*peter\b|\b2\s*pet\b|\b2\s*pe\b)/gi,"{61}"],[/(?:\b1\s*john\b|\b1\s*jn\b)/gi,"{62}"],[/(?:\b2\s*john\b|\b2\s*jn\b)/gi,"{63}"],
			[/(?:\b3\s*john\b|\b3\s*jn\b)/gi,"{64}"],[/(?:\bjohn\b|\bjn\b)/gi,"{43}"],[/(?:\bjude\b)/gi,"{65}"]])

		var BookList = [,//index 0 empty on purpose
		    "Genesis","Exodus","Leviticus","Numbers","Deuteronomy","Joshua","Judges","Ruth","1 Samuel","2 Samuel","1 Kings","2 Kings","1 Chronicles",
		    "2 Chronicles","Ezra","Nehemiah","Esther","Job","Psalms","Proverbs","Ecclesiastes","Song of Songs","Isaiah","Jeremiah","Lamentations",
		    "Ezekiel","Daniel","Hosea","Joel","Amos","Obadiah","Jonah","Micah","Nahum","Habakkuk","Zephaniah","Haggai","Zechariah","Malachi","Matthew",
            "Mark","Luke","John","Acts","Romans","1 Corinthians","2 Corinthians","Galatians","Ephesians","Philippians","Colossians","1 Thessalonians",
            "2 Thessalonians","1 Timothy","2 Timothy","Titus","Philemon","Hebrews","James","1 Peter","2 Peter","1 John","2 John","3 John","Jude","Revelation"
        ]
		//Replace "Ruth 1 1" with "Ruth 1:1",remove spaces,Replace "Ruth 1.1" with "Ruth 1:1",put a booknumber after every comma, remove any book numbers side by side
		//{B}C1:V1-C2:V2 --> ["B.C1.V1","B.C2.V2"]
		//{B}C1:V1-V2 --> ["B.C1.V1","B.C1.V2"]
		//{B}C1-C2:V1 --> ["B.C1.V1","B.C2.V1"]
		//{B}C1:V1 --> ["B.C1.V1","B.C1.V1"]
		//{B}C1-C2 ---> ["B.C1.1","B.C2.End"]
		//{B}C1 --> ["B.C1.1","B.C1.End"]
		//{B} --> ["B.1.1","B.End.End"]
		var refFix = new RegList([
			[";",","],[/\}(\d+)\s*(\d+)/g,"}$1:$2"],[/\s*/g,""],[/(\d+)\.(\d+)/g,"$1:$2"],
			[/(\{\d+\})([^{]+)/g,function(match,bookNum,contents){return (bookNum + contents.replace(/\,/g,","+bookNum))}],[/\d+\}\{/,""],
			[/\{(\d+)\}(\d+)\:(\d+)\-(\d+)\:(\d+)/g,function(match,$1,$2,$3,$4,$5){
			    refType="range";
			    return "[\""+BookList[$1]+"."+$2+"."+$3+"\",\""+BookList[$1]+"."+$4+"."+$5+"\"]";
			}],
			[/\{(\d+)\}(\d+)\:(\d+)\-(\d+)/g,function(match,$1,$2,$3,$4){
			    refType="range";
			    return "[\""+BookList[$1]+"."+$2+"."+$3+"\",\""+BookList[$1]+"."+$2+"."+$4+"\"]";
			}],
			[/\{(\d+)\}(\d+)\-(\d+)\:(\d+)/g,function(match,$1,$2,$3,$4){
			    refType="range";
			    return "[\""+BookList[$1]+"."+$2+"."+$4+"\",\""+BookList[$1]+"."+$3+"."+$4+"\"]";
			}],
			[/\{(\d+)\}(\d+)\:(\d+)/g,function(match,$1,$2,$3){
			    refType = "single";
			    return "[\""+BookList[$1]+"."+$2+"."+$3+"\",\""+BookList[$1]+"."+$2+"."+$3+"\"]";
			}],
			[/\{(\d+)\}(\d+)\-(\d+)/g,function(match,$1,$2,$3){
			    refType="range";
			    return "[\""+BookList[$1]+"."+$2+".1\",\""+BookList[$1]+"."+$3+".End\"]";
			}], 
			[/\{(\d+)\}(\d+)/g,function(match,$1,$2){
			    refType="range";
			    return "[\""+BookList[$1]+"."+$2+".1\",\""+BookList[$1]+"."+$2+".End\"]";
			}],
			[/\{(\d+)\}/g,function(match,$1){
			    refType="range";
			    return "[\""+BookList[$1]+".1.1\",\""+BookList[$1]+".End.End\"]";
			}]
		])
		ref = bookFix.exec(ref) //normalize booknames
		ref = refFix.exec(ref) //normalize the references
		ref = "["+ref+"]";
        try{
            ref = eval("("+ref+")")
            if(!ref[0]){
                //alert("Unrecognized reference: "+original);
                alert('The Pocket Bible only looks up verse references. i.e. “John 3:16”');
                return false;
            }
        }catch(e){
            //alert("Unrecognized reference: "+original);
            alert('The Pocket Bible only looks up verse references. i.e. “John 3:16”');
            return false;
        }
        if(ref.length > 1){
            alert("Please enter a single reference");
            return false;
        }
		return ref[0]; //only the first bible reference
		//return ref
	}
/** ---------------------------------------------------------------------------- **/

	function _performSearch(sQuery){
		var sBookmark = "";
        var iVerseCount = 1;
        
        if (sQuery != null && sQuery.length > 0){
        	var searchVals = {
        		StartingBookmark: {
    				EditionID: 1,
    				BookShortName: 'John',
    				ChapterNbr: 3,
    				VerseNbr: 16
        		},
        		VerseCount: 1
        	};
        	var refs = _parseReference(sQuery);

        	if (refs.length > 0){
        		var aStart = refs[0].split('.');
        		var sb = searchVals.StartingBookmark;
        		sb.EditionID = 1
        		sb.BookShortName = aStart[0];
        		sb.ChapterNbr = aStart[1];
        		sb.VerseNbr = aStart[2];
	        
		        $.ajax({
					type: 'POST',
					url: '/BibleServices.asmx/FetchPocketBibleVerse',
					contentType: 'application/json; charset=utf-8',
					dataType: 'json',
					data: $.toJSON(searchVals),
					success: function(msg) {
					    msg = msg.d					
						$('#pocketBibleResultsHelper').hide();
						$('#pocketBibleResultsDisplay').show();
						$('#pocketBibleResultReference').html(msg.StartBookmark.BookReference);
						$('#pocketBibleResultPassage').html(msg.PassageText);
						
						var sUrl = 'http://www.hthbible.com/bibleexplorer.aspx?';
						sUrl += 'book=' + msg.StartBookmark.BookShortName;
						sUrl += '&cbegin=' + msg.StartBookmark.ChapterNbr;
						sUrl += '&cend=' + msg.EndBookmark.ChapterNbr;
						sUrl += '&vbegin=' + msg.StartBookmark.VerseNbr;
						sUrl += '&vend=' + msg.EndBookmark.VerseNbr;
						$('#pocketBibleMore').attr('href',sUrl);
					},
					error: function(xhr, msg)
					{
						console.log('error');
						console.log(xhr);
						console.log(msg);
					}
				});
			}
		}
	}
	
	function _handleKeyPress(e){
		e = e || window.event;
		var code = e.keyCode;

        switch(code){
            case 38:
            case 40:
                _bShowingHint = true;
            break;
	        case 13:
		        if(!_bShowingHint)
		            _performSearch($('#pocketBibleQuery').val());
		        else
		        	_bShowingHint = false;
		        return false;
	        default:
	            _bShowingHint = false;
		        return true;	
        }
	}
	
    function _searchBible(){
        _performSearch($('#pocketBibleQuery').val());
    }
    
    return{
    	parseReference : _parseReference,
    	performSearch : _performSearch,
    	handleKeyPress : _handleKeyPress,
        searchBible_Click : _searchBible
    };
})();

/*
oBookMark.EditionID = 1
oBookMark.BookShortName = "John"
oBookMark.ChapterID = 3
oBookMark.VerseID = 16
*/