Click here to Skip to main content
15,885,767 members
Articles / Web Development / ASP.NET

Google like Calendar in ASP.NET (AJAX)

Rate me:
Please Sign up or sign in to vote.
4.25/5 (23 votes)
8 Mar 2009CPOL2 min read 107.4K   4.6K   92  
This article describes how to manage events in calender.
	

//User variables 

var settingHeaderDateFormat = 'd.m';	
var quickSave = true;	
var get_items_from_db = 'Getitems.aspx';	
var save_item_to_db = 'UpdateEvent.aspx';	
var delete_item_from_db = 'DeleteEvent.aspx';	
var openWindowUrl = 'EditEvent.aspx';	
var txt_deleteEvent = 'Click OK to delete this event';	
var itemnewtobedeleted;
var appointMarginSize = 5;	
var initilizeTopHours = 8;	
var initilizeMinutes = 15;	
var snapMinutes = 15;	
var CalenderStartHour=8;	
var flagcol;

var inlineTextAreaEnable = false;	

var demo_container = false;
var demo_cal_appointments = false;
var SetnewAppointmentCounter = -1;
var SetToMoveAppointmentCounter = -1;
var SetToResizeAppointmentCounter = -1;
var SetToResizeAppointmentInitHeight = false;
var el_x;	
var el_y;	
var mouse_x;
var mouse_y;
var elWidth;
var displaycurrentAppointmentDiv = false;
var displaycurrentAppointmentContentDiv = false;
var SetcurrentTimeDiv = false;
var SetappointmentsOffsetTop = false;
var SetappointmentsOffsetLeft = false;
var currentZIndex = 20000;
var dayPositionArr = new Array();
var dayDateArr = new Array();
var Calender_ajaxObjects = new Array();
var SetdateStartOfWeek = false;
var SetnewAppointmentWidth = false;
var SetstartIdOfNewItems = 500000000;
var SetcontentEditInProgress = false;
var SettoggleViewCount = -1;
var SetobjectToTogg = false;
var SetcurrentEditableText = false;

var SetappointmentProp = new Array();	
var opera = navigator.userAgent.toLowerCase().indexOf('opera')>=0?true:false;

var SetactiveEventObj;	


function trimString(sInString) {
  sInString = sInString.replace( /^\s+/g, "" );
  return sInString.replace( /\s+$/g, "" );
}

function editEventWindow(e,inputDiv)
{
   
	if(!inputDiv)inputDiv = this;
	if(!openWindowUrl)return;
	if(inputDiv.id.indexOf('new_')>=0)
	{
	return;
	}
	var editEvent = window.open(openWindowUrl + '?id=' + inputDiv.id,'editEvent','width=500,height=550,status=no');
	editEvent.focus();
}

function setElementActive(e,inputDiv)
{

	if(!inputDiv)inputDiv = this;
	var subDivs = inputDiv.getElementsByTagName('DIV');
	for(var no=0;no<subDivs.length;no++){
		if(subDivs[no].className=='demo_appoint_header'){
			subDivs[no].className = 'demo_appoint_headerActive';
		}	
	}
	
	itemnewtobedeleted = inputDiv.id;
	
	if(SetactiveEventObj && SetactiveEventObj!=inputDiv){
		setElementInactive(SetactiveEventObj);
	}
	SetactiveEventObj = inputDiv;
}

function setElement_txt(id,text)
{
	var ta = document.getElementById(id).getElementsByTagName('TEXTAREA')[0]
	ta.value = text;
	
	transferTextAreaContent(false,ta);
	
}
function setElement_delete(id)
{

	deletethisitemOpener(id);
}

function deletethisitemOpener(divDel)

{

var splitstr= divDel.split('-');



if(splitstr[1]=='' && splitstr[2]=='')
		{
		
			var ajaxIndex = Calender_ajaxObjects.length;
			Calender_ajaxObjects[ajaxIndex] = new sack();	
			
			Calender_ajaxObjects[ajaxIndex].requestFile = delete_item_from_db  + '?eventToDeleteId=' + splitstr[0];

			
			
			Calender_ajaxObjects[ajaxIndex].runAJAX();		// Execute AJAX function	
		document.getElementById(splitstr[0]).parentNode.removeChild(document.getElementById(splitstr[0]));
			
	    }
	
	

}



var globalcol;
function setElement_color(id,color)
{
	document.getElementById(id).style.backgroundColor=color;	
	SetappointmentProp[id]['bgColorCode'] = color;
	
	globalcol = color;
	flagcol = true;
}

