//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
// 
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------

ContentPageSection = function(){

this.collapseSectionsByDefault = false;
this.firstSection = null;
this.expandImage = null;
this.collapseImage = null;
this.expandAllImage = null;
this.collapseAllImage = null;
this.backToTopImage = null;
this.shimImage = null;
this.sectionCollapseDivs = null;
this.sectionCollapseLinks = null;

// test message, 
this.backToTopText = null;
this.expandAllText = null;
this.collapseAllText = null;
};

ContentPageSection.prototype.init = function(imgPath) {

	this.backToTopText = contentPage.res.backToTopText;
	this.expandAllText = contentPage.res.expandAllText;
	this.collapseAllText = contentPage.res.collapseAllText;

	this.expandImage = contentPage.resolveUrl(imgPath + 'expand.gif');		
	this.collapseImage = contentPage.resolveUrl(imgPath + 'collapse.gif');
	this.expandAllImage = contentPage.resolveUrl(imgPath + 'expand_all.gif');	
	this.collapseAllImage = contentPage.resolveUrl(imgPath + 'collapse_all.gif');
	this.backToTopImage = contentPage.resolveUrl(imgPath + 'back_to_top.gif');
	this.shimImage = contentPage.resolveUrl(imgPath + 'shim.gif');
};

// Creates the collapsible section links.
ContentPageSection.prototype.createSectionLinks = function(tagName, classSelector) {

	if (document.getElementsByTagName) {
		var elements = document.getElementsByTagName(tagName);
		var sectionElements = new Array(elements.length);
		var totalLinks = 0;
		for (var i = 0; i < elements.length; i++) {
			var element = elements[i];
			if (element.className == classSelector) {
				sectionElements[totalLinks++] = element;
			}
		}
		sectionElements.length = totalLinks;
		this.sectionCollapseDivs = new Array(totalLinks);
		this.sectionCollapseLinks = new Array(totalLinks);
		this.firstSection = sectionElements[0];
		for (var i = 0; i < sectionElements.length; i++) {
			var element = sectionElements[i];
			var siblingContainer;
			if (document.createElement && (siblingContainer = document.createElement('div')) && siblingContainer.style) {	
				var nextSibling = element.nextSibling;
				element.parentNode.insertBefore(siblingContainer, nextSibling);
				var nextElement = sectionElements[i + 1];
				while (nextSibling != nextElement && nextSibling != null && nextSibling.className != 'copyright') {
					var toMove = nextSibling;
					nextSibling = nextSibling.nextSibling;
					siblingContainer.appendChild(toMove);
				}
				if (this.collapseSectionsByDefault) {
    				siblingContainer.style.display = 'none';
    			}
    			this.sectionCollapseDivs[i] = siblingContainer;
    			this.createCollapsibleSection(element, siblingContainer, i);
			}
			else {
				return;
			}
		}
		this.createExpandCollapseAllSectionsLinks(sectionElements[0]);
	}
};

// Creates a collapsible section.
ContentPageSection.prototype.createCollapsibleSection = function(element, siblingContainer, index) {
	if (document.createElement) {
		// Add a spacing between the sections.
		var sectionSeparator = document.createElement('img');
		sectionSeparator.src = this.shimImage;
		sectionSeparator.height = '3';
		sectionSeparator.border = '0';
		sectionSeparator.align = 'absmiddle';
		element.parentNode.insertBefore(sectionSeparator, element);
		
		// Add a expand/collapse link to the section heading.
		var span = document.createElement('span');
		var link = document.createElement('a');
		link.collapseDiv = siblingContainer;
		link.href = '';
		var image = document.createElement('img');
		if (this.collapseSectionsByDefault) {
			image.src = this.expandImage;
		}
		else {
			image.src = this.collapseImage;
		}
				
		image.width = '17';
		image.height = '15';
		image.border = '0';
		image.align = 'absmiddle';
		link.appendChild(image);
		var self = this;
		link.onclick = function(evt) {
			// here "this" is the tarhet element, i.e. the IMG
			// Expands or collapses a section based on the received event.
			if (this.collapseDiv.style.display == '') {
				this.parentNode.parentNode.nextSibling.style.display = 'none';
				this.firstChild.src = self.expandImage;
			}
			else {
				this.parentNode.parentNode.nextSibling.style.display = '';
				this.firstChild.src = self.collapseImage;
			}
			if (evt && evt.preventDefault) {
				evt.preventDefault();
			}
			return false;
		};

		this.sectionCollapseLinks[index] = link;
		span.appendChild(link);
		element.insertBefore(span, element.firstChild);
		element.appendChild(document.createTextNode(String.fromCharCode(160)));
		element.appendChild(document.createTextNode(String.fromCharCode(160)));
    	
		// Add a Back To Top link in the section heading.
		this.createBackToTopLink(siblingContainer);
	}
};

