/* ############################################# */
/* #  Calliope Studios                         # */
/* # ......................................... # */
/* #  @pgold - 12 NOV 2008                     # */
/* ############################################# */



// Initialize globals
var page_init = function() {
   cScroller.init();
	validate.init();
	contact.init();
	backToTop.init();
	externalLauncher.init();      // External links
   fixHeaderWidth();             // set header width for ie overflow
   textWindows.init();		 // show and hide text window for portfolio galleries
}
$(document).ready(page_init);


function fixHeaderWidth() {
	var siteHeader = $('.site-header')[0];
	if (document.body.className.match("browser-Opera")) {
	   siteHeader.style.overflow = "hidden";
	   siteHeader.style.position = "relative";
	} else if (document.body.className.match("browser-Internet_Explorer_6")) {
	   siteHeader.style.width = siteHeader.offsetWidth+"px";
   }
}

var backToTop = {
   init: function() {
      var btt = $(".btn-top");
      for (var i=0; i<btt.length; i++) {
         $(btt[i]).bind("click",function(e){ window.scroll(0,0); rbx_cmn.kill_event(e); });
      }      
   }
};


// 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;}
};
// ********************************



// Horizontal Scroller *****************
var cScroller = {
   init: function() {
      cScroller.contentScrollers = $(".component-scroller");
      for (var i=0; i<cScroller.contentScrollers.length; i++) {
         cScroller.construct(cScroller.contentScrollers[i]);
      }
      $(document.body).addClass("cScrollerLoaded");
   },
   construct: function(component) {
      component.scroller = $('.scroller',component)[0];
      component.scroller.component = component;
      component.scroller.curPos = 0;
      component.scroller.curIdx = 0;
      cScroller.calc_scroll_width(component.scroller);

      $(component.scroller).after(cScroller.construct_btn_shift(component,"prev"));
      $(component.scroller).after(cScroller.construct_btn_shift(component,"next"));

      $(component.scroller).wrap(rbx_cmn.create_elm("div","frame"));

      var divPagination = cScroller.construct_pagination(component);
      $(component.scroller.parentNode).after(divPagination);
      component.pagination = $("li:not(.action-btn)",divPagination);

      /*var launch = rbx_cmn.create_elm("li","action-btn btn-launch");
      var extLink = $(".btn-launch a",component)[0];
      if (extLink) {
         $(launch).append(extLink);
         $(divPagination).prepend(launch);
      }

      var backToTop = rbx_cmn.create_elm("li","action-btn btn-top");
      var topLink = rbx_cmn.create_elm("a");
      $(topLink).text("Back to Top");
      $(backToTop).append(topLink);
      $(divPagination).append(backToTop);
	  */
      cScroller.setCurIdx(component.scroller);
   },
   construct_btn_shift: function(component,direction) {
      var div = rbx_cmn.create_elm("div","btn-shift");
      $(div).addClass(direction);
      anchor = rbx_cmn.create_elm("a");
      anchor.scroller = component.scroller;
      div.appendChild(anchor);
      if (direction == "prev") {
         $(anchor).html("&laquo;");
         $(anchor).bind("click",cScroller.scrollPrev);
         $(component.scroller).before(div);
         component.btnPrev = anchor;
      } else {
         $(anchor).html("&raquo;");
         $(anchor).bind("click",cScroller.scrollNext);
         $(component.scroller).after(div);
         component.btnNext = anchor;
      }
      return div;
   },
   construct_pagination: function(component) {
      var pagination = rbx_cmn.create_elm("ul","pagination");
      component.scroller.contentList = $(".scroller > li",component);
      for (var i=0; i<component.scroller.contentList.length; i++) {
         var ctr = i+1;
         var li = rbx_cmn.create_elm("li");
         var anchor = rbx_cmn.create_elm("a");
         anchor.component = component;
         $(anchor).text(ctr);
         $(anchor).bind("click",cScroller.scrollToIdx)
         li.appendChild(anchor);
         pagination.appendChild(li);
       }
       return pagination;
   },
   calc_scroll_width: function(scroller) {
      var items = $(".scroller > li",scroller.component);
      var width = 0;
      for (var i=0; i<items.length; i++) {
         width += items[i].offsetWidth;
      }
      scroller.style.width = width;
      scroller.items = items;
   },
   scrollNext: function(e) {
      var btn = rbx_cmn.e_target(e);
      rbx_cmn.kill_event(e);
      cScroller.scroll(btn.scroller);
   },
   scrollPrev: function(e) {
      var btn = rbx_cmn.e_target(e);
      rbx_cmn.kill_event(e);
      cScroller.scroll(btn.scroller,1,true);
   },
   scroll: function(target,numShift,reverse) {
      if (!numShift) { numShift = 1; }
      var direction = (reverse) ? 1 : -1;
      if ( (target.curIdx == (target.items.length-1)) && !reverse  ) {
         return;
      } else if ( (target.curIdx == 0) && reverse ) {
         return;
      } else {
         target.curIdx-=(direction*numShift);
      }

      var offset = target.curPos;
      for (var x=0; x<numShift; x++) {
         offset += (direction)*target.items[target.curIdx].offsetWidth;
      }
      target.curPos = offset;
      $(target).animate({ left: offset }, 600, "swing", setTimeout(function(){cScroller.setCurIdx(target)},600) );
   },
   setCurIdx: function(target) {
      for (var i=0; i<target.component.pagination.length; i++) {
         if (i == (target.curIdx)) {
            $(target.component.scroller.contentList[target.curIdx]).addClass("selected");
            $(target.component.pagination[target.curIdx]).addClass("selected");
         } else {
            $(target.component.scroller.contentList[i]).removeClass("selected");
            $(target.component.pagination[i]).removeClass("selected");
         }
      }

      if (target.curIdx == (target.items.length-1)) {
         $(target.component.btnNext).addClass("disabled");
      } else {
         $(target.component.btnNext).removeClass("disabled");
      }
      if (target.curIdx == 0) {
         $(target.component.btnPrev).addClass("disabled");
      } else {
         $(target.component.btnPrev).removeClass("disabled");
      }
   },
   scrollToIdx: function(e) {
      var idxLink = rbx_cmn.e_target(e);
      rbx_cmn.kill_event(e);
      var component = idxLink.component;
      for (var i=0; i<component.pagination.length; i++) {
         if (idxLink.parentNode == component.pagination[i]) {
            if (i > component.scroller.curIdx) {
               cScroller.scroll(component.scroller,(i - component.scroller.curIdx),false);
            } else if (i < component.scroller.curIdx) {
               cScroller.scroll(component.scroller,(component.scroller.curIdx - i),true);
            }
            break;
         } 
      }
   }
};

