/**
 * CSSClass.js: utilities for manipulating the CSS class of an HTML element.
 * 
 * This module defines a single global symbol named CSSClass.  This object
 * contains utility functions for working with the class attribute (className
 * property) of HTML elements.  All functions take two arguments: the element
 * e being tested or manipulated and the CSS class c that is to be tested,
 * added, or removed.  If element e is a string, it is taken as an element
 * id and passed to document.getElementById().
 */
var CSSClass = {};  // Create our namespace object

// Return true if element e is a member of the class c; false otherwise
CSSClass.has = function(e, c) {
    if (typeof e == "string") e = document.getElementById(e); // element id

    // Before doing a regexp search, optimize for a couple of common cases.
    var classes = e.className;
    if (!classes) return false;    // Not a member of any classes
    if (classes == c) return true; // Member of just this one class

    // Otherwise, use a regular expression to search for c as a word by itself
    // \b in a regular expression requires a match at a word boundary.
    var pattern = new RegExp('(^|\\s)'+c+'(\\s|$)');
    return pattern.test(e.className);
    // return e.className.search("\\b" + c + "\\b") != -1;
};

// Add class c to the className of element e if it is not already there.
CSSClass.add = function(e, c) {
    if (typeof e == "string") e = document.getElementById(e); // element id
    if (CSSClass.has(e, c)) return; // If already a member, do nothing
    if (e.className) c = " " + c;  // Whitespace separator, if needed
    e.className += c;              // Append the new class to the end
};

// Remove all occurrences (if any) of class c from the className of element e
CSSClass.remove = function(e, c) {
    if (typeof e == "string") e = document.getElementById(e); // element id
    // Search the className for all occurrences of c and replace with "".
    // \s* matches any number of whitespace characters.
    // "g" makes the regular expression match any number of occurrences
    e.className = e.className.replace(new RegExp("\\b"+ c+"\\b\\s*", "g"), "");
};

CSSClass.replace = function(e, r, a) {
    CSSClass.remove(e, r);
    CSSClass.add(e, a);
}

