var FloatingWindow = null;

var CalendarItemBox = new Class.create() 
CalendarItemBox.prototype = {
  initialize: function (top, height, left, _type, _Calendar_Item) {
 	this.origin = _Calendar_Item;
	this.id =  _Calendar_Item.id + "s" + this.origin.siblings.length;;
	this.type = _type;
    this.top = top;
    this.height = height - 2;
    this.left = left;
    this.x1 = left;
    this.y1 = top;
    this.x2 = left;
    this.y2 = this.top+this.height;
    this.indentLevel = 0;
    this.hasOverlap = false;
    this.element = document.createElement("div");
    this.element.id = this.id;
	this.infoWindow = null;
	this.trunc = null;
    this.create();
	
  },
  create: function () {
	$(this.element).addClassName("event");
  	if (this.type == "fb") {  	
      $(this.element).setStyle({
      	position: 'absolute',
        top: "0px",
        left: this.left + "px",
        height: CALBOTTOM + "px"
        });    
    };
    if (this.type == "si") {
      $(this.element).setStyle({
      	position: 'absolute',
        top: this.top + "px",
        left: this.left + "px",
        height: this.height + "px"
      	});
      this.element.id = this.origin.id;
      this.id = this.origin.id;
    };
    if (this.type == "eb") {
      $(this.element).setStyle({
      	position: 'absolute',
        top: "0px",
        left: this.left + "px",
        height: this.height + "px"
      });
    }
    if (this.type == "sb") {
      $(this.element).setStyle({
      	position: 'absolute',
        top: this.top + "px",
        left: this.left + "px",
        height: this.height + "px"
      });    
    }
	if (this.type == "fd") {
		$(this.element).className = "fulldayevent";
		$(this.element).setStyle({
			marginLeft: (this.top-HINDEXWIDTH) + "px",
			width: (this.height-this.top+GRDWIDTH-6) + "px"
		});
	}
	
	
	if (this.origin.foreign_event) {
		this.element.className += " foreign";
	}
	
	if (this.origin.repeated_event) {
		this.element.className += " repeated";
	}
	
	if (this.origin.has_participants) {
		this.element.className += " participants";
	}
	
	 if (this.type == "hol") {	
		this.element.className = "";
	}
	
	
	if (this.origin.title.length > 11 && this.type != "hol") {
		_t = this.origin.title.substr(0,9)+"...";
	} else {
	
		_t = this.origin.title;
			
	}
	
	this.element.update("<span>"+_t+"</span>");
    this.origin.siblings.push(this);
    this.origin.container.appendChild(this.element);
	
	if (this.origin.data.type == "BDAY") {
		$(this.element).className = "fulldayevent birthday";
		Event.observe(this.element,"click",Calendar_Item_Events.birthday.bindAsEventListener(this));
		}
		
	if (this.origin.canedit == true && !this.origin.calendar.viewOnly) {
		Event.observe(this.element,"click",Calendar_Item_Events.clicked.bindAsEventListener(this));
	//	Event.observe(this.element,"mouseover",Calendar_Item_Events.mouseover.bindAsEventListener(this));
		Event.observe(this.element,"mouseout",Calendar_Item_Events.mouseout.bindAsEventListener(this));
	}
		
   
  }

}

/**
 * Quickinfo Window
 */

