
// auto slide cycle variables
var autoCycleTimer;
var autoCycleRunning = true;
var intervalDuration = 8000;

// function to show or hide elements
function showHide(elementId, calledFrom) {
	var theHiddenElement = document.getElementById(elementId);
	theHiddenElement.style.display = theHiddenElement.style.display == 'none' ? '' : 'none';
	calledFrom.blur();
}

// function to populate html with javascript features
function initBuilder() {
	// add placeholder text replace functions to text fields
	var allInputsInDocument = document.getElementsByTagName('input');
	for (var i in allInputsInDocument) {
		// check input has value attribute
		if (allInputsInDocument[i].value) {
			// store default value
			var defaultText = allInputsInDocument[i].value;
			// set onfocus and onblur functions
			allInputsInDocument[i].onfocus = Function("if(this.value == '" + defaultText + "') {this.value = ''}");
			allInputsInDocument[i].onblur = Function("if(this.value == '') {this.value = '" + defaultText + "'}");
		}
	}
	// add collapse/expand functions to show hide items
	var allSectionsInDocument = document.getElementsByTagName('section');
	for (var i in allSectionsInDocument) {
		// check section has class attribute
		if (allSectionsInDocument[i].className) {
			// select only class of showHideItem
			if (allSectionsInDocument[i].className == 'showHideItem') {
				// add second class to set hidden state
				allSectionsInDocument[i].className = 'showHideItem showHideHidden'
				// loop through all h1 elements within section
				var allH1sInSection = allSectionsInDocument[i].getElementsByTagName('h1');
				for (var j in allH1sInSection) {
					// add expand script to h1 tags
					allH1sInSection[j].onclick = function() {this.parentNode.className = 'showHideItem'; return false;}
				}
				// loop through all div elements within section
				var allDivsInSection = allSectionsInDocument[i].getElementsByTagName('div');
				for (var j in allDivsInSection) {
					// select only closeX divs
					if (allDivsInSection[j].className == 'closeX') {
						// add collapse script to close buttons
						allDivsInSection[j].onclick = function() {this.parentNode.className = 'showHideItem showHideHidden'; return false;}
					}
				}
			}
		}
	}
}

// function to add javascript controls to widgets
function initWidget(widgetId) {
	// create array of slide elements extracted from all sections in widget
	var allSectionsInWidget = document.getElementById(widgetId).getElementsByTagName('section');
	slideElements = new Array();
	var j = 0;
	for (var i in allSectionsInWidget) {
		// select only slide sections
		if (allSectionsInWidget[i].className == 'promoSlide') {
			// add slide element to array and increment counter
			slideElements[j] = allSectionsInWidget[i];
			j++;
		}
	}
	// get total number of slides
	numOfSlides = slideElements.length;
	// set intitial slide numbers
	currentSlideNum = 0;
	prevSlideNum = numOfSlides - 1;
	nextSlideNum = currentSlideNum + 1;
	if (nextSlideNum > numOfSlides - 1){nextSlideNum = 0}
	// get width, height and top position of the first slide
	slideWidth = slideElements[0].offsetWidth;
	slideHeight = slideElements[0].offsetHeight;
    slidePosTop = slideElements[0].offsetTop;
	// set initial height of slide container
	//document.getElementById(widgetId).style.height = slideHeight + slidePosTop +'px';
	// set initial position of all slides
	for (var i in slideElements) {
		slideElements[i].style.position = 'absolute';
		slideElements[i].style.left = slideWidth + 'px';
		slideElements[i].style.top = slidePosTop + 'px';
	}
	// set initial position of first slide
	slideElements[0].style.left = '0px';
	// create and append promo index
	var promoIndex = document.createElement('div');
	promoIndex.className = 'promoIndex';
	// populate index with link for each slide
	var indexAnchor, indexText, indexNumber
	for (var i in slideElements) {
		// set index number
		indexNumber = parseFloat(i) + 1;
        // create an anchor and text for each slide
		indexAnchor = document.createElement('a');
		indexText = document.createTextNode(indexNumber);
		// set anchor attributes
		//indexAnchor.setAttribute('href','JavaScript:void(0)');
		indexAnchor.setAttribute('title',indexNumber);
		if (i == 0) {indexAnchor.className = 'active';}
		// append text node to anchor and anchor to promo index
		indexAnchor.appendChild(indexText);
		promoIndex.appendChild(indexAnchor);
	}
	// append promo index to widget
	document.getElementById(widgetId).appendChild(promoIndex);
	// create array of prev and next buttons
	var allImgInWidget = document.getElementById(widgetId).getElementsByTagName('img');
	slideButtons = new Array();
	var k = 0;
	for (var i in allImgInWidget) {
		// check class name is not null
		if (allImgInWidget[i].className != null) {
			// select prev and next images
			if (allImgInWidget[i].className.indexOf('promoButton') >= 0) {
				// add button element to array and increment counter
				slideButtons[k] = allImgInWidget[i];
				k++;
			}
		}
	}
	// create array of index buttons
	var allDivInWidget = document.getElementById(widgetId).getElementsByTagName('div');
	indexButtons = new Array();
	for (var i in allDivInWidget) {
		// check class name is not null
		if (allDivInWidget[i].className != null) {
			// select prev and next images
			if (allDivInWidget[i].className.indexOf('promoIndex') >= 0) {
				// get array of anchors within promo index
				indexButtons = allDivInWidget[i].getElementsByTagName('a');
				// end the loop
				break;
			}
		}
	}
	// enable slide buttons
	enableButtons();
	//start auto cycle if there is more than one slide
	if (numOfSlides > 1) {autoCycleTimer = setInterval('callSlide("auto")',intervalDuration)}
}

