/*Copyright (C) 2006  Nick BaicoianuThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*/

function Epoch(name,mode,targetelement,targetbutton){
	this.state = 0;
	this.name = name;
	this.curDate = new Date();
	this.mode = mode;this.selectMultiple = false;
	this.selectedDates = new Array();
	this.calendar;
	this.calHeading;
	this.calCells;
	this.rows;
	this.cols;
	this.cells = new Array();
	this.monthSelect;
	this.yearSelect;
	this.mousein = false;
	this.calConfig();
	this.setDays();
	this.displayYear = this.displayYearInitial;
	this.displayMonth = this.displayMonthInitial;
	this.createCalendar();
	if(this.mode == 'popup' && targetelement && targetelement.type == 'hidden') {
		this.tgt = targetelement;
		this.tgtbutton = targetbutton;
		this.calendar.style.position = 'absolute';
		this.topOffset = 0;
		this.leftOffset = 25;
		this.calendar.style.top = this.getTop(targetbutton) + this.topOffset + 'px';
		this.calendar.style.left = this.getLeft(targetbutton) + this.leftOffset + 'px';
		document.body.appendChild(this.calendar);
		this.tgt.calendar = this;this.tgt.onfocus = function () {this.calendar.show();};
		this.tgt.onblur = function ()
		{
			if(!this.calendar.mousein)
			{
				this.calendar.hide();
			}
		};
	}else{
		this.container = targetelement;this.container.appendChild(this.calendar);
	}
	this.state = 2; this.visible ? this.show() : this.hide();
}


Epoch.prototype.calConfig = function () {this.displayYearInitial = this.curDate.getFullYear(); this.displayMonthInitial = this.curDate.getMonth(); this.rangeYearLower = 2008;this.rangeYearUpper = this.curDate.getFullYear()+10;this.minDate = new Date(2008,0,1);this.maxDate = new Date(this.curDate.getFullYear()+10,0,1);this.startDay = 0; this.showWeeks = false; this.selCurMonthOnly = false; this.clearSelectedOnChange = false; switch(this.mode) {case 'popup': this.visible = false;break;case 'flat':this.visible = true;break;}this.setLang();};

