/*
NGW general JS - permanent functionality
Dependencies: prototype 1.6.0, script.aculo.us effects 1.8.1, swfObject 2.0

*/

// page initialisation
function generalJsInit() {
	setupShowroomMovieRollovers();
	setupTogglesZZplus();
	addPrintEvents();

	/* START: SCM, 21/04/08 overlay */
	if (typeof flash_takeover == 'object') createFlashOverlay();
	var promos = $$('.homePromos img');
	if (promos.length !== 0) { /* UK specific */
		if (gup('over', promos[0].src) !== false) {
			homeStartCountdown();
		}
	}

	//UK promotion links
	if (Prototype.Browser.IE) {
		$$('.promoContainer a').each(function(el) {
			Event.observe(el, 'focus', linkBlurring, false);
		});
	}
	
	// Brochure download links:
	$$('#content ol.js-brochure-download ul.links a').invoke('observe', 'click', function (e) {
		// grab the href and open a new window
		var link = Event.element(e);
		link = link.href;
		if (link) window.open(link);
		// let the postback onclick fire
	});
	
	
	contentpanels.init();
	//tracking.onPageLoad();
	
	//GA tracking file download and external links
	//place inside of DOM ready function or similar
	//DEPENDENCIES: Google Analytics 2 - ga.js
	if (typeof pageTracker == 'object') {
		var el = document.getElementsByTagName("a");
		var link_path = ''; var tracking_string = '';
		for (var cnt = el.length - 1; cnt > 0 ; cnt--) {
			var link_path = el[cnt].pathname;
			tracking_string = false;
			if (location.host == el[cnt].hostname) {
				if (link_path.match(/\.(doc|pdf|xls|ppt|zip|txt|vsd|vxd|js|css|rar|exe|wma|mov|avi|wmv|mp3)$/)) {
					tracking_string = el[cnt].pathname;
				}		
			} else if (el[cnt].hostname !== '') {
				tracking_string = '/external_links/' + el[cnt].hostname;
			}
			if (tracking_string !== false ) { 
				el[cnt].tracking_string = tracking_string;
				if (window.addEventListener) el[cnt].addEventListener('click', function(){
					pageTracker._trackPageview(this.tracking_string);
				}, false);
				else if (window.attachEvent) el[cnt].attachEvent('onclick',  function(e){
					pageTracker._trackPageview(e.srcElement.tracking_string);
				});
			}
		};
	}
	
}


// returns content of <meta name="culture" content="en-GB" /> tag
function getPageCulture() {
	return $A(document.getElementsByTagName("meta")).findAll(function(s) {
		return (s.name && s.name.toLowerCase() == 'culture');
	}).pop().content;
}

//Print (Promotions)
function addPrintEvents() {
	$$('a.promo_print').each(function(i, cnt) {
		i.observe('click', function(e) {
			window.print();
			Event.stop(e);
		}, false);
	});
}
//remove link borders
function linkBlurring(e) {
	var link = Event.element(e);
	if (link.blur) link.blur();
	Event.stop(e);
}


// Top navigation navigation
sfHover = function() {
	if (document.getElementById("nav") !== null) {
		var sfEls = document.getElementById("nav").getElementsByTagName("LI");
		for (var i = 0; i < sfEls.length; i++) {
			sfEls[i].onmouseover = function() {
				this.className += " sfhover";
			}
			sfEls[i].onmouseout = function() {
				this.className = this.className.replace(new RegExp(" sfhover\\b"), "");
			}
		}
	}
}
if (window.attachEvent) window.attachEvent("onload", sfHover);
// End: Top navigation navigation


/* START: co.uk homepage animation, SCM 21/01/2008 */
var anim_config = { switchOffDelay: 1, switchOnDelay: 1, inactiveDelay: 2, showDelay: 2, fireDelay: 2 };
var pe_1;
var overlay_id = new Array();
var home_anim_timing = new Array(4, 9, 13);
var home_anim_timing_original = home_anim_timing.clone();
var current_timer = 0;
var timer_offset = 0;

