/**
*	AJAX Calendar
*	(c) 2007 Peter Welch <peter@beepix.com> www.beepix.com
*	
*	
*
*	This system is dependant on the Prototype.js library (http://www.prototypejs.org/)
*
*	All extensions and classes are freely distributable under an MIT-style license.
*/

/********************************************************
*	Timeout feature, courtesy of http://ajaxblog.com/archives/2005/06/01/async-requests-over-an-unreliable-network
/********************************************************/
function callInProgress(xmlhttp) {
	switch (xmlhttp.readyState) {
		case 1: case 2: case 3:  
		return true;  
		break;  
		// Case 4 and 0  
		default:  
		return false;  
		break;  
	}  
}  
function showFailureMessage() {  
	//alert('The network is down. Please try again shortly');  
}  
// Register global responders that will occur on all <acronym title="Asynchronous Javascript And XML">AJAX</acronym> requests  
Ajax.Responders.register({  
	onCreate: function(request) {  
		request['timeoutId'] = window.setTimeout(  
			function() {  
				// If we have hit the timeout and the <acronym title="Asynchronous Javascript And XML">AJAX</acronym> request is active, abort it and let the user know  
				if (callInProgress(request.transport)) {  
				request.transport.abort();  
				showFailureMessage();  
				// Run the onFailure method if we set one up when creating the <acronym title="Asynchronous Javascript And XML">AJAX</acronym> object  
				if (request.options['onFailure']) {  
					request.options['onFailure'](request.transport, request.json);  
				}
			}  
		},  
		10000 // Ten seconds  
		);  
	},  
	onComplete: function(request) {  
		// Clear the timeout, the request completed ok  
		window.clearTimeout(request['timeoutId']);  
	}  
});

/********** END TIMEOUT FEATURE *************************/

var loading_events = "/digitalAssets/9317_sm_lightloader.gif";

var EmailPage;

function $ACTION(traceObjects) {
	var objs = $$(traceObjects);

	objs.each(function(obj){
		
		par = obj.parentNode;

		nObj = document.createElement("span");
		nObj.className = obj.className;
		nObj.rel = obj.rel;
		nObj.innerHTML = obj.innerHTML;
		obj.parentNode.removeChild(obj);
		par.appendChild(nObj);

		Event.observe(nObj, "mouseup", function(){mouseyup(obj)}, false);
		Event.observe(nObj, "mousedown", function(){mouseydown(obj)}, false);
		Event.observe(nObj, "mouseover", function(){mouseyover(obj)}, false);

	});
}



/********************************************************
*	New Code set
/********************************************************/
function renderHighlight() {

	objects 	= $$(".calendar tr td span");
	
	inPoint 	= parseInt(document.startRegistration.rel);

	outPoint	= parseInt(document.endRegistration.rel);

	objects.each(function(object){
		rel = parseInt(object.rel);
		//object.href = "#";
		if(outPoint == inPoint) 
		{
			if(rel == inPoint) object.className += " active";
			else Element.removeClassName(object, "active");
		}
		else if(inPoint < outPoint)
		{
			if(rel >= inPoint && rel <= outPoint) object.className += " active";
			else Element.removeClassName(object, "active");
		}
		else if(inPoint > outPoint)
		{
			if(rel <= inPoint && rel >= outPoint) object.className += " active";
			else Element.removeClassName(object, "active");
		}
	});
}


function mouseydown(obj) {
	document.startRegistration = obj;
	document.endRegistration = obj;
	renderHighlight;
	Event.observe(document.body, 'mousemove', renderHighlight, false);
    nabCells = $("primary");
	Event.observe(nabCells, 'mouseup', renderHighlight, false);
}

function mouseyup(obj) {
	obj.addClassName = "active";
	document.endRegistration = obj;
	renderHighlight;
	
    
    RB = document.startRegistration.rel;
	RE = document.endRegistration.rel;
	
	
	if (RE < RB) {SWAP = RB; RB = RE; RE = SWAP;};
	Event.stopObserving(document.body, 'mousemove', renderHighlight, false);
	category = $('selectCalendar').value;
	//jaxvars = "RangeBegin=" + RB + "&RangeEnd=" + RE + "&selectCalendar=" + category + "&async=true";	
	url = '/events/';
    //AjaxCall(jaxvars,url,handle);
	fixEmail({RangeBegin:RB,RangeEnd:RE,selectCalendar:category});
	EventUpdate_loading();
	var EventUpdateAjaxc = new Ajax.Request(
		url,
		{
			method:'get',
			parameters:$H({RangeBegin:RB,RangeEnd:RE,selectCalendar:category,async:true}).toQueryString(),
			onSuccess:EventUpdate_success,
			onFailure:EventUpdate_failure
		}
	);
	
    //$AX({RangeBegin:RB,RangeEnd:RE,selectCalendar:category,async:true}, url, EventUpdate);
}

