// Spread the contents of a container horizontally. Contents are assumed to share
// the same element tag name. The optional filter parameter specifies a class to
// which an element must belong; this option is useful when handling pull-down menus
// implemented as nested lists. R. Abeles 11/16/2007.

// 06/09/2008 rabeles: use lMargin to balance spread() presentation
// 07/08/2008 rabeles: correct off-by-one error in FireFox 3.0
// 09/26/2008 rabeles: add grow function to increase vertical size to a minimum

function spread(container, elements, filter)
{
	container = $(container);
	elements = $A(container.getElementsByTagName(elements));
	var cWidth = container.getWidth();
	cWidth -= (parseInt(container.getStyle('padding-left')));
	cWidth -= (parseInt(container.getStyle('padding-right')));
	var eWidth = 0;
	var eCtr = 0;
	
	elements.each(function (e) {
		e = $(e);
		if ((filter == null) || (e.hasClassName(filter))) {
			eCtr++;
			eWidth += e.getWidth();
			e.setStyle( {marginLeft: 0, marginRight: 0} );
		}
	});
	
	// FF 3.0 appears to have an off-by-one error, so we sacrifice a pixel	
	var cFill = cWidth - eWidth - 1;
	
	if ((cFill > 0) && (eCtr > 1)) {
		var eMargin = Math.floor(cFill / (eCtr - 1));
		var lMargin = 0;
		var rMargin = 0;
		cFill -= eMargin * (eCtr - 1);
		if (cFill > 0) {
			rMargin = Math.floor(cFill / 2);
			lMargin = cFill - rMargin;
		}
		var first = true;
		elements.each(function (e) {
			if ((filter == null) || (e.hasClassName(filter))) {
				eCtr--;
				if (first) {
					e.setStyle( {marginLeft: lMargin + 'px'} );
					first = false;
				}
				if (eCtr != 0) {
					e.setStyle( {marginRight: eMargin + 'px'} );
				} else {
					e.setStyle( {marginRight: rMargin + 'px'} );
				}
			}
		});
	}
}

function spread2(container, container2, etag, filter)
{
	container = $(container);
	container2 = $(container2);
	var elements = $A(container.getElementsByTagName(etag));
	var cWidth = container.getWidth();
	cWidth -= (parseInt(container.getStyle('padding-left')));
	var eWidth = 0;
	var eCtr = 0;
	
	elements.each(function (e) {
		e = $(e);
		if ((filter == null) || (e.hasClassName(filter))) {
			eCtr++;
			eWidth += e.getWidth();
			e.setStyle( {marginLeft: 0, marginRight: 0} );
		}
	});
	
	var cFill = cWidth - eWidth;
	
	if ((cFill > 0) && (eCtr > 1)) {
		var eMargin = Math.floor(cFill / (eCtr - 1));
		var lMargin = 0;
		var rMargin = 0;
		cFill -= eMargin * (eCtr - 1);
		if (cFill > 0) {
			rMargin = Math.floor(cFill / 2);
			lMargin = cFill - rMargin;
		}
		var first = true;
		elements.each(function (e) {
			if ((filter == null) || (e.hasClassName(filter))) {
				eCtr--;
				if (first) {
					first = false;
				}
				if (eCtr != 0) {
					e.setStyle( {marginRight: eMargin + 'px'} );
				} else {
					e.setStyle( {marginRight: rMargin + 'px'} );
				}
			}
		});

		elements = $A(container2.getElementsByTagName(etag));

		elements.each(function (e) {
			e = $(e);
			if ((filter == null) || (e.hasClassName(filter))) {
				e.setStyle( {marginLeft: 0, marginRight: eMargin + 'px'} );
			}
		});
	}
}

function balance_right(left, right, overhang) {
	left = $(left);
	right = $(right);
	
	var lBot = left.getHeight() + Position.cumulativeOffset(left)[1];
	var rBot = right.getHeight() + Position.cumulativeOffset(right)[1];
		
	if (rBot < (lBot + overhang)) {
		var rPad = right.getHeight();
		var rAdj = lBot + overhang - rBot;
		rPad += rAdj;
		right.setStyle({height: rPad + 'px'});
	} else if (rBot > (lBot + overhang)) {
		var lPad = left.getHeight();
		var lAdj = rBot + overhang - lBot;
		lPad += lAdj;
		left.setStyle({height: lPad + 'px'});
	}
}

function balance_both(left, right) {
	left = $(left);
	right = $(right);
	
	var lBot = left.getHeight() + Position.cumulativeOffset(left)[1];
	var rBot = right.getHeight() + Position.cumulativeOffset(right)[1];
		
	if (rBot < lBot) {
		var rPad = right.getHeight();
		var rAdj = lBot - rBot;
		rPad += rAdj;
		right.setStyle({height: rPad + 'px'});
	} else if (rBot > lBot) {
		var lPad = left.getHeight();
		var lAdj = rBot - lBot;
		lPad += lAdj;
		left.setStyle({height: lPad + 'px'});
	}
}

