﻿var popupArray = [];

document.onclick = check;

function check(e)
{
	var target = (e && e.target) || (event && event.srcElement);
  
	var divs = getElementsByClassName('PopUp');
	var i = 0;
	var obj; 

	if (popupArray.length > 0)
	{
		for (i=0; i<popupArray.length; i++)
		{
			var parentElement = (target ? target : null);
			var match = false;
			while(parentElement != null)
			{
				if(parentElement.id == popupArray[i])
					match = true;
				parentElement = (parentElement.parentElement ? parentElement.parentElement : parentElement.parentNode);
			}
			if (!target.floater && !match)
			{
				obj=document.getElementById(popupArray[i]);
				obj.style.visibility='hidden';
				obj.style.display='none';
				removeArrItem(popupArray, popupArray[i]);
			}
		}
	}
}

function initializeFloater(triggerID, floaterID, click, mouseout, Xoffset, Yoffset) 
{
	if (!offset) var offset = 0;
	if (mouseout == 'undefined') var mouseout = true;
	var trigger = document.getElementById(triggerID);
	var floater = document.getElementById(floaterID);
		
	if (trigger && floater)
	{   
		trigger.floater = floater;
		floater.isFocused = false;
		floater.isFloater = true;
		floater.Xoffset = Xoffset;
		floater.Yoffset = Yoffset;
		
		if (click)
		{
			trigger.onclick = function() {
			var i = 0;
			for (i =0; i < popupArray.length; i++)
			{
				if (popupArray[i] !=floater.id)
				{
					hideFloater(popupArray[i], true);
					removeArrItem(popupArray, popupArray[i]);
				}
			}
			return false;
		}
	}
		
	var divs = floater.getElementsByTagName('div');
	for (var i=0; i < divs.length; i++)
	{
		if (divs[i].className == "button")
		{
			addAREventListener(divs[i],
			'click',
			function() { hideFloater(floater.id, true);
		        	removeArrItem(popupArray, popupArray[i]);});
			}
		}
		
		addAREventListener(trigger, 
		    'click',
		    trigger_onfire);
		addAREventListener(floater,
		    'mouseover',
		    floater_onmouseover);
	}
}
function initializeRsvpFloater(triggerID, triggerBaseID, floaterID, click, mouseout, Xoffset, Yoffset) 
{
  if (!offset) var offset = 0;
  if (mouseout == 'undefined') var mouseout = true;
	var trigger = document.getElementById(triggerID);
	var triggerBase = document.getElementById(triggerBaseID);
	var floater = document.getElementById(floaterID);
		
	if (trigger && triggerBase && floater)
	{   
		trigger.floater = floater;
		trigger.base = triggerBase;
		floater.isFocused = false;
		floater.isFloater = true;
		floater.Xoffset = Xoffset;
		floater.Yoffset = Yoffset;
		
		if (click)
		{
		    trigger.onclick = function() {
		     var i = 0;
             for (i =0; i < popupArray.length; i++)
             {
                 if (popupArray[i] !=floater.id)
                 {
                     hideFloater(popupArray[i], true);
                     removeArrItem(popupArray, popupArray[i]);
                 }
             }
		        return false;
		    }
		}
		
		var divs = floater.getElementsByTagName('div');

		for (var i=0; i < divs.length; i++)
		{
		    if (divs[i].className == "button")
		    {
		        addAREventListener(divs[i],
		            'click',
		            function() { hideFloater(floater.id, true);
		                         removeArrItem(popupArray, popupArray[i]);});
		    }
		}
		
		addAREventListener(trigger, 
		    'click',
		    triggerRsvp_onfire);
		addAREventListener(floater,
		    'click',
		    floater_onmouseover);
	}
}