CSSClass.getElementsByClass = function(searchClass,tag,node) {
    var classElements = new Array();
    if ( node == null )
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    // var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
    for (i = 0, j = 0; i < elsLen; i++) {
        // if ( pattern.test(els[i].className) ) {
        if (CSSClass.has(els[i], searchClass)) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
}
/*	EventCache Version 1.0
	Copyright 2005 Mark Wubben

	Provides a way for automagically removing events from nodes and thus preventing memory leakage.
	See <http://novemberborn.net/javascript/event-cache> for more information.
	
	This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
*/

/*	Implement array.push for browsers which don't support it natively.
	Please remove this if it's already in other code */
if(Array.prototype.push == null){
	Array.prototype.push = function(){
		for(var i = 0; i < arguments.length; i++){
			this[this.length] = arguments[i];
		};
		return this.length;
	};
};

/*	Event Cache uses an anonymous function to create a hidden scope chain.
	This is to prevent scoping issues. */
var EventCache = function(){
	var listEvents = [];
	
	return {
		listEvents : listEvents,
	
		add : function(node, sEventName, fHandler, bCapture){
			listEvents.push(arguments);
		},
	
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				
				/* From this point on we need the event names to be prefixed with 'on" */
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				
				item[0][item[1]] = null;
			};
		}
	};
}();
edgeItems = {
    init: function() {
        var divs = document.getElementsByTagName("div");

        for (var i = 0; i < divs.length; i++) {
            var node = divs[i];
            if (CSSClass.has(node, 'js-edge-item')) { 
            	edgeItems.addEvent(node, 'click', edgeItems.getClickEvent(node), false);
			}
			else if (CSSClass.has(node, 'close-window')) { 
			edgeItems.addEvent(node, 'click', edgeItems.getClosingClickEvent(node), false);
			}
        }
    },

    getClickEvent: function(node) {
        return function(e) { edgeItems.ClickEvent(e, node); };
    },
	
	 getClosingClickEvent: function(node) {
        return function(e) { edgeItems.ClosingClickEvent(e, node); };
    },

    ClickEvent: function(e, targetElement) {
        var el = window.event ? targetElement : e ? e.currentTarget : null;
        if (!el) return;

        var forms = CSSClass.getElementsByClass('js-closed' , 'div' , el);
        for (var i = 0; i < forms.length; i++) {
				CSSClass.add(forms[i], 'open');
        }

    },

	 ClosingClickEvent: function(e, targetElement) {
        var el = window.event ? targetElement : e ? e.currentTarget : null;
        if (!el) return;
		CSSClass.replace(el.parentNode, 'open' , 'closed');
		
        if (window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
    },

    addEvent: function(elm, evType, fn, useCapture) {
        // cross-browser event handling for IE5+, NS6 and Mozilla
        // By Scott Andrew
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            EventCache.add(elm, evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    }
};

edgeItems.addEvent(window, 'load', edgeItems.init, false);
hideDisplay = {
    init: function() {
        var divs = CSSClass.getElementsByClass('js-hide-display' , 'ul' , document);

        for (var i = 0; i < divs.length; i++) {
            var nodes = CSSClass.getElementsByClass('js-trigger' , 'a' , divs[i]);
            for (var j = 0; j < nodes.length; j++) {
                hideDisplay.addEvent(nodes[j], 'click', hideDisplay.getClickEvent(nodes[j]), false);
            }
        }
    },

    getClickEvent: function(node) {
        return function(e) { hideDisplay.ClickEvent(e, node); };
    },

    ClickEvent: function(e, targetElement) {
        var el = window.event ? targetElement : e ? e.currentTarget : null;
        if (!el) return;

        var toDisplay = CSSClass.getElementsByClass('js-display' , 'div' , el.parentNode);
        for (var i = 0; i < toDisplay.length; i++) {
			var theDiv = toDisplay[i];
            if (CSSClass.has(toDisplay[i], 'open')) {
                CSSClass.replace(toDisplay[i], 'open' , 'closed');
				CSSClass.remove(toDisplay[i].parentNode, 'active');
            } else {
				CSSClass.replace(toDisplay[i], 'closed' , 'open');
				CSSClass.add(toDisplay[i].parentNode, 'active');
            }
        }


        var divs = CSSClass.getElementsByClass('js-display' , 'div' , el.parentNode.parentNode);
        for (var j = 0; j < divs.length; j++) {
            if (divs[j] != theDiv) {
                CSSClass.replace(divs[j], 'open' , 'closed');
				CSSClass.remove(divs[j].parentNode, 'active');
            }
        }

        var toDisplay = CSSClass.getElementsByClass('js-hide' , 'em' , el.parentNode);
        for (var i = 0; i < toDisplay.length; i++) {
            if (CSSClass.has(toDisplay[i], 'closed')) {
                CSSClass.replace(toDisplay[i], 'closed', 'open');
            } else {
				CSSClass.replace(toDisplay[i], 'open' , 'closed');
                var div = document.getElementById('scrolling-box');
                if (navigator.userAgent.toLowerCase().indexOf('msie')>0) {
                    //alert(el.parentNode);
                    div.scrollTop = el.offsetParent.offsetTop + el.offsetTop - div.offsetTop;
                } else {
                    div.scrollTop = el.offsetTop - div.offsetTop;
                }
            }
            var theEm = toDisplay[i];
        }

        var toDisplay = CSSClass.getElementsByClass('js-hide' , 'em' , el.parentNode.parentNode);
        for (var i = 0; i < toDisplay.length; i++) {
            if (toDisplay[i] != theEm) {
                CSSClass.replace(toDisplay[i], 'closed' , 'open');
            }
        }

        if (window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
    },

    addEvent: function(elm, evType, fn, useCapture) {
        // cross-browser event handling for IE5+, NS6 and Mozilla
        // By Scott Andrew
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            EventCache.add(elm, evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    }
};

hideDisplay.addEvent(window, 'load', hideDisplay.init, false);
scrollingBox = {
    init: function() {

        // Get the Links for the Nav

        var uls = CSSClass.getElementsByClass('js-box-hide-display', 'ul' , document.getElementById('right-column'));

        for (var i = 0; i < uls.length; i++) {
            var nodes = CSSClass.getElementsByClass('js-trigger', 'a' , uls[i]);
            for (var j = 0; j < nodes.length; j++) {
                scrollingBox.addEvent(nodes[j], 'click', scrollingBox.getClickNav(nodes[j]), false);
            }
        }

        // Get the Links for the Scrolling Box
        var box = document.getElementById('scrolling-box');
        if (box) {
		var uls = CSSClass.getElementsByClass('js-box-hide-display' , 'ul' , box);
	
        for (var i = 0; i < uls.length; i++) {
            var nodes = CSSClass.getElementsByClass('js-trigger' , 'a' , uls[i]);
            for (var j = 0; j < nodes.length; j++) {
                scrollingBox.addEvent(nodes[j], 'click', scrollingBox.getClickBox(nodes[j]), false);
            }
		}
		}
    },

    getClickNav: function(node) {
        return function(e) { scrollingBox.ClickNav(e, node); };
    },
	
	getClickBox: function(node) {
        return function(e) { scrollingBox.ClickBox(e, node); };
    },

    ClickNav: function(e, targetElement) {
        var nav = window.event ? targetElement : e ? e.currentTarget : null;
        if (!nav) return;

		var box = document.getElementById('js-'+nav.href.substr(nav.href.search(/#/)+1));
		scrollingBox.ProcessClick(box, nav);
		
		if (window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
		
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
	},
	
	ClickBox: function(e, targetElement) {
        var box = window.event ? targetElement : e ? e.currentTarget : null;
        if (!box) return;
		var nav = document.getElementById('js-'+box.href.substr(box.href.search(/#/)+1)+'-nav');
		scrollingBox.ProcessClick(box, nav);
		
		if (window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
		
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
	},
	
	ProcessClick: function(box, nav) {
        var links = CSSClass.getElementsByClass('js-trigger' , 'a' , nav.parentNode.parentNode);
        for (var i=0; i < links.length; i++) {
            CSSClass.remove(links[i], 'active');
        }

        
        var toDisplay = CSSClass.getElementsByClass('js-display' , 'div' , box.parentNode);
        for (var i = 0; i < toDisplay.length; i++) {
            var theDiv = toDisplay[i];
            if (CSSClass.has(toDisplay[i], 'open')) {
                CSSClass.replace(toDisplay[i], 'open' , 'closed');
                CSSClass.remove(toDisplay[i].parentNode, 'active');
                CSSClass.remove(nav, 'active');
            } else {
				CSSClass.replace(toDisplay[i], 'closed' , 'open');
                CSSClass.add(toDisplay[i].parentNode, 'active');
                CSSClass.add(nav, 'active');
            }
        }

        var divs = CSSClass.getElementsByClass('js-display' , 'div' , box.parentNode.parentNode);
        for (var j = 0; j < divs.length; j++) {
            if (divs[j] != theDiv) {
				CSSClass.replace(divs[j], 'open' , 'closed');
                divs[j].parentNode.className = '';
            }
        }

        var toDisplay = CSSClass.getElementsByClass('js-hide', 'em' , box.parentNode);
        for (var i = 0; i < toDisplay.length; i++) {
            if (CSSClass.has(toDisplay[i], 'closed')) {
				CSSClass.replace(toDisplay[i], 'closed' , 'open');
            } else {
				CSSClass.replace(toDisplay[i], 'open' , 'closed');
                var div = document.getElementById('scrolling-box');
                div.scrollTop = box.offsetTop - div.offsetTop;
            }
            var theEm = toDisplay[i];
        }

        var toDisplay = CSSClass.getElementsByClass('js-hide' , 'em' , box.parentNode.parentNode);
        for (var i = 0; i < toDisplay.length; i++) {
            if (toDisplay[i] != theEm) {
				CSSClass.replace(toDisplay[i], 'closed' , 'open');
            }
		}
    },

    addEvent: function(elm, evType, fn, useCapture) {
        // cross-browser event handling for IE5+, NS6 and Mozilla
        // By Scott Andrew
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            EventCache.add(elm, evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    }
};

scrollingBox.addEvent(window, 'load', scrollingBox.init, false);
submitForm = {
    init: function() {
		
        var submitButton = CSSClass.getElementsByClass('js-submit');
        for (var i = 0; i < submitButton.length; i++) {
			if (submitButton[i].tagName == 'SELECT') {
            	submitForm.addEvent(submitButton[i], 'change', submitForm.getClickEvent(submitButton[i]), false);
			} else {
				submitForm.addEvent(submitButton[i], 'click', submitForm.getClickEvent(submitButton[i]), false);
			}
        }
    },

    getClickEvent: function(node) {
        return function(e) { submitForm.ClickEvent(e, node); };
    },

    ClickEvent: function(e, targetElement) {
        var el = window.event ? targetElement : e ? e.currentTarget : null;
        if (!el) return;
		
		var form = el.parentNode;
		while(form.tagName != 'BODY') {
			if (form.tagName == 'FORM') {
				form.submit();
				break;
			} 
		var form = form.parentNode;
		}
	
		
		//var submitButton = CSSClass.getElementsByClass('js-submit');
		//for (var j = 0; j < submitButton.length; j++){
		//	var form = CSSClass.getElementsByClass('js-form' , 'form' , document);
		//	for (var k = 0; k < form.length; k++) {
		//			 form[k].submit();


        if (window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
    },

    addEvent: function(elm, evType, fn, useCapture) {
        // cross-browser event handling for IE5+, NS6 and Mozilla
        // By Scott Andrew
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            EventCache.add(elm, evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    }
};

submitForm.addEvent(window, 'load', submitForm.init, false);
externalLinks = {
    init: function() {
		var anchors = document.getElementsByTagName("a");
 		for (var i=0; i < anchors.length; i++) {
			var extAnchor = anchors[i];
			if (extAnchor.getAttribute("href") && 
				extAnchor.getAttribute("rel") == "external") {
            	externalLinks.addEvent(extAnchor, 'click', externalLinks.getClickEvent(extAnchor), false);
			}
		}
    },


	getClickEvent: function(extAnchor) {
        return function(e) { externalLinks.ClickEvent(e, extAnchor); };
    },

 	ClickEvent: function(e, targetElement) {
        var el = window.event ? targetElement : e ? e.currentTarget : null;
        if (!el) return;
		el.target = "_blank";
	


    },

    addEvent: function(elm, evType, fn, useCapture) {
        // cross-browser event handling for IE5+, NS6 and Mozilla
        // By Scott Andrew
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            EventCache.add(elm, evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    }
};

externalLinks.addEvent(window, 'load', externalLinks.init, false);popupImg = {
    init: function() {
		var anchors = document.getElementsByTagName("a");
 		for (var i=0; i < anchors.length; i++) {
			var extAnchor = anchors[i];
			if (extAnchor.getAttribute("rel") == "js-popup") {
            	popupImg.addEvent(extAnchor, 'click', popupImg.getClickEvent(extAnchor), false);
				extAnchor.onclick = function() {return false;}
			}
		}
    },


	getClickEvent: function(extAnchor) {
        return function(e) { popupImg.ClickEvent(e, extAnchor); };
    },

 	ClickEvent: function(e, targetElement) {
        var el = window.event ? targetElement : e ? e.currentTarget : null;
        if (!el) return;
		var sPicURL = el.getAttribute("href");
		window.open("/popup.html?"+sPicURL, "", "resizable=1,HEIGHT=200,WIDTH=200");
    },

    addEvent: function(elm, evType, fn, useCapture) {
        // cross-browser event handling for IE5+, NS6 and Mozilla
        // By Scott Andrew
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            EventCache.add(elm, evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    }
};

popupImg.addEvent(window, 'load', popupImg.init, false);


topFeature = {
    init: function() {
        // Unsuccessfully   try to get the box & first nav to fill on page load
		var box = document.getElementById('scrolling-box');
		var firstBoxs = CSSClass.getElementsByClass('first' , 'div' , document.getElementById('left-column'));
		
		var outsideLinks = document.getElementById(document.URL.substr(document.URL.search(/#/)+1));
		var firstLinks = document.URL.substr(document.URL.search(/#/)+1);
		var origLink = CSSClass.getElementsByClass('js-trigger active' , 'a' , document.getElementById('right-column'));
		var firstNavs = CSSClass.getElementsByClass('first' , 'a' , document.getElementById('right-column'));
												   
		//.getElementById('js-scheduling-ticketing-nav');
		
		for (var i = 0; i < firstBoxs.length; i++) {
			var firstBox = firstBoxs[i];
			if (outsideLinks) {
				box.innerHTML = outsideLinks.innerHTML;
				
				for (var j = 0; j < origLink.length; j++) {
					CSSClass.remove(origLink[j], 'active');	
				}
				
				document.getElementById('js-'+firstLinks+'-nav').className = 'js-trigger active';
			} else {
				box.innerHTML = firstBox.innerHTML;
				for (var j = 0; j < firstNavs.length; i++) {
				var firstNav = firstNavs[j];
					CSSClass.add(firstNav, 'active');
					break;
					}
			}
			
		}

		// Get the Links for the Nav
        var uls = CSSClass.getElementsByClass('js-features-box', 'ul' , document.getElementById('right-column'));

        for (var i = 0; i < uls.length; i++) {
            var nodes = CSSClass.getElementsByClass('js-trigger', 'a' , uls[i]);
            for (var j = 0; j < nodes.length; j++) {
                topFeature.addEvent(nodes[j], 'click', topFeature.getClickNav(nodes[j]), false);
            }
		}
    },

    getClickNav: function(node) {
        return function(e) { topFeature.ClickNav(e, node); };
    },


    ClickNav: function(e, targetElement) {
        var nav = window.event ? targetElement : e ? e.currentTarget : null;
        if (!nav) return;
		
		var box = document.getElementById('scrolling-box');
		var linkBoxs = document.getElementById(nav.href.substr(nav.href.search(/#/)+1));
		var links = CSSClass.getElementsByClass('js-trigger' , 'a' , nav.parentNode);
		box.innerHTML = linkBoxs.innerHTML;
		
		var linkss = CSSClass.getElementsByClass('js-trigger' , 'a' , nav.parentNode.parentNode);
        for (var i=0; i < linkss.length; i++) {
            CSSClass.remove(linkss[i], 'active');
        }
		
		if (CSSClass.has(nav, 'active')) {
                CSSClass.remove(nav, 'active');
            } else {	
				CSSClass.add(nav, 'active');
			}
			
			
		if (window.event) {
           window.event.cancelBubble = true;
           window.event.returnValue = false;
        }
		
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
	},
	

    addEvent: function(elm, evType, fn, useCapture) {
        // cross-browser event handling for IE5+, NS6 and Mozilla
        // By Scott Andrew
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            EventCache.add(elm, evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    }
};

topFeature.addEvent(window, 'load', topFeature.init, false);

   function PopupPic(sPicURL) {
     window.open( "/popup.html?"+sPicURL, "",  
     "resizable=1,HEIGHT=200,WIDTH=200");
   }