var textWindows = {
	init: function() {
		buttons = $(".show-text");
		for (var i=0; i<buttons.length; i++) {
			var parent = $(buttons[i]).closest(".content-block");
			var gallery = $(parent).children(".component-scroller");
			var text = $(parent).children(".text-container");
			textWindows.addActions(buttons[i],gallery,text);
			$(buttons[i]).children(".alt").hide();
			$(text).hide();
		}
	},
	addActions: function(target,gallery,text) {
		$(target).click(function() {
			$(this).children('span').toggle();
			$(gallery).toggle();
			$(text).toggle();
		});
	}
}



// FORM VALIDATION ***************
var validate = {
	validationSet: {
		'name': {
			'regexp': /^(\w+\s?)+$/,
			'error': 'Please enter a valid name.'
		},
		'email': {
			'regexp': /^.+?@.+?\..+?$/,
			'error': 'Please enter a valid email address.'
		},
		'message': {
			'regexp': /.{10,512}/,
			'error': 'Please enter a message 10-512 characters long.'
		}
	},
	init: function() {
		validate.installListeners();
	},
	installListeners: function() {
		if(document.getElementById('commentform')) return; // disable for blog comment form
		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) {
      if (e.tagName!="FORM") {
		   rbx_cmn.kill_event(e);
		   var target = validate.getEventTarget(e);
		   var frm = (target.tagName=="INPUT") ? target.form : target;
		} else {
		   frm = e;
		}
		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("email-form-layer");
		if(contact.emailFormLayer == undefined) return;
		contact.emailForm = $("#email-form-layer form")[0];
		contact.installListeners();
		var submitLinks = $("a.form-submit");
		for (var i=0; i<submitLinks.length; i++) {
		   submitLinks[i].form = contact.emailForm;
	      $(submitLinks[i]).bind("click",contact.submitForm);
	   }
	},
	submitForm: function(e) {
	   target = rbx_cmn.e_target(e);
		rbx_cmn.kill_event(e);
      validate.checkValidSubmit(target.form);
   },
	installListeners: function() {
		contact.emailForm.preSubmissionEvent = contact.eventSubmission;
		var btnEmail = document.getElementById("btnEmailUs");
		if (btnEmail) {
			$(btnEmail).bind("click",contact.launch);
			var btnClose = $(".btnClose",contact.emailFormLayer);
			if (btnClose) {
				$(btnClose).bind("click",contact.close);
			}
			$(window).bind("click",contact.layerFocusLost);
		}
	},
	launch: function(e) {
		rbx_cmn.kill_event(e); 
		$(contact.emailFormLayer).fadeIn(250);
		contact.emailFormLayer.isVisible = true;
	},
	close: function(e) {
		rbx_cmn.kill_event(e);
		if(contact.emailFormLayer.isVisible) {
			$(contact.emailFormLayer).fadeOut(250);
			contact.emailFormLayer.isVisible = false;
		}
		setTimeout(function(){contact.formReset(contact.emailForm)},1000);
	},
	layerFocusLost: function(e) {
		var oElem = e.target;
		do {
			if (oElem.id == "email-form-layer" 
				|| ((oElem.tagName == "A") && (oElem.href != ""))
				|| oElem.tagName == "INPUT") {
				return;
			}
			oElem = oElem.parentNode;
		} while (oElem.parentNode != document);
		contact.close(e);
	},
	formReset: function(formRef) {
		$(formRef).fadeIn(300);
		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', 
			'name':    formRef.name.value, 
			'email':   formRef.email.value, 
			'message': formRef.message.value
			}, function(data) {
			$(contact.emailForm).after(data);
			$(contact.emailForm).hide();
			setTimeout(function(){contact.close()},3000);
		});
	}
};







