if(!site) var site = {};

site.addEvent = function( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		site.EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		site.EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}
site.EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();
site.xhr = function() {
	function handleReadyState(o, callback) {
		if (o && o.readyState == 4 && o.status == 200) {
			if (callback) {
				callback(o);
			}
		}
	}
	var getXHR = function() {
		var http;
		try {
			http = new XMLHttpRequest;
			getXHR = function() {
				return new XMLHttpRequest;
			};
		}
		catch(e) {
			var msxml = [
				'MSXML2.XMLHTTP.3.0',
				'MSXML2.XMLHTTP',
				'Microsoft.XMLHTTP'
			];
			for (var i=0, len = msxml.length; i < len; ++i) {
				try {
					http = new ActiveXObject(msxml[i]);
					getXHR = function() {
						return new ActiveXObject(msxml[i]);
					};
					break;
				}
				catch(e) {}
			}
		}
		return http;
	};
	return function(method, uri, callback, postData) {
		var http = getXHR();
		http.open(method, uri, true);
		http.onreadystatechange =  function () { handleReadyState(http, callback); };
		http.send(postData || null);
		return http;
	};
}();

site.addEvent(window,'unload', function(){
	
	site.EventCache.flush();
	site = null; // some manual garbage collection.
	
});

site.client = {
	pageHeight:function() {
		var height = null;
		if (window.innerHeight && window.scrollMaxY) {
			height = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){
			height = document.body.scrollHeight;
		} else {
			height = document.body.offsetHeight;
	  	}	
		return height;
	},
	pageWidth: function(){
		var width = null;
		if (window.innerHeight && window.scrollMaxY) {
			width = window.innerWidth + window.scrollMaxX;
		} else if (document.body.scrollHeight > document.body.offsetHeight){
			width = document.body.scrollWidth;
		} else {
			width = document.body.offsetWidth;
	  	}
		return width;
	}
}

site.stopDefault = function(e) {
	if(e.preventDefault) {
		e.preventDefault();
	} else {
		e.returnValue = false;
	}
}

site.removeClass = function(element, removeClass) {
	var regex = new RegExp('(.*)\\s?(' + removeClass + ')\\s?(.*)');
	element.className = element.className.replace(regex, '$1 $3');
	return true;
}
site.getElementsByClassName = function(className, htmlTag, parent) {
	var e = null, r = null;
	if(document.getElementsByClassName) {
		var e = (parent || document).getElementsByClassName(className);
	} else {
		var e = new Array();
		elements = (parent || document).getElementsByTagName(htmlTag || '*');
		var regEx = new RegExp("(^|\\s)" + className + "(\\s|$)");
		
		for(var i=0, element=null; element = elements[i]; i++) {
			if(regEx.test(element.className)) {
				e[e.length] = element;
			}
		}
	}
	if(htmlTag && htmlTag != '*') {
		var r = new Array();
		if(!Array.filter) {
			for(var i=0, element=null; element = e[i]; i++) {
				htmlTag = htmlTag.toUpperCase();
				if(element.nodeName == htmlTag) {
					r[r.length] = element;
				}
			}
		} else {
			r = Array.filter(e, function(element) { return element.nodeName == htmlTag.toUpperCase(); });
		}
		return r;
	}
	return e;
}

site.string_format = function(stringPattern, stringArray) {
	var returnString = stringPattern;
	for (i = 0; i < stringArray.length; i++) {
		returnString = site.string_replace_all(returnString, "{" + i + "}", stringArray[i]);
	}
	return returnString;
}

site.string_replace_all = function(baseString, oldString, newString) {
	baseString = (new String(baseString)).split(oldString).join(newString);
	return baseString;
}

site.getParentNode = function(element, nodeName) {
	if(nodeName) {
		var parentNode = element.parentNode;
		while(parentNode.nodeName != nodeName) {
			parentNode = parentNode.parentNode;
		}
		return parentNode;
	} else {
		return element.parentNode;
	}
}

site.forEach = function(items, callback) {
	for(var i = 0, item = null; item = items[i]; i++) {
		// can't use the "index" keyword here
		// because it's reserved for select lists
		item.indecs = i;
		callback(item);
	}
}