// enable slide buttons
function enableButtons() {
	for (var i in slideButtons)	{slideButtons[i].onclick = function() {callSlide(this);return false;}}
}

// disable slide buttons
function disableButtons() {
	for (var i in slideButtons)	{slideButtons[i].onclick = function() {return false;}}
}

// call slide
function callSlide(calledFrom) {
	// determine requested slide
	if (calledFrom == 'auto') {
		// auto scroller so choose next slide
		requestedSlide = 'next';
	} else {
		// choose previous or next slide
		if (calledFrom == slideButtons[0]) {
			requestedSlide = 'previous';
		} else {
			requestedSlide = 'next';
		}
		// stop auto cycle if running
		if (autoCycleRunning) {
			autoCycleRunning = false;
			clearInterval(autoCycleTimer);
		}
	}
	// disable slide buttons while scrolling
	disableButtons();
	// get current slide object
	currentSlide = slideElements[currentSlideNum];
	// if request is for previous slide
	if (requestedSlide == 'previous') {
		// previous slide requested
		newSlide = slideElements[prevSlideNum];
		// set start position of new slide
		newSlide.style.left = -slideWidth + 'px';
		// decrement current slide number
		--currentSlideNum;
		if (currentSlideNum < 0){currentSlideNum = numOfSlides - 1}
		// decrement prev slide number
		--prevSlideNum;
		if (prevSlideNum < 0){prevSlideNum = numOfSlides - 1}
		// decrement next slide number
		--nextSlideNum;
		if (nextSlideNum < 0){nextSlideNum = numOfSlides - 1}
	} else {
		// next slide requested
		newSlide = slideElements[nextSlideNum];
		// set start position of new slide
		newSlide.style.left = slideWidth + 'px';
		// increment current slide number
		currentSlideNum++;
		if (currentSlideNum > numOfSlides - 1){currentSlideNum = 0}
		// increment prev slide number
		prevSlideNum++;
		if (prevSlideNum > numOfSlides - 1){prevSlideNum = 0}
		// increment next slide number
		nextSlideNum++;
		if (nextSlideNum > numOfSlides - 1){nextSlideNum = 0}
	}
	// incrementally change position of incoming slide
	repeaterID = window.setInterval('setPosition()', 3);
}

// function to set position of slide, to be repeated until fully revealed 
function setPosition() {
	// deactivate all index buttons
	for (var i in indexButtons)	{indexButtons[i].className = '';}
	// set increment by which to move
	var step = slideWidth / 18;
	// obtain current left pos of current and new slide
	var currentSlidePos = parseFloat(currentSlide.offsetLeft);
	var newSlidePos = parseFloat(newSlide.offsetLeft);
	// adjust final increment to fit the desired destination
	if (Math.sqrt(Math.pow(newSlidePos,2)) <= step) {step = Math.sqrt(Math.pow(newSlidePos,2))}
	// move slides to next step
	if (newSlidePos < currentSlidePos) {
		currentSlide.style.left = (currentSlidePos + parseFloat(step)) + 'px';
		newSlide.style.left = (newSlidePos + parseFloat(step)) + 'px';
	} else {
		currentSlide.style.left = (currentSlidePos - step) + 'px';
		newSlide.style.left = (newSlidePos - step) + 'px';
	}
	// once slide is in position cancel repeater and re-enable slide buttons
	if (Math.sqrt(Math.pow(newSlidePos,2)) <= step) {
		window.clearInterval(repeaterID);
		enableButtons();
		// activate selected slide index button
		indexButtons[currentSlideNum].className = 'active';
	}
}



