function setElementInactive(inputDiv)
{
	var subDivs = inputDiv.getElementsByTagName('DIV');
	for(var no=0;no<subDivs.length;no++){
		if(subDivs[no].className=='demo_appoint_headerActive'){
			subDivs[no].className = 'demo_appoint_header';
		}	
	}	
	
	
}
var hhkey;
function parseItemsFromServer(ajaxIndex)
{
	var itemsToBeCreated = new Array();
	var items = Calender_ajaxObjects[ajaxIndex].response.split(/<item>/g);
	
	
	Calender_ajaxObjects[ajaxIndex] = false;
	for(var no=1;no<items.length;no++){
		var lines = items[no].split('*');
		
	
		
		itemsToBeCreated[no] = new Array();
		for(var no2=0;no2<lines.length;no2++){
			
			var key = lines[no2].replace(/<([^>]+)>.*/g,'$1');
			if(key)key = trimString(key);
			var pattern = new RegExp("<\/?" + key + ">","g");
			
			var value = lines[no2].replace(pattern,'').replace("</item>","");
			
			value = trimString(value);
			hhkey = key;			
			
			if(key=='eventStartDate' || key=='eventEndDate'){
				var d = new Date(value);
				value = d;
			}		

			itemsToBeCreated[no][key] = value;
		}	
		
		
		if(itemsToBeCreated[no]['id']){
			var dayDiff = itemsToBeCreated[no]['eventStartDate'].getTime() - SetdateStartOfWeek.getTime();
			dayDiff = Math.floor(Number(dayDiff) / (1000*60*60*24));
			el_x = dayPositionArr[dayDiff];
			topPos = getYPositionFromTime(itemsToBeCreated[no]['eventStartDate'].getHours(),itemsToBeCreated[no]['eventStartDate'].getMinutes());
			
			var elHeight = (Number(itemsToBeCreated[no]['eventEndDate'].getTime()) - Number(itemsToBeCreated[no]['eventStartDate'].getTime())) / (60 * 60*1000);
			
			elHeight = Math.round((Number(elHeight) * (Number(itemRowHeight) + 1)) - 2);
			
		
			displaycurrentAppointmentDiv = createNewAppointmentDiv((el_x - SetappointmentsOffsetLeft),topPos,(SetnewAppointmentWidth-(appointMarginSize*2)),itemsToBeCreated[no]['description'],elHeight,itemsToBeCreated[no]['id']);		
		
			displaycurrentAppointmentDiv.id = itemsToBeCreated[no]['id'];
			currentZIndex = Number(currentZIndex) + 1;
			displaycurrentAppointmentDiv.style.zIndex = currentZIndex;
			SetcurrentTimeDiv = getSetcurrentTimeDiv(displaycurrentAppointmentDiv);
			SetcurrentTimeDiv.style.display='block';
		
			if(itemsToBeCreated[no]['bgColorCode'] && itemsToBeCreated[no]['bgColorCode'].match(/^#[0-9A-F]{6}$/)){
				displaycurrentAppointmentDiv.style.backgroundColor = itemsToBeCreated[no]['bgColorCode'];
			}

			displaycurrentAppointmentContentDiv  = getdisplaycurrentAppointmentContentDiv(displaycurrentAppointmentDiv);
			displaycurrentAppointmentContentDiv.style.height = (Number(elHeight)-20) + 'px';
			displaycurrentAppointmentContentDiv.style.backgroundColor = itemsToBeCreated[no]['bgColorCode'].replace("</item>","").replace("</root>","");
	
			
			SetcurrentTimeDiv.innerHTML = '<span>' + getTime(displaycurrentAppointmentDiv) + '</span>';	
			autoResizeAppointment();
			
			displaycurrentAppointmentDiv = false;	
			SetcurrentTimeDiv = false;		
			
			var newIndex = itemsToBeCreated[no]['id'];
			SetappointmentProp[newIndex] = new Array();
			SetappointmentProp[newIndex]['id'] = itemsToBeCreated[no]['id'];
			SetappointmentProp[newIndex]['description'] = itemsToBeCreated[no]['description'];			
			SetappointmentProp[newIndex]['bgColorCode'] = itemsToBeCreated[no]['bgColorCode'];			
			SetappointmentProp[newIndex]['eventStartDate'] = itemsToBeCreated[no]['eventStartDate'];			
			SetappointmentProp[newIndex]['eventEndDate'] = itemsToBeCreated[no]['eventEndDate'];		
			SetappointmentProp[newIndex]['object'] = displaycurrentAppointmentDiv;	
		}
	}

	

}



function updateSetappointmentProp(id)
{
	var obj = document.getElementById(id);
	var timeArray = getTimeAsArray(obj); 
	var startDate = getAppointmentDate(obj);
	var endDate = new Date();
	endDate.setTime(startDate.getTime());
	
	startDate.setHours(timeArray[0]);
	startDate.setMinutes(timeArray[1]);
	
	endDate.setHours(timeArray[2]);
	endDate.setMinutes(timeArray[3]);
	

	SetappointmentProp[obj.id]['eventStartDate'] = startDate;
	SetappointmentProp[obj.id]['eventEndDate'] = endDate;
	
	if(quickSave && SetappointmentProp[obj.id]['description'].length>0){
		saveAnItemToServer(obj.id);
	}
		
	
}

function getYPositionFromTime(hour,minute){
	return Math.floor((Number(hour) - Number(CalenderStartHour)) * (Number(itemRowHeight)+1) + (Number(minute)/60 * (Number(itemRowHeight)+1)));
}

function getItemsFromDBServer()
{
	var ajaxIndex = Calender_ajaxObjects.length;
	Calender_ajaxObjects[ajaxIndex] = new sack();	
	Calender_ajaxObjects[ajaxIndex].requestFile = get_items_from_db  + '?year=' + SetdateStartOfWeek.getFullYear() + '&month=' + (SetdateStartOfWeek.getMonth()/1+1) + '&day=' + SetdateStartOfWeek.getDate();	// Specifying which file to get
	Calender_ajaxObjects[ajaxIndex].onCompletion = function(){ parseItemsFromServer(ajaxIndex); };	// Specify function that will be executed after file has been found
	Calender_ajaxObjects[ajaxIndex].runAJAX();				
}

function getSetcurrentTimeDiv(inputObj)
{
	var subDivs = inputObj.getElementsByTagName('DIV');
	for(var no=0;no<subDivs.length;no++){
		if(subDivs[no].className=='demo_appoint_time'){
			
			return subDivs[no];
			
		}
	}
}

function getdisplaycurrentAppointmentContentDiv(inputDiv)
{
	var divs = inputDiv.getElementsByTagName('DIV');
	for(var no=0;no<divs.length;no++){
		if(divs[no].className=='demo_appoint_txt')return divs[no];
	}
}

function getAppointmentDate(inputObj)
{
	var leftPos = getLeftPos(inputObj);
	
	var d = new Date();
	var tmpTime = SetdateStartOfWeek.getTime();
	tmpTime = Number(tmpTime) + (1000*60*60*24 * Math.floor((Number(leftPos)-Number(SetappointmentsOffsetLeft)) / (Number(dayPositionArr[1]) - Number(dayPositionArr[0]))));
	d.setTime(tmpTime);
	return d;
	
	
}

function getTimeAsArray(inputObj)
{
	var startTime = (Number(getTopPos(inputObj)) - Number(SetappointmentsOffsetTop)) / (Number(itemRowHeight)+1) + Number(CalenderStartHour);
	if(startTime>23)startTime = Number(startTime) - 24;
	var startHour = Math.floor(Number(startTime));
	var startMinute = Math.floor((Number(startTime) - Number(startHour)) *60);
	var endTime = (Number(getTopPos(inputObj)) + Number(inputObj.offsetHeight) - Number(SetappointmentsOffsetTop)) / (Number(itemRowHeight)+1) + Number(CalenderStartHour);
	if(endTime>23)endTime = Number(endTime) - 24;
	var endHour = Math.floor(Number(endTime));
	var endMinute = Math.floor((Number(endTime) - Number(endHour)) *60);
	return Array(startHour,startMinute,endHour,endMinute);	
}

var gettimtosave;
function getTime(inputObj)
{
	var startTime = (Number(getTopPos(inputObj)) - Number(SetappointmentsOffsetTop)) / (Number(itemRowHeight)+1) + Number(CalenderStartHour);

	if(startTime>23)startTime = Number(startTime) - 24;
	var startHour = Math.floor(Number(startTime));
	var hourPrefix = "";
	if(startHour<10)hourPrefix = "0";
	var startMinute = Math.floor((Number(startTime) - Number(startHour)) *60);
	var startMinutePrefix = "";
	if(startMinute<10)startMinutePrefix="0";	
	
	var endTime = (Number(getTopPos(inputObj)) + Number(inputObj.offsetHeight) - Number(SetappointmentsOffsetTop)) / (Number(itemRowHeight)+1) + Number(CalenderStartHour);
	if(endTime>23)endTime = Number(endTime) - 24;
	var endHour = Math.floor(Number(endTime));
	
	var endHourPrefix = "";
	if(endHour<10)endHourPrefix = "0";	
	var endMinute = Math.floor((Number(endTime) - Number(endHour)) *60);
	var endMinutePrefix = "";
	if(endMinute<10)endMinutePrefix="0";
	var helfs = settimeforAMPM(hourPrefix + startHour) + ':' + startMinutePrefix + "" + startMinute + '-' + settimeforAMPM(endHourPrefix + endHour)+ ':' + endMinutePrefix + "" +  endMinute;	
	gettimtosave = helfs;
	return helfs;
	
	
}

function settimeforAMPM(val)
{
if(val>12)
{
val = Number(val) -12;
}
return val;
}

function initNewAppointment(e,inputObj)
{
	if(document.all)e = event;
	if(!inputObj)inputObj = this;
	SetnewAppointmentCounter = 0;
	el_x = getLeftPos(inputObj);	
	el_y = getTopPos(inputObj);
	elWidth = inputObj.offsetWidth;
	mouse_x = e.clientX;
	mouse_y = e.clientY;
	timerNewAppointment();

	return false;
}

function timerNewAppointment()
{
	if(SetnewAppointmentCounter>=0 && SetnewAppointmentCounter<10){
		SetnewAppointmentCounter = Number(SetnewAppointmentCounter) + 1;
		setTimeout('timerNewAppointment()',30);
		return;
	}	
	if(SetnewAppointmentCounter==10){
		
		if(initilizeMinutes){
			var topPos = Number(mouse_y) - Number(SetappointmentsOffsetTop) + Number(document.documentElement.scrollTop) + Number(document.getElementById('demo_cal_content').scrollTop);
			topPos = Number(topPos) - (Number(getMinute(topPos)) % Number(initilizeMinutes));
			var rest = (Number(getMinute(topPos)) % Number(initilizeMinutes));
			if(rest!=0){
				topPos = Number(topPos) - (Number(getMinute(topPos)) % Number(initilizeMinutes));
			}
		}else{
			var topPos = (Number(el_y) - Number(SetappointmentsOffsetTop));
		}
		
		
		displaycurrentAppointmentDiv = createNewAppointmentDiv((el_x - SetappointmentsOffsetLeft),topPos,(Number(elWidth)-(Number(appointMarginSize)*2)),'');	
		displaycurrentAppointmentDiv.id = 'new_' + SetstartIdOfNewItems;
		SetappointmentProp[displaycurrentAppointmentDiv.id] = new Array();
		SetappointmentProp[displaycurrentAppointmentDiv.id]['description'] = "";
		SetappointmentProp[displaycurrentAppointmentDiv.id]['object'] = displaycurrentAppointmentDiv;	
		SetappointmentProp[displaycurrentAppointmentDiv.id]['id'] = displaycurrentAppointmentDiv.id;
		SetstartIdOfNewItems++;
		displaycurrentAppointmentContentDiv  = getdisplaycurrentAppointmentContentDiv(displaycurrentAppointmentDiv);
		currentZIndex = Number(currentZIndex) + 1;
		displaycurrentAppointmentDiv.style.zIndex = currentZIndex;
		displaycurrentAppointmentDiv.style.height='20px';
		SetcurrentTimeDiv = getSetcurrentTimeDiv(displaycurrentAppointmentDiv);
		SetcurrentTimeDiv.style.display='block';
		
	}
}

function initResizeAppointment(e)
{
	if(document.all)e = event;
	displaycurrentAppointmentDiv = this.parentNode;
	displaycurrentAppointmentContentDiv  = getdisplaycurrentAppointmentContentDiv(displaycurrentAppointmentDiv);
	currentZIndex = Number(currentZIndex) + 1;
	displaycurrentAppointmentDiv.style.zIndex = currentZIndex;	
	SetToResizeAppointmentCounter = 0;
	el_x = getLeftPos(displaycurrentAppointmentDiv);	
	el_y = getTopPos(displaycurrentAppointmentDiv);	
	mouse_x = e.clientX;
	mouse_y = e.clientY;
	
	SetToResizeAppointmentInitHeight = displaycurrentAppointmentDiv.style.height.replace('px','')/1;
	
	timerResizeAppointment();	
	return false;
}

function timerResizeAppointment()
{
	if(SetToResizeAppointmentCounter>=0 && SetToResizeAppointmentCounter<10){
		SetToResizeAppointmentCounter = Number(SetToResizeAppointmentCounter) + 1;
		setTimeout('timerResizeAppointment()',10);
		return;
	}	
	if(SetToResizeAppointmentCounter==10){
		SetcurrentTimeDiv = getSetcurrentTimeDiv(displaycurrentAppointmentDiv);
		SetcurrentTimeDiv.style.display='block';
	}
}

function initMoveAppointment(e,inputObj)
{
	if(document.all)e = event;
	if(!inputObj)inputObj = this.parentNode;
	displaycurrentAppointmentDiv = inputObj;
	displaycurrentAppointmentContentDiv  = getdisplaycurrentAppointmentContentDiv(displaycurrentAppointmentDiv);
	currentZIndex = Number(currentZIndex) + 1;
	displaycurrentAppointmentDiv.style.zIndex = currentZIndex;	
	SetToMoveAppointmentCounter = 0;
	el_x = getLeftPos(inputObj);	
	el_y = getTopPos(inputObj);
	elWidth = inputObj.offsetWidth;
	
	mouse_x = e.clientX;
	mouse_y = e.clientY;
	
	timerMoveAppointment();
	return false;
	
}

function timerMoveAppointment()
{

	if(SetToMoveAppointmentCounter>=0 && SetToMoveAppointmentCounter<10){
		SetToMoveAppointmentCounter = Number(SetToMoveAppointmentCounter) + 1;
		setTimeout('timerMoveAppointment()',10);
		return;
	}
	if(SetToMoveAppointmentCounter==10){
		SetcurrentTimeDiv = getSetcurrentTimeDiv(displaycurrentAppointmentDiv);
		SetcurrentTimeDiv.style.display='block';
	}	
}

function getMinute(topPos)
{
	var time = (Number(topPos)) / (Number(itemRowHeight)+1);

	var hour = Math.floor(Number(time));
	var minute = Math.floor((Number(time) - Number(hour)) *60);
	
	return minute;
}

function schedulerMouseMove(e)
{
	if(document.all)e = event;
	if(SetnewAppointmentCounter==10){
		if(!displaycurrentAppointmentDiv)return;
		
		var tmpHeight = Number(e.clientY) - Number(mouse_y);
		displaycurrentAppointmentDiv.style.height = Math.max(20,Number(tmpHeight)) + 'px';
		SetcurrentTimeDiv.innerHTML = '<span>' + getTime(displaycurrentAppointmentDiv) + '</span>';	
	}

	if(SetToMoveAppointmentCounter==10){
		var topPos = (Number(e.clientY) - Number(mouse_y) + Number(el_y) - Number(SetappointmentsOffsetTop));

		displaycurrentAppointmentDiv.style.top = topPos + 'px';
		
		var destinationLeftPos = false;
		for(var no=0;no<dayPositionArr.length;no++){
			if(e.clientX>dayPositionArr[no])destinationLeftPos = dayPositionArr[no];			
		}
		
		displaycurrentAppointmentDiv.style.left = (Number(destinationLeftPos) + Number(appointMarginSize) -2) + 'px';
		
		SetcurrentTimeDiv.innerHTML = '<span>' + getTime(displaycurrentAppointmentDiv) + '</span>';	
	}
	
	if(SetToResizeAppointmentCounter==10){
		displaycurrentAppointmentContentDiv.style.height = (Math.max((Number(SetToResizeAppointmentInitHeight) + Number(e.clientY) - Number(mouse_y)),10)-8) + 'px';
		displaycurrentAppointmentDiv.style.height = Math.max((Number(SetToResizeAppointmentInitHeight) + Number(e.clientY) - Number(mouse_y)),10) + 'px';
		SetcurrentTimeDiv.innerHTML = '<span>' + getTime(displaycurrentAppointmentDiv) + '</span>';		
	}
	
}

function repositionFooter(inputDiv)
{
	var subDivs = inputDiv.getElementsByTagName('DIV');
	for(var no=0;no<subDivs.length;no++){
		if(subDivs[no].className=='demo_appoint_footer'){
			subDivs[no].style.bottom = '-1px';
		}
	}	
}

function transferTextAreaContent(e,inputObj,discardContentUpdate)
{
	if(!inputObj)inputObj = this;
	inputObj.style.display='none';
	var spans = inputObj.parentNode.getElementsByTagName('DIV');
	spans[2].style.backgroundColor=globalcol;
	
	for(var no=0;no<spans.length;no++){
		
		if(spans[no].className=='demo_appoint_txt'){
			if(!discardContentUpdate){
				SetappointmentProp[inputObj.parentNode.id]['description'] = inputObj.value;
				spans[no].innerHTML = '<span style="float:right;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;</span>' + inputObj.value.replace(/\n/g,'<br>');
			}
			spans[no].style.display='block';

		}	
		if(spans[no].className=='demo_appoint_footer'){
			spans[no].style.display='block';
		}	
		if(spans[no].className=='demo_appoint_time'){
			spans[no].style.display='block';
		}
					
	}
	SetcontentEditInProgress = false;
	SetcurrentEditableText = false;
	repositionFooter(inputObj.parentNode);
	
	if(quickSave && SetappointmentProp[inputObj.parentNode.id]['description'].length>0){
		saveAnItemToServer(inputObj.parentNode.id);
	}
		
}

function saveAnItemToServer_complete(index,oldId)
{
	if(oldId.indexOf('new_')>=0){
		SetappointmentProp[oldId]['id'] = Calender_ajaxObjects[index].response;
		SetappointmentProp[oldId]['object'].id = Calender_ajaxObjects[index].response.replace(/\s/g,'');
		SetappointmentProp[Calender_ajaxObjects[index].response] = SetappointmentProp[oldId];
		
		Calender_ajaxObjects[index] = false;
		
		if(!inlineTextAreaEnable){
		
			editEventWindow(false,SetappointmentProp[oldId]['object']);	
		}
	}
}

function clearAppointments()
{
	for(var prop in SetappointmentProp){
		if(SetappointmentProp[prop]['id']){
			if(document.getElementById(SetappointmentProp[prop]['id'])){
				var obj = document.getElementById(SetappointmentProp[prop]['id']);
				obj.parentNode.removeChild(obj);
			}
			SetappointmentProp[prop]['id'] = false;	
		}
		
	}	
}

function saveAnItemToServer(inputId)
{

	if(!SetappointmentProp[inputId]['description'])SetappointmentProp[inputId]['description']='';
	if(!SetappointmentProp[inputId]['bgColorCode'])SetappointmentProp[inputId]['bgColorCode']='';
	if(!SetappointmentProp[inputId]['eventStartDate'])updateSetappointmentProp(inputId);;

	var saveString;
	

	if(flagcol == true)
	{
	saveString = "?saveAnItem=true&id=" + SetappointmentProp[inputId]['id']
	+ '&description=' + escape(SetappointmentProp[inputId]['description'])
	+ '&bgColorCode=' + escape(globalcol)
	+ '&eventStartDate=' + SetappointmentProp[inputId]['eventStartDate'].toGMTString().replace('UTC','GMT')
	+ '&eventEndDate=' + SetappointmentProp[inputId]['eventEndDate'].toGMTString().replace('UTC','GMT');
	flagcol = false;
	}
	else
	{
	saveString = "?saveAnItem=true&id=" + SetappointmentProp[inputId]['id']
	+ '&description=' + escape(SetappointmentProp[inputId]['description'])
	+ '&bgColorCode=' + escape(SetappointmentProp[inputId]['bgColorCode'].replace("</item>","").replace("</root>",""))
	+ '&eventStartDate=' + SetappointmentProp[inputId]['eventStartDate'].toGMTString().replace('UTC','GMT')
	+ '&eventEndDate=' + SetappointmentProp[inputId]['eventEndDate'].toGMTString().replace('UTC','GMT');
	}
	
	
	if(SetappointmentProp[inputId]['id'].indexOf('new_')>=0){
		saveString = saveString + '&newItem=1';	
	}
	
			
	var ajaxIndex = Calender_ajaxObjects.length;
	Calender_ajaxObjects[ajaxIndex] = new sack();	
	Calender_ajaxObjects[ajaxIndex].requestFile = save_item_to_db  + saveString;
	Calender_ajaxObjects[ajaxIndex].onCompletion = function(){ saveAnItemToServer_complete(ajaxIndex,SetappointmentProp[inputId]['id']); };	// Specify function that will be executed after file has been found
	Calender_ajaxObjects[ajaxIndex].runAJAX();		
	itemnewtobedeleted = SetappointmentProp[inputId]['id'];

}

function ffEndEdit(e)
{
	if(!SetcurrentEditableText)return;
	if (e.target) source = e.target;
		else if (e.srcElement) source = e.srcElement;
		if (source.nodeType == 3) 
			source = source.parentNode;	
	if(source.tagName.toLowerCase()!='textarea')SetcurrentEditableText.blur();			
}

function initToggleView(e)
{
	if(document.all)e = event;
	if (e.target) source = e.target;
		else if (e.srcElement) source = e.srcElement;
		if (source.nodeType == 3) 
			source = source.parentNode;	

	if(source.className && source.className!='demo_appoint_txt' && source.className!='demo_cal_anAppointment'){		
		return;
	}		
	SettoggleViewCount = 0;
	SetobjectToTogg = this;
	timerToggleView();
	
}
function timerToggleView()
{
	if(SettoggleViewCount>=0 && SettoggleViewCount<10){
		SettoggleViewCount = Number(SettoggleViewCount) + 1;
		setTimeout('timerToggleView()',50);
	}
	if(SettoggleViewCount==10){
		SettoggleViewCount = -1;
		toggleAppointmentView(false,SetobjectToTogg);	
		
	}
}


function toggleAppointmentView(e,inputObj)
{

	if(document.all)e = event;
	
	if(!inlineTextAreaEnable)return;
	
	if(!inputObj){
		inputObj = this;		
	}
	if(e){
		if (e.target) source = e.target;
			else if (e.srcElement) source = e.srcElement;
			if (source.nodeType == 3) 
				source = source.parentNode;	
		if(source.tagName.toLowerCase()=='textarea')return;
		if(SetcontentEditInProgress && source.tagName=='DIV'){
			transferTextAreaContent(false,displaycurrentAppointmentDiv.getElementsByTagName('TEXTAREA')[0]);
			return;	
		}
		if(source.className && source.className!='demo_cal_anAppointment' && source.className!='demo_appoint_txt')return;
	
	}

	
	displaycurrentAppointmentDiv = inputObj;
	var spans = inputObj.getElementsByTagName('DIV');	
	
	var tmpValue = "";
	for(var no=0;no<spans.length;no++){
		if(spans[no].className=='demo_appoint_txt'){
			spans[no].style.display='none';	
			tmpValue = SetappointmentProp[inputObj.id]['description'];
		}
		if(spans[no].className=='demo_appoint_footer'){
			spans[no].style.display='none';					
		}
		if(spans[no].className=='demo_appoint_time'){
			spans[no].style.display='none';					
		}				
	}

	var ta = displaycurrentAppointmentDiv.getElementsByTagName('TEXTAREA')[0];
	ta.style.width = (displaycurrentAppointmentDiv.clientWidth - 6) + 'px';
	ta.style.height = (displaycurrentAppointmentDiv.offsetHeight-14) + 'px';
	ta.style.display='inline';
	ta.value = tmpValue;
	
	
	SetcontentEditInProgress = true;
	SetcurrentEditableText = ta;
	ta.focus();			
	
}



function keyboardEventTextarea(e)
{
	if(document.all)e = event;
	if(e.keyCode==27){
		transferTextAreaContent(false,this,true);
	}
}


function deletethisitem(divDel)

{
if(confirm(txt_deleteEvent))
		{
		
			var ajaxIndex = Calender_ajaxObjects.length;
			Calender_ajaxObjects[ajaxIndex] = new sack();	
			if(divDel==undefined)
			{
			Calender_ajaxObjects[ajaxIndex].requestFile = delete_item_from_db  + '?eventToDeleteId=' + itemnewtobedeleted;
			}
			else
			{
			Calender_ajaxObjects[ajaxIndex].requestFile = delete_item_from_db  + '?eventToDeleteId=' + divDel;
			}
			Calender_ajaxObjects[ajaxIndex].onCompletion = function(){ deleteEventFromView(ajaxIndex); };	// Specify function that will be executed after file has been found
			Calender_ajaxObjects[ajaxIndex].runAJAX();		
		
			
	}
	
}


function createNewAppointmentDiv(leftPos,topPos,width,contentHTML,height,divids)
{
	var div = document.createElement('DIV');
	div.onclick = setElementActive;
	div.ondblclick = editEventWindow;
	div.className='demo_cal_anAppointment';
	div.style.left = leftPos + 'px';
	div.style.top = topPos + 'px';
	div.style.width = width + 'px';
	div.onmousedown = initToggleView;
	if(height)div.style.height = height + 'px';
	var timeDiv = document.createElement('DIV');
	timeDiv.className='demo_appoint_time';
	timeDiv.innerHTML = '<span></span>';
	div.appendChild(timeDiv);
	var header = document.createElement('DIV');
	header.className= 'demo_appoint_header';
	header.innerHTML = "<span><img style='cursor:hand' onclick='deletethisitem("+divids+");' height='10px' width='10px' src='images/icon-delete.gif' alt='Delete' /></span>";
	header.onmousedown = initMoveAppointment;
	header.style.cursor = 'move';
	header.style.height = '8px';
	div.appendChild(header);
	var span = document.createElement('DIV');	

	var innerSpan = document.createElement('SPAN');
	innerSpan.innerHTML = '<span style="float:right;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;</span>' + contentHTML;
	span.appendChild(innerSpan);
	span.className = 'demo_appoint_txt';
	div.appendChild(span);
	
	var textarea = document.createElement('TEXTAREA');
	textarea.className='demo_appoint_textarea';
	textarea.style.display='none';
	textarea.onblur = transferTextAreaContent;
	textarea.onkeyup = keyboardEventTextarea;
	div.appendChild(textarea);
	
	var colorCodeDiv = document.createElement('DIV');
	colorCodeDiv.className='weekScheduler_appointment_colorCodes';
	div.appendChild(colorCodeDiv);
	
	var footerDiv = document.createElement('DIV');
	footerDiv.className='demo_appoint_footer';
	footerDiv.style.cursor = 'n-resize';
	footerDiv.innerHTML = '<span></span>';
	footerDiv.onmousedown = initResizeAppointment;
	div.appendChild(footerDiv);
	demo_cal_appointments.appendChild(div);		
	return div;
	

}



function schedulerMouseUp()
{

	if(SetnewAppointmentCounter>=0){
		if(SetnewAppointmentCounter==10){
			if(!displaycurrentAppointmentDiv)return;
			if(inlineTextAreaEnable){		
				var spans = displaycurrentAppointmentDiv.getElementsByTagName('DIV');
				for(var no=0;no<spans.length;no++){
				
				
					if(spans[no].className=='demo_appoint_txt'){
						spans[no].style.display='none';					
					}
					if(spans[no].className=='demo_appoint_footer'){
						spans[no].style.display='none';					
					}
					if(spans[no].className=='demo_appoint_time'){
						spans[no].style.display='none';					
					}				
				}
				var ta = displaycurrentAppointmentDiv.getElementsByTagName('TEXTAREA')[0];
				ta.style.width = (Number(displaycurrentAppointmentDiv.clientWidth) - 6) + 'px';
				ta.style.height = (Number(displaycurrentAppointmentDiv.offsetHeight)-14) + 'px';
				ta.style.display='inline';
				ta.focus();
			}
			else{
				
				saveAnItemToServer(displaycurrentAppointmentDiv.id);
			}
			
		}
	}

	if(snapMinutes && displaycurrentAppointmentDiv && SetToMoveAppointmentCounter==10){
		topPos = Number(getTopPos(displaycurrentAppointmentDiv)) - Number(SetappointmentsOffsetTop);
		
		var minute = getMinute(topPos);
		var rest = (minute % snapMinutes);
		if(rest>(snapMinutes/2)){
			topPos = Number(topPos) + (Number(snapMinutes)/60*(Number(itemRowHeight)+1)) - ((Number(rest)/60)*(Number(itemRowHeight)+1));
		}else{
			topPos = Number(topPos) - ((Number(rest)/60)*(Number(itemRowHeight)+1));
		}
		var minute = getMinute(topPos);	
		var rest = (Number(minute) % Number(snapMinutes));
		if(rest!=0){
			topPos = Number(topPos) - ((Number(rest)/60)*(Number(itemRowHeight)+1));
		}
		
		var minute = getMinute(topPos);
		var rest = (Number(minute) % Number(snapMinutes));
		if(rest!=0){
			topPos = Number(topPos) - ((Number(rest)/60)*(Number(itemRowHeight)+1));
		}
		displaycurrentAppointmentDiv.style.top = topPos + 'px';
		SetcurrentTimeDiv.innerHTML = '<span>' + getTime(displaycurrentAppointmentDiv) + '</span>';
	}
		
	if(displaycurrentAppointmentDiv && snapMinutes && (SetToResizeAppointmentCounter==10 || SetnewAppointmentCounter)){
		autoResizeAppointment();
	}
	
	
	if(displaycurrentAppointmentDiv && !SetcontentEditInProgress){
		repositionFooter(displaycurrentAppointmentDiv);
		updateSetappointmentProp(displaycurrentAppointmentDiv.id);
	}

	
	displaycurrentAppointmentDiv = false;
	SetcurrentTimeDiv = false;
	SetToMoveAppointmentCounter = -1;
	SetToResizeAppointmentCounter = -1;
	SetnewAppointmentCounter = -1;
	SettoggleViewCount = -1;
}





var getiid;
function autoResizeAppointment()
{
getiid=displaycurrentAppointmentDiv.id
	var tmpPos = getTopPos(displaycurrentAppointmentDiv) - SetappointmentsOffsetTop + displaycurrentAppointmentDiv.offsetHeight;
	var startPos = tmpPos;
	
	var minute = getMinute(tmpPos);
	
	var rest = (Number(minute) % Number(snapMinutes));
	var height = displaycurrentAppointmentDiv.style.height.replace('px','')/1;
	
	if(rest>(Number(snapMinutes)/2)){
		tmpPos = Number(tmpPos) + Number(snapMinutes) - (Number(minute) % Number(snapMinutes));
	}else{
		tmpPos = Number(tmpPos) - (Number(minute) % Number(snapMinutes));
	}		
	
	var minute = getMinute(tmpPos);
	if((minute % snapMinutes)!=0){
		tmpPos = Number(tmpPos) - (Number(minute) % Number(snapMinutes));
	}
	var minute = getMinute(tmpPos);
	if((Number(minute) % Number(snapMinutes))!=0){
		tmpPos = Number(tmpPos) - (Number(minute) % Number(snapMinutes));
	}		
	
	displaycurrentAppointmentDiv.style.height = (Number(height) + Number(tmpPos) - Number(startPos)) + 'px';
	SetcurrentTimeDiv.innerHTML = '<span>' + getTime(displaycurrentAppointmentDiv) + '</span>';	
	

}



function deleteEventFromView(index)
{
	if(Calender_ajaxObjects[index].response=='OK'){
		SetactiveEventObj.parentNode.removeChild(SetactiveEventObj);
		SetactiveEventObj = false;	
	}else{
	
		
		alert('Could not confirm that event has been deleted. Make sure that the script is configured correctly');
	}

}


function schedulerKeyboardEvent(e){
	if(document.all)e = event;
	if(e.keyCode==46 && SetactiveEventObj){
		if(confirm(txt_deleteEvent)){
			var ajaxIndex = Calender_ajaxObjects.length;
			Calender_ajaxObjects[ajaxIndex] = new sack();	
			Calender_ajaxObjects[ajaxIndex].requestFile = delete_item_from_db  + '?eventToDeleteId=' + SetactiveEventObj.id;
			
			Calender_ajaxObjects[ajaxIndex].onCompletion = function(){ deleteEventFromView(ajaxIndex); };	// Specify function that will be executed after file has been found
			Calender_ajaxObjects[ajaxIndex].runAJAX();		// Execute AJAX function	
		}		
	}	
}


function getTopPos(inputObj)
{		
  var returnValue = inputObj.offsetTop;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetTop;
  }
  return returnValue;
}

