﻿

Calendar = function()
    {
        this.dayNames = dayNames;
        this.startDayIdx = startDayIdx;
        this.dayIndex = new Array();
        this.dayIndex2 = new Array();
        this.selection = new Date();
        this.element = null;
        this.date = new Date();
    }
    
Calendar.prototype.ShowCalendar = function(elm)
    {
        cal.element = elm;
        var calElm = document.getElementById("cal");
        
        if (calElm != null)
        {
            if (calElm.style.display == "none" || calElm.style.display == "")
            {
                calElm.style.display = "block";
            }
            
            var existingdate = cal.CheckDate(elm, false);

            cal.date = (existingdate != undefined) ? existingdate : new Date();
            if (elm.id == "txtCal2")
            {
                document.getElementById("txtCal2").className = "lg";
                document.getElementById("txtCal1").className = "wbg";
            }
            else
            {
                document.getElementById("txtCal1").className = "lg";
                document.getElementById("txtCal2").className = "wbg";
                
            }            
            
            cal.GetCalendar(cal.date);
            //fix firefox border
            if (calElm.clientWidth != (document.getElementById("cal1").clientWidth +  document.getElementById("cal2").clientWidth))
            {
                    calElm.width = (document.getElementById("cal1").clientWidth + 
                                   document.getElementById("cal2").clientWidth) + 2;
            }

         }   
    }
    
    Calendar.prototype.GetCalendar = function(date)
    {
            var thisMY, nextMY;
            var cal1 = document.getElementById("cal1body");
            var cal2 = document.getElementById("cal2body");
     
            thisMY = new Date(date);
            nextMY = new Date(thisMY.getFullYear(), thisMY.getMonth()+ 1);   
          
            if (cal1 != null)
                cal1.replaceChild(cal.PopulateCalendar(thisMY, 0, 1), cal1.firstChild);
            
            if (cal2 != null)                
                cal2.replaceChild(cal.PopulateCalendar(nextMY, 1, 2), cal2.firstChild);
    }
    
    Calendar.prototype.GetDays = function()
    {
        var calBuf = [];
        var max = this.dayNames.length;
        var row, cell;
        
        row = document.createElement("tr");
        for (var i = this.startDayIdx, count=0; count < this.dayNames.length; count++)
        {
            cell = document.createElement("td");
            cell.className = "day";
            if(i < this.dayNames.length)
            {
                this.dayIndex[count] = i;
                this.dayIndex2[count] = i;
                cell.innerHTML = this.dayNames[i];
                i++;
            }
            else
            {
               this.dayIndex[count] = max;
               this.dayIndex2[count] = max - this.dayNames.length;
               cell.innerHTML = this.dayNames[max - this.dayNames.length];
               max++;
            }
            row.appendChild(cell);
            
        }
        
        return row;
    }
    
    Calendar.prototype.PopulateCalendar = function(date, isNext, calindex)
    {
            var table = document.createElement("table");
            var body = document.createElement("tbody");
            var calBuf = [];
            var row, cell;
            var anchor;
            var dayCount = 0;
            var dayOfWeek ;
            var daysInMonth = 32 - new Date(date.getFullYear(), date.getMonth(), 32).getDate(); 
            var startDay = new Date(date.getFullYear(), date.getMonth(), 1).getDay();
            
            
            var newdate;
            if (!isNext)
            {
                newdate = new Date(date.getFullYear(), date.getMonth() - 2);
            }
            else
            {
               newdate = new Date(date.getFullYear(), date.getMonth() + 1);
            }  
            
            var yearMonthFormat =  yearMonthPattern.replace(/(yyyy|MMMM|MMM|MM|M|\/p)/gi,
                function($1)
                {
                    switch ($1.toLowerCase())
                    {
                    case 'yyyy': return date.getFullYear();
                    case 'mmmm': return fullMonthNames[date.getMonth()];
                    case 'mmm':  return monthNames[date.getMonth()]
                    case 'mm':  
                            var tempMonth =  date.getMonth() + 1;
                            
                            return (tempMonth < 10) ? "0" + tempMonth: tempMonth;
                    case 'm': return date.getMonth() + 1;
                            
                    }
                }
            );
            
            var arrow = calindex;
            
            if (rtl)
                arrow = (calindex == 1) ? 2 : 1;
            
            
	        var link = document.createElement('a');
	        link.href = "javascript:void(0)";
	        link.innerHTML = '<img src="resources/images/l' + arrow + '.gif" width="4" height="7" border="0">';
	        link.onclick = function(){cal.GetCalendar(newdate);}
            
           var cal_a = document.getElementById("cal" + calindex + "link");
           cal_a.replaceChild(link, cal_a.lastChild);
           link = null;
           
           var cal_ym = document.getElementById("cal" + calindex + "my");
           cal_ym.innerHTML = yearMonthFormat;
            
            table.className = "caltbl";       
            table.appendChild(body); 
            
            
            body.appendChild(cal.GetDays());
           
            
            for (var rows = 0; rows < 6; rows++)
            {
                row = document.createElement("tr");
                body.appendChild(row);
                for (var days = 0; days < 7; days++)
                {
                
                    if (dayCount >= daysInMonth)
                    {
                        cell = document.createElement("td");
                        cell.innerHTML = "&nbsp;"
                    }
                    else
                    {
                       if ( (rows == 0) && 
                            ( (startDay == 0) && ( (this.dayIndex2[days] != startDay) && (dayCount == 0))
                            || ((startDay != 0) && (this.dayIndex[days] < startDay)))
                          )
                       {
                            cell = document.createElement("td");                    
                       }
                       else
                       {
                           dayCount++;
                           
                            cell = document.createElement("td");
                            cell.setAttribute("align", "center");
                            anchor = document.createElement("a");
		                    anchor.href = "javascript:void(0)";
		                    anchor.innerHTML = dayCount;
		                    anchor.calendar = this;
		                    anchor.day = dayCount;
		                    anchor.date = date;
          		            anchor.onclick = cal.DateClick;
                            cell.appendChild(anchor);
                            
                            if (dayCount == cal.date.getDate() && date.getMonth() == cal.date.getMonth()
                               && date.getFullYear() == cal.date.getFullYear()) 
                            {
			                    this.selected_cell = cell;
			                    anchor.style.color = "red";
			                    anchor.style.fontWeight = "bold";
		                    } 
                       }
                    }    
                    
                    row.appendChild(cell);
                }
            }
            
            cell = null;
            row=null;
            body=null;
            return table;
   }
    
    Calendar.prototype.DateClick = function()
    {
        this.calendar.selected_cell.childNodes[0].style.color = "#000";
        this.calendar.selected_cell.childNodes[0].style.fontWeight = "normal";
    	this.calendar.selected_cell = this.parentNode;
	    this.parentNode.childNodes[0].style.color = "red";
	    this.parentNode.childNodes[0].style.fontWeight = "bold";
	    
	    var date = new Date(this.date);
	    var day = this.day
	    
        cal.element.value = cal.GetTextDate(date, day);
        $("error").innerHTML = "";
    }
    
    Calendar.prototype.GetTextDate = function(date, day)
    {
        return shortDatePattern.replace(/(yyyy|yy|MMMM|MMM|MM|M|dd|d|\/p)/gi,
                function($1)
                {
                    switch ($1.toLowerCase())
                    {
                    case 'yy':
                    case 'yyyy': return date.getFullYear();
                    case 'm':
                    case 'mm': 
                    case 'mmm': 
                    case 'mmmm': 
                    return date.getMonth() + 1;
                    case 'dd':
                    case 'd':
                     return day;
                    }
                }
            );
    }
    Calendar.prototype.CheckDate = function(dateControl, showErr)
    {
        var isValid = true;
        
        var date = dateControl.value;
        var formatArr = shortDatePattern.split(separator);
        
        if (date.endsWith(separator))
        {
            date = date.substring(0, date.length-1);
        }
        
        var dateArr = date.split(separator);
        
        var finalDate;
        if (dateArr.length == 3)
        {
            var m_Date = Array(3);
            for (var i=0; i < dateArr.length && isValid; i ++)
            {
                if (isNaN(dateArr[i]))
                {
                    isValid = false;
                    break;
                }
                var formatArrData = formatArr[i].trim();

                if (formatArrData.length > 0)
                {
                    switch(formatArrData.toLowerCase())
                    {
                        case 'mmmm':
                        case 'mmm':
                        case 'mm':
                        case 'm':
                            formatD = "mm";
                            break;
                        case 'dd':
                        case 'd':
                            formatD = "dd";
                            break;
                        case 'yyyy':
                        case 'yyy':
                        case 'yy':
                            formatD = "yyyy";
                            break
                        default:
                            isValid = false;
                            break;
                    }
                    m_Date[formatD] = dateArr[i];
                }
            }
            
           if (isValid)
           {
                var asForm = $("as");
                var checkYear = true;
                if ((asForm != null) && (asForm != undefined) && (asForm.getAttribute("locale").toLowerCase() == "ar-sa"))
                {
                    checkYear = false;
                }
                finalDate    = new Date(m_Date["mm"] + "/" + m_Date["dd"] + "/" + m_Date["yyyy"]);        
                if ( ((finalDate.getMonth()+ 1) != m_Date["mm"]) ||
                     ((finalDate.getFullYear() != m_Date["yyyy"]) && checkYear) ||
                     (finalDate.getDate() != m_Date["dd"]) ||
                     ((finalDate.getFullYear() < SqlMinYear) && checkYear) ||
                     ((finalDate.getFullYear() > SqlMaxYear) && checkYear)
                     )
                {
                
                    isValid = false;
                }
           } 
        }
        else
        {   
            isValid = false;
        }
       if (!isValid)
       {
                return;
       }
       else
       {
            return finalDate;
       }
    }
    
    Calendar.prototype.Close = function()
    {
        var calElem = $("cal");
        
        if (calElem)
        {
            calElem.style.display = "none";
            cal.ResetTextBg();
            cal.ValidateCalendar();
        }
        
        
    }
    
    Calendar.prototype.Today = function()
    {
        cal.date = new Date();
        cal.GetCalendar(cal.date);
        cal.element.value = cal.GetTextDate(cal.date, cal.date.getDate());
        
    }
    
    
    Calendar.prototype.ValidateCalendar = function()
    {
        var startDate = cal.CheckDate(document.asform.txtCal1, true);
        var endDate = cal.CheckDate(document.asform.txtCal2, true);

        $("error").style.display = "block";
        $("error").className = "calErr clear";        
        if (startDate == undefined || endDate == undefined)
        {
            $("error").innerHTML = dateErr1;
            return false;
        }
        else if (new Date(startDate) > new Date(endDate))
        {
           
            $("error").innerHTML = dateErr2;
            return false;
        }
        else
        {
          $("error").style.display = "none"; 
          if ($("cal").style.display == "none")
               cal.ResetTextBg();
           return true;
        }
    }
    
    Calendar.prototype.FocusDate = function()
    {
        if (calInterval == "" || calInterval == undefined)
        {
            calInterval = window.setInterval("cal.FocusCalendar()", 500)
        }    

    }
    
    Calendar.prototype.FocusCalendar = function()
    {
        var existingdate = cal.CheckDate(cal.element, false);
        if (existingdate != undefined)
        {
            cal.date = existingdate
            cal.GetCalendar(cal.date);
        }
    }
    
   
   
    Calendar.prototype.ClearInterval = function()
    {
        window.clearInterval(calInterval);
        calInterval = "";
        cal.ValidateCalendar()
    }
    
    Calendar.prototype.ResetTextBg = function()
    {
        document.getElementById("txtCal2").className = "wbg";
        document.getElementById("txtCal1").className = "wbg";
    }
    
    Calendar.prototype.HookupEvents = function()
    {
        var txtCal1 = $("txtCal1");
        var txtCal2 = $("txtCal2");
        var calImg1 = $("calimg1");
        var calImg2 = $("calimg2");
        var calElem = $("cal")
        
        if (txtCal1 && txtCal2 && calImg1 && calImg2)
        {
            txtCal1.onkeypress = txtCal2.onkeypress = cal.ValidateKeys;
            txtCal1.onkeyup = txtCal2.onkeyup  = cal.FocusDate;
            txtCal1.onblur = txtCal2.onblur  = cal.ClearInterval;
            txtCal1.onclick = txtCal2.onclick = calImg1.onclick = calImg2.onclick = calElem.onclick = function(evt) { evt = evt ? evt : window.event; evt.cancelBubble = true; }
        }
    }
    
    Calendar.prototype.ValidateKeys = function()
    {
        var key = get_eventkey();
        
        if ((key >= '48' && key <= '57') || (key == dateSeparatorCode))
        {
            return;
        }
        else
        {
            event.returnValue = false;
        }
    }
    
    
    Calendar.prototype.AddMonth = function(currDate, monthstodadd)
    {
        return cal.Add(currDate, "m", monthstodadd);
    }
    
    Calendar.prototype.AddDays = function(currDate, daystodadd)
    {
        return cal.Add(currDate, "d", daystodadd);
    }
    
    Calendar.prototype.Add = function(currDate, action, number)
    {
    
        var formatArr = shortDatePattern.split(separator);
        var dateArr = currDate.split(separator);
        
        if (currDate.endsWith(separator))
        {
            currDate = currDate.substring(0, currDate.length-1);
        }

        var dateArr = currDate.split(separator);
        
        var finalDate;
        var isValid = true;
        if (dateArr.length == 3)
        {
            var m_Date = Array(3);
            for (var i=0; i < dateArr.length && isValid; i ++)
            {
                if (isNaN(dateArr[i]))
                {
                    isValid = false;
                    break;
                }
                var formatArrData = formatArr[i].trim();

                if (formatArrData.length > 0)
                {
                    switch(formatArrData.toLowerCase())
                    {
                        case 'mmmm':
                        case 'mmm':
                        case 'mm':
                        case 'm':
                            formatD = "mm";
                            break;
                        case 'dd':
                        case 'd':
                            formatD = "dd";
                            break;
                        case 'yyyy':
                        case 'yyy':
                        case 'yy':
                            formatD = "yyyy";
                            break
                        default:
                            isValid = false;
                            break;
                    }
                    m_Date[formatD] = dateArr[i];
                }
            }
            
            if (isValid)
            {
                var newDate;
                if (action == "m")
                {
                finalDate    = new Date(m_Date["mm"] + "/01 /" + m_Date["yyyy"]);  
                newDate = new Date(finalDate.getFullYear(), finalDate.getMonth() + number, m_Date["dd"]);
                }
                else
                {
                  finalDate    = new Date(m_Date["mm"] + "/" + m_Date["dd"] + "/" + m_Date["yyyy"]);  
                  newDate = new Date(finalDate.getFullYear(), finalDate.getMonth(), parseInt(m_Date["dd"]) + number);
                }
                
                return(this.GetTextDate(newDate, newDate.getDate()));
            }
          }
    }
    var calbox;
    Calendar.prototype.KeepCalOpen = function()
    {
        var calMain = $("scalmain"); 
    
        if (calMain != null)
        {
            calMain.style.display = "block";
            if (calbox)
                window.clearTimeout(calbox);
        }
    }
    
    Calendar.prototype.HideDWM = function(e)
    {
        var calMain = $("scalmain"); 
        if (!calMain) return;
        
        var outer = this;
    
         var interval = function()
         {
              calMain.style.display = "none";
         }
        
        if (calbox)
        window.clearTimeout(calbox);
        
        calbox = window.setTimeout(interval, 500);
    }
    
   Calendar.prototype.ShowDWM = function(e, xml)
   {
    var calMain = $("scalmain"); 
    var singleCal = $("scaldiv");
    var navcal = $("calnav");
    
    e.cancelBubble = true; 
    if (calMain && singleCal)
    {
        if (calbox)
            window.clearTimeout(calbox);
            
        var xmldoc;
        var top = findPosY(navcal) + navcal.offsetHeight;  
        var left = findPosX(navcal) + 14;
        
        calMain.style.position = "absolute";
        
        var calDiv = $("dynSearchDiv");
        if (calDiv)
        {
            var dir = calDiv.getAttribute("direction");
            if (dir && dir.toLowerCase() == "rtl")
            {
                calMain.style.right = 200;  
                calMain.style.top = top - 8 + "px";    
            }
            else
            {
                calMain.style.left = left;  
                calMain.style.top = top + "px";    
            }
        }
         
        calMain.style.display = "block";
        if( document.implementation.hasFeature("XPath", "3.0") ) // in case of Gecko/Mozillas family
        {
            xmldoc=loadXmlDocumentFromText(xml);
        }         
        else
        {
          var xmldoc = create_document(false);
          xmldoc.loadXML(xml);
        }
        transformXsl("xsl/MiniCal.xsl",false,singleCal,xmldoc,document);
     }
   }
    
   Calendar.prototype.ShowMonth = function(e, callback, log, sender, month)
   {
     if (monthNames)
     {
        var xml = "<root calview='0'>";
        for (var i=0; i < monthNames.length;i++)
        {
            xml += '<month name="' + monthNames[i] + '" '
            xml += (month-1 == i) ? 'selected="true"' : ''
            xml += ' />';
        }
        xml += "</root>";
        cal.ShowDWM(e, xml);
     }
   }
   
   Calendar.prototype.DWMClick = function(e, callback, log, sender,view, day,month,year)
   {

        e.cancelBubble = true;
        var calMain = $("scalmain"); 
        if (calMain)
            calMain.style.display = "none";
   	     var txtCal1 = $("txtCal1"), newStartDate;
 	     var startDate = cal.CheckDate(txtCal1, false);
 	     
 	     if (year == null || year == undefined)
 	        year = startDate.getFullYear();
 	     if (month == null || month == undefined)
 	        month = startDate.getMonth()+1;
 	     if (day == null || day == undefined)
 	        day = startDate.getDate();
 	        
 	      newStartDate = new Date(year, month-1, day);
 	     txtCal1.value = cal.GetTextDate(newStartDate, newStartDate.getDate())
 	     new Search().gather.invoke(this.event,'afterSearch',this, null, null, null, null, null, null, null, null, null, null, 'true',null,view)
 
   }
   
  
   Calendar.prototype.SetCurrentMonthStyle = function(elem)
   {
        if (elem)
	     elem.className = "selected";
   }
   
   Calendar.prototype.SetToday = function(date)
   {
     var txtCal1 = $("txtCal1");
     if (txtCal1)
     {
        txtCal1.value = date;
        new Search().gather.invoke(this.event,'afterSearch',this, null, null, null, null, null, null, null, null, null, null, 'true',null,'2')
     }
   }
   
   Calendar.prototype.ShowDailyWeekly = function(e, callback, log, sender, view, currdate, daysInMonth,startDay,sod,today, year, num, weeksod, previousstart)
   {
        if (view && daysInMonth && startDay && year && num && today)
        {
            var txtCal1 = $("txtCal1"), sday, xml;
         
            if (txtCal1)
            {
                var startdate = cal.CheckDate(txtCal1, false);
                if (startdate)
                    sday = startdate.getDate();
            }
                
            xml = "<root calview='" + view + "'>";
            xml += '<month start="' + startDay + '" ';
            xml += 'days="' + daysInMonth + '" ';
            xml += 'today="' + today + '" ';
            xml += 'year="' + year + '" ';
            xml += 'num="' + num + '" ';
            if (sday)
                xml += 'sday="' + sday + '" ';
            if (weeksod)
            xml += 'sod="' + weeksod + '" '; 
            
            if (previousstart)
             xml += 'pmstart="' + previousstart + '" '; 
              
            xml += ' />';
            
            
            if (dayNames && !isNaN(sod))
            {
                xml += "<day>";
                var nameLength = dayNames.length, counter=0;
                for (var i=sod; i< (nameLength + sod); i++)
                {
                    counter++;
                    if (i >= nameLength)
                        dayIndex = i - nameLength;
                    else
                        dayIndex = i;
                        
                    xml += '<item name="' + dayNames[dayIndex] + '"  num="' + counter + '" />';
                }
                xml += "</day>";
            }
           xml += "</root>";
         
           cal.ShowDWM(e, xml);
       }
    
   }
   
   Calendar.prototype.ClearMDW = function(mdwCount, tempmdw)
   {
        for(var i=0; i<=mdwCount; i++)
        {
            mdw =  ($(tempmdw+i));

            if (mdw)
            {
               if (mdw.className != "selected")
                mdw.className = "default";
            }
        }
   }
   
   Calendar.prototype.WeekClick = function(e, callback, log, sender)
   {
        if (sender)
        {
            var lnk = sender.getElementsByTagName('A');
            if (lnk && lnk.length >= 0)
            {
                cal.DWMClick(e, callback, log, sender, 1, lnk[0].innerHTML);
            }
        }
   }
   
   Calendar.prototype.MDWWeek = function(e, sender, dr, view)
   {
        if (sender && sender.className != "selected")
        {
            cal.ClearMDW(dr, view);
            sender.className = "weekmo";
        }
        sender.style.cursor = "pointer";
   }
   
   Calendar.prototype.MoreDayTimeClick = function(e, callback, log, sender, hour, startposition)
   {
        var evtTbl = GetParentTable(sender.parentNode);
        if (!evtTbl) return;
        var childNodes = evtTbl.getElementsByTagName("TR");
        if (!childNodes) return;
        for (var i=0; i < childNodes.length; i++)
        {
            var thisNode = childNodes[i];
            if (!thisNode) continue;
            var row = thisNode.getAttribute("pos");
            if (!row) continue;
            if (thisNode.style.display == "none")
            {
                thisNode.style.display =  "block";
                sender.innerHTML = "&lt;&lt;";
            }
            else
            {
                thisNode.style.display =  "none";
                sender.innerHTML = "&gt;&gt;";
            }
        }
   }
   
   function GetParentTable(elem)
   {
        if (elem != null)
        {
            if (elem.tagName == "TABLE")
                return elem;
            else
            {
                return GetParentTable(elem.parentNode);
            }
        }
        return null;
   }
   
    var calInterval = "";
