/**
 * @author nunziofiore
 * 
 * 13-3-2009: released MooGenda
 * 22-3-2009: added a general object for customization: this.cal that contains the json events data retrieved from getEventUrl
 * 			  added a ShowWeek and ShowDay events
 * 			  added onWrite 
 * 24-3-2009  fixed a bug on resize. Time start it was wrong, now it's ok
 */
Date.prototype.getWeek = function() {
  var onejan = new Date(this.getFullYear(), 0, 1);
  return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()) / 7);
}
var KeyWord = new Class({
  WEEK: "week",
  DAY: "DAY",
  MONTH: "MONTH"
});
var key = new KeyWord();
var MooGenda = new Class({
  Implements: [Events, Options],
  options: {
    id: '',
    dateObject: new Date(),
    where: '',
    header: 'MooGenda',
    storeEventUrl: 'data/storeEvent.json',
    getEventUrl: 'data/getEvent.json',
    mini: false,
    second: false,
    state: this.MONTH,
    h_start: 0,
    h_stop: 24
  },
  initialize: function(options) {
    this.setOptions(options);
    this.id = this.options.id;
    this.storeEventUrl = this.options.storeEventUrl;
    this.h_start = this.options.h_start;
    this.h_stop = this.options.h_stop;
    this.DAY = key.DAY;
    this.WEEK = key.WEEK;
    this.MONTH = key.MONTH;
    this.res = 0;
    this.state = this.options.state;
    this.getEventUrl = this.options.getEventUrl;
    this.dateObject = this.options.dateObject;
    this.mini = this.options.mini;
    this.where = $(this.options.where);
    this.where.set('html', '');
    this.mainDay = null;
    this.mainWeek = null;
    this.cal = null;
	var mini = this.mini;
    if (!mini) {
      this.wait = new Element('img', {
        'src': 'images/wait.gif'
      });
      this.wait.setStyle('margin-left', '38%');
      this.wait.setStyle('margin-top', '18%');
    }
    this.suf = "";
    if (mini) this.suf = "Mini";
    this.body = $(document.body);
    this.buildBody();
    this.header = this.options.header;
    this.length = this.getLength;
    this.month = this.dateObject.getMonth();
    this.date = this.dateObject.getDate();
    this.day = this.dateObject.getDay(); //console.log("week "+this.week);
    this.year = this.dateObject.getFullYear();
    this.getFormattedDate = this.getFormattedDate;
    this.dateObject.setDate(1);
    this.firstDay = this.dateObject.getDay();
    this.dateObject.setDate(this.date);
    this.days = null;
    this.months = null;
    this.marginLeftDay = 0;
    if (!mini) {
      this.days = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
      this.months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
    } else {
      this.days = new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
      this.months = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
    }
    if (!this.options.second) {
      if (!mini) {
        var set_sipario = function() {
          $('sipario').setStyle('display', 'block');
        };
      } else {
        $('container_all' + this.suf).setStyle('display', 'block');
      }
    } else {
      $('container_all' + this.suf).setStyle('display', 'block');
    }
  },
  leave_sipario: function() {
    $('sipario').fade(0);
    $('sipario').setStyle('display', 'none');
    var ef = new Fx.Morph($('container_all'), {
      duration: 1500,
      transition: 'quad:out'
    }); ef.start({
      opacity: ['0', '1'],
      display: ['none', 'block']
    });
  },
  addEmptyLine: function(div, num) {
    while (num >= 0) {
      div.grab(new Element('br'));
      num--;
    }
  },
  add: function(el) {
    this.where.grab(el);
  },
  buildBody: function() {
    if (!this.options.second) {
      if (!this.mini) {
        var sipario = new Element('div', {
          'id': 'sipario'
        });
        this.addEmptyLine(4, sipario);
        sipario.grab(this.wait);
        sipario.fade(0.7);
        this.add(sipario);
      }
    }
    var obj = this;
    this.add(new Element('div', {
      'id': 'container_all' + obj.suf
    }).grab(new Element('div', {
      'id': 'container' + obj.suf
    })));
    $('container' + obj.suf).grab(new Element('div').setStyle('text-align', 'center'));
  },
  getClearEl: function() {
    return new Element('div', {
      'class': 'clearCol'
    });
  },
  getFormattedDate: function(obj) {
    return obj.days[obj.day] + ', ' + obj.months[obj.month] + ' ' + obj.date + ', ' + obj.year;
  },
  write: function() {
    var calContainer = new Element('div', {
      'id': 'calContainer' + this.suf,
      'class': 'calContainer'
    });
    $('container' + this.suf).grab(calContainer);
    this.writeCalendar(this);
    this.addCalEvents();
    
    if (this.state == this.WEEK) {
      this.showWeek(this.mainWeek, true);
    } else if (this.state == this.DAY) this.showDay(this.mainDay, true);
    $('calContainer' + this.suf).setStyle('display', 'block');
    if (!this.options.second) {
      this.leave_sipario.delay(1000);
    }
    this.fireEvent('onWrite');             

    $(this.where).fade(1);
  },
  getMonthEl: function(day, elNum) {
    var monthEl = new Element('li', {
      'id': 'monthEl' + day + elNum,
      'class': 'monthEl'
    });
    monthEl.set('html', '&nbsp;');
    monthEl.store('elNum', elNum);
    return monthEl;
  },
  
  
  addCalEvents: function() {
    var obj = this;
   
    var req = new Request.JSON({
      url: obj.getEventUrl,
      async: false,
      encoding: 'utf-8',
      onComplete: function(respJson) {
        obj.cal = respJson;
      },
      onFailure: function() { //console.log('some errors happened while storing portlet\'s position data!');
      }
    }).post({
      "requestType": "getEventDate",
      "month": obj.month + 1,
      "r": $random(0, 9999)
    });
    this.cal.events.each(function(e, index) {
      var el = this.getMonthEl(e.day, e.elNum);
      el.set('html', e.title);
      el.store('timeLong', e.timeLong);
      el.store('timeStart', e.timeStart);
      el.store('title', e.title);
      el.store('desc', e.desc);
	  el.store('elNum',e.elNum);
      if ($('ul' + e.day)) $('ul' + e.day).grab(el);
      el.addEvent('mouseover',
      function() {
       
        var cnt = new Element('div');
		cnt.id=this.id+'mouseover';
        cnt.set('html', "" + e.title + "<br><br>" + e.desc);
        cnt.setStyle('padding', '10px');
        cnt.setStyle('border', '1px solid #1d1d1d');
        cnt.setStyle('width', '400px');
        cnt.setStyle('text-align', 'justify');
        cnt.setStyle('font-family', 'Trebuchet MS,geneva,arial,sans-serif');
        cnt.setStyle('font-size', '14px');
        var elem = new StickyWin({
          content: cnt,
          relativeTo: el.id,
          position: 'upperRight'
        });
		this.store('win', elem); 
      });
      el.addEvent('mouseout',
      function() {
        this.retrieve('win').destroy();
      });
    }.bind(this));
    var obj = this;
    var sb = new Sortables($$('.monthList'), {
      clone: false,
      revert: false,
      /* initialization stuff here */
      initialize: function() {},
      /* once an item is selected */
      onStart: function(el) {
        el.setStyle('border', '2px dashed #ccc');
        el.fade(0.5);
      },
      onComplete: function(el) {
        el.setStyles({
          border: '1px solid gray',
          display: 'block',
          height: '15px',
          margin: '0px 12% 1px 10%',
          overflow: 'hidden',
          width: '50px'
        });
        el.fade(1);
        obj.storedataMonth();
      }
    });
  },
  storedataMonth: function() { //build a string of the order
    var obj = this;
    var serialized = '';
    for (var i = 1; i <= 31; i++) {
      var founded = false;
      serialized += 'DAY[' + i + ']|';
      $$('#ul' + i + ' li').each(function(li) {
        serialized = serialized + li.retrieve('elNum') + '|';
        founded = true;
      });
      if (!founded) {
        serialized += 'empty|';
      }
    } //console.log(serialized)
    var req = new Request.JSON({
      url: obj.storeEventUrl,
      encoding: 'utf-8',
      onComplete: function(respJson2) {
        if (respJson2.result == 'ok') serialized = '';
        else {
          serialized = '';
          alert('Some errors occurs, while storing data: ' + respJson2.msg)
        }
      },
      onFailure: function() { //console.log('some errors happened while storing portlet\'s position data!');
      }
    }).post({
      "requestType": "storeEventDate",
      "month": obj.month + 1,
      "r": $random(0, 9999),
      "serialized": serialized
    });
  },
  alertError: function(text) {
    if (text == null) new StickyWinModal({
      content: '<div style="border:2px solid red;padding:75px;background:#FFBBBB">SERVER NOT REASY, TRY LATER!!<br/><input type="button" value="close" class="closeSticky"/></div>'
    });
    else new StickyWinModal({
      content: '<div style="border:2px solid red;padding:75px;background:#FFBBBB">' + text + '<br/><input type="button" value="close" class="closeSticky"/></div>'
    });
  },
  createDiary: function(whereZone, cells, noLab) {
    var obj = this;
    var weekCont = 0;
    cells.each(function(cell, idx) {
      if (cell != null) {
        var contatore = 0;
        var cont = new Element('div', {
          'id': 'cont' + cell.retrieve('dataD').format('%Y') + cell.retrieve('dataD').format('%m') + cell.retrieve('dataD').format('%d')
        }); //if(weekCont%2)
        //cont.addClass('weekOdd')
        cont.setStyles({
          'float': 'left',
          'border-right': '1px solid #666'
        });
        if (cells.length == 1) {
          cont.setStyles({
            'width': '100%',
            'margin-top': '0px'
          });
        } else {
          cont.setStyles({
            'width': '100px',
            'margin-top': '0px'
          });
        }
        var titDay = new Element('div', {
          'id': 'titDay' + cell.retrieve('dataD').format('%Y') + cell.retrieve('dataD').format('%m') + cell.retrieve('dataD').format('%d'),
          'styles': {
            'height': '62px',
            'margin-top': '0px',
            'float': 'none',
            'overflow': 'hidden',
            'margin-bottom': '10px',
            'width': 100
          }
        });
		titDay.store('day',cell.retrieve('dataD').format('%d'));
		
        titDay.set('html', cell.retrieve('data'));
        cont.grab(titDay);
        var eventSpace = new Element('div', {
          'id': 'eventSpace' + cell.retrieve('displayNum'),
          'styles': {
            'position': 'absolute',
            'top': '0px'
          }
        });
        eventSpace.store('displayNum', cell.retrieve('displayNum'));
        cont.grab(eventSpace);
        $(whereZone).grab(cont);
        var container = new Element('div', {
          'id': 'container' + cell.retrieve('dataD').format('%Y') + cell.retrieve('dataD').format('%m') + cell.retrieve('dataD').format('%d')
        });
        container.store('displayNum', cell.retrieve('displayNum'));
        container.setStyles({
          'border-top': '1px solid #DCDCDC',
          'width': '110%'
        });
        container.addClass('diary');
        var hash = new Hash();
        for (var i = obj.h_start; i < obj.h_stop; i++) {
          hash.include(i, i + ":00");
          hash.include(i + "_0", cell.retrieve('dataD').format('%Y') + cell.retrieve('dataD').format('%m') + cell.retrieve('dataD').format('%d') + i + "00");
          hash.include(i + "_15", cell.retrieve('dataD').format('%Y') + cell.retrieve('dataD').format('%m') + cell.retrieve('dataD').format('%d') + i + "30"); //    hash.include(i+"_30",cell.retrieve('dataD').format('%Y')+cell.retrieve('dataD').format('%m')+cell.retrieve('dataD').format('%d')+i+"30");
          //    hash.include(i+"_45",cell.retrieve('dataD').format('%Y')+cell.retrieve('dataD').format('%m')+cell.retrieve('dataD').format('%d')+i+"45");
        }
        var top = 0;
        for (var i = obj.h_start; i < obj.h_stop; i++) {
          var cella1 = new Element('div', {
            'id': 'cella1_' + cell.retrieve('dataD').format("%d") + '_' + i,
            'class': 'cella1',
            'styles': {
              'height': '0px',
              'position': 'absolute',
              'margin-left': '0px'
            }
          });
          if (!noLab) cella1.set('html', hash.get(i));
          container.grab(cella1);
          var cella2 = new Element('div', {
            'id': 'cella2_' + cell.retrieve('dataD').format("%d") + '_' + i,
            'class': 'cella2',
            'styles': {
              'height': '34px',
              //75
              'margin-top': '0px'
            }
          });
          top += 75;
          var container_ora = new Element('div', {
            'id': 'container_ora_' + cell.retrieve('dataD').format("%d") + '_' + i,
            'class': 'container_ora'
          });
          cella2.grab(container_ora);
          container.grab(cella2);
          for (var j = 0; j < 30; j += 15) { //<=45
            var cella3 = new Element('div', {
              'id': hash.get(i + "_" + j),
              'class': 'cella3',
              'styles': {
                'height': '15px',
                'margin-top': '0px',
                'width': "113%"
              }
            });
            if (contatore % 2) cella3.addClass('hourOdd');
            container_ora.grab(cella3);
          }
          contatore++;
        }
        cont.grab(container);
        weekCont++;
      }
    });
  },
  getEventBox: function(id, h, start, title, desc, noM) {
    var elCont = new Element('div', {
      'id': id + "Cont",
      'class': 'evCont'
    });
    var obj = this;
    var el = new Element('div', {
      'id': id + "body",
      'class': 'evBody'
    });
    elCont.store('body', id + 'body');
    elCont.store('event_id', id);
    elCont.store('event_title', title);
    elCont.store('event_start', start);
    elCont.store('event_desc', desc);
    elCont.store('event_h', h);
    elCont.addEvent('click',
    function() {
      obj.eventDetail(this);
    });
    var elTop = new Element('div', {
      'id': 'top' + id,
      'class': 'evTop'
    });
    elTop.set('html', '<strong>' + title + '</strong>');
    elCont.grab(elTop);
    var durata = (h.toFloat() - 1) * 34;
    var marginTop = start.toFloat() * 34 - ((this.h_start - 0.5) * 34);
	if (!Browser.Engine.webkit) 
	marginTop+=3;
    if (!noM) {
      if (this.marginLeftDay + 40 > 380) this.marginLeftDay = 0; this.marginLeftDay += 40
    } else this.marginLeftDay = 0; ml = this.marginLeftDay;
    elCont.setStyles({
      'left': ml,
      'top': marginTop
    });
    el.setStyles({
      'height': durata
    });
    var eldesc = new Element('div', {
      'id': 'desc' + id,
      'class': 'evdesc'
    });
    eldesc.set('html', "<br><br>" + desc);
    el.grab(eldesc);
    var elRes = new Element('div', {
      'id': 'res' + id,
      'class': 'evRes'
    });
    resimg = new Element('img', {
      'src': 'images/resize.png'
    });
    elRes.grab(resimg);
     var elH = new Element('div', {
      'id': 'h' + id,
      'class': 'evh'
    });
    elCont.grab(el);
    elCont.grab(elRes);
    elCont.grab(elH);
    elCont.store('moogid', id);
    return elCont;
  },
  getTimeStart: function(element) {
    var diff = [0, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5]
    var top = element.getStyle('top').substr(0, element.getStyle('top').length - 2).toInt();
    
    
	if ((top) == 17) return this.h_start;
    return this.h_start + (diff[(top / 17)]);
  },
  getTimeLong: function(element) {
    var diff = [0, 0, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5]
    var h = $(element.retrieve('body')).getStyle('height').substr(0, $(element.retrieve('body')).getStyle('height').length - 2).toInt();
    if (h == 0) return 1;
    if (h == 17) return 1.5;
    if (h == 34) return 2;
    else if (h > 32) return (((h / 17) - (diff[(h / 17)]))).round(1);
  },
  setNewData: function(element, cell, d) {
    var obj = this;
    var timeStart = obj.getTimeStart(element);
    element.store('timeStart', timeStart);
    var timeLong = obj.getTimeLong(element);
    element.store('timeLong', timeLong);
    element.store('event_start', timeStart);
    element.store('event_h', timeLong);
    obj.log("inizia " + timeStart + " per " + timeLong + " ore del giorno " + d);
    $$('ul li').each(function(e, index) {
      if ((e.retrieve('elNum') + 'Cont') == element.id) {
        e.store('timeLong', element.retrieve('timeLong'));
        e.store('timeStart', element.retrieve('timeStart'));
        e.store('displayNum', d);
        $('ul' + d).grab(e);
        if (d < 10) d = "0" + d;
        $(obj.id + "Day" + d).highlight('#eFe');
      }
    }.bind(this));
    element.store('displayNum', d);
    return element;
  },
  log: function(txt) {
    //if (console) console.log(txt);
  },
  sendData: function(element, cell, droppable) {
    var obj = this;
    var d = -1;
    if (droppable) {
      obj.log(droppable.retrieve('displayNum'));
      d = droppable.retrieve('displayNum');
    } else {
      obj.log(element.getParent().id); d = element.getParent().retrieve('displayNum');
    }
    element = obj.setNewData(element, cell, d);
    var req = new Request.JSON({
      url: obj.storeEventUrl,
      encoding: 'utf-8',
      onComplete: function(respJson2) {
        if (!respJson2.result == 'ok') {
          alert('Some errors occurs, while storing data: ' + respJson2.msg)
        }
      },
      onFailure: function() { //console.log('some errors happened while storing portlet\'s position data!');
      }
    }).post({
      "requestType": "storeEventDay",
      "month": obj.month + 1,
      "day": d,
      "r": $random(0, 9999),
      "el": element.id,
      "timeStart": element.retrieve("timeStart"),
      "timeLong": element.retrieve("timeLong"),
      "id": element.retrieve("moogid")
    });
  },
  addDayEvent: function(cell, noM) {
    var obj = this;
    var evs = new Array();
    var id = cell.retrieve("displayNum");
    $$('#ul' + cell.retrieve("displayNum") + ' li').each(function(e, index) {
      if ($('eventSpace' + id)) {
        var el = this.getEventBox(e.retrieve('elNum'), e.retrieve('timeLong'), e.retrieve('timeStart'), e.retrieve('title'), e.retrieve('desc'), noM);
        el.store('displayNum', cell.retrieve('displayNum'));
        $('eventSpace' + id).grab(el)
      }
    }.bind(this));
    var z = 1000;
    $$('#eventSpace' + id + ' .evCont').each(function(ev, i) {
      ev.fade(0.8);
	  if (noM)
      var myDrag = new Drag.Move(ev, {
        'container': $('weekZone'),
        'handle': $('top' + ev.retrieve('moogid')),
        'grid': 17,
        droppables: $$('.diary'),
        onDrop: function(element, droppable) { //if (!droppable) console.log(element, ' dropped on nothing');
          //else console.log(element, 'dropped on', droppable);
          if (droppable) {
            obj.sendData(element, cell, droppable);
            $('eventSpace' + droppable.retrieve('displayNum')).grab(ev);
            if (noM) ev.setStyle('left', '0px');
            ev.fade(0.8);
			if (!Browser.Engine.webkit) {
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '20px');
				else 
					ev.setStyle('top', (((ev.getStyle('top').substr(0, ev.getStyle('top').length - 2)).toInt() +3)) + "px");
				
				
			}else{
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '17px');
			}	
          }else{
			if (!Browser.Engine.webkit) {
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '20px');
				
			}else
					ev.setStyle('top', '17px');
			
			if (noM) ev.setStyle('left', '0px');
		  }
        },
        onDrag: function(element) { //if (noM)
          // element.setStyle('left','0px');
        },
        onEnter: function(element, droppable) { //console.log(element.id, 'entered', droppable);
          //$('h'+ev.retrieve('moogid')).set('html',droppable.id);
          ev.setStyle('z-index', z++);
          ev.fade(1);
        },
        onLeave: function(element, droppable) { // console.log(element, 'left', droppable);
        }
      });
	  else
	  var myDrag = new Drag.Move(ev, {
        'container': $('dayZone'),
        'handle': $('top' + ev.retrieve('moogid')),
        'grid': 17,
        droppables: $$('.diary'),
        onDrop: function(element, droppable) { //if (!droppable) console.log(element, ' dropped on nothing');
          //else console.log(element, 'dropped on', droppable);
          if (droppable) {
            obj.sendData(element, cell, droppable);
            $('eventSpace' + droppable.retrieve('displayNum')).grab(ev);
			if (!Browser.Engine.webkit) {
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '20px');
				else 
					ev.setStyle('top', (((ev.getStyle('top').substr(0, ev.getStyle('top').length - 2)).toInt() +3)) + "px");
				
				
			}else{
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '17px');
			}	
            ev.fade(0.8);
		  }else{
			if (!Browser.Engine.webkit) {
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '20px');
				
			}else
					ev.setStyle('top', '17px');
		  }
        },
        onDrag: function(element) { //if (noM)
          // element.setStyle('left','0px');
        },
        onEnter: function(element, droppable) { //console.log(element.id, 'entered', droppable);
          //$('h'+ev.retrieve('moogid')).set('html',droppable.id);
          ev.setStyle('z-index', z++);
          ev.fade(1);
        },
        onLeave: function(element, droppable) { // console.log(element, 'left', droppable);
        }
      });
      $(ev.retrieve('moogid') + "body").makeResizable({
        handle: $('res' + ev.retrieve('moogid')),
        grid: 17,
        limit: {
          x: [98, 98],
          y: [0, (33 * obj.h_stop) - ((obj.h_start) * 34)]
        },
        onSnap: function() {},
        onDrag: function() {
          $(ev.retrieve('moogid') + "body").setStyle('width', '100px');
        },
        onComplete: function() {
          if (!Browser.Engine.webkit) {
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '20px');
				else 
					ev.setStyle('top', (((ev.getStyle('top').substr(0, ev.getStyle('top').length - 2)).toInt() -3)) + "px");
				
				
			}else{
				if (ev.getStyle('top') == '0px') 
					ev.setStyle('top', '17px');
			}	
		  obj.sendData(ev, cell);
        }
      });
      $('res' + ev.retrieve('moogid')).addEvent('mouseenter',
      function() {
        $(this).setStyle('z-index', z++);
        $(this).setStyle('border', '1px solid green');
        $(this).setStyle('opacity', 1);
      }.bind(ev.retrieve('moogid') + "Cont"));
      $('' + ev.retrieve('moogid') + 'body').addEvent('mouseenter',
      function() {
        $(this).setStyle('z-index', z++);
        $(this).setStyle('border', '1px solid green');
        $(this).setStyle('opacity', 1);
      }.bind(ev.retrieve('moogid') + "Cont"));
      $('top' + ev.retrieve('moogid')).addEvent('mouseenter',
      function() {
        $(this).setStyle('z-index', z++);
        $(this).setStyle('border', '1px solid green');
        $(this).setStyle('opacity', 1);
      }.bind(ev.retrieve('moogid') + "Cont"));
      $(ev.retrieve('moogid') + "Cont").addEvent('mouseenter',
      function() {
        $(this).setStyle('z-index', z++);
        $(this).setStyle('border', '1px solid green');
        $(this).setStyle('opacity', 1);
      });
      $('' + ev.retrieve('moogid') + 'body').addEvent('mouseout',
      function() {
        $(this).setStyle('border', '0px solid black');
        $(this).setStyle('opacity', 0.8);
      }.bind(ev.retrieve('moogid') + "Cont"));
      $('res' + ev.retrieve('moogid')).addEvent('mouseout',
      function() {
        $(this).setStyle('border', '0px solid black');
        $(this).setStyle('opacity', 0.8);
      }.bind(ev.retrieve('moogid') + "Cont"));
      $('top' + ev.retrieve('moogid')).addEvent('mouseout',
      function() {
        $(this).setStyle('border', '0px solid black');
        $(this).setStyle('opacity', 0.8);
      }.bind(ev.retrieve('moogid') + "Cont"));
      $(ev.retrieve('moogid') + "Cont").addEvent('mouseout',
      function() {
        $(this).setStyle('border', '0px solid black');
        $(this).setStyle('opacity', 0.8);
      });
    });
  },
  resetElements: function() {
    $$('td').removeClass('selectedEl');
  },
  showDay: function(cell, noFx) {
    this.state = this.DAY;
    this.resetElements();
    if (!noFx) {
      $('container_all' + this.suf).set('morph', {
        duration: 'long',
        transition: 'linear'
      });
      $('container_all' + this.suf).morph({
        height: 0,
        width: 0,
        margin: '0px 0px 0px 600px'
      });
      $('weekZone').morph({
        height: 0,
        width: 0
      });
    } else {
      $('container_all' + this.suf).setStyles({
        height: 0,
        width: 0,
        margin: '0px 0px 0px 600px'
      });
      $('weekZone').setStyles({
        height: 0,
        width: 0
      });
    }
	$('dayZone').store('day',cell.retrieve('displayNum'));
    $('weekZone').set('html', '');
    if (!noFx) {
      $('dayZone').set('morph', {
        duration: 'long',
        transition: 'linear'
      });
      $('dayZone').morph({
        height: 1600,
        width: 600
      });
    } else {
      $('dayZone').setStyles({
        height: 1600,
        width: 600
      });
    }
    $('dayZone').set('html', '');
    var close = new Element('div', {
      'id': 'closeDay',
      'styles': {
        'margin-top': '0px',
        'float': 'right'
      }
    });
    cell.store('moogid', cell.retrieve('dataD').format('%Y') + cell.retrieve('dataD').format('%m') + cell.retrieve('dataD').format('%d'));
    cell.addClass('selectedEl');
    var refCloser = new Element('a', {
      'href': '#top',
      'class': 'closer',
      'id': 'close',
      'title': 'Close'
    });
    var imgClose = new Element('img', {
      'src': 'images/close.png',
      'border': '0'
    });
    refCloser.grab(imgClose);
    close.grab(refCloser);
    $('dayZone').grab(close);
    this.createDiary('dayZone', [cell], false);
    if (!noFx) {
      $$('li').each(function(li, i) {
        li.morph({
          height: 0,
          width: 0
        });
      });
      $$('.casella').each(function(li, i) {
        li.morph({
          height: 30,
          width: 30
        });
      });
      $$('.monthList').each(function(li, i) {
        li.morph({
          height: 30,
          width: 30
        });
      });
      $$('.mainSheet').morph({
        width: 250
      });
    } else {
      $$('li').each(function(li, i) {
        li.setStyles({
          height: 0,
          width: 0
        });
      });
      $$('.casella').each(function(li, i) {
        li.setStyles({
          height: 30,
          width: 30
        });
      });
      $$('.monthList').each(function(li, i) {
        li.setStyles({
          height: 30,
          width: 30
        });
      });
      $$('.mainSheet').setStyles({
        width: 250
      });
    }
    $(document.body).scrollTo(0, 0);
	var obj=this;
    close.addEvent('click',
    function() {
      this.state = this.MONTH;
      $('dayZone').morph({
        height: 0,
        width: 0
      });
      var del = function() {
        $('dayZone').set('html', '');
      }
      del.delay(1200);
      $('container_all' + this.suf).morph({
        height: 600,
        width: 1024
      });
      $('container_all' + this.suf).morph({
        margin: '0px 0px 0px 10px'
      });
      $$('li').each(function(li, i) {
        li.morph({
          height: 15,
          width: 50
        });
      });
      $$('.casella').each(function(li, i) {
        li.morph({
          height: 80,
          width: 80
        });
        li.removeClass('selectedEl');
       
      });
	   
	  obj.resetElements();
      $$('.monthList').each(function(li, i) {
        li.morph({
          height: 80,
          width: 80
        });
      });
      $$('.mainSheet').morph({
        width: 650
      });
    }.bind(this));
    this.marginLeftDay = 0;
    this.addDayEvent(cell, false);
	this.fireEvent('onShowDay');

  },
  showWeek: function(cell, noFx) {
    this.resetElements();
    this.state = this.WEEK;
    if (!noFx) {
      $('container_all' + this.suf).set('morph', {
        duration: 'long',
        transition: 'linear'
      });
      $('container_all' + this.suf).morph({
        height: 0,
        width: 0,
        margin: '0px 0px 0px 800px'
      });
      $('dayZone').morph({
        height: 0,
        width: 0
      });
    } else {
      $('container_all' + this.suf).setStyles({
        height: 0,
        width: 0,
        margin: '0px 0px 0px 800px'
      });
      $('dayZone').setStyles({
        height: 0,
        width: 0
      });
    }
    $('dayZone').set('html', '');
    $('weekZone').set('html', '');
    if (!noFx) {
      $('weekZone').set('morph', {
        duration: 'long',
        transition: 'linear'
      });
      $('weekZone').morph({
        height: 3600,
        width: 800
      });
    } else {
      $('weekZone').setStyles({
        height: 3600,
        width: 800
      });
    }
    var e1, e2, e3, e4, e5, e6, e7;
    var obj = this;
    if ((obj.month + 1) == cell.retrieve('d1D').format("%m")) {
      e1 = $(this.id + "Day" + cell.retrieve('d1D').format("%d"));
      e1.addClass('selectedEl');
      e1.store('day',cell.retrieve('d1D').format("%d"));
	  e1.store('titDay',e1.retrieve('dataD').format('%Y') + e1.retrieve('dataD').format('%m') + cell.retrieve('d1D').format("%d"));

	}
    if ((obj.month + 1) == cell.retrieve('d2D').format("%m")) {
      e2 = $(this.id + "Day" + cell.retrieve('d2D').format("%d"));
      e2.addClass('selectedEl');
      e2.store('day',cell.retrieve('d2D').format("%d"));
	  e2.store('titDay',e2.retrieve('dataD').format('%Y') + e2.retrieve('dataD').format('%m') + cell.retrieve('d2D').format("%d"));

    }
    if ((obj.month + 1) == cell.retrieve('d3D').format("%m")) {
      e3 = $(this.id + "Day" + cell.retrieve('d3D').format("%d"));
      e3.addClass('selectedEl');
      e3.store('day',cell.retrieve('d3D').format("%d"));
	  e3.store('titDay',e3.retrieve('dataD').format('%Y') + e3.retrieve('dataD').format('%m') + cell.retrieve('d3D').format("%d"));

    }
    if ((obj.month + 1) == cell.retrieve('d4D').format("%m")) {
      e4 = $(this.id + "Day" + cell.retrieve('d4D').format("%d"));
      e4.addClass('selectedEl');
      e4.store('day',cell.retrieve('d4D').format("%d"));
	  e4.store('titDay',e4.retrieve('dataD').format('%Y') + e4.retrieve('dataD').format('%m') + cell.retrieve('d4D').format("%d"));

    }
    if ((obj.month + 1) == cell.retrieve('d5D').format("%m")) {
      e5 = $(this.id + "Day" + cell.retrieve('d5D').format("%d"));
      e5.addClass('selectedEl');
      e5.store('day',cell.retrieve('d5D').format("%d"));
	  e5.store('titDay',e5.retrieve('dataD').format('%Y') + e5.retrieve('dataD').format('%m') + cell.retrieve('d5D').format("%d"));

    }
    if ((obj.month + 1) == cell.retrieve('d6D').format("%m")) {
      e6 = $(this.id + "Day" + cell.retrieve('d6D').format("%d"));
      e6.addClass('selectedEl');
      e6.store('day',cell.retrieve('d6D').format("%d"));
	  e6.store('titDay',e6.retrieve('dataD').format('%Y') + e6.retrieve('dataD').format('%m') + cell.retrieve('d6D').format("%d"));

    }
    if ((obj.month + 1) == cell.retrieve('d7D').format("%m")) {
      e7 = $(this.id + "Day" + cell.retrieve('d7D').format("%d"));
      e7.addClass('selectedEl');
      e7.store('day',cell.retrieve('d7D').format("%d"));
	  e7.store('titDay',e7.retrieve('dataD').format('%Y') + e7.retrieve('dataD').format('%m') + cell.retrieve('d7D').format("%d"));
    }
    var refCloser = new Element('a', {
      'href': '#top',
      'class': 'closer',
      'id': 'close',
      'title': 'Close',
      'styles': {
        'width': '690px',
        'margin-left': '70%',
		'text-decoration':'none'
      }
    });
	refCloser.set('html','&nbsp;')
    var imgClose = new Element('img', {
      'src': 'images/close.png',
      'border': '0'
    });
    refCloser.grab(imgClose);
    $('weekZone').grab(refCloser);
    var contatore = 0;
    var cont = new Element('div', {
      'id': 'contHours'
    });
    cont.setStyles({
      'float': 'left'
    });
    cont.setStyles({
      'width': '50px',
      'margin-top': '0px'
    });
    var titDay = new Element('div', {
      'id': 'titDayHours',
      'styles': {
        'height': '62px',
        'margin-top': '0px',
        'float': 'none',
        'overflow': 'hidden',
        'margin-bottom': '10px',
        'width': 100
      }
    });
    titDay.set('html', cell.retrieve('data'));
    cont.grab(titDay);
    var eventSpace = new Element('div', {
      'id': 'eventSpace' + 'Hours',
      'styles': {
        'position': 'absolute',
        'top': '0px'
      }
    });
    cont.grab(eventSpace);
    $('weekZone').grab(cont);
    var container = new Element('div', {
      'id': 'container' + 'Hours'
    });
    container.setStyles({
      'border-top': '1px solid #DCDCDC',
      'width': '110%'
    });
    var hash = new Hash();
    for (var i = obj.h_start; i < obj.h_stop; i++) {
      hash.include(i, i + ":00");
      hash.include(i + "_0", 'Hours' + i + "00");
      hash.include(i + "_15", 'Hours' + i + "30");
    }
    var top = 0;
    for (var i = obj.h_start; i < obj.h_stop; i++) {
      var cella1 = new Element('div', {
        'id': 'cella1_' + 'Hours' + '_' + hash.get(i),
        'class': 'cella1',
        'styles': {
          'height': '0px',
          'position': 'absolute',
          'margin-left': '0px'
        }
      });
      cella1.set('html', hash.get(i));
      container.grab(cella1);
      var cella2 = new Element('div', {
        'id': 'cella2_' + 'Hours' + '_' + hash.get(i),
        'class': 'cella2',
        'styles': {
          'height': '34px',
          //75
          'margin-top': '0px'
        }
      });
      top += 75;
      var container_ora = new Element('div', {
        'id': 'container_ora_' + 'Hours' + '_' + hash.get(i),
        'class': 'container_ora'
      });
      cella2.grab(container_ora);
      container.grab(cella2);
      for (var j = 0; j < 30; j += 15) { //<=45
        var cella3 = new Element('div', {
          'id': hash.get(i + "_" + j),
          'class': 'cella3',
          'styles': {
            'height': '15px',
            'margin-top': '0px',
            'width': "113%"
          }
        }); //if (contatore%2)                
        //    cella3.addClass('hourOdd');
        container_ora.grab(cella3);
      }
      contatore++;
    }
    cont.grab(container);
    $('weekZone').store('days',[e1, e2, e3, e4, e5, e6, e7]);
	this.createDiary('weekZone', [e1, e2, e3, e4, e5, e6, e7], true);
    var z = 0;
    if (!noFx) {
      $$('li').each(function(li, i) {
        li.morph({
          height: 0,
          width: 0
        });
      });
      $$('.casella').each(function(li, i) {
        li.morph({
          height: 30,
          width: 30
        });
      });
      $$('.monthList').each(function(li, i) {
        li.morph({
          height: 30,
          width: 30
        });
      });
      $$('.mainSheet').morph({
        width: 250
      });
    } else {
      $$('li').each(function(li, i) {
        li.setStyles({
          height: 0,
          width: 0
        });
      });
      $$('.casella').each(function(li, i) {
        li.setStyles({
          height: 30,
          width: 30
        });
      });
      $$('.monthList').each(function(li, i) {
        li.setStyles({
          height: 30,
          width: 30
        });
      });
      $$('.mainSheet').setStyles({
        width: 250
      });
    }
    $(document.body).scrollTo(0, 0);
    refCloser.addEvent('click',
    function() {
      this.state = this.MONTH;
      $('weekZone').morph({
        height: 0,
        width: 0
      });
      var del = function() {
        $('weekZone').set('html', '');
      }
      del.delay(1200);
      $('container_all' + this.suf).morph({
        height: 600,
        width: 1024
      });
      $('container_all' + this.suf).morph({
        margin: '0px 0px 0px 10px'
      });
      $$('li').each(function(li, i) {
        li.morph({
          height: 15,
          width: 50
        });
      });
      $$('.casella').each(function(li, i) {
        li.morph({
          height: 80,
          width: 80
        });
        li.removeClass('selectedEl');
      });
	 	  obj.resetElements();
      $$('.monthList').each(function(li, i) {
        li.morph({
          height: 80,
          width: 80
        });
      });
      $$('.mainSheet').morph({
        width: 650
      });
    }.bind(this));
    [e1, e2, e3, e4, e5, e6, e7].each(function(cell, i) {
      this.marginLeftDay = 0;
      if (cell != null) this.addDayEvent(cell, true);
    }.bind(this));
	this.fireEvent('onShowWeek');
  },
  writeCalendar: function(obj) {
    var calContainer = $('calContainer' + obj.suf);
    $('calContainer' + obj.suf).setStyle('display', 'none'); //calContainer.setStyle('float','left');
    var mainSheet = new Element('table', {
      'id': 'cal' + obj.id + '',
      'class': 'mainSheet' + obj.suf
    });
    var tbody = new Element('tbody');
    mainSheet.grab(tbody);
    var trHeader = null;
    var thHeader = null;
    if (!obj.mini) {
      trHeader = new Element('tr', {
        'id': 'trHeader' + obj.suf
      });
      thHeader = new Element('th', {
        'colspan': '7'
      });
      thHeader.set('html', obj.header);
      var thNav = new Element('th', {
        'class': 'navEmpty' + obj.suf
      });
      thNav.set('html', '&nbsp;');
      trHeader.grab(thNav);
    }
    var trMonth = new Element('tr', {
      'id': 'trMonthHeader' + obj.suf
    });
    var thMonth = new Element('th', {
      'colspan': '7',
      'class': 'month' + obj.suf
    });
    thMonth.set('html', obj.months[obj.month] + ', ' + obj.year);
    thNav = new Element('th', {
      'class': 'navEmpty' + obj.suf
    });
    thNav.set('html', '&nbsp;');
    trMonth.grab(thNav);
    var trDayHeader = new Element('tr', {
      'id': 'trDayHeader' + obj.suf
    });
    var tdNav = new Element('td', {
      'class': 'navEmpty' + obj.suf
    });
    tdNav.set('html', '&nbsp;');
    trDayHeader.grab(tdNav);
    for (i = 0; i < obj.days.length; i++) {
      var thDayHeader = new Element('th', {
        'class': 'dayHeader' + obj.suf
      });
      thDayHeader.set('html', obj.days[i].substring(0, 3));
      trDayHeader.grab(thDayHeader);
    }
    var trBody = new Element('tr', {
      'class': 'trBody' + obj.suf
    });
    calContainer.grab(mainSheet);
    if (!obj.mini) {
      trHeader.grab(thHeader);
      tbody.grab(trHeader);
    }
    trMonth.grab(thMonth);
    tbody.grab(trMonth);
    trDayHeader.grab(thDayHeader);
    tbody.grab(trDayHeader);
    tbody.grab(obj.buildNav(obj));
    var obj = this;
    var lastWeek;
    for (j = 0; j < 42; j++) {
      var tdDay;
      var displayNum = (j - obj.firstDay + 1);
      var dt = new Date(obj.year, obj.month, displayNum);
      if (((! (j % 7)) || (j == 0)) && (displayNum <= obj.length())) {
        var d = dt.getWeek();
        tdDay = new Element('td', {
          'id': obj.id + d + 'week',
          'class': 'week' + obj.suf
        });
        tdDay.set('html', d);
        var d1 = dt;
        var d2 = d1.clone().increment('day', 1);
        var d3 = d1.clone().increment('day', 2);
        var d4 = d1.clone().increment('day', 3);
        var d5 = d1.clone().increment('day', 4);
        var d6 = d1.clone().increment('day', 5);
        var d7 = d1.clone().increment('day', 6); //console.log(d1+" - "+d7);
        tdDay.store('d1D', d1);
        tdDay.store('d2D', d2);
        tdDay.store('d3D', d3);
        tdDay.store('d4D', d4);
        tdDay.store('d5D', d5);
        tdDay.store('d6D', d6);
        tdDay.store('d7D', d7);
        tdDay.addEvent('click',
        function() {
          obj.showWeek(this, false);
        });
        trBody.grab(tdDay);
        lastWeek = tdDay;
      }
      if (j < obj.firstDay) {
        tdDay = new Element('td', {
          'class': 'empty' + obj.suf
        });
        tdDay.set('html', '&nbsp;');
      } else if (displayNum == obj.date) {
        tdDay = new Element('td', {
          'id': obj.id + 'Day' + dt.format("%d") + '',
          'class': 'date' + obj.suf
        });
        tdDay.setProperty('selected', true);
        tdDay.addEvent('click',
        function() {
          obj.showDay(this, false);
        });
        tdDay.set('html', displayNum);
        tdDay.store('data', displayNum + "/" + obj.months[obj.month] + "/" + obj.year);
        tdDay.store('dataD', new Date(obj.year, obj.month, displayNum));
        tdDay.store('displayNum', displayNum);
      } else if (displayNum > obj.length()) {
        tdDay = new Element('td', {
          'class': 'empty' + obj.suf
        });
        tdDay.set('html', '&nbsp;');
      } else {
        tdDay = new Element('td', {
          'id': obj.id + 'Day' + dt.format("%d"),
          'class': 'days' + obj.suf
        });
        tdDay.addEvent('click',
        function() {
          obj.showDay(this, false);
        });
        tdDay.set('html', displayNum);
        tdDay.store('data', displayNum + "/" + obj.months[obj.month] + "/" + obj.year);
        tdDay.store('dataD', new Date(obj.year, obj.month, displayNum));
        tdDay.store('displayNum', displayNum);
      }
      var ul = new Element('ul', {
        'id': 'ul' + tdDay.retrieve("displayNum"),
        'class': 'monthList' + obj.suf
      });
      ul.store("data", tdDay.retrieve("data"));
      ul.store("dataD", tdDay.retrieve("dataD"));
      tdDay.grab(ul);
      if (displayNum == obj.date) {
        this.mainDay = tdDay;
        this.mainWeek = lastWeek;
      }
      tdDay.addClass('casella' + obj.suf);
      trBody.grab(tdDay);
      tdDay.addEvent('dblclick',
      function() {
        obj.addEventCal(this);
      });
      if (j % 7 == 6) {
        tbody.grab(trBody);
        trBody = new Element('tr', {
          'class': 'trBody' + obj.suf
        });
      }
    }
    tbody.grab(trBody);
    var dayZone = new Element('div', {
      'id': 'dayZone'
    });
    dayZone.setStyle('float', 'left'); //dayZone.setStyle('border','1px solid blue');
    dayZone.setStyle('overflow', 'hidden');
    dayZone.setStyle('position', 'absolute');
    $(this.where).grab(dayZone);
    var weekZone = new Element('div', {
      'id': 'weekZone'
    });
    weekZone.setStyle('float', 'left'); //weekZone.setStyle('border','1px solid blue');
    weekZone.setStyle('overflow', 'hidden');
    weekZone.setStyle('position', 'absolute');
    $(this.where).grab(weekZone);
    return calContainer;
  },
  buildNav: function(obj) {
    var trNav = new Element('tr', {
      'id': 'trNav' + obj.suf
    });
    var tdNav = new Element('td', {
      'class': 'navEmpty' + obj.suf
    });
    tdNav.set('html', '&nbsp;');
    trNav.grab(tdNav);
    tdNav = new Element('td', {
      'class': 'nav' + obj.suf
    });
    tdNav.addEvent('click',
    function() {
      obj.changeMonth( - 12, obj);
    });
    tdNav.set('html', '&lt;');
    trNav.grab(tdNav);
    tdNav = new Element('td', {
      'class': 'nav' + obj.suf
    });
    tdNav.addEvent('click',
    function() {
      obj.changeMonth( - 1, obj);
    });
    tdNav.set('html', '&lt;');
    trNav.grab(tdNav);
    tdNav = new Element('td', {
      'colspan': '3',
      'class': 'month' + obj.suf
    });
    tdNav.set('html', '&nbsp;');
    trNav.grab(tdNav);
    tdNav = new Element('td', {
      'class': 'nav' + obj.suf
    });
    tdNav.addEvent('click',
    function() {
      obj.changeMonth(1, obj);
    });
    tdNav.set('html', '&gt;');
    trNav.grab(tdNav);
    tdNav = new Element('td', {
      'class': 'nav' + obj.suf
    });
    tdNav.setStyle('text-align', 'right');
    tdNav.addEvent('click',
    function() {
      obj.changeMonth(12, obj);
    });
    tdNav.set('html', '&gt;');
    trNav.grab(tdNav);
    return trNav;
  },
  getLength: function() {
    switch (this.month) {
    case 1:
      if ((this.dateObject.getFullYear() % 4 == 0 && this.dateObject.getFullYear() % 100 != 0) || this.dateObject.getFullYear() % 400 == 0) return 29; //leap year
      else return 28;
    case 3:
      return 30;
    case 5:
      return 30;
    case 8:
      return 30;
    case 10:
      return 30
    default:
      return 31;
    }
  },
  changeDate: function(td, cal) {
    alert(cal.getFormattedDate(cal));
  },
  eventDetail: function(ev) {
    alert("id:" + ev.retrieve('event_id') + "\n" + "title:" + ev.retrieve('event_title') + "\n" + "desc:" + ev.retrieve('event_desc') + "\n" + "Time long:" + ev.retrieve('event_h') + "\n" + "Time Start:" + ev.retrieve('event_start') + "\n" + "Day:" + ev.retrieve('displayNum') + "\n");
  },
  addEventCal: function(cell) {
    alert('This is base action you have to overwrite with your own, to store a new calendar day event on ' + cell.retrieve("dataD"))
  },
  
  changeMonth: function(mo, cal) {
    $(cal.where).fade(0.1);
    cal.dateObject.setMonth(cal.dateObject.getMonth() + mo);
    cal = new MooGenda({
      id: cal.id,
      dateObject: cal.dateObject,
      where: cal.where,
      header: cal.header,
      mini: cal.mini,
      storeEventUrl: cal.storeEventUrl,
      getEventUrl: cal.getEventUrl,
      state: cal.state,
      second: true,
      h_start: cal.h_start,
      h_stop: cal.h_stop
    });
    cal.formattedDate = cal.getFormattedDate(cal);
    cal.write();
  }
});