var CalendarInfo = new Class.create();
CalendarInfo.prototype = {
	initialize: function (x,y,eventitem, _origin) {
		this.hover = 0;
		this.origin = _origin;
		this.element = $("eventinfo").cloneNode(true);
		this.element.id = "einfo" + eventitem.id;
		this.element.className = "cal_info";
		$(this.element).setStyle({
			top: x + "px",
			left: y + "px"
		})
		this.origin.appendChild(this.element)
		this.updatecontent(eventitem);
		$(this.element).show();
		Event.observe(this.element,"mouseover",InfoWindowEvents.mouseover.bindAsEventListener(this));
		Event.observe(this.element,"mouseout",InfoWindowEvents.mouseout.bindAsEventListener(this));
	},
	redraw: function (x,y,eventitem, _origin) {
		$(this.element).setStyle({
			top: x + "px",
			left: y + "px"
		})
		this.origin.appendChild(this.element)
		this.updatecontent(eventitem);
		this.origin = _origin;
		},
	updatecontent: function (eventitem) {
		switch(eventitem.data.type) {
			case "BDAY" :
				$$("#"+this.element.id + " .etitle")[1].update(eventitem.title);
				$$("#"+this.element.id + " .einfofull")[0].hide();
				$$("#"+this.element.id + " .bday")[0].show();
				$$("#"+this.element.id + " .eview")[0].hide();
				break;
			default:
				$$("#"+this.element.id + " .eview")[0].show();
				$$("#"+this.element.id + " .bday")[0].hide();
				$$("#"+this.element.id + " .einfofull")[0].show();
				$$("#"+this.element.id + " .etitle")[0].update(eventitem.title);
				/* $$("#"+this.element.id + " .estart")[0].update(eventitem.start.toLocaleString());
				$$("#"+this.element.id + " .eend")[0].update(eventitem.end.toLocaleString());*/
				// $$("#"+this.element.id + " .edescription")[0].update(eventitem.description);
				$$("#"+this.element.id + " .eview")[0].onclick = function () { document.location = eventitem.data.showevent + dateFormat(eventitem.start) };
				$$("#"+this.element.id + " .eedit")[0].onclick = function () { eventitem.edit(); }
				$$("#"+this.element.id + " .edelete")[0].onclick = function () { eventitem.del(); }
				break;
		}
		
		if ( (eventitem.data.eshouts == "0" || eventitem.data.eshouts == null ) && eventitem.data.eshout_link != "") {
			$$("#"+this.element.id + " .eshouts")[0].show();
			$$("#"+this.element.id + " .eshouts")[0].onclick = function () { document.location = eventitem.data.eshout_link }
			$$("#"+this.element.id + " .shouttxt")[0].show();
			$$("#"+this.element.id + " .shouttxt")[1].hide();
		} else if (eventitem.data.eshouts == "1" && eventitem.data.eshout_link != ""){
			$$("#"+this.element.id + " .eshouts")[0].show();
			$$("#"+this.element.id + " .eshouts")[0].onclick = function () { document.location = eventitem.data.eshout_link }
			$$("#"+this.element.id + " .shouttxt")[0].hide();
			$$("#"+this.element.id + " .shouttxt")[1].show();
		} else {
			$$("#"+this.element.id + " .eshouts")[0].hide();	
		}
		
		
		
		switch(eventitem.canedit) {
			case true:
			$$("#"+this.element.id + " .ucanedit").each( function (htmlEle) {
				htmlEle.show();
			});
			break;
			case false:
			$$("#"+this.element.id + " .ucanedit").each( function (htmlEle) {
				htmlEle.hide();
			});
			break;
		}
		
		if (eventitem.data.fuid != "0" && eventitem.data.feid != "0") {
			$$("#"+this.element.id + " .eedit")[0].hide();
			$$("#"+this.element.id + " .edelete")[0].hide();	
		}

	},
	destroy: function () {
		 if (this.hover == 0) {
		 	if (this.element.ancestors().length != 0 ) {
				this.origin.removeChild(this.element)
				}
		}
	}
}

/*
CalendarIndexRow
Day Index for the Weekview
simple function and 
*/

var CalendarIndexRow = new Class.create()
CalendarIndexRow.prototype = {
	initialize: function (_origin) {
  	this.origin = _origin;
  	this.elements = $(DAY_INDEX_ID).getElementsByClassName(DAY_INDEX_DAY_DIV_CLASS);
    this.update();
  },
  update: function () {
  	$(MONTH_NAME_FIELD_ID).update(MONTH[this.origin.startofweek.getMonth()]+ " " + this.origin.startofweek.getFullYear());
    day_index = $(DAY_INDEX_ID).getElementsByClassName(DAY_INDEX_DAY_DIV_CLASS);
    // Cycle through the weekview index and grids updating the id's
   	for (var i = 0; i < day_index.length; i++) {
    	day_index[i].update(this.origin.get_date_string_for_day(i));
		this.origin.calendar_day_column[i].element.id = this.origin.get_date_code_for_day(i);
		this.origin.calendar_day_column[i].element.className = HOUR_GRID_DAY_DIV_CLASS;
    	}
	// console.log(this.origin.tday)
	if ($(this.origin.tday)) {
		$(this.origin.tday).addClassName("today");
	}
  }
}

/* 
Calendar_DayBox Class
day: indexcolumn + weekindex
date: datestring
element: DOM element with id == datestring
origin_element: origin element
*/
  
var CalendarDayBox = new Class.create();

CalendarDayBox.prototype = {
	initialize: function (_day, _date, _origin, calendar) {
	this.day = _day;
	this.date = _date;
	this.element = null;
	this.origin_element = _origin;
	this.calendar = calendar;
	this.element = document.createElement("div");
	
	$(this.element).addClassName("daybox");
	
	$(this.origin_element).appendChild(this.element);
	
	if (this.day == "index") {
		this.element.id = "hourindex";
	}
	
	for (var i = 0; i < 24; i++) {
		hbox = new CalendarHourbox(i, this.date, this.day);
		this.element.appendChild(hbox.element);
		if (hbox.element.id && !this.calendar.viewOnly) {
			Event.observe(hbox.element.id,"click",Calendar_Hbox_Events.clicked.bindAsEventListener(this, hbox.element));
			Event.observe(hbox.element.id,"mouseover",Calendar_Hbox_Events.mouseover.bindAsEventListener(this, hbox.element));
			Event.observe(hbox.element.id,"mouseout",Calendar_Hbox_Events.mouseout.bindAsEventListener(this, hbox.element));
		}
	}
  }
};

