// (c) Andrew Booth

function activatePanels() {
	var panels = document.getElementsBySelector('.panel');
	for (j = 0; j < panels.length; j++) {
		panelInit(panels[j].id);						          
	}		
}

function panelInit(panelId) {
	// retrieve class, settings stored
	var panelClass = document.getElementById(panelId).className;
	
	// retrieve panel total
	var panel = new Object;
	
	// default settings
	var panelTotal = document.getElementsBySelector('#' + panelId + ' div.content div').length - document.getElementsBySelector('#' + panelId + ' div.content div div').length;
	var panelCurrent = 1;
	var panelRotate = false;
	var panelRandom = false;
	var panelPlay = true;		
	var panelProgress = false;
	var panelHidden = false;
	var panelTabs = false;
	var panelNext = false;	
	var panelPrevious = false;	
	var panelPause = false;			
	
	// custom settings
	if (panelClass.indexOf('rotate') > -1) { panelRotate = true; }
	if (panelClass.indexOf('random') > -1) { panelRandom = true; }	
	if (panelClass.indexOf('paused') > -1) { panelPlay = false; }	
	if (panelClass.indexOf('hidden') > -1) { panelHidden = true; }	

	var elements;
	elements = document.getElementsBySelector('#' + panelId + ' .button-play');
	if (elements.length > 0) { panelPause = true}

	elements = document.getElementsBySelector('#' + panelId + ' .next');
	if (elements.length > 0) { panelNext = true}

	elements = document.getElementsBySelector('#' + panelId + ' .previous');
	if (elements.length > 0) { panelPrevious = true}

	if (document.getElementById('progress-' + panelId)) { panelProgress = true}
	if (document.getElementById('tab-' + panelId + '-1')) { panelTabs = true}
	
	// save to controls collection
	panel.Id = panelId; //reference or id
	panel.Total = panelTotal; //total
	panel.Current = panelCurrent; //current
	panel.Rotate = panelRotate; //rotate
	panel.Random = panelRandom; //rotate
	panel.Play = panelPlay; //hidden		
	panel.Progress = panelProgress; //progress bar	
	panel.Hidden = panelHidden; //hidden
	panel.Tabs = panelTabs;
	panel.Next = panelNext;
	panel.Previous = panelPrevious;	
	panel.Pause = panelPause;		
	
	controls[panelId] = panel;
	
	// start panels
	// hide incorrect panels
	panelHideAll(panelId);
	panelShow(panelId, panelCurrent);	
		
	// collapse if required
	if (panelHidden) {
		panelCollapse(panelId);
	}
}

function panelJump(panelId, panelIndex) {
	if (viewVisual) {
		// retrieve panel total
		var panel = controls[panelId];

		// stop if required
		if (panel.Play) {
			panelStop(panelId);
		}

		// hide incorrect panels	 
		panelHideAll(panelId);
		panelShow(panelId, panelIndex);	
	}
}

function panelHideAll(panelId) {
	var panel = controls[panelId];
	
	for (var x = 1; x <= panel.Total; x++) {
		panelHide(panelId, x);	
	}	
}

function panelPlay(panelId) {
	if (viewVisual) {
		var panel = controls[panelId];
		
		if (panel.Play) {
			panel.Play = false;
			panelStop(panelId);
			
			if (panel.Pause) {
				document.getElementById('button-play-' + panelId).innerHTML = "play";		
			}
			
			if (panel.Progress) {
				document.getElementById('progress-' + panelId).style.width = "0px";		
			}
		} else {
			panel.Play = true;
			
			if (panel.Pause) {
				document.getElementById('button-play-' + panelId).innerHTML = "pause";		
			}
			
			panelJump(panelId, panel.Current);
		}	
	}
}

function panelStop(panelId) {
	var panel = controls[panelId];
	
	// reset progress bar
	panel.Timer = clearInterval(panel.Timer);	
	
	// reset slide progress
	if (panel.Progress) {
		panel.BarTimer = clearInterval(panel.BarTimer);	
	}
}

function progressBar(panelId, panelTimeout, barWidthNow, barWidth) {
	var panel = controls[panelId];	
	
	barWidthNow = barWidthNow + 1;
	
	document.getElementById('progress-' + panelId).style.width = barWidthNow + "px";
	
	if (barWidthNow <= barWidth) {
		panel.BarTimer = window.setTimeout('progressBar("'+panelId+'", '+panelTimeout+', '+barWidthNow+', '+barWidth+');', 1000 * panelTimeout / barWidth);	
	}
}

function panelHide(panelId, panelIndex) {
	var panel = controls[panelId];		
	
	document.getElementById(panelId + '-' + panelIndex).style.display = "none";
	
	// only change tab if available
	if (panel.Tabs) {
		document.getElementById('tab-' + panelId + '-' + panelIndex).className = "tab";	
	}
}

function panelShow(panelId, panelIndex) {
	if (viewVisual) {
		// save current Id
		var panel = controls[panelId];
		panel.Current = parseFloat(panelIndex);
		
		document.getElementById(panelId + '-' + panelIndex).style.display = "block";
		
		if (panel.Tabs) {
			document.getElementById('tab-' + panelId + '-' + panelIndex).className = "selected";	
		}
		
		if (panel.Rotate && panel.Play) {
			var panelTimeout = parseFloat(document.getElementById(panelId + '-' + panelIndex).className);
			panel.Timer = window.setTimeout('panelNext("'+panelId+'", 1);', 1000 * panelTimeout);	
			
			if (panel.Progress) {
				var barWidth = 40;
				panel.BarTimer = window.setTimeout('progressBar("'+panelId+'", '+panelTimeout+', 0, '+barWidth+');', 1000 * panelTimeout / barWidth);	
			}
		}		
	}
}