function getLeftPos(inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetLeft;
  }
  return returnValue;
}
	
	
function cancelSelectionEvent(e)
{
	if(document.all)e = event;
	
	if (e.target) source = e.target;
		else if (e.srcElement) source = e.srcElement;
		if (source.nodeType == 3) 
			source = source.parentNode;
	if(source.tagName.toLowerCase()=='input' || source.tagName.toLowerCase()=='textarea')return true;
					
	return false;
	
}
function initCalendar()
{
	demo_container = document.getElementById('demo_container');
	if(!document.all)demo_container.onclick = ffEndEdit;
	demo_cal_appointments = document.getElementById('demo_cal_appointments');
	var subDivs = demo_cal_appointments.getElementsByTagName('DIV');
	for(var no=0;no<subDivs.length;no++){
		if(subDivs[no].className=='demo_appointHour'){
			subDivs[no].onmousedown = initNewAppointment;
			
			if(!SetnewAppointmentWidth)SetnewAppointmentWidth = subDivs[no].offsetWidth;
		}
		if(subDivs[no].className=='demo_appoint_day'){
			dayPositionArr[dayPositionArr.length] = getLeftPos(subDivs[no]);
		}
		
	}
	if(initilizeTopHours > CalenderStartHour)document.getElementById('demo_cal_content').scrollTop = ((initilizeTopHours - CalenderStartHour)*(itemRowHeight+1));
	

	SetappointmentsOffsetTop = getTopPos(demo_cal_appointments);
	SetappointmentsOffsetLeft = 2 - Number(appointMarginSize);
	
	document.documentElement.onmousemove = schedulerMouseMove;
	document.documentElement.onselectstart = cancelSelectionEvent;
	document.documentElement.onmouseup = schedulerMouseUp;
	document.documentElement.onkeydown = schedulerKeyboardEvent;
	var tmpDate = new Date();
	var dateItems = initDateToShow.split(/\-/g);
	tmpDate.setFullYear(dateItems[0]);
	tmpDate.setDate(Number(dateItems[2])/1);
	tmpDate.setMonth(Number(dateItems[1])/1-1);
	tmpDate.setHours(1);
	tmpDate.setMinutes(0);
	tmpDate.setSeconds(0);
	
	var day = tmpDate.getDay();

	if(day==0)day=7;
	if(day>1){
		var time = tmpDate.getTime();
		time = Number(time) - (1000*60*60*24) * (Number(day)-1);
		tmpDate.setTime(time);	
	}
	SetdateStartOfWeek = new Date(tmpDate);
	
	updateTopHeadDates();
	
	if(get_items_from_db){
		getItemsFromDBServer();		
	}
	
	
	
}