/* 
	CalendarHourbox
  DOM Box for the Calendar
*/

var CalendarHourbox = Class.create();

CalendarHourbox.prototype = {
	initialize: function (_hour, _date, _index) {

	this.hour = _hour;
	this.element = document.createElement("div");
	
	this.element.className = HBOXCLASSN;
	
	if (_index == "index") {
		$(this.element).className = "inner_data_time";
		// $(this.element).addClassName("index");
		$(this.element).update(this.hour + ":00");
	} else {
		this.element.id= this.hour + "_" + _index;
	}
	
	}
}

/**
 * Tab Window - Generic
 */

var TabWindow = new Class.create();
TabWindow.prototype = {
	initialize: function (element, o) {
		this.origin = o;
		this.element = $(element);
		this.tabs = new Array();
		this.nav = new Array();
		this.smartform = new Array();
		this.widgets = new Array();
		
		this.init();
	
		},
	init: function () {
		if ($("close")) {
			this.window_close = $("close");
		}
	
		// var ain = this.element.getElementsByClassName("tab");
		var ain = $$("#"+ this.element.id + " .tab");

		for (var i = 0; i < ain.length; i++ ) {
			this.tabs.push(ain[i]);
			ain[i].toggle();
		}
	
		/*
		// var ain = this.element.getElementsByClassName("smartform");
		var ain = $$("#"+ this.element.id + " .smartform");
		for (var i = 0; i < ain.length; i++ ) {
			
			isf = new SmartForm(ain[i], this.origin);
			this.smartform.push(isf)
		}
		*/	
		// var ain = this.element.getElementsByClassName("tab_nav");
		
		var ain = $$("#"+ this.element.id + " .tab_nav");
		for (var i = 0; i < ain.length; i++ ) {
			this.nav.push(ain[i])
		}
		
		if (this.tabs.length != this.nav.length ) {
			alert("Tabs do not match with navigation");
		}
		
		for (var i = 0; i < this.tabs.length; i++) {
			Event.observe(this.nav[i], "click", this.show_tab.bindAsEventListener(this,i))		
		}
		
		if ( this.window_close ) {
			Event.observe(this.window_close, "click", this.close_win.bindAsEventListener(this))
		}
		
		this.tabs[0].toggle();
		this.nav[0].id = "tabfocus";
		this.element.hide();
		
	},
	show_tab: function (event, tab) {
		for (var i = 0; i < this.tabs.length; i++) {
			if (i!=tab) {
				
				this.tabs[i].hide();
				this.nav[i].id = null;
			} else {
				this.tabs[i].show();
				this.nav[i].id = "tabfocus"
			}
		}
	},
	close_win: function (event) {
		this.element.hide();
		if ($("DatePicker")) $("DatePicker").hide();
	},
	show_win: function (event) {
		this.element.show();
	}
}

