/*

big_calendar.js

The Big Calendar Object
written by David Bryant

Project started April 9, 2002

*/

activate = true;
calendar_force_position = true;
coords = new Array(0,0);

function get_browser(){
    if(document.layers){
    return "NS4";
  }
  if(document.all && !document.getElementById){
    return "IE4";
  }
  if(document.all && document.getElementById){
    return "IE5";
  }
  if(!document.all && document.getElementById){
    return "NS6";
  }
  else {
    return "unknown";
  }
}

function grab_xy(ev){
    // don't grab the current XY coordinates
    // if the user has explicitly set them
    if (calendar_force_position)
        return;

    if(activate){
    var br = get_browser();
    var xy = new Array(0,0);
    if(br == "NS4" || br == "NS6") {
        xy[0] = ev.pageX;
      xy[1] = ev.pageY;
    }
    else{
        ev = window.event;
        //alert(ev);
        xy[0] = ev.x;
      xy[1] = ev.y;
    }
    coords = xy;
  }
}

function motionListener()
{
    var br = get_browser();
    if(br == "NS4" || br == "NS6")
    {
        window.captureEvents(Event.MOUSEUP);
        window.onmouseup = grab_xy;
    }
    else
    {
        document.onmouseup = grab_xy;
    }
}

function calendar(date_str, ref)
{
    this.name = 'calendar' + (calendar.count++);
    this.obj = this.name + 'Object';
    eval(this.obj + " = this");
    this.ref = ref;

    this.browser = get_browser();

    switch (this.browser)
    {
        case "NS4":
            this.elm = "document.layers[\"calendar\"]";
            break;
        case "IE4":
            this.elm = "document.all[\"calendar\"]";
            break;
        case "IE5":
            this.elm = "document.getElementById(\"calendar\")";
            break;
        case "NS6":
            this.elm = "document.getElementById(\"calendar\")";
            break;
        default:
            this.elm = this.browser;
    }

    // housekeeping values:
    this.month_array   = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
    this.month_length  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    this.weekday_array = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
    this.date_array    = new Array();
    this.one_day       = (1000 * 60 * 60 * 24);
    this.leapyear      = false;

    calendar_set_size (20);

    this.font                    = "arial";
    this.fontsize                = 8;
    this.fontcolor               = "#000000";
    this.bgcolor                 = "#6666CC";
    this.not_our_month_bgcolor   = "#FFCC66";
    this.not_our_month_fgcolor   = "#FFCC66";
    this.head_cell_bgcolor       = "#DBAE17";
    this.head_cell_fgcolor       = "#155C5E";
    this.day_cell_bgcolor        = "#FFCC66";
    this.day_cell_fgcolor        = "#C45216";
    this.bordercolor             = "#FFCC66";

    this.viz       = false;

    this.caldate = date_str ? new Date(date_str) : new Date();
    this.caldate.setHours(12);
    this.caldate.setMinutes(0);
    this.timestamp = this.caldate.getTime();

    this.todaydate = new Date();
    this.today_timestamp = this.todaydate.getTime();
    this.caltoday = this.caldate.getDate();

    calendar_force_position = true;

    // calendar object methods:
    this.build            = calendar_build;
    this.set_format       = calendar_set_format;
    this.link_handler     = calendar_link_handler;
    this.set_link_handler = calendar_set_link_handler;
    this.set_size         = calendar_set_size;
    this.show_cal         = calendar_show;
    this.hide_cal         = calendar_hide;
    this.css              = calendar_css;
    this.div              = calendar_div;
    this.write_content    = calendar_write_content;
    this.change           = calendar_change;
    this.set_position     = calendar_set_position;

    this.build();
}

calendar.count = 0;

