/* ############################################# */
/* #  Technicolor Grayscale                    # */
/* #  technicolorgrayscale.com                 # */
/* # ......................................... # */
/* #  RUBIX MEDIA LLC                          # */
/* #  P.Gold - 1 FEB 2010                      # */
/* ############################################# */



// Initialize globals
var page_init = function() {
	extendCSS.init();
	injectEmail.init();
	footer.init();
	portfolioViewer.init();
	validate.init();
	contact.init();
	externalLauncher.init();               // External links
}
jQuery(document).ready(page_init);


var extendCSS = {
	init: function() {
		/* set first and last child classes
		   TO-DO: however, if we are "only child", we need to handle that as well
		*/
		jQuery('li:first-child').each(function(i){
			if (jQuery(this).siblings().length > 0) {
				if (this.className.match('current')) {
					jQuery(this).addClass('current_firstChild');
				} else {
					jQuery(this).addClass('firstChild');
				}
			}
		});
		jQuery('li:last-child, div.component:last-child').each(function(i){
			if (jQuery(this).siblings().length > 0) {
				if (this.className.match('current')) {
					jQuery(this).addClass('current_lastChild');
				} else {
					jQuery(this).addClass('lastChild');
				}
			}
		});
	}
};

var footer = {
	init: function() {
		footer.conatiner = document.getElementById('footer');
		injectEmail.insertAddress('#footer .site-email');
		$('#footer').show();

	}
};

var injectEmail = {
//	emails: Array(),
	init: function() {
//		injectEmail.emails['info'] = 'info';
		injectEmail.insertAddress('.content .site-email');
	},
	insertAddress: function(selector) {
		$.each( $(selector), function(k,v) {
			$(v).hide();
			var email = injectEmail.constructAddress($(v).text());
			$(v).attr('href','mailto:'+email);
			$(v).text(email);
			$(v).show();
		});
	},
	constructAddress: function(key) {
		return key+'@technicolorgrayscale.com';
//		return injectEmail.emails[key]+'@technicolorgrayscale.com';
	}
};


