Start = function() {
	var self = {};
	
	/*
	 * Public
	 */
	// Start site wide variables
	self.vars = {
		// Get site domain.
		// Add any subds which occur here ['blog']
		domain: function() {
					var d = window.location.protocol + '//' + window.location.hostname;
					var subds = ['blog']; // Array of all site subdomains
					for (var i=subds.length-1;i===0;i--) {
						d = d.replace(subds[i]+'.','');
					}
					return d;
				}(),
		isIe: !+"\v1"
	}
	self.funcs = {
		extend: function(obj, defaults){
			for (var i in defaults) {
				if (!obj[i]) {
					obj[i] = defaults[i];
				}
			}
			return obj;
		},
		// Cookie handling courtesy of Quirksmode (http://www.quirksmode.org/js/cookies.html)
		cookies: {
			createCookie: function(name,value,days) {
				if (days) {
					var date = new Date();
					date.setTime(date.getTime()+(days*24*60*60*1000));
					var expires = "; expires="+date.toGMTString();
				}
				else var expires = "";
				document.cookie = name+"="+value+expires+"; path=/";
			},
			readCookie: function(name) {
				var nameEQ = name + "=";
				var ca = document.cookie.split(';');
				for(var i=0;i < ca.length;i++) {
					var c = ca[i];
					while (c.charAt(0)==' ') c = c.substring(1,c.length);
					if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
				}
				return null;
			},
			eraseCookie: function(name) {
				Start.funcs.cookies.createCookie(name,"",-1);
			}
			
 		}
	}
	return self;
}();

/*
 * Preloading function
 * Can preload images, js and css.
 */
