// JavaScript Document
// JQuery must be present

var TicketsCalendar = (function() {
		//Private Members
		var _cd = new Calendar();
		//Div to hold calendar
		var _calendar = document.createElement("div");
			_calendar.className = "calendarHolder";
			_calendar.style.display = "none";
		//Displays calendar
		var _Show = function(adv) {
			var startDtObj = null;
			var endDtObj = null;
			var inputDtObj = null;
			var selDtObj = null;			
			//If Gamefeed is provider			
			if(_self.Gamefeed != null) {				
				//Sort it by date
				if(_self.Gamefeed.length) {
					try {
						_self.Gamefeed.sort(function(a, b) {
							var out = 0;							
							var tA = a.game_date;
							var tB = b.game_date;
							var tAr = tA.split("/");
							var tBr = tB.split("/");
							var numA = parseInt(tAr[2] + tAr[0] + tAr[1]);
							var numB = parseInt(tBr[2] + tBr[0] + tBr[1]);
							if(numA < numB){out=-1;}else if(numB<numA){out=1;}
							return out;
						});						
					} catch(e) {}
				}
			}
			
			var dtObj = new Date();
			if(_self.InputObject != null) {
				try {
					var dtStr = _self.InputObject.value;
					_self.SelectedDate = (!isEmpty(dtStr))?dtStr:_self.SelectedDate;
					inputDtObj = (isEmpty(dtStr))?null:dtObj.parseShortDate(dtStr); //Custom function
					if(!isNaN(inputDtObj)) {
						if(!adv) {
							_cd.setCurrentDate(inputDtObj.getFullYear(), inputDtObj.getMonth()+1, inputDtObj.getDate());
						}
					} else {
						inputDtObj = null;
					}
				} catch(e) {
					inputDtObj = null;
				}				
			}
			if(_self.SelectedDate != null) {
				selDtObj = dtObj.parseShortDate(_self.SelectedDate);
				selDtObj = isNaN(selDtObj)?null:selDtObj;
				if(!adv && selDtObj) {
					_cd.setCurrentDate(selDtObj.getFullYear(), selDtObj.getMonth()+1, selDtObj.getDate());
				}
			}
			if(_self.StartDate != null) {
				startDtObj = dtObj.parseShortDate(_self.StartDate);
				startDtObj = isNaN(startDtObj)?null:startDtObj;
			}
			if(_self.EndDate != null) {
				endDtObj = dtObj.parseShortDate(_self.EndDate); 
				endDtObj = isNaN(endDtObj)?null:endDtObj;
			}
			_drawCalendar(selDtObj, startDtObj, endDtObj);			
			$(_calendar).fadeIn();
		}
		//Renders Calendar Controls
		var _drawCalendarStructure = function(hasClose) {
			//Create a calendar box w/nav controls			
			var calStruc = (_self.ShowControls)?new SimpleTable(1, 4):new SimpleTable(1, 2);
			if(_self.ShowControls) {
				calStruc.width = "100%"
				calStruc.border = 0;
				calStruc.spacing = 1;
				calStruc.padding = 0;
				
				var hdrBar = new SimpleTable(2, 1);
				var yrSelector = new SimpleTable(3, 1);
				var moSelector = new SimpleTable(3, 1);
				
				//Header
				var tdy = hdrBar.Cell(0, 0);
				tdy.value = new SimpleLink("javascript: TicketsCalendar.GotoToday()", "Today").toHTML();
				tdy.setAttribute("class", "calendarToolbar");
				
				var cls = hdrBar.Cell(1, 0);
				if(hasClose) {
					cls.value = new SimpleLink("javascript: TicketsCalendar.Hide()", "X").toHTML();
				} else {
					cls.value = "&nbsp;"
				}
				cls.setAttribute("class", "calendarToolbar");
				
				//year Nav
				var pYr = yrSelector.Cell(0, 0);
				pYr.value = new SimpleLink("javascript: TicketsCalendar.GotoPrevYear()", "&laquo;").toHTML();
				pYr.setAttribute("class", "calendarNav");
				
				var cYr = yrSelector.Cell(1, 0);
				cYr.setAttribute("id", "fldYear");
				cYr.value = _cd.Year;
				cYr.setAttribute("class", "curPos");
				
				var nYr = yrSelector.Cell(2, 0);
				nYr.value = new SimpleLink("javascript: TicketsCalendar.GotoNextYear()", "&raquo;").toHTML();
				nYr.setAttribute("class", "calendarNav");		
				
				//Month Nav
				var pMo = moSelector.Cell(0, 0);
				pMo.value = new SimpleLink("javascript: TicketsCalendar.GotoPrevMonth()", "&laquo;").toHTML();
				pMo.setAttribute("class", "calendarNav");
				
				var cM = moSelector.Cell(1, 0);
				cM.setAttribute("id", "fldMonth");
				cM.value = _cd.getMonthName(_cd.Month);
				cM.setAttribute("class", "curPos");
				
				var nMo = moSelector.Cell(2, 0)
				nMo.value = new SimpleLink("javascript: TicketsCalendar.GotoNextMonth()", "&raquo;").toHTML();
				nMo.setAttribute("class", "calendarNav");
						
				calStruc.Cell(0, 0).value = hdrBar.toHTML();
				calStruc.Cell(0, 1).value = yrSelector.toHTML();
				calStruc.Cell(0, 2).value = moSelector.toHTML();		
				calStruc.Cell(0, 3).setAttribute("id", "divCalendar");
			} else {
				var hdr = calStruc.Cell(0, 0);
				hdr.setAttribute("class", "calendarMonthYear");
				hdr.value = _cd.getMonthName(_cd.Month) + " " + _cd.Year;
				calStruc.Cell(0, 1).setAttribute("id", "divCalendar");
			}
			//Render Nav Controls
			_calendar.innerHTML = calStruc.toHTML();
		}//Render Calendar itself
		//Renders an active/inactive day
		var _renderCalendarDay = function(cell, dd, mm, yy, start, end) {
			var flg = true;
			if(start) {
				var tempDt = new Date(yy, mm-1, dd);
				if(tempDt < start) {					
					flg = false;
					cell.inactive = true;
					cell.setAttribute("class", "calendarDayDisabled");
				}
			}
			if(end) {
				var tempDt = new Date(yy, mm-1, dd);
				if(tempDt > end) {					
					flg = false;
					cell.inactive = true;
					cell.setAttribute("class", "calendarDayDisabled");
				}
			}
			//Render Game events
			if(_self.Gamefeed) {
				var out = dd;
				var userDate = new Date();
				var tempDt = new Date(yy, mm-1, dd);
				var diff = new DateDiff(tempDt, userDate);
				var games = _GetGames(_self.Gamefeed, tempDt.toShortDate());
				if(games.length > 0) {
					var loc = Location(location);
					var lang = loc.getParam("lang");
					var linkHref = "";
					var g = games.length-1;
					var cGame;
					do {
						cGame = games[g]
						out += "<div class=\"calendarGame\">";
			
						// *****************************************						
						// CHANGE TICKET CALENDAR DISPLAY DAYS HERE
						//
						// set the days out that tickets become unavailable - updated by Russ Jun 5th,09 from 7 to 10
						//
						//
						// *****************************************						
						if(cGame.status == "AVAILABLE" && diff.TotalDays() >= 10) {
							linkHref = "tickets_selection.jsp" + loc.buildSearch({pid:cGame.id,oid:_self.TeamID,"lang":lang});
							out += "<a href=\""+linkHref+"\">vs. " + cGame.away_team.replace(/_/g, " ") + " - " + cGame.game_time + "</a>"
						} else {
							out += "vs. " + cGame.away_team.replace(/_/g, " ") + " - " + cGame.game_time
						}
						out+="</div>";
					} while(g--);					
				}
				cell.value = out;
			} else {
				cell.value = dd;
			}
			if(flg) {
				cell.setAttribute("dd", dd);
				cell.setAttribute("mm", mm);
				cell.setAttribute("yy", yy);
			}
		}
		//Renders Monthly Grid
		var _drawCalendar = function(selectedDay, start, end) {
			//Intialize callendar position
			_cd.setCurrentDate(_cd.Year, _cd.Month, 1);
			//Current month		
			var thisMonth = parseInt(_cd.Month);
			var thisYear = parseInt(_cd.Year);
			var dt = new Date();
			var curDay = dt.getDate();
			var curMonth = dt.getMonth()+1;
			var curYear = dt.getFullYear();
				
			var mField = $("#fldMonth");
				mField.html(_cd.getMonthName(_cd.Month));
			var yField = $("#fldYear");
				yField.html(_cd.Year);
									
				//Calendar weeks
				var maxDays = _cd.getMaxDays(_cd.Month-1, _cd.Year);			
				var firstDOW = parseInt(_cd.firstDayOfWeek(_cd.Month, _cd.Year));
				var weeks = Math.ceil((maxDays+(firstDOW-7))/7);
							
				var grd = new SimpleTable(7, weeks+2);
				grd.width = "100%";
				grd.spacing = 1;
				
				var i = 0;
				var cCell;
				var dNames = ["S", "M", "T", "W", "T", "F", "S"];
				do {
					cCell = grd.Cell(i, 0);
					cCell.value = "<div class=\"calendarHeader\">" + dNames[i] + "</div>";
				} while(i++ < 6);
				
				var w = 0;
				var week = new Array(7);
				var d = 0;
				var cDay;
				//loop weeks
				do {
					//loop dow's
					do {					
						//First week may have less days
						cDay = grd.Cell(d, w+1);
						cDay.setAttribute("class", "calendarDay");					
						switch(true) {
							case (w==0):
								if(d < firstDOW) {
									cDay.value = "&nbsp;"									
									cDay.setAttribute("class", "calendarInactiveDay");
								} else {
									_renderCalendarDay(cDay, _cd.Date, thisMonth, thisYear, start, end);									
								}						
								if(d >= firstDOW) {
									_cd.advanceDays(1);
								}							
								break;
							case (w == weeks):
								if(parseInt(_cd.Year) == thisYear) {
									if(parseInt(_cd.Month) > thisMonth) {
										cDay.value = "&nbsp;"
										cDay.setAttribute("class", "calendarInactiveDay");
									} else {										
										_renderCalendarDay(cDay, _cd.Date, thisMonth, thisYear, start, end);
									}						
								} else {
									cDay.value = "&nbsp;";
									cDay.setAttribute("class", "calendarInactiveDay");
								}
								if(thisMonth == parseInt(_cd.Month)) {
									_cd.advanceDays(1);
								}
								break;
							default:
								if(parseInt(_cd.Year) == thisYear) {
									if(parseInt(_cd.Month) > thisMonth) {
										cDay.value = "&nbsp;"
										cDay.setAttribute("class", "calendarInactiveDay");
									} else {
										_renderCalendarDay(cDay, _cd.Date, thisMonth, thisYear, start, end);
									}
								} else {
									cDay.value = "&nbsp;";
									cDay.setAttribute("class", "calendarInactiveDay");
								}
								_cd.advanceDays(1);
						}
						if(cDay.value != "&nbsp;") {
							//Show selected date
							if(selectedDay != null) {
								if(parseInt(cDay.value) == selectedDay.getDate() && thisMonth == selectedDay.getMonth()+1 && thisYear == selectedDay.getFullYear()) {
									cDay.setAttribute("class", "calendarDaySelected");
									cDay.setAttribute("selected", "yes");
								}
							}
							//Today Overrides Selected Date
							if(parseInt(cDay.value) == curDay && curMonth == thisMonth && curYear == thisYear) {
								cDay.setAttribute("class", "calendarDayToday");
								cDay.setAttribute("today", "yes");
							}
							try {
								var isInactive = cDay.inactive;
								if(!isInactive) {
									cDay.setAttribute("onmouseover", "TicketsCalendar.HoverIn(this)");
									cDay.setAttribute("onmouseout", "TicketsCalendar.HoverOut(this)");
									cDay.setAttribute("onclick", "TicketsCalendar.Click(this)");
								}
							} catch(e) {}
						}
					} while(d++ < 6);
					d = 0;
					//iterate week
				} while(w++ < weeks);
				//Intialize callendar position
				_cd.setCurrentDate(thisYear, thisMonth, 1);
				//Draw it
				var calDiv = $("#divCalendar");
				calDiv.html(grd.toHTML());
		}
		//Finds object position
		var _findPos = function(obj) {
			var curleft = curtop = 0;
			if(typeof obj == "object") {
				if (obj.offsetParent) {
					curleft = obj.offsetLeft
					curtop = obj.offsetTop
					while (obj = obj.offsetParent) {
						curleft += obj.offsetLeft
						curtop += obj.offsetTop
					}
				}
			}
			return [curleft,curtop];
		}
		//Gamefeed Lookup
		var _GetGames = function(gFeed, cDate) {
			var out = [];
			var gLen = gFeed.length-1;
			if(gLen >= 0) {
				var cGame;			
				do {
					cGame = gFeed[gLen];					
					if(cGame != null && cGame.game_date == cDate) {
						out.push(cGame);	
					}
				} while(gLen--);
			}
			return out;
		}
		var _self = {
		//Public Members
			Initialize: function(){				
				_drawCalendarStructure(true);
				_drawCalendar();
			},
			TeamID: null,
			Gamefeed: null,
			Calendar: _cd,
			SelectedDate: null,
			StartDate: null,
			EndDate: null,
			OnDateSelect: null,
			InputObject: null,
			ShowControls: true,
			HideOnSelect: true,
			Hide: function() { $(_calendar).fadeOut() },
			Refresh: function() {_Show(false)},
			//Display Properties
			ShowIn: function(id) {
				//thisRef.containerId = id;
				_calendar = $("#" + id)[0];
				_drawCalendarStructure(false);
				_Show(false);
			},
			ShowAt: function(obj, x, y) {
				var pos = _findPos(obj);				
				_Show(false);
				_calendar.style.left = (pos[0] + x) + "px";
				_calendar.style.top = (pos[1] + y) + "px";			
			},
			ShowBelow: function(obj) {
				var objHeight = obj.clientHeight;
				var pos = _findPos(obj);
				_Show(false);
				_calendar.style.left = pos[0] + "px";
				_calendar.style.top = (pos[1] + objHeight + 2) + "px";			
			},
			ShowAbove: function(obj) {
				var pos = _findPos(obj);				
				_Show(false);
				_calendar.style.left = pos[0] + "px";
				_calendar.style.top = (pos[1] - (_calendar.clientHeight + 2)) + "px";			
			},
			ShowToRight: function(obj) {
				var objWidth = obj.clientWidth;			
				var pos = _findPos(obj);				
				_Show(false);
				_calendar.style.left = (pos[0] + objWidth + 3) + "px";
				_calendar.style.top = pos[1] + "px";			
			},
			ShowToLeft: function(obj) {
				var pos = _findPos(obj);
				_Show(false);
				_calendar.style.left = (pos[0] - (_calendar.clientWidth+2)) + "px";
				_calendar.style.top = pos[1] + "px";
			},
			//Calendar navigation
			GotoNextYear: function() {
				_cd.advanceYears(1);
				_Show(true);
			},
			GotoPrevYear: function() {
				_cd.advanceYears(-1);
				_Show(true);
			},
			GotoNextMonth: function() {
				_cd.advanceMonths(1);
				_Show(true);
			},
			GotoPrevMonth: function() {
				_cd.advanceMonths(-1);
				_Show(true);
			},
			GotoToday: function() {
				_cd.gotoToday();
				_Show(true);
			},
			//Calendar Events
			HoverIn: function(cell) {
				cell.className = "calendarDayOver";
			},
			HoverOut: function(cell) {
				var isToday = (cell.getAttribute("today") == "yes")?true:false;
				var isSelected = (cell.getAttribute("selected") == "yes")?true:false;			
				if(!isSelected) {
					cell.className = "calendarDay";
				} else {
					cell.className = "calendarDaySelected";
				}			
				if(!isToday) {
					if(!isSelected) {
						cell.className = "calendarDay";
					}
				} else {
					cell.className = "calendarDayToday";
				}
			},
			Click: function(cell) {
				var dd = cell.getAttribute("dd");
				var mm = cell.getAttribute("mm");
				var yy = cell.getAttribute("yy");
					dd = (parseInt(dd) < 10)?"0"+dd:dd;
					mm = (parseInt(mm-1) < 10)?"0"+mm-1:mm-1;
					yy = parseInt(yy);
				//If input object is specified
				if(_self.InputObject != null) {									
					_self.InputObject.value = (mm+1) + "/" + dd + "/" + yy;
				}
				//If custom on select handler
				if(_self.OnDateSelect != null) {								
					_self.OnDateSelect(mm, dd, yy);				
				} else {
					if(_self.HideOnSelect) {				
						cell.setAttribute("selected", "yes");
						cell.className = "calendarDaySelected";
						_self.Hide();
					} else {
						var nDate = new Date(yy, mm, dd);
						_self.SelectedDate = nDate.toShortDate();
						_self.Refresh();
					}
				}
			}
		}		
		return _self;
})();		