var portfolioViewer = {
	init: function() {
		$('.launch-video').click(function(){
			if (this.href.length > 1) {
				window.open(this.href,'Video','width=800,height=600,scrollbars=no,toolbar=no,menubar=no,status=no');
			}
			return false;
		});
		portfolioViewer.oSet = $('.portfolio-viewer');
		portfolioViewer.oSet.each(function(k,v) {
			portfolioViewer.currentViewer = v;
			portfolioViewer.registerComponents(v);
			portfolioViewer.contstructViewerByType(v);
		});
	},
	preloadImages: function(imgSet,callback,arg) {
		$.preLoadImages(jQuery.makeArray(imgSet), callback, arg);
	},
	registerComponents: function(v) {
			v.imgSet = $('.view-pane img',v);
			v.thumbs = $('.thumbs .tn a',v);
			v.imgSet.viewer = v;
			v.thumbs.viewer = v;
	},
	contstructViewerByType: function(v) {
		if ($(v).hasClass('page-viewer')) {
			portfolioViewer.constructPageViewer(v);
			$($('.thumbs',v)[0]).slideDown();
			v.style.backgroundImage = 'none';
		} if ($(v).hasClass('client-viewer')) {
			$($('.thumbs',v)[0]).slideDown();
			v.style.backgroundImage = 'none';
		} else {
			portfolioViewer.preloadImages(v.imgSet, portfolioViewer.constructScroller, v);
		}
	},
	constructPageViewer: function(v) {
		portfolioViewer.installLightBox(v.thumbs);
		v.thumbsContainers = $('.thumbs .tn',v);
		v.thumbsIMG = $('.thumbs .tn img ',v);
		v.thumbsContainers.maxHeight = 0;
		for (var i=0; i<v.thumbsIMG.length; i++) {
			v.thumbsContainers.maxHeight = (v.thumbsContainers.maxHeight > v.thumbsIMG[i].height) ? v.thumbsContainers.maxHeight : v.thumbsIMG[i].height;
		}
		if (v.thumbsContainers.length%2!=0) {
			var vPadding = (parseInt($($('.thumbs .description')[0]).css('padding-top'))+parseInt($($('.thumbs .description')[0]).css('padding-bottom')));
			$('.thumbs .description',v).css('height',(v.thumbsContainers.maxHeight-vPadding)+'px');
		}
	},
	constructScroller: function(viewer) {
		viewer.viewPane = $('.view-pane',viewer)[0];
		if (!viewer.viewPane) return;
		$(viewer.viewPane).hide();
		viewer.thumbContainer = $('.thumbs',viewer)[0];
		$(viewer.thumbContainer).hide();

		viewer.viewPane.imgSet = $('img',viewer.viewPane);

		viewer.scroller = document.createElement('div');
		viewer.scroller.className = 'scroller';
		viewer.viewPane.appendChild(viewer.scroller);

		portfolioViewer.getViewerDimensions(viewer);

		viewer.thumbs = $('.thumbs li a',viewer);
		$(viewer.thumbs[0]).parents('li').addClass('selected');
		$(viewer.thumbs).each(function(k,v){
			v.idx = k;
			$(v).click(function(){
				if ($(this).parents('li').hasClass('selected')) return false;
				rbx_cmn.kill_event();

				var xPos0 = $(viewer.viewPane).offset().left;
				var xPos = $(viewer.viewPane.imgSet[this.idx]).offset().left;
				var shift = xPos-xPos0;
				var pv = $(this).parents('.portfolio-viewer')[0];
				$(pv.scroller).animate(
					{
						left: '-='+shift
					}, {
						duration: 500,
						easing: "easeInOutCubic"
					}
				);
				$(this).parents('li').siblings().removeClass('selected');
				$(this).parents('li').addClass('selected');
				return false;
			});
		});
		portfolioViewer.loadViewerAnimation(viewer.viewPane);
		viewer.style.backgroundImage = 'none';
	},
	loadViewerAnimation: function(vp) {
		$(vp).slideDown({
			duration:400,
			complete:function(){
				$($('.thumbs',this.parentNode)[0]).slideDown();
			}
		});
	},
	getViewerDimensions: function(v) {
		var s  = v.scroller;
		var is = v.viewPane.imgSet;
		s.sWidth = 0;
		for (var i=0; i<is.length; i++) {
			s.sWidth += is[i].width;
			s.minHeight = (s.minHeight > 0) ? Math.min(s.minHeight,is[i].height) : is[i].height;
			s.appendChild(is[i]);
		}
		if (s.sWidth == 0) s.sWidth = 762*is.length; // IE hack
		s.style.width = s.sWidth+'px';
		s.style.height = (s.minHeight==0) ? 'auto' : s.minHeight+'px';

		return true;
	},
	installLightBox: function(o) {
		$(o).lightBox({ 
			overlayBgColor: '#000', 
			overlayOpacity: 0.8, 
			imageLoading: '/modules/jquery/plugins/jquery-lightbox-0.5/images/lightbox-ico-loading.gif', 
			imageBtnClose: '/modules/jquery/plugins/jquery-lightbox-0.5/images/lightbox-btn-close.gif', 
			imageBtnPrev:  '/modules/jquery/plugins/jquery-lightbox-0.5/images/lightbox-btn-prev.gif', 
			imageBtnNext:  '/modules/jquery/plugins/jquery-lightbox-0.5/images/lightbox-btn-next.gif' 
		});
	}
};





