/**
	Provide front-end base for SPARC-based website's content handling and enhancements. (such as image zooms and mouseovers)
	Create generic i72 object for later additions/extensions
	
	@file		i72.js
	@path		/assets/js/i72.js
	@version	2011/10/03	- Integrated slideshow code (image AND content) into unified i72.slideshow object
	@version	2011/03/09	- Initial creation
	@copyright	2011- ignition72, inc.
	@author		Joseph Wilson
	@link		www.ignition72.com <http://www.ignition72.com/>
*/
var i72 = {

	/**
		i72.init
		Scan current page, and enhance found items
		@version	2011/03/09	- Initial creation
		@return		false
	*/
	init:function(){
		$$('.content div.on-mouseover').each(function(e){i72.image.initMouseover(e);});
		$$('.content div.on-click').each(function(e){i72.image.initZoom(e);});
		$$('.content div.faq_q').each(function(e){i72.faq.init(e);});
		$$('.content div.slideshow').each(function(e){ i72.slideshow.init(e); });
		return false;
	},


	/**
		i72.faq
		FAQ content block handling
		@version	2011/09/20	- Initial creation
	*/
	faq: {
		/**
			i72.faq.init
			Add observer to any FAQ items found on page
			@version	2011/09/20	- Initial creation
			@return		null
		*/
		init:function(e){
			e.select('a')[0].observe('click',i72.faq.showHide);
		},
		/**
			i72.faq.showHide
			capture event, show or hide related FAQ answer
			@version	2011/09/20	- Initial creation
			@return		false
		*/
		showHide:function(event){
			var faq = Event.element(event).up('div.faq_q'),
				ans = faq.down('.faq_a');
			if (ans.visible()) { faq.removeClassName('active'); } else { faq.addClassName('active'); }
			Effect.toggle(ans,'BLIND',{ duration: 0.3 });
			event.stop();
			return false;
		}
	},




	/**
		i72.image
		image-enhancement object
		@version	2011/03/09	- Initial creation
	*/
	image: {

		/**
			i72.image.initMouseover
			Set observers prototype-based mouseover support for images with mouseovers set in SPARC
			@version	2011/03/09	- Initial creation
		*/
		initMouseover:function(e){
			e.down('a').observe('mouseover',function(ev){
				Event.element(ev).up('div').select('img').each(function(im){im.hasClassName('first-img') ? im.hide() : im.show();});
				ev.stop();
			}).observe('mouseout',function(ev){
				Event.element(ev).up('div').select('img').each(function(im){im.hasClassName('first-img') ? im.show() : im.hide();});
				ev.stop();
			});
		},

		/**
			i72.image.initZoom
			Set observers for images with zoom and secondary images set in SPARC
			@version	2011/03/09	- Initial creation
		*/
		initZoom:function(e){
			e.down('a').observe('click',i72.image.zoom);
		},

		/**
			i72.image.zoom
			Provide prototype-based lightbox-style click-zoom support for images with zoom and secondary images set in SPARC
			This creates necessary containers if none exist when requested
			@version	2011/03/09	- Initial creation
		*/
		zoom:function(ev){
			var target = Event.element(ev).up('div');
			ev.stop();
			var cover = false,
				imagewrap = false;
			if ($$('.i72-cover').length === 0) {
				cover = $(document.createElement('div'));
				imagewrap = $(document.createElement('div'));
				$(document.body).insert(cover).insert(imagewrap);
				cover.setStyle({
					display:'none',
					position:'fixed',
					top:0,
					left:0,
					backgroundColor:'#000',
					height:'100%',
					width:'100%',
					zIndex:7200
				});
				cover.observe('click',i72.image.zoomClose);
				imagewrap.observe('click',i72.image.zoomClose);
				cover.addClassName('i72-cover');
				imagewrap.addClassName('i72-imagewrap');
			} else {
				cover = $$('.i72-cover')[0];
				imagewrap = $$('.i72-imagewrap')[0];
			}
			var img = target.down('.second-img'),
				newimg = new Image(),
				imgsize = img.getDimensions(),
				coversize = cover.getDimensions();
			imgsize.width = (imgsize.width > (coversize.width + 60)) ? coversize.width - 60: imgsize.width;
			imgsize.height = (imgsize.height > (coversize.height + 60)) ? coversize.height - 40: imgsize.height;
			imagewrap.setStyle({
				display:'none',
				position:'fixed',
				top:'50%',
				left:'50%',
				marginTop:'-' + Math.round((imgsize.height + 40) / 2) + 'px',
				marginLeft:'-' + Math.round((imgsize.width + 40) / 2) + 'px',
				backgroundColor: '#fff',
				paddingTop:'40px',
				height:(imgsize.height + 40) + 'px',
				width:(imgsize.width + 40) + 'px',
				zIndex:7201,
				overflow:'auto'
			});
			newimg.src = img.src;
			imagewrap.insert(newimg);
			Effect.Appear(cover,{from:0,to:0.6,duration:0.3});
			Effect.Appear(imagewrap,{from:0,to:1,duration:0.3});
		},

		/**
			i72.image.zoomClose
			Hide zoom UI, removes created image element
			This creates necessary containers if none exist when requested
			@version	2011/03/09	- Initial creation
		*/
		zoomClose: function(){
			var cover = $$('.i72-cover')[0],
				imagewrap = $$('.i72-imagewrap')[0];
			Effect.Fade(cover,{from:0.6,to:0,duration:0.3});
			Effect.Fade(imagewrap,{from:1,to:0,duration:0.3,afterFinish:function(){imagewrap.down('img').remove();}});
		}
	},

	multicol: {
		equalize: function(){
			$$('.multicol_v2_wrap').each(function(e){
				/* e = multicolumn wrapper element */
				var cols = e.childElements(),
					nheight = 0;
				cols.each(function(d){
					/* d = .multi-col elements to compare sizes */
					nheight = (nheight < d.getHeight()) ? d.getHeight() : nheight;
				});
				cols.each(function(d){
					if (!d.hasClassName('clear')) {
						d.setStyle({ height: nheight + 'px' });
					}
				});
			});
			return false;
		}
	},


	/* ! i72.slideshow */
	slideshow: {
		/* ! i72.slideshow.raw */
		raw: {},
		/* ! i72.slideshow.shows */
		shows: {},
		/* ! i72.slideshow.init */
		init: function (ele){
			var id = this.grabId(ele);
			this.shows[id] = {};
			this.shows[id].options = i72.slideshow.raw[id].evalJSON();
			this.shows[id].timer = false;
			this.shows[id].frames = ele.down('.slideshow-mask').childElements().length;
			this.setHandlers(ele);
			if (this.shows[id].options.animate) {
				i72.slideshow.shows[id].timer = setTimeout(function(){
					i72.slideshow.autoswap(ele);
				},(i72.slideshow.shows[id].options.duration * 1000));
			}
		},
		/* ! i72.slideshow.grabActive */
		grabActive: function(ele){
			return ele.down('.slideshow-nav-wrap').select('li.active-slide')[0];
		},
		/* ! i72.slideshow.grabId */
		grabId: function(ele){
			return ele.id.split('-').pop();
		},
		/* ! i72.slideshow.grabShow */
		grabShow: function(ele){
			return ele.up('div.slideshow').id.split('-')[1];
		},

		/* ! i72.slideshow.clearHandlers */
		clearHandlers: function(ele){
			$(ele).select('.slide-nav>a').each(function(e){
				e.stopObserving();
			});
			$(ele).down('.slideshow-nav-wrap').select('li>a').each(function(e){
				e.stopObserving();
			});
		},

		/* ! i72.slideshow.setHandlers */
		setHandlers: function(ele){
			var id = this.grabId(ele);
			i72.slideshow.clearHandlers(ele);
			if (i72.slideshow.shows[id].options.show_nav == 1) {
				ele.select('.slide-nav>a').each(function(e){
					e.observe('click',i72.slideshow.prevNext);
				});
			}
			if (i72.slideshow.shows[id].options.show_indicators == 1) {
				ele.down('.slideshow-nav-wrap').select('li>a').each(function(e){
					e.observe('click',i72.slideshow.jumpToSlide);
				});
			}
		},

		/* ! i72.slideshow.swapstyles */
		swapStyles: function(oldli,newli,olddiv,newdiv){
			[oldli,olddiv].each(function(e){ e.removeClassName('active-slide'); });
			[newli,newdiv].each(function(e){ e.addClassName('active-slide'); });
		},

		/* ! i72.slideshow.autoswap */
		autoswap: function(ele){
			i72.slideshow.clearHandlers(ele);
			var id = i72.slideshow.grabId(ele),
				li = i72.slideshow.grabActive(ele);
				oldindex = li.classNames().toArray()[0].split('-').pop() * 1,
				newindex = (li.hasClassName('last-frame')) ? 0 : oldindex + 1;
			i72.slideshow.effects(ele,oldindex,newindex,'next');
			if (i72.slideshow.shows[id].options.animate) {
				clearTimeout(i72.slideshow.shows[id].timer);
				i72.slideshow.shows[id].timer = setTimeout(function(){
					i72.slideshow.autoswap(ele);
				},(i72.slideshow.shows[id].options.duration * 1000));
			}
		},
		/* ! i72.slideshow.prevNext */
		prevNext: function(event){
			var div = Event.element(event).up('div.slide-nav'),
				ele = div.up('div.slideshow'),
				id = i72.slideshow.grabId(ele),
				li = i72.slideshow.grabActive(ele),
				oldindex = li.classNames().toArray()[0].split('-').pop() * 1,
				which = (div.hasClassName('prev')) ? 'prev': 'next';
			i72.slideshow.clearHandlers(ele);
			switch (div.hasClassName('prev')) {
				case true:
					var newindex = (li.hasClassName('first-frame')) ? (i72.slideshow.shows[id].frames - 1) : oldindex - 1;
					break;
				case false:
					var newindex = (li.hasClassName('last-frame')) ? 0 : oldindex + 1;
					break;
			}
			i72.slideshow.effects(ele,oldindex,newindex,which);
			if (i72.slideshow.shows[id].options.animate) {
				clearTimeout(i72.slideshow.shows[id].timer);
				i72.slideshow.shows[id].timer = setTimeout(function(){
					i72.slideshow.autoswap(ele);
				},(i72.slideshow.shows[id].options.duration * 3000));
			}
		},
		/* ! i72.slideshow.jumpToSlide */
		jumpToSlide: function (event) {
			var newli = Event.element(event).up('li'),
				ele = newli.up('div.slideshow'),
				id = i72.slideshow.grabId(ele);
				oldli = i72.slideshow.grabActive(ele),
			i72.slideshow.clearHandlers(ele);
			if (newli.hasClassName('active-slide')) {
				i72.slideshow.setHandlers(ele);
				return;
			}
			var oldindex = oldli.classNames().toArray()[0].split('-').pop() * 1,
				newindex = newli.classNames().toArray()[0].split('-').pop() * 1;
			i72.slideshow.effects(ele,oldindex,newindex,'next');
			if (i72.slideshow.shows[id].options.animate) {
				clearTimeout(i72.slideshow.shows[id].timer);
				i72.slideshow.shows[id].timer = setTimeout(function(){
					i72.slideshow.autoswap(ele);
				},(i72.slideshow.shows[id].options.duration * 3000));
			}
		},
		/* ! i72.slideshow.effects */
		effects: function(ele,oldindex,newindex,which){
			var id = i72.slideshow.grabId(ele),
				oldli = ele.down('.slideshow-nav-wrap').select('li')[oldindex],
				newli = ele.down('.slideshow-nav-wrap').select('li')[newindex],
				oldDiv = ele.down('.slideshow-mask').select('.slideshow-frame')[oldindex],
				newDiv = ele.down('.slideshow-mask').select('.slideshow-frame')[newindex];
			switch (i72.slideshow.shows[id].options.transition) {
				case 'fadeout':
					Effect.Fade(oldDiv,{ duration: 0.5,
						afterFinish: function(){
							Effect.Appear(newDiv,{ duration: 0.5,
								afterFinish: function(){
									i72.slideshow.swapStyles(oldli,newli,oldDiv,newDiv);
									i72.slideshow.setHandlers(ele);
								}
							});
						}
					});
					break;
				case 'fadein':
					newDiv.setStyle({zIndex:100});
					oldDiv.setStyle({zIndex:50});
					Effect.Appear(newDiv,{ duration: 0.5,
						afterFinish: function(){
							oldDiv.hide();
							i72.slideshow.swapStyles(oldli,newli,oldDiv,newDiv);
							i72.slideshow.setHandlers(ele);
						}
					});
					break;
				case 'slide-out':
					switch (which) {
						case 'prev':
							newDiv.setStyle({'left': '-' + newDiv.getDimensions().width + 'px' });
							newDiv.show();
							new Effect.Parallel([
								new Effect.Morph(newDiv,{
									style:'left:' + oldDiv.getStyle('left'),
									transition: Effect.Transitions.sinoidal
								}),
								new Effect.Morph(oldDiv,{
									style:'left:' + (oldDiv.getDimensions().width + (oldDiv.positionedOffset()[0] * 2)) + 'px',
									transition: Effect.Transitions.sinoidal,
									afterFinish: function(){
										oldDiv.hide();
										i72.slideshow.swapStyles(oldli,newli,oldDiv,newDiv);
										i72.slideshow.setHandlers(ele);
										oldDiv.hide();
									}
								})
							]);
							break;
						case 'next':
							newDiv.setStyle({'left': (oldDiv.positionedOffset()[0] * 2) + oldDiv.getDimensions().width + 'px' });
							newDiv.show();
							new Effect.Parallel([
								new Effect.Morph(newDiv,{
									style:'left:' + oldDiv.positionedOffset()[0] + 'px',
									transition: Effect.Transitions.sinoidal
								}),
								new Effect.Morph(oldDiv,{
									style:'left: -' + (oldDiv.getDimensions().width + oldDiv.positionedOffset()[0]) + 'px',
									transition: Effect.Transitions.sinoidal,
									afterFinish: function(){
										oldDiv.hide();
										i72.slideshow.swapStyles(oldli,newli,oldDiv,newDiv);
										i72.slideshow.setHandlers(ele);
										oldDiv.hide();
									}
								})
							]);
							break;
						}
				}
		}
	}
};

/* set event handler to fire on dom:loaded */
document.observe('dom:loaded',i72.init);