function homeStartCountdown() {
	var elem;
	$$('.homePromos img').each(function(i, cnt) {
		elem = '<div id="elem' + cnt + '" style="background: url(' + getRolloverImage(i) + ') no-repeat; width: 92px; height: 136px; position: absolute;"></div>';
		Element.insert(i, { 'after': elem });
		$('elem' + cnt).clonePosition(i);

		$('elem' + cnt).observe('mouseover', function(e) {
			elem = e.element();
			clearCycle();
			elem.hide();
		}, false);


		i.observe('mouseout', function(e) {
			elem = e.element();
			pe_1.stop();
			pe_1 = setCycle(overlay_id);
			elem.next().show();
		}, false);
		overlay_id[cnt] = 'elem' + cnt;
	});
	pe_1 = setCycle(overlay_id);
}

function clearCycle() {
	pe_1.stop(); current_timer = 0;
	$$('.homePromos div').each(function(i, cnt) {
		if (i.timeout) window.clearTimeout(i.timeout);
		i.show();
		new Effect.Opacity(i, { duration: 0, to: 1 });
	});
}

function setCycle() {
	timer_offset = anim_config.showDelay + anim_config.switchOffDelay + anim_config.switchOnDelay;
	home_anim_timing = home_anim_timing_original.clone();
	return new PeriodicalExecuter(function(pe) {
		animationTimer();
	}, 1);
}

function animationTimer(pe) {
	current_timer++;
	if (home_anim_timing.indexOf(current_timer) !== -1) {
		doCycle(overlay_id[home_anim_timing.indexOf(current_timer)]);
	}
	var tmp = home_anim_timing.clone();
	tmp.sort(function(a, b) {
		return b - a; //numerical order
	});
	if (tmp[0] <= current_timer) {
		current_timer = 0;
		for (var a = home_anim_timing.length - 1; a >= 0; a--) {
			home_anim_timing[a] = home_anim_timing[a] + timer_offset;
		}
		timer_offset = 0;
	}
}

function doCycle(elem) {
	new Effect.Opacity($(elem), { duration: anim_config.switchOffDelay, from: 1, to: 0, queue: { scope: 'switchOffElement' }, afterFinish: function() {
		if (pe_1.timer !== null) { //is timer enabled
			$(elem).timeout = window.setTimeout(function() {
				new Effect.Opacity($(elem), { duration: anim_config.switchOnDelay, from: 0, to: 1, queue: { scope: 'switchOnElement' }, afterFinish: function() {

				} 
				});
			}, anim_config.showDelay * 1000);
		} else {
			clearCycle();
		}
	} 
	});

}

function getRolloverImage(image) {
	if (!image.original) {
		if (!gup('over', image.src)) return image.src;
		image.rollover = gup('over', image.src);
		var tmp = image.src.split('?');
		image.original = tmp[0];
	}


	return image.rollover;

}
/* END: co.uk homepage animation */

function gup(name, tmpURL) {
	var regexS = "[\\?&]" + name + "=([^&#]*)";
	var regex = new RegExp(regexS);
	if (tmpURL) { //if is set - use it

	} else {
		var tmpURL = window.location.href;
	}
	var results = regex.exec(tmpURL);

	if (results == null) return false;
	else return results[1];
}