var SmartForm = new Class.create();
SmartForm.prototype = {
	initialize: function ( forme, o ) {
		this.origin = o;
		this.frm = forme;
		this.f_elements = forme.getElements();
		this.e_checked = null;
		this.action1 = forme.action;
		this.action2 = forme.getAttribute("action2");
		this.toggles = new Array;
		this.buttons = new Array;
		this.frm.reset();
		this.hasDisabledFields = false;
	
		this.parseform();
	
		for (var i = 0; i < this.buttons.length; i++) {
			Event.observe(this.buttons[i],"click",this.submitform.bindAsEventListener(this,this.buttons[i].getAttribute("ajaction")))
		}
		
		//for (var i = 0; i < this.frm.elements.length; i++) {
	//		Event.observe(this.frm.elements[i],"blur", this.validate.bindAsEventListener(this,this.frm.elements[i]));
		//}
		
		for (var i = 0; i < this.toggles.length; i++) {
				if (this.toggles[i].nodeName != "SELECT") {
					Event.observe(this.toggles[i],"click", this.inputs_toggle.bindAsEventListener(this,this.toggles[i]));
				} else {
					Event.observe(this.toggles[i],"change", this.inputs_toggle.bindAsEventListener(this,this.toggles[i]));
				}
				this.inputs_toggle(null,this.toggles[i])
		};
		
	},
	parseform: function () {
		this.toggles = new Array;
		this.buttons = new Array;
		for (var i = 0, l = this.frm.elements.length; i < l; i++) {
			e = this.frm.elements[i];
			if (e.getAttribute("toggles")) {
				this.toggles.push(e);
			};
			
			e.removeClassName("formerror");
			
			if (e.type == "button" || e.type == "submit" ) {
				this.buttons.push(e);
			}
		};

		for (var i = 0; i < this.toggles.length; i++) {
			this.inputs_toggle(null,this.toggles[i]);
		};
		
	},
	submitform: function (event,url) {

		switch (url) {
			case "/event/edit": 
				if(this.frm.elements["title"].value.strip() == "") {
						alert("Please enter a title for your event!");
						return false;
					};
				if ( ( this.frm.elements["participants"].value != ";" || this.frm.elements["participants_distrlist"].value != "" ) && this.frm.elements["feid"].value == "0" && this.frm.elements["fuid"].value == "0") {
					if (confirm("Do you want to inform all participants about the event changes?")) {
						this.frm.elements["sync"].value ="true";
						this.sendformdata(url);	
					} else {
						this.frm.elements["sync"].value ="false";
						this.sendformdata(url);
					}
				} else {
					this.frm.elements["sync"].value ="false";
					this.sendformdata(url);
				}
				break;
			case "/event/delete":
				if (confirm("Are you sure you want to delete this event?")) {
					this.sendformdata(url);
					
				}
			break;
			case "/event/add":
				if(this.frm.elements["title"].value.strip() == "") {
					alert("Please enter a title for your event!");
					return false;
				};
			default:
				this.frm.elements["sync"].value ="false";
				this.sendformdata(url);
			break;
		}	
		
		
		
	},
	sendformdata: function(url) {
		
		url = SITEPREFIX + url;
		if (this.frm.name == "eventinput") {
			var a = new Array(this.frm.elements["s_date_yy"].value, this.frm.elements["s_date_mm"].value,this.frm.elements["s_date_dd"].value);
			this.frm.elements["s_date"].value = a.join("-");
			var a = new Array(this.frm.elements["e_date_yy"].value, this.frm.elements["e_date_mm"].value,this.frm.elements["e_date_dd"].value);
			this.frm.elements["e_date"].value = a.join("-");
			var a = new Array(this.frm.elements["rep_date_yy"].value, this.frm.elements["rep_date_mm"].value,this.frm.elements["rep_date_dd"].value);
			this.frm.elements["rep_date"].value = a.join("-");		
			if (this.frm.elements["e_date"].value != this.frm.elements["s_date"].value && this.frm.elements["repeat"].checked && this.frm.elements["rep_interval"].value == "DAI") {
				alert("You can not repeat an event daily that is longer than a day");
				return false;	
			}		
			if (Number(this.frm.elements["rep_freq"].value) > 0) {
				this.frm.elements["rep_date"].value = "";
			} else {
				this.frm.elements["rep_freq"].value = "";
			}
		}
		
	
		
		qq = $H(this.frm.serialize(true));
		
		myR = new Ajax.Request(url,{
			method: 'post',
			parameters: qq,
			onSuccess: function (transport) {
					return true;
				}
			}
		);
		
		this.origin.redraw();
		
	},
	validate: function (event, frmelement)  {
		if (frmelement) {
			if (frmelement.getAttribute("required") == "true" && this.check_empty(frmelement) ) {
				if (frmelement.getAttribute("depends")) {
					switch (this.frm.elements[frmelement.getAttribute("depends")].type) {
						case "checkbox":
							if (this.frm.elements[frmelement.getAttribute("depends")].checked) {
								frmelement.removeClassName("formerror");
							} else {
								frmelement.addClassName("formerror");
							}
							break;
						default:
							frmelement.addClassName("formerror");
							break;
						}
					return;
					}
					frmelement.addClassName("formerror"); 
				} else {
					if(frmelement.getAttribute("required") == "false" && frmelement.getAttribute("depends")) {
						try {
							if (this.frm.elements[frmelement.getAttribute("depends")].checked && this.check_empty(frmelement)) {
								frmelement.addClassName("formerror");
								return;	
						}
						} catch (e) {};
					}
					frmelement.removeClassName("formerror")
				}
			}
			
		if (!frmelement) {
		me = this;
		this.elements.each( function (e) {
			me.validate(null,e);
		});
		};
		
	},
	check_empty: function (frmelement) {
		if (frmelement.value == "" || frmelement.value.replace(/\s/g,"") == "") {
			return true;
		}
		return false;
	},
	inputs_toggle: function (event,formElement) {
		
		tmp = formElement.getAttribute("toggles");
		tg = tmp.split(";");
		
		if (formElement.nodeName == "SELECT") {
			 if ( formElement.value == tg[1] ) {
			 	$(tg[0]).show();
				} else {
				$(tg[0]).hide();
			}
		}
		
		if (formElement.checked) {
			if (tg[0]=="on") {
				for (var i = 1; i < tg.length; i++) {
					this.frm.elements[tg[i]].enable();
					}
				}
			if (tg[0]=="off") {
				for (var i = 1; i < tg.length; i++) {
					this.frm.elements[tg[i]].value = "";
					this.frm.elements[tg[i]].disable();
					this.frm.elements[tg[i]].removeClassName("formerror");
					}
				}
			return;	
			}
		
		if (!formElement.checked) {
			if (tg[0]=="on") {
				for (var i = 1; i < tg.length; i++) {
					this.frm.elements[tg[i]].value = "";
					this.frm.elements[tg[i]].disable();
					this.frm.elements[tg[i]].removeClassName("formerror");
					}
				}
			if (tg[0]=="off") {
				for (var i = 1; i < tg.length; i++) {
					this.frm.elements[tg[i]].enable();
					}
				}
			}
		}
	}