function panelNext(panelId, increment) {
	if (viewVisual) {
		// retrieve current id
		var panel = controls[panelId];
		var panelCurrent = parseFloat(panel.Current);
		var panelTotal = parseFloat(panel.Total);
		
		if (panel.Random) {
			var panelRandom;
			var numberMatch = true;
			
			while(numberMatch) {
				panelRandom = random(1, panel.Total);
				
				if (panelRandom != panelCurrent) {
					numberMatch = false;
				}
			}
			
			panelCurrent = panelRandom;
		} else {
			panelCurrent = panelCurrent + parseFloat(increment);
		}
		
		if (panelCurrent > panelTotal) {
			panelCurrent = 1;
		} else if (panelCurrent <= 0) {
			panelCurrent = panelTotal;	
		}	

		panelJump(panelId, panelCurrent);		
	}
}

function panelCollapse(panelId) {
	var content = document.getElementById('content-' + panelId);
	var navigate = document.getElementById('navigate-' + panelId);
	
	if (content.style.display == "block" | content.style.display == "") {
		content.style.display = "none";
		
		panelSwapDisplayToggle(panelId);

		if (navigate) {
			navigate.style.display = "none";		
		}
	} else {
		content.style.display = "block";

		panelSwapDisplayToggle(panelId);

		if (navigate) {
			navigate.style.display = "block";		
		}		
	}
}

function panelSwapDisplayToggle(panelId) {
	var button = document.getElementById('button-collapse-' + panelId);
	var buttonText = panelGetVariable("button-collapse-" + panelId, "label");
	
	if (buttonText != "") {
		panelSetVariable("button-collapse-" + panelId, "label", button.innerHTML);		
		button.innerHTML = buttonText;
	}		
}

// scroll bars
// create timer in case called before a scroll
var scrollTimer;

function scrollStart(element, distance, direction, delay, increment) {
	// variables
	var remaining = distance - increment;
	var carryOn = true;
		
	// get container
	var element = document.getElementById(element)
		
	// retrieve properties
	var topMargin = cleanSize(element.style.marginTop);
	var leftMargin = cleanSize(element.style.marginLeft);
		
	var containerWidth = element.parentNode.offsetWidth;
	var containerHeight = element.parentNode.offsetHeight;
		
	var elementHeight = element.offsetHeight;
	var elementWidth = element.offsetWidth;

	// ammend margin variables based on angle
	switch (direction) {
		case "up":		
			topMargin = topMargin + increment;
			break;
		case "right":
			leftMargin = leftMargin + increment;
			break;								
		case "down":
			topMargin = topMargin - increment;
			break;				
		case "left":
			leftMargin = leftMargin - increment;
			break;				
	}
	
	// check container constraints
	if (topMargin > 0) { topMargin = 0; carryOn = false}
	if (topMargin < - elementHeight + containerHeight) { topMargin = - elementHeight + containerHeight; carryOn = false}
	// if (leftMargin > 0) { leftMargin = 0; }
	// if (leftMargin < - elementWidth + containerWidth) { leftMargin = - elementWidth + containerWidth; }
	if (remaining <= 0) { carryOn = false;}
	
	// set margins
	element.style.marginTop = topMargin + "px";
	element.style.marginLeft = leftMargin + "px";
	
	if (carryOn == true) {
		scrollTimer = window.setTimeout('scrollStart("' + element.id + '", ' + remaining + ', "' + direction + '", ' + delay + ', ' + increment + ');', delay);
	}
}
	
function scrollStop() {
	scrollTimer = clearInterval(scrollTimer);	
}

function cleanSize(value) {
	var newValue = value;
	
	if (newValue == null || newValue == "") {
		newValue = "0";
	}
	
	newValue = parseInt(replace(newValue, "px", ""));
	
	return newValue;
}


// Source: Microsoft ASP.NET 2.0 
// http://www.asp.net/vwd/starterkits.aspx?tabIndex=4&tabId=46

function getElementPosition(element) {    var result = new Object();    result.x = 0;    result.y = 0;    result.width = 0;    result.height = 0;
    if (element.offsetParent) {        result.x = element.offsetLeft;        result.y = element.offsetTop;        var parent = element.offsetParent;
        while (parent) {            result.x += parent.offsetLeft;            result.y += parent.offsetTop;            var parentTagName = parent.tagName.toLowerCase();
            if (parentTagName != "table" &&                parentTagName != "body" &&                 parentTagName != "html" &&                 parentTagName != "div" &&                 parent.clientTop &&                 parent.clientLeft) {
                result.x += parent.clientLeft;                result.y += parent.clientTop;
            }
            parent = parent.offsetParent;        }    }
    else if (element.left && element.top) {        result.x = element.left;        result.y = element.top;    }
    else {        if (element.x) {            result.x = element.x;	       }
        if (element.y) {            result.y = element.y;        }    }
    if (element.offsetWidth && element.offsetHeight) {        result.width = element.offsetWidth;        result.height = element.offsetHeight;    }
    else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {        result.width = element.style.pixelWidth;        result.height = element.style.pixelHeight;    }
    return result;}