// Showroom rollovers 080327
function setupShowroomMovieRollovers() {
	var thumbList = $('js_showroomThumbList');
	if (!thumbList) return false;

	thumbList.select('li a').each(function(i) {
		i.onmouseover = function(e) {
			var elem = this;
			if (elem.tagName == 'A') {
				var funcCall = "showroomDolabel('" + getModelName(elem) + "')";
				window.showroomDolabelID = setTimeout(funcCall, 500);
			}
		};
		i.onmouseout = function(e) {
			var elem = this;
			if (elem.tagName == 'A') {
				clearTimeout(window.showroomDolabelID);
			}
		};
	});

	function getModelName(elem) {
		var hrefTokens = elem.getAttribute('href').split('/');

		// "mazda2/"
		if (hrefTokens.length == 2 || hrefTokens.length == 6) {
			return hrefTokens[hrefTokens.length - 2];
		}

		// "mazda2/5door/overview/"
		if (hrefTokens.length == 4 || hrefTokens.length == 8) {
			return hrefTokens[hrefTokens.length - 4];
		}

		// "mazda2/Overview/"
		if (hrefTokens[hrefTokens.length - 2].toLowerCase() == "overview") {
			return hrefTokens[hrefTokens.length - 3];
		}
	}

	return true;
}

function showroomDolabel(target) {
	var movieInstance = getFlashMovieObject("command");
	if (movieIsLoaded(movieInstance)) {
		movieInstance.SetVariable("interacted", true);
		movieInstance.SetVariable("chosenModel", target);
		movieInstance.TGotoLabel("_level0/", "go");
	}
}

function getFlashMovieObject(movieName) {
	// Browsers refer to the movie object differently.
	// This function returns the appropriate syntax depending on the browser.	
	if (window.document[movieName]) {
		return window.document[movieName];
	} else {
		if (navigator.appName.indexOf("Microsoft Internet") == -1) {
			if (document.embeds && document.embeds[movieName]) return document.embeds[movieName];
		} else // if (navigator.appName.indexOf("Microsoft Internet")!=-1) 
			return document.getElementById(movieName);
	}
}

// Checks if movie is completely loaded.
// Returns true if yes, false if no.
function movieIsLoaded(theMovie) {
	if (theMovie != null) {
		return theMovie.PercentLoaded() == 100;
	} else {
		return false;
	}
}
/// Showroom rollovers


// generic popup window allowing size to be set
function openWindow(url, winName, w, h, properties) {
	var properties = properties || "resizable"
	var leftPos = (screen.width) ? (screen.width - w) / 2 : 0;
	var topPos = (screen.height) ? (screen.height - h) / 2 : 0;
	var settings =
	'height=' + h + ',width=' + w + ',top=' + topPos + ',left=' + leftPos + ',' + properties;
	var newWindow = window.open(url, winName, settings);
	if (url.indexOf("://") == -1) newWindow.focus();
	top.newWindow = true;
	return false;
}


// dynamic styles: js_collapsed, js_expanded
function setupTogglesZZplus() {
	// collapse toggles
	var content = $('content');
	if (content) {
		$A(content.select('a.toggle')).each(function(i) {
			i.addClassName('js_collapsed');
			i.next('div').addClassName('js_collapsed')
			i.observe('click', toggleDisclaimer, false);
			i.observe('focus', linkBlurring, false);
		});
	}
}


// collapse / expand text content, used on zzplus
function toggleDisclaimer(e) {
	var element = Event.findElement(e, 'a');
	var effectDurationDown = 0.5;
	var effectDurationUp = 0.5;
	var nextElem

	if (element.hasClassName('js_collapsed')) {
		/* show the content element */
		element.removeClassName('js_collapsed');
		nextElem = element.next();

		if (nextElem.hasClassName('no_print')) {//next is a '...' element
			nextElem.hide();
			nextElem = element.next(1);
		}
		nextElem.hide();
		nextElem.removeClassName('js_collapsed');
		if (window.opera) {
			nextElem.show();
		}
		else {
			new Effect.BlindDown(nextElem, { 'duration': effectDurationDown, queue: { scope: 'mazda_main', limit: 1 }, 'afterFinish': function() {
				nextElem.show();
			}
			});
		}


	} else {
		/* hide the content element */

		element.addClassName('js_collapsed')
		nextElem = element.next();

		if (nextElem.hasClassName('no_print')) {
			nextElem = element.next(1);
		}
		new Effect.BlindUp(nextElem, { 'duration': effectDurationUp, queue: { scope: 'mazda_main', limit: 1 }, 'afterFinish': function() {
			nextElem.addClassName('js_collapsed');
			nextElem.show();
			element.next().show(); // '...' element if exists
		}
		});
	}
	Event.stop(e);
}