function align(left, right) {
	left = $(left);
	right = $(right);
	
	var lTop = Position.cumulativeOffset(left)[1];
	var rTop = Position.cumulativeOffset(right)[1];
	
	if (rTop < lTop) {
		var rPad = parseInt(left.getStyle('padding-top'));
		rPad += (lTop - rTop);
		right.setStyle({paddingTop: rPad + 'px'});
	}
}

function grow(elem, hMin) {
	elem = $(elem);

	hElem = elem.getHeight();

	if (hElem < hMin) {
		elem.setStyle({height: hMin + 'px'});
	}
}

// Modified scriptaculous combined effect Pulsate. Now takes the following optional
//  parameters:
//	
//	startOpacity	element begins pulse at this opacity value
//	endOpacity		element ends half-cycle of pulse at this opacity value
//	oldOpacity		element opacity at end of pulse effect (usually same as startOpacity,
//					if omitted, behavior defaults to the original scriptaculous behavior
//					that exhibits odd artifacts if pulsate is started multiple times on
//					the same element.
//					already in progress on the selected element.
//	duration		floating-point total seconds in pulse effect
//	transition		transition effect (defaults to Effect.Transitions.sinoidal)
//	pulses			number of times pulse effect repeats
//	afterFinish		function(element) that fires after the effect finishes
//
Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || { };
  var startOpacity = options.startOpacity || 0.0;
  var endOpacity = options.endOpacity || 1.0;
  var oldOpacity = options.oldOpacity || element.getInlineOpacity();
  var duration = options.duration || 2.0;
  var transition = options.transition || Effect.Transitions.sinoidal;
  var pulses = options.pulses || 3;
  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, pulses)) };
  reverser.bind(transition);
  var afterFinish = options.afterFinish || Prototype.emptyFunction;
  return new Effect.Opacity(element, 
	Object.extend(Object.extend({  duration: duration, from: endOpacity, to: startOpacity,
	  afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); afterFinish(effect.element);}
	}, options), {transition: reverser}));
};

// Event observer that begins pulsation. Serialized by this.__pulsate.
//
function pulsate(event) {
	if (Object.isUndefined(this.__pulsate) || !this.__pulsate) {
		this.__pulsate = true;
		Effect.Pulsate(this, {pulses: 2,
                              startOpacity: 0.45,
                              endOpacity: 1.0,
                              oldOpacity: 0.45,
                              duration: 3.0,
                              afterFinish: function(element) {element.__pulsate = false;}
		                     });	
	}	
}

//--------------------------------------
// Portfolio page UA implementation
//
//--------------------------------------
function port_initialize(container) {
	// install focus handlers on each thumbnail button object in the tray container; select the first button/slide for display

	var container_obj = $(container);
	container_obj.next_slide = '';
	container_obj.animating = false;

	var elements = container_obj.select('li.port_nav_button');
	var idx = 0;
	elements.each(function(e) {
		Event.observe(e, 'click', bfocus_in.bindAsEventListener(e, elements));
		Event.observe(e, 'mouseout',  bfocus_out.bindAsEventListener(e, elements));
		if (idx == 0) {
			e.port_focus = true;
			e.addClassName('port_nav_button_selected');
		} else {
			e.port_focus = false;
		}
		e.port_slide = 'port_pix_frame' + idx;
		e.port_frame = container;
		$(e.port_slide).port_button = e;
		idx++;
	});
}

function bfocus_in(event, elements) {
	// serialize animation and ignore re-selection of current slide
	var frame = $(this.port_frame);
	if (this.port_focus)
		return;
	if (frame.animating) {
		frame.next_slide = this;
		return;
	}
	frame.animating = true;
	// remove focus from previous button / start transition-out on current slide
	elements.each(function(e) {
		if (e.port_focus == true) {
			e.port_focus = false;
			Effect.Fade(e.port_slide, {duration: 0.5,
                                       queue: 'end',
                                       afterFinish: function(e) {e.element.port_button.removeClassName('port_nav_button_selected');}});
		}
	});
	// give focus to current button / start transition-in on current slide
	this.port_focus = true;
	Effect.Appear(this.port_slide, {duration: 0.5,
                                    queue: 'end',
                                    afterSetup: function(e) {
						e.element.port_button.addClassName('port_nav_button_selected');
                                    },
									afterFinish: function(e) {
                        var frame = $(e.element.port_button.port_frame);
                        frame.animating = false;
                        if (frame.next_slide != '') {
                          // fake mouseover event to switch to next_slide
                          var next_button = frame.next_slide;
                          frame.next_slide = '';
                          bfocus_in.bind(next_button)('', elements);
                        }
                                    }});
}