/**
 * Date Picker - Generic
 */

var DatePicker = new Class.create();

DatePicker.prototype = {
	initialize: function (dpelement,dpowner,callback,weekview) {
		var today = new Date();
		this.tday = [today.getFullYear(),today.getMonth(), today.getDate()];
		this.year = today.getFullYear(); // this year number
		this.callback = callback;
		this.weekview = weekview;
		this.month = today.getMonth(); // this month number
		this.monthname = MONTH[today.getMonth()]; // this month name
		this.days = null; // Number of Days for the month;
		this.target = null; // target form fields
		this.datepicker = $(dpelement); // template target box
		this.listeners = null; 
		this.dayselement = document.createElement("div");
		this.headerelement = document.createElement("span");
		this.pagerelement = document.createElement("div");
		
		var temp = document.createElement("h1");
		temp.appendChild(this.headerelement);
		temp.appendChild(this.pagerelement);
		
		this.datepicker.appendChild(temp);
		this.datepicker.appendChild(this.dayselement);
		
		fw = document.createElement("img");
		fw.src= Config._wroot + "/static/img/icons/bullet_next.gif";
		bw = document.createElement("img");
		bw.src = Config._wroot + "/static/img/icons/bullet_prev.gif";
		
		this.pagerelement.appendChild(bw);
		this.pagerelement.appendChild(fw);
		this.pagerelement.className = "pager";
		this.dayselement.className = "dpdays";
		
		Event.observe(bw, "click", this.backward.bindAsEventListener(this))
		Event.observe(fw, "click", this.forward.bindAsEventListener(this))
		
		if (dpowner) {
			dsc = [$("datepicker_start"), $("datepicker_end"), $("datepicker_rep")]
			for (var i = 0, dscl = dsc.length ; i < dscl; i++) {
				key = dsc[i];
				if (key.getAttribute("component")) { 
					Event.observe(key.id,"click",this.show_picker.bindAsEventListener(this, key.getAttribute("params")))
					}
			};
		}
		
		this.render();
		$(this.datepicker).toggle();
	},
	render: function() {
		ld = new Date(this.year, this.month+1, 0);

		this.days = ld.getDate()+1;
		this.month = ld.getMonth();
		this.year = ld.getFullYear();
		this.monthname = MONTH[this.month];
		$(this.headerelement).update((this.monthname + " " + this.year))
		$(this.dayselement).update("");
		
		for (var i = 1; i != this.days; i++) {
			this.drawbox(i);
		}
	},
	drawbox: function(dnum) {
		cc = new Date(this.year, this.month, dnum)
		
		if (dnum == 1) {
			this.drawempty(cc.getDay())
		} 
		
		tt = document.createElement("div");
		

		 
		switch (cc.getDay()) {
			case 0:
			
				tt.className = "weekend"
				break;
			case 6:
				tt.className = "weekend"
				break;
			default:
				// tt.className = "weekday"
			break;
		}
		
		tt.innerHTML = dnum;

		if (this.tday[2] == dnum && this.tday[1] == this.month && this.tday[0] == this.year) {
			tt.className = "today";	
		}
		
		this.dayselement.appendChild(tt);
		if(this.callback) {
			Event.observe(tt, "click", this.callback.bindAsEventListener(this.weekview,dnum))
		} else {
			Event.observe(tt, "click", this.xselected.bindAsEventListener(this,dnum))
		}
		Event.observe(tt, "mouseover", this.box_hover_on.bindAsEventListener(tt))
		Event.observe(tt, "mouseout", this.box_hover_off.bindAsEventListener(tt))
	},
	drawempty: function (numbers) {
		if (numbers == 0) {
			numbers = 7;
		};
		for (var i = 1; i < numbers; i++) {
			tt = document.createElement("div");
			tt.className = "noday";
			this.dayselement.appendChild(tt);
		}
	},
	show_picker: function (event, parameter) {
		this.listeners = parameter;
		var e = event.target || event.srcElement;
		// arr = new Array( e.offsetTop-50, e.offsetLeft+180 );
	
		// this.xypos(arr)
		this.datepicker.toggle();
	
	},
	xselected: function (event, parameter) {
		_target = this.listeners.split(";")[0];
		m = this.month+1;
		sw = this.listeners.split(";")[1];
		m = (m < 10 ? "0" + m : m);
		parameter = (parameter < 10 ? "0"+parameter : parameter);
		// $(_target).elements[(sw)+"_date"].value = this.year + "-" + m + "-" + parameter;
		dstring = this.year + "-" + m + "-" + parameter;
		set_date(sw, dstring)
		this.hideme();
	},
	hideme: function (event) {
		this.datepicker.toggle();
	},
	xypos: function (cArr) {
		this.datepicker.setStyle({
			top: cArr[0]+"px",
			left: cArr[1]+"px"
		})
	},
	box_hover_on: function () {
		this.id = "hovered"
		},
	box_hover_off: function () {
		this.id = null;
		},
	forward: function () {
		this.month++;
		this.render();
	},
	backward: function () {
		this.month--;
		this.render();
	}
	
}