// FORM VALIDATION ***************
var validate = {
	validationSet: {
		'email': {
			'regexp': /^.+?@.+?\..+?$/,
			'error': 'Please enter a valid email address.'
		}
	},
	init: function() {
		validate.installListeners();
	},
	installListeners: function() {
		for (var i in validate.validationSet) {
			var fieldSet = document.getElementsByName(i);
			if (fieldSet) {
				for (var x=0; x<fieldSet.length; x++) {
					var formField = document.getElementsByName(i)[x];
					if (formField == undefined) continue;
					validate.addEvent(formField, 'blur', validate.checkValid, false);
					if (!formField.form.validateSubmit) {
						validate.addEvent(formField.form, 'submit', validate.checkValidSubmit, false);
						formField.form.onsubmit = validate.checkSubmit; // Safari
						formField.form.validateSubmit = true;
					}
				}
			}
		}
	},
	checkValidSubmit: function(e) {
		rbx_cmn.kill_event(e);
		var target = validate.getEventTarget(e);
		var frm = (target.tagName=="INPUT") ? target.form : target;
		if (frm == undefined) return;

		var errList = [];
		for (var i=0; i<frm.elements.length; i++) {	  
			if (frm.elements[i].name && validate.validationSet[frm.elements[i].name]) {
				var failedE = validate.handleValidity(frm.elements[i]);
				var labels = $("label");
				if (failedE) {
					$(frm.elements[i]).addClass("fieldErr");
					errList[errList.length] = validate.validationSet[failedE.name]['error'];
					for (var x=0; x<labels.length; x++) {
						if (labels[x].htmlFor == frm.elements[i].name) {
							if (labels[x].className == undefined) { labels[x].className = ''; }
							$(labels[x]).addClass("labelErr");
						}
					}
				} else {
					$(frm.elements[i]).removeClass("fieldErr");
					for (var x=0; x<labels.length; x++) {
						if (labels[x].htmlFor == frm.elements[i].name)
						$(labels[x]).removeClass("labelErr");
					}
				}
			} /* ENDIF */
		} /* ENDFOR */

		var errContainer = document.getElementById('formErrors');
		if (errContainer != undefined) { frm.parentNode.removeChild(errContainer); }

		if (errList.length > 0) {
			errContainer = document.createElement('div');
			errContainer.id = 'formErrors';

			var errMsgContainer = document.createElement('div')
			errMsgContainer.className = 'formErrMsg';
			var errMsg = document.createTextNode('Errors on the form:');
			errMsgContainer.appendChild(errMsg);
			errContainer.appendChild(errMsgContainer);
			var errListNode = document.createElement('ul');
			errListNode.className = 'standardList errList';
			for (var errNum=0; errNum<errList.length; errNum++) {
				var errListStr = document.createTextNode(errList[errNum]);
				var errListItem = document.createElement('li');
				errListItem.appendChild(errListStr);
				errListNode.appendChild(errListItem);
			}
			errContainer.appendChild(errListNode);

			$(errContainer).hide();
			$(frm).before(errContainer);
			$(errContainer).fadeIn(100);

			frm.submitAllowed = false;
			return false;
		} else if (frm.preSubmissionEvent) {
			frm.preSubmissionEvent(e);
		} else {
			frm.submitAllowed = true;
		}
	},  
	checkSubmit: function() {
		if (this.attachEvent) return true;
		return this.submitAllowed;
	},
	checkValid: function(e) {
		var target = e.target;
		if (!target) return;

		var failedE = validate.handleValidity(target);
		if (failedE) {
			$(target).addClass("fieldErr");
			var labels = $("label");
			for (x in labels) {
				if (labels[x].htmlFor == target.name) {
					if (!labels[x].className) { labels[x].className = ''; }
					$(labels[x]).addClass("labelErr");
				}
			}
		} else {
			$(target).removeClass("fieldErr");
			var labels = $("label");
			for (x in labels) {
				if (labels[x].htmlFor == target.name)
				$(labels[x]).removeClass("labelErr");
			}
		}
	},
	handleValidity: function(field) {
		// if (!field.value) return null; /* ignore if not required */
		var re = validate.validationSet[field.name]['regexp'];
		return (!field.value.match(re)) ? field : null;
	},
	addEvent:function(elm,evType,fn,useCapture){/*cross-browser event handling for IE5+, NS6+ and Mozzila/Gecko By Scott Andrew*/if(elm.addEventListener){elm.addEventListener(evType,fn,useCapture);return true;}else if(elm.attachEvent){var r=elm.attachEvent('on'+evType,fn);return r;}else{elm['on'+evType]=fn;}},
	getEventTarget:function(e){return window.event ? window.event.srcElement:e?e.target:null;}
};
// ********************************