site.SiteController = (function(){
	
	function initialise() {
		/* email page */
		var email_page = document.getElementById('email-page');
		if(email_page !== null) {
			bind_email(email_page);
		}
		
		var pdfLinks = site.getElementsByClassName('download-pdf', 'a');
		if(pdfLinks.length > 0) {
			bindPdfLinks(pdfLinks);
		}
		
		var imagePopup = site.getElementsByClassName('image-popup', 'a');
		if(imagePopup.length > 0) {
			bind_modalwindow(imagePopup);
		}
		
		bind_new_window_links();
		
		var clearTextElements = site.getElementsByClassName('clear-text');
		bind_clear_text(clearTextElements);
		
		var careerForm = document.getElementById('careerForm');
		if(careerForm !== null) {
			bindValidation('careerForm', 'submit');
		}
		
		var contactForm = document.getElementById('contactForm');
		if(contactForm !== null) {
			bindValidation('contactForm', 'submit');
		}
		
		var awardHeaders = document.getElementById('awards-headers');
		var awardList = document.getElementById('awards-list');
		if(awardHeaders !== null && awardList !== null) {
			bindShowHide(awardHeaders, awardList);
		}
		
		var cbiRemoveLink = document.getElementById('edit-order');
		if(cbiRemoveLink !== null) {
			bindCbiRemoveLink(cbiRemoveLink);
		}
		
		var orderForm = document.getElementById('order-form');
		if(orderForm !== null) {
			bindCbiSeeList(orderForm);
			validateOrderForm(orderForm);
		}
		
		var customerForm = document.getElementById('customer-form');
		if(customerForm !== null) {
			validateCustomerForm(customerForm);
		}
		
		var cbiSurvey = document.getElementById('cbi');
		if(cbiSurvey !== null && cbiSurvey.className == 'survey') {
			swfobject.embedSWF('/wp-content/themes/fb/m/fla/calculator.swf', 'image-header', '906', '350', '9.0.0', '/wp-content/themes/fb/m/fla/expressInstall.swf', {}, { bgcolor: '#FF8500' });
		} else if(cbiSurvey !== null && cbiSurvey.className == 'rankings') {
			swfobject.embedSWF('/wp-content/themes/fb/m/fla/cbi_rankings.swf', 'image-header', '906', '350', '9.0.0', '/wp-content/themes/fb/m/fla/expressInstall.swf', {}, { bgcolor: '#FF8500' });
		}
	}
	
	function validateCustomerForm(element) {
		var emailInputs = site.getElementsByClassName('email', 'input', element);
		site.addEvent(element, 'submit', function(e) {
			if(emailInputs[0].value != emailInputs[1].value) {
				site.forEach(emailInputs, function(input) {
					site.removeClass(input, 'validation-error');
				});
				site.forEach(emailInputs, function(input) {
					input.className += ' validation-error';
				});
				site.stopDefault(e);
			}
		});
	}
	
	function validateOrderForm(element) {
		var checkboxes = site.getElementsByClassName('checked', 'input', element);
		var checked = 0;
		site.addEvent(element, 'submit', function(e) {
			site.forEach(checkboxes, function(checkbox) {
				if(checkbox.checked) { checked++; }
			});
			if(checked == 0) {
				alert('Please select a product to continue');
				site.stopDefault(e);
			}
		});
	}
	
	function bindCbiSeeList(element) {
		var links = site.getElementsByClassName('see-list', 'p', element);
		
		site.forEach(links, function(item) {
			var link = item.getElementsByTagName('a')[0];
			link.reverse = false;
			link.notes = document.getElementById('note-' + link.href.substring((link.href.indexOf('#') + 1), link.href.length)).getElementsByTagName('td')[0].getElementsByTagName('div')[0];
			
			var children = link.notes.childNodes;
			link.notes.newHeight = 0;
			
			site.forEach(children, function(child) {
				if(child.offsetHeight) {
					link.notes.newHeight += parseInt(child.offsetHeight);
				}
			});
			
			site.addEvent(link, 'click', function(e) {
				var animation = new Array('right', 'rrd', 'rdd', 'down');
				var rotate = function(index, reverse) {
					if((index + 1) > animation.length || index < 0) { return; }
					item.getElementsByTagName('span')[0].className = 'arrow ' + animation[index];
					if(reverse) {
						setTimeout(function() { rotate(--index, true); }, 80);
					} else {
						setTimeout(function() { rotate(++index); }, 80);
					}
				}
				var slide = function(height, reverse) {
					if(height >= link.notes.newHeight || height < 0) { return; }
					link.notes.style.height = height + 'px';
					if(reverse) {
						setTimeout(function() { slide(height -= 3, true); }, 13);
					} else {
						setTimeout(function() { slide(height += 3); }, 13);
					}
				}
				
				if(this.reverse) {
					this.reverse = false;
					rotate(3, true);
					slide(parseInt(link.notes.style.height), true);
				} else {
					this.reverse = true;
					link.notes.style.position = 'relative';
					rotate(0);
					slide(0);
				}
				
				site.stopDefault(e);
			});
		});
	}
	
	function bindCbiRemoveLink(element) {
		var links = site.getElementsByClassName('remove-item', 'a', element);
		site.forEach(links, function(link) {
			site.addEvent(link, 'click', function(e) {
				if(confirm('Really remove this item?')) {
					var removeMe = site.getParentNode(this, 'LI');
					var productList = site.getParentNode(this, 'UL');
					productList.removeChild(removeMe);
					
					if(productList.getElementsByTagName('li').length == 0) {
						document.getElementById('submit').parentNode.removeChild(document.getElementById('submit'));
						element.removeChild(element.getElementsByTagName('h4')[0]);
						site.getElementsByClassName('summary', 'div', element)[0].innerHTML = 'Order Total: $0.00 US';
						var noItemsLeft = document.createElement('li');
						noItemsLeft.innerHTML = '<p>You don\'t have any items left in your cart.</p><p>You can <a href="javascript:location.reload(true);">refresh</a> the page to get your items back or <a href="/showcase/download/">go back</a> and choose your items again.</p>';
						productList.appendChild(noItemsLeft);
					} else {
						var prices = site.getElementsByClassName('price', 'span', productList);
						var newOrderTotal = 0;
						site.forEach(prices, function(price) {
							if(price.innerHTML == 'FREE!') {
								price = 0;
							} else {
								price = parseInt(price.innerHTML.replace('$', ''));
							}
							newOrderTotal += price;
						});
						site.getElementsByClassName('summary', 'div', element)[0].innerHTML = 'Order Total: $' + newOrderTotal + '.00 US';
					}
				}
				site.stopDefault(e);
			});
		});
	}
	
	function bindShowHide(controls, elements) {
		controls = controls.getElementsByTagName('a');
		elements = elements.getElementsByTagName('li');
		
		function hideAll(initial) {
			var start = 0;
			if(initial) { start = 1; }
			for(i = start, element = ''; element = elements[i]; i++) {
				element.style.display = 'none';
			}
		}
		
		function resetActive() {
			for(i = 0, control = ''; control = controls[i]; i++) {
				control.className = '';
			}
		}
		
		hideAll(true);
		
		for(var i = 0, control = ''; control = controls[i]; i++) {
			control.index = i;
			site.addEvent(control, 'click', function(e) {
				hideAll();
				resetActive();
				this.className = 'active';
				elements[this.index].style.display = 'block';
				site.stopDefault(e);
			});
		}
	}
	
	function bindValidation(formId, submitId) {
		/*
		var frm = document.getElementById(formId);
		var frmElements = frm.getElementsByTagName('input');
		var default_labels = new Array(), required = new Array();
		
		for(var i=0, e=null; e=frmElements[i]; i++) {
			if(e.className.indexOf('required') != -1) {
				required.push(e);
				default_labels.push(e.innerHTML);
			}
		}
		site.addEvent(document.getElementById(submitId), 'click', function(e){
			var validator = new site.FormValidator(frm, required, default_labels);
			if(validator.validate() != true) {
				site.stopDefault(e);
			}
		});
		*/
		var formController = new site.FormValidator();
	}
	
	function bind_clear_text(elements) {
		for(var i = 0, element = null; element = elements[i]; i++) {
			element.originalText = element.value;
			
			site.addEvent(element, 'focus', function() {
				if(this.value == this.originalText) {
					this.value = '';
				}
			});
			
			site.addEvent(element, 'blur', function() {
				if(this.value == '') {
					this.value = this.originalText;
				}
			});
		}
	}
	
	function bind_print(element) {
		site.addEvent(element, 'click', function(e) {
			var print = (window.location.toString().indexOf('?') == -1) ? '?print' : '&print';
			var url = window.location.toString()+print;
			url = url.replace('#', '');
			var title = document.title;
			var p=window.open(url,"print","width=580, height=600, left=100, top=100, location=no, menubar=no, resizable=no, scrollbars=yes, status=no, toolbar=no, fullscreen=no");
			site.stopDefault(e);
		});
	}
	
	function bindPdfLinks(elements) {
		var page_name = document.getElementsByTagName('title')[0].innerHTML.substring(0, document.getElementsByTagName('title')[0].innerHTML.indexOf('»') - 1);
		for(i = 0, element = null; element = elements[i]; i++) {
			var pdfId = element.href.substring((element.href.indexOf('?') + 5), element.href.length);
			
			if(!element.mw) {
				element.mw = new site.ModalWindow({
					shield: {
						'background-color': '#000',
						'height': site.client.pageHeight()+'px',
						'width': site.client.pageWidth()+"px",
						'opacity': '0.8',
						'filter': 'alpha(opacity=70)'
					},
					content: {
						'width': 320,
						'height': 330,
						'marginLeft': -195,
						'color': '#CCC',
						'padding': '15px'
					}
				}).setContent(new site.DownloadPdf(page_name, pdfId, element));
			}
			
			site.addEvent(element, 'click', function(e) {
				this.mw.open();
				site.stopDefault(e);
			});
		}
	}
	
	function bind_email(element) {
		var shield_height = document.body.height;
		var shield_width = document.body.width;
		var page_name = document.getElementsByTagName('title')[0].innerHTML.substring(0, document.getElementsByTagName('title')[0].innerHTML.indexOf('»'));
		var page_link = window.location.toString();
		var site_url = window.location.toString().split('/')[0] + '//' + window.location.toString().split("/")[2];
		
		if(!element.mw) {
			element.mw = new site.ModalWindow({
				shield: {
					'background-color': '#000',
					'height': site.client.pageHeight()+'px',
					'width': site.client.pageWidth()+"px",
					'opacity': '0.8',
					'filter': 'alpha(opacity=70)'
				},
				content: {
					'width': 320,
					'height': 472,
					'marginLeft': -195,
					'color': '#CCC',
					'padding': '15px'
				}
			}).setContent(new site.EmailPage(page_name, page_link, site_url, element));
		}
		
		site.addEvent(element, 'click', function(e) {
			element.mw.open();
			site.stopDefault(e);
		});
	}
	
	
	/**
	 * Creates a Modal Window
	 * @param {Object} elements
	 * @param {Object} showToolbar
	 */
	function bind_modalwindow(elements, showToolbar) {
		
		var shield_height = document.body.height;
		var shield_width = document.body.width;
		var config = {
			shield: {
				'background-color': '#000',
				'height': site.client.pageHeight() + 'px',
				'width': site.client.pageWidth() + "px",
				'opacity': '0.8',
				'filter': 'alpha(opacity=70)'
			},
			content: {
				'width': 120,
				'height': 40,
				'marginLeft': -60
			}
		};
		
		document.body.mw = new site.ModalWindow(config).setContent(new site.MediaPopup(elements[0].href, showToolbar, elements));
		
		for(var i=0, element=null; element=elements[i]; i++) {
			var data = null;
			
			site.addEvent(element, 'click', function(e) {
				var mw = document.body.mw;
				
				if(mw.content.type == 'video') {
					if(!mw.getRendered()) {
						mw.setContent(new site.MediaPopup(this.href, false, elements));
					} else {
						mw.content.url = this.href;
						mw.content.bind();
					}
					config.content.height = 370;
					config.content.width = 487;
					config.content.marginLeft = -234;
					
					mw.setConfig(config);
					mw.open();
				} else {
					var img = new Image();
					
					img.onload = function() {
						if(!mw.getRendered()) {
							mw.setContent(new site.MediaPopup(this.src, false, elements));
						} else {
							mw.content.url = this.src;
							mw.content.bind();
						}
						
						config.content.width = this.width + 20;
						if(mw.content.showToolbar) {
							config.content.height = this.height + toolbar.outerHeight();
						} else {
							config.content.height = this.height;
						}
						config.content.height = config.content.height + 20;
						config.content.marginLeft = Math.floor((config.content.width / 2) * -1);

						mw.setConfig(config);										
						mw.open();
					}
					img.src = this.href.toString();
				}		
				site.stopDefault(e);
			});
		}
	}
	
	function bind_new_window_links() {
		var newWindowLinks = site.getElementsByClassName('new-window', 'a');
		
		for(var i = 0; i < newWindowLinks.length; i++) {
			var link = newWindowLinks[i];
			
			site.addEvent(link, 'click', function(e) {
				var newWindow = window.open(link.getAttribute('href'), '_blank');
				
				if(newWindow) {
					if(newWindow.focus) {
						newWindow.focus();
					}
				}
				
				site.stopDefault(e);
			});
		}
	}
	
	return function(){
		/* public and private variables for each instance off the class */
		this.createdBy = function() { alert('FutureBrand 2009'); };
		this.version = function() { alert('1.0'); };
		
		this.bindValidation = function(formId, submitButtonId) {
			bindValidation(formId, submitButtonId);
		};
		initialise();
	};
})();