function calendar_build()
{
    this.year       = this.caldate.getFullYear();
    this.month      = this.caldate.getMonth();
    this.month_name = this.month_array[this.month];
    this.day        = this.caldate.getDate();

    this.weekday      = this.caldate.getDay();
    this.weekday_name = this.weekday_array[this.weekday];
    this.last_month   = (this.month - 1) > -1 ? (this.month - 1) : 11;
    this.last_year_rollover = this.last_month == 11 ? true : false;
    this.next_month   = (this.month + 1) < 13 ? (this.month + 1) : 0;
    this.next_year_rollover = this.next_month == 0 ? true : false;

    this.tempdate = new Date(this.timestamp);
    this.tempdate.setDate(1);
    this.first_weekday = this.tempdate.getDay();

    this.tempdate.setTime(this.tempdate.getTime() - (this.one_day * this.first_weekday));
    this.first_timestamp = this.tempdate.getTime();

    this.tempdate.setTime(this.timestamp);
    this.tempdate.setDate(1);
    this.tempdate.setMonth(1);
    this.tempdate.setDate(29);
    if(this.tempdate.getMonth() == 1)
    {
        this.leapyear = true;
        this.month_length[1] = 29;
    }
    this.tempdate.setTime(this.timestamp);

    this.cutoff = this.first_weekday + this.month_length[this.month];
    if(this.cutoff > 28)
    {
        if(this.cutoff > 35)
        {
            this.cutoff = 42;
        }
        else
        {
            this.cutoff = 35;
        }
    }
    else
    {
        this.cutoff = 28;
    }
    this.rows = this.cutoff / 7;
    this.height = (this.rows + 3) * this.cellheight;

    this.tempdate.setTime(this.first_timestamp);
    var new_stamp = this.first_timestamp;
    for(var i=0;i<this.cutoff;i++)
    {
        this.tempdate.setTime(new_stamp);
        this.date_array[i] = this.tempdate.getTime(); // + (i * this.one_day);
        new_stamp += this.one_day;
    }
}

function calendar_set_format(month_length,weekday_length,font,fontsize,fontcolor,bgcolor)
{
    if(month_length && month_length > 0)
    {
        for(var i=0;i<12;i++)
        {
            this.month_array[i] = this.month_array[i].substr(0,month_length);
            this.month_name = this.month_array[this.month];
        }
    }
    if(weekday_length && weekday_length > 0)
    {
        for(var i=0;i<7;i++)
        {
            this.weekday_array[i] = this.weekday_array[i].substr(0,weekday_length);
            this.weekday_name = this.weekday_array[this.weekday];
        }
    }
    if(font)
    {
        this.font = font;
    }
    if(fontsize)
    {
        this.fontsize = fontsize;
    }
    if(fontcolor)
    {
        this.fontcolor = fontcolor;
    }
    if(bgcolor)
    {
        this.bgcolor = bgcolor;
    }
}

function calendar_link_handler(stub_1, stub_2)
{
    return "<a href=\"#" + stub_1 + "\">" + stub_2 + "</a>" ;
}

/*
This function is not strictly necessary, since a simple

function foo()
{
    blah de blah-blah;
}

foobar = new Calendar();
foobar.link_handler = foo;

would work.  However, it's not good OOP practice, so I've
created an explicit interface to redefine the function.
*/

function calendar_set_link_handler(function_name)
{
    this.link_handler = function_name;
}

function calendar_set_position (x, y)
{
    calendar_force_position = true;
    coords[0] = x;
    coords[1] = y;
}

function calendar_set_size(cellsize)
{
    calendar_set_size (cellsize, cellsize);
}

function calendar_set_size (height, width)
{
    this.cellheight = height;
    this.cellwidth  = width;
    this.height     = (this.rows + 2) * this.cellheight;
    this.width      = this.cellwidth * 7;
}

function calendar_show()
{
    if(this.viz == false)
    {
        this.elm.innerHTML = this.write_content();
        this.elm.style.left = coords[0] + "px";
        this.elm.style.top = coords[1] + "px";
        this.elm.style.visibility = "visible";
        this.viz = true;
        toggleCombos('hidden');
    }
    else
    {
        this.hide_cal();
        this.viz = false;
        toggleCombos('visible');
    }
}

function calendar_hide()
{
    this.elm.style.visibility = "hidden";
    this.elm.style.left = 0;
    this.elm.style.top = 0;
}