// Creates a Back to top link.
ContentPageSection.prototype.createBackToTopLink = function(element) {
	var div;
	
	if (document.createElement && (div = document.createElement('div'))) {
		div.className = 'backToTopLink';
		div.align = 'right';
		var image = document.createElement('img');
		image.src = this.backToTopImage;
		image.width = '16';
		image.height = '16';
		image.border = '0';
		image.align = 'absmiddle';		
		var link = document.createElement('a');
		link.className = 'backToTopLink';
		link.href = '#';
		link.appendChild(image);
		var span = document.createElement('span');
		span.className = 'backToTopLink';
		span.appendChild(document.createTextNode(this.backToTopText));		
		link.appendChild(span);
		div.appendChild(link);
		element.appendChild(div);
	}
};


// Creates the Expand All and Collapse All Sections links.
ContentPageSection.prototype.createExpandCollapseAllSectionsLinks = function(firstElement) {
	var div;
	var self = this;
	
	if (document.createElement && (div = document.createElement('div'))) {
		div.className = 'expandCollapseLink';
		div.align = 'right';
		var image = document.createElement('img');
		image.src = this.expandAllImage;
		image.width = '16';
		image.height = '16';
		image.border = '0';
		image.align = 'absmiddle';		
		var link = document.createElement('a');
		link.className = 'expandCollapseLink';
		link.href = '';
		link.appendChild(image);
		link.onclick = /*this.expandAll;*/ function(evt) {
			 for (var i = 0; i < self.sectionCollapseDivs.length; i++) {
			 	self.sectionCollapseDivs[i].style.display = '';
			 	self.sectionCollapseLinks[i].firstChild.src = self.collapseImage;
			 }
			 if (evt && evt.preventDefault) {
			 	evt.preventDefault();
			 }
			 return false;
		};
		var span = document.createElement('span');
		span.className = 'expandCollapseText';
		span.appendChild(document.createTextNode(this.expandAllText));
		link.appendChild(span);
		div.appendChild(link);
		div.appendChild(document.createTextNode(String.fromCharCode(160)));
		div.appendChild(document.createTextNode(String.fromCharCode(160)));
		div.appendChild(document.createTextNode(String.fromCharCode(160)));
		div.appendChild(document.createTextNode(String.fromCharCode(160)));						
		
		image = document.createElement('img');
		image.src = this.collapseAllImage;
		image.width = '16';
		image.height = '16';
		image.border = '0';
		image.align = 'absmiddle';
		link = document.createElement('a');
		link.className = 'expandCollapseLink';
		link.href = '#';
		link.appendChild(image);
		link.onclick = /*this.collapseAll;*/function(evt) {
			for (var i = 0; i < self.sectionCollapseDivs.length; i++) {
				self.sectionCollapseDivs[i].style.display = 'none';
				self.sectionCollapseLinks[i].firstChild.src = self.expandImage;
			}
			if (evt && evt.preventDefault) {
				evt.preventDefault();
			}
			return false;
		};
		span = document.createElement('span');
		span.className = 'expandCollapseText';
		span.appendChild(document.createTextNode(this.collapseAllText));				
		link.appendChild(span);
		div.appendChild(link);
		
		/*
		var overviewSeparator = document.getElementById("overviewSeparator");
		overviewSeparator.parentNode.insertBefore(div, overviewSeparator);
		*/
		if (this.firstSection != null) {
			this.firstSection.parentNode.insertBefore(div, this.firstSection);
		}
	}
};