/*
 * AdressEntry - Object holding Contacts Data in the AdressPicker
 */
var AdressEntry = new Class.create();
AdressEntry.prototype = {
	initialize: function (owner, _element) {
		this.owner = owner;
		this.element = _element;
		this.name_element = $(this.element).descendants()[0];
		this.cid = this.element.id.split("_")[1]
		this.mails = new Array()
		
		selectFunc = this.owner.selectFunction;
		
		var mt = this.element.getElementsBySelector("dd");
		
		if (this.name_element.className != "distrlist") {
			this.name_element.onclick = this.clicked.bind(this)
		
			for (var i = 0; i < mt.length; i++) {
				this.mails.push(mt[i]);
				mt[i].onclick = selectFunc.bind(this,mt[i])
				mt[i].onmouseover = this.entryMouseOver.bind(mt[i])
				mt[i].onmouseout = this.entryMouseOut.bind(mt[i])
				$(mt[i]).hide();
			}
		} else if (this.name_element.className == "distrlist") {
			this.name_element.onclick = selectFunc.bind(this,this.name_element)
		}
		
	},
	clicked: function (e) {
		if ($(this.name_element).hasClassName("selected")) {
			$(this.name_element).removeClassName("selected");
		} else {
			$(this.name_element).addClassName("selected");
		}
		for (var i=0, max = this.mails.length; i < max; i++) {
			if (!this.mails[i].descendantOf(this.owner.selectElement) ) {
				$(this.mails[i]).toggle();	
			}
		}
	},
	entryMouseOver: function (e) {
		if (!this.hasClassName("hovered")) {
			this.addClassName("hovered");
		}
	},
	entryMouseOut: function (e) {
		if (this.hasClassName("hovered")) {
			this.removeClassName("hovered");
		}
	}
}

/*
 * AdressPicker - Adresspicker class
 */

var AdressPicker = new Class.create();
AdressPicker.prototype = {
	initialize: function (callback, selectelement, dataField) {
		this.element = $("abookwidget");
		this.selects = new Array;
		this.adresses = new Hash;
		this.dataField = dataField;
		this.selectElement = selectelement;
		this.selectFunction = callback;
		this.fetch();	
	},
	fetch: function () {
		var apicker = this;
		var url = SITEPREFIX + '/ajax/AdressBook';
		x = new Ajax.Request( url, {
			onComplete: function(transport) {
					apicker.element.update(transport.responseText)
					apicker.parse_data()
			}
	    	});
	},
	parse_data: function () {
			
		dd = $$("#"+this.element.id+" dl");
		var temp_object = null;
		for (var i = 0, l = dd.length; i < l; i++) {
			keyelement = dd[i];	
			temp_object = new AdressEntry(this, keyelement)
			this.adresses[temp_object.cid] = temp_object;
			if (temp_object.name_element.className != "distrlist" ) {
				temp_object.name_element.className = (i%2 == 0 ? "even" : "odd");
				};
			};
		
		if (this.dataField && this.dataField.value != "") {
			setFields = this.dataField.value.split(";")
			for (entry = 0; entry < setFields.length; entry++) {
				cid = setFields[entry].split("|")[0];
				if (cid != 0) {
					email = setFields[entry].split("|")[1];
					invstatus = setFields[entry].split("|")[2];
					if (email == "distrlist") {
						assocDistrList = this.adresses[cid];
						Calendar_AdressBook_Events.LoadParticipant.call(this.adresses[cid], this.adresses[cid].name_element,invstatus)
					} else {
						assocMails = this.adresses[cid];
						for (var i = 0; i < assocMails.mails.length; i++) {
							if (email == assocMails.mails[i].innerHTML) {
								Calendar_AdressBook_Events.LoadParticipant.call(this.adresses[cid],this.adresses[cid].mails[i],invstatus)
								$(this.adresses[cid].mails[i]).show()
							}
						} 
					}
				}
			}
		} else {
			this.selects = new Array;
			if (this.selectElement) { 
				$(this.selectElement).update("");
			}
		}
	},
	refresh: function () {
		$(this.selectElement).update("");
		this.fetch();
	}
}


