window.location.querystring = (function() {
    var collection = {};
    var querystring = window.location.search;
    if (!querystring) {
        return { toString: function() { return ""; } };
    }
    querystring = decodeURI(querystring.substring(1));
    var pairs = querystring.split("&");
    for (var i = 0; i < pairs.length; i++) {
        if (!pairs[i]) {
            continue;
        }
        var seperatorPosition = pairs[i].indexOf("=");
        if (seperatorPosition == -1) {
            collection[pairs[i]] = "";
        }
        else {
            collection[pairs[i].substring(0, seperatorPosition)] = pairs[i].substr(seperatorPosition + 1);
        }
    }
    collection.toString = function() {
        return "?" + querystring;
    };
    return collection;
})();

var Popper = new Class({
	
		Implements: [Events, Options],
	
		options: {
			minHeight: 0,
			togglerOpenStyle: {},
			togglerCloseStyle: {},
			elementOpenStyle: {},
			elementCloseStyle: {}
			/*onOpen: $empty,
			onClose: $empty,
			onOpening: $empty,
			onClosing: $empty*/
		},
		
		scrollAfter: false,
	
		initialize: function(){
			var params = Array.link(arguments, {'togglers': $defined, 'elements': $defined, 'options': Object.type});
			if (params.options) {
				if (params.options.minHeight) { this.options.minHeight = params.options.minHeight }
				if (params.options.togglerOpenStyle) { this.options.togglerOpenStyle = params.options.togglerOpenStyle }
				if (params.options.togglerCloseStyle) { this.options.togglerCloseStyle = params.options.togglerCloseStyle }
				if (params.options.elementOpenStyle) { this.options.elementOpenStyle = params.options.elementOpenStyle }
				if (params.options.elementCloseStyle) { this.options.elementCloseStyle = params.options.elementCloseStyle }
				/*if (params.options.onOpen) { this.options.onOpen = params.options.onOpen }
				if (params.options.onClose) { this.options.onClose = params.options.onClose }
				if (params.options.onOpening) { this.options.onOpening = params.options.onOpening }
				if (params.options.onClosing) { this.options.onClosing = params.options.onClosing }*/
			}
			var togglersUID = new Array;
			params.togglers.each(function(item){
				togglersUID.push(item.uid);
			});
			var items = params.elements.associate(togglersUID);
			for (i=0; i<params.togglers.length; i++) {
				this.attachEvent(params.togglers[i], items[params.togglers[i].uid]);
			}
			
			//Look for a popper to be opened on page load.
			if (window.location.querystring && window.location.querystring.o) {
			    var toOpen = "";
			    params.togglers.each(function(item) {
			        if (item.get("rel") == window.location.querystring.o) {
			            toOpen = item;
			        }
			    });
			    this.scrollAfter = true;
			    toOpen.fireEvent("click");
			}
		},
		
		attachEvent: function(toggler, element){
			toggler.addEvent("click", this.doEvent.bind(this, {"toggler":toggler, "element":element}));
			toggler.store('opening', false);
		},
		
		doEvent: function(params){
		    var scrollAfter = this.scrollAfter;
			var toggler = params.toggler;
			var element = params.element;
			var popElement = new Fx.Tween(element, {
			    onComplete: function() { if(scrollAfter) { new Fx.Scroll(window, { offset: { "x": 0, "y": -(toggler.getSize().y) }}).toElement(element); }}
			});
			if (!toggler.retrieve('opening')) {
				toggler.setStyles(this.options.togglerOpenStyle);
				popElement.start('height', element.getScrollHeight());
				toggler.store('opening', true);
			} else {
				toggler.setStyles(this.options.togglerCloseStyle);
				popElement.start('height', this.options.minHeight);
				toggler.store('opening', false);
			}
		}
	});