var contact = {
	init: function() {
		contact.emailFormLayer = document.getElementById("form-signup");
		if(contact.emailFormLayer == undefined) return;
		contact.emailForm = $("#form-signup form")[0];
		contact.formReset(contact.emailForm);
		contact.installListeners();
	},
	installListeners: function() {
		contact.emailForm.preSubmissionEvent = contact.eventSubmission;
		$('input[type=text]',contact.emailForm).bind('focus',contact.focusField);
		$('input[type=text]',contact.emailForm).bind('blur',contact.blurField);
		$('input[type=text]',contact.emailForm).each(function(){ contact.blurField(this) });
	},
	focusField: function(e) {
		var target = contact.getEventTarget(e);
		if (!target) return;
		if (target.value != "" && target.value == target.title ) {
			target.value = "";
		}
	},
	blurField: function(e) {
		var target = (e.title) ? e : contact.getEventTarget(e);
		if (!target) return;
		if (target.value == "") {
			target.value = target.title;
		}
	},
	formReset: function(formRef) {
		for (var i=0; i<formRef.elements.length; i++) {
			if (formRef.elements[i].type == "text" || formRef.elements[i].tagName == "TEXTAREA") {
				formRef.elements[i].value = '';
			}
			$(formRef.elements[i]).removeClass("fieldErr");
		}
		var formErrors = document.getElementById("formErrors");
		if (formErrors) {
			formErrors.parentNode.removeChild(formErrors);
		}
		var submissionResponse = $(".submissionResponse")[0];
		if (submissionResponse) {
			submissionResponse.parentNode.removeChild(submissionResponse);
		}
	},
	eventSubmission: function(e) {
		rbx_cmn.kill_event(e);
		// PROCESS SUBMISSION: Send via AJAX
		var formRef = this;
		var procUrl = formRef.action;
		jQuery.post(procUrl, {
				'sendContactEmail': 'true', 
				'email': formRef.email.value
			}, function(data) {
			$(contact.emailForm).after(data);
			$(contact.emailForm).hide();
		});
	},
	getEventTarget:function(e){return window.event ? window.event.srcElement:e?e.target:null;}
};







// ********************************
// rubix common utility functions
// ................................
var rbx_cmn = {
	get_ancestor_by_tag:function(o,t){return (o==document)?null:(o.tName == t)?o:rbx_cmn.get_ancestor_by_tag(o.parentNode,t);},
	get_ancestor_by_class: function(obj, target_class) {return (obj == document)?null:(obj.className.match(target_class)) ? obj : rbx_cmn.get_ancestor_by_class(obj.parentNode, target_class);},
	get_inherited_font_size: function(obj) {return (obj == document)?-1:((obj.style.fontSize).length > 0) ? obj.style.fontSize : rbx_cmn.get_inherited_font_size(obj.parentNode);},
	kill_event: function(e) {if (window.event){window.event.cancelBubble=true;window.event.returnValue=false;window.event.srcElement.blur();}if(e&&e.stopPropagation&&e.preventDefault){e.stopPropagation();e.preventDefault();e.target.blur();}},
	is_hidden: function(obj) {if ((obj.style.display == "none"||obj.style.visibility=="hidden")) return true;return false;},
	rand:function(lower,upper){return(Math.floor((upper-(lower-1))*Math.random())+lower);}
};








