if(!BMObjs){var BMObjs=[];};
if(!BMObjs["datepicker"]) BMObjs["datepicker"]=[];

var f_dl=TrimPath;
var DatePicker=Class.eventClass();

DatePicker.getInstanceById=function(f_cJ){
  for(var i=0;i<BMObjs["datepicker"].length;i++)
    if(BMObjs["datepicker"][i].id==f_cJ)
      return BMObjs["datepicker"][i];
}
DatePicker.setCalendarType = function(f_gs){
	DatePicker.calendarType = f_gs;
}
Object.extend (DatePicker.prototype, {
	initialize: function(f_aM,f_L,f_bo,f_bw,f_bn,f_cJ) {
		this.objType = "datepicker";
		BMObjs["datepicker"].push(this);
    
    if (f_cJ) this.id=f_cJ;
    else this.id=f_aM;
		this.f_aM=$(f_aM);
		Object.extend($(f_aM), {datepickerObj: this});
    this.f_hb=f_bw.dayStr;
    this.f_hN=f_bw.monthStr;
    this.f_dK=f_bw.errorInfo;
    this.f_aC=f_bw.tipInfo;
    this.f_gC=f_bw.localNum;
    
    if(!f_bn)
      f_bn={};
    
    this.f_fK=this.f_O(f_bn.today || new Date());
    this.f_gN=this.f_O(f_bn.minDate || 0);
    this.f_gG=this.f_O(f_bn.maxDate || 60);
    this.dateOffset = this.f_gG.getTime() - this.f_gN.getTime();
    this.f_fy=f_bn.specialDates || [];
    this.f_do=f_bn.specialTipInfo || [];
    this.f_bh=f_bn.pickerImg;
    if(this.f_bh)
      this.f_bh=$(this.f_bh);

    this.f_gk=f_bn.offsetLeft || 0;
    this.f_gr=f_bn.offsetTop ||0;
    
    try{
      this.f_cH=this.f_O( f_bn.initDate  || this.f_aM.value.trim() || this.f_fK );
    }
    catch(e){
      this.f_cH=this.f_gN;
    }

    if(!this.checkRange(this.f_cH))
      this.f_cH=this.f_gN;

    this.f_i=undefined;

    this.setValue(this.f_cH);
    
    
    this.f_fO();

    if(typeof f_L=='string'){
      if(Element.exist(f_L))
        f_L=f_dl.parseTemplate(f_L);
      else
        f_L=f_dl.parseTemplate(f_L);
    }
    else
      f_L=f_L;
    
    if(typeof f_bo=='string'){
      if(Element.exist(f_bo))
        this.f_dk=f_dl.parseTemplate(f_bo);
      else
        this.f_dk=f_dl.parseTemplate(f_bo);
    }
    else
      this.f_dk=f_bo;

    this.f_B=$E(f_L.process({dayStr:this.f_hb}));
    Element.setStyle(this.f_B,{
      position:'absolute',
      display: 'none'
    });
this.f_aM.parentNode.appendChild(this.f_B);
    this.f_hr=document.getElementsByClassName('main_td',this.f_B)[0];
    this.f_dP=document.getElementsByClassName('slot',this.f_B)[0];
    
    this.update(this.f_i);
	
    var f_dB=document.getElementsByClassName("tipInfo",this.f_B)[0];
    f_dB.innerHTML=Date.getStr(this.f_cH,this.f_aC.initInfo);
    

    Event.observe(this.f_aM,'click',this.f_fW.bindAsEventListener(this));
    if(this.f_bh)
      Event.observe(this.f_bh,'click',this.f_fW.bindAsEventListener(this));
    
    this.f_et=false;
    var blurFunc=function(){
      if (Prototype.Browser.IE 
        && document.activeElement 
        && document.activeElement.tagName.toUpperCase()=="IFRAME" && !this.f_et) {
        this.f_et=true;
        this.f_aM.focus();
      }
      else{
        if(!this.f_bO){
          this.f_fD();
        }
      }
    }.bind(this)

    Event.observe(this.f_aM,'blur',blurFunc);
    if(this.f_bh)
      Event.observe(this.f_bh,'blur',blurFunc);
    
    var f_cu=function(e){
      e=e || window.event;
      var pos=-e.wheelDelta || e.detail;

      if(pos>0)
        var f_w=new Date(this.f_i.getTime()+1000*60*60*24);
      else
        var f_w=new Date(this.f_i.getTime()-1000*60*60*24);
      try{
        this.setValue(f_w);
        this.update(this.f_i);
      }
      catch(ex){
      }
      Event.stop(e);
    }.bind(this);
    
    var f_bI=function(e){
      e=e || window.event;
      var pos=-e.wheelDelta || e.detail;

      if(pos>0)
        var f_w=new Date(this.f_t.getTime()+1000*60*60*24*35);
      else
        var f_w=new Date(this.f_t.getTime()-1000*60*60*24*35);
      
      f_w=this.f_du(f_w);

      this.update(f_w);

      Event.stop(e);
    }.bind(this)

    if(document.attachEvent){
      this.f_aM.attachEvent("onmousewheel",f_cu);
      }else{
      this.f_aM.addEventListener("DOMMouseScroll", f_cu, false);
      } 
	
    Event.observe(document,'click',function(ev){
      var f_dI=Event.element(ev);

      if(f_dI==this.f_aM
        || f_dI==this.f_bh
        || this.f_bO
      )
        return;
      else{
        this.f_fD();
      }
    }.bind(this));
    
    var f_fx=function(){
      if(this.f_ed())
        this.setValue(this.f_aM.value);
      else
        this.setValue(this.f_i);
      var f_gU=document.getElementsByClassName('selected',this.f_B);
      $A(f_gU).each(function(f_hV){
        Element.removeClassName(f_hV,'selected');
      });
      var f_hm=new Selector("td[date='"+this.getValueStr('%Y-%M-%D')+"']").findElements(this.f_B);
      if(f_hm[0])
        Element.addClassName(f_hm[0],'selected');

    }.bind(this)
    Event.observe(this.f_aM,'change',f_fx);

    this.f_bO=false;

    Event.observe(document,"mousemove",function(ev){
			if(this.f_B 
        && Position.within(this.f_B,Event.pointerX(ev),Event.pointerY(ev)))
				this.f_bO=true;
			else
        this.f_bO=false;
		}.bind(this));  
      

	},

  setMinDate:function(f_w){
    this.f_gN=this.f_O(f_w);
  },

  setMaxDate:function(f_w){
    this.f_gG=this.f_O(f_w);
  },
  
  getMaxDate: function() {
	return this.f_gG;
  },
  
  getMinDate: function() {
	return this.f_gN;
  },
  
  setSpecialDate: function(f_w) {
	this._specDate=this.f_O(f_w);
	this.f_gI = true;
  },

  setValue:function(f_w){
	  	f_w=this.f_O(f_w);

    if(!this.checkRange(f_w)) {
      return false;
		}    
    var f_fu=this.f_i;
    this.f_i=f_w;

    if((!f_fu) || (f_fu.getTime()!=this.f_i.getTime())){
      if(this.f_B) this.update(this.f_i);
      this.fireEvent('changed',this.f_i);
    }

    this.f_aM.value=Date.getStr(this.f_i);
	},

  getValue:function(){
    return this.f_i;
  },

  getValueStr:function(f_gt){
    return Date.getStr(this.f_i,f_gt);
  },
  f_du:function(f_t){
    if(f_t.getTime()<this.f_gN.getTime())
      f_t=new Date(this.f_gN.getTime());

    var f_cd=new Date(this.f_gG.getTime());

    if(f_t.getTime()>f_cd.getTime())
      f_t=f_cd;
    return f_t;
  },

  update:function(f_dv,f_dj,f_w){
    if(arguments.length==1){
      f_n=this.f_O(f_dv);
      f_dv=f_n.getFullYear();
      f_dj=f_n.getMonth()+1;
      f_w=f_n.getDate();
    }

    var f_t=new Date(f_dv,f_dj-1,f_w);
    f_t=this.f_du(f_t);
    
    f_dv=f_t.getFullYear();
    f_dj=f_t.getMonth()+1;
    f_w=f_t.getDate();

    var f_cQ=this.f_dP.firstChild;
    
    this.f_eR();

    var f_dU=new Date((this.f_t || this.f_gN).getTime());
    var f_fb=f_dU.getDay();

    this.f_t=f_t;

    var f_ef=this.f_hc(f_dv,f_dj,f_w);
    
    $(this.f_dP).clear();
	this.f_dP.appendChild(f_ef);
    
    },

  f_eR:function(){
    var f_dy=this.f_dP.firstChild;
    if(!f_dy) return;
    Event.stopObserving(f_dy,'click',this.f_ek);
    },
  
  f_hc:function(f_dv,f_dj,f_w){
    var f_n;
    var f_fS= [];
	var _dateArr2= [];
    var f_t=new Date(f_dv,f_dj-1,f_w);
    var f_fb=f_t.getDay(); 
	
	var _firstDay = new Date(f_dv,f_dj-1,1).getDay();
	var _allDays = new Date(f_dv, f_dj, 0).getDate();
	for(var i = 0;i < _firstDay;i++){
		f_fS.push(false);
	}
	while(f_fS.length < 6*7) {
		if(f_fS.length >= _firstDay + _allDays) {
			f_fS.push(false);
		} else {
			var f_n = new Date(f_dv, f_dj-1, f_fS.length + 1 - _firstDay);
			f_fS.push([f_n.getFullYear(),
	          f_n.getMonth()+1,
	          f_n.getDate(),
	          this.f_eq(f_n)
			]);
		}
	}
	
	var _firstDay2 = new Date(f_dv,f_dj,1).getDay();
	var _allDays2 = new Date(f_dv, f_dj + 1, 0).getDate();
	for(var i = 0;i < _firstDay2;i++){
		_dateArr2.push(false);
	}
	while(_dateArr2.length < 6*7) {
		if(_dateArr2.length >= _firstDay2 + _allDays2) {
			_dateArr2.push(false);
		} else {
			var f_n = new Date(f_dv, f_dj, _dateArr2.length + 1 - _firstDay2);
			_dateArr2.push([f_n.getFullYear(),
	          f_n.getMonth()+1,
	          f_n.getDate(),
	          this.f_eq(f_n)
			]);
		}
	}
	
	
	
	
	var _nextMonth = _prevMonth = false;
	var _lastDayOfLastMonth = new Date(f_dv,f_dj-1,0);
	var _firstDayOfNextMonth = new Date(f_dv, f_dj + 1, 1);
	if (_lastDayOfLastMonth >= this.f_gN) {
		_prevMonth = true;
	}
	if (_firstDayOfNextMonth <= this.f_gG) {
		_nextMonth = true;
	}
	var _firstDayOfLastMonthStr = Date.getStr(new Date(f_dv,f_dj-2,1));
	var _firstDayOfNextMonthStr = Date.getStr(new Date(f_dv, f_dj, 1));
    var f_eH={
		nextMonth:_nextMonth,
		prevMonth:_prevMonth,
		dateArr:f_fS,
		dateArr2:_dateArr2,
		prevMonthDate:_firstDayOfLastMonthStr,
		nextMonthDate:_firstDayOfNextMonthStr,
		date1:new Date(f_dv, f_dj-1, 1),
		date2:new Date(f_dv, f_dj, 1)
    };
    
    var f_hI=this.f_dk.process(f_eH);
    var f_ef=$E(f_hI);
    
    Event.observe(f_ef,'click',this.f_ek);
    Event.observe(f_ef,'mouseover',this.f_eZ);
	Event.observe(f_ef,'mouseout',this._mouseoutFunc);
    
    return f_ef;
  },
  
  f_gW:function(){
  
    Position.clone(this.f_aM,this.f_B,{
      setWidth:   false,
      setHeight:  false,
      offsetTop:  this.f_aM.offsetHeight+this.f_gr,
      offsetLeft: this.f_gk
    });
	
    Element.show(this.f_B);
    this.f_gI = false;
  },

  f_fD:function(){
    Element.hide(this.f_B);
    if(this.f_el)
      window.clearTimeout(this.f_el);
  },

  f_fW:function(event){
  	if(Element.visible(this.f_B))
      this.f_fD();
    else {
	this.update(this.f_i);
		this.f_gW();
      }
  },
  
  f_O:function(f_w){
    f_w=Date.parseDate(f_w,this.f_fK);
    if(!f_w)
      throw new Error('Error date format');
    f_w=new Date(f_w.getFullYear(),f_w.getMonth(),f_w.getDate());
    return f_w;
  },
  
  f_ed:function(){
    var f_w;
    var f_ca=this.f_aM.value.trim();

    if(f_ca==''){
      alert(this.f_dK.empty.replace("__VALUE__",f_ca));
      return false;
    }

    try{
      f_w=this.f_O(f_ca);
    }
    catch(e){
      alert(this.f_dK.formatError.replace("__VALUE__",f_ca));
      return false;
    }

    if(!this.checkRange(f_w)){
      alert(this.f_dK.exceedRange.replace("__VALUE__",f_ca));
      return false;
    }

    return true;
  },
  
  checkRange:function(f_w){
    f_w=this.f_O(f_w);
    if(f_w.getTime()>this.f_gG.getTime() || f_w.getTime()<this.f_gN.getTime())
      return false;
    else
      return true;
  },
  
  f_eG:function(f_n){
    var f_fg=[],f_eD=[];
    var f_cX=function(style){
      if(style.constructor!=Array)
        style=[style];
      style.each(function(st){
        if(st.indexOf(':')!=-1){
          f_fg=f_fg.concat(st.split(';'));
        }
        else{
          f_eD=f_eD.concat(st.split(' '));
        }
      });
      
    }
    this.f_fy.each(function(f_ei){
      var f_al=f_ei[0],f_cK=f_ei[1];

      if(typeof f_al=="function"){
        if(f_al(f_n))
           f_cX(f_cK);
      }
      else if(f_al.constructor==Array){
         var f_t=this.f_O(f_al[0]);
         var f_eC=this.f_O(f_al[1]);
         if(f_n.getTime()>=f_t.getTime() && f_n.getTime()<=f_eC.getTime())
           f_cX(f_cK);
      }
      else{
         var f_fY=this.f_O(f_al);
         if(f_fY.getTime()==f_n.getTime())
           f_cX(f_cK);
      }

    }.bind(this));

    return {styles:f_fg,classes:f_eD};
  },

  f_eq:function(f_n){
    var f_bq=[];

    if(f_n.getTime()==this.f_fK.getTime()) f_bq.push('today');
    if(f_n.getTime()<this.f_gN.getTime()) f_bq.push('before');
    if(f_n.getTime()>this.f_gG.getTime()) f_bq.push('next');
    if((DatePicker.departureDate)&&(f_n.getTime()==DatePicker.departureDate.getTime())) f_bq.push('departureTime');
	if((DatePicker.calendarType)&&(DatePicker.calendarType == 2)&&(DatePicker.arrivalDate)&&(f_n.getTime()==DatePicker.arrivalDate.getTime())) f_bq.push('arrivalTime');
	if(f_n.getTime()>=this.f_gN.getTime() && f_n.getTime()<= this.f_gG.getTime()) f_bq.push('hashover');
	
    f_bq.push('tdMonth'+((f_n.getMonth()+1)%2+1));

    var f_hO=this.f_eG(f_n);
    f_bq=f_bq.concat(f_hO.classes);
    var f_gB=f_hO.styles;

    return {tdclass:f_bq,tdstyle:f_gB};
  },
  f_fO:function(){
    this.f_ek=function(f_hu){
      var f_gE=Event.element(f_hu);
      
      var f_w=f_gE.getAttribute('date');

      if(!f_w){
        var f_hS=f_gE.getAttribute('ym');
		if (f_hS)
			this.update(f_hS);
        return;
      }

      if(!this.checkRange(f_w))
        return;
	  this._selectedDate = f_w;
      this.setValue(f_w);
      this.f_fD();
	  this.f_gI = true;
    }.bind(this);
	this.f_eZ=function(f_hu){
      var f_gE=Event.element(f_hu);
	  
	  if (f_gE.hasClassName("hashover")) {
		f_gE.addClassName("onmouseover");
	  } 
	}.bind(this);
	this._mouseoutFunc = function(f_hu){
		var f_gE = Event.element(f_hu);
		if (f_gE.hasClassName("onmouseover")) {
			f_gE.removeClassName("onmouseover");
		}
	  }.bind(this);
	
  }

})