// ********************************
// rubix common utility functions
// ................................
var rbx_cmn = {
   create_elm: function(tag,className,id) {
      var elm = document.createElement(tag);
      if (className) { $(elm).addClass(className); }
      if (id) { elm.id = id; }
      return elm;
   },
	get_ancestor_by_tag: function(obj, tag) {
		if (obj == document) return null;
		return (obj.tagName == tag) ? obj : rbx_cmn.get_ancestor_by_tag(obj.parentNode, tag);
	},
	get_ancestor_by_class: function(obj, target_class) {
		if (obj == document) return null;
		return (obj.className.match(target_class)) ? obj : rbx_cmn.get_ancestor_by_class(obj.parentNode, target_class);
	},
	get_inherited_font_size: function(obj) {
		if (obj == document) return -1;
		return ((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); },
	e_target: function(e){return window.event?window.event.srcElement:e?e.target:null;}
};
// ********************************


// ********************************
// rubix ajax methods
// ................................
var rbxAjax = {
	xmlHttp: null,
	getXmlHttpObject: function() {
		try {  // Firefox, Opera 8.0+, Safari
			return xmlHttp=new XMLHttpRequest();
		} catch (e) {  // Internet Explorer
			try {
				return xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				return xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
	},
	getXML: function(xmlPath,callback) {
		if (xmlPath.length==0) return;
		rbxAjax.xmlHttp=rbxAjax.getXmlHttpObject();
		if (!rbxAjax.xmlHttp){ alert ("Your browser does not support AJAX!"); return; }
		if (rbxAjax.xmlHttp.overrideMimeType) rbxAjax.xmlHttp.overrideMimeType('text/xml');
		if (callback) rbxAjax.stateChanged.callback = callback;
		rbxAjax.xmlHttp.onreadystatechange=rbxAjax.stateChanged;
		rbxAjax.xmlHttp.open("GET", xmlPath, true);
		rbxAjax.xmlHttp.send(null);
	},
	stateChanged: function() {
		if (rbxAjax.xmlHttp.readyState==4) {
			if (rbxAjax.xmlHttp.status==200) {
				if (rbxAjax.stateChanged.callback) { // if we have defined a callback
					var parseSuccess = rbxAjax.stateChanged.callback(rbxAjax.xmlHttp.responseXML); //retrieve result as an XML object and pass to callback 
					if (parseSuccess == false) alert("Cannot understand data returned by the server!");
				}
			}
		}
	}
};
// ********************************