/**
 * Functions
 * 
 */

function getOffset(element,e) {
	if (!e) var e = window.event;
	result = new Array();
	if ($(element).descendantOf(HOUR_GRID_ID)) {
		result[0] = (element.offsetTop + element.offsetParent.offsetTop - $(HOUR_GRID_ID).scrollTop);
		// result[0] = e.screenY - $("main").offsetTop-50;
		result[1] = (element.offsetLeft + element.offsetParent.offsetLeft)+GRDWIDTH-4;
		} else {
		res = Position.positionedOffset(element);
		result[0] = res[1];
		result[1] = res[0];
		result[0] -= 50;
		result[1] += GRDWIDTH;
		}
	if (result[0] < 0) {
		result[0] = $(HOUR_GRID_ID).scrollTop - element.offsetTop ;
	}
	return result;
}



////////////////////////////////////////////////////
//Events////////////////////////////////////////////
////////////////////////////////////////////////////

var Calendar_AdressBook_Events = {
	LoadParticipant: function (htmlEle, classN) {
		this.owner.selects += htmlEle;
		if (htmlEle.className != "distrlist") {
			htmlEle.className = "selected";
			x = document.createElement("span");
			x.innerHTML = "&lt;" + this.name_element.innerHTML + "&gt; ";
			htmlEle.insertBefore(x,htmlEle.firstChild);
			htmlEle.addClassName(classN)
			}
		$(this.owner.selectElement).appendChild(htmlEle);
		htmlEle.onclick = Calendar_AdressBook_Events.DeleteParticipant.bind(this,htmlEle,classN);
	},
	AddParticipant: function (htmlEle) {
		this.owner.selects += htmlEle;
		if (htmlEle.className == "distrlist") {
			$(this.owner.dataField.id + "_distrlist").value += this.cid +"|distrlist;";
			} else {
			this.owner.dataField.value += this.cid +"|"+ htmlEle.innerHTML + ";"
			htmlEle.className = "selected";
			x = document.createElement("span");
			x.innerHTML = "&lt;" + this.name_element.innerHTML + "&gt; ";
			htmlEle.insertBefore(x,htmlEle.firstChild);	
			}
		$(this.owner.selectElement).appendChild(htmlEle);
		htmlEle.onclick = Calendar_AdressBook_Events.DeleteParticipant.bind(this,htmlEle,null);
	},	
	DeleteParticipant: function  (htmlEle,classN) {
		y = htmlEle.getElementsBySelector("span")[0];
		if (y) htmlEle.removeChild(y);
		this.owner.selects -= htmlEle;
		if (isNaN(this.owner.selects)) { this.owner.selects = new Array; };
		this.element.appendChild(htmlEle);
		if (htmlEle.className != "distrlist") { htmlEle.className = ""; }
		htmlEle.onclick = Calendar_AdressBook_Events.AddParticipant.bind(this,htmlEle,null)
		if (htmlEle.className == "distrlist") {
			elestring = this.cid +"|distrlist";
			} else {
			elestring = this.cid +"|"+ htmlEle.innerHTML;		
			}
		
		if (classN) {
			elestring += "|"+classN;
		}
		if (htmlEle.className == "distrlist") {
				y = $(this.owner.dataField.id + "_distrlist").value.split(";")
				$(this.owner.dataField.id + "_distrlist").value = y.without(elestring).join(";");
			} else {
				y = this.owner.dataField.value.split(";")
				this.owner.dataField.value = y.without(elestring).join(";");
				for (var i = 0; i < this.mails.length; i++) {
					if (this.mails) $(this.mails[i]).show();
				}
			}
}	
}

