Event.observe(window,"load",function()
{
	$("viewport").addClassName("is-loaded");
});

Event.observe(window,"unload",function()
{
	destroyCache();
});

destroyCache = function()
{
	$A(document.getElementsByTagName('*')).each(function(element)
	{
    	if (!element._prototypeEventID) return;
		Event.stopObserving(element);
  });
}

// ----------------------------------------------

checkForHash = function()
{
	var selector = document.location.hash.replace("#","");
	
	if
	(
		(
			selector != null
		)
		||
		(
			selector != ""
		)
		||
		(
			selector == "view"
		)
	)	

	{		
		if ($(selector).className == "modal-window-content")
		{
			anchorBehaviour.openModalWindow(selector);
		}
	}
}

//Event.observe(window,"load",checkForHash);
openModal = function (selector)
{
    adjustProblematicSelectors();
				
    var viewportListener = new Element("div",
    {
	    "id": "viewport-listener"
    });
	
    $("viewport").insert(viewportListener);
	
    var unit = "px";
	
    var viewportListenerDimensions = $("viewport").getDimensions();
	
    var viewportListenerHeight = viewportListenerDimensions.height + unit;
	
    $("viewport-listener").setStyle
    (
	    {
		    height: viewportListenerHeight
	    }
    );
	
    var viewportDimensions = document.viewport.getDimensions();
    var selectorDimensions = $(selector).getDimensions();
	
    var xCoordinate = (viewportDimensions.width - selectorDimensions.width)/2 + unit;
	
    var yCoordinate = Math.round(document.viewport.getScrollOffsets().top + ((window.innerHeight - selectorDimensions.height))/2/3) + unit;
	
    $(selector).setStyle
    (
	    {
		    top: yCoordinate,
		    left: xCoordinate
	    }
    );
	
    Effect.Appear(selector,
    {
	    duration: 0.1
    });            
	
    document.location.hash = selector;
	
    $("viewport-listener").observe("click",function()
    {
	    Effect.Fade(selector,
	    {
		    duration: 0.1,
		    delay: .1,
		    afterFinish:function()
		    {
			    restoreProblematicSelectors();
		    }
	    });
		
	    document.location.hash = "view";
		
	    $("viewport-listener").stopObserving("click");
	    $("viewport-listener").remove();
    });
}

closeModal = function (selector)
{
    Effect.Fade(selector,
	{
		duration: 0.1,
		delay: .1,
		afterFinish:function()
		{
			restoreProblematicSelectors();
		}
	});
	
	document.location.hash = "view";
	
	$("viewport-listener").stopObserving("click");
	$("viewport-listener").remove();
	return false;
}

// ----------------------------------------------
anchorBehaviour = 
{	
	attachAnchorBehaviour: function()
	{
		$$("a[rel]").each(function(obj)
		{ 
			switch(obj.rel)
			{
				case 'external':
				case 'nofollow':
				case 'non-web-document':
				
				obj.onclick = function()
				{
					anchorBehaviour.openWindow(this.href);
					return false;
				}
				break;
				
				case 'within-page':
				
				obj.onclick = function()
				{
					anchorBehaviour.scrollTo(this.href);
					return false;
				}
				break;
				
				case 'modal':
				
				obj.onclick = function()
				{
					var anchorReference = obj.readAttribute("href");
					//var selector = anchorReference.substring(0,anchorReference.indexOf(".aspx"));
					
					var selector = anchorReference.substring(anchorReference.indexOf("#")+1);
					
					anchorBehaviour.openModalWindow(selector);
					return false;
				}
				break;
			}
			
			$$(".modal-window a.close").each(function(obj)
			{ 
				obj.onclick = function()
				{
					var anchorReference = obj.readAttribute("href");
					var selector = anchorReference.substring(anchorReference.indexOf("#")+1);
					
					var originalSelector = anchorReference.substring(0,anchorReference.indexOf("#"));
					
					anchorBehaviour.closeModalWindow(selector);						
					return false;
				}
			});
		});
	},
	
	openModalWindow: function(selector)
	{
		openModal(selector);
	},
	
	closeModalWindow: function(selector)
	{
		closeModal(selector);
	},
		
	scrollTo: function(href)
	{
		var modifiedHref = href.substring(href.indexOf('#')+1);
			
		Effect.ScrollTo(modifiedHref,
		{
			afterFinish:function()
			{	
				//document.location.hash = modifiedHref;
			}
		});
	},
	
	openWindow: function(href)
	{
		var attributes = "scrollbars=yes,toolbar=yes,menubar=yes,status=yes,directories=no,location=yes,resizable=yes";
		var windowOrTab = window.open(href,"",attributes);
		
		windowOrTab.focus();
	}
}

document.observe("dom:loaded",anchorBehaviour.attachAnchorBehaviour);

// Modal Helper Functions
// ----------------------------------------------
adjustProblematicSelectors = function()
{
	var selectorTypeA = $$("textarea");
	for (var i = 0;i<selectorTypeA.length;i++)
	{
		if (selectorTypeA[i].className != "scrollOK")
		{
			selectorTypeA[i].setStyle
			(
				{
					overflow: "hidden"
				}
			);
		}
	}				
	if (Prototype.Browser.IE)
	{
		var selectorTypeB = $$("select");
		for (var s = 0;s<selectorTypeB.length;s++)
		{
			selectorTypeB[s].setStyle
			(
				{
					visibility: "hidden"
				}
			);
		}
		var selectorTypeC = ($$("object") || $$("embed"));
		for (var i = 0;i<selectorTypeC.length;i++)
		{
			if (selectorTypeC[i].className != "viewOK")
			{
				selectorTypeC[i].setStyle
				(
					{
						visibility: "hidden"
					}
				);
			}
		}
	}
}

restoreProblematicSelectors = function()
{
	var selectorTypeA = $$("textarea");
	for (var i = 0;i<selectorTypeA.length;i++)
	{
		if (selectorTypeA[i].className != "scrollOK")
		{
			selectorTypeA[i].setStyle
			(
				{
					overflow: "auto"
				}
			);
		}	
	}
	if (Prototype.Browser.IE)
	{
		var selectorTypeB = $$("select");
		for (var s = 0;s<selectorTypeB.length;s++)
		{
			selectorTypeB[s].setStyle
			(
				{
					visibility: "visible"
				}
			);
		}
		var selectorTypeC = ($$("object") || $$("embed"));
		for (var i = 0;i<selectorTypeC.length;i++)
		{
			if (selectorTypeC[i].className != "viewOK")
			{
				selectorTypeC[i].setStyle
				(
					{
						visibility: "visible"
					}
				);
			}
		}
	}
}

// ----------------------------------------------
selectorToggle = function(selector,offset,anchor)
{	
	var selectorDimensions = $(selector).getDimensions();
	var unit = "px";
	var duration = "0.7";
	
	modifySelector = function()
	{
		$(selector).setStyle
		(
			{
				height: selectorHeight + unit
			}
		);
	}
	
	if (anchor.className == "toggle")
	{
		var selectorHeight = Math.abs(selectorDimensions.height) + Math.abs(offset);
		
		modifySelector();
		
		Effect.BlindDown(selector,
		{
			duration: duration,
			afterFinish:function()
			{	
				anchor.className = "toggle open";
			}
		});
	}
	else
	{
		var selectorHeight = Math.abs(selectorDimensions.height) - Math.abs(offset);
		
		Effect.BlindUp(selector,
		{
			duration: duration,
			afterFinish:function()
			{	
				anchor.className = "toggle";
				modifySelector();
			}
		});
	}
}