var Preloader = function(opts) {
	var self = {};
	/*
	 * Private
	 */
	var cache = [];
	var itemAry = [];
	var htmlHead = document.getElementsByTagName('head')[0];
	
	// Default values, loading and callback functions
	var defaults = {
		items: '',
		type: {
			jpg: 'img',
			jpeg: 'img',
			gif: 'img',
			png: 'img',
			js: 'script',
			css: 'link'
		},
		loading: function() {
			alert('No loading function is set');
		},
		callback: function() {
			alert('No callback is set');
		}
	};
	
	// Extend defaults
	var extend = function(obj, defaults) {
		for (var i in defaults) {
			if (!obj[i]) {
				obj[i] = defaults[i];
			} else {
				extend(obj[i], defaults[i]);
			}
		}
		return obj;
	};
	var obj = extend(opts, defaults);
	
	// Run loading function
	obj.loading();	
	
	// Create item array to set total and process
	itemAry = obj.items.split(',');
	
	// Process item list
	function init() {
		for (var i = 0; i < itemAry.length; i++) {
			// Get extension
			var ext = /[^.]+$/.exec(/[^?|^#]+/.exec(itemAry[i])).toString();
			// Get type
			var type = obj.type[ext];
			// Create dom element
			
			var domObj = document.createElement(type);
			switch (type) {
				case 'img':
					isImage(domObj,itemAry[i]);
					break;
				case 'script':
					isScript(domObj,itemAry[i]);					
					break;
				case 'link':
					isLink(domObj,itemAry[i]);					
					break;
				default:
					self.itemsLength = self.itemsLength - 1;
					self.loaded();
					break;
			}
		}
	}
	
	function isImage(domObj,item) {
		// onload must be set before src otherwise won't fire in IE due to caching
		domObj.onload = function() {
			self.itemsLength = self.itemsLength - 1;
			self.loaded();
		};
		
		domObj.src = item;
		cache.push(domObj);
	}
	
	function isScript(domObj,item) {
		domObj.type = 'text/javascript';
		domObj.src = item;
		htmlHead.appendChild(domObj);
		
		if (Start.vars.isIe) {
			// Poll for function availability
			var matches = item.match(/\?detect=([^&]+)($|&parent=([\w\$\.]+))/);
			var funcName = matches[1];
			var funcParent = matches[3];
			
			testForFunc = function(funcName,funcParent){
				var testFunc = (typeof(funcParent) !== 'undefined') ? typeof(window[funcParent]()[funcName]) : typeof(window[funcName]);
				
				if (testFunc === 'function') {
					self.itemsLength = self.itemsLength - 1;
					self.loaded();
				}
				else {
					setTimeout(function(){
						testForFunc(funcName,funcParent);
					}, 500);
				}
			};
			testForFunc(funcName,funcParent);
		} else {
			domObj.onload = function() {
				self.itemsLength = self.itemsLength - 1;
				self.loaded();							
			}						
		}
	}
	
	function isLink(domObj,item) {
		if (Start.vars.isIe) {
			// onload must be set before href otherwise won't fire in IE due to caching
			domObj.onload = function() {
				self.itemsLength = self.itemsLength - 1;
				self.loaded();
			};
		}
		domObj.href = item;
		domObj.rel = "stylesheet";
		domObj.type = "text/css";
		htmlHead.appendChild(domObj);
		
		if (!Start.vars.isIe) {
			// Poll for stylesheet application
			var matches = item.match(/#([^{]+){([^:]+):([^;]+)/);
			var id = matches[1];
			var property = matches[2];
			var value = matches[3];
			
			// If a style was set in the query string of the item path
			if (id.indexOf('.css') === -1) {
				function testForStyle(id, property, value){
					// Get style courtesy of Quirksmode
					function getStyle(el, styleProp){
						var x = document.getElementById(el);
						if (x.currentStyle)
							var y = x.currentStyle[styleProp];
						else 
							if (window.getComputedStyle) 
								var y = document.defaultView.getComputedStyle(x, null).getPropertyValue(styleProp);
						return y;
					}
					if (getStyle(id, property) === value) {
						self.itemsLength = self.itemsLength - 1;
						self.loaded();
					}
					else {
						setTimeout(function(){
							testForStyle(id, property, value);
						}, 500);
					}
				};
				testForStyle(id, property, value);
			}
			else {
				self.itemsLength = self.itemsLength - 1;
				self.loaded();
			}
		}
	}
	
	/*
	 * Public
	 */
	// Number of items being preloaded
	self.itemsLength = itemAry.length;
	
	// Run include
	self.loaded = function() {
		if (self.itemsLength === 0) {
			obj.callback();
		}
	};
	// Run preloader
	init();
	return self;
};

/*
 * Detects for components on page
 */
$(document).ready(function() {
	$('body').removeClass('noJs').addClass('js');
	
	/*
	 * Search box tooltip and blur
	 */
	var str = 'Enter search term'
	$('#q').addClass('tooltip').val(str)
	.focus(function() {
		var $this = $(this);
		if ($this.val() === str ) {
			$this.val('').removeClass('tooltip');
		}
	})
	.blur(function() {
		var $this = $(this);
		if ($this.val() === str || $this.val() === '') {
			$this.val(str).addClass('tooltip');
		}
	});
	
	/*
	 * Hero slideshow
	 */
	if ($('#hero-slideshow').length > 0) {
		var items = Start.vars.domain + '/css/hero-slideshow.css?detect=#hero-slideshow{position:relative;},' + Start.vars.domain + '/scripts/hero-slideshow.js?detect=heroSlideshow&parent=$';
		$('#hero-slideshow img').each(function() {
			items += ',' + $(this).attr('src');
		});
		var pdrHeroSlideshow = Preloader({
			items: items,
			loading: function() {
				$('#hero-slideshow').addClass('loading');
			},
			callback: function() {
				$('#hero-slideshow').removeClass('loading').find('ul').show().end().heroSlideshow({onInitCallback: function() {
					// Override noJs settings: article-list class and add section-back to headings
					// Add rounded corners to slideshow.
					$('#hero-slideshow').find('ul').removeAttr('class').end().find('h2').addClass('section-back').end().append('<div class="cnr cnr-tl"></div><div class="cnr cnr-tr"></div><div class="cnr cnr-bl"></div><div class="cnr cnr-br"></div>');
				}});
			}
		});
	}
	
	/*
	 * Seasonal selector
	 */
	if ($('#seasonal').length > 0) {
		var $seasonal = $('#seasonal');
		
		var items = Start.vars.domain + '/css/seasonal-js.css?detect=#seasonal{float:left;},' + Start.vars.domain + '/scripts/seasonal.min.js?detect=seasonal&parent=$';
		$('#plants img').each(function() {
			items += ',' + $(this).attr('src');
		});
		var pdrSeasonal = Preloader({
			items: items,
			loading: function() {
				$seasonal.addClass('loading');
			},
			callback: function() {				
				$seasonal.seasonal();
			}
		});
	}
});