function floater_onmouseover(e)
{
	if (!e) var e = window.event;
	
    var element = getEventTarget(e);
    if (element)
    {
        if (element.isFloater)
        {
            element.isFocused = true;
        }
        else
        {
            while (element)
            {
                element = element.parentNode;
                
                try {
					if (element.isFloater)
					{
						element.isFocused = true;
						break;
					}
                }
                catch(e){}
            }
        }
    }    
}

function hideFloater(elementID, forceClose)
{
    var element = document.getElementById(elementID);
    if (element) 
    {
        if (forceClose)
        {
            element.isFocused = false;
        }
        if (!element.isFocused)
        {
            element.style.visibility = "hidden";
		element.style.display = "none";
        }
    }
}

function trigger_onfire(e) 
{
    if (!e) var e = window.event;
    
    var element = getEventTarget(e);
    var divs = getElementsByClassName('PopUp');
    var i = 0;

     if (popupArray.length > 0)
     {
        for (i=0; i <popupArray.length; i++)
        {
			hideFloater(popupArray[i], true);
			removeArrItem(popupArray, popupArray[i]);
        }
     }
    
    if (element && element.floater)
    {
        var floater = element.floater;
        var floaterWidth = floater.offsetWidth;
        var floaterHeight = floater.offsetHeight;
        var Xoffset = floater.Xoffset ? floater.Xoffset : 0;
        var Yoffset = floater.Yoffset ? floater.Yoffset : 0;
        
        var x = findX(element) + Xoffset;
        var y = findY(element) + element.offsetHeight + Yoffset;
                
        var browserWidth = getClientWidth();
        var browserHeight = getClientHeight();
        var scrollLeft = getScrollLeft();
        var scrollTop = getScrollTop();   
                
        if (browserWidth > floaterWidth)
        {
            if (x < scrollLeft)
            {
                x = scrollLeft;
            }
            else if (x + floaterWidth > browserWidth + scrollLeft)
            {
                x = browserWidth - floaterWidth + scrollLeft;                    
            }
        }
        
        if (browserHeight > floaterHeight)
        {
            if (y + floaterHeight > browserHeight + scrollTop)
            {
                y = y - floaterHeight - element.offsetHeight - (2*Yoffset);
                y = y > scrollTop ? y : scrollTop;
            }
        }
             
        floater.style.left = x + "px";
        floater.style.top = y + "px";
        floater.style.visibility = "visible";
        floater.style.display = "block";
        popupArray[popupArray.length] = floater.id;
    }
}

function triggerRsvp_onfire(e) 
{
    if (!e) var e = window.event;
    
    var element = getEventTarget(e);
    var divs = getElementsByClassName('PopUp');
    var i = 0;

     if (popupArray.length > 0)
     {
        for (i=0; i <popupArray.length; i++)
        {
			hideFloater(popupArray[i], true);
			removeArrItem(popupArray, popupArray[i]);
        }
     }
    
    if (element && element.base && element.floater)
    {
        var floater = element.floater;
        var base = element.base;
        var floaterWidth = floater.offsetWidth;
        var floaterHeight = floater.offsetHeight;
        var Xoffset = floater.Xoffset ? floater.Xoffset : 0;
        var Yoffset = floater.Yoffset ? floater.Yoffset : 0;
        
        var x = findX(base) + Xoffset;
        var y = findY(base) + base.offsetHeight + Yoffset;
                
        var browserWidth = getClientWidth();
        var browserHeight = getClientHeight();
        var scrollLeft = getScrollLeft();
        var scrollTop = getScrollTop();   
                
        if (browserWidth > floaterWidth)
        {
            if (x < scrollLeft)
            {
                x = scrollLeft;
            }
            else if (x + floaterWidth > browserWidth + scrollLeft)
            {
                x = browserWidth - floaterWidth + scrollLeft;                    
            }
        }
        
        if (browserHeight > floaterHeight)
        {
            if (y + floaterHeight > browserHeight + scrollTop)
            {
                y = y - floaterHeight - base.offsetHeight - (2*Yoffset);
                y = y > scrollTop ? y : scrollTop;
            }
        }
             
        floater.style.left = x + "px";
        floater.style.top = y + "px";
        floater.style.visibility = "visible";
        floater.style.display = "block";
        
        popupArray[popupArray.length] = floater.id;
    }
}

