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];
}

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._minDate=this.f_O(f_bn.minDate || 0);
    this._maxDate=this.f_O(f_bn.maxDate || 60);
    this.dateOffset = this._maxDate.getTime() - this._minDate.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._minDate;
    }

    if(!this._checkRange(this.f_cH))
      this.f_cH=this._minDate;

    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.f_gX=document.getElementsByClassName('upTd',this.f_B)[0];
    this.f_gm=document.getElementsByClassName('downTd',this.f_B)[0];
    Event.observe(this.f_gX,'click',function(ev){
      var f_w=Event.element(ev).getAttribute('date');
      this._update(f_w);
    }.bind(this));
    Event.observe(this.f_gm,'click',function(ev){
      var f_w=Event.element(ev).getAttribute('date');
      this._update(f_w);
    }.bind(this));
    
    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);
      this.f_B.attachEvent("onmousewheel",f_bI);
    }else{
      this.f_aM.addEventListener("DOMMouseScroll", f_cu, false);
      this.f_B.addEventListener("DOMMouseScroll",f_bI,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._minDate=this.f_O(f_w);
  },

  setMaxDate:function(f_w){
    this._maxDate=this.f_O(f_w);
  },

  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_hE:function(callback,f_bc){
    var f_dA=this.f_dP.firstChild;
    var f_gh=this.f_dP.lastChild;
    var f_hs=f_bc-f_dA.offsetHeight;

    if(f_bc==0){
      if(callback)
        callback.call(this);
      return;
    }
    
    f_bc=-f_bc;
    var f_cP;
    if(f_bc>0)
      f_cP=+8;
    else
      f_cP=-8;

    this.f_gK=setInterval(function(){
      var f_hW=f_dA.offsetTop+f_cP;
      if((f_bc>0 && f_hW>=f_bc) || (f_bc<0 && f_hW<=f_bc)){
        clearInterval(this.f_gK);
        this.f_gK=null;
        if(callback)
          callback.call(this);
      }
      else{
        f_hs+=f_cP;
        f_gh.style.top=f_hs+'px';
        f_dA.style.top=f_hW+'px';
      }
    }.bind(this),20);

  },
  
  f_du:function(f_t){
    if(f_t.getTime()<this._minDate.getTime())
      f_t=new Date(this._minDate.getTime());

    var f_cd=new Date(this._maxDate.getTime());
    f_cd.setDate(f_cd.getDate()-35);

    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._minDate).getTime());
    var f_fb=f_dU.getDay();

    this.f_t=f_t;

    var f_ef=this.f_hc(f_dv,f_dj,f_w);
    if(!f_cQ){
      this.f_dP.appendChild(f_ef);
      return;
    }
    
    var f_hi=f_cQ.offsetHeight;
    var f_gd=Math.floor(f_hi/6);

    var offsetLine=
      Math.floor(((f_t.getTime()-f_dU.getTime())/(1000*60*60*24)+f_fb)/7);
    
    if(this.f_gK) return;
    
    var f_dT=offsetLine*f_gd;
    this.f_dP.appendChild(f_ef);
    Element.setStyle(f_ef,{
      top:(f_dT-f_cQ.offsetHeight)+"px",
      left:'0px'
    });
    
    this.f_hE(function(){
      this.f_dP.removeChild(f_cQ);
      f_ef.style.top='0px';
    },f_dT);
  },

  f_eR:function(){
    var f_dy=this.f_dP.firstChild;
    if(!f_dy) return;
    Event.stopObserving(f_dy,'click',this.f_ek);
    Event.stopObserving(f_dy,'mouseover',this.f_eZ);
  },
  
  f_hc:function(f_dv,f_dj,f_w){
    var f_n;
    var f_fS=new Array();
    var f_t=new Date(f_dv,f_dj-1,f_w);
    var f_fb=f_t.getDay(); 

    var f_Y=new Array();
    for(var row=1;row<=6;row++){
      for(var col=1;col<=7;col++){
        var i=(row-1)*7+col;
        f_n=new Date(f_dv,f_dj-1,f_w+i-1-f_fb);
        
        if(i==1 && f_n.getDate()!=1){
          f_Y.push([f_n.getFullYear(),f_n.getMonth()+1,1]);
        }

        if(f_n.getDate()==1){
          if(col==1){
            f_Y.push([f_n.getFullYear(),f_n.getMonth()+1,row]);
          }
          else{
            if(row<6)
              f_Y.push([f_n.getFullYear(),f_n.getMonth()+1,row+1]);
          }
        }

        f_fS[i]=[
          f_n.getFullYear(),
          f_n.getMonth()+1,
          f_n.getDate(),
          this.f_eq(f_n)
        ];
      }
    }
    
    for(var i=0;i<f_Y.length;i++){
      if(f_Y[i+1])
        f_Y[i][3]=f_Y[i+1][2]-f_Y[i][2];
      else
        f_Y[i][3]=7-f_Y[i][2]+1;
    }
    
    var f_ds=new Object();
    for(var i=0;i<f_Y.length;i++){
      f_ds[f_Y[i][2]]=[f_Y[i][0],f_Y[i][1],f_Y[i][3]];
    }

    var f_eH={
      dateArr:f_fS,
      month_row_hash:f_ds,
      localNum:this.f_gC
    };
    
    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);
    
    f_t.setDate(f_t.getDate()-7);
    this.f_gX.setAttribute('date',Date.getStr(f_t));
    f_t.setDate(f_t.getDate()+14);
    this.f_gm.setAttribute('date',Date.getStr(f_t));

    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_el=window.setTimeout(this.f_gW.bind(this),200);
  },

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

  f_fW:function(event){
  	Event.stop(event);
    if(Element.visible(this.f_B))
      this.f_fD();
    else
      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._maxDate.getTime() || f_w.getTime()<this._minDate.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._minDate.getTime()) f_bq.push('before');
    if(f_n.getTime()>this._maxDate.getTime()) f_bq.push('next');
    if(f_n.getDay()==0 || f_n.getDay()==6) f_bq.push('red');
    if(f_n.getTime()==this.f_i.getTime()) f_bq.push('selected');
    
    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+"-1");
        return;
      }

      if(!this._checkRange(f_w))
        return;

      this.setValue(f_w);
      this.f_fD();
      var f_gU=document.getElementsByClassName('selected',this.f_B);
      $A(f_gU).each(function(f_hV){
        Element.removeClassName(f_hV,'selected');
      });
      Element.addClassName(f_gE,'selected');
    }.bind(this);

    this.f_fT=function(f_cY,f_n){
      var f_al=f_cY[0],f_aC=f_cY[1];

      if(typeof f_al=="function"){
        if(f_al(f_n)){
           return f_aC;
        }
      }
      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()){
           return f_aC;
         }
      }
      else{
         var f_fY=this.f_O(f_al);
         if(f_fY.getTime()==f_n.getTime()){
           return f_aC;
         }
      }
    }.bind(this);

    this.f_eZ=function(f_hu){
      var f_gE=Event.element(f_hu);

      var f_w=f_gE.getAttribute('date');
      if(!f_w)
        return;

      var f_n=this.f_O(f_w);
      
      var f_aC;
      for(var i=0;i<this.f_do.length;i++){
        var f_ft=this.f_fT(this.f_do[i],f_n);
        if(f_ft){
          f_aC=f_ft;
          break;
        }
      }

      if(!f_aC){
        if(this._checkRange(f_n))
          f_aC=this.f_aC.inRange;
        else
          f_aC=this.f_aC.notInRange;
      }
      var f_dB=document.getElementsByClassName("tipInfo",this.f_B)[0];
      f_dB.innerHTML=Date.getStr(f_n,f_aC);

    }.bind(this);

  }

})