function mouseyover(obj) {
	document.endRegistration = obj;
	renderHighlight;
}

/* Month navi; could be better, streamline Action Binder */
var date_collector = new Array();

function bind_monthNav() {
	//Removes ALL href navigation from calendar elements
	
	
	
	//var links = $("js-calendar").getElementsByTagName("a");
	
	var links = $$(".calendar a");
	links.each(function(link){ link.href = "#nogo"; });
	
	//Removes text selection and link box dragging from the calendar
	$("primary").onselectstart = function() {return false;} // ie
  	$("primary").onmousedown = function() {return false;} // mozilla
  	
  	//Attaches sliding functions
	
	var cm = $('select_month').selectedIndex;
	var cy = $('select_year').selectedIndex;
	var cl = $('select_year').getElementsByTagName("option").length;
	cl--;
	
	$("forward").style.display = "block";
	$("backward").style.display = "block";
	
	if(cm == 0 && cy == cl) $("backward").style.display = "none";
	else if (cm == 11 && cy == 0) $("forward").style.display = "none";

	
	Event.observe($("forward"), "click", swapFor, false);
	Event.observe($("backward"), "click", swapBack, false);
}

function bind_formNav() {
	//$("calendar-submit").type = "button";
	var baseBtn = $("calendar-submit");
	var replaceBtn = document.createElement("input");
	replaceBtn.id = "calendar-submit";
	replaceBtn.className = "input-submit";
	replaceBtn.type = "button";
	replaceBtn.value = "go";
	replaceBtn.name = "submit";
	baseBtn.parentNode.replaceChild(replaceBtn,baseBtn);
	Event.observe($("calendar-submit"), "click", remap_cal, false);
}

function remap_cal() {
	$("primary").style.visibility = "hidden";
	M = $("select_month").value;//this.parentNode.month.value;
	Y = $("select_year").value;//this.parentNode.year.value;
	F = $("selectCalendar").value;
	url = '/System_Pages/externalGrid/';
	
	
	var CalCurrAjax = new Ajax.Request(
		url,
		{
			method:'get',
			parameters:$H({month:M,year:Y,selectCalendar:F,async:true}).toQueryString(),
			onComplete:CalCurr
		}
	);
	
	//$AX({month:M,year:Y,selectCalendar:F,async:true}, url,CalCurr);
}

function annexPaginator() {
	if($("page-select"))
	{
		var pageLinks = $$("#page-select a");
		
		pageLinks.each(function(pageLink) {
			callVars = pageLink.href;
			var pull = callVars.match(/\?(.+)/)[1];
			pageLink.href = "#nogo";
			Event.observe(pageLink, "click", function(){
				
				fixEmail(pull, true);
				var url = '/events/';
				var passed = pull;
				EventUpdate_loading();
				var EventUpdateAjaxa = new Ajax.Request(
					url,
					{
						method:'get',
						parameters:"async=true&" + passed,
						onSuccess:EventUpdate_success,
						onFailure:EventUpdate_failure
					}
				);
				
				//$AX("?async=true&" + pull, url, EventUpdate);
			}, false);
		});
	}
}

/*
Ajax handlers
*/

function fixEmail(vars, fixit) {
	if(!fixit) EmailPage = escape($H(vars).toQueryString());
	else EmailPage = escape(vars);
	resetLink = $("globalEmailAction").href;
	adjustPos = resetLink.indexOf("http");
	finalLink = resetLink.substring(0, adjustPos) + "http://calendar-working.udayton.edu/infoglueDeliverWorking/?" + EmailPage;
	$("globalEmailAction").href = finalLink;
}


function beginUpdate() {
	//Event update
	M = $("select_month").value;
	Y = $("select_year").value;
	F = $("selectCalendar").value;
	url = '/events/';
	
	
	fixEmail({month:M,year:Y,selectCalendar:F});
	EventUpdate_loading();
	var EventUpdateAjaxb = new Ajax.Request(
		url,
		{
			method:'get',
			parameters:$H({month:M,year:Y,selectCalendar:F}).toQueryString(),
			onSuccess:EventUpdate_success,
			onFailure:EventUpdate_failure
		}
	);
	//$AX({month:M,year:Y,selectCalendar:F,async:true}, url, EventUpdate);
}


