

YAHOO.namespace("YAHOO.extwidget");
YAHOO.namespace("YAHOO.mrespta");

(function() {
    /**
    * @private
    **/
var Dom = YAHOO.util.Dom,
    Event = YAHOO.util.Event,
    Lang = YAHOO.lang,
	Mres = YAHOO.mrespta,
    DateMath = YAHOO.widget.DateMath,
	replaceEx = YAHOO.extwidget.util.replaceEx;
	

YAHOO.extwidget.CalendarList = function( attr )
{
	this.url = attr.url;
	this.id = attr.id;
	this.url = attr.url || 'http://'+document.domain+'/ws/tojson.php5?url=/calendar/events.xml';
	this.idCalContainer = attr.id+'_calcontainer';
	this.idCal = attr.id+'_cal';
	this.idList = attr.idList || attr.id+'_list';
	this._init();
};

YAHOO.extwidget.CalendarList.prototype =
{
	markup:
	{
		calendar: '<div id="{idCalContainer}"></div>',
		list:'<ul style="height:330px;overflow-y:auto" class="calEventsList" id="{idList}"></ul>',
		eventitem:'<li class="item"><a href={link}>{name}</a></li>'
	},
	
	_buildMarkup: function()
	{
		this.el = document.getElementById( this.id );
		this.el.innerHTML = replaceEx( this.markup.calendar + (Dom.get(this.idList) ? '':this.markup.list), this );
	},

	_getRenderer : function(control, event)
	{
		var cal = control.cal;
		var today = new Date();
		var dayOfWeek = DateMath.getWeekNumber(today);
		
		return function(workingDate, cell) 
		{
			var day = workingDate.getDay();
			event.dayOfWk = dayOfWeek == DateMath.getWeekNumber(workingDate);
			if (!event.freq) // not a repeat event
			{
			    // remove any repeat class
			    if (Dom.hasClass(cell, "cell-repeat1"))Dom.removeClass(cell,"cell-repeat1");
			    if (Dom.hasClass(cell, "cell-repeat2"))Dom.removeClass(cell,"cell-repeat2");
			         
            }
			if (event.style)
			    Dom.addClass(cell, event.style);
			if (event.dayOfWk)
				Dom.addClass(cell,"thisweekcell");
				
			if (event.multiday)
			{
	            var date = [workingDate.getMonth() + 1, workingDate.getDate(),workingDate.getFullYear()].join('/');
                // for tooltip
                if (!Mres.monthevs.rangeevs[date])
                    Mres.monthevs.rangeevs[date] = event;
                else
                    Mres.monthevs.rangeevs[date].item = Mres.monthevs.rangeevs[date].item.concat(event.item);
            }
			if (!event.item) // this is just a day of this week but has no events
	        	return;
			// also add to month list to show in the events list
	        var found;
	        for (var i=Mres.monthevs.length-1;i>=0;i--)
	        {
		        if (Mres.monthevs[i] == event)
			        found = true;
	        }

	        if (!found)
            {
		        Mres.monthevs.push(event);
            }
		}
	},
	
	
	_requestXML : function()
	{
		// retrieved entire events data set
		function onSuccess(o)
        {   
			var data;
			if (o.status == 200)
			{
				try 
				{
					var mresdata = Mres.caldata = {}; // hold entire events set
					eval("var cdata = " + o.responseText);
				    var ev;
					for (var i=0, len = cdata.events.length; i < len; i++)
					{
						ev = cdata.events[i];
						if (!YAHOO.lang.isArray(ev.item))
						    ev.item = [ev.item]; // convert to array
						    
						if (ev.date.split('-')[1]) // range
						    ev.multiday = true;
						mresdata[ev.date] = ev; // make date the key
					}
					
					for (var key in mresdata) // doing it here once per lifetime for specific date events
						this.cal.addRenderer(key, this._getRenderer(this,mresdata[key]));	

					// now for repeat events (will be handled before each month render)
					mresdata.repeat = cdata.repeat; // just add on the repeat events
					
					this.cal.render();
					this._onChangePage();
				}
				catch(e)
				{
				}
			}
        }
        
        function onFailure (o)  { }
  		var callback =
        {
            success : onSuccess,
            failure : onFailure,
            scope : this
        };
		YAHOO.util.Connect.asyncRequest('GET', this.url, callback); 
		
		
	},
	_ordinal : ["1st", "2nd", "3rd", "4th", "5th"],
	
	// handle repeats here on a monthly basis, since onBeforeRender is called for every month as it
	// is picked - figure out which days of the week have repeat events
	_onBeforeRender : function()
	{
	    try
		{
			Mres.monthevs = []; // clear out the month structure - day events this month
			var moevsrep = Mres.monthevs.repeat = []; // repeat events this month
			Mres.monthevs.rangeevs = {}; // range events this month - needed for tooltip
			var day;
			var rep = Mres.caldata.repeat, caldata = Mres.caldata; // entire data sent from events file
			var evs,dtstr,add = false,evclone,sFreq,found;

			var sDate = this.cal.cfg.config.pagedate.value; // the first day of month to get rendered
			var eDate = DateMath.findMonthEnd(sDate);
			var weekNum = DateMath.getWeekNumber(new Date()); //today weeknum
			
			while (sDate <= eDate)
			{
					
				
				day = sDate.toDateString().split(" ")[0]; // e.g 'Thu' out of 'Thu Sep 1 2007'
		        dtstr = [sDate.getMonth() + 1,sDate.getDate(),sDate.getFullYear()].join('/');
				// if this date is of current week, special rendering
				if (DateMath.getWeekNumber(sDate) == weekNum)
					this.cal.addRenderer(dtstr, this._getRenderer(this,Mres.caldata[dtstr]||{dayOfWeek : true}));


				// if this is a repeated event by day (Mon Tue etc). set up callback _getRenderer
				// for this particular date so as to color the cell. Normal day events have been
				// taken care of at events retrieval time
				if (rep[day])
				{
					evs = rep[day].events;
					if (!YAHOO.lang.isArray(evs))
					    evs = [evs]; // make it an array for uniformity
					for (var i=0, len = evs.length; i < len; i++)
					{
						if (!YAHOO.lang.isArray(evs[i].item))
						    evs[i].item = [evs[i].item];
						    
						if (evs[i].end && (new Date(evs[i].end) < sDate)) // end date - expired event
							continue;

						var freq = evs[i].freq.match(/week([\d\w]*)$/);
						if (!freq || !freq[1])
						    continue;
						if (freq[1] == 'ly') // weekly
						{
						    sFreq = "Each " + day;
							add = true;
						}
						else if (!isNaN(freq[1]) && sDate.getDate() <= freq[1]*7 && sDate.getDate() > (freq[1]-1)*7)
						{
							add = true;
							sFreq = this._ordinal[freq[1]-1] + "  " + day;
						}
						else
							add = false;
						if (add)
                        {
					        // clone the repeat event and add the date - 
					        found = false;
							this.cal.addRenderer(dtstr, this._getRenderer(this,evs[i]));
						    // we want to keep repeat events at the bottom of the uilist to prevent clutter	
							for (var j=0,jlen = moevsrep.length; j < jlen; ++j)
							{
							    if (moevsrep[j].sFreq == sFreq)
							    {
							        moevsrep[j].date += ","+dtstr; // add the date
							        found = true;    
							        break;
							    }    
							}
							if (!found)
							{
					            evclone = {};
					            for (var key in evs[i])
					                evclone[key] = evs[i][key];
					            evclone.date = dtstr; // add the specific date to the event
					            evclone.sFreq = sFreq; // add the specific week day - Wed, Thu etc to the event
							    moevsrep.push(evclone);
							}
				        }
					}
				}
				sDate = DateMath.add(sDate,DateMath.DAY,1);
			}
		}
		catch(e)
		{
		}
		
	},
	
	_onChangePage: function()
	{
		var markup ='',evstr;
		for (var i=0, len = Mres.monthevs.length; i < len; ++i)
		{
			try
			{
			    var event = Mres.monthevs[i];
    			
			    var style = event.style || '';
			    var range = event.date.split('-');
			    var date = range.length == 1 ? event.date.slice(0,event.date.lastIndexOf("/")): // format the dates as m/d
										       range[0].slice(0,range[0].lastIndexOf("/")) + '-' +
										       range[1].slice(0,range[1].lastIndexOf("/"));
//			    markup += ['<li><span class="event ',style,'"><span>&nbsp;</span></span><a href="javascript:YAHOO.mrespta.addReminder(this);" class="datespan">',date, 
//					       '</a>',event.item.join("<br/>"),'</li>'].join('');
			    markup += ['<li class="event ',style,'"><span>&nbsp;</span><span  class="datespan">',date, 
					       '</span>',
						   //event.dayOfWk ? '<span style="background:none;color:blue">':'',
						   event.dayOfWk ? '<span class="thisweek">':'',
						   event.item.join("<br/>"),
						   event.dayOfWk? '</span>' :'',
						   '</li>'].join('');

			}
			catch(e)
			{
			}
		}

		for (i=0, len = Mres.monthevs.repeat.length; i < len; ++i)
		{
			try
			{
			    event = Mres.monthevs.repeat[i];
			    style = event.style || '';
			    markup += ['<li class="event ',style,'"><span>&nbsp;</span><span  class="datespan">',event.sFreq, 
					       '</span>',event.item,'</li>'].join('');
                
			}
			catch(e)
			{
			}
		}
    			
		
		Dom.get(this.idList).innerHTML=markup;
	},
		
	_init: function()
	{
		this.el = document.getElementById( this.id );
		this._buildMarkup();
		this.cal = new YAHOO.widget.Calendar(this.idCal, this.idCalContainer); //this.idCal
		this.cal.Style.CSS_CELL_SELECTED = ' ';
		this.cal.changePageEvent.subscribe(this._onChangePage, this, true);
		this.cal.beforeRenderEvent.subscribe(this._onBeforeRender, this,true);
		this.cal._cellEvs = {};  // this is a map of cell number to event names for that cell (for hover display)do

		var calcont = this;

		this.cal.doSelectCell = function (e, cal)
		{
			var index = cal.index;
			var cell;
			
			if (e) {
				cell = YAHOO.util.Event.getTarget(e);
			} else {
				cell = this;
			}
		
			while (cell.tagName && cell.tagName.toLowerCase() != "td") {
				cell = cell.parentNode;
				if (!cell.tagName || cell.tagName.toLowerCase() == "html") {
					return;
				}
			}
			if (!Dom.hasClass(cell, "calcell"))
					return;

			var d = cal.cellDates[cell.id.split("_cal_cell")[1]]; // get the index
			if (!d)
			    return;
			    
			if (new Date(d[0],d[1]-1,d[2]) < new Date()) // selected date is in the past or today
			{
                alert("The event reminder date you have selected is past. Please select an event in the future.");
                return ;
			}    
			var ev,evlist=[];
			date = [d[1],d[2],d[0]].join("/");
			// look for straight events 
			ev = Mres.caldata[date];
			if (ev && ev.item && !ev.multiday) // multiday events will be pulled from rangeev list
                evlist = evlist.concat(ev.item);
            // look for range events
            ev = Mres.monthevs.rangeevs[date];
            if (ev && ev.item)
                evlist = evlist.concat(ev.item);
            
            if (evlist.length == 0)
            {
                alert("Sorry we support reminders for non-recurring events only. No reminder will be set.");
                return;
            }

            Mres.evReminder.initUI();
            Mres.evReminder.setEvents(d, evlist);
            Mres.evReminder.dlg.show();
		
			//alert(date + " : " + ttip);
		}
		
		this.cal.doCellMouseOver = function (e, cal) //this._onHover;
		{
			try
			{
				var cell;
				
				if (e) {
					cell = YAHOO.util.Event.getTarget(e);
				} else {
					cell = this;
				}
			
				while (cell.tagName && cell.tagName.toLowerCase() != "td") {
					cell = cell.parentNode;
					if (!cell.tagName || cell.tagName.toLowerCase() == "html") {
						return;
					}
				}
				if (!Dom.hasClass(cell, "calcell"))
						return;
				var date = cal.getDateByCellId(cell.id);
				var d = cal.cellDates[cell.id.split("_cal_cell")[1]]; // get the index
				if (!d)
				    return;
				var ev,ttip = "";
				date = [d[1],d[2],d[0]].join("/");
				// look for straight events 
				ev = Mres.caldata[date];
				if (ev && ev.item && !ev.multiday) // multiday events will be pulled from rangeev list
                {
                    ttip = ev.item.join("<br/>");
                    if (ev.item.length == 1) // join wont do it 
                        ttip += "<br/>";
                }
                // look for range events
                ev = Mres.monthevs.rangeevs[date];
                if (ev && ev.item)
                {
                    ttip += ev.item.join("<br/>");
                    if (ev.item.length == 1) // join wont do it 
                        ttip += "<br/>";
                }
                
                // look for repeat events to add
                var arrRep = Mres.monthevs.repeat;
                for(var i=0, len = arrRep.length; i < len; ++i)
                {
                    if (arrRep[i].date.search(date) != -1)
                        ttip +=  arrRep[i].item + "<br/>";
                }
                if (ttip)
					this._tooltip = new YAHOO.widget.Tooltip("caldayTooltip", { 
											context: cell.id, 
											text:ttip,
											showDelay:500} );			
			}
			catch(e)
			{
			}
		}
        
		this.cal.doCellMouseOut = function (e, cal) //this._onHover;
		{
			this._tooltip = null;
		}

		this._requestXML();
	}
};

})();



	
	
	
	
	