function bfocus_out(event, elements) {
}

// based on suckerfish hover workaround for internet explorer
function ie_hover_fix() {
	if (Prototype.Browser.IE) {
		// The devil lives in Redmond. 
		var ar_version = navigator.appVersion.split("MSIE");
		var ie_version = parseFloat(ar_version[1]);
		
		if ((ie_version >= 5.5) && (ie_version < 7.0)) {
			var elements = $$('.ie_hover_detect');
			elements.each(function(e) {
				Event.observe(e, 'mouseover', hover_on.bindAsEventListener(e));
				Event.observe(e, 'mouseout',  hover_off.bindAsEventListener(e));
			});
		}
	} 
}

function hover_on() {
	this.addClassName('ie_hover');
}

function hover_off() {
	this.removeClassName('ie_hover');
}

function start_slideshow(slide_id, start_frame, end_frame, delay) {
	setTimeout(switch_slides(slide_id, start_frame, start_frame, end_frame, delay), delay);
}

function switch_slides(slide_id, frame, start_frame, end_frame, delay) {
	return (function() {
		Effect.Fade(slide_id + frame, {duration: 1.5, queue: 'end'});
		frame = (frame == end_frame)? start_frame : frame + 1;
		Effect.Appear(slide_id + frame, {duration: 1.5, queue: 'end'});
		slide_show.current_sidx = frame;
		setTimeout(switch_slides(slide_id, frame, start_frame, end_frame, delay), delay + 3000);
	})
}

var slide_show={};

var Slide_preloader = Class.create({
	initialize: function(callback) {
		this.callback = callback;
		this.loaded = 0;
		this.processed = 0;
		this.images = new Array;
		this.total_images = slide_show.slide_count;
		for (var i = 0; i < this.total_images; i++) {
			this.preload(slide_show.slides[i], i);
		}; 
	},
	
	preload: function(slide, slide_idx) {
		var image = $(new Image);
		this.images.push(image);
		image.onload = Slide_preloader.prototype.on_load;
		image.onerror = Slide_preloader.prototype.on_error;
		image.onabort = Slide_preloader.prototype.on_abort;
		image.pptr = this;
		image.loaded = false;
		if (null != slide[7].firstChild)
			image.alt = slide[7].firstChild.data;
		if (null != slide[8].firstChild)
			image.captext = slide[8].firstChild.data;
		image.sidx = slide_idx;
		image.setStyle({width: (slide[5].firstChild.data) + 'px', height: (slide[6].firstChild.data)});
		image.src = slide[0].firstChild.data;
	},

	on_complete: function() {
		this.processed++;
		if (this.processed == this.total_images)
			this.callback(this.images, this.loaded);
	},

	on_load: function() {
		this.pptr.loaded++;
		this.loaded = true;
		this.pptr.on_complete();
	},

	on_error: function() {
		this.pptr.on_complete();
	},

	on_abort: function() {
		this.pptr.on_complete();
	}
});

function parse_slideshow_xml(transport)
{
	var response = transport.responseXML;
	slide_show.response = response;
	var doc_root  = response.getElementsByTagName('show')[0];
	slide_show.show_name = doc_root.attributes.getNamedItem("show_name").value;
	var slides = $A(doc_root.getElementsByTagName("slides")[0].getElementsByTagName("slide"));
	slide_show.slides = slides.collect(function(slide, index){return slide.childNodes;});
	slide_show.slide_count = doc_root.getElementsByTagName("slide_count")[0].firstChild.data;
	slide_show.max_h = doc_root.getElementsByTagName("max_h")[0].firstChild.data;

	show_slideshow();
}

function load_slideshow_xml(show_name){
	new Ajax.Request("getslideshow.php?shownm="+show_name,
						{
							method: "get",
							onSuccess: parse_slideshow_xml
						}
					);
}

function load_slideshow(show_name) {
	// load and parse slideshow XML data
	load_slideshow_xml(show_name);
}

function zoom_in(event, sidx) {
	// serialize creation of enlarged image
	if (this.zooming)
		return;
	this.zooming = true;

	var sidx = slide_show.current_sidx;

	$('main_slide_box').setStyle({cursor: 'wait'});

	// load full-sized slide
	new_frame = $(document.createElement('div'));
	new_frame.setAttribute('id', 'main_zoom_full_slide');
	var slide = slide_show.slides[sidx];
	var image = $(new Image);
	this.full_image = image;
	image.loaded = false;
	if (null != slide[7].firstChild)
		image.alt = slide[7].firstChild.data;
	if (null != slide[8].firstChild)
		new_frame.captext = slide[8].firstChild.data;
	image.images = this;
	new_frame.appendChild(image);
	image.onload = zoom_in_onload.bind(image, new_frame);
	image.onerror = zoom_in_onerror;
	image.onabort = zoom_in_onabort;
	image.src = slide[1].firstChild.data;
//	alert(new_frame.captext);
}