var CalCurr = function(originalRequest){
	//Calendar update
	
	$("primary").style.visibility = "visible";
	$('primary').innerHTML = originalRequest.responseText;

	staggerOut(true);

	m = $("m" + ($('select_month').selectedIndex+1)).innerHTML;
	y = $("y" + ($('select_year').selectedIndex+1)).innerHTML;
	$('date_display').innerHTML = m + " " + y;

	generate_surroundings();
}




//TIMER MAX : END AJAX CALL

var EventUpdate_loading = function (originalRequest) {
	var heightHolder = $('mainContent').getStyle("height");
    $('mainContent').style.minHeight = heightHolder;
  	$('mainContent').innerHTML = "<div id='eventsWrapper'><h2>UD Events</h2><h3>Loading events for selected range <img class='loading' src='"+loading_events+"' alt='Loading Events...' /></h3></div>";
    
}
var EventUpdate_success = function (originalRequest) {
	$('mainContent').innerHTML = originalRequest.responseText;
	eventControls();
    setupMoreLinks();
    annexPaginator();
	$('mainContent').style.minHeight = "0";
}
var EventUpdate_failure = function (originalRequest) {
	$('mainContent').style.minHeight = "0";
	$('mainContent').innerHTML = "<h3>Error: Could not find events.</h3>";
}


/*
var EventUpdate = {
    loading:function() {

//INIT TIMER
//alert(this);

        $heightHolder = $('mainContent').getStyle("height");
        $('mainContent').style.minHeight = $heightHolder;
    	$('mainContent').innerHTML = "<div id='eventsWrapper'><h2>UD Events</h2><h3>Loading events for selected range <img src='"+loading_events+"' alt='Loading Events...' /></h3></div>";
    },
	success:function(output, result){
		$('mainContent').innerHTML = output;
		eventControls();
	    setupMoreLinks();
	    annexPaginator();
 		$('mainContent').style.minHeight = "0";
	},
	failure:function() {
		$('mainContent').style.minHeight = "0";
		$('mainContent').innerHTML = "<h3>Error: Could not find events.</h3>";
	}
}
*/

var CalNext = function(originalRequest) {
	$('next').innerHTML = originalRequest.responseText;	
};

var CalPrev = function(originalRequest) {
	$('prev').innerHTML = originalRequest.responseText;	
};

/*
var CalPrev = {
	success:function(output, result){
		$('prev').innerHTML = output;
	}
};
*/
function generate_surroundings(initial) {
	M = $("primary").parentNode.month.value;
	Y = $("primary").parentNode.year.value;
	F = $("selectCalendar").value;
	
	date_collector = Array(M,Y,F);
	
	url = '/System_Pages/externalGrid/';

	M = parseInt(M);
	Y = parseInt(Y);
	
	if(M == 12) { mn = 1; ny = (Y+1); pm = (M-1); py = Y; }
	else if(M == 1) { mn = (M+1); ny = Y; pm = 12; py = (Y-1); }
	else { mn = (M+1); ny = Y; pm = (M-1); py = Y; }
	//thread = $H({month:mn,year:ny,selectCalendar:F,async:true});
	//alert(thread.toString());
	var AjaxCalNext = new Ajax.Request(
		url,
		{
			method:'get',
			parameters:$H({month:mn,year:ny,selectCalendar:F,async:true}).toQueryString(),
			onComplete:CalNext
		}
	);
	var AjaxCalPrev = new Ajax.Request(
		url,
		{
			method:'get',
			parameters:$H({month:pm,year:py,selectCalendar:F,async:true}).toQueryString(),
			onComplete:CalPrev
		}
	);
	
	/*
	
	Trasnferring to prototype AJAX methods
	
	$AX({month:mn,year:ny,selectCalendar:F,async:true}, url, CalNext);
	$AX({month:pm,year:py,selectCalendar:F,async:true}, url, CalPrev);
	*/
	
	
	//$AX({month:M,year:Y,selectCalendar:F,direction:"forward",async:true}, url, CalNext);
	//$AX({month:M,year:Y,selectCalendar:F,direction:"backward",async:true}, url, CalPrev);
	
	if(!initial) beginUpdate();
	bind_monthNav();
	$ACTION(".calendar tr td a");
}

