/****
Author: Ryan Stevens
This Javascript file has is owned completely by Northwest Hills Community Church.
****/


Date.prototype.monthNames = new Array("January", "February", "March", "April",
  "May", "June", "July", "August", "September", "October", "November",
  "December");

function dateGetMonthName() {

  return this.monthNames[this.getMonth()];
}

function dateGetMonthFromName(pName) {
  for (var i=0; i<12; i++)
  {
    if (this.monthNames[i]==pName)
        return i;
  }
  return null;
}
Date.prototype.getMonthName = dateGetMonthName;
Date.prototype.getMonthFromName= dateGetMonthFromName;
Date.prototype.getDayOfMonth = function()
{
  return this.getDate().toString();
}

function AjaxCalendar(pDate)
{
	var self=this;
	var currentDate=pDate;
	var tableObj=document.getElementById("ajaxCalender");
	var tableBodyObj=tableObj.getElementsByTagName("TBODY")[0];
	var currentCalObj=null;
	var weekIndex=0;
	this.filterIds=[];
	this.ministryToFilterOnDataLoad=null;
        this.twoWeekMode=false;
        var inCurrentMonth=true;
        var firstLoad=true;
        var movingForward=false;
        var currentMonthChangedLastItr=false;
        var displayingDaysEvents=false;
   
        //utility stuff
	var totalTime=null;
	var renderTime=null;
	this.printStatistics=false;

	this.dataBind=function(pCurrentCalObj)
	{
		currentCalObj=pCurrentCalObj;
		
		if (!this.twoWeekMode || firstLoad)
		{
 			inCurrentMonth=(currentDate.getMonthName()==currentCalObj.startingMonth && !(currentCalObj.week[0][0].dayOfMonth==1));
		}

		if (firstLoad && this.twoWeekMode)
		{
			firstLoad=false;
			inCurrentMonth=(this.twoWeekMode && weekIndex>0);
		}
	};

	this.render=function()
	{
		renderTime=new Date();
                this.removeEventsForDay();
		for (var i=tableBodyObj.rows.length-1; i>=0; i--)
		{
			tableBodyObj.deleteRow(i);
		}
		var weekArr=currentCalObj.week;

		var startingWeek=weekIndex; //weekIndex is only set to a value other than 0 if twoWeekMode is set to true
		var endingWeek=(this.twoWeekMode) ? (startingWeek+2) : weekArr.length;
		if (!movingForward && this.twoWeekMode)
			inCurrentMonth=((currentCalObj.week[weekIndex][0].dayOfMonth<currentCalObj.week[weekIndex+1][6].dayOfMonth && 
						!currentMonthChangedLastItr && currentCalObj.week[startingWeek][0].dayOfMonth!=1) ? inCurrentMonth : !inCurrentMonth);

		currentMonthChangedLastItr=false;
		for (var weekItr=startingWeek; weekItr<endingWeek; weekItr++)
		{
			var weekRow = document.createElement("TR")
			var daysOfWeekArr=weekArr[weekItr];

			for (var dayOfWeekItr=0; dayOfWeekItr<daysOfWeekArr.length; dayOfWeekItr++)
			{
				var day=daysOfWeekArr[dayOfWeekItr];
				var dayCell = document.createElement("TD");
				if (day.dayOfMonth == 1)
				{
					inCurrentMonth = !inCurrentMonth;
					currentMonthChangedLastItr=true;
				}
				
				if (!inCurrentMonth)
					dayCell.className="alertnateMonth";

				var innerHtmlStr="";
				var eventClassName="numNoevent";
				var unfilteredEvents=getFilteredEvents(day.events);
				var eventCellHtml="<div class=\"eventsDiv\">";
                		if (unfilteredEvents.length==0)
                		{
		
                		}
				else if (unfilteredEvents.length==1)
				{
					var eventObj=unfilteredEvents[0];
					eventClassName="numhasevent";
					eventCellHtml+= "<div class=\"eventSingle\" nowrap>"+
						eventObj.time+"<br>"+eventObj.event+"</div>";
				}
				else
				{
					for (var eventItr=0; eventItr<unfilteredEvents.length; eventItr++)
					{
						var eventObj=unfilteredEvents[eventItr];
						eventClassName="numhasevent";
						eventCellHtml+= "<div class=\"event\" nowrap>"+eventObj.event+"</div>";
					}
				}
				eventCellHtml+="</div>";
				dayCell.innerHTML = "<span class=\""+eventClassName+"\">"+day.dayOfMonth+"</span>"+eventCellHtml;
				if (eventClassName=="numhasevent")
				{
				    dayCell.onmouseover=new Function('displayEventsForDay('+weekItr+','+dayOfWeekItr+', this)');
				}
				else
				{
					
				}
				weekRow.appendChild(dayCell);
				
			}	

			tableBodyObj.appendChild(weekRow);
		}

		document.getElementById("nextBtn").innerHTML=(!this.twoWeekMode)? "Next Month" : "Next 2 Weeks";
		document.getElementById("prevBtn").innerHTML=(!this.twoWeekMode)? "Prev Month" : "Last 2 Weeks";
		document.getElementById("yearMonthSpan").innerHTML=currentDate.getMonthName()+", "+currentDate.getFullYear();
		if (this.printStatistics)
		{  
			var now=new Date();
			alert("Total: "+(now-totalTime)+"ms\nRender "+(now-renderTime)+"ms");
		}
	};

	this.reloadCalendar = function(pMovingForward)
	{
  		movingForward=pMovingForward;
  		if (this.twoWeekMode)
		{
			currentDate.setDate((currentDate.getDate()+14*((movingForward)?1:-1)));
			if (pMovingForward && (weekIndex+2)<currentCalObj.week.length)
			{
				weekIndex+=2;
				this.render();
			}
			else if (!movingForward && (weekIndex-2)>=0)
			{
				weekIndex-=2;
				this.render();
			}
			else
			{
				this.loadCalendar();
			}
		}
		else
		{
			totalTime=new Date();
			if (currentDate.getDayOfMonth()>28)
				currentDate.setDate(28);
			currentDate.setMonth(currentDate.getMonth()+Number(((movingForward)?1:-1)));
			this.loadCalendar();
		}
	};

	this.loadCalendar = function()
	{
		totalTime=new Date();
		weekIndex=0;
		document.getElementById("nextBtn").innerHTML="";
		document.getElementById("prevBtn").innerHTML="";
		document.getElementById("yearMonthSpan").innerHTML="Loading...";

		var month=Number(currentDate.getMonth()+1);
		if (month<10)
		{
			month='0'+month;
		}


		var calStr=('id=249&cal='+currentDate.getFullYear()+'-'+month+( (this.twoWeekMode) ? ("-"+currentDate.getDayOfMonth()) : "") );
		if (this.ministryToFilterOnDataLoad!=null)
			calStr+='&ministryid='+this.ministryToFilterOnDataLoad;
                /* Was 'http://www.nwhills.com/index.php' */
		var ajaxObj= new Ajax.Request( window.location.protocol + "//" + window.location.host + window.location.pathname, { method: 'get', parameters: calStr, onComplete: completeLoadCalender});
	};
	
	this.setFilterIdsFromSelectBox=function(pSelectBox)
	{
	    this.filterIds=[];
	    if (pSelectBox.value=='null')
	        return;
                        
	    for (var i=0; i<pSelectBox.options.length; i++)
	    {
	        if (pSelectBox.options[i].selected && i==0)
	        {
                        this.filterIds=[];
                        return;
	        }
            
	        if (pSelectBox.options[i].selected)
	        {
                        this.filterIds.push(pSelectBox.options[i].value.toString());
	        }    
	    }
	};
	
	this.isEventFiltered = function(pMinistryId)
	{
	    for (var i=0; i<this.filterIds.length; i++)
	    {
	        if ((""+this.filterIds[i])==(""+pMinistryId))
	            return true;
	    }
	    return false;    
	};

	function getFilteredEvents(pEvents)
	{
		var filterIds=self.filterIds;
		var returnArray=[];
		for (var i=0; i<pEvents.length; i++)
	    	{
    	    	    	var filtered=false;
    	    	    	if (filterIds.length==0)
    	    	    	   	filtered=true;
    	    	    	for (var j=0; j<filterIds.length; j++)
    	    	    	{
    	    	    	    	if (Number(filterIds[j])==Number(pEvents[i].ministryId))
    	    	    	    	    	filtered=true;
    	    	    	}

    	    	    	if (filtered)
    	    	    	    	returnArray.push(pEvents[i]);
    	    	}
    	    	return returnArray;
	}

	this.mouseOverDayWithEvent=function(pWeekIndex, pDayIndex, pCell)
	{
    		var weekArr=currentCalObj.week;
		var daysOfWeekArr=weekArr[pWeekIndex];

		var day=daysOfWeekArr[pDayIndex];
		var unfilteredEvents=getFilteredEvents(day.events);
		
		var divStr="<div style='margin:5px'>";
		for (var eventItr=0; eventItr<unfilteredEvents.length; eventItr++)
		{
			var eventObj=unfilteredEvents[eventItr];
			divStr+= "<div nowrap><a href=\"?id=232&event="+eventObj.id+"\">"+
			    eventObj.event+"</a><br><ul>"+
			    ( (eventObj.ministryName==null || eventObj.ministryName=="") ? "" : "<li>Ministry: "+eventObj.ministryName+"</li>")+
			    ( (eventObj.location==null || eventObj.location=="") ? "" : "<li>Location: "+eventObj.location+"</li>")+
			    ( (eventObj.time==null || eventObj.time=="") ? "" : "<li>Time: "+eventObj.time+"</li>")+
			    "</ul></div><br>";
			if (eventItr!=(unfilteredEvents.length-1))
			    divStr+="<hr />"
		}
		divStr+="<br><div style='text-align:right;cursor:pointer' onclick='removeEventsForDay()'>close</div></div>";
		
		var floatingDiv=document.getElementById("daysEventsDiv");
		floatingDiv.innerHTML=divStr;
		floatingDiv.style.display="Block";
		floatingDiv.style.zIndex=100;
		floatingDiv.style.left=findPosX(pCell)+"px";
		floatingDiv.style.top=findPosY(pCell)+"px";
		
	};
	
	this.removeEventsForDay=function()
	{
	    document.getElementById("daysEventsDiv").style.display="None";
	};

}

function findPosX(obj)
{
    var curleft = 0;
    if (obj.offsetParent)
    {
	    while (obj.offsetParent)
	    {
		    curleft += obj.offsetLeft
		    obj = obj.offsetParent;
	    }
    }
    else if (obj.x)
	    curleft += obj.x;
    return curleft;
}

function findPosY(obj)
{
    var curtop = 0;
    if (obj.offsetParent)
    {
	    while (obj.offsetParent)
	    {
		    curtop += obj.offsetTop
		    obj = obj.offsetParent;
	    }
    }
    else if (obj.y)
	    curtop += obj.y;
    return curtop;
}

function removeEventsForDay()
{
    calObj.removeEventsForDay();
}

function displayEventsForDay(pWeekIndex, pDayIndex, pCell)
{
    calObj.mouseOverDayWithEvent(pWeekIndex, pDayIndex, pCell);
}


function completeLoadCalender(originalRequest)
{
	var obj=eval('('+originalRequest.responseText+')');
	calObj.dataBind(obj);
	calObj.render();
}