function removeArrItem(arr, id)
{
   if (id)
   {
       for (var i = arr.length - 1; i >= 0; i -= 1)
       {
            if (arr[i]==id)
            {
                arr.splice(i, 1);
            }
       }
   }
}

function getElementsByClassName(classname)
{ 
   var my_array = document.getElementsByTagName("*"); 
   var retvalue = new Array(); 
   var i; 
   var j; 
   for (i=0,j=0;i<my_array.length;i++)
   { 
      var c = " " + my_array[i].className + " "; 
      if (c.indexOf(" " + classname + " ") != -1) retvalue[j++] = my_array[i]; 
   } 
   return retvalue; 
} 

var __eventListeners = [];

function addAREventListener(instance, eventName, listener) 
{
  var listenerFn = listener;
  
  if (instance.addEventListener)
  {
    instance.addEventListener(eventName, listenerFn, false);
  }
  else if (instance.attachEvent)
  {
    listenerFn = function() {
          listener(window.event);
      }
    instance.attachEvent("on" + eventName, listenerFn);
  }
  else
  {
    alert("Registration not supported! instance:" + instance + " eventname: " + eventName);
  }
  
  var event = {
        instance: instance,
        name: eventName,
        listener: listenerFn
    };
    __eventListeners.push(event);
    return event;
}

function removeEventListener(event) 
{
  var instance = event.instance;
  if(instance)
  {
    if (instance.removeEventListener)
    {
      instance.removeEventListener(event.name, event.listener, false);
    }
    else if (instance.detachEvent)
    {
      instance.detachEvent("on" + event.name, event.listener);
    }
    for (var i = 0; i < __eventListeners.length; i++)
    {
      if (__eventListeners[i] == event)
      {
        __eventListeners.splice(i, 1);
        break;
	    }
    }
  }
}

function unregisterAllEvents() 
{
    while (__eventListeners.length > 0)
    {
        removeEventListener(__eventListeners[0]);
    }
}

function getEventTarget(e) 
{
  var target;
  if (e)
  {
    if (e.target) 
    {
      target = e.target;
    }
    else if (e.srcElement) 
    {
      target = e.srcElement;
    }

    if (target && target.nodeType == 3) //defeat safari bug
    {
      target = target.parentNode;
    }
  }
  return target;
}

function findX(element)
{
    var x = 0;
    if(element.offsetParent)
    {
      while(true) 
      {
        x += element.offsetLeft;
        if(!element.offsetParent)
        {
          break;
        }
        element = element.offsetParent;
      }
    }
    else if(element.x)
    {
        x += element.x;
    }
    return x;
}
function findY(element)
{
    var y = 0;
    if(element.offsetParent)
        while(true)
        {
          y += element.offsetTop;
          if(!element.offsetParent)
          {
            break;
          }
          element = element.offsetParent;
        }
    else if(element.y)
    {
        y += element.y;
    }
    return y;
}
function getClientWidth() 
{
	return filterClientInfo (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
function getClientHeight() 
{
	return filterClientInfo (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
function getScrollLeft() 
{
	return filterClientInfo (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function getScrollTop() 
{
	return filterClientInfo (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function filterClientInfo(win, doc, body) 
{
	var retVal = win ? win : 0;
	if (doc && (!retVal || (retVal > doc)))
		retVal = doc;
	return body && (!retVal || (retVal > body)) ? body : retVal;
}

function toggleScriptView(spanNoScript, spanScript)
{
  var objNoScript = document.getElementById(spanNoScript);
  var objScript = document.getElementById(spanScript);
  if (objNoScript && objScript) 
  {
    objNoScript.style.display = 'none';
    objScript.style.display = '';
  }
}