function calendar_css()
{
    var css_str = "<style type=\"text/css\">\n";
    css_str += "\t#calendar {"
    //css_str += "position:absolute;left:0px;top:0px;";
    css_str += "margin:0px;"
    css_str += "width:" + this.width + "px;";
    css_str += "height:auto;";
    css_str += "font-family:" + this.font + ";";
    css_str += "font-size:" + this.fontsize + "pt;";
    css_str += "color:" + this.fontcolor + ";";
    css_str += "background-color:" + this.bgcolor + ";";
    css_str += "text-align:center;";
    css_str += "visibility:hidden;";
    css_str += "}\n";

    css_str += "\t.cal_headcell, .cal_headcell a {";
    css_str += "font-family:" + this.font + ";";
    css_str += "font-size:" + this.fontsize + "pt;";
    css_str += "font-weight: bold;";
    css_str += "color:" + this.head_cell_fgcolor + ";";
    css_str += "background-color:" + this.head_cell_bgcolor + ";";
    css_str += "text-align: center;";
    css_str += "text-decoration: none;";
    css_str += "visibility:inherit;";
    css_str += "}\n";

    css_str += "\t.cal_daycell, .cal_daycell a {";
    css_str += "font-family:" + this.font + ";";
    css_str += "font-size:" + this.fontsize + "pt;";
    css_str += "font-weight: normal;";
    css_str += "color:" + this.day_cell_fgcolor + ";";
    css_str += "background-color:" + this.day_cell_bgcolor + ";";
    css_str += "text-align: center;";
    css_str += "text-decoration: none;";
    css_str += "visibility:inherit;";
    css_str += "}\n";

    css_str += "\t.cal_daycell a:hover {";
    css_str += "font-family:" + this.font + ";";
    css_str += "font-size:" + this.fontsize + "pt;";
    css_str += "font-weight: bold;";
    css_str += "color:" + this.head_cell_fgcolor + ";";
    css_str += "background-color:" + this.day_cell_bgcolor + ";";
    css_str += "text-align: center;";
    css_str += "text-decoration: none;";
    css_str += "visibility:inherit;";
    css_str += "}\n";

    css_str += "\t.cal_not_our_month, .cal_not_our_month a {";
    css_str += "font-family:" + this.font + ";";
    css_str += "font-size:" + this.fontsize + "pt;";
    css_str += "background-color:" + this.not_our_month_bgcolor + ";";
    css_str += "color:" + this.not_our_month_fgcolor + ";";
    css_str += "text-align:center;";
    css_str += "text-decoration:none;";
    css_str += "visibility:inherit;";
    css_str += "}\n";
/*
    css_str += "\t.cal_table {";
    css_str += "\tborder-top-color:    " + this.bordercolor + ";";
    css_str += "\tborder-left-color:   " + this.bordercolor + ";";
    css_str += "\tborder-right-color:  " + this.bordercolor + ";";
    css_str += "\tborder-bottom-color: " + this.bordercolor + ";";
*/
    // css_str += "\tbackground-color:    " + this.bordercolor + ";";
/*
    css_str += "\tbackground-color:#6666CC;";
    css_str += "\tborder-width:1px;";
    css_str += "\tborder-style: solid;";
    css_str += "}\n";
*/
    // css_str += "";
    css_str += "</style>\n";
    document.write(css_str);
}

function calendar_div()
{
    var div_str = "<div id=\"calendar\" z-index=\"20\">\n";
    div_str += "</div>\n";

    document.write(div_str);

  this.elm = eval(this.elm);
  motionListener();

//  this.elm.innerHTML = this.write_content();
}

function calendar_change(tstamp)
{
    // store original values
    var o_caldate = this.caldate;
    var o_timestamp = this.timestamp;

    this.caldate = new Date(tstamp);
    this.caldate.setHours(12);
    this.caldate.setMinutes(0);
    this.timestamp = this.caldate.getTime();

    this.build();
    this.elm.style.height = this.height + "px";
    this.elm.innerHTML = this.write_content();

    // cleanup:
    this.caldate = o_caldate;
    this.timestamp = o_timestamp;
    this.build();
}

