﻿var lazyLoader = new function()
{
	var isWindowLoaded = false;
	
	jQuery(window).load
	(
		function()
		{
			isWindowLoaded = true;
		}
	);
	
	jQuery(document).ready
	(
		function()
		{
			jQuery("[lazysrc]").each
			(
				function()
				{
					var thisElement = this;
					var trigger = jQuery(thisElement).attr("trigger");
					
					switch (trigger)
					{
						case "pageload":
							showPreloader(thisElement);
							loadContent(thisElement);
							
							break;
						
						case "inview":
							if (thisElement.tagName == "IMG")
							{
								jQuery(thisElement).attr("src", "/shared/images/blank.gif");
							}
							
							if (jQuery(window).height() >= jQuery("body").height())
							{
								showPreloader(thisElement);
								loadContent(thisElement);
							}
							
							jQuery(window).scroll
							(
								function()
								{
									if ((jQuery(thisElement).offset()).top - jQuery(window).height() - jQuery(window).scrollTop() < 0)
									{
										if (jQuery(thisElement).attr("trigger"))
										{
											showPreloader(thisElement);
											loadContent(thisElement);
										}
									}
								}
							);
							
							break;
						
						default:
							if (thisElement.tagName == "IMG")
							{
								jQuery(thisElement).attr("src", "/shared/images/blank.gif");
							}
							
							jQuery(trigger.substr(0, trigger.indexOf("."))).one
							(
								trigger.substr(trigger.indexOf(".") + 1),
								function(event)
								{
									showPreloader(thisElement);
									loadContent(thisElement);
								}
							);
					}
				}
			);
		}
	);
	
	function showPreloader(element)
	{
		if (element.tagName == "IMG")
		{
			jQuery(element).attr("src", "/shared/images/blank.gif");
			jQuery(element).addClass("image-loader");
		}
		else
		{
			jQuery(element).addClass("content-loader");
		}
	}
	
	function loadContent(lazyElement)
	{
		var functionCall;
		
		switch (lazyElement.tagName)
		{
			case "IMG":
				var lazyImage = 
				{
					alt: jQuery(lazyElement).attr("alt"),
					src: jQuery(lazyElement).attr("lazysrc"),
					trigger: jQuery(lazyElement).attr("trigger"),
					callback: jQuery(lazyElement).attr("callback"),
					params: jQuery(lazyElement).attr("params")
				}
				
				functionCall = "loadImage(lazyImage, lazyElement)";
				
				break;
				
			default:
				var lazyContent =
				{
					url: jQuery(lazyElement).attr("lazysrc"),
					trigger: jQuery(lazyElement).attr("trigger"),
					callback: jQuery(lazyElement).attr("callback"),
					params: jQuery(lazyElement).attr("params")
				}
				
				functionCall = "loadHtml(lazyContent, lazyElement)";
		}
		
		if (isWindowLoaded)
		{
			eval(functionCall);
		}
		else
		{
			jQuery(window).load
			(
				function()
				{
					eval(functionCall);
				}
			);
		}
	}
	
	function loadHtml(lazyContent, lazyElement)
	{
		jQuery(lazyElement).removeAttr("lazysrc");
		jQuery(lazyElement).removeAttr("trigger");
		jQuery(lazyElement).removeAttr("callback");
		jQuery(lazyElement).removeAttr("params");
		jQuery(lazyElement).removeClass("content-loader");
		
		jQuery.ajax
		(
			{
				url: lazyContent.url,
				success: function(response)
				{
					jQuery(lazyElement).replaceWith(response);
					
					if (typeof eval(lazyContent.callback) == "function")
					{
						eval(lazyContent.callback + "(" + lazyContent.params + ")");
					}
				}
			}
		);
	}
	
	function loadImage(lazyImage, imgElement)
	{
		var img = new Image();
		
		img.onload = function()
		{
			jQuery(imgElement).height("auto");
			jQuery(imgElement).attr("src", img.src);
			jQuery(imgElement).removeAttr("lazysrc");
			jQuery(imgElement).removeAttr("trigger");
			jQuery(imgElement).removeAttr("callback");
			jQuery(imgElement).removeAttr("params");
			jQuery(imgElement).removeClass("image-loader");
			
			if (typeof eval(lazyImage.callback) == "function")
			{
				eval(lazyImage.callback + "(" + lazyImage.params + ")");
			}
		}
		
		img.alt = lazyImage.alt;
		img.src = lazyImage.src;
	}
}