function linkBlurring(e) {
	var link = Event.element(e);
	if (link.blur) link.blur();
	Event.stop(e);
}

function setCookie(val) {
	document.cookie = val;
}
function getCookie(val) {
	return document.cookie.indexOf(val);
}

/* START: SCM, 21/04/08 Homepage overlay */

/* flash_takeover example, move it to the main document
* 
* 

var flash_takeover = {  flash: {src: '/mazda5_casino_semitakeover.swf', 
id: 'takeover',
width: '504', 
height: '315', 
version: '9.0.0', 
bgcolor: '#ffffff'},
play: 'once',
position: {top: 0, left: 0},
overlay: {bgcolor: '#ffffff', opacity: 0.7},
click: ['alias', '/mazda3/index.html', '_blank', 'popup'],
variables: {xml_loc: '/mazda5_overlay_casino.xml'},
params: {'menu': 'false'}
};
*/

function removeFlashOverlay() {
	if ($('overlayFlash')) $('overlayFlash').hide();
	if ($('flash_shade')) $('flash_shade').hide();

	if (createFlashOverlay.swfsInPage) {
		createFlashOverlay.swfsInPage.each(function(i) { i.show() });
	}
	var hero = $('contentBox').select('.heroBox');
	if (hero.length > 0) {
		hero[0].setStyle({
			visibility: 'visible'
		});
	}
	if ($('modelrange')) $('modelrange').setStyle({ visibility: 'visible' });
}

function setFlashOverlay(container) {
	if (!window.flash_takeover) return false;
	var f = flash_takeover;
	swfobject.embedSWF(f.flash.src, container, f.flash.width, f.flash.height, f.flash.version, false, f.variables,
			Object.extend({
				quality: "high",
				bgcolor: f.flash.bgcolor,
				allowScriptAccess: "sameDomain",
				wmode: "transparent",
				menu: "false"
			}, f.params),
			{ id: f.flash.id }
		);
	window.focus();
	return true;
}

function createFlashOverlay() {
	// test for takeover config object and player version:
	if (!window.flash_takeover || typeof swfobject !== 'object') return false;
	if (!swfobject.hasFlashPlayerVersion(flash_takeover.flash.version)) return;
	if ((flash_takeover.play == "once" && getCookie('flashOverlay=viewed') !== -1) || Prototype.Browser.Opera) {
		return;
	}
	setCookie('flashOverlay=viewed');

	if (typeof flash_takeover.overlay == 'object') {
		$$('body')[0].insert({ bottom: '<div id="flash_shade"></div>' });
		$('footer').insert({
			after: '<div id="flash_shade"></div>'
		});

		var shade = $('flash_shade');

		if (shade) {
			shade.setStyle({
				backgroundColor: flash_takeover.overlay.bgcolor,
				top: 0,
				position: 'absolute',
				left: 0,
				'z-index': 999
			});
			shade.setOpacity(0.7);
			var dims = document.viewport.getDimensions(); // prototype 1.6
			shade.setStyle({
				width: dims.width + 'px',
				height: dims.height + 'px'
			});
		}
	}


	$$('body')[0].insert({ bottom: '<div id="overlayFlash"><span id="overlayFlashStub"></span></div>' });
	$('overlayFlash').setStyle({
		top: flash_takeover.position.top + 'px',
		left: flash_takeover.position.left + 'px',
		position: 'absolute',
		'z-index': 1000000
	});

	setFlashOverlay('overlayFlashStub');
	var hero = $('contentBox').select('.heroBox');
	if (hero.length > 0) {
		hero[0].setStyle({
			visibility: 'hidden'
		});
	}
	if ($('modelrange')) {
		$('modelrange').setStyle({
			visibility: 'hidden'
		});
	}
	return true;
}
/* click functionality for flash CTA */
function clickThru() {
	if (arguments.length !== 0) {
		return; //place to extend the function
	}
	if (flash_takeover.click.length !== 0) {
		magicTracking(flash_takeover.click);
	}
}
/* END: Homepage overlay */

