///////////////////////////////////////////////////////////////////////////////////////////////////
// File: calendar.js
// Creator: Monjay Settro, Devbleue Inc.
// Purpose: Localizes Calendar Functions
// History:
// 04/
// 06/05/07, monjay, changed parseInt(value) to parseInt(value, base) because parseInt('08') and 
//                   parseInt('09') to seems like octal rather than decimal numbers to the browser
//                   http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C85006A6604
// Notes: This could be cleaner... perhaps in time.
///////////////////////////////////////////////////////////////////////////////////////////////////

var calconf;

///////////

function previous_month()
{
   nav_month(-1);
}
function next_month()
{
   nav_month(+1);
}
function nav_month(next_or_previous)
{
   if (typeof calconf['selected_year'] == 'string')
   {
        calconf['selected_year'] = parseInt(calconf['selected_year'], 10);
   }

   for(var m = 0; m < calconf['themonths'].length; m++)
   {
      if (calconf['selected_month'] == calconf['themonths'][m])
      {
         if ((next_or_previous == +1) &&
            (calconf['themonths'][m] == calconf['themonths'][calconf['themonths'].length-1]))
         {
            calstart(calconf['themonths'][0], 
                     calconf['selected_year'] + next_or_previous, 
                     calconf['selected_subcategory'])
         }
         else if ((next_or_previous == -1) &&
                  (calconf['themonths'][m] == calconf['themonths'][0]))
         {
            calstart(calconf['themonths'][calconf['themonths'].length-1], 
                     calconf['selected_year'] + next_or_previous, 
                     calconf['selected_subcategory'])
         }
         else
         {
            calstart(calconf['themonths'][m + next_or_previous], 
                     calconf['selected_year'], 
                     calconf['selected_subcategory'])
         }
         return true;
      }
   } //for
} //nav_month

///////////////////////////////////////////////////////////////////////////////////////////////////

function day_numbers(selected_month, selected_year)
{
   if (!calconf)
   {
      return false;
   }

   var today = new Date();

   calconf['themonths'] = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
   calconf['current_month_number'] = today.getMonth() + 1;
   calconf['current_month']        = calconf['themonths'][today.getMonth()];
   calconf['current_day']          = today.getDate();
   calconf['current_year']         = today.getFullYear();
   calconf['selected_month']       = (!selected_month) ? calconf['current_month'] : selected_month;
   calconf['selected_year']        = (!selected_year)  ? calconf['current_year']  : selected_year;

   // calconf['selected_day'] may or may not be set depending on the
   // comparison of the selected month/year to the current month/year
   if ((calconf['selected_month'] == calconf['current_month']) &&
       (calconf['selected_year'] == calconf['current_year']))
   {
        calconf['selected_day'] = calconf['current_day'];
   }

   var SoM = new Date(calconf['selected_month'] + ' 01, ' + calconf['selected_year']) // start of month

   calconf['selected_month_number']          = SoM.getMonth() + 1;
   calconf['selected_month_last_day_number'] = calc_last_day_of_month(calconf['selected_month'], calconf['selected_year']);
   calconf['selected_month_start_Week1Day']  = SoM.getDay() + 1;

   setCalVal('dataMonthNameYear',   calconf['selected_month'] + ' ' + calconf['selected_year'])
   setCalClass('dataMonthNameYear', 'textMonthNameYear textMonthNameYear' + calconf['selected_month']) //stack 'textMonthNameYear textMonthNameYear<Month>'

   var cellMonthNameStyle = 'cellMonthName'
   for (var m = 0; m < calconf['themonths'].length; m++)
   {
      if (calconf['themonths'][m] == calconf['selected_month'])
      {
         cellMonthNameStyle = cellMonthNameStyle + ' ' + 'cellMonthName' + calconf['themonths'][m];
      }
   }
   setCalClass('cellMonthName', cellMonthNameStyle);

   var day_number      = 0;
   var content         = '';
   var initialized     = new Array;
   var start_numbering = false;

   calconf['days_in_week']  = new Array;

   for (var week = 1; week < 7; week++)
   {
      for (var d = 1; d < 8; d++)
      {
         start_numbering = ((week == 1) && (d == calconf['selected_month_start_Week1Day'])) ? true : start_numbering;
         start_numbering = (day_number == calconf['selected_month_last_day_number']) ? false : start_numbering;

         content = '';
         if (start_numbering)
         {
            content = day_number = day_number + 1

            // Creates calconf['Mondays'] = MM/DD/YYYY, MM/DD/YYYY, MM/DD/YYYY  arrays
            var day_name = calconf['weekdays'][d-1];
                day_name = day_name + 's'

            var day_number_date = two_digits(calconf['selected_month_number']) + '/' + 
                                  two_digits(day_number) + '/' + 
                                  calconf['selected_year']

            if (!initialized[day_name])
            {
               calconf[day_name] = new Array();
               initialized[day_name] = 1;
            }
            calconf[day_name].push(day_number_date);

            if (!calconf['days_in_week'][week])
            {
                calconf['days_in_week'][week] = day_number
            }
            else
            {
               calconf['days_in_week'][week] = calconf['days_in_week'][week] + ',' + day_number;
            }
        
            if (content)
            {
                //determine events content for the day
                //setCalVal('dataEventWeek' + week + 'Day' + d, content);
                setCalVal('dataDayWeek' + week + 'Day' + d, content);
            }
            
            if ((calconf['selected_month'] == calconf['current_month']) &&
                (day_number == calconf['current_day']) &&
                (calconf['selected_year'] == calconf['current_year']))
            {
                setCalClass('dataDayWeek' + week + 'Day' + d, "textDay textDayWeek1 textDayWeek1Day4 todayIndicator todayIndicator" + calconf['selected_month']);
                setCalClass('cellWeek' + week + 'Day' + d, "cellDay cellDayWeek" + week + "Day" + d + " cellTodayIndicator");
            }
            
        } // if (start_numbering)

      } //for each day
   } // for each calendar week

   var o = document.getElementById('week6')
   o.className = 'week6off'
   if ((calconf['selected_month_start_Week1Day'] > 6) && (calconf['selected_month_last_day_number'] > 29))
   {
      o.className = 'week6'
   }

   o = document.getElementById('week5');
   o.className = 'week5'
   if ((calconf['selected_month_start_Week1Day'] == 1 ) && (calconf['selected_month_last_day_number'] == 28))
   {
      o.className = 'week5off'
   }

   return true
} //days_numbers