Epoch.prototype.setLang = function()  {this.daylist = new Array('Su','Mo','Tu','We','Th','Fr','Sa','Su','Mo','Tu','We','Th','Fr','Sa'); /*<lang:en>*/this.months_sh = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');this.monthup_title = 'Go to the next month';this.monthdn_title = 'Go to the previous month';this.clearbtn_caption = 'Clear';this.clearbtn_title = 'Clears any dates selected on the calendar';this.maxrange_caption = 'This is the maximum range';};

Epoch.prototype.getTop = function (element) {
	var oNode = element;
	var iTop = 0;

	//alert("container offsetParent.tagName="+document.getElementById('container').offsetParent.tagName);
	//alert("body="+document.body+"\nbody tagName="+document.body.tagName+"\nbody offsetChild="+document.body.offsetChild+"\nbody offsetParent="+document.body.offsetParent+"\nbody offsetTop="+document.body.offsetTop);
	//alert("element="+oNode+" element name="+oNode.name+" element tag name="+oNode.tagName);

    while(oNode && oNode.tagName != 'BODY' && oNode.tagName != 'HTML') {
    	iTop += oNode.offsetTop;
    	oNode = oNode.offsetParent;
    	//alert("oNode offsetTop="+oNode.offsetTop+"\noNode offsetParent="+oNode.offsetParent+"\noNode tagName="+oNode.tagName);
    }
    return iTop;
};

Epoch.prototype.getLeft = function (element) {
	var oNode = element;
	var iLeft = 0;

	while(oNode && oNode.tagName != 'BODY' && oNode.tagName != 'HTML') {
		iLeft += oNode.offsetLeft;
		oNode = oNode.offsetParent;
	}
	return iLeft;
};

/*
Epoch.prototype.getTop = function (element) {
  var oNode = element;
  var iTop = 0;
  alert(element);
  alert(element.name);

  while(oNode && oNode.tagName != 'BODY') {
    iTop += oNode.offsetTop;
    if(!oNode.offsetParent)
    {
      break;
    }
    oNode = oNode.offsetParent;
    alert(iTop);
  }
  alert(iTop);

  return iTop;
};

Epoch.prototype.getLeft = function (element) {
  var oNode = element;
  var iLeft = 0;

  while(oNode.tagName != 'BODY')
  {
    iLeft += oNode.offsetLeft;
    if(!oNode.offsetParent)
    {
      oNode = oNode.offsetParent;
    }
  }

  return iLeft;
};
*/

Epoch.prototype.show = function () {this.calendar.style.display = 'block';this.visible = true;};

Epoch.prototype.hide = function () {this.calendar.style.display = 'none';this.visible = false;};

Epoch.prototype.toggle = function () {if(this.visible) {this.hide();}else {this.show();}};

Epoch.prototype.setDays = function ()  {this.daynames = new Array();var j=0;for(var i=this.startDay; i< this.startDay + 7;i++) {this.daynames[j++] = this.daylist[i];}this.monthDayCount = new Array(31,((this.curDate.getFullYear() - 2000) % 4 ? 28 : 29),31,30,31,30,31,31,30,31,30,31);};

Epoch.prototype.setClass = function (element,className) {element.setAttribute('class',className);element.setAttribute('className',className); };

Epoch.prototype.createCalendar = function ()  {var tbody, tr, td;this.calendar = document.createElement('table');this.calendar.setAttribute('id',this.name+'_calendar');this.setClass(this.calendar,'calendar');this.calendar.onselectstart = function() {return false;};this.calendar.ondrag = function() {return false;};tbody = document.createElement('tbody');tr = document.createElement('tr');td = document.createElement('td');td.appendChild(this.createMainHeading());tr.appendChild(td);tbody.appendChild(tr);tr = document.createElement('tr');td = document.createElement('td');td.appendChild(this.createDayHeading());tr.appendChild(td);tbody.appendChild(tr);tr = document.createElement('tr');td = document.createElement('td');td.setAttribute('id',this.name+'_cell_td');this.calCellContainer = td;td.appendChild(this.createCalCells());tr.appendChild(td);tbody.appendChild(tr);tr = document.createElement('tr');td = document.createElement('td');td.appendChild(this.createFooter());tr.appendChild(td);tbody.appendChild(tr);this.calendar.appendChild(tbody);this.calendar.owner = this;this.calendar.onmouseover = function() {this.owner.mousein = true;};this.calendar.onmouseout = function() {this.owner.mousein = false;};};

Epoch.prototype.createMainHeading = function () {var container = document.createElement('div');container.setAttribute('id',this.name+'_mainheading');this.setClass(container,'mainheading');this.monthSelect = document.createElement('select');this.yearSelect = document.createElement('select');var monthDn = document.createElement('input'), monthUp = document.createElement('input');var opt, i;for(i=0;i<12;i++){opt = document.createElement('option');opt.setAttribute('value',i);if(this.state == 0 && this.displayMonth == i) {opt.setAttribute('selected','selected');}opt.appendChild(document.createTextNode(this.months_sh[i]));this.monthSelect.appendChild(opt);}for(i=this.rangeYearLower;i<=this.rangeYearUpper;i++){opt = document.createElement('option');opt.setAttribute('value',i);if(this.state == 0 && this.displayYear == i) {opt.setAttribute('selected','selected');}opt.appendChild(document.createTextNode(i));this.yearSelect.appendChild(opt);}monthUp.setAttribute('type','button');monthUp.setAttribute('value','>');monthUp.setAttribute('title',this.monthup_title);monthDn.setAttribute('type','button');monthDn.setAttribute('value','<');monthDn.setAttribute('title',this.monthdn_title);this.monthSelect.owner = this.yearSelect.owner = monthUp.owner = monthDn.owner = this;  monthUp.onmouseup = function () {this.owner.nextMonth();};monthDn.onmouseup = function () {this.owner.prevMonth();};this.monthSelect.onchange = function() {this.owner.displayMonth = this.value;this.owner.displayYear = this.owner.yearSelect.value; this.owner.goToMonth(this.owner.displayYear,this.owner.displayMonth);};this.yearSelect.onchange = function() {this.owner.displayMonth = this.owner.monthSelect.value;this.owner.displayYear = this.value; this.owner.goToMonth(this.owner.displayYear,this.owner.displayMonth);};container.appendChild(monthDn);container.appendChild(this.monthSelect);container.appendChild(this.yearSelect);container.appendChild(monthUp);return container;};

Epoch.prototype.createFooter = function () {var container = document.createElement('div');var clearSelected = document.createElement('input');clearSelected.setAttribute('type','button');clearSelected.setAttribute('value',this.clearbtn_caption);clearSelected.setAttribute('title',this.clearbtn_title);clearSelected.owner = this;clearSelected.onclick = function() { this.owner.resetSelections(false);};container.appendChild(clearSelected);return container;};

Epoch.prototype.resetSelections = function (returnToDefaultMonth)  {this.selectedDates = new Array();this.rows = new Array(false,false,false,false,false,false,false);this.cols = new Array(false,false,false,false,false,false,false);if(this.tgt)  {this.tgt.value = '';if(this.mode == 'popup') {this.hide();}}if(returnToDefaultMonth == true) {this.goToMonth(this.displayYearInitial,this.displayMonthInitial);}else {this.reDraw();}};

Epoch.prototype.createDayHeading = function ()  {this.calHeading = document.createElement('table');this.calHeading.setAttribute('id',this.name+'_caldayheading');this.setClass(this.calHeading,'caldayheading');var tbody,tr,td;tbody = document.createElement('tbody');tr = document.createElement('tr');this.cols = new Array(false,false,false,false,false,false,false);if(this.showWeeks){td = document.createElement('td');td.setAttribute('class','wkhead');td.setAttribute('className','wkhead'); tr.appendChild(td);}for(var dow=0;dow<7;dow++){td = document.createElement('td');td.appendChild(document.createTextNode(this.daynames[dow]));if(this.selectMultiple) { td.headObj = new CalHeading(this,td,(dow + this.startDay < 7 ? dow + this.startDay : dow + this.startDay - 7));}tr.appendChild(td);}tbody.appendChild(tr);this.calHeading.appendChild(tbody);return this.calHeading;};

Epoch.prototype.createCalCells = function ()  {this.rows = new Array(false,false,false,false,false,false);this.cells = new Array();var row = -1, totalCells = (this.showWeeks ? 48 : 42);var beginDate = new Date(this.displayYear,this.displayMonth,1);var endDate = new Date(this.displayYear,this.displayMonth,this.monthDayCount[this.displayMonth]);var sdt = new Date(beginDate);sdt.setDate(sdt.getDate() + (this.startDay - beginDate.getDay()) - (this.startDay - beginDate.getDay() > 0 ? 7 : 0) );this.calCells = document.createElement('table');this.calCells.setAttribute('id',this.name+'_calcells');this.setClass(this.calCells,'calcells');var tbody,tr,td;tbody = document.createElement('tbody');for(var i=0;i<totalCells;i++){if(this.showWeeks) {if(i % 8 == 0){row++;tr = document.createElement('tr');td = document.createElement('td');if(this.selectMultiple) { td.weekObj = new WeekHeading(this,td,sdt.getWeek(),row)}else {td.setAttribute('class','wkhead');td.setAttribute('className','wkhead'); }td.appendChild(document.createTextNode(sdt.getWeek()));tr.appendChild(td);i++;}}else if(i % 7 == 0) {row++;tr = document.createElement('tr');}td = document.createElement('td');td.appendChild(document.createTextNode(sdt.getDate()));var cell = new CalCell(this,td,sdt,row);this.cells.push(cell);td.cellObj = cell;sdt.setDate(sdt.getDate() + 1); tr.appendChild(td);tbody.appendChild(tr);}this.calCells.appendChild(tbody);this.reDraw();return this.calCells;};

Epoch.prototype.reDraw = function () {this.state = 1;var i,j;for(i=0;i<this.cells.length;i++) {this.cells[i].selected = false;}for(i=0;i<this.cells.length;i++){for(j=0;j<this.selectedDates.length;j++) { if(this.cells[i].date.getUeDay() == this.selectedDates[j].getUeDay() ) {this.cells[i].selected = true;}}this.cells[i].setClass();}this.state = 2;};

Epoch.prototype.deleteCells = function () {this.calCellContainer.removeChild(this.calCellContainer.firstChild); this.cells = new Array(); };

Epoch.prototype.goToMonth = function (year,month) {this.monthSelect.value = this.displayMonth = month;this.yearSelect.value = this.displayYear = year;this.deleteCells();this.calCellContainer.appendChild(this.createCalCells());};

Epoch.prototype.nextMonth = function () {if(this.monthSelect.value < 11) {this.monthSelect.value++;}else{if(this.yearSelect.value < this.rangeYearUpper){this.monthSelect.value = 0;this.yearSelect.value++;}else {alert(this.maxrange_caption);}}this.displayMonth = this.monthSelect.value;this.displayYear = this.yearSelect.value;this.deleteCells();this.calCellContainer.appendChild(this.createCalCells());};

Epoch.prototype.prevMonth = function () {if(this.monthSelect.value > 0)this.monthSelect.value--;else{if(this.yearSelect.value > this.rangeYearLower){this.monthSelect.value = 11;this.yearSelect.value--;}else {alert(this.maxrange_caption);}}this.displayMonth = this.monthSelect.value;this.displayYear = this.yearSelect.value;this.deleteCells();this.calCellContainer.appendChild(this.createCalCells());};

Epoch.prototype.addZero = function (vNumber) {return ((vNumber < 10) ? '0' : '') + vNumber;};

Epoch.prototype.addDates = function (dates,redraw)  {var j,in_sd;for(var i=0;i<dates.length;i++){in_sd = false;for(j=0;j<this.selectedDates.length;j++){if(dates[i].getUeDay() == this.selectedDates[j].getUeDay()){in_sd = true;break;}}if(!in_sd) { this.selectedDates.push(dates[i]);}}if(redraw != false) {this.reDraw();}};

Epoch.prototype.removeDates = function (dates,redraw)  {var j;for(var i=0;i<dates.length;i++){for(j=0;j<this.selectedDates.length;j++){if(dates[i].getUeDay() == this.selectedDates[j].getUeDay()) { this.selectedDates.splice(j,1);}}}if(redraw != false) { this.reDraw();}};

Epoch.prototype.outputDate = function (vDate, vFormat) {var vDay= this.addZero(vDate.getDate()); var vMonth= this.addZero(vDate.getMonth() + 1); var vYearLong= this.addZero(vDate.getFullYear()); var vYearShort= this.addZero(vDate.getFullYear().toString().substring(3,4)); var vYear= (vFormat.indexOf('yyyy') > -1 ? vYearLong : vYearShort);var vHour= this.addZero(vDate.getHours()); var vMinute= this.addZero(vDate.getMinutes()); var vSecond= this.addZero(vDate.getSeconds()); return vFormat.replace(/dd/g, vDay).replace(/mm/g, vMonth).replace(/y{1,4}/g, vYear).replace(/hh/g, vHour).replace(/nn/g, vMinute).replace(/ss/g, vSecond);};

Epoch.prototype.updatePos = function (target) {this.calendar.style.top = this.getTop(target) + this.topOffset + 'px';this.calendar.style.left = this.getLeft(target) + this.leftOffset + 'px';};function CalHeading(owner,tableCell,dow){this.owner = owner;this.tableCell = tableCell;this.dayOfWeek = dow;this.tableCell.onclick = this.onclick;}CalHeading.prototype.onclick = function (){var owner = this.headObj.owner;var sdates = owner.selectedDates;var cells = owner.cells;owner.cols[this.headObj.dayOfWeek] = !owner.cols[this.headObj.dayOfWeek];for(var i=0;i<cells.length;i++) {if(cells[i].dayOfWeek == this.headObj.dayOfWeek && (!owner.selCurMonthOnly || cells[i].date.getMonth() == owner.displayMonth && cells[i].date.getFullYear() == owner.displayYear)) {if(owner.cols[this.headObj.dayOfWeek]) {if(owner.selectedDates.arrayIndex(cells[i].date) == -1) { sdates.push(cells[i].date);}}else{for(var j=0;j<sdates.length;j++) {if(cells[i].dayOfWeek == sdates[j].getDay()){sdates.splice(j,1);break;}}}cells[i].selected = owner.cols[this.headObj.dayOfWeek];}}owner.reDraw();};

function WeekHeading(owner,tableCell,week,row){this.owner = owner;this.tableCell = tableCell;this.week = week;this.tableRow = row;this.tableCell.setAttribute('class','wkhead');this.tableCell.setAttribute('className','wkhead'); this.tableCell.onclick = this.onclick;}

WeekHeading.prototype.onclick = function (){var owner = this.weekObj.owner;var cells = owner.cells;var sdates = owner.selectedDates;var i,j;owner.rows[this.weekObj.tableRow] = !owner.rows[this.weekObj.tableRow];for(i=0;i<cells.length;i++){if(cells[i].tableRow == this.weekObj.tableRow){if(owner.rows[this.weekObj.tableRow] && (!owner.selCurMonthOnly || cells[i].date.getMonth() == owner.displayMonth && cells[i].date.getFullYear() == owner.displayYear)) {if(owner.selectedDates.arrayIndex(cells[i].date) == -1) {sdates.push(cells[i].date);}}else{for(j=0;j<sdates.length;j++){if(sdates[j].getTime() == cells[i].date.getTime())  {sdates.splice(j,1);break;}}}}}owner.reDraw();};

function CalCell(owner,tableCell,dateObj,row){this.owner = owner;this.tableCell = tableCell; this.cellClass;this.selected = false;this.date = new Date(dateObj);this.dayOfWeek = this.date.getDay();this.week = this.date.getWeek();this.tableRow = row;this.tableCell.onclick = this.onclick;this.tableCell.onmouseover = this.onmouseover;this.tableCell.onmouseout = this.onmouseout;this.setClass();}CalCell.prototype.onmouseover = function () {this.setAttribute('class',this.cellClass + ' hover');this.setAttribute('className',this.cellClass + ' hover');};

CalCell.prototype.onmouseout = function () {this.cellObj.setClass();};CalCell.prototype.onclick = function () {var cell = this.cellObj;var owner = cell.owner;if(!owner.selCurMonthOnly || cell.date.getMonth() == owner.displayMonth && cell.date.getFullYear() == owner.displayYear){if(owner.selectMultiple == true)  {if(!cell.selected) {if(owner.selectedDates.arrayIndex(cell.date) == -1) {owner.selectedDates.push(cell.date);}}else{var tmp = owner.selectedDates; for(var i=0;i<tmp.length;i++){if(tmp[i].getUeDay() == cell.date.getUeDay()) {tmp.splice(i,1);}}}}else {owner.selectedDates = new Array(cell.date);if(owner.tgt) {owner.tgt.value = owner.selectedDates[0].dateFormat();updateGoIsraelField(owner.selectedDates[0].dateFormat(),owner.tgt, owner);if(owner.mode == 'popup') {owner.hide();}}}owner.reDraw(); }};

CalCell.prototype.setClass = function ()  {if(this.selected) {this.cellClass = 'cell_selected';}else if(this.owner.displayMonth != this.date.getMonth() ) {this.cellClass = 'notmnth';}else if(this.date.getDay() > 0 && this.date.getDay() < 6) {this.cellClass = 'wkday';}else {this.cellClass = 'wkend';}if(this.date.getFullYear() == this.owner.curDate.getFullYear() && this.date.getMonth() == this.owner.curDate.getMonth() && this.date.getDate() == this.owner.curDate.getDate()) {this.cellClass = this.cellClass + ' curdate';}this.tableCell.setAttribute('class',this.cellClass);this.tableCell.setAttribute('className',this.cellClass); };

function dumpProps(obj, parent) {
   // Go through all the properties of the passed-in object
   for (var i in obj) {
      // if a parent (2nd parameter) was passed in, then use that to
      // build the message. Message includes i (the object's property name)
      // then the object's property value on a new line
      if (parent) { var msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
      // Display the message. If the user clicks "OK", then continue. If they
      // click "CANCEL" then quit this level of recursion
      if (!confirm(msg)) { return; }
      // If this property (i) is an object, then recursively process the object
      if (typeof obj[i] == "object") {
         if (parent) { dumpProps(obj[i], parent + "." + i); } else { dumpProps(obj[i], i); }
      }
   }
}

//// Added By Rob Duga
function updateGoIsraelField(date,id, owner)
{
	var new_date = date;
	new_date = new_date+'';

	new_date = new_date.split("-");
	var new_month = new_date[1];
	var new_day = new_date[2];
	var new_year = new_date[0];
	var row_number = id.id+'';
	row_number = row_number.split("_");
	var row_number_number = (row_number[1]*1)-1;

	document.getElementById('day'+row_number[1]).value = new_day;
	document.getElementById('mon'+row_number[1]).value = new_month;
	document.getElementById('year'+row_number[1]).value = new_year;
	document.select_rooms['select_product'][row_number_number].checked = true;
}
// Added By Rob Duga
Date.prototype.getDayOfYear = function () {return parseInt((this.getTime() - new Date(this.getFullYear(),0,1).getTime())/86400000 + 1);};

Date.prototype.getWeek = function () {return parseInt((this.getTime() - new Date(this.getFullYear(),0,1).getTime())/604800000 + 1);};

Date.prototype.getUeDay = function () {return parseInt(Math.floor((this.getTime() - this.getTimezoneOffset() * 60000)/86400000)); };

Date.prototype.dateFormat = function(format){if(!format) { format = 'Y-m-d';}LZ = function(x) {return(x < 0 || x > 9 ? '' : '0') + x};var MONTH_NAMES = new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');var DAY_NAMES = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');format = format + "";var result="";var i_format=0;var c="";var token="";var y=this.getFullYear().toString();var M=this.getMonth()+1;var d=this.getDate();var E=this.getDay();var H=this.getHours();var m=this.getMinutes();var s=this.getSeconds();var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;var value = new Object();value['Y'] = y.toString();value['y'] = y.substring(2);value['n'] = M;value['m'] = LZ(M);value['F'] = MONTH_NAMES[M-1];value['M'] = MONTH_NAMES[M+11];value['j'] = d;value['d'] = LZ(d);value['D'] = DAY_NAMES[E+7];value['l'] = DAY_NAMES[E];value['G'] = H;value['H'] = LZ(H);if (H==0) {value['g']=12;}else if (H>12){value['g']=H-12;}else {value['g']=H;}value['h']=LZ(value['g']);if (H > 11) {value['a']='pm'; value['A'] = 'PM';}else { value['a']='am'; value['A'] = 'AM';}value['i']=LZ(m);value['s']=LZ(s);while (i_format < format.length) {c=format.charAt(i_format);token="";while ((format.charAt(i_format)==c) && (i_format < format.length)) {token += format.charAt(i_format++);}if (value[token] != null) { result=result + value[token]; }else { result=result + token; }}return result;};Array.prototype.arrayIndex = function(searchVal,startIndex) {startIndex = (startIndex != null ? startIndex : 0); for(var i=startIndex;i<this.length;i++){if(searchVal == this[i]) {return i;}}return -1;};
