// actpage = 'decollectie.html';

/**
 * ArtCollection.js
 *
 * Object for taking care of interaction in ArtCollection interface.
 *
 * @author R.J.T. de Vries <rdevries@thirdwave.nl>
 * @version 1.00, 08/13/2008
 * @access public
 * @package Kunsthuizen
 */
function ArtCollection() {

	/**
	 * Compatibility mode.
	 * @var boolean _compat
	 * @access private
	 */
	var _compat = false;

	/**
	 * Initialization method. Adds events to interactive elements.
	 * 
	 * @return	boolean		true on success, false on failure.
	 * @access	public
	 */
	this.init = function() {
		var f, i, fieldsets, divs, links;
		
		var dynamicSelect = new DynamicSelect();
		dynamicSelect.init();
		
		if ( (f = document.getElementByAttribute('className', 'artcoll', 'form')) ) {
			// set objects required for AJAX-handling.
			if ( typeof(actpage) == 'undefined' ) {
				window.actpage = f.getAttribute('action');
			}
			window.xmlhttp = new XMLHttp();
			window.xmlprocessor = new XMLProcessor();
			window.data = new Data();
			
			data.initEvents(f);
			
			if ( !xmlhttp.init() || !xmlprocessor.init() || !data.init() ) {
				xmlhttp = xmlprocessor = data = null;
			}
			
			if ( (fieldsets = f.getElementsByTagName('fieldset')) ) {
				for ( i = 0; i < fieldsets.length; i++ ) {
					addEvent(fieldsets[i], 'click', _toggleFieldset);
					_setLegendCaptions(fieldsets[i]);
				}
			}
			setTimeout(_initLegendCaptions, 2000);
			
			for ( i = 0; i < f.elements.length; i++ ) {
				if ( !f.elements[i] ) continue;
				el = f.elements[i];
				if ( el.type && el.type == 'hidden' ) continue;
				if ( el.type && el.type == 'checkbox' ) {
					addEvent(el, 'click', _handleChange);
				}
				if ( el.type == 'submit' && data && !_compat ) {
					addEvent(el, 'click', _closeAllFieldsets);
				}
				if ( el.tagName && el.tagName.toLowerCase() == 'select' ) {
					addEvent(el, 'change', _handleChange);
				}
			}
		}
		
		links = document.getElementsByAttribute('className', 'selectall', 'a');
		for ( i = 0; i < links.length; i++ ) {
			addEvent(links[i], 'click', _selectAll);
		}
		
		links = document.getElementsByAttribute('className', 'deselectall', 'a');
		for ( i = 0; i < links.length; i++ ) {
			addEvent(links[i], 'click', _selectAll);
		}
		
		//addEvent(document.body, 'mousemove', _togglePopover);
		if ( !this.refreshEvents() ) return false;
		return true;
	} // this.init()
	
	/**
	 * 
	 * 
	 * 
	 * @param		type	var
	 * @return	type	var
	 * @access	public/private
	 */
	function _initLegendCaptions() {
		var f, i, fieldsets;
		if ( (f = document.getElementByAttribute('className', 'artcoll', 'form')) ) {
			if ( (fieldsets = f.getElementsByTagName('fieldset')) ) {
				for ( i = 0; i < fieldsets.length; i++ ) {
					_setLegendCaptions(fieldsets[i]);
				}
			}
		}
		return;
	} // _initLegendCaptions()
	
	/**
	 * Refresh the events for artworks and pagenumbers after the document's
	 * content has been updated using an AJAX response.
	 * 
	 * @return	boolean		true on success, false on failure.
	 * @access	privileged
	 */
	this.refreshEvents = function(xml) {
		if ( !_initPagenumbers() ) return false;
		//_togglePopover(null);
		// if ( !_initArtworks() ) return false;
		return true;
	} // this.refreshEvents()
	
	/**
	 * A method to process the pagenumbers and the number of results found based
	 * on the criteria that were processed.
	 * 
	 * @param		object		xml	
	 * @return	void
	 * @access	privileged
	 */
	this.processPagenumbers = function(xml) {
		var divs, i, numtotal = 0, numSpans, span;
		
		divs = xml.getElementsByTagName('div');
		if ( divs.length ) {
			for ( i = 0; i < divs.length; i++ ) {
				if ( (numtotal = divs[i].getAttribute('total')) ) {
					break;
				}
			}
		}
		
		numSpans = document.getElementsByAttribute('className', 'numfound', 'span');
		for ( i = 0; i < numSpans.length; i++ ) {
			if ( (span = numSpans[i].getElementsByTagName('span')[0]) ) {
				span.innerHTML = numtotal;
				numSpans[i].style.display = 'block';
			}
		}
	
		xmlprocessor.process(xml);
	} // this.processPagenumbers()
	
	/**
	 * Add events to the page-numbers, so that they invoke an AJAX-request instead
	 * of their standard 'link' behaviour.
	 * 
	 * @return	boolean			true on success, false on failure.
	 * @access	private
	 */
	function _initPagenumbers() {
		var pnumdivs, links, i, j;
		
		pnumdivs = document.getElementsByAttribute('className', 'pagenumbers', 'div');
		if ( !pnumdivs.length ) return false;
		
		for ( j = 0; j < pnumdivs.length; j++ ) {
			if ( !(links = pnumdivs[j].getElementsByTagName('a')) ) continue;
			for ( i = 0; i < links.length; i++ ) {
				addEvent(links[i], 'click', _handlePageFlip);
			}
		}
		return true;
	} // _initPagenumbers()
	
	/**
	 * Remove all 'active' classNames from all fieldsets in the same form as
	 * given fieldset and then add 'active' as classname to given fieldset.
	 * 
	 * @param		object	[e]		event object for compliant browsers.
	 * @return	boolean				true on success, false on failure.
	 * @access	private
	 */
	function _toggleFieldset(e) {
		var eventSrc, f, fieldsets, i;
		
		if ( !e ) e = window.event;
		
		// Do not toggle if not the legend itself was clicked.
		if ( !(eventSrc = getParentNode('legend', getEventSrc(e))) ) return;
		
		// Toggling of visibility is done on the level of the fieldset.
		if ( !(eventSrc = getParentNode('fieldset', getEventSrc(e))) ) return false;
		if ( !eventSrc.tagName.toLowerCase() == 'fieldset' ) return false;
		
		if ( (f = getParentNode('form', eventSrc)) ) {
			if ( fieldsets = f.getElementsByTagName('fieldset') ) {
				for ( i = 0; i < fieldsets.length; i++ ) {
					if ( fieldsets[i] == eventSrc ) {
						continue;
					}
					if ( fieldsets[i].className.indexOf(' active') != -1 ) {
						fieldsets[i].className = fieldsets[i].className.replace(' active', '');
					} else if ( fieldsets[i].className.indexOf('active') != -1 ) {
						fieldsets[i].className = fieldsets[i].className.replace('active', '');
					}
				}
			}
		}
		
		if ( eventSrc.className.indexOf(' active') != -1 ) {
			eventSrc.className = eventSrc.className.replace(' active', '');
		} else if ( eventSrc.className.indexOf('active') != -1 ) {
			eventSrc.className = eventSrc.className.replace('active', '');
		} else {
			eventSrc.className += eventSrc.className.length ? ' active' : 'active';
		}
		return true;
	} // _toggleFieldset()
	
	/**
	 * Remove the 'active' part from the className of all fieldsets.
	 * This method is called when the 'submit' button is pressed.
	 * 
	 * @return	void
	 * @access	private
	 */
	function _closeAllFieldsets() {
		var fieldsets = document.getElementsByTagName('fieldset'),
				i;
				
		for ( i = 0; i < fieldsets.length; i++ ) {
			fieldsets[i].className = fieldsets[i].className.replace(' active', '');
			fieldsets[i].className = fieldsets[i].className.replace('active', '');
		}
		
		return;		
	} // _closeAllFieldsets()
	
	/**
	 * Handle change of a form element.
	 * 
	 * @param		object	[e]					event object for compliant browsers.
	 * @param		object	[eventSrc]	explicitly given eventSrc.
	 * @return	boolean							true on success, false on failure.
	 * @access	private
	 */
	function _handleChange(e, eventSrc) {
		var f, name,
				cbs,							// all checkboxes in the current parentNode fieldset.
				selects,					// all selectboxes in the current parentNode fieldset.
				numChecked,				// number of checkboxes that is currently checked.
				checkedCaption,		// the caption of the last checkbox that was found to
													// be checked -> if only one checkbox is checked, this
													// should be the caption of the legend for the current
													// fieldset-parent.
				i;								// iterator.
		
		if ( !eventSrc ) {
			if ( !e ) e = window.event;
			if ( !(eventSrc = getEventSrc(e)) ) return false;
		}
		
		if ( eventSrc.tagName.toLowerCase() == 'label' ) {
			eventSrc = eventSrc.getElementsByTagName('input')[0];
		}
		
		if ( !(f = getParentNode('form', eventSrc)) ) return false;

		name = eventSrc.name;
		if ( name.indexOf('[') != -1 ) name = name.substr(name.indexOf('[') + 1);
		if ( name.indexOf(']') != -1 ) name = name.substr(0, name.indexOf(']'));
		f.elements['lastsetting'].value = name;
		
		_setLegendCaptions(getParentNode('fieldset', eventSrc));
		
		if ( data && !_compat ) {
			data.formsubmit(null, f);
			// if ( e && e.preventDefault ) e.preventDefault();
			return true;
		}
		f.submit();
	} // _handleChange()

	/**
	 * Handles a click on the selectall or de-selectall links.
	 *
	 * Select/De-Selects all checkboxes in the fieldset-parent of the event's
	 * eventSrc.
	 * 
	 * @param		object		[e]		event object for compliant browsers.
	 * @return	boolean					false to prevent IE default action.
	 * @access	private
	 */
	function _selectAll(e) {
		var eventSrc,
				fieldset,
				checked,	// new 'checked' status for checkboxes, depending on whether
									// the class of the eventSrc is 'selectall' or 'deselectall'.
				cbs,			// checkboxes in given fieldset.
				i;				// iterator.
		
		if ( !e ) e = window.event;
		if ( e.preventDefault ) e.preventDefault();
		
		eventSrc = getEventSrc(e);
		checked = eventSrc.className == 'selectall' ? true : false;
		
		if ( !(fieldset = getParentNode('fieldset', eventSrc)) ) return false;
		
		cbs = document.getElementsByAttribute('type', 'checkbox', 'input', fieldset);
		if ( !cbs.length ) return false;

		for ( i = 0; i < cbs.length; i++ ) {
			cbs[i].checked = checked;
		}
		
		_setLegendCaptions(fieldset);

		if ( !(f = getParentNode('form', eventSrc)) ) return false;
		if ( data && !_compat ) {
			data.formsubmit(null, f);
		}
		
		return false;
	} // _selectall()
	
	/**
	 * Set the legends captions for the given fieldset, depending on the selection
	 * that has been made within the fieldset.
	 * 
	 * @param		object		fieldset		fielset of which to set the legend caption.
	 * @return	boolean								true on success, false on failure.
	 * @access	private
	 */
	function _setLegendCaptions(fieldset) {
		var legend = fieldset.getElementsByTagName('legend')[0],
				span = legend.getElementsByTagName('span')[0];
				
		if ( !span.getAttribute('sizeadjusted') ) {
			span.style.width = (getWidth(legend)) + 'px';
			span.style.marginRight = '-22px';
			span.setAttribute('sizeadjusted', 1);
		}
	
		// change the display of the legend's <span>, being 'alle', 'verschillende'
		// or the caption of the ONLY checkbox that is checked.
		cbs = document.getElementsByAttribute('type', 'checkbox', 'input', fieldset);
		if ( cbs.length && cbs[1].getAttribute('type') == 'checkbox' ) {
			numChecked = 0, checkedCaption = '';
			for ( i = 0; i < cbs.length; i++ ) {
				if ( cbs[i].checked ) {
					numChecked++;
					checkedCaption = cbs[i].parentNode.childNodes[1].nodeValue;
					checkedCaption = strtrim(checkedCaption);
				}
			}
			
			if ( numChecked == 0 ) {
				if ( (fieldset = getParentNode('fieldset', span))
						&& fieldset.className.indexOf('availability') != -1 ) {
					span.innerHTML = '(geen selectie)';
				} else {
					span.innerHTML = '(geen)';
				}
			} else if ( numChecked == 1 ) {
				span.innerHTML = '(' + checkedCaption + ')';
			} else if ( numChecked == cbs.length ) {
				span.innerHTML = '(alle)';
			} else {
				span.innerHTML = '(verschillende)';
			}
			span.setAttribute('title', span.innerHTML);
		}
		
		// change the display of the legend's <span>, being 'alle', 'verschillende'
		// or the caption of the ONLY checkbox that is checked.
		selects = fieldset.getElementsByTagName('select');
		if ( selects.length ) {
			for ( i = 0; i < selects.length; i++ ) {
				selectedCaption = strtrim(selects[i].options[selects[i].selectedIndex].innerHTML);
			}
			span.innerHTML = '(' + selectedCaption + ')';
		}
	
		return true;
	} // _setLegendCaptions()
	
	/**
	 * Handle clicking of a pagenumber or page incrementing link.
	 * 
	 * @param		object		[e]		event object for compliant browsers.
	 * @return	boolean					false to cancel default action.
	 * @access	private
	 */
	function _handlePageFlip(e) {
		var eventSrc, actpage, href, target, vars, parts;
		
		if ( !(eventSrc = getParentNode('a', getEventSrc(e))) ) return false;
		href = eventSrc.getAttribute('href');
		href = href.replace(/&amp;/gi, '&');
		
		if ( href.indexOf('?') !== -1 ) {
			actpage = href.substr(0, href.indexOf('?'));
			vars = href.substr(href.indexOf('?') + 1);
		} else if ( href.indexOf('&') !== -1 ) {
			actpage = href.substr(0, href.indexOf('&'));
			vars = href.substr(href.indexOf('&') + 1);
		} else {
			actpage = href;
			vars = '';
		}
		
		actpage = actpage.split('/');
		actpage = actpage[actpage.length - 1];
		if ( vars.indexOf('reqtype') == -1 ) vars += '&reqtype=ajax';
		xmlhttp.xmlRequest(actpage, 'post', vars);
		if ( e && e.preventDefault ) e.preventDefault();
		return false;		
	} // _handlePageFlip()
	
	/**
	 * This function is DISABLED!!
	 * To enable it again ad a class white the classname thumb (class='thumb') to the eventsorce.
	 *
	 * Toggle the popover with the 'big' version of an artwork and some additional
	 * details.
	 * 
	 * @param		object	[e]		event object for compliant browsers.
	 * @return	void
	 * @access	private
	 */
	function _togglePopover(e) {
		var eventSrc, artwork, popinfo, popinfoClone, height, tbl, tds,
				d, t, top, left;

		tbl = _getShadowTable();

		if ( !(eventSrc = getEventSrc(e)) ) {
			tbl.style.display = 'none';
			return false;
		}
		if ( eventSrc.className != 'thumb' ) {
			if ( !(eventSrc = getParentWithAttribute('id=shadowtable', eventSrc))
					|| !tbl.getAttribute('for')
					|| !(eventSrc = document.getElementById(tbl.getAttribute('for'))) ) {
				tbl.style.display = 'none';
				return false;
			}
		}
		if ( !(artwork = getParentWithAttribute('className=artwork', eventSrc)) ) {
			tbl.style.display = 'none';
			return false;
		}
		if ( !(popinfo = document.getElementByAttribute('className', 'popover', 'div', artwork)) ) {
			tbl.style.display = 'none';
			return false;
		}
		
		d = new Date(); t = '_' + d.getTime();
		popinfoClone = popinfo.cloneNode(true);
		popinfo.setAttribute('id', t);
		tbl.setAttribute('for', t);

		if ( (tds = tbl.getElementsByTagName('td')) && tds.length > 4 ) {
			tds[3].style.height = tds[3].childNodes[0].style.height = tds[5].style.height = tds[5].childNodes[0].style.height = '1px';
			tds[4].replaceChild(popinfoClone, tds[4].childNodes[0]);
		}
		
		left = getMouseX(e) + 15;
		top = getMouseY(e) + 15;

		if ( !tbl.style.display || tbl.style.display == 'none' ) {
			tbl.style.left = left + 'px';		// set default left/top now to avoid
			tbl.style.top = top + 'px';			// flickering.
			tbl.style.display = isIE() ? 'block' : 'table';
		}

		if ( (top + getHeight(tbl)) > getWindowHeight() ) {
			top += (getWindowHeight() - (top + getHeight(tbl)));
		}
		if ( (left + getWidth(tbl)) > getWindowWidth() ) {
			left = getMouseX(e) - (getWidth(tbl) + 15);
		}
		
		tbl.style.left = left + 'px';
		tbl.style.top = top + getScrollPosY() + 'px';
		
		if ( tds.length > 4 ) {
			tds[3].childNodes[0].style.height = getHeight(tds[3]) + 'px';
			tds[5].childNodes[0].style.height = getHeight(tds[5]) + 'px';
		}
		
		return true;
	} // _togglePopover()
	
	/**
	 * Dynamically create a table with transparent png images around the edges.
	 * 
	 * @return	object		tbl		table element.
	 * @access	private
	 */
	function _getShadowTable() {
		var tbl, tbody, tr, td, img, vert, horz, i, j;
		
		if ( tbl = document.getElementById('shadowtable') ) return tbl;
		
		vert = ['top', 'mid', 'bot'];
		horz = ['lft', 'mid', 'rgt'];
		
		tbl = document.createElement('table');
		tbl.setAttribute('cellPadding', 0);
		tbl.setAttribute('cellSpacing', 0);
		tbl.setAttribute('border', 0);
		tbl.id = 'shadowtable';
		// addEvent(tbl, 'mousemove', _togglePopover);
		tbody = document.createElement('tbody');
		tbl.appendChild(tbody);
		
		for ( i = 0; i < vert.length; i++ ) {
			tr = document.createElement('tr');
			tbody.appendChild(tr);
			for ( j = 0; j < horz.length; j++ ) {
				td = document.createElement('td');
				tr.appendChild(td);
				img = document.createElement('img');
				img.setAttribute('src', '/graphics/popover.' + vert[i] + '.' + horz[j] + '.png');
				img.setAttribute('alt', '');
				img.className = 'shadowimg';
				td.appendChild(img);
				td.className = vert[i] + horz[j];
				if ( in_array(vert[i], ['top', 'bot']) ) img.style.height = td.style.height = '4px';
				if ( in_array(horz[j], ['lft', 'rgt']) ) td.style.width = '4px';
			}
		}
		
		document.body.appendChild(tbl);
		return tbl;
	} // _getShadowTable()

} // end of object ArtCollection