var config = { url: '', delay: 800, target: '_self', timeout: '' };
/* alias - tracking string, url - URL redirect after tracking (optional) */
function magicTracking(alias, url, target) {
	if (typeof alias !== 'string' && alias.length > 0) {
		url = alias[1]; target = alias[2]; alias = alias[0];
	}
	var products = null;
	var displayed = null;
	if (!tc_logging_active) return;
	alias = tc_fixURL(alias);
	config.target = target || '_self';
	if (Image) {
		var img = new Image();
		if (typeof url == 'undefined' || url == 'undefined' || url == '') {
			//no URL specified do nothing...
			url = '';
		} else {
			config.url = url;
			if (config.target == '_blank') {
				window.open(config.url);
			} else {
				config.timeout = self.setTimeout('imageLoaded()', config.delay); //just in case the logging doesn't happen or browser doesn't support Image
				if (img.addEventListener) {
					img.addEventListener('load', imageLoaded, false);
				} else if (img.attachEvent) {
					img.attachEvent('onload', imageLoaded);
				} else if (img.onload) {
					img.onload = function() {
						imageLoaded();
					};
				}
			}

		}
		img.url = url;
		img.src = tc_get_log_URL("i", alias, tc_products, new Date().getTime(), displayed);
	}
}

function imageLoaded() {
	self.clearTimeout(config.timeout); //reset the timeout
	if (config.target == '_self') {
		window.location = config.url;
	}
}