///////////////////////////////////////////////////////////////////////////////////////////////////

function event_details(day, week)
{
	var total = 0;

	for (var e = 0; e < calconf['events'][day].length; e++)
	{
		var E = calconf['events'][day][e];
		if (E['flg_display'])
		{
			total = total + 1;
		}
	}

	var cnt  = 0;
	var html = '';
	for (var e = 0; e < calconf['events'][day].length; e++)
	{
		var E = calconf['events'][day][e];

		if (E['flg_display'])
		{
			cnt = cnt + 1;

			E['desc'] = (E['desc']) ? E['desc'] : '';

            var classname = (e > 0) ? 'notfirst' : '';

			html = html + '<table class="' + classname + '" border="0" cellspacing="0" cellpadding="0">';  // style '.eventDetails table table' also controls this code
			html = html + '<tr>';

            /////

            html = html + '<td valign="top" style="padding-right:15px;">';
			if (E['icon'])
			{
				html = html + '<img class="eventIcon" src="' + E['icon'] + '" />';
			}
			else
			{
				html = html + '<img class="eventIconBlank" src="http://timessquarenyc.org/images/blank.gif" />';
			}
			html = html + '</td>'

            /////

			html = html + '<td valign="top" width="325">';
			html = html + '<span class="eventDetailsDescription">' + '<b>' + E['html_summary'] + '</b>';
			if (E['location'])
			{
				html = html + '<br/><b>Location: ' + E['location'] + '</b>';
			}
			if (E['desc'])
			{
				html = html + '<br/><br/>' + E['desc'];
			}
			html = html + '</span>';
			html = html + '</td>'

            /////

			html = html + '</tr>'

			if (cnt < total)
			{
				html = html + '<tr><td colspan="2"><hr class="eventDetailsSeparator"/></td></tr>'
			}
			
			if (calconf['events'][day].length == 1)
			{
                //html = html + '<tr><td colspan="2"><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/></td></tr>'
			}

			html = html + '</table>'

		}
	}

    html = html + '<br/>'

    // position eventDetails

    var pos = new Array();
        pos['Monday'] = findPos(getCalObj('dataDayName2'));
        pos['week']   = findPos(document.getElementById('week' + week));   //destination

    var eventDetails =  getCalObj('eventDetails')
        eventDetails.style.top  = pos['week'].top    + 45;
        eventDetails.style.left = pos['Monday'].left - 10;
  
    // populate and show eventDetails

    setCalVal("eventDetails", getCalVal('eventDetailsModel').replace('[month]', calconf['selected_month']).replace('[day]', day).replace(['year'], '').replace('[body]', html));
	setCalClass('eventDetails', 'eventDetails unhide');
}