function displayPreviousWeek()
{
	var tmpTime = SetdateStartOfWeek.getTime();
	tmpTime = Number(tmpTime) - (1000*60*60*24*7);
	SetdateStartOfWeek.setTime(tmpTime);
	updateTopHeadDates();	
	clearAppointments();
	getItemsFromDBServer();
	
}


function displayNextWeek()
{
	var tmpTime = SetdateStartOfWeek.getTime();
	tmpTime = Number(tmpTime) + (1000*60*60*24*7);
	SetdateStartOfWeek.setTime(tmpTime);
	updateTopHeadDates();
	clearAppointments();
	getItemsFromDBServer();
	
}

function updateTopHeadDates()
{
	var weekScheduler_dayRow = document.getElementById('weekScheduler_dayRow');
	var subDivs = weekScheduler_dayRow.getElementsByTagName('DIV');		
	var tmpDate2 = new Date(SetdateStartOfWeek);
	
	
	
	for(var no=0;no<subDivs.length;no++){
		var month = Number(tmpDate2.getMonth())/1 + 1;
		var date = tmpDate2.getDate();
		var tmpHeaderFormat = " " + settingHeaderDateFormat;
		
		tmpHeaderFormat = tmpHeaderFormat.replace('d',date);
		tmpHeaderFormat = tmpHeaderFormat.replace('m',month);
		subDivs[no].getElementsByTagName('SPAN')[0].innerHTML = tmpHeaderFormat;
		dayDateArr[no] = month + '|' + date;
		var time = tmpDate2.getTime();
		time = Number(time) + (1000*60*60*24);
		tmpDate2.setTime(time);

	}	
}

window.onload = initCalendar;


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
CEO SL Soft Technologies
India India
SL-Soft Technologies provides e-business solutions and application management services to its various clients in India and abroad. Our expertise extends across a wide range of technologies encompassing Internet, E-Commerce, Data Warehousing, and Software Development. Our industry experience extends to providing solutions to several industries.

We believe in partnering with our clients for every solution we develop for them. Be it a Website Development, software development or any other assignment, we are always next to our clients. This gives us a unique opportunity to understand their business requirements and deliver them the solutions which fit the best in their needs. SL-Soft Technologies is on a continuous growth path ever since and has earned a clientele of highly satisfied customers. We are committed to set new horizons in client satisfaction.

Comments and Discussions