var Calendar_Hbox_Events = {
	clicked: function (event,daybox) {
		
		calendar_edit_form = this.calendar.edit.smartform[0].frm;
		/* if (this.calendar.edit.smartform[0].hasDisabledFields) {
				for (var i = 0, l = this.calendar.edit.smartform[0].frm.elements.length; i < l; i++) {
					try { this.calendar.edit.smartform[0].frm.elements[i].enable(); } catch (e) { throw(e) };
				};	
			$("abookwidget").show();
		}; */
		$("repeatedevent").hide();
		this.calendar.edit.show_win("new");
		this.calendar.edit.smartform[0].frm.reset();
		$("email_r").checked = true;
		calendar_edit_form.elements["sync"].value = "";
		calendar_edit_form.elements["id"].value = "";
		calendar_edit_form.elements["pid"].value = "";
		calendar_edit_form.elements["feid"].value = "";
		calendar_edit_form.elements["fuid"].value = "";
		calendar_edit_form.elements["rid"].value = "";
		calendar_edit_form.elements["type"].value = "";
		calendar_edit_form.elements["o_date"].value = "";
		calendar_edit_form.elements["o_timezone"].value = "";
		calendar_edit_form.elements["participants"].value = "";
		calendar_edit_form.elements["participants_distrlist"].value = "";
		if (daybox) {
			set_date("s",this.element.id);
			set_date("e",this.element.id);
			//calendar_edit_form.elements["s_date"].value = this.calendar.edit.smartform[0].frm.elements["e_date"].value = this.element.id // this.date.split("-").reverse().join(".");
			calendar_edit_form.elements["s_hh"].value = ( daybox.id.split("_")[0] < 10 ? "0" + daybox.id.split("_")[0] : daybox.id.split("_")[0])
			calendar_edit_form.elements["s_mn"].value = "00"
			calendar_edit_form.elements["e_hh"].value = ( daybox.id.split("_")[0] < 10 ? "0" + daybox.id.split("_")[0] : daybox.id.split("_")[0])
			calendar_edit_form.elements["e_mn"].value = "30"
		} else {
			tmpdate = new Date();
			if (document.getElementById(DateToNumbers(tmpdate))) {
				newdate = this.calendar.calendar_day_column[getDayOfWeek(tmpdate.getDay())].element.id
			} else {
				newdate = this.calendar.calendar_day_column[0].element.id
			}
			set_date("s",newdate);
			set_date("e",newdate);
			//calendar_edit_form.elements["s_date"].value = this.calendar.edit.smartform[0].frm.elements["e_date"].value = this.element.id // this.date.split("-").reverse().join(".");
			calendar_edit_form.elements["s_hh"].value = "09";
			calendar_edit_form.elements["s_mn"].value = "00";
			calendar_edit_form.elements["e_hh"].value = "09";
			calendar_edit_form.elements["e_mn"].value = "30";
		}
		this.calendar.edit.show_tab(null,0);
		this.calendar.edit.smartform[0].parseform();
		this.calendar.adresspicker.refresh();
		$("event_edit").hide();
		$("event_add").show();
		$("title").focus();
	},
  mouseover: function (event,element) {
  	element.className = "inner_data hovered";
  },
  mouseout: function (event,element) {
  	element.className = "inner_data";
	
  }
}

var InfoWindowEvents = {
	mouseover: function (event) {
		this.hover = 1;
	},
	mouseout: function (event) {
		this.hover = 0;
		setTimeout( this.destroy.bind(this), 200);
	}
}

var Calendar_Item_Events = {
	clicked: function (event) { 
	coords = getOffset(this.element,event);
	if (this.infoWindow == null) {
		this.infoWindow = new CalendarInfo (coords[0],coords[1],this.origin,$("main"));
		this.infoWindow.hover = 1;
	} else {
		this.infoWindow.hover = 1;
		this.infoWindow.redraw(coords[0],coords[1],this.origin,$("main"));
	}
	
  },
  mouseover: function (event) {
	return;
	coords = getOffset(this.element,event);
	if (this.infoWindow == null) {
		this.infoWindow = new CalendarInfo (coords[0],coords[1],this.origin,$("main"));
		this.infoWindow.hover = 1;
	} else {
		this.infoWindow.hover = 1;
		this.infoWindow.redraw(coords[0],coords[1],this.origin,$("main"));
	}
	/*
	if (FloatingWindow == null) {
		FloatingWindow = new CalendarInfo (coords[0],coords[1],this.origin,$("content"));
	} else {
		FloatingWindow.hover = 1;
		FloatingWindow.redraw(coords[0],coords[1],this.origin,$("content"))
		}*/
  },
  mouseout: function (event) {
  	if (!this.infoWindow) return;
  	this.infoWindow.hover = 0;
	setTimeout(this.infoWindow.destroy.bind(this.infoWindow), 200)
  	/*FloatingWindow.hover = 0;
	setTimeout( "FloatingWindow.destroy()", "200");*/
  },
  birthday: function (event) {
  	if (this.origin.data.fid == "0") {
	  	document.location=Config._wroot+"/ncontact/"+this.origin.data.cid;
	} else {
	  	document.location=Config._wroot+"/profile/"+this.origin.data.uname+"/#wishlist";		
	}

  }
}

var Calendar_Nav_Events = {
	clicked: function (event, value) {
  	this.navigate(value);
  }
}