///////////////////////////////////////////////////////////////////////////////////////////////////

function closeAll()
{
    addDetailsClose();
    addDetailsThanksClose();
    eventDetailsClose();
}

function addDetailsOpen()
{
    var f = getCalObj('addDetailsForm');

    /* temporary remove while I test submit...
    for (var e = 0; e < f.elements.length; e++)
    {
        f.elements[e].value = '';
    }
    */

    var pos = new Array();
        pos['Monday'] = findPos(getCalObj('dataDayName2'));
        pos['week']   = findPos(document.getElementById('week1'));

    var addDetails = getCalObj('addDetails')
        addDetails.style.top  = pos['week'].top    + 45;
        addDetails.style.left = pos['Monday'].left - 8;

    f.elements['start[month]'].value = calconf['selected_month'];
    f.elements['start[day]'].value   = 1;
    f.elements['start[year]'].value  = calconf['selected_year'];

    closeAll()
    setCalClass('addDetails', 'addDetails unhide');
}

function addDetailsClose()
{
    setCalClass('addDetails', 'addDetails hide');
}

function addDetailsSubmit()
{
    addDetailsClose();
    addDetailsThanksOpen();
}

function addDetailsThanksOpen()
{
    var pos = new Array();
        pos['Monday'] = findPos(getCalObj('dataDayName2'));
        pos['week']   = findPos(document.getElementById('week1'));

    var addDetailsThanks = getCalObj('addDetailsThanks')
        addDetailsThanks.style.top  = pos['week'].top    + 45;
        addDetailsThanks.style.left = pos['Monday'].left - 8;

    setCalClass('addDetailsThanks', 'addDetailsThanks unhide');
}

function addDetailsThanksClose()
{
    setCalClass('addDetailsThanks', 'addDetailsThanks hide');
}

function addDetailsThanksAnother()
{
    addDetailsThanksClose();
    addDetailsOpen();
}

function eventDetailsOpen()
{
    closeAll()
    setCalClass('eventDetails', 'eventDetails unhide');
}

function eventDetailsClose()
{
    setCalClass('eventDetails', 'eventDetails hide');
}

function buttonPrintOpen()
{
    alert('printing');
}

function buttonPrintClose()
{

}

///////////////////////////////////////////////////////////////////////////////////////////////////

function day_names(nameLength)
{
   if (calconf)
   {
      calconf['weekdays'] = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
      calconf['weekdays_name_size'] = 10
      //calconf['weekdays_name_size'] = 1

      for(var d = 1; d < 8; d++)
      {
          setCalVal('dataDayName' + d, calconf['weekdays'][d-1].substr(0, calconf['weekdays_name_size']));
      }
      return true
   }
   return false
}

///////////

function clear_calendar(selected_subcategory)
{
   var clear_all = true;
       clear_all = ((calconf.length) && (selected_subcategory == calconf['selected_subcategory'])) ? false : clear_all;

   calconf['events'] = new Array();
   setCalClass('cellMonthNav', 'cellMonthNav hide');   // hide nav buttons

   remove_occurences();
   if (clear_all)
   {
      //remove day_numbers, reset styles...
      for (var week = 1; week < 7; week++)
      {
         for (var day = 1; day < 8; day++)
         {
             if (week == 1)
             {
                 //setCalVal('dataDayName' + d, '&nbsp;');
             }
             setCalVal('dataDayWeek' + week + 'Day' + day, '');
             setCalClass('dataDayWeek' + week + 'Day' + day, "textDay textDayWeek1 textDayWeek1Day4 todayIndicatorOff");
             setCalClass('cellWeek' + week + 'Day' + day, "cellDay cellDayWeek" + week + "Day" + day);
         }
      }
      setCalVal('dataMonthNameYear', '&nbsp; &nbsp;');
   }
   remove_calendar_config(selected_subcategory);
   closeAll(); //popups
   return true;
}

