// Infinite Scroll
(function($) {
    $.fn.infinitescroll = function(options) {
        return $(this).each(function() {
            var el = $(this);
            var settings = $.extend({
                    url: null,
                    triggerAt: 300,
                    page: 2,
                    appendTo: '.list tbody',
                    container: $(document)
                }, options);
		//this function takes in all the new data loaded from a page and extracts the div that is going to be appended, parses the plain text to avoid complicated, unneccessary dom models and/or recursion
		var parse=function(data){
			//takes everything after the opening div tag of the desired elements
			//requires that id attribute comes first
			//alert(data);
			//alert("div class=\""+settings.appendTo.substring(1));
			var toMatch="div class=\""+settings.appendTo.substring(1);
			var toRead=data.substring(data.search(toMatch)).substring(data.search(">")+1);
			//alert("toRead: "+toRead);
			//split up everything after beginning by end divs, when the number of end divs equals the number 				opened, then the element is complete
			var divEnds=toRead.split("</div>");
			//alert("Number of ends: "+divEnds.length);
			var i=0;
			//measures how long of a string to return
			var totalLength=0;
			//counts how many open divs there are
			var divOpens=0;
			for(i=0; i<divEnds.length; i++){
				//alert(divEnds[i]);
				//six charachters for the </div> tag
				totalLength+=divEnds[i].length+6;
				var matches=divEnds[i].match(/<div/gi);
				if(matches){
					//alert(matches);
					divOpens+=matches.length;
				}
				//alert(
				//	"Total Length so far: "+totalLength+
				//	"\ndivOpens: "+divOpens+
				//	"\ni: "+i);
				if(divOpens==i){
					//alert("found");
					break;
				}
				//alert("no");
			}
			//alert("return: "+toRead.substring(0,totalLength));
			//var beginIndex=data.search(toMatch);
			//return data.substring(beginIndex,beginIndex+totalLength);
			//alert("parse: "+toRead.substring(toRead.search(">")+1,totalLength-6));
			return toRead.substring(0,totalLength-6);
		}
		//alert("parse: "+parse("hurr im a hoers <div class=\"products\"> herp <div>derp <div></div></div> hello</div>"));
            var req = null;
            var maxReached = false;
            var infinityRunner = function() {
                if (settings.url !== null) {
                    if  (settings.force || (settings.triggerAt >= (settings.container.height() - el.height() - el.scrollTop()))) {
                        settings.force = false;
                        // if the request is in progress, exit and wait for it to finish
                        if (req && req.readyState < 4 && req.readyState > 0) {
                            return;
                        }
                        if (settings.start+settings.next>=settings.total){
                        	maxReached=true;
                        	return;
                        }
                    	$('.LoadingBar').append("<strong>Loading more results...</strong>");
                        $(settings.appendTo).trigger('infinitescroll.beforesend');
                        //no need to send the page data
                        req = $.get(settings.url+"&start="+(settings.start+=settings.next)+"&next="+settings.next,{}, function(data) {
                            if (data !== '') {
                                if (settings.page > 1) {
                                    $(settings.appendTo).append(parse(data));
                                } else {
                                    $(settings.appendTo).html(parse(data));
                                }
                                //settings.page++;
                                $('.LoadingBar').html("");
                                $(settings.appendTo).trigger('infinitescroll.finish');
                            } else {
                                maxReached = true;
                                $(settings.appendTo).trigger('infinitescroll.maxreached');
                            }
                        }, 'html');
                    }
                }
            };
            
            el.bind('infinitescroll.scrollpage', function(e, page) {
                settings.page = page;
                settings.force = true;
                infinityRunner();
            });

            el.scroll(function(e) {
                if (!maxReached) {
                    infinityRunner();
                }
            });

            // Test initial page layout for trigger
            infinityRunner();
        });
    };
})(jQuery);