function swapFor() {swapper("next");}
function swapBack() {swapper("prev");}

var inverter;

var mie = false;
var yie = false;

function getOptionIdx(select, value) {
 if(!select.options) return -1;
 for(var oNum = 0; oNum != select.options.length; oNum++) {
   if(select.options[oNum].value == value) return oNum;
 }
 return -1;
}

function swapper(dir) {
	//Remove listeners during transition
	Event.stopObserving($("forward"), "click", swapFor, false);
	Event.stopObserving($("backward"), "click", swapBack, false);

	//Reset the select menus
	
	var selectYear = $('select_year').selectedIndex;
	var selectMonth = $('select_month').selectedIndex;
	//alert(selectMonth + " " + selectYear);
	if(dir == 'next')
	{
		if(parseInt(date_collector[0])==12) {
			selectMonth = 0;
			selectYear--;
			//$('select_year').selectedIndex = $('select_year').selectedIndex - 1;
		} else {
			selectMonth++;
			//$('select_month').selectedIndex = $('select_month').selectedIndex + 1;
		}
	} else {
		if(parseInt(date_collector[0])==1) {
			selectMonth = 11;
			selectYear++;
			//$('select_year').selectedIndex = $('select_year').selectedIndex + 1;
		} else {
			selectMonth--;
			//$('select_month').selectedIndex = $('select_month').selectedIndex - 1;
		}
	}
	
	$('select_year').options[selectYear].selected = true;
	$('select_month').options[selectMonth].selected = true;
	
	//Generate the top display
	//alert($("m" + ($('select_month').selectedIndex)));
	var m,y;
	m = $("m" + (selectMonth+1)).innerHTML;
	y = $("y" + (selectYear+1)).innerHTML;

/*
	if(!mie) {
		m = $("m" + (selectMonth+1)).innerHTML;
		mie = m;
	} else {
		m = mie;
		mie = false;
	}
	if(!yie) {
		y = $("y" + (selectYear+1)).innerHTML;
		yie = y;
	} else {
		y = yie;
		yie = false;
	}
*/
	$('date_display').innerHTML = m + " " + y;

	//Do the id square dance swap
	$(dir).id = 'hold';
	$('primary').id = dir;
	$('hold').id = 'primary';
	
	//Create a variable to switch destination points
	inverter = (dir == 'next') ? -1 : 1;
	
	//Slide the pertinent divs
	var swapRemov = new Fx.Style(dir,'left', {duration: 200, onComplete:function(){staggerOut();}});
	
	//Start the transition
	swapRemov._start(0,(203*inverter));	
}

function staggerOut(cur) {
	var repad = $('primary').getElementsByTagName('tr').length;
	var repad = repad*25 + 10;
	var start = parseInt($('calendar-selectionRange').style.paddingTop);
	var adjust_height = new Fx.Style('calendar-selectionRange', 'padding-top', {duration: 150, onComplete:function(){if(!cur)staggerIn();}});
	adjust_height._start(start, repad);
}

function staggerIn() {
	var swapPrime = new Fx.Style('primary','left', {duration: 200, onComplete:function(){reset();}});
	swapPrime._start((-203*inverter),0);
}

function reset() {	
	$("prev").style.left = "-203px";
	$("next").style.left = "203px";
	//bind_monthNav();
	generate_surroundings();
}


function calendar_init(initial) {
	//This is a fix for an odd updating problem in Firefox
	var prep = window.location.href;
	var midx = prep.match(/month=([0-9]+)/i);
	var yidx = prep.match(/year=([0-9]+)/i);
	if(midx && yidx) {
		var fidx = parseInt(midx[1])-1;
		$('select_month').selectedIndex = fidx;
		$('select_year').value = yidx[1];
	}
	$("primary").style.left = "0px";
	$("prev").style.left = "-203px";
	$("next").style.left = "203px";
	bind_formNav();
	bind_monthNav();
    generate_surroundings(initial);
    annexPaginator();
}
version=0
if (navigator.appVersion.indexOf("MSIE")!=-1){
temp=navigator.appVersion.split("MSIE")
version=parseFloat(temp[1])
}

if (version >= 6 || version == 0){ //NON IE browser will return 0

Event.observe(window, 'load', function() {
	calendar_init(true);
}, false);
}
