// d3i Javascript Library
var d3i = {};

// d3i Utility Library
d3i.utility = {

	// Perform actions on dom load
	onDOMLoad: function(action) {
		document.observe("dom:loaded", action);
	},
	
	// Enable external links
	enableExternalLinks: function() {
		d3i.utility.onDOMLoad(function() {
			$$('a[rel="external"]').each(function(link) {
				if(link.readAttribute('href') != '' && link.readAttribute('href') != '#'){
					link.writeAttribute('target','_blank');
				}
			});
		});
	},
	
	// Get element from either element pointer or ID
	getElement: function(element) {
		return Object.isString(element) ? $(element) : Object.isElement(element) ? element : null;
	},
	
	getIEVersion: function() {
		if (Prototype.Browser.IE) {
		    var ua = navigator.userAgent;
		    var MSIEOffset = ua.indexOf("MSIE ");
		    if (MSIEOffset == -1) {
		        return 0;
		    } else {
		        return parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";", MSIEOffset)));
		    }
		} else {
			return null;
		}
	}

};

// d3i Input Caption Hander (textboxes and textareas)
d3i.captionHandler = {

	// Add captions to multiple elements {id: caption, id: caption}
	addCaptions: function(fields) {
		if (typeof(fields) == 'object') {
			for (var i in fields) {
				d3i.captionHandler.addCaption(i, fields[i]);
			}
		}
	},
	
	// Add caption to 1 element
	addCaption: function(element, caption) {
		if (Object.isString(element)) {
			d3i.utility.onDOMLoad(function() {
				d3i.captionHandler.addCaptionEvents($(element), caption);
			});
		} else if (Object.isElement(element)) {
			d3i.captionHandler.addCaptionEvents(element, caption);
		}
	},
	
	// Add events
	addCaptionEvents: function(element, caption) {
		if (element) {
			element.captionText = caption;
			element.observe('focus', function(e) { d3i.captionHandler.handleFocus(Event.element(e)); });
			element.observe('blur', function(e) { d3i.captionHandler.handleBlur(Event.element(e)); });
			d3i.captionHandler.handleBlur(element);
		}
	},
	
	// Clear caption on focus
	handleFocus: function(field) {
		field.removeClassName('caption');
		if (field.value == field.captionText) {
			field.value = "";
		}
	},
	
	// Add caption on blur if necessary
	handleBlur: function(field) {
		if (field.value == "" || field.value == field.captionText) {
			field.value = field.captionText;
			field.addClassName('caption');
		}
	}

};

// d3i Slideshow
d3i.slideshow = {

	// Setup
	setup: function(element, options) {
	
		// Process options
		if (!options) options = {};
		if (!options.interval || options.interval < 0) { options.interval = 2000; }
		if (!options.duration || options.duration < 0) { options.duration = 1000; }
	
		// Init on load
		d3i.utility.onDOMLoad(function() { d3i.slideshow.init(element, options); });
		
	},
	
	// Init
	init: function(element, options) {
	
		// Get container
		var container = d3i.utility.getElement(element);
		if (container == null) return;
		
		// Store options
		container.d3iSlideshowOptions = options;
		
		// Setup container
		container.style.position = "relative";
		
		// Hide child elements
		container.descendants().each(function (el, i) {
			if (i > 0) el.hide();
			el.style.position = "absolute";
			el.style.top = 0;
			el.style.left = 0;
		});
		
		// First
		container.current = container.firstDescendant();
		
		// Start
		setTimeout(function() { d3i.slideshow.next(container); }, container.d3iSlideshowOptions.interval);
	
	},
	
	// Show next
	next: function(container) {
		var slides = container.descendants();
		for (var i = 0; i < slides.length; i++) {
			var el = slides[i];
			if (el.visible()) {
				Effect.Fade(el, {duration: container.d3iSlideshowOptions.duration / 1000});
				var next = el.next();
				if (!next) next = container.firstDescendant();
				Effect.Appear(next, {duration: container.d3iSlideshowOptions.duration / 1000});
				setTimeout(function() { d3i.slideshow.next(container); }, container.d3iSlideshowOptions.interval);
				return;
			}
		}

	}

};