/**
* Module - manages client-side tracking 
* 
* use:
*	tracking.domready(function () {
*		tracking.appendTracking('.links a', 'tracking_string', null, true, false);
*	});
*/
/**
* string cssSelector - jQuery of prototype style css selector
* string tracking string
* cultureList array (numeric) - list of countries to be excluded
* includeId bool [default: false] - true will append numeric value
* overwrite bool [default: false] - true will overwrite existing tracking value if present
*/
var tracking = {
	config: {
		trackingParamName: '?bannerid', /*send as query*/
		nextId: 1,
		excludeCulture: [],
		includeId: false,
		overwrite: false,
		usePageTrackingId: false
	},

	onPageLoad: function() {
		var cookie = this.getCookie(this.config.trackingParamName);
		if (cookie !== false && cookie !== 'false') {
			magicTracking(cookie);
			this.setCookie(this.config.trackingParamName, false); //remove the current value
		}

		var model = (window.modelTrackingId) ? '_' + window.modelTrackingId : '';

		if (tracking.getPageTrackingId() === 'home') {  //homepage
			tracking.appendTracking('#viTopNav a', 'home_navigation');
			//tracking.appendTracking('#homeContent .intro a', 'home_teaser_left_col', {includeId: true});// uses legacy
			tracking.appendTracking('#footer a', 'home_zoom_zoom_bar');
		}
		else {
			tracking.appendTracking('#viTopNav a', 'navigation');
			tracking.appendTracking('#footer a', 'zoom_zoom_bar');
		}
		//tracking.appendTracking('#js_showroomThumbList a', 'showroom_landing_page', {overwrite: true});
		tracking.appendTracking('#promoBox li', 'right_hand_contextual', { includeId: false });

		// Generic pdf links
		tracking.appendLinkClickEvent('#content a', '.pdf');

		// leftSubNav
		tracking.appendTracking('#leftSubNav li', 'left_nav_subsection');

		// news search
		tracking.appendTracking('#newsSearch input.btnGo', 'dropdown_filter', { usePageTrackingId: true });

		/* promotions */
		tracking.appendTracking('.promoHome li', 'index', { usePageTrackingId: true });
		tracking.appendTracking('.promoModel li', 'index' + model, { usePageTrackingId: true });
		tracking.appendTracking('.promoContainer .left_column li', model, { usePageTrackingId: true });

		tracking.appendTracking('.indexPage li', 'index', { usePageTrackingId: true }); //generic landing page

		tracking.appendTracking('#content ol.items', 'index', { includeId: true, usePageTrackingId: true }); //Special Edition list
		tracking.appendTracking('#content ol.modelList', 'index', { includeId: true, usePageTrackingId: true });  //approved range model index
	},

	appendTracking: function(cssSelector, trackingString, config) {
		config = config || {};
		var that = this;

		var overwrite = config['overwrite'] || this.config.overwrite;
		var cultureList = config['excludeCulture'] || this.config.excludeCulture;
		var trackingParamName = config['trackingParamName'] || this.config.trackingParamName;
		var includeId = config['includeId'] || this.config.includeId;
		var nextId = config['nextId'] || this.config.nextId;
		var usePageTrackingId = config['usePageTrackingId'] || this.config.usePageTrackingId;

		var pageCulture = getPageCulture();
		if (cultureList) {
			var exclude = false;
			for (var i = 0; i < cultureList.length; i++) {
				if (cultureList[i] === pageCulture) exclude = true;
			}
			if (exclude) return null;
		}

		if (usePageTrackingId) trackingString = that.getPageTrackingId(trackingString);

		var query = trackingParamName + '=' + trackingString;
		var elem = this.find(cssSelector);

		if (window.jQuery) {
			elem.each(function() {
				var el = $(this);
				var tr = (includeId ? query + '_' + nextId++ : query);
				el.click(function(e) {
					var href = $(this).attr('href');
					if (!overwrite && href && gup(trackingParamName, href)) {
						tr = $(this).attr('href');
					}
					// TODO: add class data as per prototype below
					that.setCookie(trackingParamName, tr);
				});
			});
		}
		else {
			elem.each(function(el) {
				var tr = (includeId ? query + '_' + nextId++ : query);
				Event.observe(el, 'click', function(e) {
					var link = Event.findElement(e, 'a') || Event.findElement(e, 'input');
					if (link == undefined) { return; }
					var href = link.readAttribute('href');
					if (!overwrite && href && gup(trackingParamName, href)) {
						tr = gup(trackingParamName, link.readAttribute('href'));
					}

					var c, li = link.up('li');
					if (li) {
						c = li.readAttribute('class');
						if (c !== null) {
							c = c.match(/(car_model_[\-\_a-z0-9]{1,10})|(promo[0-9]{1,2})|(link_[a-z0-9]{1,10})/g);
							if (c && c.length > 0) {
								tr += '_' + c[0];
							}
						}
					}
					that.setCookie(trackingParamName, tr);
				}, false);
			});
		}
		return elem;
	},

	appendLinkClickEvent: function(cssSelector, filesuffix) {
		var element = [];
		if (window.jQuery) {
			element = this.find(cssSelector + '[attribute$=' + filesuffix + ']');
		}
		else {
			this.find(cssSelector).each(function(s) {
				var href = s.readAttribute('href');
				if (href && href.indexOf(filesuffix) === (href.length - filesuffix.length)) {
					element.push(s);
				}
			});
		}

		this.bind(element, 'click', function(e) {
			var alias = (window.jQuery) ? $(this).attr('href') : Event.findElement(e, 'a').readAttribute('href');
			alias = alias.split('/').pop();
			magicTracking(alias);
		});
	},

	// called from flash links
	linkLoad: function(alias, url, trackingParamName, excludePageTrackingId) {
		trackingParamName = trackingParamName || this.config.trackingParamName;
		if (!excludePageTrackingId) alias = this.getPageTrackingId(alias);
		this.setCookie(trackingParamName, this.config.trackingParamName + '=' + alias);
		window.location = url;
	},

	getPageTrackingId: function(appendStr) {
		if (window.pageTrackingId) {
			if (!appendStr) return window.pageTrackingId;

			appendStr = window.pageTrackingId + '_' + appendStr;
		}
		return appendStr;
	},

	domready: function(f) {
		if (window.jQuery) jQuery(document).ready(f);
		else document.observe('dom:loaded', f);
	},

	find: function(element, cssSelector) {
		if (arguments.length === 2) {
			var result = [];
			if (window.jQuery) result = element.find(cssSelector);
			else {
				var rl = element.invoke('select', cssSelector);
				for (var i = 0, l = rl.length; i < l; i++) {
					result = result.concat(rl[i]);
				}
			}
			return result;
		}
		else {
			cssSelector = element;
			return (window.jQuery) ? jQuery(cssSelector) : $$(cssSelector);
		}
		return [];
	},

	bind: function(elem, eventname, fn) {
		if (window.jQuery) elem.bind(eventname, fn);
		else elem.invoke('observe', eventname, fn);
		return elem;
	},

	setCookie: function(name, value) {
		document.cookie = name + '=' + value + '; expires=' + this.getHoursFromNow(1) + '; path=/';
	},

	getCookie: function(name) {
		name += '=';
		var cookie, cookies = document.cookie.split(';');
		for (var i = 0, len = cookies.length; i < len; i++) {
			cookie = cookies[i];
			while (cookie.charAt(0) == ' ') cookie = cookie.substring(1, cookie.length);
			if (cookie.indexOf(name) == 0) {
				this.data = unescape(cookie.substring(name.length, cookie.length));
				return this.data;
			}
		}
		return false;
	},

	getHoursFromNow: function(hours) {
		return new Date(new Date().getTime() + hours * 3600000);
	}
};