/* jQuery.preloader - v0.95 - K Reeve aka BinaryKitten */
(function ($) {
	$.preLoadImages = function(imageList,callback,viewer) {
		var pic = [], i, total, loaded = 0;
		if (typeof imageList != 'undefined') {
			$.preLoadImages.imageList = imageList;
			if ($.isArray(imageList)) {
				total = imageList.length; // used later
					for (i=0; i < total; i++) {
						pic[i] = new Image();
						pic[i].relatedImg = imageList[i];
						pic[i].onload = function() {
							loaded++; // should never hit a race condition due to JS's non-threaded nature
							if (loaded == total) {
								if ($.isFunction(callback)) {
									callback(viewer);
								}
							}
						};
						pic[i].src = imageList[i].src;
					}
			}
			else {
				pic[0] = new Image();
				pic[0].onload = function() {
					if ($.isFunction(callback)) {
						callback(viewer);
					}
				}
				pic[0].src = imageList.src;
			}
		}
		pic = undefined;
	};

	$.preLoadCSSImages = function(callback) {
		var pic = [], i, imageList = [], loaded = 0, total, regex = new RegExp("url\((.*)\)",'i'),spl;
		var cssSheets = document.styleSheets, path,myRules,Rule,match,txt,img,sheetIdx,ruleIdx;
		for (sheetIdx=0;sheetIdx < cssSheets.length;sheetIdx++){
			var sheet = cssSheets[sheetIdx];
			if (typeof sheet.href == 'string' && sheet.href.length > 0) {
				spl = sheet.href.split('/');spl.pop();path = spl.join('/')+'/';
			}
			else {
				path = './';
			}
			myRules = sheet.cssRules ? sheet.cssRules : sheet.rules;
			for (ruleIdx=0;ruleIdx < myRules.length;ruleIdx++) {
				Rule = myRules[ruleIdx];
				txt = Rule.cssText ? Rule.cssText : Rule.style.cssText;
				match = regex.exec(txt);
				if (match != null) {
					img = match[1].substring(1,match[1].indexOf(')',1));
					if (img.substring(0,4) == 'http') {
						imageList[imageList.length] = img;
					}
					else if ( match[1].substring(1,2) == '/') {
						var p2 = path.split('/');p2.pop();p2.pop();p2x = p2.join("/");
						imageList[imageList.length] = p2x+img;
					}
					else {
						imageList[imageList.length] = path+img;
					}
				}
			};
		};

		total = imageList.length; // used later
		for (i=0; i < total; i++) {
			pic[i] = new Image();
			pic[i].onload = function() {
				loaded++; // should never hit a race condition due to JS's non-threaded nature
				if (loaded == total) { if ($.isFunction(callback)) { callback(); } }
			};
			pic[i].src = imageList[i];
		}

	};
	$.preLoadAllImages = function(imageList,callback) {
		if (typeof imageList != 'undefined') {
			if ($.isFunction(imageList)) { callback = imageList; }
			else if (!$.isArray(imageList)) { imageList = [imageList]; }
		}
		$.preLoadCSSImages(function(){
			if (imageList.length > 0) {
				$.preLoadImages(imageList,function(){
					callback();
				});
			}
			else { callback(); }
		});
	}
})(jQuery);




// EXTERNAL LINKS *****************
var externalLauncher={
	init:function(){
		externalLauncher.installListeners();
	},
	installListeners:function(){
		var anchors=document.getElementsByTagName('a');
		for(var i=0;i<anchors.length;i++){
			if(anchors[i].className.match('external')){
				$(anchors[i]).bind('click',externalLauncher.eventLaunch);
			}
		}
	},
	eventLaunch:function(e){
		var target = externalLauncher.getEventTarget(e);
		while (target!=document&&!(target.href)) {
			target=target.parentNode;
		}
		window.open(target.href);
		rbx_cmn.kill_event(e);
	},
	getEventTarget:function(e){return window.event?window.event.srcElement:e?e.target:null;}
};
// ********************************