///////////////////////////////////////////////////////////////////////////////////////////////////

function disable_calendar_nav()
{
    setCalClass('cellMonthNavPrev', 'hide');
    setCalClass('cellMonthNavNext', 'hide');
}

function enable_calendar_nav()
{
    setCalClass('cellMonthNavPrev', 'unhide');
    setCalClass('cellMonthNavNext', 'unhide');
}

///////////////////////////////////////////////////////////////////////////////////////////////////

function calstart(selected_month, selected_year, selected_subcategory)
{
    //result of being called by gdata...
    var event = null;
    if (typeof selected_month == 'object')
    {
        event = selected_month
        selected_month = null;
    }

	if (!navigator.userAgent.match('MSIE'))
	{
		// google has an annoying alert box 'Unsupported browser. Continue at your own risk.', which this code filters from occuring
		var original_alert = alert;
		alert = function (msg) {
			if ((typeof msg == 'string') && (msg.match(new RegExp('[uU][nN][sS][uU][pP][pP][oO][rR][tT][eE][dD]'))))
			{
				return;
			}
			else
			{
				return original_alert(msg);
			}
		}
	}

    //if (!selected_month) { selected_month = 'December'; selected_year = 2008; selected_subcategory = 'Subcategory2'; }

    calwait(true);

    var ok = true;
    if (!calconf)
    {
        ok = calinit();
    }   
    if (ok)
    {
        ok = clear_calendar(selected_subcategory);
    }
    if (ok)
    {
        ok = day_names();
    }
    if (ok)
    {
        ok = day_numbers(selected_month, selected_year);
    }
    if (ok)
    {
        loaddata();
    }

    return ok;
}
function calend()
{
    calwait(false);
}
function calinit()
{
   calconf = new Array();

   calconf['pipe'] = new Array();
   calconf['pipe']['config'] = false;
   calconf['pipe']['occurences'] = false;

   calconf['xml'] = new Array();
   calconf['xml']['config'] = false;
   calconf['xml']['occurences'] = false;

   calconf['events'] = new Array();

   calconf['init'] = true;
   return true;
}

function calwait(on)
{
   if (on)
   {
        var pos = new Array();
            pos['Monday'] = findPos(getCalObj('dataDayName2'));
            pos['week']   = findPos(document.getElementById('week1'));
        
        var wait = getCalObj('wait')
            wait.style.top  = pos['week'].top    + 65;
            wait.style.left = pos['Monday'].left + 20;

      caldebug('calwait() - on')
      setCalVal('wait', '<table border="1" cellspacing="4"><tr><td valign="middle" align="center">Loading...</td></tr></table>');
      setCalClass('wait', 'wait');
   }
   else
   {
       caldebug('calwait() - off')
       setCalClass('wait', 'wait waitOff');
   }
}

function caldebug(msg)
{
   // for production: if (false)... + css debug { display: none; ... }
   // for development: if (true)... + css debug { display: block; ... }
   if (true)
   {
      var v = getCalVal('debug')
      var s = (v) ? '<hr/>' : ''
      var t = new Date;
      var p = two_digits(t.getHours())+':'+two_digits(t.getMinutes())+':'+two_digits(t.getSeconds())+'.'+t.getMilliseconds()+': '
      setCalVal('debug', v + s + p + replace_markup(msg));
   }
}

function calerror(code, msg, solution)
{
   if (!solution)
   {
      solution = "Please contact the Time Square Alliance Calendar Administrator and indicate this error message."
   }
   var msg =  "[important]" +
              "~~~ ~~~ ~~~ ~~~" +
              "[newline]" +
              "Calendar Error " + code +
              "[newline]" +
              "~~~ ~~~ ~~~ ~~~" +
              "[newline]" +
              msg + 
              "[newline]" +
              "~~~ ~~~ ~~~ ~~~" +
              "[newline]" +
              solution  +
              "[newline]" +
              "~~~ ~~~ ~~~ ~~~" +
              "[important]"

   setCalVal('eventDetails', replace_markup(msg));
}

///////////////////////////////////////////////////////////////////////////////////////////////////