function calendar_write_content()
{
    // var content_str = "<table class=\"cal_table\" border=3 cellpadding=0 cellspacing=0 width=" + this.width + " height=" + this.height + ">\n";
    var content_str = "<table class=cal_table border=0 cellpadding=0 cellspacing=0 width=" + this.width + " height=" + this.height + ">\n";

    //content_str += "\t<tr><td><table border=0 cellspacing=0 cellpadding=0>";
    content_str += "\t<tr>\n\t\t<td class=cal_headcell colspan=7 width=" + (this.cellwidth * 7) + " height=" + this.cellheight + ">";

    content_str += "<table border=0 cellpadding=0 cellspacing=0>\n\t<tr>\n";
    
		content_str += "\t\t<td class=cal_headcell width=" + this.cellwidth + " height=" + this.cellheight + ">\n";

    this.tempdate.setTime(this.timestamp);
    this.tempdate.setDate(1);
    if(this.last_year_rollover){
    	this.tempdate.setYear(this.year - 1);
    }
    this.tempdate.setMonth(this.last_month);

    content_str += this.link_handler(this.tempdate.getTime(),"&lt;");
    content_str += "</td>\n\t\t<td class=cal_headcell width=" + (this.cellwidth * 5) + " height=" + this.cellheight + "><b>";
    content_str += this.month_name + " " + this.year;
    content_str += "</b></td>\n\t\t<td class=cal_headcell width=" + this.cellwidth + ">";

    this.tempdate.setTime(this.timestamp);
    this.tempdate.setDate(1);
    this.tempdate.setMonth(this.next_month);

    //content_str += "<a href=\"javascript:" + this.ref + ".change(" + this.tempdate.getTime() + ")\">&gt;&gt;</a>";
    content_str += this.link_handler(this.tempdate.getTime(),"&gt;");
    content_str += "</td>\n\t</tr>\n";
    
    content_str += "</table>\n</td>\n";

    // dewayne
    /*
    content_str += "</table>\n";
    content_str += "</td></tr></table>\n";
    content_str += "<table width=" + this.width + " cellspacing=\"1\" cellpadding=\"2\" border=\"0\">\n";
		*/
    
    content_str += "\t<tr>\n";
    for(var i=0;i<7;i++)
    {
        content_str += "\t\t<td class=\"cal_headcell\" width=" + this.cellwidth + ">" + this.weekday_array[i] + "</td>\n";
    }
    content_str += "\t</tr>\n";

    var idx = 0;
    for(var i=0;i<this.rows;i++)
    {
        content_str += "\t<tr>\n";
        for(var j=0;j<7;j++)
        {
            this.tempdate.setTime(this.date_array[idx]);
            if(this.tempdate.getMonth() != this.month){
            	var td_class = "cal_not_our_month";
            }
            else {
            	if(this.tempdate.getDate() == this.caltoday){
               	var td_class = "cal_headcell";
               }
               else {
               	var td_class = "cal_daycell";
               }
            }
            //var td_class = (this.tempdate.getMonth() != this.month) ? "cal_not_our_month" : "cal_daycell";
            content_str += "\t\t<td class=\"" + td_class + "\" width=" + this.cellwidth + ">";
            content_str += this.link_handler(this.date_array[idx],this.tempdate.getDate());
            content_str += "</td>\n";
            idx++;
        }
        content_str += "\t</tr>\n";
    }

  content_str += "\t<tr>\n";
/*
  content_str += "\t\t<td colspan=7 class=\"cal_headcell\">";
  content_str += "<a href=\"javascript:" + this.ref + ".change(" + this.today_timestamp + ")\">Today</a>";
  content_str += "</td>\n";
  content_str += "\t</tr>\n";
*/
  content_str += "</table>\n";

  return content_str;
}


function toggleCombos(showHow)
{
    var i; var j;
    var cboX; var cboY;

    var scX = coords[0];
    var scY = coords[1];

    for (i=0;i<document.forms.length;i++)
    {
       for (j=0;j<document.forms[i].elements.length;j++)
       {
           if (document.forms[i].elements[j].tagName == "SELECT")
           {
               cboX = getOffsetLeft(document.forms[i].elements[j]);
               cboY = getOffsetTop(document.forms[i].elements[j]);
               if ( ((cboX>=scX-15) && (cboX<=scX+200)) && ((cboY>=scY-15) && (cboY<=scY+145)) )
                   document.forms[i].elements[j].style.visibility=showHow;

               //Check for right hand side overlapping.
               cboX = cboX + parseInt(document.forms[i].elements[j].style.width);
               cboY=cboY+15;//cbo height (default)
               if ( ((cboX>=scX+15) && (cboX<=scX+200)) && ((cboY>=scY-15) && (cboY<=scY+145)) )
                   document.forms[i].elements[j].style.visibility=showHow;
            }
        }
    }
}


function getOffsetLeft (el)
{
    var ol = el.offsetLeft;
    while ((el = el.offsetParent) != null)
        ol += el.offsetLeft;
    return ol;
}


function getOffsetTop (el)
{
    var ot = el.offsetTop;
    while((el = el.offsetParent) != null)
        ot += el.offsetTop;
    return ot;
}