function zoom_in_onerror() {
	alert('onerror');
}

function zoom_in_onabort() {
	alert('onabort');
}
	
function needs_png_hack() {
	if (Prototype.Browser.IE) {
		var ar_version = navigator.appVersion.split("MSIE");
		var ie_version = parseFloat(ar_version[1]);
		if ((ie_version >= 5.5) && (ie_version < 7.0)) {
			return true;
		}
	}
	return false;
}

function zoom_in_onload(full_slide_div) {
	var new_frame = $(document.createElement('div'));
	new_frame.setAttribute('id', 'main_zoom_slide_frame');
	var fTop = $('main_slide_box').cumulativeOffset()[1] - $('main_container').getHeight();
	var fLeft = $('main_slide_box').positionedOffset()[0] + 46 - this.width + $('main_slide_box').getWidth();
	new_frame.setStyle({width: (this.width + 'px'), top: (fTop + 'px'), left: (fLeft + 'px')});
	new_frame.appendChild(full_slide_div);
	
	var close_box_div = $(document.createElement('div'));
	close_box_div.setAttribute('id', 'main_zoom_close_box');
	var close_box = $(new Image);
	close_box_div.appendChild(close_box);
	if (needs_png_hack()) {
			close_box.src = 'images/spacer.png';
			var filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'images/closebox.png\' sizingMethod=crop)';
			close_box_div.setStyle({'filter': filter});
	} else {
		close_box.src = 'images/closebox.png'
	}
	close_box_div.setStyle({cursor: 'pointer'});
	new_frame.appendChild(close_box_div);
	var caption_div = $(document.createElement('div'));
	caption_div.setAttribute('id', 'main_zoom_caption_box');
	if (full_slide_div.captext) {
		var caption = $(document.createElement('p'));
		caption.appendChild(document.createTextNode(full_slide_div.captext));
		caption_div.appendChild(caption);
	}
	new_frame.appendChild(caption_div);
	new_frame.unzooming = false;
	Event.observe(close_box_div, 'click', zoom_out.bindAsEventListener(new_frame));
//	Event.observe(new_frame, 'mousemove', show_close_box.bindAsEventListener(new_frame));
//	Event.observe(new_frame, 'mouseover', zoom_out.bindAsEventListener(new_frame));
//	Event.observe(new_frame, 'mouseout', zoom_out.bindAsEventListener(new_frame));
	$('main_container').appendChild(new_frame);
	$('main_slide_box').setStyle({cursor: 'pointer'});
}

function zoom_out() {
	// serialize removal of enlarged image
	if (!this.unzooming) {
		this.unzooming = true;
		var images = this.down().down().images;
		this.remove();
		images.zooming = false;
	}
}

function show_slideshow() {
	if (0 == slide_show.slide_count) return;
	var slides = new Slide_preloader(slides_loaded);
	slide_show.small_images = slides;
}

function slides_loaded(images, loaded) {
	$('main_slide_frame').remove();
	for (var i = 0; i < loaded; i++) {
		var slide_width = parseInt($(images[i]).getStyle('width'));
		var slide_height = parseInt($(images[i]).getStyle('height'));
//		alert('width: ' + $(images[i]).getStyle('width') + ', height: ' + $(images[i]).getHeight());
		var new_div = $(document.createElement('div'));
		var frame_lpad  = (slide_width < 210)? Math.round((210 - slide_width) / 2) : 0 ;
		var frame_width = 210 - frame_lpad;
		new_div.setAttribute('id', 'main_slide_frame_' + i);
		new_div.addClassName('main_slide_frame');
		new_div.setStyle({height: (slide_height + 'px'), paddingLeft: (frame_lpad + 'px'), width: (frame_width + 'px')});
		if (0 != i)
			new_div.setStyle({display: 'none'});
		new_div.appendChild(images[i]);
		if (0 == i) {
			$('main_slide_box').appendChild(new_div);
		} else {
			$('main_slide_box').appendChild(new_div, i);
		}
		images.zooming = false;
	}
	$('main_slide_box').setStyle({cursor: 'pointer'});
	Event.observe($('main_slide_box'), 'click', zoom_in.bindAsEventListener(images));
	// attach expanatory note
	var new_p = $(document.createElement('p'));
	new_p.appendChild(document.createTextNode("Click on image to enlarge"));
	$('main_slide_usehint').appendChild(new_p);
	slide_show.current_sidx = 0;
	if (loaded > 1)
		start_slideshow('main_slide_frame_', 0, loaded - 1, 3000)
	
}
