/*
---------------------------------------------------------
*
*	Module "Event"
*	Author: Alexander Zinchuk ( Ajaxy ) 
*	Contact e-mail: hey@ajaxy.ru
*
---------------------------------------------------------
*/

// Mootools more plugin
String.implement({

	parseQuery: function(){
		var vars = this.split(/[&;]/), res = {};
		if (vars.length) vars.each(function(val){
			var index = val.indexOf('='),
				keys = index < 0 ? [''] : val.substr(0, index).match(/[^\]\[]+/g),
				value = decodeURIComponent(val.substr(index + 1)),
				obj = res;
			keys.each(function(key, i){
				var current = obj[key];
				if(i < keys.length - 1)
					obj = obj[key] = current || {};
				else if($type(current) == 'array')
					current.push(value);
				else
					obj[key] = $defined(current) ? [current, value] : value;
			});
		});
		return res;
	},

	cleanQuery: function(method){
		return this.split('&').filter(function(val){
			var index = val.indexOf('='),
			key = index < 0 ? '' : val.substr(0, index),
			value = val.substr(index + 1);
			return method ? method.run([key, value]) : $chk(value);
		}).join('&');
	}

});


ls_Event = {
  eventId : 0,
  today : '',
  menuAct : 0,
  billDate : '',
  billCity : '',
  billDiv : '',
  billActiveColor : '#e97070',
  billRollOverColor : '#e97070',
  billInActiveColor : '#eeeeee',
  Rating_current : 0,
  Rating_countVote : 0,
  Rating_userIsVote : 0,  
  Respanel_weeksCount : 1,
  Respanel_currentWeek : 0,
  Respanel_weeksOrder : new Array(),
  Respanel_weeksTime : new Array(),
  GMapsInited : false,
  GMapLat : 0.0,
  GMapLng : 0.0,
  
  setField : function(fieldName, value) {
    $('event_'+ fieldName).value = value;
  },

  addFieldValue : function(fieldName, value) {
    var curValue = $('event_'+ fieldName).value;
    if(curValue.length > 0) {
      if(curValue.lastIndexOf(',')-curValue.length >= -3) {
        $('event_'+ fieldName).value += value + ', ';
      } else {
        $('event_'+ fieldName).value += ( ', ' + value + ', ' );
      }
    } else {
      $('event_'+ fieldName).value = value + ', ';
    }
  },
  
  Respanel_init : function(serverTime) {
    this.Respanel_currentTime = serverTime || (new Date()).getTime();
    this.Respanel_weekBox = $$('#event_respanel div.week-box')[0];
    this.Respanel_weeks = $('event_respanel_weeks');
    this.Respanel_weekWidth = this.Respanel_weekBox.offsetWidth;
    this.Respanel_weeks.setStyle('width', this.Respanel_weekWidth);
    var firstWeek = $$('#event_respanel_weeks div.week')[0];
    if(!firstWeek) return alert('Can\'t find week panel.');
    firstWeek.setStyle('width', this.Respanel_weekWidth);
    this.Respanel_weekTpl = firstWeek.innerHTML;
    this.Respanel_weeksOrder.push(1);
    this.Respanel_weeksTime.push(serverTime*1000 - 1000*60*60*24);
  },
  
  Respanel_addWeek : function(destination) {
    var week = "<div class='week' style='width:"+ this.Respanel_weekWidth +"px;' id='event_respanel_week"+ (this.Respanel_weeksCount++) +"'>"+ this.Respanel_weekTpl +"</div>";
    this.Respanel_weeks.setStyle('width', this.Respanel_weekWidth*this.Respanel_weeksCount);
    if(destination == 'next') {
      var time = this.Respanel_weeksTime[this.Respanel_currentWeek] + 1000*60*60*24*7;
      this.Respanel_weeksTime.push(time);
      this.Respanel_weeksOrder.push(this.Respanel_weeksCount);
      // remove div.clearer
      this.Respanel_weeks.removeChild(this.Respanel_weeks.getLast());
      this.Respanel_weeks.innerHTML = this.Respanel_weeks.innerHTML + week + '<div class="clearer">&nbsp;</div>';
    } else {
      var time = this.Respanel_weeksTime[this.Respanel_currentWeek] - 1000*60*60*24*7;
      this.Respanel_weeks.innerHTML = week + this.Respanel_weeks.innerHTML;
      this.Respanel_weeksTime.unshift(time);
      this.Respanel_weeksOrder.unshift(this.Respanel_weeksCount);
      this.Respanel_move_next(true);
    }
    this.Respanel_putDays($('event_respanel_week'+(this.Respanel_weeksCount-1)), time);
  },
  
  Respanel_putDays : function(week, fromTime) {
    week = $(week);
    var time, date, monthDay, month, weekDay, isHoliday;
    var days = week.getElements('div.day');
    var t = this;
    $each(days, function(day, i) {
      day.removeClass('today');
      day.removeClass('holiday');
      day.removeClass('active');
      time = fromTime + 1000*60*60*24*i;
      date = new Date();
      date.setTime(time);
      monthDay = date.getDate();
      if(monthDay < 10) monthDay = '0'+monthDay;
      month = date.getMonth()+1;
      if(month < 10) month = '0'+month;
      weekDay = date.getDay();
      if(weekDay == 0 || weekDay == 6) {// || in_array($iMonthDay.'.'.$iMonth, $LS_EVENT_HOLIDAYS) );
        day.addClass('holiday');
      }
      day.id = 'date_'+ date.getFullYear() +'-'+ month  +'-'+ monthDay;
      day.getElement('a.monthday').innerHTML = monthDay;
      if(date.getMonth() != (new Date()).getMonth()) {
        day.getElement('a.monthday').innerHTML += ('.'+ month);
      }
      day.getElement('a.weekday').innerHTML = ls_Event.Respanel_langWeekDays[weekDay];
    });
  },
  
  Respanel_day_over : function(div) {
    div = $(div);
    if(this.menuAct == 3) return;
    if(div.hasClass('active')) return;
    var collection = this.menuAct == 0 ? [div] : $(div.parentNode).getChildren('div.day');
    collection.each(function(day) {
      day.set('morph', {'duration' : 'short'});
      day.morph({backgroundColor: ls_Event.billRollOverColor});
    });
  },
  
  Respanel_day_out : function(div) {
    div = $(div);
    if(this.menuAct == 3) return;
    if(div.hasClass('active')) return;
    var collection = this.menuAct == 0 ? [div] : $(div.parentNode).getChildren('div.day');
    collection.each(function(day) {
      day.set('morph', {'duration' : 'short'});
      day.morph({backgroundColor: ls_Event.billInActiveColor});
    });
  },

  Respanel_arrow_over : function(div, fase) {
    (new Fx.Tween($(div))).set('opacity', '1'); 
  },
  
  Respanel_arrow_out : function(div) {
    (new Fx.Tween($(div))).set('opacity', '0.7'); 
  },

  Respanel_move_next : function(fast) {
    fast = fast||false;
    var week = $('event_respanel_week'+(this.Respanel_weeksOrder[this.Respanel_currentWeek]-1));
    var days = week.getChildren();
    if(this.menuAct == 1) {
      days.each(function(s){
        s.removeClass('active');
        s.setStyle('background-color', this.billInActiveColor);
      });
    } else if(this.menuAct == 3) {
      var holidays = days.filter(function(day,i) {return (i>=1)&&(day.hasClass('friday')||day.hasClass('holiday'))});
      holidays.each(function(holiday) {
        holiday.removeClass('active');
        holiday.setStyle('background-color', this.billInActiveColor);
      });
    }
    if(!fast && this.Respanel_currentWeek >= this.Respanel_weeksCount-1) {
      this.Respanel_addWeek('next');
    }
    var d = parseInt(this.Respanel_weeks.getElement(':first-child').getStyle('width')) * ++this.Respanel_currentWeek;
    if(!fast) {
      (new Fx.Tween(this.Respanel_weeks)).start('left', -d);
      if(this.menuAct == 1 || this.menuAct == 3) {
        this.billToggle(this.menuAct);
      }
    } else {
      this.Respanel_weeks.setStyle('left', -d);
    }
  },
  
  Respanel_move_prev : function(fast) {
    fast = fast||false;
    var week = $('event_respanel_week'+(this.Respanel_weeksOrder[this.Respanel_currentWeek]-1));
    var days = week.getChildren();
    if(this.menuAct == 1) {
      days.each(function(s){
        s.removeClass('active');
        s.setStyle('background-color', this.billInActiveColor);
      });
    } else if(this.menuAct == 3) {
      var holidays = days.filter(function(day,i) {return (i>=1)&&(day.hasClass('friday')||day.hasClass('holiday'))});
      holidays.each(function(holiday) {
        holiday.removeClass('active');
        holiday.setStyle('background-color', this.billInActiveColor);
      });
    }
    if(!fast && this.Respanel_currentWeek <= 0) {
      this.Respanel_addWeek('prev');
    }
    var d = parseInt(this.Respanel_weeks.getElement(':first-child').getStyle('width')) * --this.Respanel_currentWeek;
    if(!fast) {
      (new Fx.Tween(this.Respanel_weeks)).start('left', -d);
      if(this.menuAct == 1 || this.menuAct == 3) {
        this.billToggle(this.menuAct);
      }
    } else {
      this.Respanel_weeks.setStyle('left', d);
    }
  },
  
  Respanel_setDate : function(obj) {
    if(this.menuAct == 3) return;
    if(obj.hasClass('active')) {
      return false;
    }
    if(this.menuAct == 1) {
      return this.billToggle(1);
    }
    var dateDiv = $('date_'+ this.billDate);
    dateDiv.removeClass('active');
    dateDiv.set('morph', {duration : 'short'});
    dateDiv.morph({backgroundColor: this.billInActiveColor});
    obj.addClass('active');
    obj.set('morph', {duration : 'short'});
    obj.morph({backgroundColor: this.billActiveColor});
    ls_Event.billDate = obj.id.replace('date_','');
    this.loadBill();
  },
  
  Rating_move : function(div, e) {
    e = e||window.event;
    if(!div.className) div = div.parentNode;
    div.firstChild.style.width = ((e.layerX||e.offsetX)/120*100) + '%';
    $('place_rating').innerHTML = parseInt((e.layerX||e.offsetX)*500/120);
  },

  Rating_out : function(e) {
    e = e||window.event;
    var target = e.target||e.srcElement;
    if((target.className && target.className == 'stars')) {
      return false;
    }
    $('place_rating').innerHTML = this.Rating_current;
    $('place_rating_stars').style.width = ( this.Rating_current/500*100 + '%' );
  },
  
  Rating_click : function(div, e) {
    e = e||window.event;
    if(!div.className) div = div.parentNode;
    var value = Math.round((e.layerX||e.offsetX)*500/120);
    this.Rating_userIsVote = value;
    return lsVote.vote(this.placeId, div, value, 'place');
  },

  Rating_voted : function(result) {
    this.Rating_current = Math.round(result.iRating);
    this.Rating_countVote = result.iCountVote;
    $('place_rating').innerHTML = this.Rating_current;
    $('place_rating_stars').style.width = ( this.Rating_current/500*100 + '%' );
    $('place_count_vote').innerHTML = result.iCountVote;
    this.Rating_userIsVote = true;
  },
  
  loadBill : function(filters, billDiv) {
    billDiv = $(billDiv||this.billDiv);
    filters = filters||{
      place_id : '*',
      date : ls_Event.billDate,
      time : '*',
      type : '*',
      limit : null
    },
    filters.city = ls_Event.billCity||'*';
    filters.type = ls_Event.billType||'*';
    
    var hash = new Hash(filters);
    if(hash.date) {
      var hashdates = hash.date.split('~');
      hash.date = hashdates.map(function(date){ return ls_Event._convertDate(date, false); }).join('-');
    }
    location.hash = hash.filter(function(v, k){ return v != '*'; }).toQueryString();
    
    billDiv.getChildren()[1].setStyle('display','none');        	
    billDiv.getChildren()[0].setStyle('display','block');        	
    JsHttpRequest.query(
      DIR_WEB_ROOT+'/include/ajax/event_loadBill.php',                       
      filters,
      function(result, errors) {  
        if (!result) {
          msgErrorBox.alert('Error','Please try again later');           
        } else {
          if (result.bStateError) {
            msgErrorBox.alert(result.sMsgTitle,result.sMsg);
          } else {  
            billDiv.getChildren()[0].setStyle('display','none');        	
            billDiv.getChildren()[1].set('html', result.sText);
            billDiv.getChildren()[1].setStyle('display', 'block');
          }
        }
      },
      true
    );
  },
  
  billToggle : function(menuAct) {
    $('event_bill_menu'+this.menuAct).removeClass('active');
    $('event_bill_menu'+menuAct).addClass('active');
    this.menuAct = menuAct;
    if(menuAct != 2) {
      $('event_respanel').style.display = 'block';
      $('event_time_select').style.display = 'none';
      if(lastday = $('date_'+ this.billDate)) {
        lastday.removeClass('active');
        lastday.setStyle('background-color', this.billInActiveColor);
      }
      var week = $('event_respanel_week'+(this.Respanel_weeksOrder[this.Respanel_currentWeek]-1));
      var days = week.getChildren();
      days.each(function(s){
        if(menuAct == 1) {
          s.addClass('active');
          s.set('morph', {duration : 'short'});
          s.morph({backgroundColor: this.billActiveColor});
        } else {
          s.removeClass('active'); 
          s.set('morph', {duration : 'short'});
          s.morph({backgroundColor: this.billInActiveColor});
        }
      });
      if(menuAct == 0) {
        days[1].addClass('active');
        days[1].setStyle('background-color', this.billActiveColor);
        this.billDate = days[1].id.replace('date_','');
      } else if(menuAct == 3) {
        var holidays = days.filter(function(day,i) {return (i>=1)&&(day.hasClass('friday')||day.hasClass('holiday'))});
        holidays.each(function(holiday) {
          holiday.addClass('active');
          holiday.setStyle('background-color', this.billActiveColor);
        });
        this.billDate = holidays[0].id.replace('date_','')+'~'+holidays.getLast().id.replace('date_','');
      } else {
        this.billDate = days[0].id.replace('date_','')+'~'+days[days.length-2].id.replace('date_','');
      }
      this.loadBill();
    } else {
      var dates = this.billDate.split('~');
      if(dates.length < 2) {
        dates[1] = dates[0];
      }
      dates.each(function(date, i) {
        dates[i] = ls_Event._convertDate(date, false);
      });
      $('event_time_select_from').value = dates[0];
      $('event_time_select_to').value = dates[1];
      $('event_respanel').style.display = 'none';
      $('event_time_select').style.display = 'block';
    }
  },
  
  selectCity : function(input) {
    setTimeout(function() {
      if(!input.focused) {
        if(input.value != ls_Event.billCity) {
          ls_Event.billCity = input.value;
          if(!input.value || input.value == '*' || input.value == ls_Event.lang_cities_all) {
            input.value = ls_Event.lang_cities_all;
            ls_Event.billCity = '*';
          }
          ls_Event.loadBill();
        }
        input.removeClass('focused');
      }
    }, 100)
  },
  
  selectType : function(type, bySearchString) {
    types = type.split(',').map(function(v) { return v.trim(); });
    var links = $('event_complexpanel').getElements('a');
    links.each(function(link) {
      if(types.contains(link.get('text'))) {
        link.addClass('active');
      } else {
        link.removeClass('active');
      }
    });
    this.billType = type == this.lang_types_all ? '*' : type;
    if(bySearchString) { // no need to load events if no location.hash params set
      return;
    }
    this.loadBill();
  },
  
  dateSelect : function(input) {
    var from, to;
    var t = this;
    setTimeout(function() {  
      from = $('event_time_select_from').value;
      to = $('event_time_select_to').value;
      t.billDate = t._convertDate(from, true) +'~'+ t._convertDate(to, true);
      t.loadBill();
    }, 500);
  },
  
  _convertDate : function(date, toMySQL) {
    if(date == '*') return date;
    toMySQL = toMySQL||(date.indexOf('.') != -1);
    var newDate;
    var arr;
    if(toMySQL) {
      arr = date.split('.');
      newDate = arr[2] +'-'+ arr[1] +'-'+ arr[0];
    } else {
      arr = date.split('-');
      newDate = arr[2] +'.'+ arr[1] +'.'+ arr[0];
    }
    return newDate;
  },
  
  parseWordsInDate : function(date) {
    var hashdates = date.split('-');
    var date = hashdates.map(function(date){ return ls_Event._wordToDate(date); }).join('-');
    if(date.indexOf('-') != date.lastIndexOf('-')) {
      date = date.substring(0,date.indexOf('-', date.indexOf('-')+1));
    }
    return date;
  },
  
  _wordToDate : function(word) {
    var date, date2;
    var now = (new Date()).getTime();
    var day = 1000*60*60*24;
    var d,m;
    switch(word) {
      case 'today' : date = new Date(); break;
      case 'tomorrow' : date = new Date(now+1*day); break;
      case 'yesterday' : date = new Date(now-1*day); break;
      case 'thisweek' :
        date = new Date();
        date2 = new Date(now+6*day);
      break;
      case 'nextweek' :
        date = new Date(now+7*day);
        date2 = new Date(now+13*day);
      break;
      case 'lastweek' :
        date = new Date(now-7*day);
        date2 = new Date(now-1*day);
      break;
      case 'thismonth' :
        date = new Date();
        date2 = new Date(now+30*day);
      break;
      case 'nextmonth' :
        date = new Date(now+30*day);
        date2 = new Date(now+60*day);
      break;
      case 'lastmonth' :
        date = new Date(now-30*day);
        date2 = new Date(now-1*day);
      break;
      default : return word;
    }
    d = date.getDate();
    m = date.getMonth()+1;
    date = (d<10?'0'+d:d) +'.'+ (m<10?'0'+m:m) +'.'+ date.getFullYear();
    if(date2) {
      d = date2.getDate();
      m = date2.getMonth()+1;
      date = date +'-'+ ( (d<10?'0'+d:d) +'.'+ (m<10?'0'+m:m) +'.'+ date2.getFullYear() );
    }
    return date;
  },
  
  joinLeave : function(obj,idEvent) {   
	obj=$(obj);
	JsHttpRequest.query(
    	DIR_WEB_ROOT+'/include/ajax/event_joinLeave.php',                       
        { idEvent: idEvent },
        function(result, errors) {  
        	if (!result) {
            msgErrorBox.alert('Error','Please try again later');           
        	} else {
            if (result.bStateError) {
            	msgErrorBox.alert(result.sMsgTitle,result.sMsg);
            } else {            	
            	msgNoticeBox.alert(result.sMsgTitle,result.sMsg);
            	if (obj)  {          		
            		if (result.bState) {            			
            			$('event_join_true').style.display = 'none';
            			$('event_join_false').style.display = 'inline';
            		} else {            			
            			$('event_join_true').style.display = 'inline';
            			$('event_join_false').style.display = 'none';
            		}
            		var divCount=$('event_user_count_'+idEvent);
            		if (divCount) {
            			divCount.set('text',result.iCountUser);
            		}
            	}
            }
          }
        },
        true
    );
  },
  
  /*
      * Google Maps support
      */
  GMapInit : function(div_canvas, lat, lng, editMode) {
    if(this.GMapsInited) {
      return true;
    } else {
      this.GMapsInited = true;
    }
    /*
    var gmapscript = document.createElement('script');
    gmapscript.type = 'text/javascript';
    gmapscript.src = 'http://maps.google.com/maps?file=api&v=2&ln=ru&key=' + this.GMapKey;
    document.getElementsByTagName('BODY')[0].appendChild(gmapscript);
    */
    if (!GBrowserIsCompatible()) {
      return;
    }
    ls_Event.GMap = new GMap2(div_canvas);
    ls_Event.GMap.setCenter(new GLatLng(lat, lng), 13);
    ls_Event.GMap.addControl(new GLargeMapControl());
    ls_Event.GMap.addControl(new GMapTypeControl());
    ls_Event.GMap.enableScrollWheelZoom();
    ls_Event.GMapMarker = new GMarker(ls_Event.GMap.getCenter());
    ls_Event.GMap.addOverlay(ls_Event.GMapMarker);
    if(editMode) {
      GEvent.addListener(ls_Event.GMap, 'click', function(overlay, latlng) {
        ls_Event.GMapMarker.setLatLng(latlng);
        $('form_gmap_lat').value = latlng.lat();
        $('form_gmap_lng').value = latlng.lng();
      });
    }
    window.addEvent('unload', function() { GUnload(); });
  },
  
  toggleEdit : function(n, item) {
    var divs = $('event_edit_form').getChildren('div');
    divs.each(function(div) {
      div.setStyle('display', 'none');
    });
    $('eventEdit_div'+n).setStyle('display', 'block');
    var menus = $('event_edit_menu').getChildren('li');
    menus.each(function(div) {
      div.toggleClass('active');
    });
    if(ls_Event && (n == 1 && !ls_Event.GMapsInited)) {
      ls_Event.GMapInit($('gmap_canvas'), this.GMapLat, this.GMapLng, true);
    }
  }
}