// collapsing content panels module - used in specs pages
var contentpanels = function () {
	var containerCssSelector = '#content.contentpanels';
	var container;
	var mutuallyExclusiveTags = { h4 : true };
	var panelAnchorName = 'section-panel-';
	
	
	function setupControls () {
		container = $$(containerCssSelector);
		if (container.length !== 1) return false;
		
		var nodes = container[0].select('h3', 'h4');
		nodes.each(function (s, i) {
			createPanel(s, i);
			
			// open any of class expandeds
			// check for i > 0 if you want  the first node open
			if (!s.hasClassName('expanded')) collapse(s);
			else s.addClassName('expanded');
			
			// add control
			var linkText = s.innerHTML;
			s.innerHTML = ('<a href="#' + panelAnchorName + i +'">' + linkText + '</a>');
			s.select('a')[0].observe('click', function (e) {
				var el = Event.element(e);
				el.blur();
				Event.stop(e);
				var node = el.up();
				if (node.hasClassName('expanded')) collapse(node);
				else expand(node);
			});
		});
		return true;
	}
	
	function createPanel (el, i) {
		var tagname  = el.tagName;
		el.insert({ after: new Element('div', {
				'id': panelAnchorName + i,
				'class': 'js-content-panel'
			})
		});
		el = el.next('div.js-content-panel');
		el.nextSiblings().each(function (s) {
			if (s.tagName === tagname) throw $break;
			el.insert(s);
		});
	}
	
	// hide content
	function collapse (el) {
		el.removeClassName('expanded');
		el.next('div.js-content-panel').hide();
	}
	
	function expand (el) {
		var tagname  = el.tagName.toLowerCase();
		if (mutuallyExclusiveTags[tagname]) {
			el.up().select(tagname).each(function (s) { collapse(s); });
		}
		el.addClassName('expanded');
		el.next('div.js-content-panel').show();
	}
	
	// public methods
	return {
		init: function () {
			setupControls();
		}
	};
}();


// end of file
document.observe("dom:loaded", generalJsInit);
